first windows distributions
[convexer.git] / cxr / cxr.h
index c3f7d868d71262110ce28bb89089e4f2c0a8cb28..0585f1a240bcc66165bb3a1081844734eab2a04a 100644 (file)
--- a/cxr/cxr.h
+++ b/cxr/cxr.h
@@ -1,11 +1,13 @@
 /*
-                              CONVEXER v0.91
+                              CONVEXER v0.95
 
                A GNU/Linux-first Source1 Hammer replacement
                     built with Blender, for mapmakers
 
                   Copyright (C) 2022 Harry Godden (hgn)
 
+LICENSE: GPLv3.0, please see COPYING and LICENSE for more information
+
    Features:
       - Brush decomposition into convex pieces for well defined geometry
       - Freely form displacements without limits
@@ -99,6 +101,7 @@ typedef struct cxr_tri_mesh cxr_tri_mesh;
 #ifdef CXR_VALVE_MAP_FILE
  typedef struct cxr_vdf cxr_vdf;
  typedef struct cxr_texinfo cxr_texinfo;
+ typedef struct cxr_visgroup cxr_visgroup;
  typedef struct cxr_vmf_context cxr_vmf_context;
 #endif /* CXR_VALVE_MAP_FILE */
 
@@ -242,6 +245,11 @@ struct cxr_texinfo
    double winding;
 };
 
+struct cxr_visgroup
+{
+   const char *name;
+};
+
 /* 
  * Simplified VDF writing interface. No allocations or nodes, just write to file
  */
@@ -259,10 +267,14 @@ struct cxr_vmf_context
               *detailvbsp,
               *detailmaterial;
 
+   cxr_visgroup *visgroups;
+   i32 visgroup_count;
+
    /* Transform settings */
    double scale;
    v3f offset;
-   i32 lightmap_scale;
+   i32 lightmap_scale,
+       visgroupid;
 
    /* Current stats */
    i32 brush_count,
@@ -280,7 +292,8 @@ enum cxr_soliderr
    k_soliderr_degenerate_implicit,
    k_soliderr_non_coplanar_vertices,
    k_soliderr_non_convex_poly,
-   k_soliderr_bad_result
+   k_soliderr_bad_result,
+   k_soliderr_invalid_input
 };
 
 /*
@@ -292,6 +305,13 @@ enum cxr_soliderr
   const char *cxr_build_time = __DATE__ " @" __TIME__;
  #endif
 
+#if _WIN32 || _WIN64
+#if _WIN64
+#else
+#warning 32 bit is not supported in blender 3.0
+#endif
+#endif
+
 static void (*cxr_log_func)(const char *str);
 static void (*cxr_line_func)( v3f p0, v3f p1, v4f colour );
 
@@ -2278,6 +2298,16 @@ CXR_API void cxr_free_tri_mesh( cxr_tri_mesh *mesh )
 
 CXR_API cxr_world *cxr_decompose( cxr_static_mesh *src, i32 *perrcode )
 {
+   /* Make sure data is in the mesh and isn't empty */
+   if( !src->edge_count || !src->loop_count || !src->poly_count )
+   {
+      cxr_log( "Error %d\n", k_soliderr_invalid_input );
+      if( perrcode )
+         *perrcode = k_soliderr_invalid_input;
+
+      return NULL;
+   }
+
    u32 error = 0x00;
    cxr_world *world = malloc( sizeof(*world) );
    
@@ -2949,6 +2979,8 @@ static int cxr_write_disp( cxr_mesh *mesh, cxr_world *world,
 
             if( !newvert )
             {
+               free( graph );
+               free( vertinfo );
                return 0;
             }
          }
@@ -3011,9 +3043,6 @@ static int cxr_write_disp( cxr_mesh *mesh, cxr_world *world,
                   }
                }
 
-#ifdef CXR_DEBUG
-               cxr_log( "Broken displacement!\n" );
-#endif
                free( graph );
                free( vertinfo );
                return 0;
@@ -3065,6 +3094,8 @@ static int cxr_write_disp( cxr_mesh *mesh, cxr_world *world,
             v3_muladds( face_center, refn, 1.5, pn );
             v3_muladds( face_center, refv, 1.5, pv );
             v3_muladds( face_center, refu, 1.5, pu );
+
+            v3_muladds( face_center, refn, 2.0, face_center );
          }
 
          /* Create world coordinates */
@@ -3228,7 +3259,8 @@ static int cxr_write_disp( cxr_mesh *mesh, cxr_world *world,
          cxr_vdf_node( output, "editor");
          cxr_vdf_colour255( output, "color", 
                colours_random[cxr_range(ctx->brush_count,8)]);
-
+         
+         cxr_vdf_ki32( output, "visgroupid", ctx->visgroupid );
          cxr_vdf_ki32( output, "visgroupshown",1);
          cxr_vdf_ki32( output, "visgroupautoshown",1);
          cxr_vdf_edon( output );
@@ -3258,6 +3290,15 @@ CXR_API void cxr_begin_vmf( cxr_vmf_context *ctx, cxr_vdf *output )
    cxr_vdf_edon( output );
 
    cxr_vdf_node( output, "visgroups" );
+
+   for( int i=0; i<ctx->visgroup_count; i++ )
+   {
+      cxr_vdf_node( output, "visgroup" );
+      cxr_vdf_kv( output, "name", ctx->visgroups[i].name );
+      cxr_vdf_ki32( output, "visgroupid", i+1 );
+      cxr_vdf_edon( output );
+   }
+
    cxr_vdf_edon( output );
 
    cxr_vdf_node( output, "viewsettings" );
@@ -3303,7 +3344,10 @@ CXR_API void cxr_push_world_vmf( cxr_world *world, cxr_vmf_context *ctx,
 
       if( solid->displacement )
       {
-         cxr_write_disp( solid->pmesh, world, ctx, output );
+         if( !cxr_write_disp( solid->pmesh, world, ctx, output ) )
+         {
+            cxr_log( "Warning: Invalid displacement\n" );
+         }
          continue;
       }
       
@@ -3362,6 +3406,7 @@ CXR_API void cxr_push_world_vmf( cxr_world *world, cxr_vmf_context *ctx,
       cxr_vdf_colour255( output, "color", 
             colours_random[cxr_range(ctx->brush_count,8)]);
 
+      cxr_vdf_ki32( output, "visgroupid", ctx->visgroupid );
       cxr_vdf_ki32( output, "visgroupshown", 1 );
       cxr_vdf_ki32( output, "visgroupautoshown", 1 );
       cxr_vdf_edon( output );