feat: first draft of loading gltf models for t6

This commit is contained in:
Jan
2024-05-25 10:03:25 +02:00
parent f8b5734f86
commit 1f5050befa
40 changed files with 2459 additions and 67 deletions

View File

@ -652,7 +652,7 @@ void AssetDumperWeapon::CopyToFullDef(const WeaponCompleteDef* weapon, WeaponFul
if (fullDef->weapDef.locationDamageMultipliers)
{
static_assert(std::extent_v<decltype(WeaponFullDef::locationDamageMultipliers)> == HITLOC_NUM);
static_assert(std::extent_v<decltype(WeaponFullDef::locationDamageMultipliers)> == HITLOC_COUNT);
assert(sizeof(WeaponFullDef::locationDamageMultipliers) >= sizeof(float) * std::extent_v<decltype(WeaponFullDef::locationDamageMultipliers)>);
memcpy(fullDef->locationDamageMultipliers,
fullDef->weapDef.locationDamageMultipliers,

View File

@ -139,14 +139,17 @@ namespace
}
else
{
bone.localOffset[0] = model->trans[boneNum - model->numRootBones][0];
bone.localOffset[1] = model->trans[boneNum - model->numRootBones][1];
bone.localOffset[2] = model->trans[boneNum - model->numRootBones][2];
const auto& trans = model->trans[boneNum - model->numRootBones];
bone.localOffset[0] = trans.x;
bone.localOffset[1] = trans.y;
bone.localOffset[2] = trans.z;
const auto& quat = model->quats[boneNum - model->numRootBones];
bone.localRotation = {
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]),
QuatInt16::ToFloat(quat.v[0]),
QuatInt16::ToFloat(quat.v[1]),
QuatInt16::ToFloat(quat.v[2]),
QuatInt16::ToFloat(quat.v[3]),
};
}
@ -229,15 +232,15 @@ namespace
vertex.coordinates[0] = v.xyz[0];
vertex.coordinates[1] = v.xyz[1];
vertex.coordinates[2] = v.xyz[2];
vertex.normal[0] = normalVec[0];
vertex.normal[1] = normalVec[1];
vertex.normal[2] = normalVec[2];
vertex.color[0] = color[0];
vertex.color[1] = color[1];
vertex.color[2] = color[2];
vertex.color[3] = color[3];
vertex.uv[0] = uv[0];
vertex.uv[1] = uv[1];
vertex.normal[0] = normalVec.x;
vertex.normal[1] = normalVec.y;
vertex.normal[2] = normalVec.z;
vertex.color[0] = color.r;
vertex.color[1] = color.g;
vertex.color[2] = color.b;
vertex.color[3] = color.a;
vertex.uv[0] = uv.x;
vertex.uv[1] = uv.y;
out.m_vertices.emplace_back(vertex);
}

View File

@ -397,8 +397,8 @@ void AssetDumperWeapon::CopyToFullDef(const WeaponVariantDef* weapon, WeaponFull
if (fullDef->weapDef.locationDamageMultipliers)
{
assert(sizeof(WeaponFullDef::locationDamageMultipliers) >= sizeof(float) * HITLOC_NUM);
memcpy(fullDef->locationDamageMultipliers, fullDef->weapDef.locationDamageMultipliers, sizeof(float) * HITLOC_NUM);
assert(sizeof(WeaponFullDef::locationDamageMultipliers) >= sizeof(float) * HITLOC_COUNT);
memcpy(fullDef->locationDamageMultipliers, fullDef->weapDef.locationDamageMultipliers, sizeof(float) * HITLOC_COUNT);
fullDef->weapDef.locationDamageMultipliers = fullDef->locationDamageMultipliers;
}

View File

@ -101,8 +101,8 @@ void AssetDumperWeaponAttachmentUnique::CopyToFullDef(const WeaponAttachmentUniq
if (attachment->locationDamageMultipliers)
{
assert(sizeof(WeaponAttachmentUniqueFull::locationDamageMultipliers) >= sizeof(float) * HITLOC_NUM);
memcpy(fullDef->locationDamageMultipliers, attachment->locationDamageMultipliers, sizeof(float) * HITLOC_NUM);
assert(sizeof(WeaponAttachmentUniqueFull::locationDamageMultipliers) >= sizeof(float) * HITLOC_COUNT);
memcpy(fullDef->locationDamageMultipliers, attachment->locationDamageMultipliers, sizeof(float) * HITLOC_COUNT);
fullDef->attachment.locationDamageMultipliers = fullDef->locationDamageMultipliers;
}
}

View File

@ -1,6 +1,7 @@
#include "AssetDumperXModel.h"
#include "Game/T6/CommonT6.h"
#include "Game/T6/XModel/JsonXModelWriter.h"
#include "ObjWriting.h"
#include "Utils/DistinctMapper.h"
#include "Utils/QuatInt16.h"
@ -132,14 +133,24 @@ namespace
bone.scale[1] = 1.0f;
bone.scale[2] = 1.0f;
bone.globalOffset[0] = model->baseMat[boneNum].trans.x;
bone.globalOffset[1] = model->baseMat[boneNum].trans.y;
bone.globalOffset[2] = model->baseMat[boneNum].trans.z;
if (model->partClassification[boneNum])
{
if (boneNum < model->numRootBones
|| model->partClassification[model->parentList[boneNum - model->numRootBones]] != model->partClassification[boneNum])
{
std::cerr << std::format("Part: {:02} = {}\n", model->partClassification[boneNum], bone.name);
}
}
const auto& baseMat = model->baseMat[boneNum];
bone.globalOffset[0] = baseMat.trans.x;
bone.globalOffset[1] = baseMat.trans.y;
bone.globalOffset[2] = baseMat.trans.z;
bone.globalRotation = {
model->baseMat[boneNum].quat.x,
model->baseMat[boneNum].quat.y,
model->baseMat[boneNum].quat.z,
model->baseMat[boneNum].quat.w,
baseMat.quat.x,
baseMat.quat.y,
baseMat.quat.z,
baseMat.quat.w,
};
if (boneNum < model->numRootBones)
@ -151,14 +162,17 @@ namespace
}
else
{
bone.localOffset[0] = model->trans[boneNum - model->numRootBones][0];
bone.localOffset[1] = model->trans[boneNum - model->numRootBones][1];
bone.localOffset[2] = model->trans[boneNum - model->numRootBones][2];
const auto& trans = model->trans[boneNum - model->numRootBones];
bone.localOffset[0] = trans.x;
bone.localOffset[1] = trans.y;
bone.localOffset[2] = trans.z;
const auto& quat = model->quats[boneNum - model->numRootBones];
bone.localRotation = {
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][0]),
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][1]),
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][2]),
QuatInt16::ToFloat(model->quats[boneNum - model->numRootBones][3]),
QuatInt16::ToFloat(quat.v[0]),
QuatInt16::ToFloat(quat.v[1]),
QuatInt16::ToFloat(quat.v[2]),
QuatInt16::ToFloat(quat.v[3]),
};
}
@ -234,10 +248,12 @@ namespace
const auto& v = surface.verts0[vertexIndex];
vec2_t uv{};
vec3_t normalVec{};
vec3_t tangentVec{};
vec4_t color{};
Common::Vec2UnpackTexCoords(v.texCoord, &uv);
Common::Vec3UnpackUnitVec(v.normal, &normalVec);
Common::Vec3UnpackUnitVec(v.tangent, &tangentVec);
Common::Vec4UnpackGfxColor(v.color, &color);
XModelVertex vertex{};
@ -546,6 +562,15 @@ namespace
}
}
}
void DumpXModel(AssetDumpingContext& context, XAssetInfo<XModel>* asset)
{
const auto assetFile = context.OpenAssetFile(std::format("xmodel/{}.json", asset->m_name));
if (!assetFile)
return;
DumpXModelAsJson(*assetFile, asset->Asset(), context);
}
} // namespace
bool AssetDumperXModel::ShouldDump(XAssetInfo<XModel>* asset)
@ -556,4 +581,5 @@ bool AssetDumperXModel::ShouldDump(XAssetInfo<XModel>* asset)
void AssetDumperXModel::DumpAsset(AssetDumpingContext& context, XAssetInfo<XModel>* asset)
{
DumpXModelSurfs(context, asset);
DumpXModel(context, asset);
}

View File

@ -2,7 +2,10 @@
#include "Game/T6/CommonT6.h"
#include "Game/T6/Json/JsonXModel.h"
#include "ObjWriting.h"
#include <cassert>
#include <format>
#include <iomanip>
#include <nlohmann/json.hpp>
@ -40,9 +43,36 @@ namespace
return input;
}
static const char* GetExtensionForModelByConfig()
{
switch (ObjWriting::Configuration.ModelOutputFormat)
{
case ObjWriting::Configuration_t::ModelOutputFormat_e::XMODEL_EXPORT:
return ".XMODEL_EXPORT";
case ObjWriting::Configuration_t::ModelOutputFormat_e::OBJ:
return ".OBJ";
case ObjWriting::Configuration_t::ModelOutputFormat_e::GLTF:
return ".GLTF";
case ObjWriting::Configuration_t::ModelOutputFormat_e::GLB:
return ".GLB";
default:
assert(false);
return "";
}
}
void CreateJsonXModel(JsonXModel& jXModel, const XModel& xmodel) const
{
jXModel.collLod = xmodel.collLod;
if (xmodel.collLod >= 0)
jXModel.collLod = xmodel.collLod;
for (auto lodNumber = 0u; lodNumber < xmodel.numLods; lodNumber++)
{
JsonXModelLod lod;
lod.file = std::format("model_export/{}_lod{}{}", xmodel.name, lodNumber, GetExtensionForModelByConfig());
jXModel.lods.emplace_back(std::move(lod));
}
if (xmodel.physPreset && xmodel.physPreset->name)
jXModel.physPreset = AssetName(xmodel.physPreset->name);