X-Git-Url: https://harrygodden.com/git/?p=csRadar.git;a=blobdiff_plain;f=csRadar.c;h=9af5cdad09b9ed2b9853338c3312982ab01113a0;hp=9c8c0b4d0f08e8922896ef1911554a2ba8c6e78a;hb=8382aed7f0cdc38bc5c58832d4a15277cf56d4be;hpb=1bdd02062cda9b107c4d66586d3c036ea15f6ae2 diff --git a/csRadar.c b/csRadar.c index 9c8c0b4..9af5cda 100644 --- a/csRadar.c +++ b/csRadar.c @@ -1,132 +1,197 @@ -#include -#include -#include -#include -#include -#include +#define VALVE_IMPLEMENTATION +#define CSR_EXECUTABLE +#include "csRadar.h" -// CSR lib -#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 "csrDraw.h" -#include "csr32f.h" - - -//#include "stretchy_buffer.h" +// gcc -Wall -fsanitize=address csRadar.c -o csRadar -lm 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, + .write_txt = 1, + .api_version = csr_api_version, + .sampling_mode = k_EMSAA_RGSS + }; + + int output_set = 0; + char *extension = 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 ++ ] = arg; + } - vmf_map *map = vmf_init( argv[1], 1 ); + if( (arg = csr_opt_arg( 'o' )) ) + { + strcpy( api.output_path, arg ); + csr_path_winunix( api.output_path ); + + output_set = 1; + } - // TODO: Make init/free codes - csr_target target = + if( (arg = csr_opt_arg( 'g' )) ) { - .x = 1024, .y = 1024, - .fragments = (csr_frag *)csr_malloc( 1024*1024*sizeof(csr_frag) ), - .bounds = { -1000.f, -1000.f, 1000.f, 1000.f } - }; - csr_rt_clear( &target ); + fs_set_gameinfo( arg ); + } - draw_vmf_group( &target, map, map->root, 0, NULL, NULL ); + if( (arg = csr_opt_arg( 'r' )) ) + { + api.resolution = atoi( arg ); + } - float *rgba_test = (float *)csr_malloc( 1024*1024*sizeof(float)*3 ); + if( (arg = csr_long_opt_arg( "padding" )) ) + { + api.padding = atof( arg ); + } - for( int l = 0; l < 1024; l ++ ) + if( (arg = csr_long_opt_arg( "multi-sample" )) ) { - for( int x = 0; x < 1024; x ++ ) + if( !strcmp( arg, "none" )) { - float *dst = &rgba_test[ (l*1024+x)*3 ]; - csr_frag *src = &target.fragments[ ((1023-l)*1024+x) ]; - - dst[0] = src->co[0]; - dst[1] = src->co[1]; - dst[2] = src->co[2]; + 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; } } - csr_32f_write( "hello.pfm", 1024, 1024, rgba_test ); - - free( target.fragments ); - free( rgba_test ); - vmf_free( map ); - fs_exit(); - - /* - vmf_solid solid_main; - - - solidgen_ctx_init( &solid_main ); - - vdf_node *world = vdf_next( node, "world", NULL ); - - vdf_foreach( world, "solid", brush ) + if( (arg = csr_long_opt_arg( "extension" )) ) { - solidgen_push( &solid_main, brush ); + extension = 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\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" + "\n" + " -v --version Display program version\n" + " -h --help Display this help text\n" + ); + + goto IL_CSR_EXIT; + } + } + + if( api.num_strings ) + { + // Path handling + if( !output_set ) { - rgba_test[i*3+0] = image[i].qa; - rgba_test[i*3+1] = image[i].qb; - rgba_test[i*3+2] = image[i].depth; + strcpy( api.output_path, api.strings[0] ); + csr_stripext( api.output_path ); } - csr_32f_write( "hello.pfm", 1024, 1024, rgba_test ); + char *base_name; + if( !(base_name = csr_findext( api.output_path, '/' ) )) + { + base_name = api.output_path; + } - free( rgba_test ); - free( image ); + strcpy( api.vmf_name, base_name ); - solidgen_to_obj( &solid_main, "hello.obj" ); + 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"; - 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 + + 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; }