|
|
|
@ -154,43 +154,11 @@ |
|
|
|
|
// zmc engine 96-byte quads : 2011/10
|
|
|
|
|
// zmc engine 32-byte quads : 2013/12
|
|
|
|
|
// stb_voxel_render 20-byte quads: 2015/01
|
|
|
|
|
// stb_voxel_render 4..14 bytes : 2015/02???
|
|
|
|
|
// stb_voxel_render 4..14 bytes : 2015/???
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
#ifndef STBVOX_MODE |
|
|
|
|
#define STBVOX_MODE 0 |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// The following are candidate voxel modes. Only modes 0, 1, and 20 are
|
|
|
|
|
// currently implemented. Reducing the storage-per-quad further
|
|
|
|
|
// shouldn't improve performance, although obviously it allow you
|
|
|
|
|
// to create larger worlds without streaming.
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// Mode: 0 1 2 3 4 5 6 10 11 12 20 21 22 23
|
|
|
|
|
// ============================================================================================================
|
|
|
|
|
// uses Tex Buffer n Y Y Y Y Y Y Y Y Y Y Y Y Y
|
|
|
|
|
// bytes per quad 32 20 14 12 10 6 6 8 6 4 20 10 6 4
|
|
|
|
|
// vertex bytes 8 4 2 1 1 0 0 1 1 0 4 1 0 0
|
|
|
|
|
// non-blocks all all some some some slabs stairs some some none all slabs slabs none
|
|
|
|
|
// tex1 256 256 256 256 256 256 256 256 256 256 n n n n
|
|
|
|
|
// tex2 256 256 256 256 256 256 128 n n n n n n n
|
|
|
|
|
// colors 64 64 64 64 64 64 64 8 n n 2^24 2^24 2^24 256
|
|
|
|
|
// vertex ao Y Y Y Y Y n n Y Y n Y Y n n
|
|
|
|
|
// vertex texlerp Y Y Y n n n n - - - - - - -
|
|
|
|
|
// x&y extents 127 127 128 64 64 128 64 64 128 128 64 64 128 128
|
|
|
|
|
// z extents 255 255 128 128 128 64 64 32 64 128 64 64 64 128
|
|
|
|
|
// vertex x bits 7 7 0 6 0 0 0 0 0 0 7 0 0 0
|
|
|
|
|
// vertex y bits 7 7 0 0 0 0 0 0 0 0 7 0 0 0
|
|
|
|
|
// vertex z bits 9 9 7 4 2 0 0 2 2 0 9 2 0 0
|
|
|
|
|
// vertex ao bits 6 6 6 6 6 0 0 6 6 0 6 6 0 0
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// With TexBuffer for the fixed vertex data, we can actually do
|
|
|
|
@ -542,6 +510,108 @@ struct stbvox_mesh_maker |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef STBVOX_CONFIG_MODE |
|
|
|
|
#error "Must defined STBVOX_CONFIG_MODE to select the mode" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// The following are candidate voxel modes. Only modes 0, 1, and 20 are
|
|
|
|
|
// currently implemented. Reducing the storage-per-quad further
|
|
|
|
|
// shouldn't improve performance, although obviously it allow you
|
|
|
|
|
// to create larger worlds without streaming.
|
|
|
|
|
//
|
|
|
|
|
//
|
|
|
|
|
// ----------- Two textures ----------- -- One texture -- ---- Color only ----
|
|
|
|
|
// Mode: 0 1 2 3 4 5 6 10 11 12 20 21 22 23
|
|
|
|
|
// ============================================================================================================
|
|
|
|
|
// uses Tex Buffer n Y Y Y Y Y Y Y Y Y Y Y Y Y
|
|
|
|
|
// bytes per quad 32 20 14 12 10 6 6 8 8 4 20 10 6 4
|
|
|
|
|
// non-blocks all all some some some slabs stairs some some none all slabs slabs none
|
|
|
|
|
// tex1 256 256 256 256 256 256 256 256 256 256 n n n n
|
|
|
|
|
// tex2 256 256 256 256 256 256 128 n n n n n n n
|
|
|
|
|
// colors 64 64 64 64 64 64 64 8 n n 2^24 2^24 2^24 256
|
|
|
|
|
// vertex ao Y Y Y Y Y n n Y Y n Y Y n n
|
|
|
|
|
// vertex texlerp Y Y Y n n n n - - - - - - -
|
|
|
|
|
// x&y extents 127 127 128 64 64 128 64 64 128 128 127 128 128 128
|
|
|
|
|
// z extents 255 255 128 64? 64? 64 64 32 64 128 255 128 64 128
|
|
|
|
|
|
|
|
|
|
// not sure why I only wrote down the above "result data" and didn't preserve
|
|
|
|
|
// the vertex formats, but here I've tried to reconstruct the designs:
|
|
|
|
|
|
|
|
|
|
// Mode: 0 1 2 3 4 5 6 10 11 12 20 21 22 23
|
|
|
|
|
// =============================================================================================================
|
|
|
|
|
// bytes per quad 32 20 14 12 10 6 6 8 8 4 20 10 6 4
|
|
|
|
|
//
|
|
|
|
|
// vertex x bits 7 7 0 6 0 0 0 0 0 0 7 0 0 0
|
|
|
|
|
// vertex y bits 7 7 0 0 0 0 0 0 0 0 7 0 0 0
|
|
|
|
|
// vertex z bits 9 9 7 4 2 0 0 2 2 0 9 2 0 0
|
|
|
|
|
// vertex ao bits 6 6 6 6 6 0 0 6 6 0 6 6 0 0
|
|
|
|
|
// vertex txl bits 3 3 3 0 0 0 0 0 0 0 (3) 0 0 0
|
|
|
|
|
//
|
|
|
|
|
// face tex1 bits (8) 8 8 8 8 8 8 8 8 8
|
|
|
|
|
// face tex2 bits (8) 8 8 8 8 8 7 - - -
|
|
|
|
|
// face color bits (8) 8 8 8 8 8 8 3 0 0 24 24 24 8
|
|
|
|
|
// face normal bits (8) 8 8 8 6 4 7 4 4 3 8 3 4 3
|
|
|
|
|
// face x bits 7 0 6 7 6 6 7 7 0 7 7 7
|
|
|
|
|
// face y bits 7 6 6 7 6 6 7 7 0 7 7 7
|
|
|
|
|
// face z bits 2 2 6 6 6 5 6 7 0 7 6 7
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if STBVOX_CONFIG_MODE==0 || STBVOX_CONFIG_MODE==1 |
|
|
|
|
|
|
|
|
|
// the only difference between 0 & 1:
|
|
|
|
|
#if STBVOX_CONFIG_MODE==0 |
|
|
|
|
#define STBVOX_ICONFIG_FACE_ATTRIBUTE |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
// the shared properties of 0 & 1:
|
|
|
|
|
#define STBVOX_ICONFIG_VERTEX_32 |
|
|
|
|
#define STBVOX_ICONFIG_FACE1_1 |
|
|
|
|
|
|
|
|
|
#elif STBVOX_CONFIG_MODE==20 |
|
|
|
|
|
|
|
|
|
#else |
|
|
|
|
#error "Selected value of STBVOX_CONFIG_MODE is not supported" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifndef STBVOX_CONFIG_HLSL |
|
|
|
|
#define STBVOX_ICONFIG_GLSL |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef STBVOX_CONFIG_OPENGL_MODELVIEW |
|
|
|
|
#define STBVOX_ICONFIG_OPENGL_3_1_COMPATIBILITY |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#if defined(STBVOX_ICONFIG_VERTEX_32) |
|
|
|
|
typedef stbvox_uint32 stbvox_mesh_vertex; |
|
|
|
|
#define stbvox_vertex_encode(x,y,z,ao,texlerp) \ |
|
|
|
|
((stbvox_uint32) ((x)+((y)<<7)+((z)<<14)+((ao)<<23)+((texlerp)<<29))) |
|
|
|
|
#elif defined(STBVOX_ICONFIG_VERTEX_16_1) // mode=2
|
|
|
|
|
typedef stbvox_uint16 stbvox_mesh_vertex; |
|
|
|
|
#define stbvox_vertex_encode(x,y,z,ao,texlerp) \ |
|
|
|
|
((stbvox_uint16) ((z)+((ao)<<7)+((texlerp)<<13) |
|
|
|
|
#elif defined(STBVOX_ICONFIG_VERTEX_16_2) // mode=3
|
|
|
|
|
typedef stbvox_uint16 stbvox_mesh_vertex; |
|
|
|
|
#define stbvox_vertex_encode(x,y,z,ao,texlerp) \ |
|
|
|
|
((stbvox_uint16) ((x)+((z)<<6))+((ao)<<10)) |
|
|
|
|
#else defined(STBVOX_ICONFIG_VERTEX_8) |
|
|
|
|
typedef stbvox_uint8 stbvox_mesh_vertex; |
|
|
|
|
#define stbvox_vertex_encode(x,y,z,ao,texlerp) \ |
|
|
|
|
((stbvox_uint8) ((z)+((ao)<<6)) |
|
|
|
|
#else |
|
|
|
|
#error "internal error, no vertex type" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#ifdef STBVOX_ICONFIG_FACE1_1 |
|
|
|
|
typedef struct |
|
|
|
|
{ |
|
|
|
|
unsigned char tex1,tex2,color,face_info; |
|
|
|
|
} stbvox_mesh_face; |
|
|
|
|
#else |
|
|
|
|
#error "internal error, no face type" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 20-byte quad format:
|
|
|
|
|
//
|
|
|
|
|
// per vertex:
|
|
|
|
@ -650,7 +720,7 @@ static void stbvox_build_default_palette(void) |
|
|
|
|
#define STBVOX_SHADER_VERSION "" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
static char *stbvox_vertex_program = |
|
|
|
|
static char *stbvox_vertex_encoderogram = |
|
|
|
|
{ |
|
|
|
|
STBVOX_SHADER_VERSION |
|
|
|
|
|
|
|
|
@ -730,11 +800,13 @@ static char *stbvox_fragment_program = |
|
|
|
|
{ |
|
|
|
|
STBVOX_SHADER_VERSION |
|
|
|
|
|
|
|
|
|
// rlerp is lerp but with t on the left, like god intended
|
|
|
|
|
#if defined(STBVOX_ICONFIG_GLSL) |
|
|
|
|
// rlerp is lerp but with t on the left, like god intended
|
|
|
|
|
"#define rlerp(t,x,y) mix(x,y,t)\n" |
|
|
|
|
#elif defined(STBVOX_ICONFIG_HLSL) |
|
|
|
|
#elif defined(STBVOX_CONFIG_HLSL) |
|
|
|
|
"#define rlerp(t,x,y) lerp(x,t,y)\n" |
|
|
|
|
#else |
|
|
|
|
#error "need definition of rlerp()" |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -754,7 +826,7 @@ static char *stbvox_fragment_program = |
|
|
|
|
// probably constant data
|
|
|
|
|
"uniform vec3 ambient[4];\n" |
|
|
|
|
|
|
|
|
|
#ifdef STBVOX_ICONFIG_TEXTURED |
|
|
|
|
#ifndef STBVOX_ICONFIG_UNTEXTURED |
|
|
|
|
// generally constant data
|
|
|
|
|
"uniform sampler2DArray tex_array[2];\n" |
|
|
|
|
|
|
|
|
@ -783,7 +855,7 @@ static char *stbvox_fragment_program = |
|
|
|
|
" vec3 albedo;\n" |
|
|
|
|
" float fragment_alpha;\n" |
|
|
|
|
|
|
|
|
|
#ifdef STBVOX_ICONFIG_TEXTURED |
|
|
|
|
#ifndef STBVOX_ICONFIG_UNTEXTURED |
|
|
|
|
// unpack the values
|
|
|
|
|
" uint tex1_id = facedata.x;\n" |
|
|
|
|
" uint tex2_id = facedata.y;\n" |
|
|
|
@ -830,7 +902,7 @@ static char *stbvox_fragment_program = |
|
|
|
|
" albedo = rlerp(tex2.a, tex1.xyz, tex2.xyz);\n" // @TODO premultiplied alpha
|
|
|
|
|
|
|
|
|
|
" fragment_alpha = tex1.a;\n" |
|
|
|
|
#else // NOT TEXTURED
|
|
|
|
|
#else // UNTEXTURED
|
|
|
|
|
" vec4 color;" |
|
|
|
|
" color.xyz = vec3(facedata.xyz) / 255.0;\n" |
|
|
|
|
" bool emissive = (facedata.w & 128) != 0;\n" |
|
|
|
@ -897,7 +969,7 @@ static char *stbvox_fragment_program = |
|
|
|
|
|
|
|
|
|
STBVXDEC char *stbvox_get_vertex_shader(void) |
|
|
|
|
{ |
|
|
|
|
return stbvox_vertex_program; |
|
|
|
|
return stbvox_vertex_encoderogram; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
STBVXDEC char *stbvox_get_fragment_shader(void) |
|
|
|
@ -937,15 +1009,6 @@ STBVXDEC int stbvox_get_uniform_info(stbvox_uniform_info *info, int uniform) |
|
|
|
|
|
|
|
|
|
#define STBVOX_GET_GEO(geom_data) ((geom_data) & 15) |
|
|
|
|
|
|
|
|
|
typedef stbvox_uint32 stbvox_mesh_vertex; |
|
|
|
|
|
|
|
|
|
typedef struct |
|
|
|
|
{ |
|
|
|
|
unsigned char tex1,tex2,color,face_info; |
|
|
|
|
} stbvox_mesh_face; |
|
|
|
|
|
|
|
|
|
#define stbvox_vertex_p(x,y,z,ao,texlerp) ((stbvox_uint32) ((x)+((y)<<7)+((z)<<14)+((ao)<<23)+((texlerp)<<29))) |
|
|
|
|
|
|
|
|
|
typedef struct |
|
|
|
|
{ |
|
|
|
|
unsigned char block; |
|
|
|
@ -1101,17 +1164,17 @@ void stbvox_make_mesh_for_face(stbvox_mesh_maker *mm, stbvox_rotate rot, int fac |
|
|
|
|
if (mm->input.block_texlerp) { |
|
|
|
|
stbvox_block_type bt = mm->input.blocktype[v_off]; |
|
|
|
|
unsigned char val = mm->input.block_texlerp[bt]; |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_p(0,0,0,0,val); |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_encode(0,0,0,0,val); |
|
|
|
|
} else if (mm->input.block_texlerp_face) { |
|
|
|
|
stbvox_block_type bt = mm->input.blocktype[v_off]; |
|
|
|
|
unsigned char bt_face = STBVOX_ROTATE(face, rot.block); |
|
|
|
|
unsigned char val = mm->input.block_texlerp_face[bt][bt_face]; |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_p(0,0,0,0,val); |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_encode(0,0,0,0,val); |
|
|
|
|
} else if (mm->input.texlerp_face3) { |
|
|
|
|
unsigned char val = (mm->input.texlerp_face3[v_off] >> stbvox_face3_lerp[face]) & 7; |
|
|
|
|
if (face >= 4) |
|
|
|
|
val = stbvox_face3_updown[val]; |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_p(0,0,0,0,val); |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_encode(0,0,0,0,val); |
|
|
|
|
} else if (mm->input.texlerp) { |
|
|
|
|
unsigned char facelerp = (mm->input.texlerp[v_off] >> stbvox_face_lerp[face]) & 3; |
|
|
|
|
if (facelerp == STBVOX_TEXLERP_use_vert) { |
|
|
|
@ -1127,15 +1190,15 @@ void stbvox_make_mesh_for_face(stbvox_mesh_maker *mm, stbvox_rotate rot, int fac |
|
|
|
|
p1[2] = stbvox_vert_lerp_for_face_lerp[mm->input.texlerp[mm->cube_vertex_offset[face][2]]>>6]; |
|
|
|
|
p1[3] = stbvox_vert_lerp_for_face_lerp[mm->input.texlerp[mm->cube_vertex_offset[face][3]]>>6]; |
|
|
|
|
} |
|
|
|
|
p1[0] = stbvox_vertex_p(0,0,0,0,p1[0]); |
|
|
|
|
p1[1] = stbvox_vertex_p(0,0,0,0,p1[1]); |
|
|
|
|
p1[2] = stbvox_vertex_p(0,0,0,0,p1[2]); |
|
|
|
|
p1[3] = stbvox_vertex_p(0,0,0,0,p1[3]); |
|
|
|
|
p1[0] = stbvox_vertex_encode(0,0,0,0,p1[0]); |
|
|
|
|
p1[1] = stbvox_vertex_encode(0,0,0,0,p1[1]); |
|
|
|
|
p1[2] = stbvox_vertex_encode(0,0,0,0,p1[2]); |
|
|
|
|
p1[3] = stbvox_vertex_encode(0,0,0,0,p1[3]); |
|
|
|
|
} else { |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_p(0,0,0,0,stbvox_vert_lerp_for_face_lerp[facelerp]); |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_encode(0,0,0,0,stbvox_vert_lerp_for_face_lerp[facelerp]); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_p(0,0,0,0,7); |
|
|
|
|
p1[0] = p1[1] = p1[2] = p1[3] = stbvox_vertex_encode(0,0,0,0,7); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
{ |
|
|
|
@ -1147,7 +1210,7 @@ void stbvox_make_mesh_for_face(stbvox_mesh_maker *mm, stbvox_rotate rot, int fac |
|
|
|
|
int i; |
|
|
|
|
for (i=0; i < 4; ++i) { |
|
|
|
|
*mv[i] = vertbase + face_coord[i]; |
|
|
|
|
+ stbvox_vertex_p(0,0,0,mm->input.lighting[v_off + mm->cube_vertex_offset[face][i]] & 63,0); |
|
|
|
|
+ stbvox_vertex_encode(0,0,0,mm->input.lighting[v_off + mm->cube_vertex_offset[face][i]] & 63,0); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
unsigned char *amb = &mm->input.lighting[v_off]; |
|
|
|
@ -1167,7 +1230,7 @@ void stbvox_make_mesh_for_face(stbvox_mesh_maker *mm, stbvox_rotate rot, int fac |
|
|
|
|
for (j=0; j < 4; ++j) |
|
|
|
|
total += STBVOX_GET_LIGHTING(vamb[mm->vertex_gather_offset[face][j]]); |
|
|
|
|
*mv[i] = vertbase + face_coord[i] |
|
|
|
|
+ stbvox_vertex_p(0,0,0,(total+STBVOX_LIGHTING_ROUNDOFF)>>4,0); |
|
|
|
|
+ stbvox_vertex_encode(0,0,0,(total+STBVOX_LIGHTING_ROUNDOFF)>>4,0); |
|
|
|
|
// >> 4 is because:
|
|
|
|
|
// >> 2 to divide by 4 to get average over 4 samples
|
|
|
|
|
// >> 2 because input is 8 bits, output is 6 bits
|
|
|
|
@ -1261,7 +1324,7 @@ static void stbvox_make_mesh_for_block(stbvox_mesh_maker *mm, stbvox_pos pos, in |
|
|
|
|
int ew_off = mm->x_stride_in_bytes; |
|
|
|
|
|
|
|
|
|
unsigned char *blockptr = &mm->input.blocktype[v_off]; |
|
|
|
|
stbvox_mesh_vertex basevert = stbvox_vertex_p(pos.x, pos.y, pos.z << STBVOX_CONFIG_PRECISION_Z , 0,0); |
|
|
|
|
stbvox_mesh_vertex basevert = stbvox_vertex_encode(pos.x, pos.y, pos.z << STBVOX_CONFIG_PRECISION_Z , 0,0); |
|
|
|
|
|
|
|
|
|
stbvox_rotate rot = { 0,0,0,0,0 }; |
|
|
|
|
unsigned char simple_rot = 0; |
|
|
|
@ -1535,7 +1598,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po |
|
|
|
|
+ stbvox_geometry_vheight[geo][vert]; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
basevert = stbvox_vertex_p(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) { |
|
|
|
|
mesh = mm->input.selector[v_off]; |
|
|
|
|
} |
|
|
|
@ -1630,23 +1693,23 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po |
|
|
|
|
extreme = (ht[0] == 3 || ht[1] == 3 || ht[2] == 3 || ht[3] == 3); |
|
|
|
|
|
|
|
|
|
if (geo >= STBVOX_GEOM_ceil_vheight_03) { |
|
|
|
|
cube[0] = stbvox_vertex_p(0,0,ht[0],0,0); |
|
|
|
|
cube[1] = stbvox_vertex_p(0,0,ht[1],0,0); |
|
|
|
|
cube[2] = stbvox_vertex_p(0,0,ht[2],0,0); |
|
|
|
|
cube[3] = stbvox_vertex_p(0,0,ht[3],0,0); |
|
|
|
|
cube[4] = stbvox_vertex_p(0,0,2,0,0); |
|
|
|
|
cube[5] = stbvox_vertex_p(0,0,2,0,0); |
|
|
|
|
cube[6] = stbvox_vertex_p(0,0,2,0,0); |
|
|
|
|
cube[7] = stbvox_vertex_p(0,0,2,0,0); |
|
|
|
|
cube[0] = stbvox_vertex_encode(0,0,ht[0],0,0); |
|
|
|
|
cube[1] = stbvox_vertex_encode(0,0,ht[1],0,0); |
|
|
|
|
cube[2] = stbvox_vertex_encode(0,0,ht[2],0,0); |
|
|
|
|
cube[3] = stbvox_vertex_encode(0,0,ht[3],0,0); |
|
|
|
|
cube[4] = stbvox_vertex_encode(0,0,2,0,0); |
|
|
|
|
cube[5] = stbvox_vertex_encode(0,0,2,0,0); |
|
|
|
|
cube[6] = stbvox_vertex_encode(0,0,2,0,0); |
|
|
|
|
cube[7] = stbvox_vertex_encode(0,0,2,0,0); |
|
|
|
|
} else { |
|
|
|
|
cube[0] = stbvox_vertex_p(0,0,0,0,0); |
|
|
|
|
cube[1] = stbvox_vertex_p(0,0,0,0,0); |
|
|
|
|
cube[2] = stbvox_vertex_p(0,0,0,0,0); |
|
|
|
|
cube[3] = stbvox_vertex_p(0,0,0,0,0); |
|
|
|
|
cube[4] = stbvox_vertex_p(0,0,ht[0],0,0); |
|
|
|
|
cube[5] = stbvox_vertex_p(0,0,ht[1],0,0); |
|
|
|
|
cube[6] = stbvox_vertex_p(0,0,ht[2],0,0); |
|
|
|
|
cube[7] = stbvox_vertex_p(0,0,ht[3],0,0); |
|
|
|
|
cube[0] = stbvox_vertex_encode(0,0,0,0,0); |
|
|
|
|
cube[1] = stbvox_vertex_encode(0,0,0,0,0); |
|
|
|
|
cube[2] = stbvox_vertex_encode(0,0,0,0,0); |
|
|
|
|
cube[3] = stbvox_vertex_encode(0,0,0,0,0); |
|
|
|
|
cube[4] = stbvox_vertex_encode(0,0,ht[0],0,0); |
|
|
|
|
cube[5] = stbvox_vertex_encode(0,0,ht[1],0,0); |
|
|
|
|
cube[6] = stbvox_vertex_encode(0,0,ht[2],0,0); |
|
|
|
|
cube[7] = stbvox_vertex_encode(0,0,ht[3],0,0); |
|
|
|
|
} |
|
|
|
|
if (!mm->input.vheight && mm->input.block_vheight) { |
|
|
|
|
} |
|
|
|
@ -1661,7 +1724,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
basevert = stbvox_vertex_p(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); |
|
|
|
|
// 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; |
|
|
|
@ -1732,7 +1795,7 @@ static void stbvox_make_mesh_for_block_with_geo(stbvox_mesh_maker *mm, stbvox_po |
|
|
|
|
|
|
|
|
|
if (geo == STBVOX_GEOM_crossed_pair) { |
|
|
|
|
// this can be generated with a special vmesh
|
|
|
|
|
stbvox_mesh_vertex basevert = stbvox_vertex_p(pos.x, pos.y, pos.z << STBVOX_CONFIG_PRECISION_Z , 0,0); |
|
|
|
|
stbvox_mesh_vertex basevert = stbvox_vertex_encode(pos.x, pos.y, pos.z << STBVOX_CONFIG_PRECISION_Z , 0,0); |
|
|
|
|
unsigned char simple_rot=0; |
|
|
|
|
stbvox_rotate rot = { 0,0,0,0,0 }; |
|
|
|
|
unsigned char mesh = mm->default_mesh; |
|
|
|
@ -2152,115 +2215,115 @@ static unsigned char stbvox_vertex_selector[6][4] = |
|
|
|
|
|
|
|
|
|
static stbvox_mesh_vertex stbvox_vmesh_delta_normal[6][4] = |
|
|
|
|
{ |
|
|
|
|
{ stbvox_vertex_p(1,0,1,0,0) ,
|
|
|
|
|
stbvox_vertex_p(1,1,1,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(1,1,1,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,1,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,1,1,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,1,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,1,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,1,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,1,1,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,1,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,1,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,1,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) } |
|
|
|
|
{ stbvox_vertex_encode(1,0,1,0,0) ,
|
|
|
|
|
stbvox_vertex_encode(1,1,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(1,1,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,1,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,1,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,1,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,1,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static stbvox_mesh_vertex stbvox_vmesh_pre_vheight[6][4] = |
|
|
|
|
{ |
|
|
|
|
{ stbvox_vertex_p(1,0,0,0,0) ,
|
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) } |
|
|
|
|
{ stbvox_vertex_encode(1,0,0,0,0) ,
|
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static stbvox_mesh_vertex stbvox_vmesh_delta_half_z[6][4] = |
|
|
|
|
{ |
|
|
|
|
{ stbvox_vertex_p(1,0,2,0,0) ,
|
|
|
|
|
stbvox_vertex_p(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,2,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) } |
|
|
|
|
{ stbvox_vertex_encode(1,0,2,0,0) ,
|
|
|
|
|
stbvox_vertex_encode(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,2,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
static stbvox_mesh_vertex stbvox_vmesh_crossed_pair[6][4] = |
|
|
|
|
{ |
|
|
|
|
{ stbvox_vertex_p(1,0,2,0,0) ,
|
|
|
|
|
stbvox_vertex_p(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(1,0,2,0,0) ,
|
|
|
|
|
stbvox_vertex_encode(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,0,0,0) }, |
|
|
|
|
// not used, so we leave it non-degenerate to make sure it doesn't get gen'd accidentally
|
|
|
|
|
{ stbvox_vertex_p(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_p(0,0,2,0,0) }, |
|
|
|
|
{ stbvox_vertex_p(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_p(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_p(0,1,0,0,0) } |
|
|
|
|
{ stbvox_vertex_encode(0,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,2,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,0,2,0,0) }, |
|
|
|
|
{ stbvox_vertex_encode(0,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,0,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(1,1,0,0,0) , |
|
|
|
|
stbvox_vertex_encode(0,1,0,0,0) } |
|
|
|
|
}; |
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -2350,14 +2413,14 @@ static unsigned short stbvox_face_visible[STBVOX_FT_count] = |
|
|
|
|
static stbvox_mesh_vertex stbvox_geometry_vheight[8][8] = |
|
|
|
|
{ |
|
|
|
|
#define STBVOX_HEIGHTS(a,b,c,d,e,f,g,h) \ |
|
|
|
|
{ stbvox_vertex_p(0,0,a,0,0), \
|
|
|
|
|
stbvox_vertex_p(0,0,b,0,0), \
|
|
|
|
|
stbvox_vertex_p(0,0,c,0,0), \
|
|
|
|
|
stbvox_vertex_p(0,0,d,0,0), \
|
|
|
|
|
stbvox_vertex_p(0,0,e,0,0), \
|
|
|
|
|
stbvox_vertex_p(0,0,f,0,0), \
|
|
|
|
|
stbvox_vertex_p(0,0,g,0,0), \
|
|
|
|
|
stbvox_vertex_p(0,0,h,0,0) } |
|
|
|
|
{ stbvox_vertex_encode(0,0,a,0,0), \
|
|
|
|
|
stbvox_vertex_encode(0,0,b,0,0), \
|
|
|
|
|
stbvox_vertex_encode(0,0,c,0,0), \
|
|
|
|
|
stbvox_vertex_encode(0,0,d,0,0), \
|
|
|
|
|
stbvox_vertex_encode(0,0,e,0,0), \
|
|
|
|
|
stbvox_vertex_encode(0,0,f,0,0), \
|
|
|
|
|
stbvox_vertex_encode(0,0,g,0,0), \
|
|
|
|
|
stbvox_vertex_encode(0,0,h,0,0) } |
|
|
|
|
|
|
|
|
|
STBVOX_HEIGHTS(0,0,0,0, 2,2,2,2), |
|
|
|
|
STBVOX_HEIGHTS(0,0,0,0, 2,2,2,2), |
|
|
|
|