1 // Copyright (C) 2021 Harry Godden (hgn)
4 // gcc -rdynamic csRadar.c -o csRadar -lm -ldl
7 // gcc -fpic -shared -o ext/my_plugin.so my_plugin.c -lm
9 #define VALVE_IMPLEMENTATION
10 #define CSR_EXECUTABLE
13 int main( int argc
, char *argv
[] )
22 .api_version
= csr_api_version
,
23 .sampling_mode
= k_EMSAA_RGSS
27 char *extension
= NULL
;
28 char *gameinfo
= NULL
;
31 while( csr_argp( argc
, argv
) )
33 if( (arg
= csr_arg()) )
35 if( api
.num_strings
== 20 )
37 log_error( "Too many arguments! Max 20\n" );
41 api
.strings
[ api
.num_strings
++ ].str
= arg
;
44 if( (arg
= csr_opt_arg( 'o' )) )
46 strcpy( api
.output_path
, arg
);
47 csr_path_winunix( api
.output_path
);
52 if( (arg
= csr_opt_arg( 'g' )) )
57 if( (arg
= csr_opt_arg( 'r' )) )
59 api
.resolution
= atoi( arg
);
62 if( (arg
= csr_long_opt_arg( "padding" )) )
64 api
.padding
= atof( arg
);
67 if( (arg
= csr_long_opt_arg( "multi-sample" )) )
69 if( !strcmp( arg
, "none" ))
71 api
.sampling_mode
= k_EMSAA_none
;
73 else if( !strcmp( arg
, "rgss" ))
75 api
.sampling_mode
= k_EMSAA_RGSS
;
77 else if( !strcmp( arg
, "2x" ))
79 api
.sampling_mode
= k_EMSAA_2x2
;
81 else if( !strcmp( arg
, "8r" ))
83 api
.sampling_mode
= k_EMSAA_8R
;
87 log_error( "Invalid sampling pattern '%s'\n", arg
);
92 if( (arg
= csr_long_opt_arg( "extension" )) )
97 if( (arg
= csr_long_opt_arg( "min" )) )
98 api
.min_z
= atof( arg
);
99 if( (arg
= csr_long_opt_arg( "max" )) )
100 api
.max_z
= atof( arg
);
102 if( csr_opt( 'v' ) || csr_long_opt( "version" ) )
104 printf( "csRadar build: %u, api_version: %u\n", csr_build
, csr_api_version
);
108 if( csr_opt( 'h' ) || csr_long_opt( "help" ) )
113 "csRadar Copyright (C) 2021 Harry Godden (hgn)\n"
115 "Usage: ./csRadar map.vmf -g \"/gamedir/gameinfo.txt\" layout cover\n"
116 " VMF file is first, then any other arguments (eg. layout, cover), will specify\n"
117 " visgroups to be rendered into individual files\n"
118 " No visgroups specified will simply draw everything\n"
121 " -g <gameinfo.txt path> Required if you are loading models\n"
122 " -r 1024 Output resolution\n"
123 " -o <output> Specify output name/path\n"
124 " -e <classname> Same as default arg, but instead filters for entity class\n"
125 //" -s <height> Add a vertical split at this height\n"
126 " --padding=128 When cropping radar, add padding units to border\n"
127 //" --standard-layers Use standard TAR layers/groups\n"
128 " --no-txt Don't create matching radar txt\n"
129 " --multi-sample=RGSS [ none, 2x, rgss, 8r ]\n"
130 " --extension=TAR Use an extension binary instead\n"
131 " --min=z Miniumum height to render\n"
132 " --max=z Maxiumum height to render\n"
134 " -v --version Display program version\n"
135 " -h --help Display this help text\n"
142 if( api
.num_strings
)
146 fs_set_gameinfo( gameinfo
);
152 strcpy( api
.output_path
, api
.strings
[0].str
);
153 csr_stripext( api
.output_path
);
157 if( !(base_name
= csr_findext( api
.output_path
, '/' ) ))
159 base_name
= api
.output_path
;
162 strcpy( api
.vmf_name
, base_name
);
164 log_info( "output_path: '%s'\n", api
.output_path
);
165 log_info( "vmf_name: '%s'\n", api
.vmf_name
);
167 api
.map
= vmf_init( api
.strings
[0].str
);
170 // Update arg inferred types
171 api
.strings
[0].type
= k_iftype_vmf
;
172 for( int i
= 1; i
< api
.num_strings
; i
++ )
174 if( vmf_visgroup_id( api
.map
->root
, api
.strings
[i
].str
) != -1 )
175 api
.strings
[i
].type
= k_iftype_visgroup
;
177 api
.strings
[i
].type
= k_iftype_classname
;
181 extension
= "csr_substance";
183 csr_so ext
= csr_libopen( extension
);
187 void (*csr_ext_main
)(csr_api
*);
188 void (*csr_ext_exit
)(csr_api
*);
190 csr_ext_main
= csr_get_proc( ext
, "csr_ext_main" );
191 csr_ext_exit
= csr_get_proc( ext
, "csr_ext_exit" );
193 if( csr_ext_main
&& csr_ext_exit
)
195 csr_ext_main( &api
);
199 csr_ext_exit( &api
);
217 log_error( "Could not load VMF\n" );
222 log_error( "Missing required argument: mapfile\n" );