提交 f49c90c0 编写于 作者: S Sean Barrett

beginnings of mode support;

reconstruct full table of bit allocations per mode
上级 c588d29e
......@@ -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),
......
......@@ -16,14 +16,13 @@
//#define VHEIGHT_TEST
//#define STBVOX_OPTIMIZED_VHEIGHT
#define STBVOX_ICONFIG_OPENGL_3_1_COMPATIBILITY
#define STBVOX_CONFIG_MODE 1
#define STBVOX_CONFIG_OPENGL_MODELVIEW
#define STBVOX_ICONFIG_TEXTURED
#define STBVOX_ICONFIG_GLSL
#define STBVOX_CONFIG_PREFER_TEXBUFFER
//#define STBVOX_CONFIG_LIGHTING_SIMPLE
#define STBVOX_CONFIG_FOG_SMOOTHSTEP
#define STBVOX_ROTATION_IN_LIGHTING
#define STB_VOXEL_RENDER_IMPLEMENTATION
#include "stb_voxel_render.h"
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册