MikkT generator fills given tangent data rather than creating a new scene node
Signed-off-by: Benjamin Jillich <jillich@amazon.com>
This commit is contained in:
+7
-29
@@ -32,7 +32,6 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
return customData->m_meshData->GetFaceCount();
|
||||
}
|
||||
|
||||
|
||||
int GetNumVerticesOfFace(const SMikkTSpaceContext* context, const int face)
|
||||
{
|
||||
AZ_UNUSED(context);
|
||||
@@ -40,7 +39,6 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
return 3;
|
||||
}
|
||||
|
||||
|
||||
void GetPosition(const SMikkTSpaceContext* context, float posOut[], const int face, const int vert)
|
||||
{
|
||||
MikktCustomData* customData = static_cast<MikktCustomData*>(context->m_pUserData);
|
||||
@@ -51,7 +49,6 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
posOut[2] = pos.GetZ();
|
||||
}
|
||||
|
||||
|
||||
void GetNormal(const SMikkTSpaceContext* context, float normOut[], const int face, const int vert)
|
||||
{
|
||||
MikktCustomData* customData = static_cast<MikktCustomData*>(context->m_pUserData);
|
||||
@@ -62,7 +59,6 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
normOut[2] = normal.GetZ();
|
||||
}
|
||||
|
||||
|
||||
void GetTexCoord(const SMikkTSpaceContext* context, float texOut[], const int face, const int vert)
|
||||
{
|
||||
MikktCustomData* customData = static_cast<MikktCustomData*>(context->m_pUserData);
|
||||
@@ -72,7 +68,6 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
texOut[1] = uv.GetY();
|
||||
}
|
||||
|
||||
|
||||
// This function is used to return the tangent and signValue to the application.
|
||||
// tangent is a unit length vector.
|
||||
// For normal maps it is sufficient to use the following simplified version of the bitangent which is generated at pixel/vertex level.
|
||||
@@ -91,7 +86,6 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
customData->m_bitangentData->SetBitangent(vertexIndex, bitangent);
|
||||
}
|
||||
|
||||
|
||||
// This function is used to return tangent space results to the application.
|
||||
// tangent and bitangent are unit length vectors and magS and magT are their
|
||||
// true magnitudes which can be used for relief mapping effects.
|
||||
@@ -111,27 +105,11 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
customData->m_bitangentData->SetBitangent(vertexIndex, bitangentVec);
|
||||
}
|
||||
|
||||
|
||||
bool GenerateTangents(AZ::SceneAPI::Containers::SceneManifest& manifest, AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::SceneAPI::DataTypes::IMeshData* meshData, size_t uvSet)
|
||||
bool GenerateTangents(const AZ::SceneAPI::DataTypes::IMeshData* meshData,
|
||||
const AZ::SceneAPI::DataTypes::IMeshVertexUVData* uvData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* outTangentData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* outBitangentData)
|
||||
{
|
||||
// Create tangent and bitangent data sets and relate them to the given UV set.
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexUVData* uvData = AZ::SceneAPI::SceneData::TangentsRule::FindUVData(graph, nodeIndex, uvSet);
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* tangentData = nullptr;
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* bitangentData = nullptr;
|
||||
if (!uvData)
|
||||
{
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Cannot find UV data (set index=%d) to generate tangents and bitangents from in MikkT generator!\n", uvSet);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!AZ::SceneGenerationComponents::TangentGenerateComponent::CreateTangentBitangentLayers(manifest, nodeIndex, meshData->GetVertexCount(), uvSet, AZ::SceneAPI::DataTypes::TangentSpace::MikkT, "MikkT", graph, &tangentData, &bitangentData))
|
||||
{
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Failed to create tangents and bitangents data sets inside MikkT generator!\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
//----------------------------------
|
||||
|
||||
// Provide the MikkT interface.
|
||||
SMikkTSpaceInterface mikkInterface;
|
||||
mikkInterface.m_getNumFaces = GetNumFaces;
|
||||
@@ -146,8 +124,8 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
MikktCustomData customData;
|
||||
customData.m_meshData = meshData;
|
||||
customData.m_uvData = uvData;
|
||||
customData.m_tangentData = tangentData;
|
||||
customData.m_bitangentData = bitangentData;
|
||||
customData.m_tangentData = outTangentData;
|
||||
customData.m_bitangentData = outBitangentData;
|
||||
|
||||
// Generate the tangents.
|
||||
SMikkTSpaceContext mikkContext;
|
||||
@@ -155,7 +133,7 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
mikkContext.m_pUserData = &customData;
|
||||
if (genTangSpaceDefault(&mikkContext) == 0)
|
||||
{
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Failed to generate tangents and bitangents using MikkT, because MikkT reported failure!\n");
|
||||
AZ_TracePrintf(AZ::SceneAPI::Utilities::ErrorWindow, "Failed to generate tangents and bitangents using MikkT.\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+8
-6
@@ -19,12 +19,14 @@ namespace AZ::TangentGeneration::Mesh::MikkT
|
||||
{
|
||||
struct MikktCustomData
|
||||
{
|
||||
AZ::SceneAPI::DataTypes::IMeshData* m_meshData;
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexUVData* m_uvData;
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* m_tangentData;
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* m_bitangentData;
|
||||
const AZ::SceneAPI::DataTypes::IMeshData* m_meshData;
|
||||
const AZ::SceneAPI::DataTypes::IMeshVertexUVData* m_uvData;
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* m_tangentData;
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* m_bitangentData;
|
||||
};
|
||||
|
||||
// The main generation method.
|
||||
bool GenerateTangents(AZ::SceneAPI::Containers::SceneManifest& manifest, AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::SceneAPI::DataTypes::IMeshData* meshData, size_t uvSet);
|
||||
bool GenerateTangents(const AZ::SceneAPI::DataTypes::IMeshData* meshData,
|
||||
const AZ::SceneAPI::DataTypes::IMeshVertexUVData* uvData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexTangentData* outTangentData,
|
||||
AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* outBitangentData);
|
||||
} // namespace AZ::TangentGeneration::MikkT
|
||||
|
||||
Reference in New Issue
Block a user