#include "v1dbfile.h"
 
 
 
#include "CORE/FW/brqsort.h"
 
#include "CORE/FW/datafile.h"
 
#include "CORE/FW/diag.h"
 
#include "CORE/FW/file.h"
 
#include "CORE/FW/genfile.h"
 
#include "CORE/FW/resource.h"
 
#include "CORE/FW/scratch.h"
 
#include "CORE/V1DB/actsupt.h"
 
#include "CORE/V1DB/chunkids.h"
 
#include "CORE/V1DB/dbsetup.h"
 
#include "CORE/V1DB/matsupt.h"
 
#include "CORE/V1DB/modsupt.h"
 
#include "CORE/V1DB/regsupt.h"
 
#include "CORE/V1DB/stackids.h"
 
#include "harness/trace.h"
 
#include <stddef.h>
 
#include <stdlib.h>
 
#include <string.h>
 
 
 
br_file_struct_member br_vertex_FM[3] = {
 
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, p.
v[0]), "p.v[x]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, p.
v[1]), "p.v[y]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, p.
v[2]), "p.v[z]", NULL 
}  
};
 
br_file_struct br_vertex_F = { "br_vertex", BR_ASIZE(br_vertex_FM), br_vertex_FM, sizeof(br_vertex) };
 
 
 
br_file_struct_member br_vertex_uv_FM[] = {
 
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, map.
v[0]), "map.v[0]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, map.
v[1]), "map.v[1]", NULL 
}  
};
 
br_file_struct br_vertex_uv_F = { "br_vertex_uv", BR_ASIZE(br_vertex_uv_FM), br_vertex_uv_FM, sizeof(br_vertex) };
 
 
 
br_file_struct_member br_old_vertex_uv_FM[5] = {
 
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, p.
v[0]), "p.v[X]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, p.
v[1]), "p.v[Y]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, p.
v[2]), "p.v[Z]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, map.
v[0]), "map.v[0]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_vertex
, map.
v[1]), "map.v[1]", NULL 
},  
};
 
br_file_struct br_old_vertex_uv_F = { "br_old_vertex_uv", BR_ASIZE(br_old_vertex_uv_FM), br_old_vertex_uv_FM, sizeof(br_vertex) };
 
 
 
br_file_struct_member br_face_FM[5] = {
 
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[0]), "vertices[0]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[1]), "vertices[1]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[2]), "vertices[2]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, smoothing
), "smoothing", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_face
, flags
), "flags", NULL 
}  
};
 
br_file_struct br_face_F = { "br_face", BR_ASIZE(br_face_FM), br_face_FM, sizeof(br_face) };
 
 
 
br_file_struct_member br_old_face_1_FM[5] = {
 
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[0]), "vertices[0]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[1]), "vertices[1]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[2]), "vertices[2]", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_face
, smoothing
), "smoothing", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_face
, flags
), "flags", NULL 
},  
};
 
br_file_struct br_old_face_1_F = { "br_old_face_1", BR_ASIZE(br_old_face_1_FM), br_old_face_1_FM, sizeof(br_face) };
 
 
 
br_file_struct_member br_old_face_FM[5] = {
 
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[0]), "vertices[0]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[1]), "vertices[1]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, vertices
[2]), "vertices[2]", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, material
), "material", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_face
, smoothing
), "smoothing", NULL 
}, // DF_TYPE_BR_UINT_32 in EXE  
};
 
br_file_struct br_old_face_F = { "br_old_face", BR_ASIZE(br_old_face_FM), br_old_face_FM, sizeof(br_face) };
 
 
 
br_file_struct_member br_model_FM[2] = {
 
    { DF_TYPE_BR_UINT_16
, offsetof(br_model
, flags
), "flags", NULL 
},  
    { DF_TYPE_ASCIZ
, offsetof(br_model
, identifier
), "identifier", NULL 
}  
};
 
br_file_struct br_model_F = { "br_model", BR_ASIZE(br_model_FM), br_model_FM, sizeof(br_model) };
 
 
 
br_file_struct_member br_old_model_1_FM[1] = {
 
    { DF_TYPE_ASCIZ
, offsetof(br_model
, identifier
), "identifier", NULL 
},  
};
 
br_file_struct br_old_model_1_F = { "br_old_model_1", BR_ASIZE(br_old_model_1_FM), br_old_model_1_FM, sizeof(br_model) };
 
 
 
br_file_struct_member br_pivot_FM[3] = {
 
    { DF_TYPE_BR_SCALAR
, offsetof(br_model
, pivot.
v[0]), "pivot.v[X]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_model
, pivot.
v[1]), "pivot.v[Y]", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_model
, pivot.
v[2]), "pivot.v[Z]", NULL 
},  
};
 
br_file_struct br_pivot_F = { "br_pivot", BR_ASIZE(br_pivot_FM), br_pivot_FM, sizeof(br_model) };
 
 
 
br_file_struct_member br_material_old_FM[13] = {
 
    { DF_TYPE_BR_COLOUR
, offsetof(br_material
, colour
), "colour", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_material
, opacity
), "opacity", NULL 
},  
    { DF_TYPE_BR_UFRACTION
, offsetof(br_material
, ka
), "ka", NULL 
},  
    { DF_TYPE_BR_UFRACTION
, offsetof(br_material
, kd
), "kd", NULL 
},  
    { DF_TYPE_BR_UFRACTION
, offsetof(br_material
, ks
), "ks", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_material
, power
), "power", NULL 
},  
    { DF_TYPE_BR_UINT_16
, offsetof(br_material
, flags
), "flags", NULL 
},  
    { DF_TYPE_BR_VECTOR2
, offsetof(br_material
, map_transform.
m[0]), "map_transform.m[0]", NULL 
},  
    { DF_TYPE_BR_VECTOR2
, offsetof(br_material
, map_transform.
m[1]), "map_transform.m[1]", NULL 
},  
    { DF_TYPE_BR_VECTOR2
, offsetof(br_material
, map_transform.
m[2]), "map_transform.m[2]", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_material
, index_base
), "index_base", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_material
, index_range
), "index_range", NULL 
},  
    { DF_TYPE_ASCIZ
, offsetof(br_material
, identifier
), "identifier", NULL 
}  
};
 
br_file_struct br_material_old_F = { "br_material_old", BR_ASIZE(br_material_old_FM), br_material_old_FM, sizeof(br_material) };
 
 
 
br_file_struct_member br_material_FM[17] = {
 
    { DF_TYPE_BR_COLOUR
, offsetof(br_material
, colour
), "colour", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_material
, opacity
), "opacity", NULL 
},  
    { DF_TYPE_BR_UFRACTION
, offsetof(br_material
, ka
), "ka", NULL 
},  
    { DF_TYPE_BR_UFRACTION
, offsetof(br_material
, kd
), "kd", NULL 
},  
    { DF_TYPE_BR_UFRACTION
, offsetof(br_material
, ks
), "ks", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_material
, power
), "power", NULL 
},  
    { DF_TYPE_BR_UINT_32
, offsetof(br_material
, flags
), "flags", NULL 
},  
    { DF_TYPE_BR_VECTOR2
, offsetof(br_material
, map_transform.
m[0]), "map_transform.m[0]", NULL 
},  
    { DF_TYPE_BR_VECTOR2
, offsetof(br_material
, map_transform.
m[1]), "map_transform.m[1]", NULL 
},  
    { DF_TYPE_BR_VECTOR2
, offsetof(br_material
, map_transform.
m[2]), "map_transform.m[2]", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_material
, index_base
), "index_base", NULL 
},  
    { DF_TYPE_BR_UINT_8
, offsetof(br_material
, index_range
), "index_range", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_material
, fog_min
), "fog_min", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_material
, fog_max
), "fog_max", NULL 
},  
    { DF_TYPE_BR_COLOUR
, offsetof(br_material
, fog_colour
), "fog_colour", NULL 
},  
    { DF_TYPE_BR_INT_32
, offsetof(br_material
, subdivide_tolerance
), "subdivide_tolerance", NULL 
},  
    { DF_TYPE_ASCIZ
, offsetof(br_material
, identifier
), "identifier", NULL 
},  
};
 
br_file_struct br_material_F = { "br_material", BR_ASIZE(br_material_FM), br_material_FM, sizeof(br_material) };
 
 
 
struct {
 
    br_uint_32 id;
 
    size_t offset;
 
    int table;
 
} MaterialMaps[5] = {
 
    { CHUNKID_MATERIAL_COLOUR_MAP
, offsetof(br_material
, colour_map
), 0 },  
    { CHUNKID_MATERIAL_INDEX_BLEND
, offsetof(br_material
, index_blend
), 1 },  
    { CHUNKID_MATERIAL_INDEX_SHADE
, offsetof(br_material
, index_shade
), 1 },  
    { CHUNKID_MATERIAL_SCREENDOOR
, offsetof(br_material
, screendoor
), 1 },  
    { CHUNKID_MATERIAL_INDEX_FOG
, offsetof(br_material
, index_fog
), 1 },  
};
 
 
 
br_file_enum_member actor_type_FM[8] = {
 
    { 0, "BR_ACTOR_NONE" },
 
    { 1, "BR_ACTOR_MODEL" },
 
    { 2, "BR_ACTOR_LIGHT" },
 
    { 3, "BR_ACTOR_CAMERA" },
 
    { 4, "_BR_ACTOR_RESERVED" },
 
    { 5, "BR_ACTOR_BOUNDS" },
 
    { 6, "BR_ACTOR_BOUNDS_CORRECT" },
 
    { 7, "BR_ACTOR_CLIP_PLANE" }
 
};
 
br_file_enum actor_type_F = { BR_ASIZE(actor_type_FM), actor_type_FM };
 
 
 
br_file_enum_member render_style_FM[8] = {
 
    { 0, "BR_RSTYLE_DEFAULT"},
 
    { 1, "BR_RSTYLE_NONE"},
 
    { 2, "BR_RSTYLE_POINTS"},
 
    { 3, "BR_RSTYLE_EDGES"},
 
    { 4, "BR_RSTYLE_FACES"},
 
    { 5, "BR_RSTYLE_BOUNDING_POINTS"},
 
    { 6, "BR_RSTYLE_BOUNDING_EDGES"}, 
 
    { 7, "BR_RSTYLE_BOUNDING_FACES"},
 
};
 
br_file_enum render_style_F = { 8, render_style_FM };
 
 
 
br_file_struct_member br_actor_FM[3] = {
 
    { DF_TYPE_ENUM_8
, offsetof(br_actor
, type
), "type", &actor_type_F 
},  
    { DF_TYPE_ENUM_8
, offsetof(br_actor
, render_style
), "render_style", &render_style_F 
},  
    { DF_TYPE_ASCIZ
, offsetof(br_actor
, identifier
), "identifier", NULL 
}  
};
 
br_file_struct br_actor_F = { "br_actor", BR_ASIZE(br_actor_FM), br_actor_FM, sizeof(br_actor) };
 
 
 
br_file_struct_member br_transform_matrix34_FM[4] = {
 
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
mat.
m[0]), "t.mat.m[0]", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
mat.
m[1]), "t.mat.m[1]", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
mat.
m[2]), "t.mat.m[2]", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
mat.
m[3]), "t.mat.m[3]", NULL 
}  
};
 
br_file_struct br_transform_matrix34_F = { "br_transform_matrix34", BR_ASIZE(br_transform_matrix34_FM), br_transform_matrix34_FM, sizeof(br_transform) };
 
 
 
br_file_struct_member br_transform_quat_FM[5] = {
 
    { DF_TYPE_BR_SCALAR
, offsetof(br_transform
, t.
quat.
q.
x), "t.quat.q.x", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_transform
, t.
quat.
q.
y), "t.quat.q.y", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_transform
, t.
quat.
q.
z), "t.quat.q.z", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_transform
, t.
quat.
q.
w), "t.quat.q.w", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
quat.
t), "t.quat.t", NULL 
},  
};
 
br_file_struct br_transform_quat_F = { "br_transform_quat", BR_ASIZE(br_transform_quat_FM), br_transform_quat_FM, sizeof(br_transform) };
 
 
 
br_file_enum_member angle_order_FM[24] = {
 
    { 0, "BR_EULER_XYZ_S" },
 
    { 8, "BR_EULER_XYX_S" },
 
    { 4, "BR_EULER_XZY_S" },
 
    { 12, "BR_EULER_XZX_S" },
 
    { 1, "BR_EULER_YZX_S" },
 
    { 9, "BR_EULER_YZY_S" },
 
    { 5, "BR_EULER_YXZ_S" },
 
    { 13, "BR_EULER_YXY_S" },
 
    { 2, "BR_EULER_ZXY_S" },
 
    { 10, "BR_EULER_ZXZ_S" },
 
    { 6, "BR_EULER_ZYX_S" },
 
    { 14, "BR_EULER_ZYZ_S" },
 
    { 16, "BR_EULER_ZYX_R" },
 
    { 24, "BR_EULER_XYX_R" },
 
    { 20, "BR_EULER_YZX_R" },
 
    { 28, "BR_EULER_XZX_R" },
 
    { 17, "BR_EULER_XZY_R" },
 
    { 25, "BR_EULER_YZY_R" },
 
    { 21, "BR_EULER_ZXY_R" },
 
    { 29, "BR_EULER_YXY_R" },
 
    { 18, "BR_EULER_YXZ_R" },
 
    { 26, "BR_EULER_ZXZ_R" },
 
    { 22, "BR_EULER_XYZ_R" },
 
    { 30, "BR_EULER_ZYZ_R" },
 
};
 
br_file_enum angle_order_F = { BR_ASIZE(angle_order_FM), angle_order_FM };
 
 
 
br_file_struct_member br_transform_euler_FM[5] = {
 
    { DF_TYPE_ENUM_8
, offsetof(br_transform
, t.
euler.
e.
order), "t.euler.e.order", &angle_order_F 
},  
    { DF_TYPE_BR_ANGLE
, offsetof(br_transform
, t.
euler.
e.
a), "t.euler.e.a", NULL 
},  
    { DF_TYPE_BR_ANGLE
, offsetof(br_transform
, t.
euler.
e.
b), "t.euler.e.b", NULL 
},  
    { DF_TYPE_BR_ANGLE
, offsetof(br_transform
, t.
euler.
e.
c), "t.euler.e.c", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
euler.
t), "t.euler.t", NULL 
},  
};
 
br_file_struct br_transform_euler_F = { "br_transform_euler", BR_ASIZE(br_transform_euler_FM), br_transform_euler_FM, sizeof(br_transform) };
 
 
 
br_file_struct_member br_transform_look_up_FM[3] = {
 
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
look_up.
look), "t.look_up.look", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
look_up.
up), "t.look_up.up", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
look_up.
t), "t.look_up.t", NULL 
},  
};
 
br_file_struct br_transform_look_up_F =  { "br_transform_look_up", BR_ASIZE(br_transform_look_up_FM), br_transform_look_up_FM, sizeof(br_transform) };
 
 
 
br_file_struct_member br_transform_translation_FM[1] = {
 
    { DF_TYPE_BR_VECTOR3
, offsetof(br_transform
, t.
translate.
t), "t.translate.t", NULL 
},  
};
 
br_file_struct br_transform_translation_F = { "br_transform_translation", BR_ASIZE(br_transform_translation_FM), br_transform_translation_FM, sizeof(br_transform) };
 
 
 
transform_type TransformTypes[7] = {
 
    { CHUNKID_TRANSFORM_MAT34, &br_transform_matrix34_F },
 
    { CHUNKID_TRANSFORM_MAT34_LP, &br_transform_matrix34_F },
 
    { CHUNKID_TRANSFORM_QUAT, &br_transform_quat_F },
 
    { CHUNKID_TRANSFORM_EULER, &br_transform_euler_F },
 
    { CHUNKID_TRANSFORM_LOOK_UP, &br_transform_look_up_F },
 
    { CHUNKID_TRANSFORM_TRANSLATION, &br_transform_translation_F },
 
    { CHUNKID_TRANSFORM_IDENTITY, NULL }
 
};
 
 
 
br_file_struct_member br_bounds3_FM[2] = {
 
    { DF_TYPE_BR_VECTOR3
, offsetof(br_bounds3
, min
), "min", NULL 
},  
    { DF_TYPE_BR_VECTOR3
, offsetof(br_bounds3
, max
), "max", NULL 
},  
};
 
br_file_struct br_bounds3_F = { "br_bounds3", BR_ASIZE(br_bounds3_FM), br_bounds3_FM, sizeof(br_bounds3) };
 
 
 
br_file_struct_member br_plane_FM[1] = {
 
    { DF_TYPE_BR_VECTOR4
, offsetof(br_vector4
, v
), "eqn", NULL 
},  
};
 
br_file_struct br_plane_F = { "br_plane", BR_ASIZE(br_plane_FM), br_plane_FM, sizeof(br_vector4) };
 
 
 
br_file_enum_member light_type_FM[6] = {
 
    { 0, "BR_LIGHT_POINT"},
 
    { 1, "BR_LIGHT_DIRECT"},
 
    { 2, "BR_LIGHT_SPOT"},
 
    { 4, "BR_LIGHT_VIEW|BR_LIGHT_POINT"},
 
    { 5, "BR_LIGHT_VIEW|BR_LIGHT_DIRECT"},
 
    { 6, "BR_LIGHT_VIEW|BR_LIGHT_SPOT"},
 
};
 
br_file_enum light_type_F = { BR_ASIZE(light_type_FM), light_type_FM };
 
 
 
br_file_struct_member br_light_FM[8] = {
 
    { DF_TYPE_ENUM_8
, offsetof(br_light
, type
), "type", &light_type_F 
},  
    { DF_TYPE_BR_COLOUR
, offsetof(br_light
, colour
), "colour", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_light
, attenuation_c
), "attenuation_c", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_light
, attenuation_l
), "attenuation_l", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_light
, attenuation_q
), "attenuation_q", NULL 
},  
    { DF_TYPE_BR_ANGLE
, offsetof(br_light
, cone_inner
), "cone_inner", NULL 
},  
    { DF_TYPE_BR_ANGLE
, offsetof(br_light
, cone_outer
), "cone_outer", NULL 
},  
    { DF_TYPE_ASCIZ
, offsetof(br_light
, identifier
), "identifier", NULL 
},  
};
 
br_file_struct br_light_F = { "br_light", BR_ASIZE(br_light_FM), br_light_FM, sizeof(br_light) };
 
 
 
br_file_enum_member camera_type_FM[2] = {
 
    { 0, "BR_CAMERA_PARALLEL"},
 
    { 1, "BR_CAMERA_PERSPECTIVE"},
 
};
 
br_file_enum camera_type_F = { BR_ASIZE(camera_type_FM), camera_type_FM };
 
 
 
br_file_struct_member br_camera_FM[6] = {
 
    { DF_TYPE_ENUM_8
, offsetof(br_camera
, type
), "type", &camera_type_F 
},  
    { DF_TYPE_BR_ANGLE
, offsetof(br_camera
, field_of_view
), "field_of_view", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_camera
, hither_z
), "hither_z", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_camera
, yon_z
), "yon_z", NULL 
},  
    { DF_TYPE_BR_SCALAR
, offsetof(br_camera
, aspect
), "aspect", NULL 
},  
    { DF_TYPE_ASCIZ
, offsetof(br_camera
, identifier
), "identifier", NULL 
},  
};
 
br_file_struct br_camera_F = { "br_camera", BR_ASIZE(br_camera_FM), br_camera_FM, sizeof(br_camera) };
 
 
 
br_chunks_table_entry ModelLoadEntries[15] = {
 
    { CHUNKID_END, 0u, FopRead_END },
 
    { CHUNKID_OLD_MATERIAL_INDEX, 0u, FopRead_OLD_MATERIAL_INDEX },
 
    { CHUNKID_OLD_VERTICES, 0u, FopRead_OLD_VERTICES },
 
    { CHUNKID_OLD_VERTICES_UV, 0u, FopRead_OLD_VERTICES_UV },
 
    { CHUNKID_OLD_FACES, 0u, FopRead_OLD_FACES },
 
    { CHUNKID_OLD_MODEL, 0u, FopRead_OLD_MODEL },
 
    { CHUNKID_OLD_FACES_1, 1u, FopRead_OLD_FACES_1 },
 
    { CHUNKID_OLD_MODEL_1, 0u, FopRead_OLD_MODEL_1 },
 
    { CHUNKID_MODEL, 0u, FopRead_MODEL },
 
    { CHUNKID_MATERIAL_INDEX, 1u, FopRead_MATERIAL_INDEX },
 
    { CHUNKID_MODEL_VERTICES, 1u, FopRead_VERTICES },
 
    { CHUNKID_MODEL_VERTEX_UV, 1u, FopRead_VERTEX_UV },
 
    { CHUNKID_MODEL_FACES, 1u, FopRead_FACES },
 
    { CHUNKID_MODEL_FACE_MATERIAL, 0u, FopRead_FACE_MATERIAL },
 
    { CHUNKID_MODEL_PIVOT, 0u, FopRead_PIVOT },
 
};
 
br_chunks_table ModelLoadTable = { BR_ASIZE(ModelLoadEntries), ModelLoadEntries };
 
 
 
br_chunks_table_entry ActorLoadEntries[21] = {
 
    { CHUNKID_END, 0u, FopRead_END },
 
    { CHUNKID_ACTOR, 0u, FopRead_ACTOR },
 
    { CHUNKID_ACTOR_MODEL, 0u, FopRead_ACTOR_MODEL },
 
    { CHUNKID_ACTOR_TRANSFORM, 0u, FopRead_ACTOR_TRANSFORM },
 
    { CHUNKID_ACTOR_MATERIAL, 0u, FopRead_ACTOR_MATERIAL },
 
    { CHUNKID_ACTOR_LIGHT, 0u, FopRead_ACTOR_LIGHT },
 
    { CHUNKID_ACTOR_CAMERA, 0u, FopRead_ACTOR_CAMERA },
 
    { CHUNKID_ACTOR_BOUNDS, 0u, FopRead_ACTOR_BOUNDS },
 
    { CHUNKID_ACTOR_CLIP_PLANE, 0u, FopRead_ACTOR_CLIP_PLANE },
 
    { CHUNKID_ACTOR_ADD_CHILD, 0u, FopRead_ACTOR_ADD_CHILD },
 
    { CHUNKID_TRANSFORM_MAT34, 0u, FopRead_TRANSFORM },
 
    { CHUNKID_TRANSFORM_MAT34_LP, 0u, FopRead_TRANSFORM },
 
    { CHUNKID_TRANSFORM_QUAT, 0u, FopRead_TRANSFORM },
 
    { CHUNKID_TRANSFORM_EULER, 0u, FopRead_TRANSFORM },
 
    { CHUNKID_TRANSFORM_LOOK_UP, 0u, FopRead_TRANSFORM },
 
    { CHUNKID_TRANSFORM_TRANSLATION, 0u, FopRead_TRANSFORM },
 
    { CHUNKID_TRANSFORM_IDENTITY, 0u, FopRead_TRANSFORM },
 
    { CHUNKID_BOUNDS, 0u, FopRead_BOUNDS },
 
    { CHUNKID_LIGHT, 0u, FopRead_LIGHT },
 
    { CHUNKID_CAMERA, 0u, FopRead_CAMERA },
 
    { CHUNKID_PLANE, 0u, FopRead_PLANE },
 
};
 
br_chunks_table ActorLoadTable = { BR_ASIZE(ActorLoadEntries), ActorLoadEntries };
 
 
 
br_chunks_table_entry MaterialLoadEntries[8] = {
 
    { CHUNKID_END, 0u, FopRead_END },
 
    { CHUNKID_MATERIAL_OLD, 0u, FopRead_MATERIAL_OLD },
 
    { CHUNKID_MATERIAL_COLOUR_MAP, 0u, FopRead_PIXELMAP_REF },
 
    { CHUNKID_MATERIAL_INDEX_BLEND, 0u, FopRead_PIXELMAP_REF },
 
    { CHUNKID_MATERIAL_INDEX_SHADE, 0u, FopRead_PIXELMAP_REF },
 
    { CHUNKID_MATERIAL_SCREENDOOR, 0u, FopRead_PIXELMAP_REF },
 
    { CHUNKID_MATERIAL_INDEX_FOG, 0u, FopRead_PIXELMAP_REF },
 
    { CHUNKID_MATERIAL, 0u, FopRead_MATERIAL },
 
};
 
br_chunks_table MaterialLoadTable = { BR_ASIZE(MaterialLoadEntries), MaterialLoadEntries };
 
 
 
// IDA: int __usercall FopWrite_VERTICES@<EAX>(br_datafile *df@<EAX>, br_vertex *vertices@<EDX>, int nvertices@<EBX>)
 
int FopWrite_VERTICES(br_datafile* df, br_vertex* vertices, int nvertices) {
 
    LOG_TRACE("(%p, %p, %d)", df, vertices, nvertices);
 
 
 
    df->prims->chunk_write(df, CHUNKID_MODEL_VERTICES, df->prims->struct_size(df, &br_vertex_F, NULL) * nvertices + df->prims->count_size(df));
 
    df->prims->count_write(df, nvertices);
 
    DfStructWriteArray(df, &br_vertex_F, vertices, nvertices);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_VERTICES@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_VERTICES(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    //int i; // Pierre-Marie Baty -- unused variable
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = DfTop(DF_MODEL, NULL);
 
    mp->vertices = BrResAllocate(mp, sizeof(br_vertex) * count, BR_MEMORY_VERTICES);
 
    DfStructReadArray(df, &br_vertex_F, mp->vertices, count);
 
    mp->nvertices = count;
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_OLD_VERTICES@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_OLD_VERTICES(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    void* ptr;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    count = length / df->prims->struct_size(df, &br_vertex_F, NULL);
 
    ptr = BrResAllocate(v1db.res, count * sizeof(br_vertex), BR_MEMORY_VERTICES);
 
    DfStructReadArray(df, &br_vertex_F, ptr, count);
 
    DfPush(DF_VERTEX, ptr, count);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_VERTEX_UV@<EAX>(br_datafile *df@<EAX>, br_vertex *vertices@<EDX>, int nvertices@<EBX>)
 
int FopWrite_VERTEX_UV(br_datafile* df, br_vertex* vertices, int nvertices) {
 
    LOG_TRACE("(%p, %p, %d)", df, vertices, nvertices);
 
 
 
    df->prims->chunk_write(df, CHUNKID_MODEL_VERTEX_UV, df->prims->struct_size(df, &br_vertex_uv_F, NULL) * nvertices + df->prims->count_size(df));
 
    df->prims->count_write(df, nvertices);
 
    DfStructWriteArray(df, &br_vertex_uv_F, vertices, nvertices);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_VERTEX_UV@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_VERTEX_UV(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = DfTop(DF_MODEL, NULL);
 
    if (count > mp->nvertices) {
 
        BrFailure("Vertex UV: too many entries");
 
    }
 
    DfStructReadArray(df, &br_vertex_uv_F, mp->vertices, count);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_OLD_VERTICES_UV@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_OLD_VERTICES_UV(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    void* ptr;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    count = length / df->prims->struct_size(df, &br_old_vertex_uv_F, NULL);
 
    ptr = BrResAllocate(v1db.res, count * sizeof(br_vertex), BR_MEMORY_VERTICES);
 
    DfStructReadArray(df, &br_old_vertex_uv_F, ptr, count);
 
    DfPush(DF_VERTEX, ptr, count);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_MATERIAL_INDEX@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_MATERIAL_INDEX(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    char name[256];
 
    br_material** mip;
 
    br_uint_32 i;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mip = (br_material**)BrResAllocate(v1db.res, sizeof(br_material*) * (count + 1), BR_MEMORY_MATERIAL_INDEX);
 
    mip[0] = NULL;
 
    for (i = 1; i < count + 1; i++) {
 
        df->prims->name_read(df, name);
 
        mip[i] = BrMaterialFind(name);
 
    }
 
    DfPush(DF_MATERIAL_INDEX, mip, count + 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_MATERIAL_INDEX@<EAX>(br_datafile *df@<EAX>, br_material **materials@<EDX>, int nmaterials@<EBX>)
 
int FopWrite_MATERIAL_INDEX(br_datafile* df, br_material** materials, int nmaterials) {
 
    int i;
 
    int s;
 
    LOG_TRACE("(%p, %p, %d)", df, materials, nmaterials);
 
 
 
    s = df->prims->count_size(df);
 
    for (i = 0; i < nmaterials; i++) {
 
        s += df->prims->name_size(df, materials[i]->identifier);
 
    }
 
    df->prims->chunk_write(df, CHUNKID_MATERIAL_INDEX, s);
 
    df->prims->count_write(df, nmaterials);
 
    for (i = 0; i < nmaterials; i++) {
 
        df->prims->name_write(df, materials[i]->identifier);
 
    }
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_OLD_MATERIAL_INDEX@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_OLD_MATERIAL_INDEX(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    char* mblock;
 
    char* cp;
 
    int i;
 
    int num_materials;
 
    br_material** mip;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mblock = BrScratchAllocate(length);
 
    if (BrFileRead(mblock, 1, length, df->h) != length) {
 
        BrFailure("could not read material index");
 
    }
 
    num_materials = 0;
 
    cp = mblock;
 
    for (i = 0; i < (int) length; i++) { // Pierre-Marie Baty -- added type cast
 
        if (*cp == '\0') {
 
            num_materials++;
 
        }
 
        cp++;
 
    }
 
    mip = BrResAllocate(v1db.res, num_materials * sizeof(br_material*), BR_MEMORY_MATERIAL_INDEX);
 
    cp = mblock;
 
    for (i = 0; i < num_materials; i++) {
 
        mip[i] = BrMaterialFind(cp);
 
        while (*cp != '\0') {
 
            cp++;
 
        }
 
        cp++;
 
    }
 
    BrScratchFree(mblock);
 
    DfPush(DF_MATERIAL_INDEX, mip, num_materials);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_FACES@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_FACES(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    int i;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
    mp = DfTop(DF_MODEL, 0);
 
    mp->faces = (br_face*)BrResAllocate(mp, sizeof(br_face) * count, BR_MEMORY_FACES);
 
    mp->nfaces = count;
 
    DfStructReadArray(df, &br_face_F, mp->faces, count);
 
    for (i = 0; i < mp->nfaces; i++) {
 
        if (!mp->faces[i].smoothing) {
 
            mp->faces[i].smoothing = -1;
 
        }
 
        mp->faces[i].index = i;
 
    }
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_FACES@<EAX>(br_datafile *df@<EAX>, br_face *faces@<EDX>, int nfaces@<EBX>)
 
int FopWrite_FACES(br_datafile* df, br_face* faces, int nfaces) {
 
    LOG_TRACE("(%p, %p, %d)", df, faces, nfaces);
 
 
 
    df->prims->chunk_write(df, CHUNKID_MODEL_FACES, df->prims->struct_size(df, &br_face_F, NULL) * nfaces + df->prims->count_size(df));
 
    df->prims->count_write(df, nfaces);
 
    DfStructWriteArray(df, &br_face_F, faces, nfaces);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_OLD_FACES_1@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_OLD_FACES_1(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    int i;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = DfTop(DF_MODEL, NULL);
 
    mp->faces = BrResAllocate(mp, count * sizeof(br_face), BR_MEMORY_FACES);
 
    mp->nfaces = count;
 
    DfStructReadArray(df, &br_old_face_1_F, mp->faces, (br_uint_16)count);
 
    for (i = 0; i < mp->nfaces; i++) {
 
        if (mp->faces[i].smoothing == 0) {
 
            mp->faces[i].smoothing = -1;
 
        } else {
 
            mp->faces[i].smoothing = 1 << ((mp->faces[i].smoothing - 1) % 16);
 
        }
 
    }
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_OLD_FACES@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_OLD_FACES(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_face* fp;
 
    br_material** mip;
 
    int mi_count;
 
    /*unsigned*/ int i; // Pierre-Marie Baty -- fixed type
 
    void* ptr;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    ptr = DfPop(DF_VERTEX, /*(int*)*/&i); // Pierre-Marie Baty -- removed type cast
 
    mip = DfPop(DF_MATERIAL_INDEX, &mi_count);
 
    DfPush(DF_VERTEX, ptr, i);
 
    mi_count = length / df->prims->struct_size(df, &br_old_face_F, NULL);
 
    fp = BrResAllocate(v1db.res, sizeof(br_face) * mi_count, BR_MEMORY_FACES);
 
    DfStructReadArray(df, &br_old_face_F, fp, mi_count);
 
    for (i = 0; i < mi_count; i++) {
 
        fp[i].material = mip[*(br_uint_16*)&fp[i].material];
 
        if (fp[i].smoothing == 0) {
 
            fp[i].smoothing = -1;
 
        }
 
    }
 
    BrResFree(mip);
 
    DfPush(DF_FACE, fp, mi_count);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_FACE_MATERIAL@<EAX>(br_datafile *df@<EAX>, br_face *faces@<EDX>, int nfaces@<EBX>, br_material **mindex@<ECX>, int nmaterials)
 
int FopWrite_FACE_MATERIAL(br_datafile* df, br_face* faces, int nfaces, br_material** mindex, int nmaterials) {
 
    br_uint_16* block;
 
    //br_uint_16* ip; // Pierre-Marie Baty -- unused variable
 
    //br_face* fp; // Pierre-Marie Baty -- unused variable
 
    int i;
 
    int j;
 
    LOG_TRACE("(%p, %p, %d, %p, %d)", df, faces, nfaces, mindex, nmaterials);
 
 
 
    FopWrite_MATERIAL_INDEX(df, mindex, nmaterials);
 
    block = BrResAllocate(v1db.res, nfaces * sizeof(br_uint_16), BR_MEMORY_MATERIAL_INDEX);
 
    for (i = 0; i < nfaces; i++) {
 
        block[i] = 0;
 
        if (faces[i].material != NULL) {
 
            for (j = 0; j < nmaterials; j++) {
 
                if (faces[i].material == mindex[j]) {
 
                    block[i] = j + 1;
 
                    break;
 
                }
 
            }
 
        }
 
    }
 
    df->prims->chunk_write(df, CHUNKID_MODEL_FACE_MATERIAL, df->prims->block_size(df, block, nfaces, 0, 1, sizeof(br_uint_16)));
 
    df->prims->block_write(df, block, nfaces, 0, 1, sizeof(br_uint_16));
 
    BrResFree(block);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_FACE_MATERIAL@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_FACE_MATERIAL(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_material** mindex;
 
    int nmaterials;
 
    br_model* mp;
 
    br_face* fp;
 
    br_uint_16* block;
 
    br_uint_16* ip;
 
    int block_count;
 
    int i;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mindex = DfPop(DF_MATERIAL_INDEX, &nmaterials);
 
    mp = DfTop(DF_MODEL, 0);
 
 
 
    block = BrScratchAllocate(length);
 
    block_count = mp->nfaces;
 
    block = df->prims->block_read(df, block, &block_count, sizeof(br_uint_16), 0);
 
 
 
    if (block_count > mp->nfaces)
 
        BrFailure("Face Materials: too many entries");
 
 
 
    fp = mp->faces;
 
    ip = block;
 
    for (i = 0; i < block_count; i++) {
 
        fp->material = (*ip < nmaterials) ? mindex[*ip] : NULL;
 
        fp++;
 
        ip++;
 
    }
 
 
 
    BrScratchFree(block);
 
    BrResFree(mindex);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_MODEL@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_MODEL(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = BrModelAllocate(NULL, 0, 0);
 
    mp->identifier = NULL;
 
    df->res = mp;
 
    df->prims->struct_read(df, &br_model_F, mp);
 
    df->res = NULL;
 
    mp->flags &= (BR_MODF_DONT_WELD | BR_MODF_KEEP_ORIGINAL | BR_MODF_GENERATE_TAGS | BR_MODF_QUICK_UPDATE);
 
    DfPush(DF_MODEL, mp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_MODEL@<EAX>(br_datafile *df@<EAX>, br_model *mp@<EDX>)
 
int FopWrite_MODEL(br_datafile* df, br_model* mp) {
 
    br_model temp_model;
 
    LOG_TRACE("(%p, %p)", df, mp);
 
    
 
    memcpy(&temp_model
, mp
, sizeof(br_model
));  
    df->prims->chunk_write(df, CHUNKID_MODEL, df->prims->struct_size(df, &br_model_F, mp));
 
    df->prims->struct_write(df, &br_model_F, mp);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_OLD_MODEL_1@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_OLD_MODEL_1(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = BrModelAllocate(NULL, 0, 0);
 
    df->res = mp;
 
    df->prims->struct_read(df, &br_old_model_1_F, mp);
 
    df->res = NULL;
 
    DfPush(DF_MODEL, df->res, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_OLD_MODEL@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_OLD_MODEL(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    int i;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = BrModelAllocate(NULL, 0, 0);
 
    df->res = mp;
 
    df->prims->struct_read(df, &br_model_F, mp);
 
    df->res = NULL;
 
    mp->faces = DfPop(DF_FACE, &i);
 
    mp->nfaces = i;
 
    mp->vertices = DfPop(DF_VERTEX, &i);
 
    mp->nvertices = i;
 
    BrResAdd(mp, mp->faces);
 
    BrResAdd(mp, mp->vertices);
 
    mp->flags = mp->flags & (BR_MODF_DONT_WELD | BR_MODF_KEEP_ORIGINAL | BR_MODF_GENERATE_TAGS | BR_MODF_QUICK_UPDATE);
 
    DfPush(DF_MODEL, mp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_PIVOT@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_PIVOT(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_model* mp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = DfPop(DF_MODEL, NULL);
 
    df->res = mp;
 
    df->prims->struct_read(df, &br_pivot_F, mp);
 
    df->res = NULL;
 
    DfPush(DF_MODEL, mp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_MATERIAL_OLD@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_MATERIAL_OLD(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_material* mp;
 
    mp = BrMaterialAllocate(NULL);
 
    df->res = mp;
 
    df->prims->struct_read(df, &br_material_old_F, mp);
 
    df->res = NULL;
 
    DfPush(DF_MATERIAL, mp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_MATERIAL@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_MATERIAL(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_material* mp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    mp = BrMaterialAllocate(NULL);
 
    df->res = mp;
 
    df->prims->struct_read(df, &br_material_F, mp);
 
    df->res = NULL;
 
    DfPush(DF_MATERIAL, mp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_MATERIAL@<EAX>(br_datafile *df@<EAX>, br_material *mp@<EDX>)
 
int FopWrite_MATERIAL(br_datafile* df, br_material* mp) {
 
    LOG_TRACE("(%p, %p)", df, mp);
 
 
 
    df->prims->chunk_write(df, CHUNKID_MATERIAL, df->prims->struct_size(df, &br_material_F, mp));
 
    df->prims->struct_write(df,&br_material_F, mp);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_PIXELMAP_REF@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_PIXELMAP_REF(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_pixelmap* pm;
 
    char name[256];
 
    char* mp;
 
    int i;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    for (i = 0; i < BR_ASIZE(MaterialMaps); i++) {
 
        if (id == MaterialMaps[i].id) {
 
            break;
 
        }
 
    }
 
 
 
    mp = DfTop(DF_MATERIAL, NULL);
 
    df->prims->name_read(df, name);
 
    if (MaterialMaps[i].table != 0) {
 
        pm = BrTableFind(name);
 
    } else {
 
        pm = BrMapFind(name);
 
    }
 
    *(intptr_t*)(mp + MaterialMaps[i].offset) = (intptr_t/***/)pm; // Pierre-Marie Baty -- fixed type
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_PIXELMAP_REF@<EAX>(br_datafile *df@<EAX>, int id@<EDX>, br_pixelmap *pixelmap@<EBX>)
 
int FopWrite_PIXELMAP_REF(br_datafile* df, int id, br_pixelmap* pixelmap) {
 
    LOG_TRACE("(%p, %d, %p)", df, id, pixelmap);
 
 
 
    df->prims->chunk_write(df, id, df->prims->name_size(df, pixelmap->identifier));
 
    df->prims->name_write(df, pixelmap->identifier);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR@<EAX>(br_datafile *df@<EAX>, br_actor *ap@<EDX>)
 
int FopWrite_ACTOR(br_datafile* df, br_actor* ap) {
 
    LOG_TRACE("(%p, %p)", df, ap);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR, df->prims->struct_size(df, &br_actor_F, ap));
 
    df->prims->struct_write(df, &br_actor_F, ap);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_actor* ap;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    ap = BrActorAllocate(BR_ACTOR_NONE, NULL);
 
    df->res = ap;
 
    df->prims->struct_read(df, &br_actor_F, ap);
 
    df->res = NULL;
 
    ap->t.type = BR_TRANSFORM_IDENTITY;
 
    DfPush(DF_ACTOR, ap, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_MODEL@<EAX>(br_datafile *df@<EAX>, br_model *model@<EDX>)
 
int FopWrite_ACTOR_MODEL(br_datafile* df, br_model* model) {
 
    LOG_TRACE9("(%p, %p)", df, model);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_MODEL, df->prims->name_size(df, model->identifier));
 
    df->prims->name_write(df, model->identifier);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_MODEL@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_MODEL(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    char name[256];
 
    br_actor* a;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    a = DfTop(DF_ACTOR, 0);
 
    df->prims->name_read(df, name);
 
    a->model = BrModelFind(name);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_MATERIAL@<EAX>(br_datafile *df@<EAX>, br_material *material@<EDX>)
 
int FopWrite_ACTOR_MATERIAL(br_datafile* df, br_material* material) {
 
    LOG_TRACE("(%p, %p)", df, material);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_MATERIAL, df->prims->name_size(df, material->identifier));
 
    df->prims->name_write(df, material->identifier);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_MATERIAL@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_MATERIAL(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    char name[256];
 
    br_actor* a;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    a = DfTop(DF_ACTOR, NULL);
 
    df->prims->name_read(df, name);
 
    a->material = BrMaterialFind(name);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_TRANSFORM@<EAX>(br_datafile *df@<EAX>)
 
int FopWrite_ACTOR_TRANSFORM(br_datafile* df) {
 
    LOG_TRACE("(%p)", df);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_TRANSFORM, 0);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_TRANSFORM@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_TRANSFORM(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_actor* a;
 
    br_transform* tp;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    tp = DfPop(DF_TRANSFORM, NULL);
 
    a = DfTop(DF_ACTOR, NULL);
 
    memcpy(&a
->t
, tp
, sizeof(br_transform
));  
    BrResFree(tp);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_LIGHT@<EAX>(br_datafile *df@<EAX>)
 
int FopWrite_ACTOR_LIGHT(br_datafile* df) {
 
    LOG_TRACE("(%p)", df);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_LIGHT, 0);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_LIGHT@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_LIGHT(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_actor* a;
 
    br_light* lp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    lp = DfPop(DF_LIGHT, NULL);
 
    a = DfTop(DF_ACTOR, NULL);
 
    a->type_data = lp;
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_CAMERA@<EAX>(br_datafile *df@<EAX>)
 
int FopWrite_ACTOR_CAMERA(br_datafile* df) {
 
    LOG_TRACE("(%p)", df);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_CAMERA, 0);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_CAMERA@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_CAMERA(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_actor* a;
 
    br_light* cp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    cp = DfPop(DF_CAMERA, NULL);
 
    a = DfTop(DF_ACTOR, NULL);
 
    a->type_data = cp;
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_BOUNDS@<EAX>(br_datafile *df@<EAX>)
 
int FopWrite_ACTOR_BOUNDS(br_datafile* df) {
 
    LOG_TRACE("(%p)", df);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_BOUNDS, 0);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_BOUNDS@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_BOUNDS(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_actor* a;
 
    br_bounds* bp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    bp = DfPop(DF_BOUNDS, 0);
 
    a = DfTop(DF_ACTOR, 0);
 
    a->type_data = bp;
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_CLIP_PLANE@<EAX>(br_datafile *df@<EAX>)
 
int FopWrite_ACTOR_CLIP_PLANE(br_datafile* df) {
 
    LOG_TRACE("(%p)", df);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_CLIP_PLANE, 0);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_CLIP_PLANE@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_CLIP_PLANE(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_actor* a;
 
    br_vector4* vp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    vp = DfPop(DF_CLIP_PLANE, NULL);
 
    a = DfTop(DF_ACTOR, NULL);
 
    a->type_data = vp;
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_ACTOR_ADD_CHILD@<EAX>(br_datafile *df@<EAX>)
 
int FopWrite_ACTOR_ADD_CHILD(br_datafile* df) {
 
    LOG_TRACE("(%p)", df);
 
 
 
    df->prims->chunk_write(df, CHUNKID_ACTOR_ADD_CHILD, 0);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_ACTOR_ADD_CHILD@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_ACTOR_ADD_CHILD(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_actor* a;
 
    br_actor* p;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    a = DfPop(DF_ACTOR, 0);
 
    p = DfTop(DF_ACTOR, 0);
 
    BrActorAdd(p, a);
 
 
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_TRANSFORM@<EAX>(br_datafile *df@<EAX>, br_transform *t@<EDX>)
 
int FopWrite_TRANSFORM(br_datafile* df, br_transform* t) {
 
    transform_type* tt;
 
    LOG_TRACE("(%p, %p)", df, t);
 
 
 
    tt = &TransformTypes[t->type];
 
    if (tt->fs == NULL) {
 
        df->prims->chunk_write(df, tt->id, 0);
 
    } else {
 
        df->prims->chunk_write(df, tt->id, df->prims->struct_size(df, tt->fs, t));
 
        df->prims->struct_size(df, tt->fs, &t);
 
        df->prims->struct_write(df, tt->fs, t);
 
    }
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_TRANSFORM@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_TRANSFORM(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    int t;
 
    br_transform* tp;
 
    LOG_TRACE9("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    for (t = 0; t < BR_ASIZE(TransformTypes); t++) {
 
        if (id == TransformTypes[t].id) {
 
            break;
 
        }
 
    }
 
    if (t == BR_ASIZE(TransformTypes)) {
 
        LOG_PANIC("transform type not found!");
 
    }
 
    tp = (br_transform*)BrResAllocate(v1db.res, sizeof(br_transform), BR_MEMORY_TRANSFORM);
 
    tp->type = t;
 
    df->res = tp;
 
    if (TransformTypes[t].fs) {
 
        df->prims->struct_read(df, TransformTypes[t].fs, tp);
 
    }
 
    df->res = NULL;
 
    DfPush(DF_TRANSFORM, tp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_BOUNDS@<EAX>(br_datafile *df@<EAX>, br_bounds *bp@<EDX>)
 
int FopWrite_BOUNDS(br_datafile* df, br_bounds* bp) {
 
    LOG_TRACE("(%p, %p)", df, bp);
 
 
 
    df->prims->chunk_write(df, CHUNKID_BOUNDS, df->prims->struct_size(df, &br_bounds3_F, bp));
 
    df->prims->struct_write(df, &br_bounds3_F, bp);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_BOUNDS@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_BOUNDS(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_bounds3* bp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    bp = BrResAllocate(v1db.res, sizeof(br_bounds3), BR_MEMORY_BOUNDS);
 
    df->res = bp;
 
    df->prims->struct_read(df, &br_bounds3_F, bp);
 
    df->res = NULL;
 
    DfPush(DF_BOUNDS, bp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_PLANE@<EAX>(br_datafile *df@<EAX>, br_vector4 *pp@<EDX>)
 
int FopWrite_PLANE(br_datafile* df, br_vector4* pp) {
 
    LOG_TRACE("(%p, %p)", df, pp);
 
 
 
    df->prims->chunk_write(df, CHUNKID_PLANE, df->prims->struct_size(df, &br_plane_F, pp));
 
    df->prims->struct_write(df, &br_plane_F, pp);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_PLANE@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_PLANE(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_vector4* pp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    pp = BrResAllocate(v1db.res, sizeof(br_vector4), BR_MEMORY_CLIP_PLANE);
 
    df->res = pp;
 
    df->prims->struct_read(df, &br_plane_F, pp);
 
    df->res = NULL;
 
    DfPush(DF_CLIP_PLANE, pp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_LIGHT@<EAX>(br_datafile *df@<EAX>, br_light *lp@<EDX>)
 
int FopWrite_LIGHT(br_datafile* df, br_light* lp) {
 
    LOG_TRACE("(%p, %p)", df, lp);
 
 
 
    df->prims->chunk_write(df, CHUNKID_LIGHT, df->prims->struct_size(df, &br_light_F, lp));
 
    df->prims->struct_write(df, &br_light_F, lp);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_LIGHT@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_LIGHT(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_light* lp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    lp = BrResAllocate(v1db.res, sizeof(br_light), BR_MEMORY_LIGHT);
 
    df->res = lp;
 
    df->prims->struct_read(df, &br_light_F, lp);
 
    df->res = NULL;
 
    DfPush(DF_LIGHT, lp, 1);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopWrite_CAMERA@<EAX>(br_datafile *df@<EAX>, br_camera *cp@<EDX>)
 
int FopWrite_CAMERA(br_datafile* df, br_camera* cp) {
 
    LOG_TRACE("(%p, %p)", df, cp);
 
 
 
    df->prims->chunk_write(df, CHUNKID_CAMERA, df->prims->struct_size(df, &br_camera_F, cp));
 
    df->prims->struct_write(df, &br_camera_F, cp);
 
    return 0;
 
}
 
 
 
// IDA: int __usercall FopRead_CAMERA@<EAX>(br_datafile *df@<EAX>, br_uint_32 id@<EDX>, br_uint_32 length@<EBX>, br_uint_32 count@<ECX>)
 
int FopRead_CAMERA(br_datafile* df, br_uint_32 id, br_uint_32 length, br_uint_32 count) {
 
    br_camera* cp;
 
    LOG_TRACE("(%p, %d, %d, %d)", df, id, length, count);
 
 
 
    cp = BrResAllocate(v1db.res, sizeof(br_camera), BR_MEMORY_CAMERA);
 
    df->res = cp;
 
    df->prims->struct_read(df, &br_camera_F, cp);
 
    df->res = NULL;
 
    DfPush(DF_CAMERA, cp, 1);
 
    return 0;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrModelLoadMany(char *filename, br_model **models, br_uint_16 num)
 
br_uint_32 BrModelLoadMany(char* filename, br_model** models, br_uint_16 num) {
 
    int count;
 
    int r;
 
    br_datafile* df;
 
    LOG_TRACE9("(\"%s\", %p, %d)", filename, models, num);
 
 
 
    df = DfOpen(filename, 0, BRT_FLOAT);
 
    if (df == NULL) {
 
        return 0;
 
    }
 
    count = 0;
 
    do {
 
        if (count >= num) {
 
            break;
 
        }
 
        r = DfChunksInterpret(df, &ModelLoadTable);
 
        if (DfTopType() == DF_MODEL) {
 
            models[count] = DfPop(DF_MODEL, 0);
 
            count++;
 
        }
 
    } while (r != 0);
 
    DfClose(df);
 
    return count;
 
}
 
 
 
// IDA: int __cdecl PtrCompare(void *a, void *b)
 
int PtrCompare(void* a, void* b) {
 
    LOG_TRACE("(%p, %p)", a, b);
 
 
 
    if (*(uintptr_t*)a > *(uintptr_t*)b) {
 
        return -1;
 
    }
 
    return *(uintptr_t*)a < *(uintptr_t*)b;
 
}
 
 
 
// IDA: br_uint_32 __cdecl WriteModel(br_model *mp, br_datafile *df)
 
br_uint_32 WriteModel(br_model* mp, br_datafile* df) {
 
    br_material** mindex;
 
    //br_vertex* vp; // Pierre-Marie Baty -- unused variable
 
    int nmaterials;
 
    int i;
 
    int has_uv;
 
    LOG_TRACE("(%p, %p)", mp, df);
 
 
 
    nmaterials = 0;
 
    if (mp->vertices == NULL || mp->faces == NULL) {
 
        if (mp->identifier != NULL) {
 
            BrWarning(mp->identifier);
 
        }
 
        BrWarning("Model must have vertex and face information to save.");
 
        BrWarning("This information may have neem stripped on addition to");
 
        BrWarning("the registry. To prevent this, set the BR_MODF_UPDATEABLE");
 
        BrFailure("flag before adding the model to the registry.");
 
    }
 
    mindex = BrResAllocate(v1db.res, mp->nfaces * sizeof(br_material*), BR_MEMORY_MATERIAL_INDEX);
 
    for (i = 0; i < mp->nfaces; i++) {
 
        mindex[i] = mp->faces[i].material;
 
    }
 
    BrQsort(mindex, mp->nfaces, sizeof(br_material*), (br_qsort_cbfn*)PtrCompare);
 
    nmaterials = 1;
 
    for (i = 1; i < mp->nfaces; i++) {
 
        if (mindex[nmaterials-1] == mindex[i]) {
 
            mindex[nmaterials] = mindex[i];
 
            nmaterials++;
 
        }
 
    }
 
    if (mindex[nmaterials-1] == NULL) {
 
        nmaterials = 0;
 
    }
 
    has_uv = 0;
 
    for (i = 0; i < mp->nvertices; i++) {
 
        if (mp->vertices[i].map.v[0] != 0.f || mp->vertices[i].map.v[1] != 0.f) {
 
            has_uv = 1;
 
            break;
 
        }
 
    }
 
 
 
    FopWrite_MODEL(df, mp);
 
    if (mp->nvertices != 0) {
 
        FopWrite_VERTICES(df, mp->vertices, mp->nvertices);
 
        if (has_uv != 0) {
 
            FopWrite_VERTEX_UV(df, mp->vertices, mp->nvertices);
 
        }
 
    }
 
    if (mp->nfaces != 0) {
 
        FopWrite_FACES(df, mp->faces, mp->nfaces);
 
        if (nmaterials != 0) {
 
            FopWrite_FACE_MATERIAL(df, mp->faces, mp->nfaces, mindex, nmaterials);
 
        }
 
    }
 
    FopWrite_END(df);
 
    BrResFree(mindex);
 
    return 0;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrModelSaveMany(char *filename, br_model **models, br_uint_16 num)
 
br_uint_32 BrModelSaveMany(char* filename, br_model** models, br_uint_16 num) {
 
    br_datafile* df;
 
    int i;
 
    int m;
 
    LOG_TRACE("(\"%s\", %p, %d)", filename, models, num);
 
 
 
    df = DfOpen(filename, 1, BRT_FLOAT);
 
    if (df == NULL) {
 
        return 0;
 
    }
 
    FopWrite_FILE_INFO(df, FILE_TYPE_MODEL);
 
    if (models == NULL) {
 
        BrModelEnum(NULL, (br_model_enum_cbfn*)&WriteModel, df);
 
        m = BrModelCount(NULL);
 
    } else {
 
        for (i = 0; i < num; i++) {
 
            WriteModel(models[i], df);
 
        }
 
        m = num;
 
    }
 
    DfClose(df);
 
    return m;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrActorLoadMany(char *filename, br_actor **actors, br_uint_16 num)
 
br_uint_32 BrActorLoadMany(char* filename, br_actor** actors, br_uint_16 num) {
 
    br_datafile* df;
 
    int count;
 
    int r;
 
    LOG_TRACE9("(\"%s\", %p, %d)", filename, actors, num);
 
 
 
    df = DfOpen(filename, 0, BRT_FLOAT);
 
    if (df == NULL) {
 
        return 0;
 
    }
 
 
 
    count = 0;
 
    do {
 
        if (count >= num) {
 
            break;
 
        }
 
        r = DfChunksInterpret(df, &ActorLoadTable);
 
        if (DfTopType() == DF_ACTOR) {
 
            actors[count] = DfPop(DF_ACTOR, NULL);
 
            count++;
 
        }
 
    } while (r != 0);
 
    DfClose(df);
 
    return count;
 
}
 
 
 
// IDA: int __usercall WriteActor@<EAX>(br_actor *a@<EAX>, br_datafile *df@<EDX>)
 
int WriteActor(br_actor* a, br_datafile* df) {
 
    br_actor* ap;
 
    br_actor* last_ap;
 
    LOG_TRACE("(%p, %p)", a, df);
 
 
 
    FopWrite_ACTOR(df, a);
 
    if (a->t.type != BR_TRANSFORM_IDENTITY) {
 
        FopWrite_TRANSFORM(df, &a->t);
 
        FopWrite_ACTOR_TRANSFORM(df);
 
    }
 
    if (a->material != NULL) {
 
        FopWrite_ACTOR_MATERIAL(df, a->material);
 
    }
 
    if (a->model != NULL) {
 
        FopWrite_ACTOR_MODEL(df, a->model);
 
    }
 
    if (a->type_data != NULL) {
 
        switch (a->type) {
 
        case BR_ACTOR_LIGHT:
 
            FopWrite_LIGHT(df, a->type_data);
 
            FopWrite_ACTOR_LIGHT(df);
 
            break;
 
        case BR_ACTOR_CAMERA:
 
            FopWrite_CAMERA(df, a->type_data);
 
            FopWrite_ACTOR_CAMERA(df);
 
            break;
 
        case BR_ACTOR_BOUNDS:
 
            FopWrite_BOUNDS(df, a->type_data);
 
            FopWrite_ACTOR_BOUNDS(df);
 
            break;
 
        case BR_ACTOR_CLIP_PLANE:
 
            FopWrite_PLANE(df, a->type_data);
 
            FopWrite_ACTOR_CLIP_PLANE(df);
 
            break;
 
        }
 
    }
 
    if (a->children != NULL){
 
        last_ap = a->children;
 
        while (last_ap->next != NULL) {
 
            last_ap = last_ap->next;
 
        }
 
        ap = last_ap;
 
        while (1) {
 
            WriteActor(ap, df);
 
            FopWrite_ACTOR_ADD_CHILD(df);
 
            if (a->children == ap) {
 
                break;
 
            }
 
            ap = (br_actor*)ap->prev;
 
        }
 
    }
 
    return 0;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrActorSaveMany(char *filename, br_actor **actors, br_uint_16 num)
 
br_uint_32 BrActorSaveMany(char* filename, br_actor** actors, br_uint_16 num) {
 
    br_datafile* df;
 
    int i;
 
    LOG_TRACE("(\"%s\", %p, %d)", filename, actors, num);
 
 
 
    df = DfOpen(filename, 1, BRT_FLOAT);
 
    if (df == NULL) {
 
        return 0;
 
    }
 
    FopWrite_FILE_INFO(df, FILE_TYPE_ACTORS);
 
    for (i = 0; i < num; i++) {
 
        WriteActor(actors[i], df);
 
        FopWrite_END(df);
 
    }
 
    DfClose(df);
 
    return num;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrMaterialLoadMany(char *filename, br_material **materials, br_uint_16 num)
 
br_uint_32 BrMaterialLoadMany(char* filename, br_material** materials, br_uint_16 num) {
 
    br_datafile* df;
 
    int count;
 
    int r;
 
 
 
    df = DfOpen(filename, 0, BRT_FLOAT);
 
    if (df == NULL) {
 
        return 0;
 
    }
 
    count = 0;
 
    do {
 
        if (count >= num) {
 
            break;
 
        }
 
        r = DfChunksInterpret(df, &MaterialLoadTable);
 
        if (DfTopType() == DF_MATERIAL) {
 
            materials[count] = DfPop(DF_MATERIAL, 0);
 
            ++count;
 
        }
 
    } while (r != 0);
 
    DfClose(df);
 
    return count;
 
}
 
 
 
// IDA: br_uint_32 __cdecl WriteMaterial(br_material *mp, br_datafile *df)
 
br_uint_32 WriteMaterial(br_material* mp, br_datafile* df) {
 
    LOG_TRACE("(%p, %p)", mp, df);
 
 
 
    FopWrite_MATERIAL(df, mp);
 
    if (mp->colour_map != NULL) {
 
        FopWrite_PIXELMAP_REF(df, CHUNKID_MATERIAL_COLOUR_MAP, mp->colour_map);
 
    }
 
    if (mp->index_shade != NULL) {
 
        FopWrite_PIXELMAP_REF(df, CHUNKID_MATERIAL_INDEX_SHADE, mp->index_shade);
 
    }
 
    if (mp->index_blend != NULL) {
 
        FopWrite_PIXELMAP_REF(df, CHUNKID_MATERIAL_INDEX_BLEND, mp->index_blend);
 
    }
 
    if (mp->screendoor != NULL) {
 
        FopWrite_PIXELMAP_REF(df, CHUNKID_MATERIAL_SCREENDOOR, mp->screendoor);
 
    }
 
    if (mp->index_fog != NULL) {
 
        FopWrite_PIXELMAP_REF(df, CHUNKID_MATERIAL_INDEX_FOG, mp->index_fog);
 
    }
 
    FopWrite_END(df);
 
    return 0;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrMaterialSaveMany(char *filename, br_material **materials, br_uint_16 num)
 
br_uint_32 BrMaterialSaveMany(char* filename, br_material** materials, br_uint_16 num) {
 
    br_datafile* df;
 
    int i;
 
    int count;
 
    LOG_TRACE("(\"%s\", %p, %d)", filename, materials, num);
 
 
 
    df = DfOpen(filename, 1, BRT_FLOAT);
 
    if (df == NULL) {
 
        return 0;
 
    }
 
#ifdef BRENDER_FIX_BUGS
 
    FopWrite_FILE_INFO(df, FILE_TYPE_MATERIAL);
 
#else
 
    FopWrite_FILE_INFO(df, FILE_TYPE_MATERIAL_OLD);
 
#endif
 
    if (materials == NULL) {
 
        BrMaterialEnum(NULL, (br_material_enum_cbfn*)WriteMaterial, df);
 
        count = BrMaterialCount(NULL);
 
    } else {
 
        for (i = 0; i < num; i++) {
 
            WriteMaterial(materials[i], df);
 
        }
 
        count = num;
 
    }
 
    DfClose(df);
 
    return count;
 
}
 
 
 
// IDA: br_model* __cdecl BrModelLoad(char *filename)
 
br_model* BrModelLoad(char* filename) {
 
    br_model* ptr;
 
    LOG_TRACE("(\"%s\")", filename);
 
 
 
    if (BrModelLoadMany(filename, &ptr, 1) == 1) {
 
        return ptr;
 
    }
 
    return NULL;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrModelSave(char *filename, br_model *ptr)
 
br_uint_32 BrModelSave(char* filename, br_model* ptr) {
 
    LOG_TRACE("(\"%s\", %p)", filename, ptr);
 
 
 
    return BrModelSaveMany(filename, &ptr, 1);
 
}
 
 
 
// IDA: br_material* __cdecl BrMaterialLoad(char *filename)
 
br_material* BrMaterialLoad(char* filename) {
 
    br_material* ptr;
 
 
 
    if (BrMaterialLoadMany(filename, &ptr, 1) == 1) {
 
        return ptr;
 
    }
 
    return NULL;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrMaterialSave(char *filename, br_material *ptr)
 
br_uint_32 BrMaterialSave(char* filename, br_material* ptr) {
 
    LOG_TRACE("(\"%s\", %p)", filename, ptr);
 
 
 
    return BrMaterialSaveMany(filename, &ptr, 1);
 
}
 
 
 
// IDA: br_actor* __cdecl BrActorLoad(char *filename)
 
br_actor* BrActorLoad(char* filename) {
 
    br_actor* ptr;
 
    LOG_TRACE("(\"%s\")", filename);
 
 
 
    if (BrActorLoadMany(filename, &ptr, 1) == 1) {
 
        return ptr;
 
    }
 
    LOG_DEBUG("loadmany fail");
 
    return NULL;
 
}
 
 
 
// IDA: br_uint_32 __cdecl BrActorSave(char *filename, br_actor *ptr)
 
br_uint_32 BrActorSave(char* filename, br_actor* ptr) {
 
    LOG_TRACE("(\"%s\", %p)", filename, ptr);
 
 
 
    return BrActorSaveMany(filename, &ptr, 1);
 
}
 
 
 
// IDA: br_error __cdecl BrModelFileCount(char *filename, br_uint_16 *num)
 
br_error BrModelFileCount(char* filename, br_uint_16* num) {
 
    br_datafile* df;
 
    LOG_TRACE("(\"%s\", %p)", filename, num);
 
 
 
    df = DfOpen(filename, 0, BRT_FLOAT);
 
    if (df == NULL) {
 
        if (num != NULL) {
 
            *num = 0;
 
        }
 
        return 0x1002;
 
    }
 
    if (num == NULL) {
 
        return 0;
 
    }
 
    *num = 0;
 
    while (DfChunksInterpret(df, &ModelLoadTable) != 0) {
 
        if (DfTopType() == DF_MODEL) {
 
            *num = *num + 1;
 
            DfPop(DF_MODEL, NULL);
 
        }
 
    }
 
    DfClose(df);
 
    return 0;
 
}
 
 
 
// IDA: br_error __cdecl BrActorFileCount(char *filename, br_uint_16 *num)
 
br_error BrActorFileCount(char* filename, br_uint_16* num) {
 
    br_datafile* df;
 
    LOG_TRACE("(\"%s\", %p)", filename, num);
 
 
 
    df = DfOpen(filename, 0, BRT_FLOAT);
 
    if (df == NULL) {
 
        if (num != NULL) {
 
            *num = 0;
 
        }
 
        return 0x1002;
 
    }
 
    if (num == NULL) {
 
        return 0;
 
    }
 
    *num = 0;
 
    while (DfChunksInterpret(df, &ActorLoadTable) != 0) {
 
        if (DfTopType() == DF_ACTOR) {
 
            *num = *num + 1;
 
            DfPop(DF_ACTOR, NULL);
 
        }
 
    }
 
    DfClose(df);
 
    return 0;
 
}
 
 
 
// IDA: br_error __cdecl BrMaterialFileCount(char *filename, br_uint_16 *num)
 
br_error BrMaterialFileCount(char* filename, br_uint_16* num) {
 
    br_datafile* df;
 
    LOG_TRACE("(\"%s\", %p)", filename, num);
 
 
 
    df = DfOpen(filename, 0, BRT_FLOAT);
 
    if (df == NULL) {
 
        if (num != NULL) {
 
            *num = 0;
 
        }
 
        return 0x1002;
 
    }
 
    if (num == NULL) {
 
        return 0;
 
    }
 
    *num = 0;
 
    while (DfChunksInterpret(df, &MaterialLoadTable) != 0) {
 
        if (DfTopType() == DF_MATERIAL) {
 
            *num = *num + 1;
 
            DfPop(DF_MATERIAL, NULL);
 
        }
 
    }
 
    DfClose(df);
 
    return 0;
 
}