Sdk/GraphicsComponent: Add Detach method
Former-commit-id: 16bcd7d8a3b50235cdd50443d8a1ed55e4b939f2 [formerly 93e838eebb955d5bbe17113ced86a247122bf522] Former-commit-id: be3d0d2e8fb9a887eb903c6b17f16a56e5eee1c7
This commit is contained in:
parent
84039cd78a
commit
04e52caa88
|
|
@ -31,6 +31,8 @@ namespace Ndk
|
|||
|
||||
inline void Attach(Nz::InstancedRenderableRef renderable, int renderOrder = 0);
|
||||
|
||||
inline void Detach(Nz::InstancedRenderableRef renderable);
|
||||
|
||||
inline void EnsureBoundingVolumeUpdate() 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);
|
||||
|
||||
mutable Nz::InstancedRenderable::InstanceData data;
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@
|
|||
// For conditions of distribution and use, see copyright notice in Prerequesites.hpp
|
||||
|
||||
#include <algorithm>
|
||||
#include "GraphicsComponent.hpp"
|
||||
|
||||
namespace Ndk
|
||||
{
|
||||
|
|
@ -46,6 +47,18 @@ namespace Ndk
|
|||
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
|
||||
{
|
||||
if (!m_boundingVolumeUpdated)
|
||||
|
|
|
|||
|
|
@ -55,14 +55,27 @@ namespace Nz
|
|||
struct InstanceData
|
||||
{
|
||||
InstanceData(Matrix4f& referenceMatrix) :
|
||||
transformMatrix(referenceMatrix),
|
||||
transformMatrix(&referenceMatrix),
|
||||
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;
|
||||
BoundingVolumef volume;
|
||||
Matrix4f& transformMatrix;
|
||||
Matrix4f* transformMatrix;
|
||||
UInt32 flags;
|
||||
int renderOrder;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -211,7 +211,7 @@ namespace Nz
|
|||
*/
|
||||
|
||||
String::String(const std::string& string) :
|
||||
String(string.c_str(), string.size())
|
||||
String(string.data(), string.size())
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -30,7 +30,7 @@ namespace Nz
|
|||
if (!m_material)
|
||||
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);
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
|||
|
|
@ -80,7 +80,7 @@ namespace Nz
|
|||
NazaraAssert(instanceData, "Invalid instance data");
|
||||
NazaraUnused(instanceData);
|
||||
|
||||
instanceData->volume.Update(instanceData->transformMatrix);
|
||||
instanceData->volume.Update(*instanceData->transformMatrix);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
|
|
|||
|
|
@ -82,7 +82,7 @@ namespace Nz
|
|||
meshData.primitiveMode = mesh->GetPrimitiveMode();
|
||||
meshData.vertexBuffer = mesh->GetVertexBuffer();
|
||||
|
||||
renderQueue->AddMesh(instanceData.renderOrder, material, meshData, mesh->GetAABB(), instanceData.transformMatrix);
|
||||
renderQueue->AddMesh(instanceData.renderOrder, material, meshData, mesh->GetAABB(), *instanceData.transformMatrix);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -69,7 +69,7 @@ namespace Nz
|
|||
meshData.primitiveMode = mesh->GetPrimitiveMode();
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -58,19 +58,19 @@ namespace Nz
|
|||
SparsePtr<Vector2f> texCoordPtr(&vertices[0].uv, sizeof(VertexStruct_XYZ_Color_UV));
|
||||
|
||||
*colorPtr++ = m_color;
|
||||
*posPtr++ = instanceData->transformMatrix.Transform(Vector3f(0.f));
|
||||
*posPtr++ = instanceData->transformMatrix->Transform(Vector3f(0.f));
|
||||
*texCoordPtr++ = m_textureCoords.GetCorner(RectCorner_LeftTop);
|
||||
|
||||
*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);
|
||||
|
||||
*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);
|
||||
|
||||
*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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -310,7 +310,7 @@ namespace Nz
|
|||
Vector3f localPos = localVertex->position.x*Vector3f::Right() + localVertex->position.y*Vector3f::Down();
|
||||
localPos *= m_scale;
|
||||
|
||||
*pos++ = instanceData->transformMatrix.Transform(localPos);
|
||||
*pos++ = instanceData->transformMatrix->Transform(localPos);
|
||||
*color++ = m_color * localVertex->color;
|
||||
*uv++ = localVertex->uv;
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue