more refactors..
authorhgn <hgodden00@gmail.com>
Wed, 14 Jun 2023 15:33:02 +0000 (16:33 +0100)
committerhgn <hgodden00@gmail.com>
Wed, 14 Jun 2023 15:33:02 +0000 (16:33 +0100)
22 files changed:
addon.c
addon.h
addon_cache.c [deleted file]
addon_cache.h [deleted file]
build.c
ent_skateshop.c
model.h
models_src/ch_jordan.mdl [deleted file]
models_src/ch_outlaw.mdl [deleted file]
player.c
player.h
player_common.c
player_render.c
player_render.h
playermodels_src/skaterift_jordan/addon.inf [new file with mode: 0644]
playermodels_src/skaterift_jordan/ch_jordan.mdl [new file with mode: 0644]
playermodels_src/skaterift_new/addon.inf [new file with mode: 0644]
playermodels_src/skaterift_new/ch_new.mdl [new file with mode: 0644]
playermodels_src/skaterift_outlaw/addon.inf [new file with mode: 0644]
playermodels_src/skaterift_outlaw/ch_outlaw.mdl [new file with mode: 0644]
skaterift.c
skaterift.h

diff --git a/addon.c b/addon.c
index fe6693f89adf847a9f4bfad27c057d660eef7337..d408654100b3d5c5a8a0d66c7e7a45993c59fe08 100644 (file)
--- a/addon.c
+++ b/addon.c
@@ -7,8 +7,6 @@
 #include "workshop_types.h"
 #include "workshop.h"
 
-#include "addon_cache.c"
-
 static u32 addon_count( enum workshop_file_type type ){
    return addon_system.registry_type_counts[ type ];
 }
@@ -170,6 +168,7 @@ VG_STATIC void addon_print_info( addon_reg *reg ){
 }
 
 VG_STATIC void addon_mount_finish( addon_reg *reg ){
+   addon_print_info( reg );
    addon_system.registry_count ++;
 }
 
diff --git a/addon.h b/addon.h
index 85b5014bf7c9d7e036a837cd6f6067d464d536e5..7db6588515526217f779ba8e8b7cdbfcc59af58b 100644 (file)
--- a/addon.h
+++ b/addon.h
@@ -4,7 +4,7 @@
 #include "common.h"
 #include "vg/vg_steam_ugc.h"
 #include "workshop_types.h"
-#include "addon_cache.h"
+#include "vg/vg_mem_pool.h"
 
 #include "world.h"
 #include "player.h"
@@ -56,10 +56,20 @@ struct {
       u32 reg_index;
       addon_reg *reg_ptr;
 
-      addon_cache_node cachenode;
+      vg_pool_node cachenode;
    }
    *boards;
-   addon_cache board_cache;
+   vg_pool board_cache;
+
+   struct cache_playermodel{
+      enum cache_board_state state;
+      struct player_model model;
+      u32 reg_index;
+      addon_reg *reg_ptr;
+      vg_pool_node cachenode;
+   }
+   *playermodels;
+   vg_pool playermodel_cache;
 
    SDL_SpinLock sl_cache;
 }
diff --git a/addon_cache.c b/addon_cache.c
deleted file mode 100644 (file)
index 1dd4ecd..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-#ifndef ADDON_CACHE_C
-#define ADDON_CACHE_C
-
-#include "addon_cache.h"
-
-static addon_cache_node *addon_cache_nodeptr( addon_cache *cache, void *item ){
-   if( !item ) return NULL;
-   else return item + cache->offset;
-}
-
-static void *addon_cache_item( addon_cache *cache, u16 index ){
-   if( index == ADDON_CACHE_NIL ) return NULL;
-   else return cache->buffer + cache->stride*(size_t)index;
-}
-
-static void addon_cache_init( addon_cache *cache ){
-   cache->head = 0;
-   cache->tail = cache->count -1;
-   for( i32 ib=0; ib < cache->count; ib++ ){
-      void *vb = addon_cache_item( cache, ib );
-      addon_cache_node *nb = addon_cache_nodeptr( cache, vb );
-
-      i32 ia = ib-1, ic = ib+1;
-      nb->l = ia>=0?           ia: ADDON_CACHE_NIL,
-      nb->r = ic<cache->count? ic: ADDON_CACHE_NIL;
-      nb->ref_count = 0;
-   }
-}
-
-static u16 addon_item_index( addon_cache *cache, void *item ){
-   return (item - cache->buffer) / cache->stride;
-}
-
-static void *addon_cache_lru( addon_cache *cache ){
-   u16 head = cache->head;
-   if( head == ADDON_CACHE_NIL ) return NULL;
-
-   void *item = addon_cache_item( cache, head );
-   addon_cache_node *node = addon_cache_nodeptr( cache, item );
-
-   if( cache->head == cache->tail ) cache->tail = ADDON_CACHE_NIL;
-   cache->head = node->r;
-
-   node->l = ADDON_CACHE_NIL;
-   node->r = ADDON_CACHE_NIL;
-   return item;
-}
-
-static void addon_cache_watch( addon_cache *cache, void *item ){
-   addon_cache_node *node = addon_cache_nodeptr( cache, item );
-
-   if( node->ref_count >= 32 )
-      vg_fatal_error( "dynamic board watch missmatch (limit is 32)\n" );
-
-   node->ref_count ++;
-}
-
-/* if after this no more watches, places back into the volatile list */
-static void addon_cache_unwatch( addon_cache *cache, void *item ){ 
-   addon_cache_node *node = addon_cache_nodeptr( cache, item );
-
-   if( node->ref_count == 0 )
-      vg_fatal_error( "dynamic board unwatch missmatch (no watchers)\n" );
-
-   node->ref_count --;
-   if( !node->ref_count ){
-      void *item_head = addon_cache_item( cache, cache->head ),
-           *item_tail = addon_cache_item( cache, cache->tail );
-      addon_cache_node *head = addon_cache_nodeptr( cache, item_head ),
-                       *tail = addon_cache_nodeptr( cache, item_tail );
-      
-      u16 index = addon_item_index( cache, item );
-      if( tail ) tail->r = index;
-      node->l = cache->tail;
-      cache->tail = index;
-      if( !head ) cache->head = index;
-   }
-}
-
-#endif /* ADDON_CACHE_C */
diff --git a/addon_cache.h b/addon_cache.h
deleted file mode 100644 (file)
index 02df822..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-#ifndef ADDON_CACHE_H
-#define ADDON_CACHE_H
-
-/* cache for loaded addons */
-#define ADDON_CACHE_NIL 0xffff
-
-typedef struct addon_cache addon_cache;
-typedef struct addon_cache_node addon_cache_node;
-
-/* this goes in your structures */
-struct addon_cache_node {
-   u16 l, r, ref_count;
-};
-
-struct addon_cache {
-   void *buffer;           /* array which holds the real data */
-   u16 count, head, tail;
-   size_t stride, offset;
-};
-
-static addon_cache_node *addon_cache_nodeptr( addon_cache *cache, void *item );
-static void *addon_cache_item( addon_cache *cache, u16 index );
-static void addon_cache_init( addon_cache *cache );
-static u16 addon_item_index( addon_cache *cache, void *item );
-static void *addon_cache_lru( addon_cache *cache );
-static void addon_cache_watch( addon_cache *cache, void *item );
-static void addon_cache_unwatch( addon_cache *cache, void *item );
-
-#endif /* ADDON_CACHE_H */
diff --git a/build.c b/build.c
index 3b82a01eaa4d9e669f9b3bb66f952db28fa20aba..b3a4352318c87c09496d8bc54cd8481dd58abfb5 100644 (file)
--- a/build.c
+++ b/build.c
@@ -42,6 +42,21 @@ void write_msg( vg_msg *msg, const char *path ){
    vg_success( "Written %s (%ub)\n", path, msg->cur );
 }
 
+void write_generic_addon_inf( u32 type, const char *title,
+                              const char *content, const char *dest ){
+   u8 descriptor_buf[ 512 ];
+   vg_msg descriptor = {0};
+   descriptor.buf = descriptor_buf;
+   descriptor.max = sizeof(descriptor_buf);
+   vg_msg_frame( &descriptor, "workshop" );
+      vg_msg_wkvstr( &descriptor, "title", title );
+      vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
+      vg_msg_wkvu32( &descriptor, "type", type );
+   vg_msg_end_frame( &descriptor );
+   vg_msg_wkvstr( &descriptor, "content", content );
+   write_msg( &descriptor, dest );
+}
+
 void build_shaders(void);
 void build_game( enum compiler compiler )
 {
@@ -64,87 +79,38 @@ void build_game( enum compiler compiler )
    vg_build_symbolic_link( "boards_src", "boards" );
    vg_build_symbolic_link( "maps_src", "maps" );
    vg_build_symbolic_link( "sound_src", "sound" );
+   vg_build_symbolic_link( "playermodels_src", "playermodels" );
    vg_build_syscall( "mkdir -p %s/cfg", vg_compiler.build_dir );
 
-   u8 descriptor_buf[ 512 ];
-
-   {
-   vg_msg descriptor = {0};
-   descriptor.buf = descriptor_buf;
-   descriptor.max = sizeof(descriptor_buf);
-   vg_msg_frame( &descriptor, "workshop" );
-      vg_msg_wkvstr( &descriptor, "title", "Longboard" );
-      vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
-      vg_msg_wkvu32( &descriptor, "type", k_workshop_file_type_board );
-   vg_msg_end_frame( &descriptor );
-   vg_msg_wkvstr( &descriptor, "content", "board.mdl" );
-   write_msg( &descriptor, "boards_src/skaterift_long/addon.inf" );
-   }
-
-   {
-   vg_msg descriptor = {0};
-   descriptor.buf = descriptor_buf;
-   descriptor.max = sizeof(descriptor_buf);
-   vg_msg_frame( &descriptor, "workshop" );
-      vg_msg_wkvstr( &descriptor, "title", "Fractal" );
-      vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
-      vg_msg_wkvu32( &descriptor, "type", k_workshop_file_type_board );
-   vg_msg_end_frame( &descriptor );
-   vg_msg_wkvstr( &descriptor, "content", "board.mdl" );
-   write_msg( &descriptor, "boards_src/skaterift_fract/addon.inf" );
-   }
 
-   {
-   vg_msg descriptor = {0};
-   descriptor.buf = descriptor_buf;
-   descriptor.max = sizeof(descriptor_buf);
-   vg_msg_frame( &descriptor, "workshop" );
-      vg_msg_wkvstr( &descriptor, "title", "Striped" );
-      vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
-      vg_msg_wkvu32( &descriptor, "type", k_workshop_file_type_board );
-   vg_msg_end_frame( &descriptor );
-   vg_msg_wkvstr( &descriptor, "content", "board.mdl" );
-   write_msg( &descriptor, "boards_src/skaterift_striped/addon.inf" );
-   }
-
-   {
-   vg_msg descriptor = {0};
-   descriptor.buf = descriptor_buf;
-   descriptor.max = sizeof(descriptor_buf);
-   vg_msg_frame( &descriptor, "workshop" );
-      vg_msg_wkvstr( &descriptor, "title", "Licco" );
-      vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
-      vg_msg_wkvu32( &descriptor, "type", k_workshop_file_type_board);
-   vg_msg_end_frame( &descriptor );
-   vg_msg_wkvstr( &descriptor, "content", "board.mdl" );
-   write_msg( &descriptor, "boards_src/skaterift_licco/addon.inf" );
-   }
-
-   {
-   vg_msg descriptor = {0};
-   descriptor.buf = descriptor_buf;
-   descriptor.max = sizeof(descriptor_buf);
-   vg_msg_frame( &descriptor, "workshop" );
-      vg_msg_wkvstr( &descriptor, "title", "Hypno" );
-      vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
-      vg_msg_wkvu32( &descriptor, "type", k_workshop_file_type_board );
-   vg_msg_end_frame( &descriptor );
-   vg_msg_wkvstr( &descriptor, "content", "board.mdl" );
-   write_msg( &descriptor, "boards_src/skaterift_spiral/addon.inf" );
-   }
-
-   {
-   vg_msg descriptor = {0};
-   descriptor.buf = descriptor_buf;
-   descriptor.max = sizeof(descriptor_buf);
-   vg_msg_frame( &descriptor, "workshop" );
-      vg_msg_wkvstr( &descriptor, "title", "Shark" );
-      vg_msg_wkvstr( &descriptor, "author", "Skaterift" );
-      vg_msg_wkvu32( &descriptor, "type", k_workshop_file_type_board );
-   vg_msg_end_frame( &descriptor );
-   vg_msg_wkvstr( &descriptor, "content", "board.mdl" );
-   write_msg( &descriptor, "boards_src/skaterift_shark/addon.inf" );
-   }
+   write_generic_addon_inf( k_workshop_file_type_board, 
+                            "Longboard", "board.mdl", 
+                            "boards_src/skaterift_long/addon.inf");
+   write_generic_addon_inf( k_workshop_file_type_board, 
+                            "Fractal", "board.mdl", 
+                            "boards_src/skaterift_fract/addon.inf");
+   write_generic_addon_inf( k_workshop_file_type_board,
+                            "Striped", "board.mdl",
+                            "boards_src/skaterift_striped/addon.inf");
+   write_generic_addon_inf( k_workshop_file_type_board,
+                            "Licco", "board.mdl",
+                            "boards_src/skaterift_licco/addon.inf");
+   write_generic_addon_inf( k_workshop_file_type_board,
+                            "Hypno", "board.mdl",
+                            "boards_src/skaterift_spiral/addon.inf");
+   write_generic_addon_inf( k_workshop_file_type_board,
+                            "Shark", "board.mdl",
+                            "boards_src/skaterift_shark/addon.inf");
+
+   write_generic_addon_inf( k_workshop_file_type_player,
+                            "De'folde", "ch_new.mdl",
+                            "playermodels_src/skaterift_new/addon.inf" );
+   write_generic_addon_inf( k_workshop_file_type_player,
+                            "Jordan", "ch_jordan.mdl",
+                            "playermodels_src/skaterift_jordan/addon.inf" );
+   write_generic_addon_inf( k_workshop_file_type_player,
+                            "Outlaw", "ch_outlaw.mdl",
+                            "playermodels_src/skaterift_outlaw/addon.inf" );
 
    vg_build();
    compiled_something = 1;
index fbab58833d7dc542bbb18e6cada266bdb2e52f32..9bee505bc1412c124330ca33a9830d673f03b4ef 100644 (file)
@@ -45,7 +45,7 @@ VG_STATIC struct cache_board *skateshop_cache_fetch_board( u32 registry_index )
 
    SDL_AtomicLock( &addon_system.sl_cache );
    struct cache_board *min_board = 
-      addon_cache_lru( &addon_system.board_cache );
+      vg_pool_lru( &addon_system.board_cache );
 
    if( min_board ){
       if( min_board->state == k_cache_board_state_loaded ){
@@ -81,13 +81,13 @@ VG_STATIC void skateshop_update_viewpage(void)
       struct shop_view_slot *slot = &global_skateshop.shop_view_slots[i];
       u32 request_id = page*SKATESHOP_VIEW_SLOT_MAX + i;
       
-      addon_cache *cache = &addon_system.board_cache;
+      vg_pool *cache = &addon_system.board_cache;
       if( slot->cache_ptr ) 
-         addon_cache_unwatch( cache, slot->cache_ptr );
+         vg_pool_unwatch( cache, slot->cache_ptr );
 
       slot->cache_ptr = skateshop_cache_fetch_board( request_id );
       if( slot->cache_ptr ) 
-         addon_cache_watch( cache, slot->cache_ptr );
+         vg_pool_watch( cache, slot->cache_ptr );
    }
 }
 
@@ -241,12 +241,12 @@ VG_STATIC void skateshop_init(void){
       board->reg_index = 0xffffffff;
    }
 
-   addon_cache *cache = &addon_system.board_cache;
+   vg_pool *cache = &addon_system.board_cache;
    cache->buffer = addon_system.boards;
    cache->count = CACHE_BOARD_MAX;
    cache->stride = sizeof( struct cache_board );
    cache->offset = offsetof( struct cache_board, cachenode );
-   addon_cache_init( cache );
+   vg_pool_init( cache );
 }
 
 VG_STATIC struct cache_board *skateshop_selected_cache_if_loaded(void)
@@ -423,12 +423,12 @@ VG_STATIC void global_skateshop_preupdate(void)
                      global_skateshop.selected_board_id );
 
          if( localplayer.board_view_slot ){
-            addon_cache_unwatch( &addon_system.board_cache,
+            vg_pool_unwatch( &addon_system.board_cache,
                                  localplayer.board_view_slot );
          }
 
          localplayer.board_view_slot = selected_cache;
-         addon_cache_watch( &addon_system.board_cache,
+         vg_pool_watch( &addon_system.board_cache,
                              localplayer.board_view_slot );
          global_skateshop_exit();
          skaterift_write_savedata();
diff --git a/model.h b/model.h
index 686a42849b5e6cdf630ac5d448d0a2e247e1b6e4..fc71a4f1413c4a6e0938e7408c94eae54da31ea5 100644 (file)
--- a/model.h
+++ b/model.h
@@ -1,11 +1,11 @@
 /*
- * Copyright (C) 2021-2022 Mt.ZERO Software, Harry Godden - All Rights Reserved
+ * Copyright (C) 2021-2023 Mt.ZERO Software, Harry Godden - All Rights Reserved
  */
 
 #ifndef MODEL_H
 #define MODEL_H
 
-#include "common.h"
+#include "skaterift.h"
 
 #define MDL_VERSION_NR 101
 
@@ -72,6 +72,14 @@ typedef struct mdl_texture mdl_texture;
 typedef struct mdl_array mdl_array;
 typedef struct mdl_header mdl_header;
 
+typedef struct glmesh glmesh;
+struct glmesh
+{
+   GLuint vao, vbo, ebo;
+   u32 indice_count;
+   u32 loaded;
+};
+
 struct mdl_transform
 {
    v3f co, s;
@@ -222,13 +230,11 @@ struct mdl_header
    mdl_array index;
 };
 
-struct mdl_context
-{
+struct mdl_context{
    FILE *file;
    mdl_header info;
 
-   struct mdl_array_ptr
-   {
+   struct mdl_array_ptr{
       void *data;
       u32 count, stride;
    }
@@ -250,11 +256,10 @@ struct mdl_context
    /* mesh buffers */
    verts,
    indices;
-
    u32 pack_base_offset;
-   
-   /* pack data */
-   //pack;
+
+   /* runtime */
+   glmesh mesh;
 };
 
 
@@ -468,14 +473,6 @@ mdl_pstreq( mdl_context *mdl, u32 pstr, const char *str, u32 djb2 )
  * ----------------------------------------------------------------------------
  */
 
-typedef struct glmesh glmesh;
-struct glmesh
-{
-   GLuint vao, vbo, ebo;
-   u32 indice_count;
-   u32 loaded;
-};
-
 VG_STATIC void mesh_upload( glmesh *mesh,
                             mdl_vert *verts, u32 vert_count,
                             u32 *indices, u32 indice_count )
@@ -587,11 +584,11 @@ struct payload_glmesh_load{
 VG_STATIC void async_mdl_load_glmesh( void *payload, u32 size )
 {
    struct payload_glmesh_load *job = payload;
-
    mesh_upload( job->mesh, job->verts, job->vertex_count,
                            job->indices, job->indice_count );
 }
 
+/* TODO: Find out if this needs deprecating in favour of the new full loader */
 VG_STATIC void mdl_async_load_glmesh( mdl_context *mdl, glmesh *mesh )
 {
    mdl_array *arr_vertices = mdl_find_array( mdl, "mdl_vert" );
@@ -648,5 +645,21 @@ VG_STATIC void mdl_async_load_glmesh( mdl_context *mdl, glmesh *mesh )
       vg_fatal_error( "no vertex/indice data\n" );
    }
 }
+
+/* uploads the glmesh, and textures. everything is saved into the mdl_context */
+VG_STATIC void mdl_async_full_load_std( mdl_context *mdl ){
+   mdl_async_load_glmesh( mdl, &mdl->mesh );
+   
+   for( u32 i=0; i<mdl_arrcount( &mdl->textures ); i ++ ){
+      vg_linear_clear( vg_mem.scratch );
+      mdl_texture *tex = mdl_arritm( &mdl->textures, i );
+
+      void *data = vg_linear_alloc( vg_mem.scratch, tex->file.pack_size );
+      mdl_fread_pack_file( mdl, &tex->file, data );
+
+      vg_tex2d_load_qoi_async( data, tex->file.pack_size,
+                               VG_TEX2D_CLAMP|VG_TEX2D_NEAREST, &tex->glname );
+   }
+}
  
 #endif
diff --git a/models_src/ch_jordan.mdl b/models_src/ch_jordan.mdl
deleted file mode 100644 (file)
index 67eea24..0000000
Binary files a/models_src/ch_jordan.mdl and /dev/null differ
diff --git a/models_src/ch_outlaw.mdl b/models_src/ch_outlaw.mdl
deleted file mode 100644 (file)
index 8bc115e..0000000
Binary files a/models_src/ch_outlaw.mdl and /dev/null differ
index 12d30e926dff0ae56be0571ef6e93f992056716b..a5eaa0849f95f347b4e916b9819190cf72055eb2 100644 (file)
--- a/player.c
+++ b/player.c
@@ -97,11 +97,13 @@ void player__use_avatar( player_instance *player, struct player_avatar *av )
    player_setup_ragdoll_from_avatar( &player->ragdoll, av );
 }
 
+#if 0
 PLAYER_API
 void player__use_model( player_instance *player, struct player_model *mdl )
 {
    player->playermodel = mdl;
 }
+#endif
 
 PLAYER_API
 void player__bind( player_instance *player )
index 1881705fbb46c9e27510c5d51f01d03fae7e8e3b..8db02de0f54568b3f40a3ad056e3b1fcb3fe5acf 100644 (file)
--- a/player.h
+++ b/player.h
@@ -74,10 +74,11 @@ struct player_instance
     */
 
    struct player_avatar  *playeravatar;
-   struct player_model   *playermodel;
    struct player_ragdoll  ragdoll;
+   //struct player_model   *playermodel;
    //struct player_board   *board;
-   struct cache_board  *board_view_slot;
+   struct cache_board       *board_view_slot;
+   struct cache_playermodel *playermodel_view_slot;
 
    player_pose            holdout_pose;
    float                  holdout_time;
index 760792acc696fc60f89f9dc5d34ddf0e2a65d045..df219ef5423fe54fa8a8ecf13c647d3029dbc0f1 100644 (file)
@@ -306,18 +306,26 @@ VG_STATIC void player_look( player_instance *player, v3f angles )
    angles[1] = vg_clampf( angles[1], -VG_PIf*0.5f, VG_PIf*0.5f );
 }
 
-struct player_board *player_get_player_board( struct player_instance *player )
-{
-   struct player_board *board = NULL;
-
+struct player_board *player_get_player_board( struct player_instance *player ){
    if( localplayer.board_view_slot ){
       struct cache_board *cache_view = localplayer.board_view_slot;
       if( cache_view->state == k_cache_board_state_loaded ){
-         board = &cache_view->board;
+         return &cache_view->board;
+      }
+   }
+
+   return NULL;
+}
+
+struct player_model *player_get_player_model( struct player_instance *player ){
+   if( localplayer.playermodel_view_slot ){
+      struct cache_playermodel *cache_view = localplayer.playermodel_view_slot;
+      if( cache_view->state == k_cache_board_state_loaded ){
+         return &cache_view->model;
       }
    }
 
-   return board;
+   return NULL;
 }
 
 #endif /* PLAYER_COMMON_C */
index 011d0415edacf62857cb81e9b83a767005c951d5..20d9a706262e1b11e9515e95c155174e6f9e53d3 100644 (file)
@@ -63,8 +63,7 @@ VG_STATIC void player_model_load( struct player_model *mdl, const char *path )
 }
 
 /* TODO: allow error handling */
-VG_STATIC void player_board_load( struct player_board *mdl, const char *path )
-{
+VG_STATIC void player_board_load( struct player_board *mdl, const char *path ){
    vg_linear_clear( vg_mem.scratch );
 
    mdl_context ctx;
@@ -88,6 +87,7 @@ VG_STATIC void player_board_load( struct player_board *mdl, const char *path )
    mdl_async_load_glmesh( &ctx, &mdl->mesh );
    mdl_close( &ctx );
 
+   /* TODO: you get put into a new section, the above is standard mdl loads. */
    for( int i=0; i<4; i++ )
       mdl->wheels[i].indice_count = 0;
    for( int i=0; i<2; i++ )
@@ -300,6 +300,7 @@ VG_STATIC void render_board( camera *cam, world_instance *world,
       shader_model_board_view_uCamera( cam->transform[3] );
       shader_model_board_view_uPv( cam->mtx.pv );
       shader_model_board_view_uTexSceneDepth( 1 );
+      render_fb_bind_texture( gpipeline.fb_main, 2, 1 );
 
       render_fb_inverse_ratio( gpipeline.fb_main, inverse );
 
@@ -399,12 +400,15 @@ VG_STATIC void render_board( camera *cam, world_instance *world,
    }
 }
 
-PLAYER_API void player__render( camera *cam, player_instance *player )
-{
+VG_STATIC void render_playermodel( camera *cam, world_instance *world,
+                                   struct player_model *model,
+                                   struct skeleton *skeleton ){
+   if( !model ) return;
+   
    shader_model_character_view_use();
 
        glActiveTexture( GL_TEXTURE0 );
-       glBindTexture( GL_TEXTURE_2D, player->playermodel->texture );
+       glBindTexture( GL_TEXTURE_2D, model->texture );
    shader_model_character_view_uTexMain( 0 );
    shader_model_character_view_uCamera( cam->transform[3] );
    shader_model_character_view_uPv( cam->mtx.pv );
@@ -419,7 +423,6 @@ PLAYER_API void player__render( camera *cam, player_instance *player )
    inverse[2] = cam->farz-cam->nearz;
    shader_model_character_view_uInverseRatioMain( inverse );
 
-   world_instance *world = world_current_instance();
    world_link_lighting_ub( world, _shader_model_character_view.id );
    world_bind_position_texture( world, _shader_model_character_view.id,
                               _uniform_model_character_view_g_world_depth, 2 );
@@ -429,15 +432,22 @@ PLAYER_API void player__render( camera *cam, player_instance *player )
                               _uniform_model_character_view_uLightsIndex, 4 );
 
    glUniformMatrix4x3fv( _uniform_model_character_view_uTransforms,
-                         player->playeravatar->sk.bone_count,
+                         skeleton->bone_count,
                          0,
-                         (float *)player->playeravatar->sk.final_mtx );
+                         (float *)skeleton->final_mtx );
    
-   mesh_bind( &player->playermodel->mesh );
-   mesh_draw( &player->playermodel->mesh );
+   mesh_bind( &model->mesh );
+   mesh_draw( &model->mesh );
+}
 
-   struct player_board *board = player_get_player_board( player );
+PLAYER_API void player__render( camera *cam, player_instance *player )
+{
+   world_instance *world = world_current_instance();
+
+   struct player_model *model = player_get_player_model( player );
+   render_playermodel( cam, world, model, &player->playeravatar->sk );
 
+   struct player_board *board = player_get_player_board( player );
    render_board( cam, world, board, player->playeravatar->sk.final_mtx[
                                        player->playeravatar->id_board],
                                        k_board_shader_player );
index f6c8194373c0d0abfc8b44f7881babef9225fbfd..a31f19a86fe128f4c4c48952c3389ff75a2fbd5c 100644 (file)
@@ -26,12 +26,6 @@ struct player_avatar
        id_board;
 };
 
-struct player_model
-{
-   glmesh mesh;
-   GLuint texture;
-};
-
 enum eboard_truck{
    k_board_truck_back = 0,
    k_board_truck_front = 1
@@ -44,8 +38,9 @@ enum eboard_wheel{
    k_board_wheel_br = 3,
 };
 
-struct player_board
-{
+struct player_board{
+   mdl_context model;
+
    glmesh mesh;
    GLuint texture;
 
@@ -58,6 +53,11 @@ struct player_board
                board;
 };
 
+struct player_model{
+   glmesh mesh;
+   GLuint texture;
+};
+
 enum board_shader{
    k_board_shader_player,
    k_board_shader_entity
diff --git a/playermodels_src/skaterift_jordan/addon.inf b/playermodels_src/skaterift_jordan/addon.inf
new file mode 100644 (file)
index 0000000..513da41
Binary files /dev/null and b/playermodels_src/skaterift_jordan/addon.inf differ
diff --git a/playermodels_src/skaterift_jordan/ch_jordan.mdl b/playermodels_src/skaterift_jordan/ch_jordan.mdl
new file mode 100644 (file)
index 0000000..67eea24
Binary files /dev/null and b/playermodels_src/skaterift_jordan/ch_jordan.mdl differ
diff --git a/playermodels_src/skaterift_new/addon.inf b/playermodels_src/skaterift_new/addon.inf
new file mode 100644 (file)
index 0000000..9a932a5
Binary files /dev/null and b/playermodels_src/skaterift_new/addon.inf differ
diff --git a/playermodels_src/skaterift_new/ch_new.mdl b/playermodels_src/skaterift_new/ch_new.mdl
new file mode 100644 (file)
index 0000000..aa3472f
Binary files /dev/null and b/playermodels_src/skaterift_new/ch_new.mdl differ
diff --git a/playermodels_src/skaterift_outlaw/addon.inf b/playermodels_src/skaterift_outlaw/addon.inf
new file mode 100644 (file)
index 0000000..49e9bec
Binary files /dev/null and b/playermodels_src/skaterift_outlaw/addon.inf differ
diff --git a/playermodels_src/skaterift_outlaw/ch_outlaw.mdl b/playermodels_src/skaterift_outlaw/ch_outlaw.mdl
new file mode 100644 (file)
index 0000000..8bc115e
Binary files /dev/null and b/playermodels_src/skaterift_outlaw/ch_outlaw.mdl differ
index 46cde31382876a9c50dde861363263285da69f0b..4d65145bea75c893ffb0eb4efe2702a273da8d7b 100644 (file)
 #include "save.c"
 
 static struct player_avatar localplayer_avatar;
+
+#if 0
 static struct player_model  localplayer_models[3];
+#endif
 
 int main( int argc, char *argv[] )
 {
@@ -99,9 +102,11 @@ vg_info("            '        ' '--' [] '----- '----- '     ' '---'  "
 
 VG_STATIC void load_playermodels(void)
 {
+#if 0
    player_model_load( &localplayer_models[0], "models/ch_new.mdl" );
    player_model_load( &localplayer_models[1], "models/ch_outlaw.mdl" );
    player_model_load( &localplayer_models[2], "models/ch_jordan.mdl" );
+#endif
 
    /* FIXME: hack */
    shader_model_character_view_register();
@@ -110,7 +115,9 @@ VG_STATIC void load_playermodels(void)
 }
 
 void temp_update_playermodel(void){
+#if 0
    player__use_model( &localplayer, &localplayer_models[k_playermdl_id] );
+#endif
 }
 
 VG_STATIC void async_skaterift_player_start( void *payload, u32 size )
@@ -146,7 +153,9 @@ VG_STATIC void vg_load(void)
    player__create( &localplayer );
    player_avatar_load( &localplayer_avatar, "models/ch_new.mdl" );
    player__use_avatar( &localplayer, &localplayer_avatar );
+#if 0
    player__use_model( &localplayer, &localplayer_models[k_playermdl_id] );
+#endif
    player__bind( &localplayer );
 
    /* --------------------- */
@@ -211,6 +220,8 @@ VG_STATIC void vg_load(void)
    vg_async_call( async_skaterift_player_start, NULL, 0 );
 
    skaterift_shift_op( k_async_op_board_scan );
+   addon_mount_content_folder( k_workshop_file_type_player, 
+                               "playermodels", ".mdl" );
    addon_mount_content_folder( k_workshop_file_type_board, "boards", ".mdl" );
    addon_mount_workshop_items();
    vg_async_call( async_addon_reg_update, NULL, 0 );
@@ -244,8 +255,7 @@ VG_STATIC void vg_load(void)
                              query_workshop_id, query_local_folder );
    if( reg_id != 0xffffffff ){
       localplayer.board_view_slot = skateshop_cache_fetch_board( reg_id );
-      addon_cache_watch( &addon_system.board_cache,
-                          localplayer.board_view_slot );
+      vg_pool_watch( &addon_system.board_cache, localplayer.board_view_slot );
    }
 
    board_processview_thread(NULL); /* END_OP!! */
index e7e2b078f6f3b845f92233cbf0a6e39519d7b1d5..c13c78b7fb3d455a35955f9ffdb7a43243b83372 100644 (file)
@@ -12,7 +12,6 @@
 #include "common.h"
 #include "world.h"
 #include "addon.h"
-#include "addon_cache.h"
 
 struct{
    enum async_operation{