From 9ecbbfe58fca349922f5946353fb2f1b22f1bb59 Mon Sep 17 00:00:00 2001 From: floxay <57007485+floxay@users.noreply.github.com> Date: Sat, 18 Sep 2021 15:50:49 +0200 Subject: [PATCH 1/2] VTXNORMS chunk (on 'normals' branch without other changes) --- Exporters/ExportPsk.cpp | 18 +++++++++++++++++- Exporters/Psk.h | 2 +- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/Exporters/ExportPsk.cpp b/Exporters/ExportPsk.cpp index 6db8e510..23ce6fa7 100644 --- a/Exporters/ExportPsk.cpp +++ b/Exporters/ExportPsk.cpp @@ -80,7 +80,7 @@ static void ExportCommonMeshData guard(ExportCommonMeshData); // using 'static' here to avoid zero-filling unused fields - static VChunkHeader MainHdr, PtsHdr, WedgHdr, FacesHdr, MatrHdr; + static VChunkHeader MainHdr, PtsHdr, WedgHdr, FacesHdr, MatrHdr, NormHdr; int i; #define SECT(n) (Sections + n) @@ -247,6 +247,22 @@ static void ExportCommonMeshData } unguard; + guard(Normals); + NormHdr.DataCount = Share.Normals.Num(); + NormHdr.DataSize = sizeof(CVec3); + SAVE_CHUNK(NormHdr, "VTXNORMS"); + for (i = 0; i < Share.Normals.Num(); i++) + { + CVec3 Normal; + Unpack(Normal, Share.Normals[i]); + Normal.Normalize(); +#if MIRROR_MESH + Normal.Y = -Normal.Y; +#endif + Ar << Normal.X << Normal.Y << Normal.Z; + } + unguard; + unguard; } diff --git a/Exporters/Psk.h b/Exporters/Psk.h index e61652ba..775e93d7 100644 --- a/Exporters/Psk.h +++ b/Exporters/Psk.h @@ -2,7 +2,7 @@ #define __PSK_H__ -#define PSK_VERSION 20100422 +#define PSK_VERSION 20210917 // VTXNORMS chunk #define PSA_VERSION 20100422 /****************************************************************************** From 4f58f51e3b069630f8171a58164533f42e26910a Mon Sep 17 00:00:00 2001 From: floxay <57007485+floxay@users.noreply.github.com> Date: Wed, 20 Jul 2022 23:41:41 +0200 Subject: [PATCH 2/2] VTXNORMS chunk at the end. --- Exporters/ExportPsk.cpp | 43 +++++++++++++++++++++++++---------------- 1 file changed, 26 insertions(+), 17 deletions(-) diff --git a/Exporters/ExportPsk.cpp b/Exporters/ExportPsk.cpp index 23ce6fa7..c40d9cbb 100644 --- a/Exporters/ExportPsk.cpp +++ b/Exporters/ExportPsk.cpp @@ -80,7 +80,7 @@ static void ExportCommonMeshData guard(ExportCommonMeshData); // using 'static' here to avoid zero-filling unused fields - static VChunkHeader MainHdr, PtsHdr, WedgHdr, FacesHdr, MatrHdr, NormHdr; + static VChunkHeader MainHdr, PtsHdr, WedgHdr, FacesHdr, MatrHdr; int i; #define SECT(n) (Sections + n) @@ -247,22 +247,6 @@ static void ExportCommonMeshData } unguard; - guard(Normals); - NormHdr.DataCount = Share.Normals.Num(); - NormHdr.DataSize = sizeof(CVec3); - SAVE_CHUNK(NormHdr, "VTXNORMS"); - for (i = 0; i < Share.Normals.Num(); i++) - { - CVec3 Normal; - Unpack(Normal, Share.Normals[i]); - Normal.Normalize(); -#if MIRROR_MESH - Normal.Y = -Normal.Y; -#endif - Ar << Normal.X << Normal.Y << Normal.Z; - } - unguard; - unguard; } @@ -322,6 +306,29 @@ static void ExportExtraUV unguard; } +static void ExportVertexNormals(FArchive &Ar, const TArray &Normals) +{ + guard(ExportVertexNormals); + + static VChunkHeader NormalHdr; + NormalHdr.DataCount = Normals.Num(); + NormalHdr.DataSize = sizeof(CVec3); + + SAVE_CHUNK(NormalHdr, "VTXNORMS"); + for (int i = 0; i < Normals.Num(); i++) + { + CVec3 Normal; + Unpack(Normal, Normals[i]); + Normal.Normalize(); +#if MIRROR_MESH + Normal.Y = -Normal.Y; +#endif + Ar << Normal.X << Normal.Y << Normal.Z; + } + + unguard; +} + static void CopyBoneName(char* Dst, int DstLen, const char* Src) { int NameLength = strlen(Src); @@ -461,6 +468,7 @@ static void ExportSkeletalMeshLod(const CSkeletalMesh &Mesh, const CSkelMeshLod ExportVertexColors(Ar, Lod.VertexColors, Lod.NumVerts); ExportExtraUV(Ar, Lod.ExtraUV, Lod.NumVerts, Lod.NumTexCoords); + ExportVertexNormals(Ar, Share.Normals); /* if (!GExportPskx) // nothing more to write return; @@ -900,6 +908,7 @@ static void ExportStaticMeshLod(const CStaticMeshLod &Lod, FArchive &Ar) ExportVertexColors(Ar, Lod.VertexColors, Lod.NumVerts); ExportExtraUV(Ar, Lod.ExtraUV, Lod.NumVerts, Lod.NumTexCoords); + ExportVertexNormals(Ar, Share.Normals); unguard; }