// Copyright (C) 2012 Jérôme Leclercq // This file is part of the "Nazara Engine - Utility module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include #include #include #include #include NzStaticMesh::NzStaticMesh(const NzMesh* parent) : NzSubMesh(parent) { } NzStaticMesh::~NzStaticMesh() { Destroy(); } bool NzStaticMesh::Create(NzVertexBuffer* vertexBuffer) { Destroy(); #if NAZARA_UTILITY_SAFE if (!vertexBuffer) { NazaraError("Invalid vertex buffer"); return false; } #endif m_vertexBuffer = vertexBuffer; m_vertexBuffer->AddResourceListener(this); return true; } void NzStaticMesh::Destroy() { if (m_indexBuffer) { m_indexBuffer->RemoveResourceListener(this); m_indexBuffer = nullptr; } if (m_vertexBuffer) { m_vertexBuffer->RemoveResourceListener(this); m_vertexBuffer = nullptr; } } void NzStaticMesh::Finish() { // La seule chose à faire ici est de calculer l'AABB GenerateAABB(); } bool NzStaticMesh::GenerateAABB() { // On lock le buffer pour itérer sur toutes les positions et composer notre AABB NzBufferMapper mapper(m_vertexBuffer, nzBufferAccess_ReadOnly); m_aabb.MakeZero(); NzMeshVertex* vertex = reinterpret_cast(mapper.GetPointer()); unsigned int vertexCount = m_vertexBuffer->GetVertexCount(); for (unsigned int i = 0; i < vertexCount; ++i) { m_aabb.ExtendTo(vertex->position); vertex++; } return true; } const NzCubef& NzStaticMesh::GetAABB() const { return m_aabb; } nzAnimationType NzStaticMesh::GetAnimationType() const { return nzAnimationType_Static; } const NzIndexBuffer* NzStaticMesh::GetIndexBuffer() const { return m_indexBuffer; } NzVertexBuffer* NzStaticMesh::GetVertexBuffer() { return m_vertexBuffer; } const NzVertexBuffer* NzStaticMesh::GetVertexBuffer() const { return m_vertexBuffer; } unsigned int NzStaticMesh::GetVertexCount() const { return m_vertexBuffer->GetVertexCount(); } bool NzStaticMesh::IsAnimated() const { return false; } bool NzStaticMesh::IsValid() const { return m_vertexBuffer != nullptr; } void NzStaticMesh::SetAABB(const NzCubef& aabb) { m_aabb = aabb; } void NzStaticMesh::SetIndexBuffer(const NzIndexBuffer* indexBuffer) { if (m_indexBuffer) m_indexBuffer->RemoveResourceListener(this); if (indexBuffer) indexBuffer->AddResourceListener(this); m_indexBuffer = indexBuffer; } void NzStaticMesh::OnResourceReleased(const NzResource* resource, int index) { NazaraUnused(index); if (resource == m_indexBuffer) m_indexBuffer = nullptr; else if (resource == m_vertexBuffer) m_vertexBuffer = nullptr; else NazaraInternalError("Not listening to " + NzString::Pointer(resource)); resource->RemoveResourceListener(this); }