Fixed crash

Plus fixed transparency comparison
Plus optimized material comparison


Former-commit-id: d812adc54e8ae529cd1a1fd29202f6aaae97544a
This commit is contained in:
Lynix 2013-08-26 01:01:26 +02:00
parent cb6563775a
commit aafcd6bd03
1 changed files with 30 additions and 15 deletions

View File

@ -148,8 +148,10 @@ void NzForwardRenderQueue::AddSubMesh(const NzMaterial* material, const NzSubMes
unsigned int index = transparentStaticModels.size(); unsigned int index = transparentStaticModels.size();
transparentStaticModels.resize(index+1); transparentStaticModels.resize(index+1);
const NzBoxf& aabb = staticMesh->GetAABB();
TransparentStaticModel& data = transparentStaticModels.back(); TransparentStaticModel& data = transparentStaticModels.back();
data.boundingSphere = NzSpheref(transformMatrix.GetTranslation(), staticMesh->GetAABB().GetSquaredRadius()); data.boundingSphere = NzSpheref(transformMatrix.GetTranslation() + aabb.GetCenter(), aabb.GetSquaredRadius());
data.material = material; data.material = material;
data.mesh = staticMesh; data.mesh = staticMesh;
data.transformMatrix = transformMatrix; data.transformMatrix = transformMatrix;
@ -208,6 +210,25 @@ void NzForwardRenderQueue::Clear(bool fully)
if (fully) if (fully)
{ {
for (auto& matIt : opaqueModels)
{
const NzMaterial* material = matIt.first;
material->RemoveResourceListener(this);
BatchedSkeletalMeshContainer& skeletalContainer = std::get<2>(matIt.second);
for (auto& meshIt : skeletalContainer)
{
const NzSkeletalMesh* skeletalMesh = meshIt.first;
skeletalMesh->RemoveResourceListener(this);
}
BatchedStaticMeshContainer& staticContainer = std::get<3>(matIt.second);
for (auto& meshIt : staticContainer)
{
const NzStaticMesh* staticMesh = meshIt.first;
staticMesh->RemoveResourceListener(this);
}
}
opaqueModels.clear(); opaqueModels.clear();
sprites.clear(); sprites.clear();
} }
@ -272,14 +293,11 @@ bool NzForwardRenderQueue::OnResourceDestroy(const NzResource* resource, int ind
bool NzForwardRenderQueue::BatchedModelMaterialComparator::operator()(const NzMaterial* mat1, const NzMaterial* mat2) bool NzForwardRenderQueue::BatchedModelMaterialComparator::operator()(const NzMaterial* mat1, const NzMaterial* mat2)
{ {
for (unsigned int i = 0; i <= nzShaderFlags_Max; ++i) const NzShaderProgram* program1 = mat1->GetShaderProgram(nzShaderTarget_Model, 0);
{ const NzShaderProgram* program2 = mat2->GetShaderProgram(nzShaderTarget_Model, 0);
const NzShaderProgram* program1 = mat1->GetShaderProgram(nzShaderTarget_Model, i);
const NzShaderProgram* program2 = mat2->GetShaderProgram(nzShaderTarget_Model, i);
if (program1 != program2) if (program1 != program2)
return program1 < program2; return program1 < program2;
}
const NzTexture* diffuseMap1 = mat1->GetDiffuseMap(); const NzTexture* diffuseMap1 = mat1->GetDiffuseMap();
const NzTexture* diffuseMap2 = mat2->GetDiffuseMap(); const NzTexture* diffuseMap2 = mat2->GetDiffuseMap();
@ -291,14 +309,11 @@ bool NzForwardRenderQueue::BatchedModelMaterialComparator::operator()(const NzMa
bool NzForwardRenderQueue::BatchedSpriteMaterialComparator::operator()(const NzMaterial* mat1, const NzMaterial* mat2) bool NzForwardRenderQueue::BatchedSpriteMaterialComparator::operator()(const NzMaterial* mat1, const NzMaterial* mat2)
{ {
for (unsigned int i = 0; i <= nzShaderFlags_Max; ++i) const NzShaderProgram* program1 = mat1->GetShaderProgram(nzShaderTarget_Sprite, 0);
{ const NzShaderProgram* program2 = mat2->GetShaderProgram(nzShaderTarget_Sprite, 0);
const NzShaderProgram* program1 = mat1->GetShaderProgram(nzShaderTarget_Sprite, i);
const NzShaderProgram* program2 = mat2->GetShaderProgram(nzShaderTarget_Sprite, i);
if (program1 != program2) if (program1 != program2)
return program1 < program2; return program1 < program2;
}
const NzTexture* diffuseMap1 = mat1->GetDiffuseMap(); const NzTexture* diffuseMap1 = mat1->GetDiffuseMap();
const NzTexture* diffuseMap2 = mat2->GetDiffuseMap(); const NzTexture* diffuseMap2 = mat2->GetDiffuseMap();