/* * Copyright (c) Contributors to the Open 3D Engine Project. * For complete copyright and license terms please see the LICENSE at the root of this distribution. * * SPDX-License-Identifier: Apache-2.0 OR MIT * */ #include "TangentSpaceHelper.h" #include "WhiteBoxMeshAtomData.h" #include namespace WhiteBox { WhiteBoxMeshAtomData::WhiteBoxMeshAtomData(const WhiteBoxFaces& faceData) { const size_t faceCount = faceData.size(); const size_t vertCount = faceCount * 3; // mesh vertex attribute data in host memory format AZStd::vector positions(vertCount); AZStd::vector normals(vertCount); AZStd::vector uvs(vertCount); m_indices.resize_no_construct(vertCount); m_positions.resize_no_construct(vertCount); m_normals.resize_no_construct(vertCount); m_tangents.resize_no_construct(vertCount); m_bitangents.resize_no_construct(vertCount); m_uvs.resize_no_construct(vertCount); m_colors.resize(vertCount, AZ::Vector4::CreateOne()); // populate the index vector with a [0, vertCount) sequence std::iota(std::begin(m_indices), std::end(m_indices), 0); for (size_t idxFace = 0; idxFace < faceCount; idxFace++) { const auto face = faceData[idxFace]; // v1 positions[idxFace * 3 + 0] = face.m_v1.m_position; uvs[idxFace * 3 + 0] = face.m_v1.m_uv; // v2 positions[idxFace * 3 + 1] = face.m_v2.m_position; uvs[idxFace * 3 + 1] = face.m_v2.m_uv; // v3 positions[idxFace * 3 + 2] = face.m_v3.m_position; uvs[idxFace * 3 + 2] = face.m_v3.m_uv; } // calculate the basis vectors for the TBN matrices // TODO: LYN-782 AZTangentSpaceCalculation tangentSpaceCalculation; tangentSpaceCalculation.Calculate(positions, m_indices, uvs); for (size_t i = 0; i < vertCount; i++) { const auto normal = tangentSpaceCalculation.GetNormal(i); const auto tangent = tangentSpaceCalculation.GetTangent(i); const auto bitangent = tangentSpaceCalculation.GetBitangent(i); m_aabb.AddPoint(positions[i]); // populate the mesh vertex attribute data in device memory format m_positions[i] = AZ::PackedVector3f(positions[i]); m_normals[i] = AZ::PackedVector3f(normal); m_tangents[i].Set(tangent, 1.0f); m_bitangents[i] = AZ::PackedVector3f(bitangent); m_uvs[i] = {uvs[i].GetX(), uvs[i].GetY()}; } } const uint32_t WhiteBoxMeshAtomData::VertexCount() const { return m_indices.size(); } const AZStd::vector& WhiteBoxMeshAtomData::GetIndices() const { return m_indices; } const AZStd::vector& WhiteBoxMeshAtomData::GetPositions() const { return m_positions; } const AZStd::vector& WhiteBoxMeshAtomData::GetNormals() const { return m_normals; } const AZStd::vector& WhiteBoxMeshAtomData::GetTangents() const { return m_tangents; } const AZStd::vector& WhiteBoxMeshAtomData::GetBitangents() const { return m_bitangents; } const AZStd::vector& WhiteBoxMeshAtomData::GetUVs() const { return m_uvs; } const AZStd::vector& WhiteBoxMeshAtomData::GetColors() const { return m_colors; } AZ::Aabb WhiteBoxMeshAtomData::GetAabb() const { return m_aabb; } } // namespace WhiteBox