oh yeah mr crabs
[carveJwlIkooP6JGAAIwe30JlM.git] / player_model.h
index f2b375aa19988ba7391f5042cb67880ae8aa1ddf..4766c1695951653828931bc91c1a39fcc3478d96 100644 (file)
@@ -30,7 +30,7 @@ static void player_model_free(void *_)
 /*
  * Load model from file (.mdl)
  */
-static void player_load_model( const char *name )
+static void player_load_model( const char *name, int replace_mode )
 {
    char buf[64];
 
@@ -43,82 +43,87 @@ static void player_load_model( const char *name )
       return;
    }
 
-   struct player_model temp;
-
-   mdl_unpack_glmesh( src, &temp.mesh );
-   skeleton_setup( &temp.sk, src );
+   mesh_free( &player.mdl.mesh );
+   mdl_unpack_glmesh( src, &player.mdl.mesh );
 
-   /* 
-    * Link animations
-    */
-   struct _load_anim
+   if( !replace_mode )
    {
-      const char *name;
-      struct skeleton_anim **anim;
-   }
-   anims[] = {
-      { "pose_stand",   &temp.anim_stand },
-      { "pose_highg",   &temp.anim_highg },
-      { "pose_slide",   &temp.anim_slide },
-      { "pose_air",     &temp.anim_air   },
-      { "push",         &temp.anim_push  },
-      { "push_reverse", &temp.anim_push_reverse },
-      { "ollie",        &temp.anim_ollie },
-      { "ollie_reverse",&temp.anim_ollie_reverse },
-      { "grabs",        &temp.anim_grabs },
-      { "walk",         &temp.anim_walk  },
-      { "run",          &temp.anim_run   },
-      { "idle_cycle",   &temp.anim_idle  },
-      { "jump",         &temp.anim_jump  }
-   };
-   
-   for( int i=0; i<vg_list_size(anims); i++ )
-   {
-      *anims[i].anim = skeleton_get_anim( &temp.sk, anims[i].name );
-      
-      if( !(*anims[i].anim) )
+      if( !skeleton_setup( &player.mdl.sk, src ) )
       {
-         vg_error( "Animation '%s' is missing from character '%s'\n",
-                     anims[i].name, name );
-         vg_free( src );
-         return;
+         vg_error( "Model: %s\n", buf );
+         vg_fatal_exit_loop( "No skeleton" );
       }
-   }
 
-   /* 
-    * Link bones
-    */
-   struct _load_bone
-   {
-      const char *name;
-      u32 *bone_id;
-   }
-   bones[] = {
-      { "hips",      &temp.id_hip },
-      { "hand.IK.L", &temp.id_ik_hand_l },
-      { "hand.IK.R", &temp.id_ik_hand_r },
-      { "elbow.L",   &temp.id_ik_elbow_l },
-      { "elbow.R",   &temp.id_ik_elbow_r },
-      { "head",      &temp.id_head }
-   };
-
-   for( int i=0; i<vg_list_size(bones); i++ )
-   {
-      *bones[i].bone_id = skeleton_bone_id( &temp.sk, bones[i].name );
+      /* 
+       * Link animations
+       */
+      struct _load_anim
+      {
+         const char *name;
+         struct skeleton_anim **anim;
+      }
+      anims[] = {
+         { "pose_stand",   &player.mdl.anim_stand },
+         { "pose_highg",   &player.mdl.anim_highg },
+         { "pose_slide",   &player.mdl.anim_slide },
+         { "pose_air",     &player.mdl.anim_air   },
+         { "push",         &player.mdl.anim_push  },
+         { "push_reverse", &player.mdl.anim_push_reverse },
+         { "ollie",        &player.mdl.anim_ollie },
+         { "ollie_reverse",&player.mdl.anim_ollie_reverse },
+         { "grabs",        &player.mdl.anim_grabs },
+         { "walk",         &player.mdl.anim_walk  },
+         { "run",          &player.mdl.anim_run   },
+         { "idle_cycle",   &player.mdl.anim_idle  },
+         { "jump",         &player.mdl.anim_jump  }
+      };
+      
+      for( int i=0; i<vg_list_size(anims); i++ )
+      {
+         *anims[i].anim = skeleton_get_anim( &player.mdl.sk, anims[i].name );
+         
+         if( !(*anims[i].anim) )
+         {
+            vg_error( "Animation '%s' is missing from character '%s'\n",
+                        anims[i].name, name );
+            vg_free( src );
+            return;
+         }
+      }
 
-      if( !(*bones[i].bone_id) )
+      /* 
+       * Link bones
+       */
+      struct _load_bone
       {
-         vg_error( "Required bone '%s' is missing from character '%s'\n",
-                     bones[i].name, name );
-         vg_free( src );
-         return;
+         const char *name;
+         u32 *bone_id;
       }
+      bones[] = {
+         { "hips",      &player.mdl.id_hip },
+         { "hand.IK.L", &player.mdl.id_ik_hand_l },
+         { "hand.IK.R", &player.mdl.id_ik_hand_r },
+         { "elbow.L",   &player.mdl.id_ik_elbow_l },
+         { "elbow.R",   &player.mdl.id_ik_elbow_r },
+         { "head",      &player.mdl.id_head }
+      };
+
+      for( int i=0; i<vg_list_size(bones); i++ )
+      {
+         *bones[i].bone_id = skeleton_bone_id( &player.mdl.sk, bones[i].name );
+
+         if( !(*bones[i].bone_id) )
+         {
+            vg_error( "Required bone '%s' is missing from character '%s'\n",
+                        bones[i].name, name );
+            vg_free( src );
+            return;
+         }
+      }
+
+      player_init_ragdoll( src );
    }
 
-   /* swap temp into actual model */
-   mesh_free( &player.mdl.mesh );
-   player.mdl = temp;
-   player_init_ragdoll( src );
    vg_free( src );
 }