fixed heap-use-after-free in solidgen
[csRadar.git] / csrDraw.h
index 29189a1e9cfd16cc21e10dc6d5367cdcc9627845..f2b007fdd92bd13b0f1b65defa3602916e92fe54 100644 (file)
--- a/csrDraw.h
+++ b/csrDraw.h
@@ -2,6 +2,25 @@ typedef struct csr_frag csr_frag;
 typedef struct csr_target csr_target;
 typedef struct csr_filter csr_filter;
 
+// MSAA patterns
+v2f csr_msaa_1[] =
+{
+       {0.f, 0.f}
+};
+
+v2f csr_msaa_2x2[] =
+{
+       {  0.25f,  0.25f },
+       {  0.25f, -0.25f },
+       { -0.25f, -0.25f },
+       { -0.25f,  0.25f }
+};
+
+v2f csr_msaa_2x2rgss[] =
+{
+
+};
+
 struct csr_frag
 {      
        v3f co;
@@ -81,18 +100,17 @@ void csr_auto_fit( csr_target *rt, float padding )
        dx = rt->bounds[1][0] - rt->bounds[0][0];
        dy = rt->bounds[1][1] - rt->bounds[0][1];
        
-       l = fmaxf( dx, dy );
-       d = l * ( l / dx ) * .5f;
+       l = fmaxf( dx, dy ) * .5f;
                
        cx = (rt->bounds[1][0] + rt->bounds[0][0]) * .5f;
        cy = (rt->bounds[1][1] + rt->bounds[0][1]) * .5f;
 
-       rt->bounds[0][0] = cx - d - padding;
-       rt->bounds[1][0] = cx + d + padding;
-       rt->bounds[0][1] = cy - d - padding;
-       rt->bounds[1][1] = cy + d + padding;
+       rt->bounds[0][0] = cx - l - padding;
+       rt->bounds[1][0] = cx + l + padding;
+       rt->bounds[0][1] = cy - l - padding;
+       rt->bounds[1][1] = cy + l + padding;
        
-       rt->scale = d + padding;
+       rt->scale = l + padding;
        
        csr_update_subsamples( rt );
 }
@@ -203,6 +221,8 @@ void csr_draw( csr_target *rt, vmf_vert *triangles, u32 triangle_count, m4x3f tr
 
        // Derive normal matrix
        m4x3_to_3x3( transform, normal );
+       
+       // NOTE: This isn't strictly necessary since CS:GO only uses uniform scaling.
        m3x3_inv_transpose( normal, normal );
 
        for( u32 i = 0; i < triangle_count; i ++ )
@@ -225,7 +245,6 @@ void draw_vmf_group( csr_target *rt, vmf_map *map, vdf_node *root, csr_filter *f
        m4x3f transform = M4X3_IDENTITY;
        vmf_solid solid;
        vmf_vert tri[3];
-       vdf_node *ent_solid;
        boxf trf_bounds;
 
        u32 group_id = 0;
@@ -265,6 +284,7 @@ void draw_vmf_group( csr_target *rt, vmf_map *map, vdf_node *root, csr_filter *f
                        if( filter_visgroups && !vmf_visgroup_match( brush, group_id ) )
                                continue;
                        
+                       // TODO: heap-use-after-free
                        solidgen_push( &solid, brush );
                }
        }
@@ -326,7 +346,7 @@ void draw_vmf_group( csr_target *rt, vmf_map *map, vdf_node *root, csr_filter *f
                else
                {
                        // Brush entity
-                       if( (ent_solid = vdf_next( ent, "solid", NULL )) )
+                       vdf_foreach( ent, "solid", ent_solid )
                        {
                                solidgen_push( &solid, ent_solid );
                        }