Quellcode durchsuchen

Add vheight documentation;
Add a missing vheight case;
Add STBVOX_CONFIG_VHEIGHT_IN_LIGHTING;
Fix broken STBVOX_CONFIG_ROTATION_IN_LIGHTING that was broken when I incompletely refactored the #define

Sean Barrett vor 10 Jahren
Ursprung
Commit
e2b645e4d7
3 geänderte Dateien mit 149 neuen und 38 gelöschten Zeilen
  1. 147 36
      stb_voxel_render.h
  2. 1 1
      tests/caveview/cave_mesher.c
  3. 1 1
      tests/caveview/caveview.h

+ 147 - 36
stb_voxel_render.h

@@ -1,4 +1,4 @@
-// stb_voxel_render.h - v0.79 - Sean Barrett, 2015 - public domain
+// stb_voxel_render.h - v0.80 - Sean Barrett, 2015 - public domain
 //
 //
 // This library helps render large-scale "voxel" worlds for games,
 // This library helps render large-scale "voxel" worlds for games,
 // in this case, one with blocks that can have textures and that
 // in this case, one with blocks that can have textures and that
@@ -146,10 +146,11 @@
 //
 //
 //     Because there is so much per-vertex and per-face data possible
 //     Because there is so much per-vertex and per-face data possible
 //     in the output, and each voxel can have 6 faces and 8 vertices, it
 //     in the output, and each voxel can have 6 faces and 8 vertices, it
-//     would require an impossibly large data structure to describe all
-//     of the possibilities. Instead, the API provides multiple ways
-//     to express each property; each such way has some limitations on
-//     what it can express.
+//     would require an very large data structure to describe all
+//     of the possibilities, and this would cause the mesh-creation
+//     process to be slow. Instead, the API provides multiple ways
+//     to express each property, some more compact, others less so;
+//     each such way has some limitations on what it can express.
 //
 //
 //     Note that there are so many paths and combinations, not all of them
 //     Note that there are so many paths and combinations, not all of them
 //     have been tested. Just report bugs and I'll fix 'em.
 //     have been tested. Just report bugs and I'll fix 'em.
@@ -159,28 +160,30 @@
 //     See the API documentation in the header-file section.
 //     See the API documentation in the header-file section.
 //
 //
 //
 //
-// HISTORICAL FOUNDATION
-//
-//   zmc engine         96-byte quads   2011/10
-//   zmc engine         32-byte quads   2013/12
-//   stb_voxel_render   20-byte quads   2015/01
-//
-//
 // CONTRIBUTORS
 // CONTRIBUTORS
 //
 //
 //   Features             Porting            Bugfixes & Warnings
 //   Features             Porting            Bugfixes & Warnings
 //  Sean Barrett                          github:r-leyh   Jesus Fernandez
 //  Sean Barrett                          github:r-leyh   Jesus Fernandez
 //                                        Miguel Lechon   github:Arbeiterunfallversicherungsgesetz
 //                                        Miguel Lechon   github:Arbeiterunfallversicherungsgesetz
+//                                        Thomas Frase
 //
 //
 // VERSION HISTORY
 // VERSION HISTORY
 //
 //
-//   0.79   fix the missing types from 0.78; fix string constants being const
-//   0.78   bad "#else", compile as C++
-//   0.77   documentation tweaks, rename config var to STB_VOXEL_RENDER_STATIC
-//   0.76   typos, signed/unsigned shader issue, more documentation
-//   0.75   initial release
+//   0.80   (2015-04-11)  fix broken STBVOX_CONFIG_ROTATION_IN_LIGHTING refactoring;
+//                        add STBVOX_CONFIG_VHEIGHT_IN_LIGHTING and other vheight fixes;
+//                        added documentation for vheight ("weird slopes")
+//   0.79   (2015-04-01)  fix the missing types from 0.78; fix string constants being const
+//   0.78   (2015-04-02)  bad "#else", compile as C++
+//   0.77   (2015-04-01)  documentation tweaks, rename config var to STB_VOXEL_RENDER_STATIC
+//   0.76   (2015-04-01)  typos, signed/unsigned shader issue, more documentation
+//   0.75   (2015-04-01)  initial release
 //
 //
 //
 //
+// HISTORICAL FOUNDATION
+//
+//   stb_voxel_render   20-byte quads   2015/01
+//   zmc engine         32-byte quads   2013/12
+//   zmc engine         96-byte quads   2011/10
 
 
 #ifndef INCLUDE_STB_VOXEL_RENDER_H
 #ifndef INCLUDE_STB_VOXEL_RENDER_H
 #define INCLUDE_STB_VOXEL_RENDER_H
 #define INCLUDE_STB_VOXEL_RENDER_H
@@ -279,6 +282,11 @@ extern "C" {
 //        Changes the meaning of the 'lighting' mesher input variable to also
 //        Changes the meaning of the 'lighting' mesher input variable to also
 //        store the rotation; see later discussion.
 //        store the rotation; see later discussion.
 //
 //
+//    STBVOX_CONFIG_VHEIGHT_IN_LIGHTING
+//        Changes the meaning of the 'lighting' mesher input variable to also
+//        store the vheight; see later discussion. Cannot use both this and
+//        the previous variable.
+//
 //    STBVOX_CONFIG_PREMULTIPLIED_ALPHA
 //    STBVOX_CONFIG_PREMULTIPLIED_ALPHA
 //        Adjusts the shader calculations on the assumption that tex1.rgba,
 //        Adjusts the shader calculations on the assumption that tex1.rgba,
 //        tex2.rgba, and color.rgba all use premultiplied values, and that
 //        tex2.rgba, and color.rgba all use premultiplied values, and that
@@ -293,7 +301,6 @@ extern "C" {
 //        when alpha testing).
 //        when alpha testing).
 //
 //
 
 
-
 //////////////////////////////////////////////////////////////////////////////
 //////////////////////////////////////////////////////////////////////////////
 //
 //
 // MESHING
 // MESHING
@@ -671,6 +678,11 @@ typedef struct
 
 
 // This is the data structure you fill out. Most of the arrays can be
 // This is the data structure you fill out. Most of the arrays can be
 // NULL, except when one is required to get the value to index another.
 // NULL, except when one is required to get the value to index another.
+//
+// The compass system used in the following descriptions is:
+//     east means increasing x
+//     north means increasing y
+//     up means increasing z
 struct stbvox_input_description
 struct stbvox_input_description
 {
 {
    unsigned char lighting_at_vertices;
    unsigned char lighting_at_vertices;
@@ -697,19 +709,20 @@ struct stbvox_input_description
    // The raw lighting values are defined at the center of blocks
    // The raw lighting values are defined at the center of blocks
    // (or at vertex if 'lighting_at_vertices' is true).
    // (or at vertex if 'lighting_at_vertices' is true).
    //
    //
-   // If the macro STBVOX_ROTATION_IN_LIGHTING is defined,
+   // If the macro STBVOX_CONFIG_ROTATION_IN_LIGHTING is defined,
    // then an additional 2-bit block rotation value is stored
    // then an additional 2-bit block rotation value is stored
    // in this field as well.
    // in this field as well.
    //
    //
    // Encode with STBVOX_MAKE_LIGHTING(lighting,rot)--here
    // Encode with STBVOX_MAKE_LIGHTING(lighting,rot)--here
    // 'lighting' should still be 8 bits, as the macro will
    // 'lighting' should still be 8 bits, as the macro will
-   // discard the bottom bits automatically.
+   // discard the bottom bits automatically. Similarly, if
+   // using STBVOX_CONFIG_VHEIGHT_IN_LIGHTING, encode with
+   // STBVOX_MAKE_LIGHTING(lighting,vheight).
    //
    //
-   // (Rationale: rotation needs to
-   // be independent of blocktype, but is only 2 bits so
-   // doesn't want to be its own array. Lighting is the one
-   // thing that was likely to already be in use and that
-   // I could easily steal 2 bits from.)
+   // (Rationale: rotation needs to be independent of blocktype,
+   // but is only 2 bits so doesn't want to be its own array.
+   // Lighting is the one thing that was likely to already be
+   // in use and that I could easily steal 2 bits from.)
 
 
    stbvox_block_type *blocktype;
    stbvox_block_type *blocktype;
    // Indexed by 3D coordinate. This is a core "block type" value, which is used
    // Indexed by 3D coordinate. This is a core "block type" value, which is used
@@ -950,12 +963,92 @@ struct stbvox_input_description
 // cache efficiency
 // cache efficiency
 
 
 
 
+//////////////////////////////////////////////////////////////////////////////
+//
+//  VHEIGHT DOCUMENTATION
+//
+
 enum
 enum
 {
 {
    STBVOX_VERTEX_HEIGHT_0,
    STBVOX_VERTEX_HEIGHT_0,
    STBVOX_VERTEX_HEIGHT_half,
    STBVOX_VERTEX_HEIGHT_half,
    STBVOX_VERTEX_HEIGHT_1,
    STBVOX_VERTEX_HEIGHT_1,
+   STBVOX_VERTEX_HEIGHT_one_and_a_half,
 };
 };
+// These are the "vheight" values. Vheight stands for "vertex height".
+// The idea is that for a "floor vheight" block, you take a cube and
+// reposition the top-most vertices at various heights as specified by
+// the vheight values. Similarly, a "ceiling vheight" block takes a
+// cube and repositions the bottom-most vertices.
+//
+// A floor block only adjusts the top four vertices; the bottom four vertices
+// remain at the bottom of the block. The height values are 2 bits,
+// measured in halves of a block; so you can specify heights of 0/2,
+// 1/2, 2/2, or 3/2. 0 is the bottom of the block, 1 is halfway
+// up the block, 2 is the top of the block, and 3 is halfway up the
+// next block (and actually outside of the block). The value 3 is
+// actually legal, and allows you to:
+//
+//     (A) allows smoother terrain by having slopes that cross blocks,
+//         e.g. (1,1,3,3) is a regular-seeming slope halfway between blocks
+//     (B) make slopes steeper than 45-degrees, e.g. (0,0,3,3)
+//
+// (Because only z coordinates have half-block precision, and x&y are
+// limited to block corner precision, it's not possible to make these
+// things "properly" out of blocks, e.g. a half-slope block on its side
+// or a sloped block halfway between blocks that's made out of two blocks.)
+//
+// If you define STBVOX_CONFIG_OPTIMIZED_VHEIGHT, then the top face
+// (or bottom face for a ceiling vheight block) will be drawn as a
+// single quad even if the four vertex heights aren't planar, and a
+// single normal will be used over the entire quad. If you
+// don't define it, then if the top face is non-planar, it will be
+// split into two triangles, each with their own normal/lighting.
+// (Note that since all output from stb_voxel_render is quad meshes,
+// triangles are actually rendered as degenerate quads.) In this case,
+// the distinction betwen STBVOX_GEOM_floor_vheight_03 and
+// STBVOX_GEOM_floor_vheight_12 comes into play; the former introduces
+// an edge from the SW to NE corner (i.e. from <0,0,?> to <1,1,?>),
+// while the latter introduces an edge from the NW to SE corner
+// (i.e. from <0,1,?> to <1,0,?>.) For a "lazy mesh" look, use
+// exclusively _03 or _12. For a "classic mesh" look, alternate
+// _03 and _12 in a checkerboard pattern. For a "smoothest surface"
+// look, choose the edge based on actual vertex heights.
+//
+// The four vertex heights can come from several places. The simplest
+// encoding is to just use the 'vheight' parameter which stores four
+// explicit vertex heights for every block. This allows total indepdence,
+// but at the cost of the most memory usage. Encode this with
+// STBVOX_MAKE_VHEIGHT(vh_sw, vh_se, vh_nw, vh_ne). These coordinates
+// are absolute, not affected by block rotations.
+//
+// An alternative if you just want to encode some very specific block
+// types, not all the possibilities--say you just want half-height slopes,
+// so you want (0,0,1,1) and (1,1,2,2)--then you can use block_vheight
+// to specify them. The geometry rotation will cause block_vheight values
+// to be rotated (because it's as if you're just defining a type of
+// block). This value is also encoded with STBVOX_MAKE_VHEIGHT.
+//
+// If you want to save memory and you're creating a "continuous ground"
+// sort of effect, you can make each vertex of the lattice share the
+// vheight value; that is, two adjacent blocks that share a vertex will
+// always get the same vheight value for that vertex. Then you need to
+// store two bits of vheight for every block, which you do by storing it
+// as part another data structure. Store the south-west vertex's vheight
+// with the block. You can either use the "geometry" mesh variable (it's
+// a parameter to STBVOX_MAKE_GEOMETRY) or you can store it in the
+// "lighting" mesh variable if you defined STBVOX_CONFIG_VHEIGHT_IN_LIGHTING,
+// using STBVOX_MAKE_LIGHTING(lighting,vheight).
+//
+// Note that if you start with a 2D height map and generate vheight data from
+// it, you don't necessarily store only one value per (x,y) coordinate,
+// as the same value may need to be set up at multiple z heights. For
+// example, if height(8,8) = 13.5, then you want the block at (8,8,13)
+// to store STBVOX_VERTEX_HEIGHT_half, and this will be used by blocks
+// at (7,7,13), (8,7,13), (7,8,13), and (8,8,13). However, if you're
+// allowing steep slopes, it might be the case that you have a block
+// at (7,7,12) which is supposed to stick up to 13.5; that means
+// you also need to store STBVOX_VERTEX_HEIGHT_one_and_a_half at (8,8,12).
 
 
 enum
 enum
 {
 {
@@ -1009,7 +1102,7 @@ enum
 #define STBVOX_MAKE_TEXLERP_VERT3(e,n,w,s,u)   ((e)+(n)*8+(w)*64+(s)*512+(u)*4096)
 #define STBVOX_MAKE_TEXLERP_VERT3(e,n,w,s,u)   ((e)+(n)*8+(w)*64+(s)*512+(u)*4096)
 #define STBVOX_MAKE_TEXLERP_FACE3(e,n,w,s,u,d) ((e)+(n)*8+(w)*64+(s)*512+(u)*4096+(d)*16384)
 #define STBVOX_MAKE_TEXLERP_FACE3(e,n,w,s,u,d) ((e)+(n)*8+(w)*64+(s)*512+(u)*4096+(d)*16384)
 
 
-#ifdef STBVOX_ROTATION_IN_LIGHTING
+#if defined(STBVOX_CONFIG_ROTATION_IN_LIGHTING) || defined(STBVOX_CONFIG_VHEIGHT_IN_LIGHTING)
 #define STBVOX_MAKE_LIGHTING(lighting, rot)  (((lighting)&~3)+(rot))
 #define STBVOX_MAKE_LIGHTING(lighting, rot)  (((lighting)&~3)+(rot))
 #else
 #else
 #define STBVOX_MAKE_LIGHTING(lighting)       (lighting)
 #define STBVOX_MAKE_LIGHTING(lighting)       (lighting)
@@ -1064,6 +1157,7 @@ struct stbvox_mesh_maker
 #include <assert.h>
 #include <assert.h>
 #include <string.h> // memset
 #include <string.h> // memset
 
 
+// have to use our own names to avoid the _MSC_VER path having conflicting type names
 #ifndef _MSC_VER
 #ifndef _MSC_VER
    #include <stdint.h>
    #include <stdint.h>
    typedef uint16_t stbvox_uint16;
    typedef uint16_t stbvox_uint16;
@@ -1085,6 +1179,11 @@ struct stbvox_mesh_maker
 #error "Must defined STBVOX_CONFIG_MODE to select the mode"
 #error "Must defined STBVOX_CONFIG_MODE to select the mode"
 #endif
 #endif
 
 
+#if defined(STBVOX_CONFIG_ROTATION_IN_LIGHTING) && defined(STBVOX_CONFIG_VHEIGHT_IN_LIGHTING)
+#error "Can't store both rotation and vheight in lighting"
+#endif
+
+
 // The following are candidate voxel modes. Only modes 0, 1, and 20 are
 // The following are candidate voxel modes. Only modes 0, 1, and 20 are
 // currently implemented. Reducing the storage-per-quad further
 // currently implemented. Reducing the storage-per-quad further
 // shouldn't improve performance, although obviously it allow you
 // shouldn't improve performance, although obviously it allow you
@@ -2261,7 +2360,7 @@ static unsigned char stbvox_rotate_vertex[8][4] =
    { 7,6,4,5 }, // zyx=111
    { 7,6,4,5 }, // zyx=111
 };
 };
 
 
-#ifdef STBVOX_OPTIMIZED_VHEIGHT
+#ifdef STBVOX_CONFIG_OPTIMIZED_VHEIGHT
 // optimized vheight generates a single normal over the entire face, even if it's not planar
 // optimized vheight generates a single normal over the entire face, even if it's not planar
 static unsigned char stbvox_optimized_face_up_normal[4][4][4][4] =
 static unsigned char stbvox_optimized_face_up_normal[4][4][4][4] =
 {
 {
@@ -2593,7 +2692,7 @@ void stbvox_make_mesh_for_face(stbvox_mesh_maker *mm, stbvox_rotate rot, int fac
          } else {
          } else {
             unsigned char *amb = &mm->input.lighting[v_off];
             unsigned char *amb = &mm->input.lighting[v_off];
             int i,j;
             int i,j;
-            #ifdef STBVOX_ROTATION_IN_LIGHTING
+            #if defined(STBVOX_CONFIG_ROTATION_IN_LIGHTING) || defined(STBVOX_CONFIG_VHEIGHT_IN_LIGHTING)
             #define STBVOX_GET_LIGHTING(light) ((light) & ~3)
             #define STBVOX_GET_LIGHTING(light) ((light) & ~3)
             #define STBVOX_LIGHTING_ROUNDOFF   8
             #define STBVOX_LIGHTING_ROUNDOFF   8
             #else
             #else
@@ -2636,7 +2735,7 @@ void stbvox_make_mesh_for_face(stbvox_mesh_maker *mm, stbvox_rotate rot, int fac
    }
    }
 }
 }
 
 
-#ifndef STBVOX_OPTIMIZED_VHEIGHT
+#ifndef STBVOX_CONFIG_OPTIMIZED_VHEIGHT
 // get opposite-facing normal & texgen for opposite face, used to map up-facing vheight data to down-facing data
 // get opposite-facing normal & texgen for opposite face, used to map up-facing vheight data to down-facing data
 static unsigned char stbvox_reverse_face[STBVF_count] =
 static unsigned char stbvox_reverse_face[STBVF_count] =
 {
 {
@@ -2721,7 +2820,7 @@ static void stbvox_make_mesh_for_block(stbvox_mesh_maker *mm, stbvox_pos pos, in
       return;
       return;
    }
    }
 
 
-   #ifdef STBVOX_ROTATION_IN_LIGHTING
+   #ifdef STBVOX_CONFIG_ROTATION_IN_LIGHTING
    simple_rot = mm->input.lighting[v_off] & 3;
    simple_rot = mm->input.lighting[v_off] & 3;
    #endif
    #endif
 
 
@@ -2798,7 +2897,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
       ngeo[4] = mm->input.geometry[v_off +      1];
       ngeo[4] = mm->input.geometry[v_off +      1];
       ngeo[5] = mm->input.geometry[v_off -      1];
       ngeo[5] = mm->input.geometry[v_off -      1];
 
 
-      #ifndef STBVOX_ROTATION_IN_LIGHTING
+      #ifndef STBVOX_CONFIG_ROTATION_IN_LIGHTING
       rot = (geo >> 4) & 3;
       rot = (geo >> 4) & 3;
       geo &= 15;
       geo &= 15;
       for (i=0; i < 6; ++i) {
       for (i=0; i < 6; ++i) {
@@ -2814,7 +2913,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
       for (i=0; i < 6; ++i)
       for (i=0; i < 6; ++i)
          ngeo[i] = mm->input.block_geometry[nbt[i]];
          ngeo[i] = mm->input.block_geometry[nbt[i]];
       if (mm->input.selector) {
       if (mm->input.selector) {
-         #ifndef STBVOX_ROTATION_IN_LIGHTING
+         #ifndef STBVOX_CONFIG_ROTATION_IN_LIGHTING
          rot     = (mm->input.selector[v_off         ] >> 4) & 3;
          rot     = (mm->input.selector[v_off         ] >> 4) & 3;
          nrot[0] = (mm->input.selector[v_off + ew_off] >> 4) & 3;
          nrot[0] = (mm->input.selector[v_off + ew_off] >> 4) & 3;
          nrot[1] = (mm->input.selector[v_off + ns_off] >> 4) & 3;
          nrot[1] = (mm->input.selector[v_off + ns_off] >> 4) & 3;
@@ -2824,7 +2923,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
          nrot[5] = (mm->input.selector[v_off -      1] >> 4) & 3;
          nrot[5] = (mm->input.selector[v_off -      1] >> 4) & 3;
          #endif
          #endif
       } else {
       } else {
-         #ifndef STBVOX_ROTATION_IN_LIGHTING
+         #ifndef STBVOX_CONFIG_ROTATION_IN_LIGHTING
          rot = (geo>>4)&3;
          rot = (geo>>4)&3;
          geo &= 15;
          geo &= 15;
          for (i=0; i < 6; ++i) {
          for (i=0; i < 6; ++i) {
@@ -2835,7 +2934,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
       }
       }
    }
    }
 
 
-   #ifdef STBVOX_ROTATION_IN_LIGHTING
+   #ifdef STBVOX_CONFIG_ROTATION_IN_LIGHTING
    rot = mm->input.lighting[v_off] & 3;
    rot = mm->input.lighting[v_off] & 3;
    nrot[0] = (mm->input.lighting[v_off + ew_off]) & 3;
    nrot[0] = (mm->input.lighting[v_off + ew_off]) & 3;
    nrot[1] = (mm->input.lighting[v_off + ns_off]) & 3;
    nrot[1] = (mm->input.lighting[v_off + ns_off]) & 3;
@@ -3000,6 +3099,12 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
       int extreme;
       int extreme;
 
 
       // extract the heights
       // extract the heights
+      #ifdef STBVOX_CONFIG_VHEIGHT_IN_LIGHTING
+      ht[0] = mm->input.lighting[v_off              ] & 3;
+      ht[1] = mm->input.lighting[v_off+ew_off       ] & 3;
+      ht[2] = mm->input.lighting[v_off       +ns_off] & 3;
+      ht[3] = mm->input.lighting[v_off+ew_off+ns_off] & 3;
+      #else
       if (mm->input.vheight) {
       if (mm->input.vheight) {
          unsigned char v =  mm->input.vheight[v_off];
          unsigned char v =  mm->input.vheight[v_off];
          ht[0] = (v >> 0) & 3;
          ht[0] = (v >> 0) & 3;
@@ -3018,9 +3123,15 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
 
 
          for (i=0; i < 4; ++i)
          for (i=0; i < 4; ++i)
             ht[i] = raw[stbvox_rotate_vertex[i][rot]];
             ht[i] = raw[stbvox_rotate_vertex[i][rot]];
+      } else if (mm->input.geometry) {
+         ht[0] = mm->input.geometry[v_off              ] >> 6;
+         ht[1] = mm->input.geometry[v_off+ew_off       ] >> 6;
+         ht[2] = mm->input.geometry[v_off       +ns_off] >> 6;
+         ht[3] = mm->input.geometry[v_off+ew_off+ns_off] >> 6;
       } else {
       } else {
          assert(0);
          assert(0);
       }
       }
+      #endif
 
 
       // flag whether any sides go off the top of the block, which means
       // flag whether any sides go off the top of the block, which means
       // our visible_faces test was wrong
       // our visible_faces test was wrong
@@ -3072,7 +3183,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
             // flat
             // flat
             stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_up  , v_off, pos, basevert, vmesh[STBVOX_FACE_up], mesh, STBVOX_FACE_up);
             stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_up  , v_off, pos, basevert, vmesh[STBVOX_FACE_up], mesh, STBVOX_FACE_up);
          else {
          else {
-         #ifndef STBVOX_OPTIMIZED_VHEIGHT
+         #ifndef STBVOX_CONFIG_OPTIMIZED_VHEIGHT
             // check if it's non-planar
             // check if it's non-planar
             if (cube[5] + cube[6] != cube[4] + cube[7]) {
             if (cube[5] + cube[6] != cube[4] + cube[7]) {
                // not planar, split along diagonal and make degenerate quads
                // not planar, split along diagonal and make degenerate quads
@@ -3092,7 +3203,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
             // flat
             // flat
             stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_down, v_off, pos, basevert, vmesh[STBVOX_FACE_down], mesh, STBVOX_FACE_down);
             stbvox_make_mesh_for_face(mm, rotate, STBVOX_FACE_down, v_off, pos, basevert, vmesh[STBVOX_FACE_down], mesh, STBVOX_FACE_down);
          else {
          else {
-         #ifndef STBVOX_OPTIMIZED_VHEIGHT
+         #ifndef STBVOX_CONFIG_OPTIMIZED_VHEIGHT
             // check if it's non-planar
             // check if it's non-planar
             if (cube[1] + cube[2] != cube[0] + cube[3]) {
             if (cube[1] + cube[2] != cube[0] + cube[3]) {
                // not planar, split along diagonal and make degenerate quads
                // not planar, split along diagonal and make degenerate quads

+ 1 - 1
tests/caveview/cave_mesher.c

@@ -26,7 +26,7 @@
 //#define STBVOX_CONFIG_TEX1_EDGE_CLAMP
 //#define STBVOX_CONFIG_TEX1_EDGE_CLAMP
 #define STBVOX_CONFIG_DISABLE_TEX2
 #define STBVOX_CONFIG_DISABLE_TEX2
 
 
-#define STBVOX_ROTATION_IN_LIGHTING
+#define STBVOX_CONFIG_ROTATION_IN_LIGHTING
 #define STB_VOXEL_RENDER_IMPLEMENTATION
 #define STB_VOXEL_RENDER_IMPLEMENTATION
 #include "stb_voxel_render.h"
 #include "stb_voxel_render.h"
 
 

+ 1 - 1
tests/caveview/caveview.h

@@ -3,7 +3,7 @@
 
 
 #include "stb.h"
 #include "stb.h"
 
 
-#define STBVOX_ROTATION_IN_LIGHTING
+#define STBVOX_CONFIG_ROTATION_IN_LIGHTING
 #include "stb_voxel_render.h"
 #include "stb_voxel_render.h"
 
 
 typedef struct
 typedef struct