/* * 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 * */ #pragma once #include #include #include #include #include #include #include #include namespace AZ { class ReflectContext; } namespace AZ::SceneAPI::DataTypes { class IBlendShapeData; } namespace AZ::SceneAPI::DataTypes { class IMeshData; } namespace AZ::SceneAPI::DataTypes { class IMeshGroup; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexUVData; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexTangentData; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexBitangentData; } namespace AZ::SceneAPI::DataTypes { class ISkinWeightData; } namespace AZ::SceneAPI::DataTypes { class IMeshVertexColorData; } namespace AZ::SceneAPI::Events { class GenerateSimplificationEventContext; } namespace AZ::SceneData::GraphData { class BlendShapeData; } namespace AZ::SceneData::GraphData { class MeshData; } namespace AZ::SceneData::GraphData { class MeshVertexBitangentData; } namespace AZ::SceneData::GraphData { class MeshVertexColorData; } namespace AZ::SceneData::GraphData { class MeshVertexTangentData; } namespace AZ::SceneData::GraphData { class MeshVertexUVData; } namespace AZ::SceneAPI::Containers { class SceneGraph; } namespace AZ::SceneGenerationComponents { class MeshOptimizerComponent : public AZ::SceneAPI::SceneCore::GenerationComponent { public: AZ_COMPONENT(MeshOptimizerComponent, "{05791580-A464-436C-B3EA-36AD68A42BC8}", AZ::SceneAPI::SceneCore::GenerationComponent) MeshOptimizerComponent(); static void Reflect(AZ::ReflectContext* context); AZ::SceneAPI::Events::ProcessingResult OptimizeMeshes(AZ::SceneAPI::Events::GenerateSimplificationEventContext& context) const; static bool HasAnyBlendShapeChild(const AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex); private: template static AZStd::tuple< AZStd::unique_ptr, AZStd::vector>, AZStd::vector>, AZStd::vector>, AZStd::vector>, AZStd::unique_ptr > OptimizeMesh( const MeshDataType* meshData, const SceneAPI::DataTypes::IMeshData* baseMesh, const AZStd::vector>& uvs, const AZStd::vector>& tangents, const AZStd::vector>& bitangents, const AZStd::vector>& vertexColors, const AZStd::vector>& skinWeights, const AZ::SceneAPI::DataTypes::IMeshGroup& meshGroup, bool hasBlendShapes); static void AddFace(AZ::SceneData::GraphData::BlendShapeData* blendShape, unsigned int index1, unsigned int index2, unsigned int index3, unsigned int faceMaterialId); static void AddFace(AZ::SceneData::GraphData::MeshData* mesh, unsigned int index1, unsigned int index2, unsigned int index3, unsigned int faceMaterialId); }; } // namespace AZ::SceneGenerationComponents