X-Git-Url: https://harrygodden.com/git/?a=blobdiff_plain;f=model.h;h=430ed26d7425d684670bddeb0931a9b9b45039de;hb=dfee9022b3513fddec36f7ea70867ee5961a44da;hp=2aaf48358517283fa72d6c40a1e0b1d6194e28a7;hpb=54ca09093b8d5f752b4a0897bd9703f3b2ad6ed1;p=carveJwlIkooP6JGAAIwe30JlM.git diff --git a/model.h b/model.h index 2aaf483..430ed26 100644 --- a/model.h +++ b/model.h @@ -1,10 +1,13 @@ +#ifndef MODEL_H +#define MODEL_H + #include "vg/vg.h" typedef struct model model; typedef struct glmesh glmesh; typedef struct submodel submodel; typedef struct model_vert model_vert; -typedef struct scene scene; +typedef struct model_marker model_marker; typedef struct sdf_primative sdf_primative; typedef enum esdf_type esdf_type; @@ -15,17 +18,8 @@ struct model u32 vertex_count, indice_count, - layer_count; -}; - -struct sdf_primative -{ - v4f origin; /* xyz, yaw */ - /* Cone: - x base scale - y height - */ - v4f info; + layer_count, + marker_count; }; struct submodel @@ -36,17 +30,24 @@ struct submodel vertex_count; boxf bbx; - sdf_primative sdf; + v3f pivot; /* same as co? */ + v4f q; + char name[32]; + char material[32]; +}; - enum esdf_type - { - k_sdf_none = 0, - k_sdf_cone, - k_sdf_sphere, - k_sdf_box - } - sdf_type; +struct classtype_gate +{ + u32 target; +}; +struct model_marker +{ + v3f co; + v4f q; + v3f s; + u32 classtype; + u32 offset; char name[32]; }; @@ -121,15 +122,21 @@ static void mesh_draw( glmesh *mesh ) /* * Helper functions for file offsets + * TODO: Revise this */ static submodel *model_get_submodel( model *mdl, int id ) { return ((submodel*)(mdl+1)) + id; } +static model_marker *model_get_marker( model *mdl, int id ) +{ + return ((model_marker*)model_get_submodel(mdl,mdl->layer_count)) + id; +} + static model_vert *model_vertex_base( model *mdl ) { - return (model_vert *)model_get_submodel( mdl, mdl->layer_count ); + return (model_vert *)model_get_marker( mdl, mdl->marker_count ); } static u32 *model_indice_base( model *mdl ) @@ -147,6 +154,12 @@ static u32 *submodel_indice_data( model *mdl, submodel *sub ) return model_indice_base(mdl) + sub->indice_start; } +static void *get_entdata_raw( model *mdl, model_marker *marker ) +{ + return ((void *)(model_indice_base(mdl) + mdl->indice_count)) + + marker->offset; +} + static submodel *submodel_get( model *mdl, const char *name ) { for( int i=0; ilayer_count; i++ ) @@ -160,11 +173,31 @@ static submodel *submodel_get( model *mdl, const char *name ) return NULL; } +static model_marker *model_marker_get( model *mdl, const char *name ) +{ + for( int i=0; imarker_count; i++ ) + { + model_marker *mk = model_get_marker( mdl,i ); + + if( !strcmp( mk->name, name ) ) + return mk; + } + + return NULL; +} + static void submodel_draw( submodel *sm ) { mesh_drawn( sm->indice_start, sm->indice_count ); } +static void model_unpack_submodel( model *model, glmesh *mesh, submodel *sm ) +{ + mesh_upload( mesh, + model_vertex_base( model ) + sm->vertex_start, sm->vertex_count, + model_indice_base( model ) + sm->indice_start, sm->indice_count ); +} + static void model_unpack( model *model, glmesh *mesh ) { u32 offset = model_get_submodel( model, 0 )->vertex_count; @@ -183,3 +216,12 @@ static void model_unpack( model *model, glmesh *mesh ) mesh_upload( mesh, model_vertex_base( model ), model->vertex_count, model_indice_base( model ), model->indice_count ); } + +static void mesh_free( glmesh *mesh ) +{ + glDeleteVertexArrays( 1, &mesh->vao ); + glDeleteBuffers( 1, &mesh->ebo ); + glDeleteBuffers( 1, &mesh->vbo ); +} + +#endif