TSpace setting for MikkT tangent generation (#2386)
* Added TSpace method setting which is only visible for MikkT generation. * Fixed a bug with generating tangents for blend shapes. * Renamed tangent space into generation method. * Some code cleaning Signed-off-by: Benjamin Jillich <jillich@amazon.com>
This commit is contained in:
+27
-23
@@ -15,8 +15,6 @@
|
||||
#include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexTangentData.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexBitangentData.h>
|
||||
|
||||
#include <SceneAPI/SceneData/Rules/TangentsRule.h>
|
||||
|
||||
#include <SceneAPI/SceneCore/Containers/Views/PairIterator.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Views/SceneGraphDownwardsIterator.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Views/SceneGraphChildIterator.h>
|
||||
@@ -52,7 +50,7 @@ namespace AZ::SceneGenerationComponents
|
||||
}
|
||||
}
|
||||
|
||||
AZ::SceneAPI::DataTypes::TangentSpace TangentGenerateComponent::GetTangentSpaceFromRule(const AZ::SceneAPI::Containers::Scene& scene) const
|
||||
const AZ::SceneAPI::SceneData::TangentsRule* TangentGenerateComponent::GetTangentRule(const AZ::SceneAPI::Containers::Scene& scene) const
|
||||
{
|
||||
for (const auto& object : scene.GetManifest().GetValueStorage())
|
||||
{
|
||||
@@ -62,12 +60,12 @@ namespace AZ::SceneGenerationComponents
|
||||
const AZ::SceneAPI::SceneData::TangentsRule* rule = group->GetRuleContainerConst().FindFirstByType<AZ::SceneAPI::SceneData::TangentsRule>().get();
|
||||
if (rule)
|
||||
{
|
||||
return rule->GetTangentSpace();
|
||||
return rule;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return AZ::SceneAPI::DataTypes::TangentSpace::FromSourceScene;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
AZ::SceneAPI::Events::ProcessingResult TangentGenerateComponent::GenerateTangentData(TangentGenerateContext& context)
|
||||
@@ -189,8 +187,8 @@ namespace AZ::SceneGenerationComponents
|
||||
return true; // No fatal error
|
||||
}
|
||||
|
||||
// Check what tangent spaces we need.
|
||||
const AZ::SceneAPI::DataTypes::TangentSpace ruleTangentSpace = GetTangentSpaceFromRule(scene);
|
||||
const AZ::SceneAPI::SceneData::TangentsRule* tangentsRule = GetTangentRule(scene);
|
||||
const AZ::SceneAPI::DataTypes::TangentGenerationMethod ruleGenerationMethod = tangentsRule ? tangentsRule->GetGenerationMethod() : AZ::SceneAPI::DataTypes::TangentGenerationMethod::FromSourceScene;
|
||||
|
||||
// Find all blend shape data under the mesh. We need to generate the tangent and bitangent for blend shape as well.
|
||||
AZStd::vector<AZ::SceneData::GraphData::BlendShapeData*> blendShapes;
|
||||
@@ -208,12 +206,12 @@ namespace AZ::SceneGenerationComponents
|
||||
}
|
||||
|
||||
// Check if we had tangents inside the source scene file.
|
||||
AZ::SceneAPI::DataTypes::TangentSpace tangentSpace = ruleTangentSpace;
|
||||
AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod = ruleGenerationMethod;
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* tangentData = FindTangentData(graph, nodeIndex, uvSetIndex);
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* bitangentData = FindBitangentData(graph, nodeIndex, uvSetIndex);
|
||||
|
||||
// If all we need is import from the source scene, and we have tangent data from the source scene already, then skip generating.
|
||||
if ((tangentSpace == AZ::SceneAPI::DataTypes::TangentSpace::FromSourceScene))
|
||||
if ((generationMethod == AZ::SceneAPI::DataTypes::TangentGenerationMethod::FromSourceScene))
|
||||
{
|
||||
if (tangentData && bitangentData)
|
||||
{
|
||||
@@ -226,50 +224,56 @@ namespace AZ::SceneGenerationComponents
|
||||
// In case there are no tangents/bitangents while the user selected to use the source ones, default to MikkT.
|
||||
AZ_Warning(AZ::SceneAPI::Utilities::WarningWindow, false, "Cannot use source scene tangents as there are none in the asset for mesh '%s' for uv set %zu. Defaulting to generating tangents using MikkT.\n",
|
||||
scene.GetGraph().GetNodeName(nodeIndex).GetName(), uvSetIndex);
|
||||
tangentSpace = AZ::SceneAPI::DataTypes::TangentSpace::MikkT;
|
||||
generationMethod = AZ::SceneAPI::DataTypes::TangentGenerationMethod::MikkT;
|
||||
}
|
||||
}
|
||||
|
||||
if (!tangentData)
|
||||
{
|
||||
if (!AZ::SceneGenerationComponents::TangentGenerateComponent::CreateTangentLayer(scene.GetManifest(), nodeIndex, meshData->GetVertexCount(), uvSetIndex,
|
||||
tangentSpace, graph, &tangentData))
|
||||
generationMethod, graph, &tangentData))
|
||||
{
|
||||
AZ_Error(AZ::SceneAPI::Utilities::ErrorWindow, false, "Failed to create tangents data set for mesh %s for uv set %zu.\n",
|
||||
scene.GetGraph().GetNodeName(nodeIndex).GetName(), uvSetIndex);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
AZ_Assert(tangentData == FindTangentData(graph, nodeIndex, uvSetIndex), "Used tangent data is not the same as the graph returns.");
|
||||
|
||||
if (!bitangentData)
|
||||
{
|
||||
if (!AZ::SceneGenerationComponents::TangentGenerateComponent::CreateBitangentLayer(scene.GetManifest(), nodeIndex, meshData->GetVertexCount(), uvSetIndex,
|
||||
tangentSpace, graph, &bitangentData))
|
||||
generationMethod, graph, &bitangentData))
|
||||
{
|
||||
AZ_Error(AZ::SceneAPI::Utilities::ErrorWindow, false, "Failed to create bitangents data set for mesh %s for uv set %zu.\n",
|
||||
scene.GetGraph().GetNodeName(nodeIndex).GetName(), uvSetIndex);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
tangentData->SetTangentSpace(tangentSpace);
|
||||
bitangentData->SetTangentSpace(tangentSpace);
|
||||
AZ_Assert(bitangentData == FindBitangentData(graph, nodeIndex, uvSetIndex), "Used bitangent data is not the same as the graph returns.");
|
||||
|
||||
switch (tangentSpace)
|
||||
tangentData->SetGenerationMethod(generationMethod);
|
||||
bitangentData->SetGenerationMethod(generationMethod);
|
||||
|
||||
switch (generationMethod)
|
||||
{
|
||||
// Generate using MikkT space.
|
||||
case AZ::SceneAPI::DataTypes::TangentSpace::MikkT:
|
||||
case AZ::SceneAPI::DataTypes::TangentGenerationMethod::MikkT:
|
||||
{
|
||||
allSuccess &= AZ::TangentGeneration::Mesh::MikkT::GenerateTangents(meshData, uvData, tangentData, bitangentData);
|
||||
const AZ::SceneAPI::DataTypes::MikkTSpaceMethod tSpaceMethod = tangentsRule ? tangentsRule->GetMikkTSpaceMethod() : AZ::SceneAPI::DataTypes::MikkTSpaceMethod::TSpace;
|
||||
|
||||
allSuccess &= AZ::TangentGeneration::Mesh::MikkT::GenerateTangents(meshData, uvData, tangentData, bitangentData, tSpaceMethod);
|
||||
|
||||
for (AZ::SceneData::GraphData::BlendShapeData* blendShape : blendShapes)
|
||||
{
|
||||
allSuccess &= AZ::TangentGeneration::BlendShape::MikkT::GenerateTangents(blendShape, uvSetIndex);
|
||||
allSuccess &= AZ::TangentGeneration::BlendShape::MikkT::GenerateTangents(blendShape, uvSetIndex, tSpaceMethod);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
{
|
||||
AZ_Assert(false, "Unknown tangent space selected (spaceID=%d) for UV set %d, cannot generate tangents!\n", static_cast<AZ::u32>(tangentSpace), uvSetIndex);
|
||||
AZ_Assert(false, "Unknown tangent generation method selected (%d) for UV set %d, cannot generate tangents.\n", static_cast<AZ::u32>(generationMethod), uvSetIndex);
|
||||
allSuccess = false;
|
||||
}
|
||||
}
|
||||
@@ -339,7 +343,7 @@ namespace AZ::SceneGenerationComponents
|
||||
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
||||
size_t numVerts,
|
||||
size_t uvSetIndex,
|
||||
AZ::SceneAPI::DataTypes::TangentSpace tangentSpace,
|
||||
AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
|
||||
AZ::SceneAPI::Containers::SceneGraph& graph,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData** outTangentData)
|
||||
{
|
||||
@@ -356,7 +360,7 @@ namespace AZ::SceneGenerationComponents
|
||||
}
|
||||
|
||||
tangentData->SetTangentSetIndex(uvSetIndex);
|
||||
tangentData->SetTangentSpace(tangentSpace);
|
||||
tangentData->SetGenerationMethod(generationMethod);
|
||||
|
||||
const AZStd::string tangentGeneratedName = AZStd::string::format("TangentSet_%zu", uvSetIndex);
|
||||
const AZStd::string tangentSetName = AZ::SceneAPI::DataTypes::Utilities::CreateUniqueName<SceneData::GraphData::MeshVertexBitangentData>(tangentGeneratedName, manifest);
|
||||
@@ -394,7 +398,7 @@ namespace AZ::SceneGenerationComponents
|
||||
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
||||
size_t numVerts,
|
||||
size_t uvSetIndex,
|
||||
AZ::SceneAPI::DataTypes::TangentSpace tangentSpace,
|
||||
AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
|
||||
AZ::SceneAPI::Containers::SceneGraph& graph,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData** outBitangentData)
|
||||
{
|
||||
@@ -411,7 +415,7 @@ namespace AZ::SceneGenerationComponents
|
||||
}
|
||||
|
||||
bitangentData->SetBitangentSetIndex(uvSetIndex);
|
||||
bitangentData->SetTangentSpace(tangentSpace);
|
||||
bitangentData->SetGenerationMethod(generationMethod);
|
||||
|
||||
const AZStd::string bitangentGeneratedName = AZStd::string::format("BitangentSet_%zu", uvSetIndex);
|
||||
const AZStd::string bitangentSetName = AZ::SceneAPI::DataTypes::Utilities::CreateUniqueName<SceneData::GraphData::MeshVertexBitangentData>(bitangentGeneratedName, manifest);
|
||||
|
||||
+4
-3
@@ -10,6 +10,7 @@
|
||||
|
||||
#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; }
|
||||
@@ -59,7 +60,7 @@ namespace AZ::SceneGenerationComponents
|
||||
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);
|
||||
void UpdateFbxTangentWValues(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, const AZ::SceneAPI::DataTypes::IMeshData* meshData);
|
||||
AZ::SceneAPI::DataTypes::TangentSpace GetTangentSpaceFromRule(const AZ::SceneAPI::Containers::Scene& scene) const;
|
||||
const AZ::SceneAPI::SceneData::TangentsRule* GetTangentRule(const AZ::SceneAPI::Containers::Scene& scene) 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;
|
||||
@@ -69,7 +70,7 @@ namespace AZ::SceneGenerationComponents
|
||||
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
||||
size_t numVerts,
|
||||
size_t uvSetIndex,
|
||||
AZ::SceneAPI::DataTypes::TangentSpace tangentSpace,
|
||||
AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
|
||||
AZ::SceneAPI::Containers::SceneGraph& graph,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData** outTangentData);
|
||||
|
||||
@@ -78,7 +79,7 @@ namespace AZ::SceneGenerationComponents
|
||||
const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
|
||||
size_t numVerts,
|
||||
size_t uvSetIndex,
|
||||
AZ::SceneAPI::DataTypes::TangentSpace tangentSpace,
|
||||
AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
|
||||
AZ::SceneAPI::Containers::SceneGraph& graph,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData** outBitangentData);
|
||||
};
|
||||
|
||||
+42
-14
@@ -76,33 +76,47 @@ namespace AZ::TangentGeneration::BlendShape::MikkT
|
||||
const AZ::Vector4 tangentVec(tangent[0]*magS, tangent[1]*magS, tangent[2]*magS, flipSign);
|
||||
const AZ::Vector3 bitangentVec(bitangent[0]*magT, bitangent[1]*magT, bitangent[2]*magT);
|
||||
|
||||
// Set the tangent and bitangent back to the blendshape
|
||||
// Set the tangent and bitangent back to the blend shape
|
||||
AZStd::vector<AZ::Vector4>& tangents = customData->m_blendShapeData->GetTangents();
|
||||
AZStd::vector<AZ::Vector3>& bitangents = customData->m_blendShapeData->GetBitangents();
|
||||
tangents[vertexIndex] = tangentVec;
|
||||
bitangents[vertexIndex] = bitangentVec;
|
||||
}
|
||||
|
||||
bool GenerateTangents(AZ::SceneData::GraphData::BlendShapeData* blendShapeData, size_t uvSetIndex)
|
||||
void SetTSpaceBasic(const SMikkTSpaceContext* context, const float tangent[], const float signValue, const int face, const int vert)
|
||||
{
|
||||
MikktCustomData* customData = static_cast<MikktCustomData*>(context->m_pUserData);
|
||||
const AZ::u32 vertexIndex = customData->m_blendShapeData->GetFaceVertexIndex(face, vert);
|
||||
AZ::Vector3 tangentVec3(tangent[0], tangent[1], tangent[2]);
|
||||
tangentVec3.NormalizeSafe();
|
||||
AZ::Vector3 normal = customData->m_blendShapeData->GetNormal(vertexIndex);
|
||||
normal.NormalizeSafe();
|
||||
const AZ::Vector3 bitangent = normal.Cross(tangentVec3) * signValue;
|
||||
|
||||
// Set the tangent and bitangent back to the blend shape
|
||||
AZStd::vector<AZ::Vector4>& tangents = customData->m_blendShapeData->GetTangents();
|
||||
AZStd::vector<AZ::Vector3>& bitangents = customData->m_blendShapeData->GetBitangents();
|
||||
tangents[vertexIndex] = AZ::Vector4(tangentVec3.GetX(), tangentVec3.GetY(), tangentVec3.GetZ(), signValue);
|
||||
bitangents[vertexIndex] = bitangent;
|
||||
}
|
||||
|
||||
bool GenerateTangents(AZ::SceneData::GraphData::BlendShapeData* blendShapeData,
|
||||
size_t uvSetIndex,
|
||||
AZ::SceneAPI::DataTypes::MikkTSpaceMethod tSpaceMethod)
|
||||
{
|
||||
// Create tangent and bitangent data sets and relate them to the given UV set.
|
||||
const AZStd::vector<AZ::Vector2>& uvSet = blendShapeData->GetUVs(uvSetIndex);
|
||||
if (uvSet.empty())
|
||||
{
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Cannot find UV data (set index=%d) to generate tangents and bitangents from in MikkT generator!\n", uvSetIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
AZStd::vector<AZ::Vector4>& tangents = blendShapeData->GetTangents();
|
||||
AZStd::vector<AZ::Vector3>& bitangents = blendShapeData->GetBitangents();
|
||||
if (!tangents.empty() || !bitangents.empty())
|
||||
{
|
||||
AZ_TracePrintf(
|
||||
AZ::SceneAPI::Utilities::WarningWindow, "Cannot generate tangents and bitangents because existing tangent or bitangent data has been found.\n");
|
||||
AZ_Error(AZ::SceneAPI::Utilities::ErrorWindow, false,
|
||||
"Cannot find UV data (set index=%d) to generate tangents and bitangents from in MikkT generator.\n",
|
||||
uvSetIndex);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Pre-allocate the tangent and bitangent data.
|
||||
AZStd::vector<AZ::Vector4>& tangents = blendShapeData->GetTangents();
|
||||
AZStd::vector<AZ::Vector3>& bitangents = blendShapeData->GetBitangents();
|
||||
tangents.resize(blendShapeData->GetVertexCount());
|
||||
bitangents.resize(blendShapeData->GetVertexCount());
|
||||
|
||||
@@ -114,10 +128,24 @@ namespace AZ::TangentGeneration::BlendShape::MikkT
|
||||
mikkInterface.m_getNormal = GetNormal;
|
||||
mikkInterface.m_getPosition = GetPosition;
|
||||
mikkInterface.m_getTexCoord = GetTexCoord;
|
||||
mikkInterface.m_setTSpace = SetTSpace;
|
||||
mikkInterface.m_setTSpaceBasic = nullptr;
|
||||
mikkInterface.m_getNumVerticesOfFace= GetNumVerticesOfFace;
|
||||
|
||||
switch (tSpaceMethod)
|
||||
{
|
||||
case AZ::SceneAPI::DataTypes::MikkTSpaceMethod::TSpaceBasic:
|
||||
{
|
||||
mikkInterface.m_setTSpace = nullptr;
|
||||
mikkInterface.m_setTSpaceBasic = SetTSpaceBasic;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
mikkInterface.m_setTSpace = SetTSpace;
|
||||
mikkInterface.m_setTSpaceBasic = nullptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the MikkT custom data.
|
||||
MikktCustomData customData;
|
||||
customData.m_blendShapeData = blendShapeData;
|
||||
|
||||
+4
-1
@@ -9,6 +9,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
#include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexBitangentData.h>
|
||||
|
||||
namespace AZ::SceneData::GraphData
|
||||
{
|
||||
@@ -24,5 +25,7 @@ namespace AZ::TangentGeneration::BlendShape::MikkT
|
||||
};
|
||||
|
||||
// The main generation method.
|
||||
bool GenerateTangents(AZ::SceneData::GraphData::BlendShapeData* blendShapeData, size_t uvSetIndex);
|
||||
bool GenerateTangents(AZ::SceneData::GraphData::BlendShapeData* blendShapeData,
|
||||
size_t uvSetIndex,
|
||||
AZ::SceneAPI::DataTypes::MikkTSpaceMethod tSpaceMethod = AZ::SceneAPI::DataTypes::MikkTSpaceMethod::TSpace);
|
||||
} // namespace AZ::TangentGeneration::MikkT
|
||||
|
||||
+18
-3
@@ -108,7 +108,8 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
bool GenerateTangents(const AZ::SceneAPI::DataTypes::IMeshData* meshData,
|
||||
const AZ::SceneAPI::DataTypes::IMeshVertexUVData* uvData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* outTangentData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* outBitangentData)
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* outBitangentData,
|
||||
AZ::SceneAPI::DataTypes::MikkTSpaceMethod tSpaceMethod)
|
||||
{
|
||||
// Provide the MikkT interface.
|
||||
SMikkTSpaceInterface mikkInterface;
|
||||
@@ -116,10 +117,24 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
mikkInterface.m_getNormal = GetNormal;
|
||||
mikkInterface.m_getPosition = GetPosition;
|
||||
mikkInterface.m_getTexCoord = GetTexCoord;
|
||||
mikkInterface.m_setTSpace = SetTSpace;
|
||||
mikkInterface.m_setTSpaceBasic = nullptr;//SetTSpaceBasic;
|
||||
mikkInterface.m_getNumVerticesOfFace= GetNumVerticesOfFace;
|
||||
|
||||
switch (tSpaceMethod)
|
||||
{
|
||||
case AZ::SceneAPI::DataTypes::MikkTSpaceMethod::TSpaceBasic:
|
||||
{
|
||||
mikkInterface.m_setTSpace = nullptr;
|
||||
mikkInterface.m_setTSpaceBasic = SetTSpaceBasic;
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
mikkInterface.m_setTSpace = SetTSpace;
|
||||
mikkInterface.m_setTSpaceBasic = nullptr;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Set the MikkT custom data.
|
||||
MikktCustomData customData;
|
||||
customData.m_meshData = meshData;
|
||||
|
||||
+3
-1
@@ -8,6 +8,7 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexBitangentData.h>
|
||||
#include <SceneAPI/SceneCore/Containers/Scene.h>
|
||||
|
||||
namespace AZ::SceneAPI::DataTypes { class IMeshData; }
|
||||
@@ -28,5 +29,6 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
bool GenerateTangents(const AZ::SceneAPI::DataTypes::IMeshData* meshData,
|
||||
const AZ::SceneAPI::DataTypes::IMeshVertexUVData* uvData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* outTangentData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* outBitangentData);
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* outBitangentData,
|
||||
AZ::SceneAPI::DataTypes::MikkTSpaceMethod tSpaceMethod = AZ::SceneAPI::DataTypes::MikkTSpaceMethod::TSpace);
|
||||
} // namespace AZ::TangentGeneration::MikkT
|
||||
|
||||
Reference in New Issue
Block a user