diff --git a/stb_voxel_render.h b/stb_voxel_render.h index df8bfb1422883ef890fbe261e6afa9657cb87c73..b00243714f1bddbe7a783e58557d0e2ab7630def 100644 --- a/stb_voxel_render.h +++ b/stb_voxel_render.h @@ -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), diff --git a/tests/caveview/cave_mesher.c b/tests/caveview/cave_mesher.c index f35423beee94cd74904e7b9e4d457c165c6beb54..df26073adfa40d917f9295b007d30d85975559c6 100644 --- a/tests/caveview/cave_mesher.c +++ b/tests/caveview/cave_mesher.c @@ -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"