一.BRF-文件头数据结构
type_mesh = "mesh" 网格
type_material = "material" 材质
type_body = "body" 碰撞体
type_body_component = "manifold" 多面部件
type_body_polygon = "face" 单面部件
struct brf_header{
int type_length; //4个字节, type字符串对应长度
char* type_name; //根据type_length获取
int type_content_num; //4个字节,对应类型所含个数,例如含有模型6个
}
例如一个包含2个模型的BRF文件,对应的BRF文件头应该是:
二.BRF-mesh数据结构
int 对应4个字节
float 对应4个字节
struct mesh{
int name_length;//模型名长度
char* name;//模型名
const int mesh_flag = 0;//mesh网格标志位
int material_cnt;//材质名长度
int material_name_length;//材质名长度
char* material_name;//材质名
int vertex_num;//顶点数量(X,y,z格式顶点) x, y, z三个坐标float类型数值
vertex[];
int vertex_animation_flag;//顶点动画标志位
int vertex_animation_frame_cnt;//顶点动画对应帧数量
long frame_time;//帧时刻
int vertex_num;//顶点个数
vertex[];
int vertex_FVF_num;//顶点法向向量个数
vertex_fvf[];
int vertex_fvf_num;//顶点数量(FVF格式顶点)顶点数量
vertex_fvf[];
int triangle_num;//三角面数量
triangle[];
}
struct vertex_normal{
float x;
float y;
float z;
};
struct vertex_fvf{
int vertex_index; //与前面读取vertex[]数组索引保持一致
const int vertex_color; //顶点着色HEX RGB代码
float vnx;
float vny;
float vnz;
float uv_x;
float uv_y;
float uv_x_unused;
float uv_y_unused;
};
struct triangle{
int vertex_fvf_index_1;
int vertex_fvf_index_2;
int vertex_fvf_index_3;
}
三.BRF-body数据结构
int 对应4个字节
float 对应4个字节
struct body{
int name_length;//碰撞体名称长度
char* name;//碰撞体名称
int type_length;//碰撞体类型名称长度
int type_name;//碰撞体类型名称
int component_cnt;//部件个数
component[];//manifold 3D静态模型碰撞体 polygon 多边形平面碰撞体
}
#多面部件(用于场景物等复杂3D模型)
struct manifold{
int name_length;//部件名称长度8
char* name;//部件名称manifold
int vertex_cnt;//顶点个数
vertex[];
int face_cnt;
face[];
};
#单面部件(只有一个面的部件,用于空气墙,通道)
struct polygon{
int name_length;//部件名称长度4
char* name;//部件名称face
int vertex_cnt;//顶点个数
vertex[];
int flag;//标志位flag
}
struct face{
long flag;//固定标志位 00 00 00 00 FF FF FF FF
int polygon_vertex_cnt;//构成平面的顶点数量 四边形为4 五边形为5
vertex_index[];平面顶点索引数组
}