This commit is contained in:
Dario Manesku 2013-10-21 21:32:42 +01:00
parent 0c9ed73476
commit 96743e3a5b

View file

@ -1383,33 +1383,15 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
float m_k;
};
struct Index3us
{
Index3us()
{
}
Index3us(uint16_t _i0, uint16_t _i1, uint16_t _i2)
: m_i0(_i0)
, m_i1(_i1)
, m_i2(_i2)
{
}
uint16_t m_i0;
uint16_t m_i1;
uint16_t m_i2;
};
VertexData* verticesSide = (VertexData*) malloc (100000 * sizeof(VertexData) );
Index3us* indicesSide = (Index3us*) malloc (100000 * sizeof(Index3us) );
Index3us* indicesFrontCap = (Index3us*) malloc (100000 * sizeof(Index3us) );
Index3us* indicesBackCap = (Index3us*) malloc (100000 * sizeof(Index3us) );
uint16_t* indicesSide = (uint16_t*) malloc (100000 * 3*sizeof(uint16_t) );
uint16_t* indicesFrontCap = (uint16_t*) malloc (100000 * 3*sizeof(uint16_t) );
uint16_t* indicesBackCap = (uint16_t*) malloc (100000 * 3*sizeof(uint16_t) );
uint16_t vsideI = 0;
uint16_t sideI = 0;
uint16_t frontCapI = 0;
uint16_t backCapI = 0;
uint32_t vsideI = 0;
uint32_t sideI = 0;
uint32_t frontCapI = 0;
uint32_t backCapI = 0;
bool cap = (ShadowVolumeImpl::DepthFail == _impl);
uint16_t indexSide = 0;
@ -1419,7 +1401,6 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
for (FaceArray::const_iterator iter = faces.begin(), end = faces.end(); iter != end; ++iter)
{
const Face& face = *iter;
const uint16_t* indices = face.m_i;
bool frontFacing = false;
float f = vec3Dot(face.m_plane, _light) + face.m_plane[3];
@ -1428,9 +1409,9 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
frontFacing = true;
uint16_t triangleEdges[3][2] =
{
{ indices[0], indices[1] },
{ indices[1], indices[2] },
{ indices[2], indices[0] },
{ face.m_i[0], face.m_i[1] },
{ face.m_i[1], face.m_i[2] },
{ face.m_i[2], face.m_i[0] },
};
for (uint8_t ii = 0; ii < 3; ++ii)
@ -1449,11 +1430,15 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
{
if (frontFacing)
{
indicesFrontCap[frontCapI++] = *(Index3us*)face.m_i;
indicesFrontCap[frontCapI++] = face.m_i[0];
indicesFrontCap[frontCapI++] = face.m_i[1];
indicesFrontCap[frontCapI++] = face.m_i[2];
}
else
{
indicesBackCap[backCapI++] = *(Index3us*)face.m_i;
indicesBackCap[backCapI++] = face.m_i[0];
indicesBackCap[backCapI++] = face.m_i[1];
indicesBackCap[backCapI++] = face.m_i[2];
}
/**
@ -1463,8 +1448,9 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
* bool condition1 = !frontFacing && !_useFrontFacingFacesAsBackCap;
* if (condition0 || condition1)
* {
* const Index3us tmp = { indices[0], indices[1+condition0], indices[2-condition0] }; //winding regarding condition0
* indicesBackCap.push_back(tmp);
* indicesBackCap[backCapI++] = face.m_i[0];
* indicesBackCap[backCapI++] = face.m_i[1+condition0];
* indicesBackCap[backCapI++] = face.m_i[2-condition0];
* }
*/
}
@ -1487,8 +1473,13 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
verticesSide[vsideI++] = VertexData(v1, 0.0f);
verticesSide[vsideI++] = VertexData(v1, 1.0f);
indicesSide[sideI++] = Index3us(indexSide+0, indexSide+1, indexSide+2);
indicesSide[sideI++] = Index3us(indexSide+2, indexSide+1, indexSide+3);
indicesSide[sideI++] = indexSide+0;
indicesSide[sideI++] = indexSide+1;
indicesSide[sideI++] = indexSide+2;
indicesSide[sideI++] = indexSide+2;
indicesSide[sideI++] = indexSide+1;
indicesSide[sideI++] = indexSide+3;
indexSide += 4;
}
@ -1536,17 +1527,13 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
uint16_t winding = uint16_t(k > 0);
for (uint8_t ii = 0, end = abs(k); ii < end; ++ii)
{
indicesSide[sideI++] =
Index3us(uint16_t(indexSide)
, uint16_t(indexSide + 2 - winding)
, uint16_t(indexSide + 1 + winding)
);
indicesSide[sideI++] = indexSide;
indicesSide[sideI++] = indexSide + 2 - winding;
indicesSide[sideI++] = indexSide + 1 + winding;
indicesSide[sideI++] =
Index3us(uint16_t(indexSide + 2)
, uint16_t(indexSide + 3 - winding*2)
, uint16_t(indexSide + 1 + winding*2)
);
indicesSide[sideI++] = indexSide + 2;
indicesSide[sideI++] = indexSide + 3 - winding*2;
indicesSide[sideI++] = indexSide + 1 + winding*2;
}
indexSide += 4;
@ -1566,11 +1553,15 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
{
if (frontFacing)
{
indicesFrontCap[frontCapI++] = *(Index3us*)face.m_i;
indicesFrontCap[frontCapI++] = face.m_i[0];
indicesFrontCap[frontCapI++] = face.m_i[1];
indicesFrontCap[frontCapI++] = face.m_i[2];
}
else
{
indicesBackCap[backCapI++] = *(Index3us*)face.m_i;
indicesBackCap[backCapI++] = face.m_i[0];
indicesBackCap[backCapI++] = face.m_i[1];
indicesBackCap[backCapI++] = face.m_i[2];
}
}
}
@ -1594,7 +1585,7 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
//sides
uint32_t vsize = vsideI * 5*sizeof(float);
uint32_t isize = sideI * 3*sizeof(uint16_t);
uint32_t isize = sideI * sizeof(uint16_t);
mem = bgfx::alloc(vsize);
memcpy(mem->data, verticesSide, vsize);
@ -1612,7 +1603,7 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
if (cap)
{
//front cap
isize = frontCapI * 3*sizeof(uint16_t);
isize = frontCapI * sizeof(uint16_t);
mem = bgfx::alloc(isize);
memcpy(mem->data, indicesFrontCap, isize);
_shadowVolume.m_ibFrontCap = bgfx::createIndexBuffer(mem);
@ -1621,7 +1612,7 @@ void shadowVolumeCreate(ShadowVolume& _shadowVolume
bgfx::destroyIndexBuffer(_shadowVolume.m_ibFrontCap);
//back cap
isize = backCapI * 3*sizeof(uint16_t);
isize = backCapI * sizeof(uint16_t);
mem = bgfx::alloc(isize);
memcpy(mem->data, indicesBackCap, isize);
_shadowVolume.m_ibBackCap = bgfx::createIndexBuffer(mem);