stuff for demo
authorhgn <hgodden00@gmail.com>
Mon, 4 Dec 2023 16:51:40 +0000 (16:51 +0000)
committerhgn <hgodden00@gmail.com>
Mon, 4 Dec 2023 16:51:40 +0000 (16:51 +0000)
16 files changed:
build.c
build_release.sh [new file with mode: 0755]
ent_miniworld.c
ent_skateshop.c
ent_skateshop.h
freecam.c [new file with mode: 0644]
freecam.h [new file with mode: 0644]
menu.h
models_src/rs_menu.mdl
player_replay.c
skaterift.c
skaterift.h
steam.h
steam_build_script.vdf
world_gen.c
world_load.c

diff --git a/build.c b/build.c
index cd721e71e07c568abbce683ebd4fb8be245520e0..4fff0d3c070b4d27ee48e30450ae46f6a05178f9 100644 (file)
--- a/build.c
+++ b/build.c
@@ -14,6 +14,8 @@
  */
 
 int compiled_something = 0;
+int content_enabled = 1;
+int binary_enabled = 1;
 
 /* old highscores server */
 void build_server( enum compiler compiler ){
@@ -107,21 +109,21 @@ void write_generic_addon_inf( u32 type, const char *title,
 }
 
 void build_shaders(void);
-void build_game( enum compiler compiler ){
+void build_game_binary( enum compiler compiler ){
    static int shaders_built = 0;
    if( !shaders_built ){
       shaders_built = 1;
       build_shaders();
    }
 
-   vg_build_start( "skaterift", compiler );
    vg_build_object( "skaterift.c " );
    vg_build_add_link_for_graphics();
    vg_build_add_link_for_game();
-
    vg_build_copy_graphics_dependencies();
    vg_build_copy_game_dependencies();
+}
 
+void build_game_content( enum compiler compiler ){
    vg_build_symbolic_link( "textures_src", "textures" );
    vg_build_symbolic_link( "models_src", "models" );
    vg_build_symbolic_link( "boards_src", "boards" );
@@ -130,7 +132,6 @@ void build_game( enum compiler compiler ){
    vg_build_symbolic_link( "playermodels_src", "playermodels" );
    vg_build_syscall( "mkdir -p %s/cfg", vg_compiler.build_dir );
    vg_build_syscall( "mkdir -p %s/savedata", vg_compiler.build_dir );
-
    vg_build_syscall( "mkdir -p %s/tools", vg_compiler.build_dir );
    vg_build_syscall( "cp blender_export.py %s/tools/", vg_compiler.build_dir );
 
@@ -168,8 +169,19 @@ void build_game( enum compiler compiler ){
    write_generic_addon_inf( k_addon_type_player,
                             "Aaron", "ch_aaron.mdl",
                             "playermodels_src/skaterift_aaron/addon.inf" );
+}
+
+void build_game( enum compiler compiler ){
+   vg_build_start( "skaterift", compiler );
+
+   if( binary_enabled ){
+      build_game_binary( compiler );
+      vg_build();
+   }
+
+   if( content_enabled )
+      build_game_content( compiler );
 
-   vg_build();
    compiled_something = 1;
 }
 
@@ -214,6 +226,15 @@ int main( int argc, char *argv[] ){
       if( vg_long_opt( "mingw" ) )
          build_game( k_compiler_mingw );
 
+      if( vg_long_opt( "none" ) )
+         build_game( k_compiler_none );
+
+      if( (arg=vg_long_opt_arg( "content" )) )
+         content_enabled = atoi(arg);
+
+      if( (arg=vg_long_opt_arg( "binary" )) )
+         binary_enabled = atoi(arg);
+
       if( vg_opt('p') || vg_long_opt("run") ){
          chdir( vg_compiler.build_dir );
          if( vg_compiler.compiler == k_compiler_mingw )
@@ -226,15 +247,17 @@ int main( int argc, char *argv[] ){
       if( vg_long_opt( "tar" ) || vg_opt( 't' ) ){
          vg_build_syscall( "mkdir -p dist" );
          if( compiled_something )
-            vg_build_syscall( "tar -chzvf dist/%s-%u.tar.gz %s", 
-                              vg_compiler.name, uid, vg_compiler.build_dir );
+            vg_build_syscall( "tar -chzvf dist/%s-%u-%s.tar.gz %s", 
+                              vg_compiler.name, uid, vg_compiler_str(),
+                              vg_compiler.build_dir );
       }
 
       if( vg_long_opt( "zip" ) || vg_opt( 'z' ) ){
          vg_build_syscall( "mkdir -p dist" );
          if( compiled_something )
             vg_build_syscall( "zip -r9 dist/%s-%u.zip %s", 
-                              vg_compiler.name, uid, vg_compiler.build_dir );
+                              vg_compiler.name, uid, vg_compiler_str(),
+                              vg_compiler.build_dir );
       }
    }
 }
diff --git a/build_release.sh b/build_release.sh
new file mode 100755 (executable)
index 0000000..e69c7d1
--- /dev/null
@@ -0,0 +1 @@
+./build.sh --clean --content=0 -r --mingw --tar --content=1 --binary=0 --none --tar
index afd7b484c920fd6eec132aa611c84e9dbfc9132c..46def88bf700f90eeacef359585da43d8762997d 100644 (file)
@@ -148,14 +148,17 @@ static void ent_miniworld_preupdate(void){
        (global_miniworld.transition) ||
        (world_static.active_instance != k_world_purpose_hub) ||
        (!miniworld) ||
-       (dest->status != k_world_status_loaded) ){
+       (dest->status != k_world_status_loaded) ||
+       (skaterift.activity != k_skaterift_default)) {
       return;
    }
 
    if( button_down( k_srbind_miniworld_resume ) ){
       if( skaterift.demo_mode ){
          if( world_static.instance_addons[1]->flags & ADDON_REG_PREMIUM ){
-            /* TODO: open menu page with link to buy */
+            skaterift.activity = k_skaterift_menu;
+            menu.page = 0xffffffff;
+            menu_open_page( "Premium", k_ent_menuitem_stack_append );
             return;
          }
       }
index 14df0dcc3606919c3003696fe3989aa81d57c705..50b456941c9bde1ee8fc77d1ea4a0c70d130f33b 100644 (file)
@@ -64,8 +64,7 @@ static void skateshop_async_preview_imageload( void *data, u32 len ){
          global_skateshop.tex_preview;
    }
    else {
-      skaterift.rt_textures[k_skaterift_rt_workshop_preview] =
-         global_skateshop.tex_preview_err;
+      skaterift.rt_textures[k_skaterift_rt_workshop_preview] = vg.tex_missing;
    }
 
    SDL_AtomicLock( &addon_system.sl_cache_using_resources );
@@ -193,11 +192,8 @@ static void skateshop_init_async(void *_data,u32 size){
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
    glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
 
-   skaterift.rt_textures[ k_skaterift_rt_workshop_preview ] =
-      global_skateshop.tex_preview_err;
-
-   skaterift.rt_textures[ k_skaterift_rt_server_status ] =
-      global_skateshop.tex_preview_err;
+   skaterift.rt_textures[ k_skaterift_rt_workshop_preview ] = vg.tex_missing;
+   skaterift.rt_textures[ k_skaterift_rt_server_status ] = vg.tex_missing;
    render_server_status_gui();
 }
 
@@ -205,7 +201,6 @@ static void skateshop_init_async(void *_data,u32 size){
  * VG event init
  */
 static void skateshop_init(void){
-   vg_tex2d_replace_with_error( &global_skateshop.tex_preview_err );
    vg_async_call( skateshop_init_async, NULL, 0 );
 }
 
index 455c61df16c2e02dc687a64121f89d547708de68..68a34f4f7980a2f7224ba07402d2b70ad97bb3db 100644 (file)
@@ -41,7 +41,7 @@ struct{
 
 
    addon_reg *reg_preview, *reg_loaded_preview;
-   GLuint tex_preview, tex_preview_err;
+   GLuint tex_preview;
 }
 static global_skateshop={
    .render={.reg_id=0xffffffff,.world_reg=0xffffffff}
diff --git a/freecam.c b/freecam.c
new file mode 100644 (file)
index 0000000..2e79ff1
--- /dev/null
+++ b/freecam.c
@@ -0,0 +1,51 @@
+#include "skaterift.h"
+#include "input.h"
+
+static void freecam_preupdate(void){
+   camera *cam = &skaterift.replay_freecam;
+   v3f angles;
+   v3_copy( cam->angles, angles );
+   player_look( angles, 1.0f );
+
+   f32 decay = vg_maxf(0.0f,1.0f-vg.time_frame_delta*10.0f);
+
+   v3f d;
+   v3_sub( angles, cam->angles, d );
+   v3_muladds( skaterift.freecam_w, d, 20.0f, skaterift.freecam_w );
+   v3_muls( skaterift.freecam_w, decay, skaterift.freecam_w );
+   v3_muladds( cam->angles, skaterift.freecam_w, vg.time_frame_delta,
+               cam->angles );
+   cam->angles[1] = vg_clampf( cam->angles[1], -VG_PIf*0.5f,VG_PIf*0.5f);
+
+   camera_update_transform( cam );
+
+   v3f lookdir = { 0.0f, 0.0f, -1.0f },
+       sidedir = { 1.0f, 0.0f,  0.0f };
+   
+   m3x3_mulv( cam->transform, lookdir, lookdir );
+   m3x3_mulv( cam->transform, sidedir, sidedir );
+
+   v2f input;
+   joystick_state( k_srjoystick_steer, input );
+   v2_muls( input, vg.time_frame_delta*6.0f*20.0f, input );
+   
+   v3_muladds( skaterift.freecam_v, lookdir, -input[1], 
+               skaterift.freecam_v );
+   v3_muladds( skaterift.freecam_v, sidedir, input[0], 
+               skaterift.freecam_v );
+
+   v3_muls( skaterift.freecam_v, decay, skaterift.freecam_v );
+   v3_muladds( cam->pos,
+               skaterift.freecam_v, vg.time_frame_delta, cam->pos );
+}
+
+static int freecam_cmd( int argc, const char *argv[] ){
+   if( argc ){
+      skaterift.freecam = atoi(argv[0]);
+
+      if( skaterift.freecam ){
+         camera_copy( &skaterift.cam, &skaterift.replay_freecam );
+      }
+   }
+   return 0;
+}
diff --git a/freecam.h b/freecam.h
new file mode 100644 (file)
index 0000000..e0d5ade
--- /dev/null
+++ b/freecam.h
@@ -0,0 +1 @@
+static void freecam_preupdate(void);
diff --git a/menu.h b/menu.h
index 6df04dbf6da80e364b53f5fa6b94d7645d9be710..cb823b4ea6208a0291142717bc0cfa3ac2900e1e 100644 (file)
--- a/menu.h
+++ b/menu.h
@@ -49,7 +49,7 @@ struct {
    camera        view;
 
    mdl_context model;
-   GLuint texture;
+   GLuint *textures;
    glmesh mesh;
 
    mdl_array_ptr items, markers, cameras;
@@ -145,19 +145,23 @@ static void menu_init(void){
    MDL_LOAD_ARRAY( &menu.model, &menu.markers, ent_marker, alloc );
    MDL_LOAD_ARRAY( &menu.model, &menu.cameras, ent_camera, alloc );
 
-   vg_linear_clear( vg_mem.scratch );
+   u32 count = mdl_arrcount( &menu.model.textures );
+   menu.textures = vg_linear_alloc(alloc,vg_align8(sizeof(GLuint)*(count+1)));
+   menu.textures[0] = vg.tex_missing;
 
-   if( !mdl_arrcount( &menu.model.textures ) )
-      vg_fatal_error( "No texture in menu file" );
+   mdl_async_load_glmesh( &menu.model, &menu.mesh, NULL );
 
-   mdl_texture *tex0 = mdl_arritm( &menu.model.textures, 0 );
-   void *data = vg_linear_alloc( vg_mem.scratch, tex0->file.pack_size );
-   mdl_fread_pack_file( &menu.model, &tex0->file, data );
+   for( u32 i=0; i<count; i ++ ){
+      vg_linear_clear( vg_mem.scratch );
+      menu.textures[i+1] = vg.tex_missing;
 
-   mdl_async_load_glmesh( &menu.model, &menu.mesh, NULL );
-   vg_tex2d_load_qoi_async( data, tex0->file.pack_size, 
-                            VG_TEX2D_LINEAR|VG_TEX2D_CLAMP,
-                            &menu.texture );
+      mdl_texture *tex = mdl_arritm( &menu.model.textures, i );
+      void *data = vg_linear_alloc( vg_mem.scratch, tex->file.pack_size );
+      mdl_fread_pack_file( &menu.model, &tex->file, data );
+      vg_tex2d_load_qoi_async( data, tex->file.pack_size, 
+                               VG_TEX2D_LINEAR|VG_TEX2D_CLAMP,
+                               &menu.textures[i+1] );
+   }
 
    mdl_close( &menu.model );
    shader_model_menu_register();
@@ -186,6 +190,7 @@ static void menu_back_page(void){
  */
 static void menu_open_page( const char *name, 
                             enum ent_menuitem_stack_behaviour stackmode ){
+   srinput.state = k_input_state_resume;
    if( stackmode == k_ent_menuitem_stack_append ){
       if( menu.page_depth >= MENU_STACK_SIZE )
          vg_fatal_error( "Stack overflow\n" );
@@ -253,7 +258,6 @@ static void menu_trigger_item( ent_menuitem *item ){
       }
       else if( MDL_CONST_PSTREQ( &menu.model, q, "hub" ) ){
          if( world_static.active_instance == k_world_purpose_client ){
-            srinput.state = k_input_state_resume;
             menu_close();
             ent_miniworld_goback();
          }
@@ -264,6 +268,14 @@ static void menu_trigger_item( ent_menuitem *item ){
       else if( MDL_CONST_PSTREQ( &menu.model, q, "workshop" ) ){
          workshop_submit_command(0,NULL);
       }
+      else if( MDL_CONST_PSTREQ( &menu.model, q, "prem_store" ) ){
+         if( steam_ready )
+            SteamAPI_ISteamFriends_ActivateGameOverlayToStore( 
+                  SteamAPI_SteamFriends(), 2103940, k_EOverlayToStoreFlag_None);
+      }
+      else if( MDL_CONST_PSTREQ( &menu.model, q, "prem_nevermind" ) ){
+         menu_close();
+      }
    }
    else if( item->type == k_ent_menuitem_type_page_button ){
       menu_open_page( mdl_pstr( &menu.model, item->button.pstr ),
@@ -654,8 +666,6 @@ static void menu_render(void){
 
    shader_model_menu_use();
    shader_model_menu_uTexMain( 1 );
-   glActiveTexture( GL_TEXTURE1 );
-   glBindTexture( GL_TEXTURE_2D, menu.texture );
    shader_model_menu_uPv( menu.view.mtx.pv );
    shader_model_menu_uPvmPrev( menu.view.mtx_prev.pv );
 
@@ -669,6 +679,8 @@ static void menu_render(void){
    ent_menuitem *text_list[ 8 ];
    u32 text_count = 0;
 
+   u32 current_tex = 0xffffffff;
+
    for( u32 i=0; i<mdl_arrcount(&menu.items); i++ ){
       ent_menuitem *item = mdl_arritm( &menu.items, i );
 
@@ -742,7 +754,18 @@ static void menu_render(void){
 
       for( u32 j=0; j<item->submesh_count; j++ ){
          u32 index = item->submesh_start + j;
-         mdl_draw_submesh( mdl_arritm( &menu.model.submeshs, index ));
+         mdl_submesh *sm = mdl_arritm( &menu.model.submeshs, index );
+         
+         mdl_material *mat = mdl_arritm( &menu.model.materials, 
+                                         sm->material_id-1 );
+
+         if( mat->tex_diffuse != current_tex ){
+            glActiveTexture( GL_TEXTURE1 );
+            glBindTexture( GL_TEXTURE_2D, menu.textures[ mat->tex_diffuse ] );
+            current_tex = mat->tex_diffuse;
+         }
+
+         mdl_draw_submesh( sm );
       }
    }
 
index 590edc3837cc5de6150566b6e0443d292709351b..24f30b00c9a7ec196f3960adfc657ad88fe1d70c 100644 (file)
Binary files a/models_src/rs_menu.mdl and b/models_src/rs_menu.mdl differ
index 1b339474dd593b61f95a46ce56cd2a6e56f4573f..12f7f6b830a046559591cda15af319950b766582 100644 (file)
@@ -4,6 +4,7 @@
 #include "player_replay.h"
 #include "input.h"
 #include "gui.h"
+#include "freecam.h"
 
 static void replay_clear( replay_buffer *replay ){
    replay->head = NULL;
@@ -451,41 +452,7 @@ static void skaterift_replay_pre_update(void){
       }
 
       if( skaterift.freecam ){
-         camera *cam = &skaterift.replay_freecam;
-         v3f angles;
-         v3_copy( cam->angles, angles );
-         player_look( angles, 1.0f );
-
-         f32 decay = vg_maxf(0.0f,1.0f-vg.time_frame_delta*10.0f);
-
-         v3f d;
-         v3_sub( angles, cam->angles, d );
-         v3_muladds( skaterift.freecam_w, d, 20.0f, skaterift.freecam_w );
-         v3_muls( skaterift.freecam_w, decay, skaterift.freecam_w );
-         v3_muladds( cam->angles, skaterift.freecam_w, vg.time_frame_delta,
-                     cam->angles );
-         cam->angles[1] = vg_clampf( cam->angles[1], -VG_PIf*0.5f,VG_PIf*0.5f);
-
-         camera_update_transform( cam );
-         v3f lookdir = { 0.0f, 0.0f, -1.0f },
-             sidedir = { 1.0f, 0.0f,  0.0f };
-         
-         m3x3_mulv( cam->transform, lookdir, lookdir );
-         m3x3_mulv( cam->transform, sidedir, sidedir );
-
-         v2f input;
-         joystick_state( k_srjoystick_steer, input );
-         v2_muls( input, vg.time_frame_delta*6.0f*20.0f, input );
-         
-         v3_muladds( skaterift.freecam_v, lookdir, -input[1], 
-                     skaterift.freecam_v );
-         v3_muladds( skaterift.freecam_v, sidedir, input[0], 
-                     skaterift.freecam_v );
-
-         v3_muls( skaterift.freecam_v, decay, skaterift.freecam_v );
-         v3_muladds( cam->pos,
-                     skaterift.freecam_v, vg.time_frame_delta, cam->pos );
+         //freecam_preupdate();
       }
       else {
          if( button_down( k_srbind_replay_resume ) ){
@@ -541,6 +508,7 @@ static void skaterift_replay_post_render(void){
    }
 }
 
+#if 0
 static void skaterift_get_replay_camera( camera *cam ){
    if( skaterift.freecam ){
       cam->nearz = 0.1f;
@@ -553,6 +521,7 @@ static void skaterift_get_replay_camera( camera *cam ){
       replay_get_camera( &skaterift.replay, &skaterift.cam );
    }
 }
+#endif
 
 static void skaterift_replay_debug_info(void){
    player__debugtext( 2, "replay info" );
index c7e2d42f0e57e0632e03f023e55b58f27087959a..23b1db0311dd68a53079e491f714f16bd94d1983 100644 (file)
@@ -58,6 +58,7 @@
 #include "world_routes_ui.c"
 #include "particle.c"
 #include "player_effects.c"
+#include "freecam.c"
 
 static int k_tools_mode = 0;
 
@@ -97,6 +98,12 @@ vg_info("            |   \\/   | |        /     |      |    \\ | /   | \n" );
 vg_info("            '        ' '--' [] '----- '----- '     ' '---'  " 
         "SOFTWARE\n" );
 
+   /* please forgive me! */
+   u32 sz; char *drm;
+   if( (drm = vg_file_read_text( vg_mem.scratch, "DRM", &sz )) )
+      if( !strcmp(drm, "blibby!") )
+         skaterift.demo_mode = 0;
+
    vg_loader_step( remote_players_init, NULL );
 
    if( k_tools_mode )
@@ -175,6 +182,8 @@ static void vg_load(void){
    vg_console_reg_cmd( "load_world", skaterift_load_world_command, NULL );
    vg_console_reg_cmd( "switch_active_instance", 
                         skaterift_switch_instance_cmd, NULL );
+   vg_console_reg_cmd( "fc", freecam_cmd, NULL );
+   vg_console_reg_var( "immobile", &localplayer.immobile, k_var_dtype_i32, 0 );
 
    vg_loader_step( render_init, NULL );
    vg_loader_step( menu_init, NULL );
@@ -540,8 +549,16 @@ static void skaterift_composite_maincamera(void){
    camera_lerp( &localplayer.cam, &world_static.focus_cam,
                 vg_smoothstepf(world_static.focus_strength), &skaterift.cam );
 
-   if( skaterift.activity == k_skaterift_replay ){
-      skaterift_get_replay_camera( &skaterift.cam );
+   if( skaterift.freecam ){
+      freecam_preupdate();
+      v3_copy( skaterift.replay_freecam.pos, skaterift.cam.pos );
+      v3_copy( skaterift.replay_freecam.angles, skaterift.cam.angles );
+      skaterift.cam.fov = skaterift.replay_freecam.fov;
+   }
+   else {
+      if( skaterift.activity == k_skaterift_replay ){
+         replay_get_camera( &skaterift.replay, &skaterift.cam );
+      }
    }
 
    skaterift.cam.nearz = 0.1f;
index fdb055486aa6f0a2c902b0eb4221aabac03b79ef..35ac9bfd7126ce3630e2b65622a17688abb4cace 100644 (file)
@@ -49,7 +49,7 @@ struct{
    struct gui_helper *helper_resume, *helper_freecam;
 
    camera replay_freecam;
-   int freecam;
+   i32 freecam;
    v3f freecam_v, freecam_w;
 
    enum skaterift_activity {
@@ -67,7 +67,8 @@ struct{
    u32 achievements;
    int demo_mode;
 }
-static skaterift = { .op = k_async_op_clientloading, .time_rate = 1.0f };
+static skaterift = { 
+   .op = k_async_op_clientloading, .time_rate = 1.0f, .demo_mode = 1 };
 
 /* Skaterift api */
 static void skaterift_change_world_start( addon_reg *reg );
diff --git a/steam.h b/steam.h
index e0569a7a8046d50c23e451342c2e0d656843a27b..dadcd90309e6ace26db0dc668d5f7c9b29fda0a1 100644 (file)
--- a/steam.h
+++ b/steam.h
@@ -63,6 +63,9 @@ static void steam_store_achievements(void)
 
 static void update_ach_models(void);
 static void steam_set_achievement( const char *name ){
+   if( skaterift.demo_mode )
+      return;
+
    /* hack lol */
    if( !strcmp(name,"MARC") ) skaterift.achievements |= 0x1;
    if( !strcmp(name,"ALBERT") ) skaterift.achievements |= 0x2;
index eb8eff33bbc5c4c931e1d865de0cbf92b017a563..02d53f7784f0f2fbf29fb90a83ae17fb89c31907 100644 (file)
@@ -8,7 +8,7 @@
 \r
        "Depots"\r
        {\r
-               "2103942" // Linux depot\r
+               "2103942" // Linux Binary\r
                {\r
                        "FileMapping"\r
                        {\r
@@ -17,7 +17,7 @@
                                "recursive" "1"\r
                        }\r
                }\r
-               "2103941" // Windoes\r
+               "2103941" // Windows Binary\r
                {\r
                        "FileMapping"\r
                        {\r
                                "recursive" "1"\r
                        }\r
                }\r
+      "2103943" // Shared Content\r
+      {\r
+         "FileMapping"\r
+         {\r
+            "LocalPath" "skaterift-none/*"\r
+            "DepotPath" "."\r
+            "recursive" "1"\r
+         }\r
+      }\r
+      "2720161" // Extreme DRM solutions\r
+      {\r
+         "FileMapping"\r
+         {\r
+            "LocalPath" "DRM"\r
+            "DepotPath" "."\r
+            "recursive" "0"\r
+         }\r
+      }\r
        }\r
 }\r
index df5b342e40fb11965c963a0ce4009db6a4da31bb..b94c689bc0d0246b2a79dc8b252e1b609f10ad01 100644 (file)
@@ -683,8 +683,7 @@ static void world_gen_load_surfaces( world_instance *world ){
    world->texture_count = world->meta.textures.count+1;
    world->textures = vg_linear_alloc( world->heap,
                               vg_align8(sizeof(GLuint)*world->texture_count) );
-
-   vg_tex2d_replace_with_error( &world->textures[0] );
+   world->textures[0] = vg.tex_missing;
 
    for( u32 i=0; i<mdl_arrcount(&world->meta.textures); i++ ){
       mdl_texture *tex = mdl_arritm( &world->meta.textures, i );
index 3dce0288024f76612b89a65502d1d5b60ceef2b2..5ab2dfb0793e80ce9e5670bd0b4e055fbba5ac83 100644 (file)
@@ -412,7 +412,7 @@ static void world_free( world_instance *world ){
    glDeleteTextures( 1, &world->tex_light_cubes );
 
    /* delete textures and meshes */
-   glDeleteTextures( world->texture_count, world->textures );
+   glDeleteTextures( world->texture_count-1, world->textures+1 );
 
    u32 world_index = world - world_static.instances;
    if( world_index ){