From 2b5ab41c3193d52eba04269f236d30a71aa0dd9d Mon Sep 17 00:00:00 2001 From: hgn Date: Sun, 11 Jul 2021 00:26:08 +0100 Subject: [PATCH] visgroup filtering --- csRadar.c | 2 +- csrDraw.h | 15 ++++++++++++++- vmf.h | 34 ++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 2 deletions(-) diff --git a/csRadar.c b/csRadar.c index 9c8c0b4..98c5759 100644 --- a/csRadar.c +++ b/csRadar.c @@ -48,7 +48,7 @@ int main( int argc, char *argv[] ) }; csr_rt_clear( &target ); - draw_vmf_group( &target, map, map->root, 0, NULL, NULL ); + draw_vmf_group( &target, map, map->root, "tar_layout", NULL, NULL ); float *rgba_test = (float *)csr_malloc( 1024*1024*sizeof(float)*3 ); diff --git a/csrDraw.h b/csrDraw.h index 3044334..b162b0f 100644 --- a/csrDraw.h +++ b/csrDraw.h @@ -97,12 +97,19 @@ void csr_draw( csr_target *rt, vmf_vert *triangles, u32 triangle_count, m4x3f tr } } -void draw_vmf_group( csr_target *rt, vmf_map *map, vdf_node *root, int const group, m4x3f prev, m4x3f inst ) +void draw_vmf_group( csr_target *rt, vmf_map *map, vdf_node *root, const char *group, m4x3f prev, m4x3f inst ) { m4x3f transform = M4X3_IDENTITY; vmf_solid solid; vmf_vert tri[3]; + u32 group_id = 0; + + if( group ) + { + group_id = vmf_visgroup_id( root, group ); + } + // Multiply previous transform with instance transform to create basis if( prev ) { @@ -115,6 +122,9 @@ void draw_vmf_group( csr_target *rt, vmf_map *map, vdf_node *root, int const gro vdf_foreach( world, "solid", brush ) { + if( group && !vmf_visgroup_match( brush, group_id ) ) + continue; + solidgen_push( &solid, brush ); } @@ -136,6 +146,9 @@ void draw_vmf_group( csr_target *rt, vmf_map *map, vdf_node *root, int const gro vdf_foreach( root, "entity", ent ) { + if( group && !vmf_visgroup_match( ent, group_id ) ) + continue; + if( ent->user & VMF_FLAG_IS_PROP ) { // Create model transform diff --git a/vmf.h b/vmf.h index 4793e0b..ea91d17 100644 --- a/vmf.h +++ b/vmf.h @@ -831,3 +831,37 @@ void vmf_entity_transform( vdf_node *ent, m4x3f mat ) // Scale m4x3_scale( mat, scale ); } + +u32 vmf_visgroup_id( vdf_node *root, const char *name ) +{ + vdf_node *dict = vdf_next( root, "visgroups", NULL ); + + if( dict ) + { + vdf_foreach( dict, "visgroup", group ) + { + if( !strcmp( kv_get( group, "name", "" ), name ) ) + { + return kv_get_int( group, "visgroupid", 0 ); + } + } + } + + return 0; +} + +int vmf_visgroup_match( vdf_node *ent, u32 target ) +{ + vdf_node *editor = vdf_next( ent, "editor", NULL ); + + if( editor ) + { + kv_foreach( editor, "visgroupid", groupe ) + { + if( target == atoi( groupe ) ) + return 1; + } + } + + return 0; +} -- 2.25.1