#ifndef BANJO_KAZOOIE_CORE2_MODEL_H #define BANJO_KAZOOIE_CORE2_MODEL_H #include #include "bool.h" /* Model header * Contains offsets relative to the start of the file to the various sections * If a section is not present in the file, the offset will be zero * */ typedef struct bk_model_header_s { u32 magic_number; s32 geo_list_offset; s16 texture_list_offset; s16 geo_type; s32 gfx_list_offset; s32 vtx_list_offset; s32 unk14_list_offset; s32 animation_list_offset; s32 collision_list_offset; s32 camera_area_list_offset; s32 mesh_list_offset; s32 anim_vertices_list_offset; s32 animated_texture_list_offset; u16 unk30; u16 vertex_count; f32 unk34; } BKModelBin; /* Geometry Setup structs and typedefs * Geometry Setup contains list of commands that control the rendering (called in modelRender_draw) * * Command overview: * - UNK0 0x00 Calls a sublist, ... * - SORT 0x01 Call sublist based on points distance * - BONE 0x02 Applies an animation matrix and then calls a sublist * - LOADDL 0x03 Draw Display List * - NOP 0x04 No operation * - SKINNING 0x05 Draw multiple Display Lists and with pre-applying matrices * - CALL 0x06 Calls a sublist * - LOADDL2 0x07 Draw Display List * - LOD 0x08 Call sublist if Level of Detail matches * - NOP2 0x09 No operation * - REFPOINT 0x0A Transforms a point relative to the camera and feedbacks it back to the object * - NOP3 0x0B No operation * - SELECTOR 0x0C ??? * - DRAWDIST 0x0D Draw with Frustum Culling * - UNKE 0x0E ??? * - CAMERA 0x0F Calls a sublist if the camera is inside or outside a bounding box, depending on the flag * - TEXWRAP 0x10 Sets the texture wrapping mode * */ struct geo_cmd_0_s { u32 cmd; s32 next_offset; s16 branch_offset; s16 do_pitch_rotate; f32 position[3]; }; struct geo_cmd_sort_s { u32 cmd; s32 next_offset; f32 point_1[3]; f32 point_2[3]; s16 flags; s16 branch_offset_1; s32 branch_offset_2; }; #define BK_GEO_CMD_SORT_RUN_BOTH_BIT 0x01 struct geo_cmd_bone_s { u32 cmd; s32 next_offset; u8 branch_offset; s8 anim_matrix_id; }; struct geo_cmd_load_dl_s { u32 cmd; s32 next_offset; s16 gfx_index; }; struct geo_cmd_skinning_s { u32 cmd; s32 next_offset; s16 gfx_index[]; }; struct geo_cmd_call_s { u32 cmd; s32 next_offset; s32 branch_offset; }; struct geo_cmd_load_dl_2_s { u32 cmd; s32 next_offset; s16 pad; s16 gfx_index; }; struct geo_cmd_lod_s { u32 cmd; s32 next_offset; f32 max; f32 min; f32 position[3]; s32 branch_offset; }; struct geo_cmd_reference_point_s { u32 cmd; s32 next_offset; s16 index; s16 anim_mtx_id; f32 point[3]; }; struct geo_cmd_selector_s { u32 cmd; s32 next_offset; s16 branch_offset_count; s16 index; s32 branch_offsets[]; }; struct geo_cmd_draw_distance_s { u32 cmd; s32 next_offset; s16 min[3]; s16 max[3]; s16 branch_offset; }; struct geo_cmd_E_s { u32 cmd; s32 next_offset; s16 position[3]; s16 distance; s16 branch_offset; s16 anim_mtx_id; }; struct geo_cmd_camera_s { u32 cmd; s32 next_offset; s16 branch_offset; u8 count; u8 flags; u8 id_list[]; }; #define BK_GEO_CMD_CAMERA_IS_OUTSIDE_BIT 0x01 #define BK_GEO_CMD_CAMERA_IS_INSIDE_BIT 0x02 struct geo_cmd_set_texture_wrap_mode_s { u32 cmd; s32 next_offset; s32 mode; }; struct bk_geo_cmd_s { u32 cmd; s32 next_offset; u8 data[]; }; typedef struct bk_geo_cmd_s BKGeoCmd; typedef void (*BKGeoCmdFunc)(Gfx **gfx, Mtx **mtx, struct bk_geo_cmd_s *data); /* Texture List and Texture Data * */ typedef struct bk_texture_info_s { s32 offset; s16 type; u8 pad6[2]; u8 width; u8 height; u8 padA[6]; } BKTextureInfo; #define BK_TEXTURE_INFO_TYPE_CI4_BIT 0x01 #define BK_TEXTURE_INFO_TYPE_CI8_BIT 0x02 #define BK_TEXTURE_INFO_TYPE_RGBA16_BIT 0x04 #define BK_TEXTURE_INFO_TYPE_RGBA32_BIT 0x08 typedef struct bk_texture_list_s { s32 size; s16 count; u16 pad; BKTextureInfo texture_infos[]; } BKTextureList; /* Geo Type * */ typedef u32 BkGeoType; #define BK_GEO_TYPE_MIPMAP_TRILINEAR_BIT 0x02 #define BK_GEO_TYPE_ENV_MAP_BIT 0x04 /* Gfx Display Lists * */ typedef struct bk_gfx_list_s { u32 size; u32 pad; Gfx list[]; } BKGfxList; /* Vertex Lists * */ typedef struct bk_vertex_list_s { s16 minCoord[3]; s16 maxCoord[3]; s16 centerCoord[3]; s16 local_norm; //(distance to furthest vtx relative to model center) s16 count; s16 global_norm; //(distance to furthest vtx relative to model origin) Vtx vertices[]; } BKVertexList; /* Unk14 Lists * */ typedef struct { s16 unk0[3]; s16 unk6[3]; s16 unkC[3]; u8 unk12[3]; u8 unk15; s8 unk16; u8 pad17[1]; }BKModelUnk14_0; typedef struct { s16 unk0; s16 unk2; s16 unk4[3]; u8 unkA[3]; u8 unkD; s8 unkE; u8 padF[1]; }BKModelUnk14_1; typedef struct { s16 unk0; s16 unk2[3]; u8 unk8; s8 unk9; u8 padA[2]; }BKModelUnk14_2; typedef struct { s16 cnt0; //number of BKModelUnk14_0 structs s16 cnt2; //number of BKModelUnk14_1 structs s16 unk4; //number of BKModelUnk14_2 structs s16 unk6; u8 data[]; //BKModelUnk14_0[] //BKModelUnk14_1[] //BKModelUnk14_2[] }BKModelUnk14List; /* Animation Lists * */ typedef struct bk_animation_s { f32 translation[3]; s16 bone_id; s16 mtx_id; } BKAnimation; typedef struct bk_animation_list_s { f32 unk0; // scale factor ? s16 count; BKAnimation animations[]; } BKAnimationList; /* Collision Lists * */ typedef struct bk_collision_geometry_s { s16 start_tri_index; //start_tri s16 tri_count; //tri_cnt } BKCollisionGeometry; typedef struct bk_collision_triangle_s { s16 unk0[3]; //vtx_indx s16 unk6; s32 flags; } BKCollisionTriangle; typedef struct bk_collision_list_s { s16 min[3]; s16 max[3]; s16 y_stride; s16 z_stride; s16 geo_count; s16 scale; s16 tri_count; u8 pad16[0x2]; u8 data[]; // BKCollisionGeometry[geo_count]; // BKCollisionTriangle[tri_count]; } BKCollisionList; /* Camera Area Lists * Contains a list of areas with bounding boxes that control which parts of maps are rendered if * the camera is inside a box */ typedef struct bk_camera_area_s { s16 min[3]; s16 max[3]; u8 in_bounds; u8 pad; }BKCameraArea; typedef struct bk_camera_area_list_s { u8 count; u8 pad; BKCameraArea data[]; } BKCameraAreaList; /* Mesh Lists * */ typedef struct bk_mesh_s { s16 uid; s16 vtx_count; s16 vertices[]; } BKMesh; typedef struct bk_mesh_list_s { s16 count; BKMesh data[]; } BKMeshList; /* Animated Vertices Lists * Stores a list of vertices that is affected by a specific animation */ typedef struct { s16 coord[3]; s8 anim_index; u8 vtx_count; s16 vtx_list[1]; } BKAnimVertices; typedef struct { s16 count; u16 pad; BKAnimVertices data[]; } BKAnimVerticesList; /* Animated Texture Lists * There is space for four animated texture info blocks */ typedef struct bk_animated_texture_s { s16 frame_size; s16 frame_cnt; f32 frame_rate; } BKAnimTexture; typedef struct bk_animated_texture_list_s { BKAnimTexture anim_textures[4]; } BKAnimTextureList; /* Model * These structs are not part of the model file, but are created at runtime. * They are used to transform meshes * * A Model has the following structure: * - 1 BKModel as header (contains pointers to BKMeshList and BKVertexList) * - A list of BKModelMesh, each directly followed by lists of BKModelVtxRef */ typedef struct bk_model_mesh_vtx_ref_s { Vtx v; s16 vtx_id; s16 pad12; s32 pad14; } BKModelVtxRef; typedef struct bk_model_mesh_s { s16 uid; s16 vtx_count; u8 data[]; // BKModelVtxRef[], but must be declared as u8[] } BKModelMesh; typedef struct bk_model_s { BKMeshList *mesh_list; BKVertexList *vtx_list; u8 data[]; // BKModelMesh[], but must be declared as u8[] } BKModel; typedef void (*bk_model_transform_func_s)(s32 mesh_id, BKModelVtxRef *vtx_ref, Vtx *vtx, s32 arg3); /* Function declarations * */ BKAnimVerticesList *modelbin_getAnimVerticesList(BKModelBin *this); BkGeoType modelbin_getGeoType(BKModelBin *this); BKGfxList *modelbin_getGfxList(BKModelBin *this); BKCollisionList *modelbin_getCollisionList(BKModelBin *this); BKMeshList *modelbin_getMeshList(BKModelBin *this); f32 modelbin_getUnk34(BKModelBin *this); BKAnimationList *modelbin_getAnimationList(BKModelBin *this); BKTextureList *modelbin_getTextureList(BKModelBin *this); BKAnimTextureList *modelbin_getAnimTextureList(BKModelBin *this); BKModelUnk14List *modelbin_getUnk14List(BKModelBin *this); BKVertexList *modelbin_getVtxList(BKModelBin *this); BKCameraAreaList *modelbin_getCameraAreaList(BKModelBin *this); #define modelbin_getGeoCmdList_MACRO(this) ((BKGeoCmd *) (((u8 *) (this)) + ((BKModelBin *) (this))->geo_list_offset)) #define modelbin_getTextureList_MACRO(this) ((BKTextureList *) (((u8 *) (this)) + ((BKModelBin *) (this))->texture_list_offset)) #define modelbin_getGfxList_MACRO(this) ((BKGfxList *) (((u8 *) (this)) + ((BKModelBin *) (this))->gfx_list_offset)) #define modelbin_getVtxList_MACRO(this) ((BKVertexList *) (((u8 *) (this)) + ((BKModelBin *) (this))->vtx_list_offset)) #define modelbin_getUnk14List_MACRO(this) ((BKModelUnk14List *) (((u8 *) (this)) + ((BKModelBin *) (this))->unk14_list_offset)) #define modelbin_getAnimationList_MACRO(this) ((BKAnimationList *) (((u8 *) (this)) + ((BKModelBin *) (this))->animation_list_offset)) #define modelbin_getCollisionList_MACRO(this) ((BKCollisionList *) (((u8 *) (this)) + ((BKModelBin *) (this))->collision_list_offset)) #define modelbin_getCameraAreaList_MACRO(this) ((BKCameraAreaList *) (((u8 *) (this)) + ((BKModelBin *) (this))->camera_area_list_offset)) #define modelbin_getMeshList_MACRO(this) ((BKMeshList *) (((u8 *) (this)) + ((BKModelBin *) (this))->mesh_list_offset)) #define modelbin_getAnimVerticesList_MACRO(this) ((BKAnimVerticesList *) (((u8 *) (this)) + ((BKModelBin *) (this))->anim_vertices_list_offset)) #define modelbin_getAnimTextureList_MACRO(this) ((BKAnimTextureList *) (((u8 *) (this)) + ((BKModelBin *) (this))->animated_texture_list_offset)) void model_copyFramebufferToTextures(BKModelBin *this); void *textureList_getDataPtr(BKTextureList *this); BKTextureInfo *textureList_getTextureInfo(BKTextureList *this, s32 index); s32 textureInfo_getBitDepth(BKTextureInfo *this); s32 textureInfo_getType(BKTextureInfo *this); s32 textureInfo_getPaletteSize(BKTextureInfo *this); s32 textureInfo_getOffset(BKTextureInfo *this); s32 textureInfo_getTextureSize(BKTextureInfo *this); f32 core2_C3A40_getIntensity(f32 curve_values[4], f32 position); void core2_C3A40_getDefaultValues(f32 dst[4]); Vtx *vtxList_getVertices(BKVertexList *this); void vtxList_getBounds_s32(BKVertexList *this, s32 min[3], s32 max[3]); void vtxList_getBounds_f32(BKVertexList *this, f32 min[3], f32 max[3]); void vtxList_getBoundsTransformed(BKVertexList *this, f32 min[3], f32 max[3]); void vtxList_func_802EC680(BKVertexList *this, s32 arg1, f32 arg2[3], f32 arg3[3]); void vtxList_getVtxRange(BKVertexList *this, Vtx **begin_ptr, Vtx **end_ptr); s32 vtxList_getVtxCount(BKVertexList *this); f32 vtxList_getGlobalNorm(BKVertexList *this); void vtxList_getCenterAndNorm(BKVertexList *this, f32 center[3], f32 *norm); f32 vtxList_getLocalNorm(BKVertexList *this); void vtxList_free(BKVertexList *this); BKVertexList *vtxList_clone(BKVertexList *this); void vtxList_copyColorsFrom(BKVertexList *this, BKVertexList *src); void vtxList_tintColorsFrom(BKVertexList *this, s32 target_color[3], f32 intensity, BKVertexList *src); void vtxList_recolor(BKVertexList *this, s32 color[3]); // bool bkmodelunk14list_func_802EA760(BKModelUnk14List *this, s32 arg1, f32 arg2[3], f32 rotation[3], f32 scale, f32 arg5[3], f32 arg6[3], f32 *arg7); // s32 bkmodelunk14list_func_802EA864(BKModelUnk14List *this, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], f32 arg6); // s32 bkmodelunk14list_func_802EAB34(BKModelUnk14List *this, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], f32 arg6); // s32 bkmodelunk14list_func_802EAD5C(BKModelUnk14List *this, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], f32 arg6); // s32 bkmodelunk14list_func_802EAED4(BKModelUnk14List *this, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], AnimMtxList *arg5, f32 arg6[3], f32 arg7); // s32 bkmodelunk14list_func_802EB458(BKModelUnk14List *this, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], AnimMtxList* arg5, f32 arg6[3], f32 arg7); // s32 bkmodelunk14list_func_802EB8A0(BKModelUnk14List *this, f32 *position, f32 *rotation, f32 scale, f32 arg4[3], AnimMtxList* arg5, f32 *arg6, f32 arg7); // bool bkmodelunk14list_func_802EBA98(BKModelUnk14List *this, f32 arg1[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], f32 arg6, f32 arg7[3]); // s32 bkmodelunk14list_func_802EBAE0(BKModelUnk14List *this, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], AnimMtxList* arg5, f32 arg6[3], f32 arg7, f32 arg8[3]); // s32 bkmodelunk14list_func_802EBD3C(BKModelUnk14List *this, f32 arg1[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], s32 arg6); // s32 bkmodelunk14list_func_802EC000(BKModelUnk14List *this, f32 arg1[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], s32 arg6); // s32 bkmodelunk14list_func_802EC238(BKModelUnk14List *this, f32 arg1[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], s32 arg6); // s32 bkmodelunk14list_func_802EC394(BKModelUnk14List *this, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], f32 arg5[3], s32 arg6); bool cameraAreaList_searchForEntryInBounds(BKCameraAreaList *this, u8 *id, u32 count); void cameraAreaList_updateInBoundsFlag(BKCameraAreaList *this, f32 camera_position[3], f32 scale); s32 meshList_getVtxCount(BKMeshList *this); BKMesh *meshList_getMesh(BKMeshList *this, s32 mesh_id); bool meshList_meshContainsVtx(BKMeshList *this, s32 mesh_id, s16 *vtx_id); BKModel *meshList_createModel(BKMeshList *this, BKVertexList *bk_vtx_list); void model_transformMeshes(BKModel *this, bk_model_transform_func_s fn, s32 transform_func_arg); void model_transformMesh(BKModel *this, s32 mesh_id, bk_model_transform_func_s fn, s32 transform_func_arg); void model_getMeshCenter(BKModel *this, s32 mesh_id, s16 dst[3]); BKMeshList *model_getMeshList(BKModel *this); void model_getMeshCoordRange(BKModel *this, s32 mesh_id, s16 min[3], s16 max[3]); s32 model_func_8033F3C0(BKModel *this, f32 position[3]); s32 model_func_8033F3E8(BKModel *this, f32 position[3], s32 min_id, s32 max_id); void model_free(BKModel *this); //void animVerticesList_setCoords(BKAnimVerticesList *this, BKVertexList *bk_vtx_list, s32 index, f32 coords[3]); //void animVerticesList_transform(BKAnimVerticesList *this, BKVertexList *bk_vtx_list, AnimMtxList *mtx_list); typedef struct bk_processed_collision_triangle_s { f32 edgeAB[3]; f32 edgeAC[3]; f32 normal[3]; BKCollisionTriangle *tri_ptr; f32 tri_coord[3][3]; } BKProcessedCollisionTriangle; void collisionList_setStoredTriangle(BKCollisionTriangle *this, BKVertexList *bk_vtx_list); void collisionList_getIntersecting_f32(BKCollisionList *this, f32 min[3], f32 max[3], BKCollisionGeometry ***begin_ptr, BKCollisionGeometry ***end_ptr); void collisionList_getIntersecting_s32(BKCollisionList *this, s32 min[3], s32 max[3], BKCollisionGeometry ***begin_ptr, BKCollisionGeometry ***end_ptr); void collisionList_getStoredTriangle(f32 tri[3][3]); s32 collisionList_getTriCount_0x1E0000(BKCollisionList *this); s32 collisionList_getTriCount(BKCollisionList *this); void collisionList_getTris(BKCollisionList *this, BKCollisionTriangle **begin_ptr, BKCollisionTriangle **end_ptr); bool collisionList_pointOnLine(f32 point[3], f32 margin, f32 line_start[3], f32 line_end[3]); bool collisionList_spheresIntersect(f32 pos1[3], f32 radius1, f32 pos2[3], f32 radius2); void collisionList_calculateBoundsAndDirection(f32 start_point[3], f32 end_point[3], s32 min_bounds[3], s32 max_bounds[3], f32 direction_vector[3]); BKCollisionTriangle *collisionList_intersectLine(BKCollisionList *this, BKVertexList *bk_vtx_list, f32 line_start[3], f32 line_end[3], f32 normal[3], u32 flag_filter); BKCollisionTriangle *collisionList_intersectLineGlobal(BKCollisionList *this, BKVertexList *bk_vtx_list, f32 position[3], f32 rotation[3], f32 scale, f32 line_start[3], f32 line_end[3], f32 normal[3], u32 flag_filter); bool collisionList_intersectMovingSphere_FastCheck(BKCollisionList *this, BKVertexList *bk_vtx_list, f32 p1[3], f32 p2[3], f32 velocity[3], f32 margin, u32 flag_filter, BKProcessedCollisionTriangle **activeTriStartPtr, BKProcessedCollisionTriangle **activeTriEndPtr); BKProcessedCollisionTriangle *collisionList_intersectMovingSphere_Iteration(BKProcessedCollisionTriangle *startTri, BKProcessedCollisionTriangle *endTri, f32 position[3], f32 radius, f32 normal[3]); BKCollisionTriangle *collisionList_intersectMovingSphere(BKCollisionList *this, BKVertexList *bk_vtx_list, f32 p1[3], f32 p2[3], f32 radius, f32 arg5[3], s32 steps, u32 flag_filter); BKCollisionTriangle *collisionList_intersectMovingSphereGlobal(BKCollisionList *this, BKVertexList *bk_vtx_list, f32 position[3], f32 rotation[3], f32 scale, f32 p1[3], f32 p2[3], f32 sphere_radius, f32 normal[3], s32 steps, u32 flag_filter); BKCollisionTriangle *collisionList_intersectSphere(BKCollisionList *this, BKVertexList *bk_vtx_list, f32 position[3], f32 radius, f32 normal[3], u32 flag_filter); BKCollisionTriangle *collisionList_intersectSphereGlobal(BKCollisionList *this, BKVertexList *bk_vtx_list, f32 position[3], f32 rotation[3], f32 scale, f32 sphere_center[3], f32 sphere_radius, f32 normal[3], u32 flag_filter); void gclights_recolor_vertices(BKVertexList *arg0, f32 position[3], f32 rotation[3], f32 scale, f32 arg4[3], BKVertexList *arg5); #endif