X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=f9ec815dfc78a42f63b0b1e4cdb323c81be96920;hb=6ab4435fb19beb6af6c52691793d5ca17a120f69;hp=e37e3239bd8ab173f94870dda2a8bdf8e23911ac;hpb=9d0ff08fef8507613586856de7ce25d43704db92;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index e37e323..f9ec815 100644 --- a/model.h +++ b/model.h @@ -1,13 +1,14 @@ /* - * 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 +#define MDL_VERSION_MIN 101 +#define MDL_VERSION_NR 102 enum mdl_shader { @@ -17,7 +18,8 @@ enum mdl_shader k_shader_standard_vertex_blend = 3, k_shader_water = 4, k_shader_invisible = 5, - k_shader_boundary = 6 + k_shader_boundary = 6, + k_shader_fxglow = 7 }; enum mdl_surface_prop @@ -36,7 +38,8 @@ enum material_flag k_material_flag_grow_grass = 0x00000004, k_material_flag_grindable = 0x00000008, k_material_flag_invisible = 0x00000010, - k_material_flag_boundary = 0x00000020 + k_material_flag_boundary = 0x00000020, + k_material_flag_preview_visibile = 0x00000040 }; #pragma pack(push,1) @@ -71,6 +74,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; @@ -221,13 +232,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; } @@ -249,11 +258,10 @@ struct mdl_context /* mesh buffers */ verts, indices; - u32 pack_base_offset; - - /* pack data */ - //pack; + + /* runtime */ + glmesh mesh; }; @@ -407,10 +415,10 @@ VG_STATIC void mdl_open( mdl_context *mdl, const char *path, void *lin_alloc ) if( l != 1 ) mdl_load_fatal_corrupt( mdl ); - if( mdl->info.version < MDL_VERSION_NR ){ + if( mdl->info.version < MDL_VERSION_MIN ){ vg_warn( "For model: %s\n", path ); - vg_warn( " version: %u (current: %u)\n", mdl->info.version, - MDL_VERSION_NR ); + vg_warn( " version: %u (min: %u, current: %u)\n", + mdl->info.version, MDL_VERSION_MIN, MDL_VERSION_NR ); vg_fatal_error( "Legacy model version incompatable" ); } @@ -447,6 +455,7 @@ VG_STATIC const char *mdl_pstr( mdl_context *mdl, u32 pstr ) return ((char *)mdl_arritm( &mdl->strings, pstr )) + 4; } + VG_STATIC int mdl_pstreq( mdl_context *mdl, u32 pstr, const char *str, u32 djb2 ) { @@ -458,19 +467,14 @@ mdl_pstreq( mdl_context *mdl, u32 pstr, const char *str, u32 djb2 ) else return 0; } +#define MDL_CONST_PSTREQ( MDL, Q, CONSTSTR )\ + mdl_pstreq( MDL, Q, CONSTSTR, vg_strdjb2( CONSTSTR ) ) + /* * Simple mesh interface for OpenGL * ---------------------------------------------------------------------------- */ -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 ) @@ -582,11 +586,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" ); @@ -643,5 +647,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; itextures ); 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