height filtering
[csRadar.git] / csRadar.c
index 9af5cdad09b9ed2b9853338c3312982ab01113a0..f79fa3b8ef3902113ae975e40bf032204542112f 100644 (file)
--- a/csRadar.c
+++ b/csRadar.c
@@ -1,15 +1,23 @@
+// Copyright (C) 2021 Harry Godden (hgn)
+
+// Building:
+//  gcc -rdynamic csRadar.c -o csRadar -lm -ldl
+//
+// Plugins:
+//  gcc -fpic -shared -o ext/my_plugin.so my_plugin.c -lm
+
 #define VALVE_IMPLEMENTATION
 #define CSR_EXECUTABLE
 #include "csRadar.h"
 
-// gcc -Wall -fsanitize=address csRadar.c -o csRadar -lm
-
 int main( int argc, char *argv[] )
 {
        csr_api api = 
        {
                .padding = 128.f,
                .resolution = 1024,
+               .min_z = -INFINITY,
+               .max_z =  INFINITY,
                .write_txt = 1,
                .api_version = csr_api_version,
                .sampling_mode = k_EMSAA_RGSS
@@ -17,6 +25,7 @@ int main( int argc, char *argv[] )
 
        int output_set = 0;
        char *extension = NULL;
+       char *gameinfo = NULL;
 
        char *arg;
        while( csr_argp( argc, argv ) )
@@ -29,7 +38,7 @@ int main( int argc, char *argv[] )
                                goto IL_CSR_EXIT;
                        }
                        
-                       api.strings[ api.num_strings ++ ] = arg;
+                       api.strings[ api.num_strings ++ ].str = arg;
                }
                
                if( (arg = csr_opt_arg( 'o' )) )
@@ -42,7 +51,7 @@ int main( int argc, char *argv[] )
                
                if( (arg = csr_opt_arg( 'g' )) )
                {
-                       fs_set_gameinfo( arg );
+                       gameinfo = arg;
                }
                
                if( (arg = csr_opt_arg( 'r' )) )
@@ -84,6 +93,11 @@ int main( int argc, char *argv[] )
                {
                        extension = arg;
                }
+               
+               if( (arg = csr_long_opt_arg( "min" )) )
+                       api.min_z = atof( arg );
+               if( (arg = csr_long_opt_arg( "max" )) )
+                       api.max_z = atof( arg );
 
                if( csr_opt( 'v' ) || csr_long_opt( "version" ) )
                {
@@ -107,13 +121,15 @@ int main( int argc, char *argv[] )
                                "   -g <gameinfo.txt path>         Required if you are loading models\n"
                                "   -r 1024                        Output resolution\n"
                                "   -o <output>                    Specify output name/path\n"
+                               "   -e <classname>                 Same as default arg, but instead filters for entity class\n"
+                               //"   -s <height>                    Add a vertical split at this height\n"
                                "   --padding=128                  When cropping radar, add padding units to border\n"
                                //"   --standard-layers              Use standard TAR layers/groups\n"
-                               "   --write-normals                Enable normals as an output stream\n"
-                               "   --write-origins                Enable entity origins as an output stream\n"
                                "   --no-txt                       Don't create matching radar txt\n"
                                "   --multi-sample=RGSS            [ none, 2x, rgss, 8r ]\n"
                                "   --extension=TAR                Use an extension binary instead\n"
+                               "   --min=z                        Miniumum height to render\n"
+                               "   --max=z                        Maxiumum height to render\n"
                                "\n"
                                "   -v --version                   Display program version\n"
                                "   -h --help                      Display this help text\n"
@@ -125,10 +141,15 @@ int main( int argc, char *argv[] )
        
        if( api.num_strings )
        {
+               if( gameinfo )
+               {
+                       fs_set_gameinfo( gameinfo );
+               }
+       
                // Path handling
                if( !output_set )
                {
-                       strcpy( api.output_path, api.strings[0] );
+                       strcpy( api.output_path, api.strings[0].str );
                        csr_stripext( api.output_path );
                }
                
@@ -143,11 +164,21 @@ int main( int argc, char *argv[] )
                log_info( "output_path: '%s'\n", api.output_path );
                log_info( "vmf_name: '%s'\n", api.vmf_name );
 
-               api.map = vmf_init( api.strings[0] );
+               api.map = vmf_init( api.strings[0].str );
                if( api.map )
                {
+                       // Update arg inferred types
+                       api.strings[0].type = k_iftype_vmf;
+                       for( int i = 1; i < api.num_strings; i ++ )
+                       {
+                               if( vmf_visgroup_id( api.map->root, api.strings[i].str ) != -1 )
+                                       api.strings[i].type = k_iftype_visgroup;
+                               else
+                                       api.strings[i].type = k_iftype_classname;
+                       }
+               
                        if( !extension )
-                               extension = "csRadarFree";
+                               extension = "csr_substance";
                
                        csr_so ext = csr_libopen( extension );