visgroup filtering
authorhgn <hgodden00@gmail.com>
Sat, 10 Jul 2021 23:26:08 +0000 (00:26 +0100)
committerhgn <hgodden00@gmail.com>
Sat, 10 Jul 2021 23:26:08 +0000 (00:26 +0100)
csRadar.c
csrDraw.h
vmf.h

index 9c8c0b4d0f08e8922896ef1911554a2ba8c6e78a..98c57593d5252fede27c55603f98e9f59cdd3409 100644 (file)
--- 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 );
                
index 30443343d4456e4d71497568672286cc1f88ed3a..b162b0fc556199fd7ab20edb8108bc547f514600 100644 (file)
--- 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 4793e0bda61af53b28c06a4bc521193369c9bc0a..ea91d17ed7e78e59cb180c2f88eca79aea522266 100644 (file)
--- 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;
+}