Skip to content

Commit

Permalink
Re-add support for Hedgehog Engine models
Browse files Browse the repository at this point in the history
  • Loading branch information
Radfordhound committed Jun 9, 2019
1 parent 7ddf1a0 commit 5dba8b4
Show file tree
Hide file tree
Showing 6 changed files with 522 additions and 154 deletions.
55 changes: 55 additions & 0 deletions HedgeLib/include/HedgeLib/Geometry/HHMesh.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
#pragma once
#include "../Offsets.h"
#include "../Endian.h"
#include "../IO/IO.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

struct hl_DHHSubMesh;
typedef HL_ARR32(HL_OFF32(hl_DHHSubMesh)) hl_DHHSubMeshSlot;

struct hl_DHHSpecialSubMeshSlot
{
uint32_t Count;
HL_OFF32(HL_STR32) Types;
HL_OFF32(HL_OFF32(uint32_t)) SubMeshCounts;
HL_OFF32(HL_OFF32(HL_OFF32(hl_DHHSubMesh))) SubMeshes;

HL_INLN_X64_OFFSETS_CPP(Types, SubMeshCounts, SubMeshes);

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_ENDIAN_SWAP_RECURSIVE_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_X64_OFFSETS(hl_DHHSpecialSubMeshSlot);
HL_DECL_ENDIAN_SWAP(hl_DHHSpecialSubMeshSlot);
HL_DECL_ENDIAN_SWAP_RECURSIVE(hl_DHHSpecialSubMeshSlot);
HL_DECL_WRITE(hl_DHHSpecialSubMeshSlot);

struct hl_DHHMesh
{
hl_DHHSubMeshSlot Solid;
hl_DHHSubMeshSlot Transparent;
hl_DHHSubMeshSlot Boolean;
hl_DHHSpecialSubMeshSlot Special;

HL_INLN_X64_OFFSETS_CPP(Solid.Offset, Transparent.Offset, Boolean.Offset,
Special.Types, Special.SubMeshCounts, Special.SubMeshes);

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_ENDIAN_SWAP_RECURSIVE_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_X64_OFFSETS(hl_DHHMesh);
HL_DECL_ENDIAN_SWAP(hl_DHHMesh);
HL_DECL_ENDIAN_SWAP_RECURSIVE(hl_DHHMesh);
HL_DECL_WRITE(hl_DHHMesh);

#ifdef __cplusplus
}
#endif
93 changes: 93 additions & 0 deletions HedgeLib/include/HedgeLib/Geometry/HHModel.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#pragma once
#include "../Offsets.h"
#include "../Endian.h"
#include "../IO/IO.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

struct hl_DHHMesh;
struct hl_DHHTerrainModel
{
HL_ARR32(HL_OFF32(hl_DHHMesh)) Meshes;
HL_STR32 Name;
uint32_t Flags; // TODO: Make this an enum

HL_INLN_X64_OFFSETS_CPP(Meshes.Offset, Name);

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_ENDIAN_SWAP_RECURSIVE_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_X64_OFFSETS(hl_DHHTerrainModel);
HL_DECL_ENDIAN_SWAP(hl_DHHTerrainModel);
HL_DECL_ENDIAN_SWAP_RECURSIVE(hl_DHHTerrainModel);
HL_DECL_WRITE(hl_DHHTerrainModel);

struct hl_DHHBone
{
int32_t Index;
HL_STR32 Name;

HL_INLN_X64_OFFSETS_CPP(Name);

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_X64_OFFSETS(hl_DHHBone);
HL_DECL_ENDIAN_SWAP(hl_DHHBone);
HL_DECL_WRITE(hl_DHHBone);

struct hl_Matrix4x4;
struct hl_AABB;

struct hl_DHHSkeleton
{
// TODO: Convert this to an array if you find out what it is
uint32_t UnknownCount;
HL_OFF32(uint8_t) UnknownOffset;

uint32_t BoneCount;
HL_OFF32(HL_OFF32(hl_DHHBone)) Bones;
HL_OFF32(hl_Matrix4x4) BoneMatrices;
HL_OFF32(hl_AABB) GlobalAABB;

HL_INLN_X64_OFFSETS_CPP(UnknownOffset, Bones,
BoneMatrices, GlobalAABB);

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_ENDIAN_SWAP_RECURSIVE_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_X64_OFFSETS(hl_DHHSkeleton);
HL_DECL_ENDIAN_SWAP(hl_DHHSkeleton);
HL_DECL_ENDIAN_SWAP_RECURSIVE(hl_DHHSkeleton);
HL_DECL_WRITE(hl_DHHSkeleton);

struct hl_DHHSkeletalModel
{
HL_ARR32(HL_OFF32(hl_DHHMesh)) Meshes;
hl_DHHSkeleton Skeleton;

HL_INLN_X64_OFFSETS_CPP(Meshes.Offset,
Skeleton.UnknownOffset, Skeleton.Bones,
Skeleton.BoneMatrices, Skeleton.GlobalAABB);

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_ENDIAN_SWAP_RECURSIVE_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_X64_OFFSETS(hl_DHHSkeletalModel);
HL_DECL_ENDIAN_SWAP(hl_DHHSkeletalModel);
HL_DECL_ENDIAN_SWAP_RECURSIVE(hl_DHHSkeletalModel);
HL_DECL_WRITE(hl_DHHSkeletalModel);

#ifdef __cplusplus
}
#endif
93 changes: 93 additions & 0 deletions HedgeLib/include/HedgeLib/Geometry/HHSubMesh.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
#pragma once
#include "../Offsets.h"
#include "../Endian.h"
#include "../IO/IO.h"
#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

struct hl_DHHTextureUnit
{
HL_STR32 Name;
uint32_t ID; // TODO: Why does this look like it's little endian? Is this actually a byte??

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_ENDIAN_SWAP(hl_DHHTextureUnit);
HL_DECL_WRITE(hl_DHHTextureUnit);

enum HL_HHVERTEX_DATA_FORMAT : uint32_t
{
HL_HHVERTEX_FORMAT_UNKNOWN = 0,
// TODO: Index_Byte might actually just be a uint as BLENDINDICES semantic in HLSL is a uint
// probably not actually since they seem to be signed.
HL_HHVERTEX_FORMAT_INDEX_BYTE = 0x001A2286,
HL_HHVERTEX_FORMAT_INDEX = 0x001A2386,
HL_HHVERTEX_FORMAT_VECTOR2 = 0x002C23A5,
HL_HHVERTEX_FORMAT_VECTOR2_HALF = 0x002C235F,
HL_HHVERTEX_FORMAT_VECTOR3 = 0x002A23B9,
HL_HHVERTEX_FORMAT_VECTOR3_HH1 = 0x002A2190,
HL_HHVERTEX_FORMAT_VECTOR3_HH2 = 0x002A2187,
HL_HHVERTEX_FORMAT_VECTOR4 = 0x001A23A6,
HL_HHVERTEX_FORMAT_VECTOR4_BYTE = 0x001A2086,
HL_HHVERTEX_FORMAT_LAST_ENTRY = 0xFFFFFFFF
};

enum HL_HHVERTEX_DATA_TYPE : uint16_t
{
HL_HHVERTEX_TYPE_POSITION = 0,
HL_HHVERTEX_TYPE_BONE_WEIGHT = 1,
HL_HHVERTEX_TYPE_BONE_INDEX = 2,
HL_HHVERTEX_TYPE_NORMAL = 3,
HL_HHVERTEX_TYPE_UV = 5,
HL_HHVERTEX_TYPE_TANGENT = 6,
HL_HHVERTEX_TYPE_BINORMAL = 7,
HL_HHVERTEX_TYPE_COLOR = 10
};

struct hl_DHHVertexElement
{
uint32_t Offset;
enum HL_HHVERTEX_DATA_FORMAT Format;
enum HL_HHVERTEX_DATA_TYPE Type;
uint8_t Index;
uint8_t Padding;

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_ENDIAN_SWAP(hl_DHHVertexElement);
HL_DECL_WRITE(hl_DHHVertexElement);

struct hl_DHHSubMesh
{
HL_STR32 MaterialName;
HL_ARR32(uint16_t) Faces;
uint32_t VertexCount;
uint32_t VertexSize;
HL_OFF32(uint8_t) Vertices;
HL_OFF32(hl_DHHVertexElement) VertexElements;
HL_ARR32(uint8_t) Bones;
HL_ARR32(HL_OFF32(hl_DHHTextureUnit)) TextureUnits;

HL_INLN_X64_OFFSETS_CPP(MaterialName, Faces.Offset, Vertices,
VertexElements, Bones.Offset, TextureUnits.Offset);

HL_DECL_ENDIAN_SWAP_CPP();
HL_DECL_ENDIAN_SWAP_RECURSIVE_CPP();
HL_DECL_WRITE_CPP();
};

HL_DECL_X64_OFFSETS(hl_DHHSubMesh);
HL_DECL_ENDIAN_SWAP(hl_DHHSubMesh);
HL_DECL_ENDIAN_SWAP_RECURSIVE(hl_DHHSubMesh);
HL_DECL_WRITE(hl_DHHSubMesh);

#ifdef __cplusplus
}
#endif
68 changes: 68 additions & 0 deletions HedgeLib/src/Geometry/HHMesh.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
#include "HedgeLib/Geometry/HHMesh.h"
#include "HedgeLib/Geometry/HHSubMesh.h"
#include "HedgeLib/Endian.h"

// hl_DHHSpecialSubMeshSlot
HL_IMPL_ENDIAN_SWAP_CPP(hl_DHHSpecialSubMeshSlot);
HL_IMPL_ENDIAN_SWAP_RECURSIVE_CPP(hl_DHHSpecialSubMeshSlot);
HL_IMPL_WRITE_CPP(hl_DHHSpecialSubMeshSlot);
HL_IMPL_X64_OFFSETS(hl_DHHSpecialSubMeshSlot);

HL_IMPL_ENDIAN_SWAP(hl_DHHSpecialSubMeshSlot, v)
{
hl_Swap(v->Count);
}

HL_IMPL_ENDIAN_SWAP_RECURSIVE(hl_DHHSpecialSubMeshSlot, v, be)
{
if (be) hl_Swap(v->Count);

// Swap SubMeshCounts/SubMeshes
for (std::uint32_t i = 0; i < v->Count; ++i)
{
if (be) hl_Swap(*(v->SubMeshCounts[i].Get()));

// Swap SubMeshes
uint32_t subMeshCount = *(v->SubMeshCounts[i].Get());
for (uint32_t i2 = 0; i2 < subMeshCount; ++i2)
{
((v->SubMeshes[i])[i2].Get())->EndianSwapRecursive(be);
}

if (!be) hl_Swap(*(v->SubMeshCounts[i].Get()));
}

if (!be) hl_Swap(v->Count);
}

HL_IMPL_WRITE(hl_DHHSpecialSubMeshSlot, file, ptr, offTable)
{
// TODO
}

// hl_DHHMesh
HL_IMPL_ENDIAN_SWAP_CPP(hl_DHHMesh);
HL_IMPL_ENDIAN_SWAP_RECURSIVE_CPP(hl_DHHMesh);
HL_IMPL_WRITE_CPP(hl_DHHMesh);
HL_IMPL_X64_OFFSETS(hl_DHHMesh);

HL_IMPL_ENDIAN_SWAP(hl_DHHMesh, v)
{
hl_Swap(v->Solid);
hl_Swap(v->Transparent);
hl_Swap(v->Boolean);
v->Special.EndianSwap();
}

HL_IMPL_ENDIAN_SWAP_RECURSIVE(hl_DHHMesh, v, be)
{
hl_SwapRecursive<HL_OFF32(hl_DHHSubMesh)>(be, v->Solid);
hl_SwapRecursive<HL_OFF32(hl_DHHSubMesh)>(be, v->Transparent);
hl_SwapRecursive<HL_OFF32(hl_DHHSubMesh)>(be, v->Boolean);
v->Special.EndianSwapRecursive(be);
}

HL_IMPL_WRITE(hl_DHHMesh, file, ptr, offTable)
{
// TODO
}
Loading

0 comments on commit 5dba8b4

Please sign in to comment.