627 lines
24 KiB
C++
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
|