Sdk/GraphicsComponent: Add Detach method

Former-commit-id: 16bcd7d8a3b50235cdd50443d8a1ed55e4b939f2 [formerly 93e838eebb955d5bbe17113ced86a247122bf522]
Former-commit-id: be3d0d2e8fb9a887eb903c6b17f16a56e5eee1c7
This commit is contained in:
Lynix 2016-06-20 13:11:31 +02:00
parent 84039cd78a
commit 04e52caa88
10 changed files with 56 additions and 12 deletions

View File

@ -31,6 +31,8 @@ namespace Ndk
inline void Attach(Nz::InstancedRenderableRef renderable, int renderOrder = 0); inline void Attach(Nz::InstancedRenderableRef renderable, int renderOrder = 0);
inline void Detach(Nz::InstancedRenderableRef renderable);
inline void EnsureBoundingVolumeUpdate() const; inline void EnsureBoundingVolumeUpdate() const;
inline void EnsureTransformMatrixUpdate() const; inline void EnsureTransformMatrixUpdate() const;
@ -63,6 +65,22 @@ namespace Ndk
{ {
} }
Renderable(Renderable&& renderable) noexcept :
data(std::move(renderable.data)),
renderable(std::move(renderable.renderable)),
dataUpdated(renderable.dataUpdated)
{
}
Renderable& operator=(Renderable&& r) noexcept
{
data = std::move(r.data);
dataUpdated = r.dataUpdated;
renderable = std::move(r.renderable);
return *this;
}
NazaraSlot(Nz::InstancedRenderable, OnInstancedRenderableInvalidateData, renderableInvalidationSlot); NazaraSlot(Nz::InstancedRenderable, OnInstancedRenderableInvalidateData, renderableInvalidationSlot);
mutable Nz::InstancedRenderable::InstanceData data; mutable Nz::InstancedRenderable::InstanceData data;

View File

@ -3,6 +3,7 @@
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp // For conditions of distribution and use, see copyright notice in Prerequesites.hpp
#include <algorithm> #include <algorithm>
#include "GraphicsComponent.hpp"
namespace Ndk namespace Ndk
{ {
@ -46,6 +47,18 @@ namespace Ndk
InvalidateBoundingVolume(); InvalidateBoundingVolume();
} }
inline void GraphicsComponent::Detach(Nz::InstancedRenderableRef renderable)
{
for (auto it = m_renderables.begin(); it != m_renderables.end(); ++it)
{
if (it->renderable == renderable)
{
m_renderables.erase(it);
break;
}
}
}
inline void GraphicsComponent::EnsureBoundingVolumeUpdate() const inline void GraphicsComponent::EnsureBoundingVolumeUpdate() const
{ {
if (!m_boundingVolumeUpdated) if (!m_boundingVolumeUpdated)

View File

@ -55,14 +55,27 @@ namespace Nz
struct InstanceData struct InstanceData
{ {
InstanceData(Matrix4f& referenceMatrix) : InstanceData(Matrix4f& referenceMatrix) :
transformMatrix(referenceMatrix), transformMatrix(&referenceMatrix),
flags(0) flags(0)
{ {
} }
InstanceData(InstanceData&& instanceData) noexcept = default;
InstanceData& operator=(InstanceData&& instanceData) noexcept
{
data = std::move(instanceData.data);
flags = instanceData.flags;
renderOrder = instanceData.renderOrder;
transformMatrix = instanceData.transformMatrix;
volume = instanceData.volume;
return *this;
}
std::vector<UInt8> data; std::vector<UInt8> data;
BoundingVolumef volume; BoundingVolumef volume;
Matrix4f& transformMatrix; Matrix4f* transformMatrix;
UInt32 flags; UInt32 flags;
int renderOrder; int renderOrder;
}; };

View File

@ -211,7 +211,7 @@ namespace Nz
*/ */
String::String(const std::string& string) : String::String(const std::string& string) :
String(string.c_str(), string.size()) String(string.data(), string.size())
{ {
} }

View File

@ -30,7 +30,7 @@ namespace Nz
if (!m_material) if (!m_material)
return; return;
renderQueue->AddBillboard(instanceData.renderOrder, m_material, instanceData.transformMatrix.GetTranslation(), m_size, m_sinCos, m_color); renderQueue->AddBillboard(instanceData.renderOrder, m_material, instanceData.transformMatrix->GetTranslation(), m_size, m_sinCos, m_color);
} }
/* /*

View File

@ -80,7 +80,7 @@ namespace Nz
NazaraAssert(instanceData, "Invalid instance data"); NazaraAssert(instanceData, "Invalid instance data");
NazaraUnused(instanceData); NazaraUnused(instanceData);
instanceData->volume.Update(instanceData->transformMatrix); instanceData->volume.Update(*instanceData->transformMatrix);
} }
/*! /*!

View File

@ -82,7 +82,7 @@ namespace Nz
meshData.primitiveMode = mesh->GetPrimitiveMode(); meshData.primitiveMode = mesh->GetPrimitiveMode();
meshData.vertexBuffer = mesh->GetVertexBuffer(); meshData.vertexBuffer = mesh->GetVertexBuffer();
renderQueue->AddMesh(instanceData.renderOrder, material, meshData, mesh->GetAABB(), instanceData.transformMatrix); renderQueue->AddMesh(instanceData.renderOrder, material, meshData, mesh->GetAABB(), *instanceData.transformMatrix);
} }
} }

View File

@ -69,7 +69,7 @@ namespace Nz
meshData.primitiveMode = mesh->GetPrimitiveMode(); meshData.primitiveMode = mesh->GetPrimitiveMode();
meshData.vertexBuffer = SkinningManager::GetBuffer(mesh, &m_skeleton); meshData.vertexBuffer = SkinningManager::GetBuffer(mesh, &m_skeleton);
renderQueue->AddMesh(instanceData.renderOrder, material, meshData, m_skeleton.GetAABB(), instanceData.transformMatrix); renderQueue->AddMesh(instanceData.renderOrder, material, meshData, m_skeleton.GetAABB(), *instanceData.transformMatrix);
} }
} }

View File

@ -58,19 +58,19 @@ namespace Nz
SparsePtr<Vector2f> texCoordPtr(&vertices[0].uv, sizeof(VertexStruct_XYZ_Color_UV)); SparsePtr<Vector2f> texCoordPtr(&vertices[0].uv, sizeof(VertexStruct_XYZ_Color_UV));
*colorPtr++ = m_color; *colorPtr++ = m_color;
*posPtr++ = instanceData->transformMatrix.Transform(Vector3f(0.f)); *posPtr++ = instanceData->transformMatrix->Transform(Vector3f(0.f));
*texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_LeftTop); *texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_LeftTop);
*colorPtr++ = m_color; *colorPtr++ = m_color;
*posPtr++ = instanceData->transformMatrix.Transform(m_size.x*Vector3f::Right()); *posPtr++ = instanceData->transformMatrix->Transform(m_size.x*Vector3f::Right());
*texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_RightTop); *texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_RightTop);
*colorPtr++ = m_color; *colorPtr++ = m_color;
*posPtr++ = instanceData->transformMatrix.Transform(m_size.y*Vector3f::Down()); *posPtr++ = instanceData->transformMatrix->Transform(m_size.y*Vector3f::Down());
*texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_LeftBottom); *texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_LeftBottom);
*colorPtr++ = m_color; *colorPtr++ = m_color;
*posPtr++ = instanceData->transformMatrix.Transform(m_size.x*Vector3f::Right() + m_size.y*Vector3f::Down()); *posPtr++ = instanceData->transformMatrix->Transform(m_size.x*Vector3f::Right() + m_size.y*Vector3f::Down());
*texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_RightBottom); *texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_RightBottom);
} }

View File

@ -310,7 +310,7 @@ namespace Nz
Vector3f localPos = localVertex->position.x*Vector3f::Right() + localVertex->position.y*Vector3f::Down(); Vector3f localPos = localVertex->position.x*Vector3f::Right() + localVertex->position.y*Vector3f::Down();
localPos *= m_scale; localPos *= m_scale;
*pos++ = instanceData->transformMatrix.Transform(localPos); *pos++ = instanceData->transformMatrix->Transform(localPos);
*color++ = m_color * localVertex->color; *color++ = m_color * localVertex->color;
*uv++ = localVertex->uv; *uv++ = localVertex->uv;