mirror of
				https://github.com/Laupetin/OpenAssetTools.git
				synced 2025-10-31 02:26:59 +00:00 
			
		
		
		
	feat: dump and load xmodels for IW5 via template
This commit is contained in:
		| @@ -1,4 +1,4 @@ | ||||
| #options GAME (T5, T6) | ||||
| #options GAME (IW5, T5, T6) | ||||
|  | ||||
| #filename "Game/" + GAME + "/XModel/XModelDumper" + GAME + ".cpp" | ||||
|  | ||||
| @@ -6,7 +6,9 @@ | ||||
| #set COMMON_HEADER "\"Game/" + GAME + "/Common" + GAME + ".h\"" | ||||
| #set JSON_HEADER "\"Game/" + GAME + "/XModel/JsonXModel" + GAME + ".h\"" | ||||
|  | ||||
| #if GAME == "T5" | ||||
| #if GAME == "IW5" | ||||
| #define FEATURE_IW5 | ||||
| #elif GAME == "T5" | ||||
| #define FEATURE_T5 | ||||
| #elif GAME == "T6" | ||||
| #define FEATURE_T6 | ||||
| @@ -54,8 +56,13 @@ namespace GAME | ||||
|         { | ||||
|             MaterialTextureDef* def = &material->textureTable[textureIndex]; | ||||
|  | ||||
| #ifdef FEATURE_IW5             | ||||
|             if (def->semantic == TS_COLOR_MAP) | ||||
|                 potentialTextureDefs.push_back(def); | ||||
| #else | ||||
|             if (def->semantic == TS_COLOR_MAP || def->semantic >= TS_COLOR0_MAP && def->semantic <= TS_COLOR15_MAP) | ||||
|                 potentialTextureDefs.push_back(def); | ||||
| #endif | ||||
|         } | ||||
|  | ||||
|         if (potentialTextureDefs.empty()) | ||||
| @@ -136,15 +143,33 @@ namespace GAME | ||||
|         return GetImageFromTextureDef(*potentialTextureDefs[0]); | ||||
|     } | ||||
|  | ||||
|     bool GetSurfaces(const XModel* model, const unsigned lod, XSurface*& surfs, unsigned& surfCount) | ||||
|     { | ||||
| #ifdef FEATURE_IW5 | ||||
|         if (!model->lodInfo[lod].modelSurfs || !model->lodInfo[lod].modelSurfs->surfs) | ||||
|             return false; | ||||
|  | ||||
|         surfs = model->lodInfo[lod].modelSurfs->surfs; | ||||
|         surfCount = model->lodInfo[lod].modelSurfs->numsurfs; | ||||
| #else | ||||
|         if (!model->surfs) | ||||
|             return false; | ||||
|  | ||||
|         surfs = &model->surfs[model->lodInfo[lod].surfIndex]; | ||||
|         surfCount = model->lodInfo[lod].numsurfs; | ||||
| #endif | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     bool HasDefaultArmature(const XModel* model, const unsigned lod) | ||||
|     { | ||||
|         if (model->numRootBones != 1 || model->numBones != 1) | ||||
|             return false; | ||||
|  | ||||
|         const auto* surfs = &model->surfs[model->lodInfo[lod].surfIndex]; | ||||
|         const auto surfCount = model->lodInfo[lod].numsurfs; | ||||
|  | ||||
|         if (!surfs) | ||||
|         XSurface* surfs; | ||||
|         unsigned surfCount; | ||||
|         if (!GetSurfaces(model, lod, surfs, surfCount)) | ||||
|             return true; | ||||
|  | ||||
|         for (auto surfIndex = 0u; surfIndex < surfCount; surfIndex++) | ||||
| @@ -284,10 +309,9 @@ namespace GAME | ||||
|  | ||||
|     void AddXModelVertices(XModelCommon& out, const XModel* model, const unsigned lod) | ||||
|     { | ||||
|         const auto* surfs = &model->surfs[model->lodInfo[lod].surfIndex]; | ||||
|         const auto surfCount = model->lodInfo[lod].numsurfs; | ||||
|  | ||||
|         if (!surfs) | ||||
|         XSurface* surfs; | ||||
|         unsigned surfCount; | ||||
|         if (!GetSurfaces(model, lod, surfs, surfCount)) | ||||
|             return; | ||||
|  | ||||
|         for (auto surfIndex = 0u; surfIndex < surfCount; surfIndex++) | ||||
| @@ -313,10 +337,9 @@ namespace GAME | ||||
|  | ||||
|     void AllocateXModelBoneWeights(const XModel* model, const unsigned lod, XModelVertexBoneWeightCollection& weightCollection) | ||||
|     { | ||||
|         const auto* surfs = &model->surfs[model->lodInfo[lod].surfIndex]; | ||||
|         const auto surfCount = model->lodInfo[lod].numsurfs; | ||||
|  | ||||
|         if (!surfs) | ||||
|         XSurface* surfs; | ||||
|         unsigned surfCount; | ||||
|         if (!GetSurfaces(model, lod, surfs, surfCount)) | ||||
|             return; | ||||
|  | ||||
|         auto totalWeightCount = 0u; | ||||
| @@ -348,13 +371,12 @@ namespace GAME | ||||
|  | ||||
|     void AddXModelVertexBoneWeights(XModelCommon& out, const XModel* model, const unsigned lod) | ||||
|     { | ||||
|         const auto* surfs = &model->surfs[model->lodInfo[lod].surfIndex]; | ||||
|         const auto surfCount = model->lodInfo[lod].numsurfs; | ||||
|         auto& weightCollection = out.m_bone_weight_data; | ||||
|  | ||||
|         if (!surfs) | ||||
|         XSurface* surfs; | ||||
|         unsigned surfCount; | ||||
|         if (!GetSurfaces(model, lod, surfs, surfCount)) | ||||
|             return; | ||||
|  | ||||
|         auto& weightCollection = out.m_bone_weight_data; | ||||
|         size_t weightOffset = 0u; | ||||
|  | ||||
|         for (auto surfIndex = 0u; surfIndex < surfCount; surfIndex++) | ||||
| @@ -467,10 +489,9 @@ namespace GAME | ||||
|  | ||||
|     void AddXModelFaces(XModelCommon& out, const XModel* model, const unsigned lod) | ||||
|     { | ||||
|         const auto* surfs = &model->surfs[model->lodInfo[lod].surfIndex]; | ||||
|         const auto surfCount = model->lodInfo[lod].numsurfs; | ||||
|  | ||||
|         if (!surfs) | ||||
|         XSurface* surfs; | ||||
|         unsigned surfCount; | ||||
|         if (!GetSurfaces(model, lod, surfs, surfCount)) | ||||
|             return; | ||||
|  | ||||
|         for (auto surfIndex = 0u; surfIndex < surfCount; surfIndex++) | ||||
| @@ -671,8 +692,15 @@ namespace GAME | ||||
|             if (xmodel.physPreset && xmodel.physPreset->name) | ||||
|                 jXModel.physPreset = AssetName(xmodel.physPreset->name); | ||||
|  | ||||
| #ifdef FEATURE_IW5 | ||||
|             if (xmodel.physCollmap && xmodel.physCollmap->name) | ||||
|                 jXModel.physCollmap = AssetName(xmodel.physCollmap->name); | ||||
| #endif | ||||
|  | ||||
| #if defined(FEATURE_T5) || defined(FEATURE_T6) | ||||
|             if (xmodel.physConstraints && xmodel.physConstraints->name) | ||||
|                 jXModel.physConstraints = AssetName(xmodel.physConstraints->name); | ||||
| #endif | ||||
|  | ||||
|             jXModel.flags = xmodel.flags; | ||||
|  | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| #options GAME (T5, T6) | ||||
| #options GAME (IW5, T5, T6) | ||||
|  | ||||
| #filename "Game/" + GAME + "/XModel/XModelDumper" + GAME + ".h" | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user