Files
2025-05-18 13:04:45 +08:00

627 lines
24 KiB
C++

// Copyright Epic Games, Inc. All Rights Reserved.
#include "TechSoftParserUtils.h"
#ifdef USE_TECHSOFT_SDK
namespace TechSoftParserUtils
{
bool FTechSoftMeshConverter::UpdateBodyMesh()
{
using namespace CADLibrary;
if (!Tessellation3DData.IsValid() || !TessellationBaseData.IsValid() || TessellationBaseData->m_uiCoordSize == 0)
{
return false;
}
// Vertex's positions are global to the BodYMesh. Normals and UVs are not.
{
const int32 VertexCount = TessellationBaseData->m_uiCoordSize / 3;
BodyMesh.VertexArray.Reserve(VertexCount);
double* Coordinates = TessellationBaseData->m_pdCoords;
for (unsigned int Index = 0; Index < TessellationBaseData->m_uiCoordSize; ++Index)
{
Coordinates[Index] *= ScaleFactor;
}
for (unsigned int Index = 0; Index < TessellationBaseData->m_uiCoordSize; Index += 3)
{
BodyMesh.VertexArray.Emplace(Coordinates[Index], Coordinates[Index + 1], Coordinates[Index + 2]);
}
}
BodyMesh.Faces.Reserve(BodyMesh.Faces.Num() + Tessellation3DData->m_uiFaceTessSize);
for (unsigned int Index = 0; Index < Tessellation3DData->m_uiFaceTessSize; ++Index)
{
const A3DTessFaceData& FaceTessData = Tessellation3DData->m_psFaceTessData[Index];
if (FaceTessData.m_uiSizesTriangulatedSize > 0)
{
ConvertFace(FaceTessData, BodyMesh.Faces.Emplace_GetRef());
}
}
return true;
}
void FTechSoftMeshConverter::ConvertFace(const A3DTessFaceData& FaceTessData, CADLibrary::FTessellationData& Tessellation)
{
uint32 TriangleCount = CountTriangles(FaceTessData);
Reserve(Tessellation, TriangleCount, /*bWithTexture*/ FaceTessData.m_uiTextureCoordIndexesSize > 0);
uint32 UsedEntitiesFlags = FaceTessData.m_usUsedEntitiesFlags;
const A3DUns32* SizesTriangulated = FaceTessData.m_puiSizesTriangulated;
uint32 FaceSetIndex = 0;
LastTriangleIndex = FaceTessData.m_uiStartTriangulated;
LastVertexIndex = 0;
if (UsedEntitiesFlags & kA3DTessFaceDataTriangle)
{
AddFaceTriangle(Tessellation, SizesTriangulated[FaceSetIndex++]);
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleFan)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 FanCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < FanCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleFan(Tessellation, SizesTriangulated[FaceSetIndex++]);
}
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleStripe)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 StripeCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < StripeCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleStripe(Tessellation, SizesTriangulated[FaceSetIndex++]);
}
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormal)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleWithOneNormal(Tessellation, SizesTriangulated[FaceSetIndex++]);
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormal)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 FanCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < FanCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleFanWithOneNormal(Tessellation, SizesTriangulated[FaceSetIndex++]);
}
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormal)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 StripeCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < StripeCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleStripeWithOneNormal(Tessellation, SizesTriangulated[FaceSetIndex++]);
}
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleTextured)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleWithTexture(Tessellation, SizesTriangulated[FaceSetIndex++], FaceTessData.m_uiTextureCoordIndexesSize);
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleFanTextured)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 FanCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < FanCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleFanWithTexture(Tessellation, SizesTriangulated[FaceSetIndex++], FaceTessData.m_uiTextureCoordIndexesSize);
}
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleStripeTextured)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 StripeCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < StripeCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleStripeWithTexture(Tessellation, SizesTriangulated[FaceSetIndex++], FaceTessData.m_uiTextureCoordIndexesSize);
}
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleOneNormalTextured)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleWithOneNormalAndTexture(Tessellation, SizesTriangulated[FaceSetIndex++], FaceTessData.m_uiTextureCoordIndexesSize);
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleFanOneNormalTextured)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 FanCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < FanCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleFanWithOneNormalAndTexture(Tessellation, SizesTriangulated[FaceSetIndex++], FaceTessData.m_uiTextureCoordIndexesSize);
}
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleStripeOneNormalTextured)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 StripeCount = SizesTriangulated[FaceSetIndex++];
for (uint32 Index = 0; Index < StripeCount; ++Index)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
AddFaceTriangleStripeWithOneNormalAndTexture(Tessellation, SizesTriangulated[FaceSetIndex++], FaceTessData.m_uiTextureCoordIndexesSize);
}
}
}
void FTechSoftMeshConverter::AddFaceTriangle(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
// Get Triangles
for (uint32 TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
NormalIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++];
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
NormalIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++];
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
}
}
void FTechSoftMeshConverter::AddFaceTriangleFan(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
NormalIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
for (unsigned long TriangleIndex = 2; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
NormalIndex[1] = NormalIndex[2];
FaceIndex[1] = FaceIndex[2];
}
}
void FTechSoftMeshConverter::AddFaceTriangleStripe(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
NormalIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
for (unsigned long TriangleIndex = 2; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
TriangleIndex++;
if (TriangleIndex == InTriangleCount)
{
break;
}
Swap(FaceIndex[1], FaceIndex[2]);
Swap(NormalIndex[1], NormalIndex[2]);
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
Swap(FaceIndex[0], FaceIndex[1]);
Swap(NormalIndex[0], NormalIndex[1]);
}
}
void FTechSoftMeshConverter::AddFaceTriangleWithOneNormal(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
// Get Triangles
for (uint32 TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
NormalIndex[1] = NormalIndex[0];
NormalIndex[2] = NormalIndex[0];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (!AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
continue;
}
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
}
void FTechSoftMeshConverter::AddFaceTriangleFanWithOneNormal(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
NormalIndex[1] = NormalIndex[0];
NormalIndex[2] = NormalIndex[0];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
// Get Triangles
for (uint32 TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
}
}
void FTechSoftMeshConverter::AddFaceTriangleStripeWithOneNormal(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
NormalIndex[1] = NormalIndex[0];
NormalIndex[2] = NormalIndex[0];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
for (unsigned long TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
TriangleIndex++;
if (TriangleIndex == InTriangleCount)
{
break;
}
Swap(FaceIndex[1], FaceIndex[2]);
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
Swap(FaceIndex[0], FaceIndex[1]);
}
}
void FTechSoftMeshConverter::AddFaceTriangleWithTexture(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount, A3DUns32 InTextureCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
int32 TextureIndex[3] = { 0, 0, 0 };
// Get Triangles
for (uint64 TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++];
TextureIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex];
LastVertexIndex += InTextureCount;
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
NormalIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++];
TextureIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex];
LastVertexIndex += InTextureCount;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
NormalIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++];
TextureIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex];
LastVertexIndex += InTextureCount;
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
AddTextureCoordinates(Tessellation3DData->m_pdTextureCoords, TextureIndex, Tessellation.TexCoordArray);
}
}
}
void FTechSoftMeshConverter::AddFaceTriangleFanWithTexture(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount, A3DUns32 TextureCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
int32 TextureIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
NormalIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
for (uint32 TriangleIndex = 2; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
AddTextureCoordinates(Tessellation3DData->m_pdTextureCoords, TextureIndex, Tessellation.TexCoordArray);
}
}
}
void FTechSoftMeshConverter::AddFaceTriangleStripeWithTexture(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount, A3DUns32 TextureCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
int32 TextureIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
NormalIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
for (unsigned long TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
AddTextureCoordinates(Tessellation3DData->m_pdTextureCoords, TextureIndex, Tessellation.TexCoordArray);
}
TriangleIndex++;
if (TriangleIndex == InTriangleCount)
{
break;
}
Swap(FaceIndex[1], FaceIndex[2]);
Swap(NormalIndex[1], NormalIndex[2]);
Swap(TextureIndex[1], TextureIndex[2]);
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
Swap(FaceIndex[0], FaceIndex[1]);
Swap(NormalIndex[0], NormalIndex[1]);
Swap(TextureIndex[0], TextureIndex[1]);
}
}
void FTechSoftMeshConverter::AddFaceTriangleWithOneNormalAndTexture(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount, A3DUns32 TextureCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
int32 TextureIndex[3] = { 0, 0, 0 };
// Get Triangles
for (uint32 TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++];
NormalIndex[1] = NormalIndex[0];
NormalIndex[2] = NormalIndex[0];
TextureIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex];
LastVertexIndex += TextureCount;
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
TextureIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex];
LastVertexIndex += TextureCount;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
TextureIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex];
LastVertexIndex += TextureCount;
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastVertexIndex++] / 3;
if (!AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
continue;
}
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
AddTextureCoordinates(Tessellation3DData->m_pdTextureCoords, TextureIndex, Tessellation.TexCoordArray);
}
}
void FTechSoftMeshConverter::AddFaceTriangleFanWithOneNormalAndTexture(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount, A3DUns32 TextureCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
int32 TextureIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
NormalIndex[1] = NormalIndex[0];
NormalIndex[2] = NormalIndex[0];
TextureIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
for (uint32 TriangleIndex = 2; TriangleIndex < InTriangleCount; TriangleIndex++)
{
TextureIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
AddTextureCoordinates(Tessellation3DData->m_pdTextureCoords, TextureIndex, Tessellation.TexCoordArray);
}
}
}
void FTechSoftMeshConverter::AddFaceTriangleStripeWithOneNormalAndTexture(CADLibrary::FTessellationData& Tessellation, A3DUns32 InTriangleCount, A3DUns32 TextureCount)
{
int32 FaceIndex[3] = { 0, 0, 0 };
int32 NormalIndex[3] = { 0, 0, 0 };
int32 TextureIndex[3] = { 0, 0, 0 };
NormalIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
NormalIndex[1] = NormalIndex[0];
NormalIndex[2] = NormalIndex[0];
TextureIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
TextureIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[1] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
for (unsigned long TriangleIndex = 0; TriangleIndex < InTriangleCount; TriangleIndex++)
{
TextureIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex];
LastTriangleIndex += TextureCount;
FaceIndex[2] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++];
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
AddTextureCoordinates(Tessellation3DData->m_pdTextureCoords, TextureIndex, Tessellation.TexCoordArray);
}
TriangleIndex++;
if (TriangleIndex == InTriangleCount)
{
break;
}
Swap(FaceIndex[1], FaceIndex[2]);
Swap(TextureIndex[1], TextureIndex[2]);
FaceIndex[0] = Tessellation3DData->m_puiTriangulatedIndexes[LastTriangleIndex++] / 3;
if (AddFace(FaceIndex, Tessellation, LastVertexIndex))
{
AddNormals(Tessellation3DData->m_pdNormals, NormalIndex, Tessellation.NormalArray);
}
Swap(FaceIndex[0], FaceIndex[1]);
Swap(TextureIndex[0], TextureIndex[1]);
}
}
uint32 CountTriangles(const A3DTessFaceData& FaceTessData)
{
// To revisit
//const int32 TessellationFaceDataWithTriangle = 0x2222;
//const int32 TessellationFaceDataWithFan = 0x4444;
//const int32 TessellationFaceDataWithStrip = 0x8888;
//const int32 TessellationFaceDataWithOneNormal = 0xE0E0;
uint32 UsedEntitiesFlags = FaceTessData.m_usUsedEntitiesFlags;
const A3DUns32* SizesTriangulated = FaceTessData.m_puiSizesTriangulated;
uint32 TriangleCount = 0;
uint32 FaceSetIndex = 0;
if (UsedEntitiesFlags & kA3DTessFaceDataTriangle)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
TriangleCount += SizesTriangulated[FaceSetIndex++];
}
if (UsedEntitiesFlags & kA3DTessFaceDataTriangleFan)
{
ensure(FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex);
uint32 LastFanIndex = 1 + FaceSetIndex;
LastFanIndex += SizesTriangulated[FaceSetIndex++];
for (; FaceSetIndex < LastFanIndex; FaceSetIndex++)
{
uint32 FanSize = (FaceTessData.m_puiSizesTriangulated[FaceSetIndex] & kA3DTessFaceDataNormalMask);
TriangleCount += (FanSize - 2);
}
}
if (FaceTessData.m_uiSizesTriangulatedSize > FaceSetIndex)
{
FaceSetIndex++;
for (; FaceSetIndex < FaceTessData.m_uiSizesTriangulatedSize; FaceSetIndex++)
{
uint32 StripSize = (FaceTessData.m_puiSizesTriangulated[FaceSetIndex] & kA3DTessFaceDataNormalMask);
TriangleCount += (StripSize - 2);
}
}
return TriangleCount;
}
} // ns TechSoftParserUtils
#endif // USE_TECHSOFT_SDK