f6b0b85c1044886899aceff646f6686e2e25a607
[csRadar.git] / ext_csr_free.c
1 // Copyright (C) 2021 Harry Godden (hgn)
2
3 // Basic buffers-only version of csRadar
4 //=======================================================================================================================
5
6 #include "csRadar.h"
7
8 // GBuffer shader
9 void frag_gbuffer( void *dest, vmf_vert tri[3], float bca, float bcb, float bcc );
10 void frag_gbuffer_clear( void *dest );
11
12 csr_shader shader_gbuffer =
13 {
14 .stride = sizeof(float)*8, // (origin) x,y, (actual height) z
15 .frag = frag_gbuffer,
16 .clear = frag_gbuffer_clear
17 };
18
19 // Main drawing function
20 void draw_buffers( csr_api *api, int bounds_only );
21
22 // Extension implementation
23 // =========================================================================================================
24
25 // API ENTRY
26 void csr_ext_main( csr_api *api )
27 {
28 if( !csr_init( api ) )
29 return;
30
31 // Setup shader variants
32 if( api->write_origins )
33 {
34 // Use origin fragment variant
35 }
36
37 if( api->write_normals )
38 {
39 // Increase stride
40 }
41
42 csr_create_target( &api->target, api->resolution, api->resolution, api->sampling_mode, &shader_gbuffer );
43 csr_rt_clear( &api->target );
44
45 // Compute bounds, collect models
46 draw_buffers( api, 1 );
47 csr_auto_fit( &api->target, api->padding );
48 vmf_load_models( api->map );
49
50 // Draw everything
51 draw_buffers( api, 0 );
52 }
53
54 void csr_ext_exit( csr_api *api )
55 {
56 csr_rt_free( &api->target );
57 }
58
59 void draw_buffers( csr_api *api, int bounds_only )
60 {
61 csr_filter filter = { .compute_bounds_only = bounds_only };
62 vmf_map *map = api->map;
63
64 if( api->num_strings == 1 )
65 {
66 // Draw everything
67 csr_vmf_render( &api->target, map, map->root, &filter, NULL, NULL );
68
69 if( !bounds_only )
70 {
71 csr_rt_save_buffers( &api->target, api->output_path, "all" );
72 }
73 }
74 else
75 {
76 // Draw groups
77 for( int i = 1; i < api->num_strings; i ++ )
78 {
79 filter.visgroup = api->strings[ i ];
80 csr_vmf_render( &api->target, map, map->root, &filter, NULL, NULL );
81
82 if( !bounds_only )
83 {
84 csr_rt_save_buffers( &api->target, api->output_path, api->strings[i] );
85 //csr_rt_save_c32f( ... );
86 //csr_rt_save_tga( ... );
87
88 // tar_write_dds( ... );
89
90 csr_rt_clear( &api->target );
91 }
92 }
93 }
94 }
95
96 void frag_gbuffer( void *dest, vmf_vert tri[3], float bca, float bcb, float bcc )
97 {
98 float *dest_colour = (float *)dest;
99
100 v3_muls( tri[0].co, bca, dest_colour );
101 v3_muladds( dest_colour, tri[1].co, bcb, dest_colour );
102 v3_muladds( dest_colour, tri[2].co, bcc, dest_colour );
103
104 // TODO: Normal map
105 }
106
107 void frag_gbuffer_clear( void *dest )
108 {
109 float *dest_colour = (float *)dest;
110 v3_zero( dest_colour );
111 }