echo build: csRadar
gcc $flags -rdynamic csRadar.c -o csRadar -lm -ldl
-echo build: ext/csRadarFree.so
-gcc $flags -fpic -shared -o ext/csRadarFree.so ext_csr_free.c -lm
+echo build: ext/csr_substance.so
+gcc $flags -fpic -shared -o ext/csr_substance.so ext_csr_substance.c -lm
{
.padding = 128.f,
.resolution = 1024,
+ .min_z = -INFINITY,
+ .max_z = INFINITY,
.write_txt = 1,
.api_version = csr_api_version,
.sampling_mode = k_EMSAA_RGSS
{
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" ) )
{
" --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"
}
if( !extension )
- extension = "csRadarFree";
+ extension = "csr_substance";
csr_so ext = csr_libopen( extension );
char vmf_name[ 128 ]; // Just the base name eg. my_map
EMSAA sampling_mode;
+ float min_z;
+ float max_z;
+
// Main API interface
vmf_map *map;
csr_target target;
bcc = (v0[0]*vp[1] - vp[0]*v0[1]) * d;
bca = 1.f - bcb - bcc;
- float hit = (tri[0].co[2] * bca + tri[1].co[2] * bcb + tri[2].co[2] * bcc) +16385.f;
+ float hit = tri[0].co[2] * bca + tri[1].co[2] * bcb + tri[2].co[2] * bcc;
+ float hit_depth = hit + 16385.f;
- if( hit > depth[i] )
+ if( hit_depth > depth[i] && hit >= rt->bounds[0][2] && hit <= rt->bounds[1][2] )
{
- depth[i] = hit;
+ depth[i] = hit_depth;
rt->shader->frag( frag+i*rt->shader->stride, tri, bca, bcb, bcc );
}
}
+++ /dev/null
-// Copyright (C) 2021 Harry Godden (hgn)
-
-// Basic buffers-only version of csRadar
-//=======================================================================================================================
-
-#include "csRadar.h"
-
-float min_height = 0.f;
-v4f remapping_range;
-
-// GBuffer shader
-void frag_gbuffer( void *dest, vmf_vert tri[3], float bca, float bcb, float bcc );
-void frag_gbuffer_clear( void *dest );
-
-csr_shader shader_gbuffer =
-{
- .stride = sizeof(float)*8, // (origin) x,y, (actual height) z
- .frag = frag_gbuffer,
- .clear = frag_gbuffer_clear
-};
-
-// Main drawing function
-void draw_buffers( csr_api *api, int bounds_only );
-
-// Extension implementation
-// =========================================================================================================
-
-// API ENTRY
-void csr_ext_main( csr_api *api )
-{
- if( !csr_init( api ) )
- return;
-
- csr_create_target( &api->target, api->resolution, api->resolution, api->sampling_mode, &shader_gbuffer );
- csr_rt_clear( &api->target );
-
- // Compute bounds, collect models
- draw_buffers( api, 1 );
- csr_auto_fit( &api->target, api->padding );
- vmf_load_models( api->map );
-
- min_height = api->target.bounds[0][2];
- v2_copy( api->target.bounds[0], remapping_range );
- v2_sub( api->target.bounds[1], api->target.bounds[0], &remapping_range[2] );
-
- // Draw everything
- draw_buffers( api, 0 );
-}
-
-void csr_ext_exit( csr_api *api )
-{
- csr_rt_free( &api->target );
-}
-
-void draw_buffers( csr_api *api, int bounds_only )
-{
- csr_filter filter = { .compute_bounds_only = bounds_only };
- vmf_map *map = api->map;
-
- if( api->num_strings == 1 )
- {
- // Draw everything
- csr_vmf_render( &api->target, map, map->root, &filter, NULL, NULL );
-
- if( !bounds_only )
- {
- csr_rt_save_buffers( &api->target, api->output_path, "all" );
- csr_rt_save_tga( &api->target, "test_test_test.tga", 3*sizeof(float), 4 );
- }
- }
- else
- {
- // Draw groups
- for( int i = 1; i < api->num_strings; i ++ )
- {
- csr_filter_update_from_strings( &filter, &api->strings[i] );
-
- csr_vmf_render( &api->target, map, map->root, &filter, NULL, NULL );
-
- if( !bounds_only )
- {
- csr_rt_save_buffers( &api->target, api->output_path, api->strings[i].str );
- //csr_rt_save_c32f( ... );
- //csr_rt_save_tga( ... );
-
- // tar_write_dds( ... );
- csr_rt_save_tga( &api->target, "test_test_test.tga", 3*sizeof(float), 4 );
-
- csr_rt_clear( &api->target );
- }
- }
- }
-}
-
-void frag_gbuffer( void *dest, vmf_vert tri[3], float bca, float bcb, float bcc )
-{
- float *dest_colour = (float *)dest;
-
- // Position
- v2_sub( tri[0].origin, remapping_range, dest_colour );
- v2_div( dest_colour, &remapping_range[2], dest_colour );
-
- dest_colour[2] = tri[0].co[2]*bca + tri[1].co[2]*bcb + tri[2].co[2]*bcc;
-
- // Normals
- v3_muls( tri[0].nrm, bca, dest_colour+3 );
- v3_muladds( dest_colour+3, tri[1].nrm, bcb, dest_colour+3 );
- v3_muladds( dest_colour+3, tri[2].nrm, bcc, dest_colour+3 );
-
- v3_muls( dest_colour+3, 0.5f, dest_colour+3 );
- v3_add( (v3f){0.5f,0.5f,0.5f}, dest_colour+3, dest_colour+3 );
-
- // Mask
- dest_colour[6] = 1.f;
-}
-
-void frag_gbuffer_clear( void *dest )
-{
- float *dest_colour = (float *)dest;
- dest_colour[0] = 0.f;
- dest_colour[1] = 0.f;
- dest_colour[2] = min_height;
-
- dest_colour[3] = 0.5f;
- dest_colour[4] = 0.5f;
- dest_colour[5] = 1.0f;
-
- dest_colour[6] = 0.f;
-}
--- /dev/null
+// Copyright (C) 2021 Harry Godden (hgn)
+
+// Basic buffers-only version of csRadar
+//=======================================================================================================================
+
+#include "csRadar.h"
+
+float min_height = 0.f;
+v4f remapping_range;
+
+// GBuffer shader
+void frag_gbuffer( void *dest, vmf_vert tri[3], float bca, float bcb, float bcc );
+void frag_gbuffer_clear( void *dest );
+
+csr_shader shader_gbuffer =
+{
+ .stride = sizeof(float)*8, // (origin) x,y, (actual height) z
+ .frag = frag_gbuffer,
+ .clear = frag_gbuffer_clear
+};
+
+// Main drawing function
+void draw_buffers( csr_api *api, int bounds_only );
+
+// Extension implementation
+// =========================================================================================================
+
+// API ENTRY
+void csr_ext_main( csr_api *api )
+{
+ if( !csr_init( api ) )
+ return;
+
+ csr_create_target( &api->target, api->resolution, api->resolution, api->sampling_mode, &shader_gbuffer );
+ csr_rt_clear( &api->target );
+
+ // Compute bounds, collect models
+ draw_buffers( api, 1 );
+ csr_auto_fit( &api->target, api->padding );
+ vmf_load_models( api->map );
+
+ min_height = api->target.bounds[0][2];
+ v2_copy( api->target.bounds[0], remapping_range );
+ v2_sub( api->target.bounds[1], api->target.bounds[0], &remapping_range[2] );
+
+ api->target.bounds[0][2] = api->min_z;
+ api->target.bounds[1][2] = api->max_z;
+
+ // Draw everything
+ draw_buffers( api, 0 );
+}
+
+void csr_ext_exit( csr_api *api )
+{
+ csr_rt_free( &api->target );
+}
+
+void draw_buffers( csr_api *api, int bounds_only )
+{
+ csr_filter filter = { .compute_bounds_only = bounds_only };
+ vmf_map *map = api->map;
+
+ if( api->num_strings == 1 )
+ {
+ // Draw everything
+ csr_vmf_render( &api->target, map, map->root, &filter, NULL, NULL );
+
+ if( !bounds_only )
+ {
+ csr_rt_save_buffers( &api->target, api->output_path, "all" );
+ csr_rt_save_tga( &api->target, "test_test_test.tga", 3*sizeof(float), 4 );
+ }
+ }
+ else
+ {
+ // Draw groups
+ for( int i = 1; i < api->num_strings; i ++ )
+ {
+ csr_filter_update_from_strings( &filter, &api->strings[i] );
+
+ csr_vmf_render( &api->target, map, map->root, &filter, NULL, NULL );
+
+ if( !bounds_only )
+ {
+ csr_rt_save_buffers( &api->target, api->output_path, api->strings[i].str );
+ //csr_rt_save_c32f( ... );
+ //csr_rt_save_tga( ... );
+
+ // tar_write_dds( ... );
+ csr_rt_save_tga( &api->target, "test_test_test.tga", 3*sizeof(float), 4 );
+
+ csr_rt_clear( &api->target );
+ }
+ }
+ }
+}
+
+void frag_gbuffer( void *dest, vmf_vert tri[3], float bca, float bcb, float bcc )
+{
+ float *dest_colour = (float *)dest;
+
+ // Position
+ v2_sub( tri[0].origin, remapping_range, dest_colour );
+ v2_div( dest_colour, &remapping_range[2], dest_colour );
+
+ dest_colour[2] = tri[0].co[2]*bca + tri[1].co[2]*bcb + tri[2].co[2]*bcc;
+
+ // Normals
+ v3_muls( tri[0].nrm, bca, dest_colour+3 );
+ v3_muladds( dest_colour+3, tri[1].nrm, bcb, dest_colour+3 );
+ v3_muladds( dest_colour+3, tri[2].nrm, bcc, dest_colour+3 );
+
+ v3_muls( dest_colour+3, 0.5f, dest_colour+3 );
+ v3_add( (v3f){0.5f,0.5f,0.5f}, dest_colour+3, dest_colour+3 );
+
+ // Mask
+ dest_colour[6] = 1.f;
+}
+
+void frag_gbuffer_clear( void *dest )
+{
+ float *dest_colour = (float *)dest;
+ dest_colour[0] = 0.f;
+ dest_colour[1] = 0.f;
+ dest_colour[2] = min_height;
+
+ dest_colour[3] = 0.5f;
+ dest_colour[4] = 0.5f;
+ dest_colour[5] = 1.0f;
+
+ dest_colour[6] = 0.f;
+}