/* Treeki's 3D Library for Wii */ #ifndef TREEKI3D_H #define TREEKI3D_H /******************************************************************************* * IMPORTS/ENGINE HOOKS *******************************************************************************/ #define GEKKO #include #include "rvl/mtx.h" #include "rvl/GXEnum.h" #include "rvl/GXStruct.h" #include "rvl/GXTransform.h" #include "rvl/GXGeometry.h" #include "rvl/GXDispList.h" #include "rvl/GXLighting.h" #include "rvl/GXTev.h" #include "rvl/GXTexture.h" #include "rvl/GXCull.h" #include "rvl/GXPixel.h" #include "rvl/GXBump.h" #include "rvl/OSCache.h" #include "rvl/tpl.h" #include "rvl/vifuncs.h" #include "rvl/arc.h" GXRenderModeObj *Hook_GetGXRenderModeObj(); namespace T3D { /******************************************************************************* * RESOURCE STRUCTS *******************************************************************************/ struct tmdl_headerv2 { u32 magic; // always TMDL u32 version; // currently 2 u32 shape_count; }; struct tmdl_header { u32 magic; // always TMDL u32 version; // currently 3 u32 shape_count; u32 material_count; }; // todo: remove this extern int tmdl_header_sizes[]; // [[Followed by an array of u32s for each shape offset, then material structs]] struct tmdl_shape { u32 dl_offset; // must be aligned to 0x20 u32 dl_size; // must be aligned to 0x20 u32 mat_offset; u32 pos_arr_offset; // must be aligned to 0x20 u32 pos_arr_size; // must be aligned to 0x20 u32 nrm_arr_offset; // must be aligned to 0x20 u32 nrm_arr_size; // must be aligned to 0x20 u32 uv_arr_offset; // must be aligned to 0x20 u32 uv_arr_size; // must be aligned to 0x20 }; struct tmdl_materialv2 { u32 texture_id; GXColor mat_colour; }; struct tmdl_material { char texture_name[28]; GXColor mat_colour; GXTexObj texobj; // handled when binding. size: 8 bytes }; /******************************************************************************* * INTERNAL STRUCTS *******************************************************************************/ class Model; // don't you just love circular references struct RenderInfo { Model *model; Mtx matrix; }; struct CameraInfo { GXProjectionType projection; Mtx44 projection_matrix; Mtx view_matrix; }; /******************************************************************************* * PUBLIC CLASSES *******************************************************************************/ class Model { private: tmdl_header *model_res; TPLPalette *texture_res; // here for v2 support void setupMaterialGXv2(tmdl_materialv2 *material); void setupMaterialGX(tmdl_material *material); void drawShape(RenderInfo *info, int shape_id); public: bool bind(void *data, const char *mdlname); void addToDrawList(Mtx matrix); void draw(RenderInfo *info); }; /******************************************************************************* * CONVENIENT STUFF *******************************************************************************/ extern const GXColor Black, White; /******************************************************************************* * GLOBAL T3D VARIABLES/FUNCTIONS *******************************************************************************/ #define OBJ_COUNT 60 extern u32 HasBeenInited; extern RenderInfo *RenderQueue; extern int RenderQueuePos; extern CameraInfo Camera; bool Init(bool test); void DrawQueue(); namespace util { //void RotateToFace(const Vec &O, const Vec &P, const Vec &U, Mtx out); }; }; #endif