Sdk/GraphicsComponent: Add Detach method
Former-commit-id: b80b7e52f4736f61c439a4242531adaefbdb75a2 [formerly 2c336b6480ae9a11ca1104ee1140e8f449bb2a02] Former-commit-id: 54f77c634ce1f9bfc93a00d9a14567bd25a06b26
This commit is contained in:
parent
499f9e0dff
commit
e0071b196a
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
|
||||||
|
|
@ -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())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue