diff --git a/stb_voxel_render.h b/stb_voxel_render.h index 30dd42f..514ed99 100644 --- a/stb_voxel_render.h +++ b/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, // 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 // // - 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 // // For portability, none of the library code actually accesses @@ -24,8 +24,9 @@ // yourself. However, you could also try making a game with // a small enough world that it's fully loaded rather than // 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 @@ -108,7 +109,7 @@ // and avoids a potential slow path (gathering non-uniform // 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. // 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 @@ -187,10 +188,11 @@ // Sean Barrett github:r-leyh Jesus Fernandez // Miguel Lechon github:Arbeiterunfallversicherungsgesetz // Thomas Frase James Hofmann -// Stephen Olsen +// Stephen Olsen github:guitarfreak // // 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.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 @@ -262,7 +264,7 @@ extern "C" { // modes 0,1,20,21, Z in the mesh can extend to 511 instead // 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 // 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 // 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. // // 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) 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 if (mm->output_cur[mesh][0] + mm->output_size[mesh][0]*6 > mm->output_end[mesh][0]) { 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; if (mm->input.selector) 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) { // this is the simple case, we can just use regular block gen with special vmesh calculated with vheight 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); if (mm->input.selector) { 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 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]; simple_rot = mesh >> 4; mesh &= 15; + } + if (mm->input.block_selector) { + mesh = mm->input.block_selector[bt]; } // check if we're going off the end