X-Git-Url: https://harrygodden.com/git/?p=csRadar.git;a=blobdiff_plain;f=csRadar.c;h=9af5cdad09b9ed2b9853338c3312982ab01113a0;hp=5347d751021634e7b31c04ac7eb90d1fd4c00022;hb=8382aed7f0cdc38bc5c58832d4a15277cf56d4be;hpb=0bd8697a99ced50789a5d41b84a4b87f39cb1653 diff --git a/csRadar.c b/csRadar.c index 5347d75..9af5cda 100644 --- a/csRadar.c +++ b/csRadar.c @@ -1,70 +1,41 @@ -#include -#include -#include -#include -#include -#include -#include - - -#include - -// CSR lib -#include "csrLog.h" -#include "csrOpt.h" -#include "csrTypes.h" -#include "csrMath.h" -#include "csrMem.h" -#include "csrIO.h" -#include "csrComb.h" - -// Valve formats -#include "vdf.h" -#include "vpk.h" -#include "vfilesys.h" - -#include "vmdl.h" -#include "vmf.h" - -// CSR main -#include "csr32f.h" -#include "csrDraw.h" - -#define CSR_VERSION "0.0.1" +#define VALVE_IMPLEMENTATION +#define CSR_EXECUTABLE +#include "csRadar.h" // gcc -Wall -fsanitize=address csRadar.c -o csRadar -lm int main( int argc, char *argv[] ) { - char *arg; - char *strings[ 20 ]; - int num_strings = 0; - - float padding = 128.f; - u32 resolution = 1024; - int write_txt = 1; - char output_path[ 512 ]; // Full path eg. /home/harry/my_map.vmf - char vmf_name[ 128 ]; // Just the base name eg. my_map + csr_api api = + { + .padding = 128.f, + .resolution = 1024, + .write_txt = 1, + .api_version = csr_api_version, + .sampling_mode = k_EMSAA_RGSS + }; + int output_set = 0; - EMSAA sampling_mode = k_EMSAA_RGSS; + char *extension = NULL; + char *arg; while( csr_argp( argc, argv ) ) { if( (arg = csr_arg()) ) { - if( num_strings == 20 ) + if( api.num_strings == 20 ) { log_error( "Too many arguments! Max 20\n" ); goto IL_CSR_EXIT; } - strings[ num_strings ++ ] = arg; + api.strings[ api.num_strings ++ ] = arg; } if( (arg = csr_opt_arg( 'o' )) ) { - strcpy( output_path, arg ); - csr_path_winunix( output_path ); + strcpy( api.output_path, arg ); + csr_path_winunix( api.output_path ); output_set = 1; } @@ -76,31 +47,31 @@ int main( int argc, char *argv[] ) if( (arg = csr_opt_arg( 'r' )) ) { - resolution = atoi( arg ); + api.resolution = atoi( arg ); } if( (arg = csr_long_opt_arg( "padding" )) ) { - padding = atof( arg ); + api.padding = atof( arg ); } if( (arg = csr_long_opt_arg( "multi-sample" )) ) { if( !strcmp( arg, "none" )) { - sampling_mode = k_EMSAA_none; + api.sampling_mode = k_EMSAA_none; } else if( !strcmp( arg, "rgss" )) { - sampling_mode = k_EMSAA_RGSS; + api.sampling_mode = k_EMSAA_RGSS; } else if( !strcmp( arg, "2x" )) { - sampling_mode = k_EMSAA_2x2; + api.sampling_mode = k_EMSAA_2x2; } else if( !strcmp( arg, "8r" )) { - sampling_mode = k_EMSAA_8R; + api.sampling_mode = k_EMSAA_8R; } else { @@ -108,10 +79,15 @@ int main( int argc, char *argv[] ) goto IL_CSR_EXIT; } } + + if( (arg = csr_long_opt_arg( "extension" )) ) + { + extension = arg; + } if( csr_opt( 'v' ) || csr_long_opt( "version" ) ) { - printf( "csRadar version: " CSR_VERSION "\n" ); + printf( "csRadar build: %u, api_version: %u\n", csr_build, csr_api_version ); goto IL_CSR_EXIT; } @@ -133,6 +109,8 @@ int main( int argc, char *argv[] ) " -o Specify output name/path\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" @@ -145,106 +123,63 @@ int main( int argc, char *argv[] ) } } - if( num_strings ) + if( api.num_strings ) { - vmf_map *map = vmf_init( strings[0] ); - - if( map ) + // Path handling + if( !output_set ) { - // Path handling - if( !output_set ) - { - strcpy( output_path, strings[0] ); - csr_stripext( output_path ); - } - - char *base_name; - if( !(base_name = csr_findext( output_path, '/' ) )) - { - base_name = output_path; - } - - strcpy( vmf_name, base_name ); - - log_info( "output_path: '%s'\n", output_path ); - log_info( "vmf_name: '%s'\n", vmf_name ); - - // Main - csr_target target; - - csr_create_target( &target, resolution, resolution, sampling_mode ); - csr_rt_clear( &target ); - - csr_use_program( &target, frag_gbuffer ); - - // Compute bounds - csr_filter filter = - { - .classname = NULL, - .visgroup = NULL, - .compute_bounds_only = 1 - }; + strcpy( api.output_path, api.strings[0] ); + csr_stripext( api.output_path ); + } + + char *base_name; + if( !(base_name = csr_findext( api.output_path, '/' ) )) + { + base_name = api.output_path; + } + + strcpy( api.vmf_name, base_name ); + + 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] ); + if( api.map ) + { + if( !extension ) + extension = "csRadarFree"; + + csr_so ext = csr_libopen( extension ); - // One pass for fitting, second pass for drawing - for( int i = 0; i < 2; i ++ ) + if( ext ) { - if( num_strings == 1 ) - { - // Draw everything - draw_vmf_group( &target, map, map->root, &filter, NULL, NULL ); - csr_rt_save_buffers( &target, output_path, "all" ); - } - else - { - // Draw groups - for( int i = 1; i < num_strings; i ++ ) - { - filter.visgroup = strings[ i ]; - - draw_vmf_group( &target, map, map->root, &filter, NULL, NULL ); - csr_rt_save_buffers( &target, output_path, strings[i] ); - - csr_rt_clear( &target ); - } - } + void (*csr_ext_main)(csr_api *); + void (*csr_ext_exit)(csr_api *); - if( i == 0 ) + csr_ext_main = csr_get_proc( ext, "csr_ext_main" ); + csr_ext_exit = csr_get_proc( ext, "csr_ext_exit" ); + + if( csr_ext_main && csr_ext_exit ) { - filter.compute_bounds_only = 0; - csr_auto_fit( &target, padding ); - vmf_load_models( map ); + csr_ext_main( &api ); + + // Do other + + csr_ext_exit( &api ); } else { - float prog = 0.f; - csr_prog_begin( "Rendering" ); - for(;;) - { - if( prog > 1.f ) - break; - - csr_prog_update( prog ); - usleep( 20000 ); - - prog += 0.01f; - } - - csr_prog_end(); + csr_liberr(); } + + csr_libclose( ext ); } - - if( write_txt ) + else { - char txt_path[ 512 ]; - - strcpy( txt_path, output_path ); - strcat( txt_path, ".txt" ); - - csr_write_txt( txt_path, vmf_name, &target ); + csr_liberr(); } - csr_rt_free( &target ); - vmf_free( map ); + vmf_free( api.map ); } else {