Merge branch 'working'

pull/290/merge
Sean Barrett 2017-03-03 09:53:08 -08:00
commit 335565a86f
1 changed files with 22 additions and 11 deletions

View File

@ -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 // per quad. There are designs to allow much more compact formats
// with a slight reduction in shader features. // 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