nonlocal stuff again
[carveJwlIkooP6JGAAIwe30JlM.git] / model.h
diff --git a/model.h b/model.h
index c92960f04569b11ea2b8e5a6b62776c07e8f59dd..05790c655d204ed18668b8e1b101c4f03cba2989 100644 (file)
--- a/model.h
+++ b/model.h
@@ -22,7 +22,8 @@ enum mdl_surface_prop
    k_surface_prop_concrete          = 0,
    k_surface_prop_wood              = 1,
    k_surface_prop_grass             = 2,
-   k_surface_prop_tiles             = 3
+   k_surface_prop_tiles             = 3,
+   k_surface_prop_metal             = 4
 };
 
 enum material_flag
@@ -208,10 +209,12 @@ struct mdl_context
 
    /* mesh buffers */
    verts,
-   indices,
+   indices;
+
+   u32 pack_base_offset;
    
    /* pack data */
-   pack;
+   //pack;
 };
 
 
@@ -226,6 +229,26 @@ VG_STATIC void mdl_load_fatal_corrupt( mdl_context *mdl )
  * Model implementation
  */
 
+VG_STATIC u32 mdl_query_array_size( mdl_array *arr )
+{
+   if( arr->item_count ){
+      u32 size = arr->item_size*arr->item_count;
+      return vg_align8(size);
+   }
+   else
+      return 0;
+}
+
+VG_STATIC 
+void mdl_fread_pack_file( mdl_context *mdl, mdl_file *info, void *dst )
+{
+   fseek( mdl->file, mdl->pack_base_offset+info->pack_offset, SEEK_SET );
+   u64 l = fread( dst, info->pack_size, 1, mdl->file );
+
+   if( l != 1 )
+      mdl_load_fatal_corrupt( mdl );
+}
+
 VG_STATIC void mdl_load_array_file( mdl_context *mdl, mdl_array_ptr *ptr,
                                     mdl_array *arr, void *lin_alloc )
 {
@@ -256,22 +279,34 @@ VG_STATIC u32 mdl_arrcount( mdl_array_ptr *arr )
    return arr->count;
 }
 
-VG_STATIC int mdl_load_array( mdl_context *mdl, mdl_array_ptr *ptr,
-                              const char *name, void *lin_alloc )
+VG_STATIC mdl_array *mdl_find_array( mdl_context *mdl, const char *name )
 {
    for( u32 i=0; i<mdl_arrcount(&mdl->index); i++ ){
       mdl_array *arr = mdl_arritm( &mdl->index, i );
       
       if( !strncmp(arr->name,name,16) ){
-         mdl_load_array_file( mdl, ptr, arr, lin_alloc );
-         return 1;
+         return arr;
       }
    }
 
-   ptr->data = NULL;
-   ptr->count = 0;
-   ptr->stride = 0;
-   return 0;
+   return NULL;
+}
+
+VG_STATIC int mdl_load_array( mdl_context *mdl, mdl_array_ptr *ptr,
+                              const char *name, void *lin_alloc )
+{
+   mdl_array *arr = mdl_find_array( mdl, name );
+
+   if( arr ){
+      mdl_load_array_file( mdl, ptr, arr, lin_alloc );
+      return 1;
+   }
+   else{
+      ptr->data = NULL;
+      ptr->count = 0;
+      ptr->stride = 0;
+      return 0;
+   }
 }
 
 VG_STATIC int mdl_load_mesh_block( mdl_context *mdl, void *lin_alloc )
@@ -305,10 +340,12 @@ VG_STATIC int mdl_load_animation_block( mdl_context *mdl, void *lin_alloc )
    return mdl_load_array( mdl, &mdl->keyframes, "mdl_keyframe", lin_alloc );
 }
 
+#if 0
 VG_STATIC int mdl_load_pack_block( mdl_context *mdl, void *lin_alloc )
 {
    return mdl_load_array( mdl, &mdl->pack, "pack", lin_alloc );
 }
+#endif
 
 /*
  * if calling mdl_open, and the file does not exist, the game will fatal quit
@@ -328,6 +365,10 @@ VG_STATIC void mdl_open( mdl_context *mdl, const char *path, void *lin_alloc )
       mdl_load_fatal_corrupt( mdl );
 
    mdl_load_array_file( mdl, &mdl->index, &mdl->info.index, lin_alloc );
+
+   mdl_array *pack = mdl_find_array( mdl, "pack" );
+   if( pack ) mdl->pack_base_offset = pack->file_offset;
+   else mdl->pack_base_offset = 0;
 }
 
 /*