You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
97 lines
4.7 KiB
C++
97 lines
4.7 KiB
C++
/*
|
|
* 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 <SceneAPI/SceneCore/Components/GenerationComponent.h>
|
|
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
|
#include <SceneAPI/SceneData/Rules/TangentsRule.h>
|
|
#include <AzCore/RTTI/RTTI.h>
|
|
|
|
namespace AZ::SceneAPI::DataTypes { class IMeshData; }
|
|
namespace AZ::SceneAPI::DataTypes { class IMeshVertexUVData; }
|
|
namespace AZ::SceneAPI::DataTypes { class IMeshVertexTangentData; }
|
|
namespace AZ::SceneAPI::DataTypes { class IMeshVertexBitangentData; }
|
|
namespace AZ::SceneAPI::DataTypes { enum class TangentSpace; }
|
|
namespace AZ::SceneData::GraphData
|
|
{
|
|
class BlendShapeData;
|
|
}
|
|
|
|
namespace AZ::SceneGenerationComponents
|
|
{
|
|
struct TangentGenerateContext
|
|
: public AZ::SceneAPI::Events::ICallContext
|
|
{
|
|
AZ_RTTI(TangentGenerateContext, "{E836F8F8-5A66-497C-89CC-2D37D741CCAA}", AZ::SceneAPI::Events::ICallContext)
|
|
|
|
TangentGenerateContext(AZ::SceneAPI::Containers::Scene& scene)
|
|
: m_scene(scene) {}
|
|
TangentGenerateContext& operator=(const TangentGenerateContext& other) = delete;
|
|
|
|
AZ::SceneAPI::Containers::Scene& GetScene() { return m_scene; }
|
|
const AZ::SceneAPI::Containers::Scene& GetScene() const { return m_scene; }
|
|
|
|
private:
|
|
AZ::SceneAPI::Containers::Scene& m_scene;
|
|
};
|
|
|
|
|
|
class TangentGenerateComponent
|
|
: public AZ::SceneAPI::SceneCore::GenerationComponent
|
|
{
|
|
public:
|
|
AZ_COMPONENT(TangentGenerateComponent, "{57743E6F-8718-491C-8A82-24A6763904F5}", AZ::SceneAPI::SceneCore::GenerationComponent);
|
|
|
|
TangentGenerateComponent();
|
|
|
|
static void Reflect(AZ::ReflectContext* context);
|
|
|
|
AZ::SceneAPI::Events::ProcessingResult GenerateTangentData(TangentGenerateContext& context);
|
|
|
|
private:
|
|
void FindBlendShapes(
|
|
AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
|
AZStd::vector<AZ::SceneData::GraphData::BlendShapeData*>& outBlendShapes) const;
|
|
bool GenerateTangentsForMesh(
|
|
AZ::SceneAPI::Containers::Scene& scene,
|
|
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
|
AZ::SceneAPI::DataTypes::IMeshData* meshData,
|
|
AZ::SceneAPI::DataTypes::TangentGenerationMethod defaultGenerationMethod);
|
|
bool UpdateFbxTangentWValues(
|
|
AZ::SceneAPI::Containers::SceneGraph& graph,
|
|
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
|
const AZ::SceneAPI::DataTypes::IMeshData* meshData,
|
|
bool deubgBitangentFlip);
|
|
const AZ::SceneAPI::SceneData::TangentsRule* GetTangentRule(const AZ::SceneAPI::Containers::Scene& scene) const;
|
|
void GetRegistrySettings(
|
|
AZ::SceneAPI::DataTypes::TangentGenerationMethod& defaultTangentGenrationMethod, bool& debugBitangentFlip) const;
|
|
|
|
size_t CalcUvSetCount(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex) const;
|
|
AZ::SceneAPI::DataTypes::IMeshVertexUVData* FindUvData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 uvSet) const;
|
|
|
|
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* FindTangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex) const;
|
|
bool CreateTangentLayer(AZ::SceneAPI::Containers::SceneManifest& manifest,
|
|
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
|
size_t numVerts,
|
|
size_t uvSetIndex,
|
|
AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
|
|
AZ::SceneAPI::Containers::SceneGraph& graph,
|
|
AZ::SceneAPI::DataTypes::IMeshVertexTangentData** outTangentData);
|
|
|
|
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* FindBitangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex) const;
|
|
bool CreateBitangentLayer(AZ::SceneAPI::Containers::SceneManifest& manifest,
|
|
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
|
size_t numVerts,
|
|
size_t uvSetIndex,
|
|
AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
|
|
AZ::SceneAPI::Containers::SceneGraph& graph,
|
|
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData** outBitangentData);
|
|
};
|
|
} // namespace AZ::SceneGenerationComponents
|