2015-08-10 01:53:24 +00:00
|
|
|
#ifndef _DNACOMMON_CMDL_HPP_
|
|
|
|
#define _DNACOMMON_CMDL_HPP_
|
2015-07-28 02:24:36 +00:00
|
|
|
|
2017-12-29 08:08:12 +00:00
|
|
|
#include "athena/FileWriter.hpp"
|
|
|
|
#include "hecl/Frontend.hpp"
|
|
|
|
#include "hecl/Backend/GX.hpp"
|
2015-08-22 01:58:41 +00:00
|
|
|
#include "PAK.hpp"
|
2015-08-10 01:53:24 +00:00
|
|
|
#include "GX.hpp"
|
2015-08-16 23:00:33 +00:00
|
|
|
#include "TXTR.hpp"
|
2016-08-10 21:54:53 +00:00
|
|
|
#include "zeus/CAABox.hpp"
|
2015-08-10 01:53:24 +00:00
|
|
|
|
2017-12-29 08:08:12 +00:00
|
|
|
namespace DataSpec::DNACMDL
|
2015-08-10 01:53:24 +00:00
|
|
|
{
|
|
|
|
|
2017-12-29 08:08:12 +00:00
|
|
|
using Mesh = hecl::blender::Mesh;
|
|
|
|
using Material = hecl::blender::Material;
|
2015-10-07 01:17:17 +00:00
|
|
|
|
2015-08-10 01:53:24 +00:00
|
|
|
struct Header : BigDNA
|
2015-08-05 21:46:07 +00:00
|
|
|
{
|
2015-08-10 01:53:24 +00:00
|
|
|
DECL_DNA
|
|
|
|
Value<atUint32> magic;
|
|
|
|
Value<atUint32> version;
|
|
|
|
struct Flags : BigDNA
|
|
|
|
{
|
|
|
|
DECL_DNA
|
2015-10-19 03:28:47 +00:00
|
|
|
Value<atUint32> flags = 0;
|
2015-09-29 02:00:28 +00:00
|
|
|
bool shortNormals() const {return (flags & 0x2) != 0;}
|
|
|
|
void setShortNormals(bool val) {flags &= ~0x2; flags |= val << 1;}
|
|
|
|
bool shortUVs() const {return (flags & 0x4) != 0;}
|
|
|
|
void setShortUVs(bool val) {flags &= ~0x4; flags |= val << 2;}
|
2015-08-10 01:53:24 +00:00
|
|
|
} flags;
|
|
|
|
Value<atVec3f> aabbMin;
|
|
|
|
Value<atVec3f> aabbMax;
|
|
|
|
Value<atUint32> secCount;
|
|
|
|
Value<atUint32> matSetCount;
|
|
|
|
Vector<atUint32, DNA_COUNT(secCount)> secSizes;
|
|
|
|
Align<32> align;
|
2015-08-05 21:46:07 +00:00
|
|
|
};
|
|
|
|
|
2016-01-14 22:42:44 +00:00
|
|
|
struct SurfaceHeader_1 : BigDNA
|
2015-08-10 01:53:24 +00:00
|
|
|
{
|
2016-07-26 22:05:59 +00:00
|
|
|
DECL_EXPLICIT_DNA
|
2015-08-10 01:53:24 +00:00
|
|
|
Value<atVec3f> centroid;
|
2015-10-19 03:28:47 +00:00
|
|
|
Value<atUint32> matIdx = 0;
|
|
|
|
Value<atUint16> qDiv = 0x8000;
|
|
|
|
Value<atUint16> dlSize = 0;
|
2016-03-31 02:44:43 +00:00
|
|
|
Value<atUint32> idxStart = 0; /* Actually used by game to stash CCubeModel pointer */
|
|
|
|
Value<atUint32> idxCount = 0; /* Actually used by game to stash next CCubeSurface pointer */
|
2015-10-19 03:28:47 +00:00
|
|
|
Value<atUint32> aabbSz = 0;
|
2015-08-10 01:53:24 +00:00
|
|
|
Value<atVec3f> reflectionNormal;
|
2016-07-26 22:05:59 +00:00
|
|
|
Value<atVec3f> aabb[2];
|
2015-08-10 01:53:24 +00:00
|
|
|
Align<32> align;
|
2015-09-26 03:12:08 +00:00
|
|
|
|
|
|
|
static constexpr bool UseMatrixSkinning() {return false;}
|
2015-11-14 23:42:58 +00:00
|
|
|
static constexpr atInt16 skinMatrixBankIdx() {return -1;}
|
2015-09-26 03:12:08 +00:00
|
|
|
};
|
|
|
|
|
2016-01-14 22:42:44 +00:00
|
|
|
struct SurfaceHeader_2 : BigDNA
|
|
|
|
{
|
2016-07-26 22:05:59 +00:00
|
|
|
DECL_EXPLICIT_DNA
|
2016-01-14 22:42:44 +00:00
|
|
|
Value<atVec3f> centroid;
|
|
|
|
Value<atUint32> matIdx = 0;
|
|
|
|
Value<atUint16> qDiv = 0x8000;
|
|
|
|
Value<atUint16> dlSize = 0;
|
2016-03-31 02:44:43 +00:00
|
|
|
Value<atUint32> idxStart = 0; /* Actually used by game to stash CCubeModel pointer */
|
|
|
|
Value<atUint32> idxCount = 0; /* Actually used by game to stash next CCubeSurface pointer */
|
2016-01-14 22:42:44 +00:00
|
|
|
Value<atUint32> aabbSz = 0;
|
|
|
|
Value<atVec3f> reflectionNormal;
|
|
|
|
Value<atInt16> skinMtxBankIdx;
|
|
|
|
Value<atUint16> surfaceGroup;
|
2016-07-26 22:05:59 +00:00
|
|
|
Value<atVec3f> aabb[2];
|
2016-01-14 22:42:44 +00:00
|
|
|
Align<32> align;
|
|
|
|
|
|
|
|
static constexpr bool UseMatrixSkinning() {return false;}
|
|
|
|
atInt16 skinMatrixBankIdx() const {return skinMtxBankIdx;}
|
|
|
|
};
|
|
|
|
|
2015-09-26 03:12:08 +00:00
|
|
|
struct SurfaceHeader_3 : BigDNA
|
|
|
|
{
|
2016-07-26 22:05:59 +00:00
|
|
|
DECL_EXPLICIT_DNA
|
2015-09-26 03:12:08 +00:00
|
|
|
Value<atVec3f> centroid;
|
2015-10-19 03:28:47 +00:00
|
|
|
Value<atUint32> matIdx = 0;
|
|
|
|
Value<atUint16> qDiv = 0x8000;
|
|
|
|
Value<atUint16> dlSize = 0;
|
2016-03-31 02:44:43 +00:00
|
|
|
Value<atUint32> idxStart = 0; /* Actually used by game to stash CCubeModel pointer */
|
|
|
|
Value<atUint32> idxCount = 0; /* Actually used by game to stash next CCubeSurface pointer */
|
2015-10-19 03:28:47 +00:00
|
|
|
Value<atUint32> aabbSz = 0;
|
2015-09-26 03:12:08 +00:00
|
|
|
Value<atVec3f> reflectionNormal;
|
|
|
|
Value<atInt16> skinMtxBankIdx;
|
2016-01-14 22:42:44 +00:00
|
|
|
Value<atUint16> surfaceGroup;
|
2016-07-26 22:05:59 +00:00
|
|
|
Value<atVec3f> aabb[2];
|
2016-01-14 22:42:44 +00:00
|
|
|
Value<atUint8> unk3;
|
2015-09-26 03:12:08 +00:00
|
|
|
Align<32> align;
|
|
|
|
|
|
|
|
static constexpr bool UseMatrixSkinning() {return true;}
|
|
|
|
atInt16 skinMatrixBankIdx() const {return skinMtxBankIdx;}
|
2015-08-10 01:53:24 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
struct VertexAttributes
|
|
|
|
{
|
|
|
|
GX::AttrType pos = GX::NONE;
|
|
|
|
GX::AttrType norm = GX::NONE;
|
|
|
|
GX::AttrType color0 = GX::NONE;
|
|
|
|
GX::AttrType color1 = GX::NONE;
|
|
|
|
unsigned uvCount = 0;
|
|
|
|
GX::AttrType uvs[7] = {GX::NONE};
|
|
|
|
GX::AttrType pnMtxIdx = GX::NONE;
|
|
|
|
unsigned texMtxIdxCount = 0;
|
|
|
|
GX::AttrType texMtxIdx[7] = {GX::NONE};
|
2015-09-07 04:05:44 +00:00
|
|
|
bool shortUVs;
|
2015-08-10 01:53:24 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
template <class MaterialSet>
|
|
|
|
void GetVertexAttributes(const MaterialSet& matSet,
|
2016-03-02 07:29:19 +00:00
|
|
|
std::vector<VertexAttributes>& attributesOut);
|
2015-08-10 01:53:24 +00:00
|
|
|
|
|
|
|
template <class PAKRouter, class MaterialSet>
|
2017-12-29 08:08:12 +00:00
|
|
|
void ReadMaterialSetToBlender_1_2(hecl::blender::PyOutStream& os,
|
2015-08-10 01:53:24 +00:00
|
|
|
const MaterialSet& matSet,
|
|
|
|
const PAKRouter& pakRouter,
|
|
|
|
const typename PAKRouter::EntryType& entry,
|
2016-03-02 07:29:19 +00:00
|
|
|
unsigned setIdx);
|
2015-08-10 01:53:24 +00:00
|
|
|
|
|
|
|
template <class PAKRouter, class MaterialSet>
|
2017-12-29 08:08:12 +00:00
|
|
|
void ReadMaterialSetToBlender_3(hecl::blender::PyOutStream& os,
|
2015-08-10 01:53:24 +00:00
|
|
|
const MaterialSet& matSet,
|
|
|
|
const PAKRouter& pakRouter,
|
|
|
|
const typename PAKRouter::EntryType& entry,
|
2016-03-02 07:29:19 +00:00
|
|
|
unsigned setIdx);
|
2015-07-28 02:24:36 +00:00
|
|
|
|
2017-12-29 08:08:12 +00:00
|
|
|
void InitGeomBlenderContext(hecl::blender::PyOutStream& os,
|
2016-08-12 02:33:38 +00:00
|
|
|
const hecl::ProjectPath& masterShaderPath,
|
|
|
|
bool solidShading);
|
2017-12-29 08:08:12 +00:00
|
|
|
void FinishBlenderMesh(hecl::blender::PyOutStream& os,
|
2015-09-07 04:05:44 +00:00
|
|
|
unsigned matSetCount, int meshIdx);
|
|
|
|
|
2015-09-26 03:12:08 +00:00
|
|
|
template <class PAKRouter, class MaterialSet, class RigPair, class SurfaceHeader>
|
2017-12-29 08:08:12 +00:00
|
|
|
atUint32 ReadGeomSectionsToBlender(hecl::blender::PyOutStream& os,
|
2016-03-04 23:04:53 +00:00
|
|
|
athena::io::IStreamReader& reader,
|
2015-09-07 04:05:44 +00:00
|
|
|
PAKRouter& pakRouter,
|
|
|
|
const typename PAKRouter::EntryType& entry,
|
2015-09-26 03:12:08 +00:00
|
|
|
const RigPair& rp,
|
2015-09-07 04:05:44 +00:00
|
|
|
bool shortNormals,
|
|
|
|
bool shortUVs,
|
|
|
|
std::vector<VertexAttributes>& vertAttribs,
|
|
|
|
int meshIdx,
|
|
|
|
atUint32 secCount,
|
|
|
|
atUint32 matSetCount,
|
2015-09-20 06:09:27 +00:00
|
|
|
const atUint32* secSizes,
|
2016-03-02 07:29:19 +00:00
|
|
|
atUint32 surfaceCount=0);
|
2015-09-07 04:05:44 +00:00
|
|
|
|
2015-09-26 03:12:08 +00:00
|
|
|
template <class PAKRouter, class MaterialSet, class RigPair, class SurfaceHeader, atUint32 Version>
|
2017-12-29 08:08:12 +00:00
|
|
|
bool ReadCMDLToBlender(hecl::blender::Connection& conn,
|
2016-03-04 23:04:53 +00:00
|
|
|
athena::io::IStreamReader& reader,
|
2015-09-07 04:05:44 +00:00
|
|
|
PAKRouter& pakRouter,
|
|
|
|
const typename PAKRouter::EntryType& entry,
|
|
|
|
const SpecBase& dataspec,
|
2016-03-02 07:29:19 +00:00
|
|
|
const RigPair& rp);
|
2015-07-28 02:24:36 +00:00
|
|
|
|
2015-10-27 00:19:03 +00:00
|
|
|
template <class PAKRouter, class MaterialSet>
|
2016-03-04 23:04:53 +00:00
|
|
|
void NameCMDL(athena::io::IStreamReader& reader,
|
2015-10-27 00:19:03 +00:00
|
|
|
PAKRouter& pakRouter,
|
|
|
|
typename PAKRouter::EntryType& entry,
|
2016-03-02 07:29:19 +00:00
|
|
|
const SpecBase& dataspec);
|
2015-10-19 03:28:47 +00:00
|
|
|
|
2015-10-11 05:56:42 +00:00
|
|
|
template <class MaterialSet, class SurfaceHeader, atUint32 Version>
|
2016-03-05 00:03:41 +00:00
|
|
|
bool WriteCMDL(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath, const Mesh& mesh);
|
2015-10-11 05:56:42 +00:00
|
|
|
|
2015-11-14 02:28:45 +00:00
|
|
|
template <class MaterialSet, class SurfaceHeader, atUint32 Version>
|
2017-08-21 05:46:59 +00:00
|
|
|
bool WriteHMDLCMDL(const hecl::ProjectPath& outPath, const hecl::ProjectPath& inPath,
|
2017-12-29 08:08:12 +00:00
|
|
|
const Mesh& mesh, hecl::blender::PoolSkinIndex& poolSkinIndex);
|
2015-11-14 02:28:45 +00:00
|
|
|
|
2016-08-10 02:52:00 +00:00
|
|
|
template <class MaterialSet, class SurfaceHeader, class MeshHeader>
|
|
|
|
bool WriteMREASecs(std::vector<std::vector<uint8_t>>& secsOut, const hecl::ProjectPath& inPath,
|
2016-08-10 21:54:53 +00:00
|
|
|
const std::vector<Mesh>& meshes, zeus::CAABox& fullAABB, std::vector<zeus::CAABox>& meshAABBs);
|
2016-08-10 02:52:00 +00:00
|
|
|
|
|
|
|
template <class MaterialSet, class SurfaceHeader, class MeshHeader>
|
|
|
|
bool WriteHMDLMREASecs(std::vector<std::vector<uint8_t>>& secsOut, const hecl::ProjectPath& inPath,
|
2016-08-10 21:54:53 +00:00
|
|
|
const std::vector<Mesh>& meshes, zeus::CAABox& fullAABB, std::vector<zeus::CAABox>& meshAABBs);
|
2016-08-10 02:52:00 +00:00
|
|
|
|
2015-07-28 02:24:36 +00:00
|
|
|
}
|
2015-08-10 01:53:24 +00:00
|
|
|
|
|
|
|
#endif // _DNACOMMON_CMDL_HPP_
|