2
0
Sean Barrett 8 жил өмнө
parent
commit
335565a86f
1 өөрчлөгдсөн 22 нэмэгдсэн , 11 устгасан
  1. 22 11
      stb_voxel_render.h

+ 22 - 11
stb_voxel_render.h

@@ -1,4 +1,4 @@
-// stb_voxel_render.h - v0.84 - Sean Barrett, 2015 - public domain
+// stb_voxel_render.h - v0.85 - 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
@@ -13,7 +13,7 @@
 // It works by creating triangle meshes. The library includes
 // It works by creating triangle meshes. The library includes
 //
 //
 //    - converter from dense 3D arrays of block info to vertex mesh
 //    - converter from dense 3D arrays of block info to vertex mesh
-//    - shader for the vertex mesh
+//    - vertex & fragment shaders for the vertex mesh
 //    - assistance in setting up shader state
 //    - assistance in setting up shader state
 //
 //
 // For portability, none of the library code actually accesses
 // For portability, none of the library code actually accesses
@@ -24,8 +24,9 @@
 // yourself. However, you could also try making a game with
 // yourself. However, you could also try making a game with
 // a small enough world that it's fully loaded rather than
 // a small enough world that it's fully loaded rather than
 // streaming. Currently the preferred vertex format is 20 bytes
 // streaming. Currently the preferred vertex format is 20 bytes
-// per quad. There are plans to allow much more compact formats
-// with a slight reduction in shader features.
+// per quad. There are designs to allow much more compact formats
+// with a slight reduction in shader features, but no roadmap
+// for actually implementing them.
 //
 //
 //
 //
 // USAGE
 // USAGE
@@ -108,7 +109,7 @@
 //        and avoids a potential slow path (gathering non-uniform
 //        and avoids a potential slow path (gathering non-uniform
 //        data from uniforms) on some hardware.
 //        data from uniforms) on some hardware.
 //
 //
-//   In the future I hope to add additional modes that have significantly
+//   In the future I might add additional modes that have significantly
 //   smaller meshes but reduce features, down as small as 6 bytes per quad.
 //   smaller meshes but reduce features, down as small as 6 bytes per quad.
 //   See elsewhere in this file for a table of candidate modes. Switching
 //   See elsewhere in this file for a table of candidate modes. Switching
 //   to a mode will require changing some of your mesh creation code, but
 //   to a mode will require changing some of your mesh creation code, but
@@ -187,10 +188,11 @@
 //  Sean Barrett                          github:r-leyh   Jesus Fernandez
 //  Sean Barrett                          github:r-leyh   Jesus Fernandez
 //                                        Miguel Lechon   github:Arbeiterunfallversicherungsgesetz
 //                                        Miguel Lechon   github:Arbeiterunfallversicherungsgesetz
 //                                        Thomas Frase    James Hofmann
 //                                        Thomas Frase    James Hofmann
-//                                        Stephen Olsen
+//                                        Stephen Olsen   github:guitarfreak
 //
 //
 // VERSION HISTORY
 // VERSION HISTORY
 //
 //
+//   0.85   (2017-03-03)  add block_selector (by guitarfreak)
 //   0.84   (2016-04-02)  fix GLSL syntax error on glModelView path
 //   0.84   (2016-04-02)  fix GLSL syntax error on glModelView path
 //   0.83   (2015-09-13)  remove non-constant struct initializers to support more compilers
 //   0.83   (2015-09-13)  remove non-constant struct initializers to support more compilers
 //   0.82   (2015-08-01)  added input.packed_compact to store rot, vheight & texlerp efficiently
 //   0.82   (2015-08-01)  added input.packed_compact to store rot, vheight & texlerp efficiently
@@ -262,7 +264,7 @@ extern "C" {
 //     modes 0,1,20,21, Z in the mesh can extend to 511 instead
 //     modes 0,1,20,21, Z in the mesh can extend to 511 instead
 //     of 255. However, half-height blocks cannot be used.
 //     of 255. However, half-height blocks cannot be used.
 //
 //
-// All of the following just #ifdef tested so need no values, and are optional.
+// All of the following are just #ifdef tested so need no values, and are optional.
 //
 //
 //    STBVOX_CONFIG_BLOCKTYPE_SHORT
 //    STBVOX_CONFIG_BLOCKTYPE_SHORT
 //        use unsigned 16-bit values for 'blocktype' in the input instead of 8-bit values
 //        use unsigned 16-bit values for 'blocktype' in the input instead of 8-bit values
@@ -302,7 +304,7 @@ extern "C" {
 //
 //
 //    STBVOX_CONFIG_DISABLE_TEX2
 //    STBVOX_CONFIG_DISABLE_TEX2
 //        This disables all processing of texture 2 in the shader in case
 //        This disables all processing of texture 2 in the shader in case
-//        you don't use it. Eventually this will be replaced with a mode
+//        you don't use it. Eventually this could be replaced with a mode
 //        that omits the unused data entirely.
 //        that omits the unused data entirely.
 //
 //
 //    STBVOX_CONFIG_TEX1_EDGE_CLAMP
 //    STBVOX_CONFIG_TEX1_EDGE_CLAMP
@@ -2900,7 +2902,9 @@ static void stbvox_make_mesh_for_block(stbvox_mesh_maker *mm, stbvox_pos pos, in
 
 
    if (mm->input.selector)
    if (mm->input.selector)
       mesh = mm->input.selector[v_off];
       mesh = mm->input.selector[v_off];
-
+   else if (mm->input.block_selector)
+      mesh = mm->input.block_selector[mm->input.blocktype[v_off]];
+  
    // check if we're going off the end
    // check if we're going off the end
    if (mm->output_cur[mesh][0] + mm->output_size[mesh][0]*6 > mm->output_end[mesh][0]) {
    if (mm->output_cur[mesh][0] + mm->output_size[mesh][0]*6 > mm->output_end[mesh][0]) {
       mm->full = 1;
       mm->full = 1;
@@ -3109,7 +3113,9 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
    mesh = mm->default_mesh;
    mesh = mm->default_mesh;
    if (mm->input.selector)
    if (mm->input.selector)
       mesh = mm->input.selector[v_off];
       mesh = mm->input.selector[v_off];
-
+   else if (mm->input.block_selector)
+      mesh = mm->input.block_selector[bt];
+  
    if (geo <= STBVOX_GEOM_ceil_slope_north_is_bottom) {
    if (geo <= STBVOX_GEOM_ceil_slope_north_is_bottom) {
       // this is the simple case, we can just use regular block gen with special vmesh calculated with vheight
       // this is the simple case, we can just use regular block gen with special vmesh calculated with vheight
       stbvox_mesh_vertex basevert;
       stbvox_mesh_vertex basevert;
@@ -3130,7 +3136,9 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
       basevert = stbvox_vertex_encode(pos.x, pos.y, pos.z << STBVOX_CONFIG_PRECISION_Z, 0,0);
       basevert = stbvox_vertex_encode(pos.x, pos.y, pos.z << STBVOX_CONFIG_PRECISION_Z, 0,0);
       if (mm->input.selector) {
       if (mm->input.selector) {
          mesh = mm->input.selector[v_off];
          mesh = mm->input.selector[v_off];
-      }
+      } else if (mm->input.block_selector)
+         mesh = mm->input.block_selector[bt];
+
 
 
       // check if we're going off the end
       // check if we're going off the end
       if (mm->output_cur[mesh][0] + mm->output_size[mesh][0]*6 > mm->output_end[mesh][0]) {
       if (mm->output_cur[mesh][0] + mm->output_size[mesh][0]*6 > mm->output_end[mesh][0]) {
@@ -3350,6 +3358,9 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po
          mesh = mm->input.selector[v_off];
          mesh = mm->input.selector[v_off];
          simple_rot = mesh >> 4;
          simple_rot = mesh >> 4;
          mesh &= 15;
          mesh &= 15;
+      } 
+      if (mm->input.block_selector) {
+         mesh = mm->input.block_selector[bt];
       }
       }
 
 
       // check if we're going off the end
       // check if we're going off the end