diff --git a/GRRLIB/GRRLIB/GRRLIB_3D.c b/GRRLIB/GRRLIB/GRRLIB_3D.c index 6f5295e..c227e49 100644 --- a/GRRLIB/GRRLIB/GRRLIB_3D.c +++ b/GRRLIB/GRRLIB/GRRLIB_3D.c @@ -32,7 +32,7 @@ static guVector _GRR_cam = {0.0F, 0.0F, 0.0F}, static guVector _GRRaxisx = (guVector){1, 0, 0}; // DO NOT MODIFY!!! static guVector _GRRaxisy = (guVector){0, 1, 0}; // Even at runtime static guVector _GRRaxisz = (guVector){0, 0, 1}; // NOT ever! - +static Mtx _ObjTransformationMtx; /** * Set the background parameter when screen is cleared. * @param r Red component. @@ -147,6 +147,76 @@ void GRRLIB_2dMode() { GRRLIB_Settings.lights = 0; } +/** + * Init the object matrix to draw object. + */ +void GRRLIB_ObjectViewBegin(void){ + guMtxIdentity(_ObjTransformationMtx); +} + +/** + * Scale the object matrix to draw object. + * @param scalx x scale of the object. + * @param scaly y scale of the object. + * @param scalz z scale of the object. + */ +void GRRLIB_ObjectViewScale(f32 scalx, f32 scaly, f32 scalz) { + Mtx m; + guMtxIdentity(m); + guMtxScaleApply(m, m, scalx, scaly, scalz); + + guMtxConcat(m, _ObjTransformationMtx, _ObjTransformationMtx); +} + +/** + * Rotate the object matrix to draw object . + * @param angx x rotation angle of the object. + * @param angy y rotation angle of the object. + * @param angz z rotation angle of the object. + */ +void GRRLIB_ObjectViewRotate(f32 angx, f32 angy, f32 angz) { + Mtx m, rx,ry,rz; + + guMtxIdentity(m); + guMtxRotAxisDeg(rx, &_GRRaxisx, angx); + guMtxRotAxisDeg(ry, &_GRRaxisy, angy); + guMtxRotAxisDeg(rz, &_GRRaxisz, angz); + guMtxConcat(ry, rx, m); + guMtxConcat(m, rz, m); + + guMtxConcat(m, _ObjTransformationMtx, _ObjTransformationMtx); +} + +/** + * Translate the object matrix to draw object. + * @param posx x position of the object. + * @param posy y position of the object. + * @param posz z position of the object. + */ +void GRRLIB_ObjectViewTrans(f32 posx, f32 posy, f32 posz){ + Mtx m; + + guMtxIdentity(m); + guMtxTransApply(m, m, posx, posy, posz); + + guMtxConcat(m, _ObjTransformationMtx, _ObjTransformationMtx); +} + +/** + * Concat the object and the view matrix and calculate the inverse normal matrix. + */ +void GRRLIB_ObjectViewEnd(void){ + Mtx mv, mvi; + + guMtxConcat(_GRR_view, _ObjTransformationMtx, mv); + GX_LoadPosMtxImm(mv, GX_PNMTX0); + + guMtxInverse(mv, mvi); + guMtxTranspose(mvi, mv); + GX_LoadNrmMtxImm(mv, GX_PNMTX0); +} + + /** * Set the view matrix to draw object (in this order scale, rotate AND trans). * @param posx x position of the object. diff --git a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h index dc3f514..d0db50f 100644 --- a/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h +++ b/GRRLIB/GRRLIB/grrlib/GRRLIB__lib.h @@ -150,6 +150,11 @@ void GRRLIB_SetBackgroundColour(u8 r, u8 g, u8 b, u8 a); void GRRLIB_Camera3dSettings(f32 posx, f32 posy, f32 posz, f32 upx, f32 upy, f32 upz, f32 lookx, f32 looky, f32 lookz); void GRRLIB_3dMode(f32 minDist, f32 maxDist, f32 fov, bool texturemode, bool normalmode); void GRRLIB_2dMode(); +void GRRLIB_ObjectViewBegin(void); +void GRRLIB_ObjectViewScale(f32 scalx, f32 scaly, f32 scalz); +void GRRLIB_ObjectViewRotate(f32 angx, f32 angy, f32 angz); +void GRRLIB_ObjectViewTrans(f32 posx, f32 posy, f32 posz); +void GRRLIB_ObjectViewEnd(void); void GRRLIB_ObjectView(f32 posx, f32 posy, f32 posz, f32 angx, f32 angy, f32 angz, f32 scalx, f32 scaly, f32 scalz); void GRRLIB_ObjectViewInv(f32 posx, f32 posy, f32 posz, f32 angx, f32 angy, f32 angz, f32 scalx, f32 scaly, f32 scalz); void GRRLIB_SetTexture(GRRLIB_texImg *tex, bool rep);