More progress...
This commit is contained in:
parent
8bf6f4d08d
commit
a26b754e9c
@ -96,12 +96,18 @@ namespace PolyVox
|
|||||||
void generateExperimentalMeshDataForRegionSlice(BlockVolumeIterator<uint8_t>& volIter, Region regTwoSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset, uint8_t bitmask0[][POLYVOX_REGION_SIDE_LENGTH+1], uint8_t bitmask1[][POLYVOX_REGION_SIDE_LENGTH+1])
|
void generateExperimentalMeshDataForRegionSlice(BlockVolumeIterator<uint8_t>& volIter, Region regTwoSlice, IndexedSurfacePatch* singleMaterialPatch, const Vector3DFloat& offset, uint8_t bitmask0[][POLYVOX_REGION_SIDE_LENGTH+1], uint8_t bitmask1[][POLYVOX_REGION_SIDE_LENGTH+1])
|
||||||
{
|
{
|
||||||
//For edge indices
|
//For edge indices
|
||||||
boost::int32_t vertexIndicesX[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
boost::int32_t vertexIndicesX0[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
||||||
boost::int32_t vertexIndicesY[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
boost::int32_t vertexIndicesY0[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
||||||
boost::int32_t vertexIndicesZ[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
boost::int32_t vertexIndicesZ0[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
||||||
memset(vertexIndicesX,0xFF,sizeof(vertexIndicesX)); //0xFF is -1 as two's complement - this may not be portable...
|
boost::int32_t vertexIndicesX1[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
||||||
memset(vertexIndicesY,0xFF,sizeof(vertexIndicesY));
|
boost::int32_t vertexIndicesY1[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
||||||
memset(vertexIndicesZ,0xFF,sizeof(vertexIndicesZ));
|
boost::int32_t vertexIndicesZ1[POLYVOX_REGION_SIDE_LENGTH+1][POLYVOX_REGION_SIDE_LENGTH+1];
|
||||||
|
memset(vertexIndicesX0,0xFF,sizeof(vertexIndicesX0)); //0xFF is -1 as two's complement - this may not be portable...
|
||||||
|
memset(vertexIndicesY0,0xFF,sizeof(vertexIndicesY0));
|
||||||
|
memset(vertexIndicesZ0,0xFF,sizeof(vertexIndicesZ0));
|
||||||
|
memset(vertexIndicesX1,0xFF,sizeof(vertexIndicesX1)); //0xFF is -1 as two's complement - this may not be portable...
|
||||||
|
memset(vertexIndicesY1,0xFF,sizeof(vertexIndicesY1));
|
||||||
|
memset(vertexIndicesZ1,0xFF,sizeof(vertexIndicesZ1));
|
||||||
|
|
||||||
Region regFirstSlice(regTwoSlice);
|
Region regFirstSlice(regTwoSlice);
|
||||||
regFirstSlice.setUpperCorner(regFirstSlice.getUpperCorner() - Vector3DInt32(0,0,1));
|
regFirstSlice.setUpperCorner(regFirstSlice.getUpperCorner() - Vector3DInt32(0,0,1));
|
||||||
@ -149,7 +155,7 @@ namespace PolyVox
|
|||||||
vertMaterials[0] = v000 | volIter.peekVoxel1px0py0pz(); //Because one of these is 0, the or operation takes the max.
|
vertMaterials[0] = v000 | volIter.peekVoxel1px0py0pz(); //Because one of these is 0, the or operation takes the max.
|
||||||
SurfaceVertex surfaceVertex(vertlist[0],vertMaterials[0], 1.0);
|
SurfaceVertex surfaceVertex(vertlist[0],vertMaterials[0], 1.0);
|
||||||
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
||||||
vertexIndicesX[x][y][z] = singleMaterialPatch->m_vecVertices.size()-1;
|
vertexIndicesX0[x][y] = singleMaterialPatch->m_vecVertices.size()-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 8)
|
if (edgeTable[iCubeIndex] & 8)
|
||||||
@ -162,7 +168,7 @@ namespace PolyVox
|
|||||||
vertMaterials[3] = v000 | volIter.peekVoxel0px1py0pz();
|
vertMaterials[3] = v000 | volIter.peekVoxel0px1py0pz();
|
||||||
SurfaceVertex surfaceVertex(vertlist[3],vertMaterials[3], 1.0);
|
SurfaceVertex surfaceVertex(vertlist[3],vertMaterials[3], 1.0);
|
||||||
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
||||||
vertexIndicesY[x][y][z] = singleMaterialPatch->m_vecVertices.size()-1;
|
vertexIndicesY0[x][y] = singleMaterialPatch->m_vecVertices.size()-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 256)
|
if (edgeTable[iCubeIndex] & 256)
|
||||||
@ -175,7 +181,7 @@ namespace PolyVox
|
|||||||
vertMaterials[8] = v000 | volIter.peekVoxel0px0py1pz();
|
vertMaterials[8] = v000 | volIter.peekVoxel0px0py1pz();
|
||||||
SurfaceVertex surfaceVertex(vertlist[8],vertMaterials[8], 1.0);
|
SurfaceVertex surfaceVertex(vertlist[8],vertMaterials[8], 1.0);
|
||||||
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
||||||
vertexIndicesZ[x][y][z] = singleMaterialPatch->m_vecVertices.size()-1;
|
vertexIndicesZ0[x][y] = singleMaterialPatch->m_vecVertices.size()-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(volIter.moveForwardInRegionXYZ());//For each cell
|
}while(volIter.moveForwardInRegionXYZ());//For each cell
|
||||||
@ -213,7 +219,7 @@ namespace PolyVox
|
|||||||
vertMaterials[0] = v000 | volIter.peekVoxel1px0py0pz(); //Because one of these is 0, the or operation takes the max.
|
vertMaterials[0] = v000 | volIter.peekVoxel1px0py0pz(); //Because one of these is 0, the or operation takes the max.
|
||||||
SurfaceVertex surfaceVertex(vertlist[0],vertMaterials[0], 1.0);
|
SurfaceVertex surfaceVertex(vertlist[0],vertMaterials[0], 1.0);
|
||||||
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
||||||
vertexIndicesX[x][y][z] = singleMaterialPatch->m_vecVertices.size()-1;
|
vertexIndicesX1[x][y] = singleMaterialPatch->m_vecVertices.size()-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 8)
|
if (edgeTable[iCubeIndex] & 8)
|
||||||
@ -226,7 +232,7 @@ namespace PolyVox
|
|||||||
vertMaterials[3] = v000 | volIter.peekVoxel0px1py0pz();
|
vertMaterials[3] = v000 | volIter.peekVoxel0px1py0pz();
|
||||||
SurfaceVertex surfaceVertex(vertlist[3],vertMaterials[3], 1.0);
|
SurfaceVertex surfaceVertex(vertlist[3],vertMaterials[3], 1.0);
|
||||||
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
||||||
vertexIndicesY[x][y][z] = singleMaterialPatch->m_vecVertices.size()-1;
|
vertexIndicesY1[x][y] = singleMaterialPatch->m_vecVertices.size()-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 256)
|
if (edgeTable[iCubeIndex] & 256)
|
||||||
@ -239,7 +245,7 @@ namespace PolyVox
|
|||||||
vertMaterials[8] = v000 | volIter.peekVoxel0px0py1pz();
|
vertMaterials[8] = v000 | volIter.peekVoxel0px0py1pz();
|
||||||
SurfaceVertex surfaceVertex(vertlist[8],vertMaterials[8], 1.0);
|
SurfaceVertex surfaceVertex(vertlist[8],vertMaterials[8], 1.0);
|
||||||
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
singleMaterialPatch->m_vecVertices.push_back(surfaceVertex);
|
||||||
vertexIndicesZ[x][y][z] = singleMaterialPatch->m_vecVertices.size()-1;
|
vertexIndicesZ1[x][y] = singleMaterialPatch->m_vecVertices.size()-1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}while(volIter.moveForwardInRegionXYZ());//For each cell
|
}while(volIter.moveForwardInRegionXYZ());//For each cell
|
||||||
@ -274,62 +280,62 @@ namespace PolyVox
|
|||||||
/* Find the vertices where the surface intersects the cube */
|
/* Find the vertices where the surface intersects the cube */
|
||||||
if (edgeTable[iCubeIndex] & 1)
|
if (edgeTable[iCubeIndex] & 1)
|
||||||
{
|
{
|
||||||
indlist[0] = vertexIndicesX[x][y][z];
|
indlist[0] = vertexIndicesX0[x][y];
|
||||||
assert(indlist[0] != -1);
|
assert(indlist[0] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 2)
|
if (edgeTable[iCubeIndex] & 2)
|
||||||
{
|
{
|
||||||
indlist[1] = vertexIndicesY[x+1][y][z];
|
indlist[1] = vertexIndicesY0[x+1][y];
|
||||||
assert(indlist[1] != -1);
|
assert(indlist[1] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 4)
|
if (edgeTable[iCubeIndex] & 4)
|
||||||
{
|
{
|
||||||
indlist[2] = vertexIndicesX[x][y+1][z];
|
indlist[2] = vertexIndicesX0[x][y+1];
|
||||||
assert(indlist[2] != -1);
|
assert(indlist[2] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 8)
|
if (edgeTable[iCubeIndex] & 8)
|
||||||
{
|
{
|
||||||
indlist[3] = vertexIndicesY[x][y][z];
|
indlist[3] = vertexIndicesY0[x][y];
|
||||||
assert(indlist[3] != -1);
|
assert(indlist[3] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 16)
|
if (edgeTable[iCubeIndex] & 16)
|
||||||
{
|
{
|
||||||
indlist[4] = vertexIndicesX[x][y][z+1];
|
indlist[4] = vertexIndicesX1[x][y];
|
||||||
assert(indlist[4] != -1);
|
assert(indlist[4] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 32)
|
if (edgeTable[iCubeIndex] & 32)
|
||||||
{
|
{
|
||||||
indlist[5] = vertexIndicesY[x+1][y][z+1];
|
indlist[5] = vertexIndicesY1[x+1][y];
|
||||||
assert(indlist[5] != -1);
|
assert(indlist[5] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 64)
|
if (edgeTable[iCubeIndex] & 64)
|
||||||
{
|
{
|
||||||
indlist[6] = vertexIndicesX[x][y+1][z+1];
|
indlist[6] = vertexIndicesX1[x][y+1];
|
||||||
assert(indlist[6] != -1);
|
assert(indlist[6] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 128)
|
if (edgeTable[iCubeIndex] & 128)
|
||||||
{
|
{
|
||||||
indlist[7] = vertexIndicesY[x][y][z+1];
|
indlist[7] = vertexIndicesY1[x][y];
|
||||||
assert(indlist[7] != -1);
|
assert(indlist[7] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 256)
|
if (edgeTable[iCubeIndex] & 256)
|
||||||
{
|
{
|
||||||
indlist[8] = vertexIndicesZ[x][y][z];
|
indlist[8] = vertexIndicesZ0[x][y];
|
||||||
assert(indlist[8] != -1);
|
assert(indlist[8] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 512)
|
if (edgeTable[iCubeIndex] & 512)
|
||||||
{
|
{
|
||||||
indlist[9] = vertexIndicesZ[x+1][y][z];
|
indlist[9] = vertexIndicesZ0[x+1][y];
|
||||||
assert(indlist[9] != -1);
|
assert(indlist[9] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 1024)
|
if (edgeTable[iCubeIndex] & 1024)
|
||||||
{
|
{
|
||||||
indlist[10] = vertexIndicesZ[x+1][y+1][z];
|
indlist[10] = vertexIndicesZ0[x+1][y+1];
|
||||||
assert(indlist[10] != -1);
|
assert(indlist[10] != -1);
|
||||||
}
|
}
|
||||||
if (edgeTable[iCubeIndex] & 2048)
|
if (edgeTable[iCubeIndex] & 2048)
|
||||||
{
|
{
|
||||||
indlist[11] = vertexIndicesZ[x][y+1][z];
|
indlist[11] = vertexIndicesZ0[x][y+1];
|
||||||
assert(indlist[11] != -1);
|
assert(indlist[11] != -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -387,6 +393,10 @@ namespace PolyVox
|
|||||||
}while(volIter.moveForwardInRegionXYZ());//For each cell
|
}while(volIter.moveForwardInRegionXYZ());//For each cell
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*void generateVerticesForSlice()
|
||||||
|
{
|
||||||
|
}*/
|
||||||
|
|
||||||
void generateRoughMeshDataForRegion(BlockVolume<uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch)
|
void generateRoughMeshDataForRegion(BlockVolume<uint8_t>* volumeData, Region region, IndexedSurfacePatch* singleMaterialPatch)
|
||||||
{
|
{
|
||||||
//When generating the mesh for a region we actually look one voxel outside it in the
|
//When generating the mesh for a region we actually look one voxel outside it in the
|
||||||
|
Loading…
x
Reference in New Issue
Block a user