X-Git-Url: https://harrygodden.com/git/?p=csRadar.git;a=blobdiff_plain;f=csRadar.c;h=17f09a85b547e5434cfa1499471a8d55179eccf3;hp=de19eba919c9411a9f523d53fd010ececf517b82;hb=HEAD;hpb=0399aad1d7374badf037a2696d9e276d71b7a297 diff --git a/csRadar.c b/csRadar.c index de19eba..17f09a8 100644 --- a/csRadar.c +++ b/csRadar.c @@ -1,102 +1,228 @@ -#include -#include -#include -#include -#include -#include +// Copyright (C) 2021 Harry Godden (hgn) -// CSR lib -#include "csrTypes.h" -#include "csrMath.h" -#include "csrMem.h" -#include "csrIO.h" -#include "csrComb.h" +// Building: +// gcc -rdynamic csRadar.c -o csRadar -lm -ldl +// +// Plugins: +// gcc -fpic -shared -o ext/my_plugin.so my_plugin.c -lm -// Valve formats -#include "vdf.h" -#include "vpk.h" -#include "vfilesys.h" - -#include "vmdl.h" -#include "vmf.h" - - -// CSR main -#include "csrDraw.h" -#include "csr32f.h" - - -//#include "stretchy_buffer.h" +#define VALVE_IMPLEMENTATION +#define CSR_EXECUTABLE +#include "csRadar.h" int main( int argc, char *argv[] ) { - if( argc == 2 ) + csr_api api = { - fs_set_gameinfo( "/home/harry/SteamLibrary/steamapps/common/Counter-Strike Global Offensive/csgo/gameinfo.txt" ); - - printf( "read: %s\n", argv[1] ); - //vdf_node *node = vdf_open_file( argv[1] ); + .padding = 128.f, + .resolution = 1024, + .min_z = -INFINITY, + .max_z = INFINITY, + .write_txt = 1, + .api_version = csr_api_version, + .sampling_mode = k_EMSAA_RGSS + }; + + int output_set = 0; + char *extension = NULL; + char *gameinfo = NULL; + + char *arg; + while( csr_argp( argc, argv ) ) + { + if( (arg = csr_arg()) ) + { + if( api.num_strings == 20 ) + { + log_error( "Too many arguments! Max 20\n" ); + goto IL_CSR_EXIT; + } + + api.strings[ api.num_strings ++ ].str = arg; + } - vmf_map *map = vmf_init( argv[1], 1 ); + if( (arg = csr_opt_arg( 'o' )) ) + { + strcpy( api.output_path, arg ); + output_set = 1; + } - vmf_free( map ); - fs_exit(); + if( (arg = csr_opt_arg( 'g' )) ) + { + gameinfo = arg; + } - /* - vmf_solid solid_main; + if( (arg = csr_opt_arg( 'r' )) ) + { + api.resolution = atoi( arg ); + } + if( (arg = csr_long_opt_arg( "padding" )) ) + { + api.padding = atof( arg ); + } - solidgen_ctx_init( &solid_main ); - - vdf_node *world = vdf_next( node, "world", NULL ); + if( (arg = csr_long_opt_arg( "multi-sample" )) ) + { + if( !strcmp( arg, "none" )) + { + api.sampling_mode = k_EMSAA_none; + } + else if( !strcmp( arg, "rgss" )) + { + api.sampling_mode = k_EMSAA_RGSS; + } + else if( !strcmp( arg, "2x" )) + { + api.sampling_mode = k_EMSAA_2x2; + } + else if( !strcmp( arg, "8r" )) + { + api.sampling_mode = k_EMSAA_8R; + } + else + { + log_error( "Invalid sampling pattern '%s'\n", arg ); + goto IL_CSR_EXIT; + } + } - vdf_foreach( world, "solid", brush ) + if( (arg = csr_long_opt_arg( "extension" )) ) { - solidgen_push( &solid_main, brush ); + 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 ); - clock_t t; - t = clock(); - printf("Timer starts\n"); - - csr_frag *image = (csr_frag *)csr_malloc( 1024*1024*sizeof(csr_frag) ); - clear_depth( image, 1024, 1024 ); - - for( int i = 0; i < csr_sb_count( solid_main.indices )/3; i ++ ) + if( csr_opt( 'v' ) || csr_long_opt( "version" ) ) { - u32 * base = solid_main.indices + i*3; - - vmf_vert tri[3]; - - tri[0] = solid_main.verts[ base[0] ]; - tri[1] = solid_main.verts[ base[1] ]; - tri[2] = solid_main.verts[ base[2] ]; - - draw_buffers( image, 1024, 1024, (v4f){ -1000.f, -1000.f, 1000.f, 1000.f }, tri, 1 ); + printf( "csRadar build: %u, api_version: %u\n", csr_build, csr_api_version ); + goto IL_CSR_EXIT; } - printf("Timer ends \n"); - t = clock() - t; - double time_taken = ((double)t)/CLOCKS_PER_SEC; // calculate the elapsed time - printf("Tracing took %f seconds to execute\n", time_taken); - - float *rgba_test = (float *)csr_malloc( 1024*1024*sizeof(float)*3 ); - - for( int i = 0; i < 1024*1024; i ++ ) + if( csr_opt( 'h' ) || csr_long_opt( "help" ) ) + { + // Display help + printf + ( + "csRadar Copyright (C) 2021 Harry Godden (hgn)\n" + "\n" + "Usage: ./csRadar map.vmf -g \"/gamedir/gameinfo.txt\" layout cover\n" + " VMF file is first, then any other arguments (eg. layout, cover), will specify\n" + " visgroups to be rendered into individual files\n" + " No visgroups specified will simply draw everything\n" + "\n" + "Options:\n" + " -g Required if you are loading models\n" + " -r 1024 Output resolution\n" + " -o Specify output name/path (no extension, dir must exist)\n" + " -e Same as default arg, but instead filters for entity class\n" + " --padding=128 When cropping radar, add padding units to border\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" + ); + + goto IL_CSR_EXIT; + } + } + + if( api.num_strings ) + { + if( gameinfo ) { - rgba_test[i*3+0] = image[i].qa; - rgba_test[i*3+1] = image[i].qb; - rgba_test[i*3+2] = image[i].depth; + fs_set_gameinfo( gameinfo ); } + + // Path handling + if( !output_set ) + { + strcpy( api.output_path, api.strings[0].str ); + csr_stripext( api.output_path ); + } + + strcpy( api.vmf_name, csr_filename( api.output_path ) ); + strcpy( api.vmf_folder, api.output_path ); + csr_downlvl( api.vmf_folder ); - csr_32f_write( "hello.pfm", 1024, 1024, rgba_test ); + log_info( "output_path: '%s'\n", api.output_path ); + log_info( "vmf_name: '%s'\n", api.vmf_name ); + log_info( "vmf_folder: '%s'\n", api.vmf_folder ); - free( rgba_test ); - free( image ); + 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; + } - solidgen_to_obj( &solid_main, "hello.obj" ); + if( !extension ) + extension = "csr_substance"; - vdf_free_r( node ); - */ + csr_so ext = csr_libopen( extension ); + + if( ext ) + { + void (*csr_ext_main)(csr_api *); + void (*csr_ext_exit)(csr_api *); + + 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 ) + { + csr_ext_main( &api ); + + // Do other + if( api.write_txt ) + { + char radar_path[512]; + strcpy( radar_path, api.output_path ); + strcat( radar_path, ".txt" ); + csr_write_txt( radar_path, api.vmf_name, &api.target ); + } + + csr_ext_exit( &api ); + } + else + { + csr_liberr(); + } + + csr_libclose( ext ); + } + else + { + csr_liberr(); + } + + vmf_free( api.map ); + } + else + { + log_error( "Could not load VMF\n" ); + } + } + else + { + log_error( "Missing required argument: mapfile\n" ); } + +IL_CSR_EXIT: + fs_exit(); + return 0; }