-
Notifications
You must be signed in to change notification settings - Fork 25
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Re-add support for Hedgehog Engine models
- Loading branch information
1 parent
7ddf1a0
commit 5dba8b4
Showing
6 changed files
with
522 additions
and
154 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | ||
} |
Oops, something went wrong.