X-Git-Url: https://harrygodden.com/git/?p=csRadar.git;a=blobdiff_plain;f=vmf.h;h=740a3749da0af94070dabd7da5077aaae7ac8197;hp=c5f736b4474977214d8ef543dbb79ba1029c4a0d;hb=2d86e3b7ff84841fa44502db1a74ab1f82b3e338;hpb=8382aed7f0cdc38bc5c58832d4a15277cf56d4be diff --git a/vmf.h b/vmf.h index c5f736b..740a374 100644 --- a/vmf.h +++ b/vmf.h @@ -43,7 +43,7 @@ void vmf_load_models( vmf_map *map ); // Create matrix describing this entities transform void vmf_entity_transform( vdf_node *ent, m4x3f mat ); -u32 vmf_visgroup_id( vdf_node *root, const char *name ); +int vmf_visgroup_id( vdf_node *root, const char *name ); int vmf_visgroup_match( vdf_node *ent, u32 target ); // Currently unused @@ -74,7 +74,7 @@ struct vmf_vert { v3f co; v3f nrm; - v2f xy; + v3f origin; }; struct vmf_face @@ -422,7 +422,7 @@ ESolidResult solidgen_push( vmf_solid *ctx, vdf_node *node ) v3_divs( center, (float)numpoints, center ); for( ; vert_start < csr_sb_count( ctx->verts ); vert_start ++ ) { - v2_copy( center, ctx->verts[ vert_start ].xy ); + v3_copy( center, ctx->verts[ vert_start ].origin ); } // Sort each faces and trianglulalate them @@ -522,6 +522,9 @@ ESolidResult solidgen_push( vmf_solid *ctx, vdf_node *node ) // Todo, put correct normal v3_copy( (v3f){ 0.f, 0.f, 1.f }, vert->nrm ); + + // Todo: use real bounds of displaced vertices + v3_copy( center, vert->origin ); } } @@ -692,15 +695,24 @@ u32 vmf_init_subvmf( vmf_map *map, const char *subvmf ); void vmf_load_all_instances( vmf_map *map, vdf_node *vmf ) { + char nextvmf[ 512 ]; + const char *base = kv_get( vmf, "csr_path", "" ); + vdf_foreach( vmf, "entity", ent ) { if( !strcmp( kv_get( ent, "classname", "" ), "func_instance" )) { // Entity is in use if file is specified, if not just ignore the entity. - const char *path = kv_get( ent, "file", "" ); - if( strcmp( path, "" ) ) + const char *path = kv_get( ent, "file", NULL ); + + if( path ) { - if( (ent->user1 = vmf_init_subvmf( map, path ))) + // Make relative path real + strcpy( nextvmf, base ); + csr_downlvl( nextvmf ); + strcat( nextvmf, path ); + + if( (ent->user1 = vmf_init_subvmf( map, nextvmf ))) { ent->user1 --; ent->user = VMF_FLAG_IS_INSTANCE; @@ -741,7 +753,9 @@ u32 vmf_init_subvmf( vmf_map *map, const char *subvmf ) strcpy( inst->name, subvmf ); if( (inst->root = vdf_open_file( subvmf )) ) - { + { + vdf_kv_append( inst->root, "csr_path", subvmf ); + // Recursive load other instances vmf_load_all_instances( map, inst->root ); return id+1; @@ -764,6 +778,8 @@ vmf_map *vmf_init( const char *path ) return NULL; } + vdf_kv_append( map->root, "csr_path", path ); + // Prepare instances vmf_load_all_instances( map, map->root ); @@ -817,7 +833,7 @@ void vmf_entity_transform( vdf_node *ent, m4x3f mat ) m4x3_scale( mat, scale ); } -u32 vmf_visgroup_id( vdf_node *root, const char *name ) +int vmf_visgroup_id( vdf_node *root, const char *name ) { vdf_node *dict = vdf_next( root, "visgroups", NULL ); @@ -832,7 +848,7 @@ u32 vmf_visgroup_id( vdf_node *root, const char *name ) } } - return 0; + return -1; } int vmf_visgroup_match( vdf_node *ent, u32 target )