Remade sprite rendering

Added VertexColor shader flag
Added color sprite attribute
Added VertexStruct_XY_Color(_UV) struct & declaration


Former-commit-id: b664f4520aa55f4502f85f9dedab9b92040a8c16
This commit is contained in:
Lynix
2015-01-04 13:19:07 +01:00
parent 97ff9bc4ac
commit 4de17fdffb
22 changed files with 264 additions and 145 deletions

View File

@@ -12,6 +12,8 @@
#include <Nazara/Utility/StaticMesh.hpp>
#include <Nazara/Graphics/Debug.hpp>
///FIXME: Régler ce problème de dépendance aux ressources
namespace
{
enum ResourceType
@@ -121,23 +123,17 @@ void NzForwardRenderQueue::AddMesh(const NzMaterial* material, const NzMeshData&
}
}
void NzForwardRenderQueue::AddSprite(const NzSprite* sprite)
void NzForwardRenderQueue::AddSprites(const NzMaterial* material, const NzVertexStruct_XYZ_Color_UV* vertices, unsigned int spriteCount)
{
#if NAZARA_GRAPHICS_SAFE
if (!sprite)
BasicSpriteBatches::iterator it = basicSprites.find(material);
if (it == basicSprites.end())
{
NazaraError("Invalid sprite");
return;
it = basicSprites.insert(std::make_pair(material, BasicSpriteBatches::mapped_type())).first;
material->AddResourceListener(this, ResourceType_Material);
}
if (!sprite->IsDrawable())
{
NazaraError("Sprite is not drawable");
return;
}
#endif
sprites[sprite->GetMaterial()].push_back(sprite);
auto& spriteVector = it->second;
spriteVector.push_back(SpriteChain_XYZ_Color_UV({vertices, spriteCount}));
}
void NzForwardRenderQueue::Clear(bool fully)
@@ -150,6 +146,13 @@ void NzForwardRenderQueue::Clear(bool fully)
if (fully)
{
for (auto& matIt : basicSprites)
{
const NzMaterial* material = matIt.first;
material->RemoveResourceListener(this);
}
basicSprites.clear();
for (auto& matIt : opaqueModels)
{
const NzMaterial* material = matIt.first;
@@ -167,7 +170,6 @@ void NzForwardRenderQueue::Clear(bool fully)
}
}
opaqueModels.clear();
sprites.clear();
}
}
@@ -210,6 +212,7 @@ bool NzForwardRenderQueue::OnResourceDestroy(const NzResource* resource, int ind
}
case ResourceType_Material:
basicSprites.erase(static_cast<const NzMaterial*>(resource));
opaqueModels.erase(static_cast<const NzMaterial*>(resource));
break;
@@ -260,6 +263,15 @@ void NzForwardRenderQueue::OnResourceReleased(const NzResource* resource, int in
case ResourceType_Material:
{
for (auto it = basicSprites.begin(); it != basicSprites.end(); ++it)
{
if (it->first == resource)
{
basicSprites.erase(it);
break;
}
}
for (auto it = opaqueModels.begin(); it != opaqueModels.end(); ++it)
{
if (it->first == resource)
@@ -268,6 +280,7 @@ void NzForwardRenderQueue::OnResourceReleased(const NzResource* resource, int in
break;
}
}
break;
}
@@ -299,7 +312,6 @@ bool NzForwardRenderQueue::BatchedModelMaterialComparator::operator()(const NzMa
const NzShader* shader1 = mat1->GetShaderInstance()->GetShader();
const NzShader* shader2 = mat2->GetShaderInstance()->GetShader();
if (shader1 != shader2)
return shader1 < shader2;
@@ -320,7 +332,6 @@ bool NzForwardRenderQueue::BatchedSpriteMaterialComparator::operator()(const NzM
const NzShader* shader1 = mat1->GetShaderInstance()->GetShader();
const NzShader* shader2 = mat2->GetShaderInstance()->GetShader();
if (shader1 != shader2)
return shader1 < shader2;