From a16466f12d02bcbe259df881dd4cba9c369c598c Mon Sep 17 00:00:00 2001
From: jonwd7 <jon.wd7@gmail.com>
Date: Thu, 14 Dec 2017 03:46:21 -0500
Subject: [PATCH] BSPackedCombined CK version, cleanup and decoding.

BSPackedCombinedGeomDataExtra is the version of precombined produced by the CK, whereas all vanilla precombined was BSPackedCombinedGeomDataExtra.   The latter is much smaller because it only includes a reference to the geometry.  The CK precombined bakes all geometry into the file.
---
 nif.xml | 45 ++++++++++++++++++++++++++-------------------
 1 file changed, 26 insertions(+), 19 deletions(-)

diff --git a/nif.xml b/nif.xml
index 921f0c8..290ee7c 100644
--- a/nif.xml
+++ b/nif.xml
@@ -7085,44 +7085,51 @@
 	
     <compound name="BSPackedGeomDataCombined">
         <add name="Grayscale to Palette Scale" type="float" />
-        <add name="Rotation" type="Matrix33" />
-        <add name="Translation" type="Vector3" />
-        <add name="Scale" type="float" />
+        <add name="Transform" type="NiTransform" />
         <add name="Bounding Sphere" type="NiBound" />
     </compound>
-    
-    <compound name="BSPackedGeomDataLOD">
-        <add name="Triangle Count" type="uint" />
-        <add name="Triangle Offset" type="uint" />
-    </compound>
-    
+
     <compound name="BSPackedGeomData">
         <add name="Num Verts" type="uint" />
         <add name="LOD Levels" type="uint" />
-        <add name="LOD" type="BSPackedGeomDataLOD" arr1="LOD Levels" />
+        <add name="Tri Count LOD0" type="uint" />
+        <add name="Tri Offset LOD0" type="uint" />
+        <add name="Tri Count LOD1" type="uint" />
+        <add name="Tri Offset LOD1" type="uint" />
+        <add name="Tri Count LOD2" type="uint" />
+        <add name="Tri Offset LOD2" type="uint" />
         <add name="Num Combined" type="uint" />
         <add name="Combined" type="BSPackedGeomDataCombined" arr1="Num Combined" />
-        <add name="Unk Int 1" type="uint" />
-        <add name="Unk Int 2" type="uint" />
+        <add name="Vertex Desc" type="BSVertexDesc" />
+        <add name="Vertex Data" type="BSVertexData" arr1="Num Verts" arg="Vertex Desc" cond="!BSPackedCombinedSharedGeomDataExtra" />
+        <add name="Triangles" type="Triangle" arr1="Tri Count LOD0 + Tri Count LOD1 + Tri Count LOD2" cond="!BSPackedCombinedSharedGeomDataExtra" />
     </compound>
 	
     <compound name="BSPackedGeomObject">
-        <add name="Unknown Int 1" type="uint" />
-        <add name="Object Hash?" type="uint" />
+        This appears to be a 64-bit hash but nif.xml does not have a 64-bit type.
+        <add name="Shape ID 1" type="uint" />
+        <add name="Shape ID 2" type="uint" />
     </compound>
-    
-    <niobject name="BSPackedCombinedSharedGeomDataExtra" inherit="NiExtraData">
-        Fallout 4 Packed Combined Geometry Data
+
+    <niobject name="BSPackedCombinedGeomDataExtra" inherit="NiExtraData">
+        Fallout 4 Packed Combined Geometry Data.
+        Geometry is baked into the file and given a list of transforms to position each copy.
         <add name="Vertex Desc" type="BSVertexDesc" />
         <add name="Num Vertices" type="uint" />
         <add name="Num Triangles" type="uint" />
         <add name="Unknown Flags 1" type="uint" />
         <add name="Unknown Flags 2" type="uint" />
         <add name="Num Data" type="uint" />
-        <add name="Object" type="BSPackedGeomObject" arr1="Num Data" />
+        <add name="Object" type="BSPackedGeomObject" arr1="Num Data" cond="BSPackedCombinedSharedGeomDataExtra" />
         <add name="Object Data" type="BSPackedGeomData" arr1="Num Data" />
     </niobject>
-    
+
+    <niobject name="BSPackedCombinedSharedGeomDataExtra" inherit="BSPackedCombinedGeomDataExtra">
+        Fallout 4 Packed Combined Shared Geometry Data.
+        Geometry is NOT baked into the file. It is instead a reference to the shape via a Shape ID (currently undecoded)
+        which loads the geometry via the STAT form for the NIF.
+    </niobject>
+
     <!-- Fallout 4 Animation -->
     
     <niobject name="NiLightRadiusController" inherit="NiFloatInterpController">
-- 
GitLab