#define MDL_SUBMESH_MAX 8000
#define MDL_STRING_LENGTH_MAX 64
+enum classtype
+{
+ k_classtype_none = 0,
+ k_classtype_gate = 1,
+ k_classtype_block = 2,
+ k_classtype_spawn = 3,
+ k_classtype_water = 4,
+ k_classtype_car_path = 5,
+ k_classtype_instance = 6,
+ k_classtype_capsule = 7,
+ k_classtype_route_node = 8,
+ k_classtype_route = 9,
+ k_classtype_bone = 10,
+ k_classtype_skeleton = 11,
+ k_classtype_skin = 12
+};
+
+
#pragma pack(push,1)
struct mdl_vert
{
GLuint vao, vbo, ebo;
u32 indice_count;
+ u32 loaded;
};
static void mesh_upload( glmesh *mesh,
- mdl_vert *verts, u32 vert_count,
- u32 *indices, u32 indice_count )
+ mdl_vert *verts, u32 vert_count,
+ u32 *indices, u32 indice_count )
{
+ //assert( mesh->loaded == 0 );
+
glGenVertexArrays( 1, &mesh->vao );
glGenBuffers( 1, &mesh->vbo );
glGenBuffers( 1, &mesh->ebo );
stride, (void *)offsetof(mdl_vert, groups) );
glEnableVertexAttribArray( 5 );
-
- VG_CHECK_GL();
+ VG_CHECK_GL_ERR();
+
mesh->indice_count = indice_count;
+ mesh->loaded = 1;
}
static void mesh_bind( glmesh *mesh )
static void mesh_free( glmesh *mesh )
{
- glDeleteVertexArrays( 1, &mesh->vao );
- glDeleteBuffers( 1, &mesh->ebo );
- glDeleteBuffers( 1, &mesh->vbo );
+ if( mesh->loaded )
+ {
+ glDeleteVertexArrays( 1, &mesh->vao );
+ glDeleteBuffers( 1, &mesh->ebo );
+ glDeleteBuffers( 1, &mesh->vbo );
+ }
}
if( size < sizeof(mdl_header) )
{
- free( header );
+ vg_free( header );
vg_error( "Invalid file '%s' (too small for header)\n", path );
return NULL;
}
vg_error( "Invalid file '%s'"
"(wrong .file_length, %ub != real file size %ub)\n",
path, header->file_length, size );
- free( header );
+ vg_free( header );
return NULL;
}
if( ri->count > ri->max_count )
{
- free( header );
+ vg_free( header );
vg_error( "'%s': '%s' buffer exceeds the maximum (%u/%u)\n",
path, ri->desc, ri->count, ri->max_count );
return NULL;
if( ri->offset >= header->file_length )
{
- free( header );
+ vg_free( header );
vg_error( "'%s': '%s' buffer offset is out of range\n",
path, ri->desc );
return NULL;
if( ri->offset + ri->size*ri->count > header->file_length )
{
- free( header );
+ vg_free( header );
vg_error( "'%s': '%s' buffer size is out of range\n",
path, ri->desc );
return NULL;
if( ri->offset >= rj->offset &&
(ri->offset+ri->size*ri->count < rj->offset+rj->size*rj->count))
{
- free( header );
+ vg_free( header );
vg_error( "'%s': '%s' buffer overlaps '%s'\n",
path, ri->desc, rj->desc );
return NULL;