mirror of
https://github.com/Laupetin/OpenAssetTools.git
synced 2025-06-10 23:08:05 -05:00
feat: first draft of loading gltf models for t6
This commit is contained in:
@ -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,
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Reference in New Issue
Block a user