Code: Select all
OGRE_EXCEPT( Exception::ERR_INVALID_STATE,
"Renderable needs at least 2 coordinates in UV set #" +
StringConverter::toString( uvSource ) +
". Either change the mesh, or change the UV source settings",
"HlmsPbs::calculateHashForPreCreate" );
}
placed in:
Code: Select all
void HlmsPbs::calculateHashForPreCreate( Renderable *renderable, PiecesMap *inOutPieces )
{
assert( dynamic_cast<HlmsPbsDatablock*>( renderable->getDatablock() ) );
HlmsPbsDatablock *datablock = static_cast<HlmsPbsDatablock*>(
renderable->getDatablock() );
const bool metallicWorkflow = datablock->getWorkflow() == HlmsPbsDatablock::MetallicWorkflow;
const bool fresnelWorkflow = datablock->getWorkflow() ==
HlmsPbsDatablock::SpecularAsFresnelWorkflow;
setProperty( PbsProperty::FresnelScalar, datablock->hasSeparateFresnel() || metallicWorkflow );
setProperty( PbsProperty::FresnelWorkflow, fresnelWorkflow );
setProperty( PbsProperty::MetallicWorkflow, metallicWorkflow );
uint32 brdf = datablock->getBrdf();
if( (brdf & PbsBrdf::BRDF_MASK) == PbsBrdf::Default )
{
setProperty( PbsProperty::BrdfDefault, 1 );
if( !(brdf & PbsBrdf::FLAG_UNCORRELATED) )
setProperty( PbsProperty::GgxHeightCorrelated, 1 );
}
else if( (brdf & PbsBrdf::BRDF_MASK) == PbsBrdf::CookTorrance )
setProperty( PbsProperty::BrdfCookTorrance, 1 );
if( brdf & PbsBrdf::FLAG_SPERATE_DIFFUSE_FRESNEL )
setProperty( PbsProperty::FresnelSeparateDiffuse, 1 );
for( size_t i=0; i<PBSM_REFLECTION; ++i )
{
uint8 uvSource = datablock->mUvSource[i];
setProperty( *PbsProperty::UvSourcePtrs[i], uvSource );
if( !datablock->getTexture( i ).isNull() &&
getProperty( *HlmsBaseProp::UvCountPtrs[uvSource] ) < 2 )
{
OGRE_EXCEPT( Exception::ERR_INVALID_STATE,
"Renderable needs at least 2 coordinates in UV set #" +
StringConverter::toString( uvSource ) +
". Either change the mesh, or change the UV source settings",
"HlmsPbs::calculateHashForPreCreate" );
}
}
Code: Select all
void Mesh::_createGeometry()
{
int& Complexity = mOptions.MeshComplexity;
//HydraxLOG("mOptions.MeshComplexity "+ Ogre::StringConverter::toString(mOptions.MeshComplexity));
int numVertices = Complexity*Complexity;
int numEle = 6 * (Complexity-1)*(Complexity-1);
// Vertex buffers
mSubMesh->vertexData[0] = new Ogre::v1::VertexData();
mSubMesh->vertexData[0]->vertexStart = 0;
mSubMesh->vertexData[0]->vertexCount = numVertices;
//HydraxLOG("2 ");
Ogre::v1::VertexDeclaration* vdecl = mSubMesh->vertexData[0]->vertexDeclaration;
Ogre::v1::VertexBufferBinding* vbind = mSubMesh->vertexData[0]->vertexBufferBinding;
size_t offset = 0;
//HydraxLOG("CG2 ");
//HydraxLOG(Ogre::StringConverter::toString(mOptions.MeshVertexType));
switch (mOptions.MeshVertexType)
{
case VT_POS_NORM_UV:
{
vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vdecl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vdecl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);
mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
createVertexBuffer(sizeof(POS_NORM_UV_VERTEX),
numVertices,
Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
}
break;
case VT_POS_NORM:
{
vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vdecl->addElement(0, offset, Ogre::VET_FLOAT3, Ogre::VES_NORMAL);
mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
createVertexBuffer(sizeof(POS_NORM_VERTEX),
numVertices,
Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
}
break;
case VT_POS_UV:
{
vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
offset += Ogre::v1::VertexElement::getTypeSize(Ogre::VET_FLOAT3);
vdecl->addElement(0, offset, Ogre::VET_FLOAT2, Ogre::VES_TEXTURE_COORDINATES);
mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
createVertexBuffer(sizeof(POS_UV_VERTEX),
numVertices,
Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
}
break;
case VT_POS:
{
// HydraxLOG("CG2 33333333333 ");
vdecl->addElement(0, 0, Ogre::VET_FLOAT3, Ogre::VES_POSITION);
//HydraxLOG("CG2 33333333333 ");
mVertexBuffer = Ogre::v1::HardwareBufferManager::getSingleton().
createVertexBuffer(sizeof(POS_VERTEX),
numVertices,
Ogre::v1::HardwareBuffer::HBU_DYNAMIC);
// HydraxLOG("CG2 33333333333 ");
}
break;
}
//mVertexBuffer->unlock();
//HydraxLOG("CG25 ");
//HydraxLOG("3 ");
vbind->setBinding(0, mVertexBuffer);
//HydraxLOG("4 ");
unsigned int *indexbuffer = new unsigned int[numEle];
int i = 0;
for(int v=0; v<Complexity-1; v++){
for(int u=0; u<Complexity-1; u++){
// face 1 |/
indexbuffer[i++] = v*Complexity + u;
indexbuffer[i++] = v*Complexity + u + 1;
indexbuffer[i++] = (v+1)*Complexity + u;
// face 2 /|
indexbuffer[i++] = (v+1)*Complexity + u;
indexbuffer[i++] = v*Complexity + u + 1;
indexbuffer[i++] = (v+1)*Complexity + u + 1;
}
}
//HydraxLOG("5 ");
//HydraxLOG("CG2RRRR ");
// Prepare buffer for indices
mIndexBuffer =
Ogre::v1::HardwareBufferManager::getSingleton().createIndexBuffer(
Ogre::v1::HardwareIndexBuffer::IT_32BIT,
numEle,
Ogre::v1::HardwareBuffer::HBU_DYNAMIC, true);
//HydraxLOG("CG2TTTTT ");
//mIndexBuffer->unlock();
//HydraxLOG("6 ");
mIndexBuffer->
writeData(0,
mIndexBuffer->getSizeInBytes(),
indexbuffer,
true);
//HydraxLOG("61 ");
//HydraxLOG("CG2RRRRRRRRRRRRRRRRRRRRRRRRRRRRR ");
delete []indexbuffer;
//HydraxLOG("62 ");
// Set index buffer for this submesh
mSubMesh->indexData[0]->indexBuffer = mIndexBuffer;
//HydraxLOG("6 3");
mSubMesh->indexData[0]->indexStart = 0;
// HydraxLOG("6 4");
mSubMesh->indexData[0]->indexCount = numEle;
//HydraxLOG("7 ");
}