UVAtlas/UVAtlasTool/SDKMesh.h

339 строки
11 KiB
C++

//--------------------------------------------------------------------------------------
// File: SDKMesh.h
//
// SDKMESH format is generated by the legacy DirectX SDK's Content Exporter and
// originally rendered by the DXUT helper class SDKMesh
//
// http://go.microsoft.com/fwlink/?LinkId=226208
//
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
//
// http://go.microsoft.com/fwlink/?LinkId=248929
// http://go.microsoft.com/fwlink/?LinkID=615561
//--------------------------------------------------------------------------------------
#pragma once
#include <cstdint>
namespace DXUT
{
// .SDKMESH files
// SDKMESH_HEADER
// SDKMESH_VERTEX_BUFFER_HEADER header->VertexStreamHeadersOffset
// SDKMESH_INDEX_BUFFER_HEADER header->IndexStreamHeadersOffset
// SDKMESH_MESH header->MeshDataOffset
// SDKMESH_SUBSET header->SubsetDataOffset
// SDKMESH_FRAME header->FrameDataOffset
// SDKMESH_MATERIAL header->MaterialDataOffset
// [header->NonBufferDataSize]
// { [ header->NumVertexBuffers]
// VB data
// }
// { [ header->NumIndexBuffers]
// IB data
// }
// .SDDKANIM files
// SDKANIMATION_FILE_HEADER
// uint8_t[] - Length of fileheader->AnimationDataSize
// .SDKMESH uses Direct3D 9 decls, but only a subset of these is ever generated by the legacy DirectX SDK Content Exporter
// D3DDECLUSAGE_POSITION / D3DDECLTYPE_FLOAT3
// (D3DDECLUSAGE_BLENDWEIGHT / D3DDECLTYPE_UBYTE4N
// D3DDECLUSAGE_BLENDINDICES / D3DDECLTYPE_UBYTE4)?
// (D3DDECLUSAGE_NORMAL / D3DDECLTYPE_FLOAT3, D3DDECLTYPE_FLOAT16_4, D3DDECLTYPE_SHORT4N, D3DDECLTYPE_UBYTE4N, or D3DDECLTYPE_DEC3N)?
// (D3DDECLUSAGE_COLOR / D3DDECLTYPE_D3DCOLOR)?
// (D3DDECLUSAGE_TEXCOORD / D3DDECLTYPE_FLOAT1, D3DDECLTYPE_FLOAT2 or D3DDECLTYPE_FLOAT16_2, D3DDECLTYPE_FLOAT3 or D3DDECLTYPE_FLOAT16_4, D3DDECLTYPE_FLOAT4 or D3DDECLTYPE_FLOAT16_4)*
// (D3DDECLUSAGE_TANGENT / same as D3DDECLUSAGE_NORMAL)?
// (D3DDECLUSAGE_BINORMAL / same as D3DDECLUSAGE_NORMAL)?
enum D3DDECLUSAGE
{
D3DDECLUSAGE_POSITION = 0,
D3DDECLUSAGE_BLENDWEIGHT =1,
D3DDECLUSAGE_BLENDINDICES =2,
D3DDECLUSAGE_NORMAL =3,
D3DDECLUSAGE_TEXCOORD = 5,
D3DDECLUSAGE_TANGENT = 6,
D3DDECLUSAGE_BINORMAL = 7,
D3DDECLUSAGE_COLOR = 10,
};
enum D3DDECLTYPE
{
D3DDECLTYPE_FLOAT1 = 0, // 1D float expanded to (value, 0., 0., 1.)
D3DDECLTYPE_FLOAT2 = 1, // 2D float expanded to (value, value, 0., 1.)
D3DDECLTYPE_FLOAT3 = 2, // 3D float expanded to (value, value, value, 1.)
D3DDECLTYPE_FLOAT4 = 3, // 4D float
D3DDECLTYPE_D3DCOLOR = 4, // 4D packed unsigned bytes mapped to 0. to 1. range
// Input is in D3DCOLOR format (ARGB) expanded to (R, G, B, A)
D3DDECLTYPE_UBYTE4 = 5, // 4D unsigned uint8_t
D3DDECLTYPE_UBYTE4N = 8, // Each of 4 bytes is normalized by dividing to 255.0
D3DDECLTYPE_SHORT4N = 10, // 4D signed short normalized (v[0]/32767.0,v[1]/32767.0,v[2]/32767.0,v[3]/32767.0)
D3DDECLTYPE_DEC3N = 14, // 3D signed normalized (v[0]/511.0, v[1]/511.0, v[2]/511.0, 1.)
// Note: There is no equivalent to D3DDECLTYPE_DEC3N (14) as a DXGI_FORMAT
D3DDECLTYPE_FLOAT16_2 = 15, // Two 16-bit floating point values, expanded to (value, value, 0, 1)
D3DDECLTYPE_FLOAT16_4 = 16, // Four 16-bit floating point values
D3DDECLTYPE_UNUSED = 17, // When the type field in a decl is unused.
// These are extensions for DXGI-based versions of Direct3D
D3DDECLTYPE_DXGI_R10G10B10A2_UNORM = 32 + DXGI_FORMAT_R10G10B10A2_UNORM,
D3DDECLTYPE_DXGI_R11G11B10_FLOAT = 32 + DXGI_FORMAT_R11G11B10_FLOAT,
D3DDECLTYPE_DXGI_R8G8B8A8_SNORM = 32 + DXGI_FORMAT_R8G8B8A8_SNORM,
};
#pragma pack(push,4)
struct D3DVERTEXELEMENT9
{
uint16_t Stream; // Stream index
uint16_t Offset; // Offset in the stream in bytes
uint8_t Type; // Data type
uint8_t Method; // Processing method
uint8_t Usage; // Semantics
uint8_t UsageIndex; // Semantic index
};
#pragma pack(pop)
//--------------------------------------------------------------------------------------
// Hard Defines for the various structures
//--------------------------------------------------------------------------------------
constexpr uint32_t SDKMESH_FILE_VERSION = 101;
constexpr uint32_t SDKMESH_FILE_VERSION_V2 = 200;
constexpr uint32_t MAX_VERTEX_ELEMENTS = 32;
constexpr uint32_t MAX_VERTEX_STREAMS = 16;
constexpr uint32_t MAX_FRAME_NAME = 100;
constexpr uint32_t MAX_MESH_NAME = 100;
constexpr uint32_t MAX_SUBSET_NAME = 100;
constexpr uint32_t MAX_MATERIAL_NAME = 100;
constexpr uint32_t MAX_TEXTURE_NAME = MAX_PATH;
constexpr uint32_t MAX_MATERIAL_PATH = MAX_PATH;
constexpr uint32_t INVALID_FRAME = uint32_t(-1);
constexpr uint32_t INVALID_MESH = uint32_t(-1);
constexpr uint32_t INVALID_MATERIAL = uint32_t(-1);
constexpr uint32_t INVALID_SUBSET = uint32_t(-1);
constexpr uint32_t INVALID_ANIMATION_DATA = uint32_t(-1);
//--------------------------------------------------------------------------------------
// Enumerated Types.
//--------------------------------------------------------------------------------------
enum SDKMESH_PRIMITIVE_TYPE
{
PT_TRIANGLE_LIST = 0,
PT_TRIANGLE_STRIP,
PT_LINE_LIST,
PT_LINE_STRIP,
PT_POINT_LIST,
PT_TRIANGLE_LIST_ADJ,
PT_TRIANGLE_STRIP_ADJ,
PT_LINE_LIST_ADJ,
PT_LINE_STRIP_ADJ,
PT_QUAD_PATCH_LIST,
PT_TRIANGLE_PATCH_LIST,
};
enum SDKMESH_INDEX_TYPE
{
IT_16BIT = 0,
IT_32BIT,
};
enum FRAME_TRANSFORM_TYPE
{
FTT_RELATIVE = 0,
FTT_ABSOLUTE, // This is not currently used but is here to support absolute transformations in the future
};
//--------------------------------------------------------------------------------------
// Structures.
//--------------------------------------------------------------------------------------
#pragma pack(push,8)
struct SDKMESH_HEADER
{
//Basic Info and sizes
uint32_t Version;
uint8_t IsBigEndian;
uint64_t HeaderSize;
uint64_t NonBufferDataSize;
uint64_t BufferDataSize;
//Stats
uint32_t NumVertexBuffers;
uint32_t NumIndexBuffers;
uint32_t NumMeshes;
uint32_t NumTotalSubsets;
uint32_t NumFrames;
uint32_t NumMaterials;
//Offsets to Data
uint64_t VertexStreamHeadersOffset;
uint64_t IndexStreamHeadersOffset;
uint64_t MeshDataOffset;
uint64_t SubsetDataOffset;
uint64_t FrameDataOffset;
uint64_t MaterialDataOffset;
};
struct SDKMESH_VERTEX_BUFFER_HEADER
{
uint64_t NumVertices;
uint64_t SizeBytes;
uint64_t StrideBytes;
D3DVERTEXELEMENT9 Decl[MAX_VERTEX_ELEMENTS];
uint64_t DataOffset;
};
struct SDKMESH_INDEX_BUFFER_HEADER
{
uint64_t NumIndices;
uint64_t SizeBytes;
uint32_t IndexType;
uint64_t DataOffset;
};
struct SDKMESH_MESH
{
char Name[MAX_MESH_NAME];
uint8_t NumVertexBuffers;
uint32_t VertexBuffers[MAX_VERTEX_STREAMS];
uint32_t IndexBuffer;
uint32_t NumSubsets;
uint32_t NumFrameInfluences; //aka bones
DirectX::XMFLOAT3 BoundingBoxCenter;
DirectX::XMFLOAT3 BoundingBoxExtents;
union
{
uint64_t SubsetOffset;
INT* pSubsets;
};
union
{
uint64_t FrameInfluenceOffset;
uint32_t* pFrameInfluences;
};
};
struct SDKMESH_SUBSET
{
char Name[MAX_SUBSET_NAME];
uint32_t MaterialID;
uint32_t PrimitiveType;
uint64_t IndexStart;
uint64_t IndexCount;
uint64_t VertexStart;
uint64_t VertexCount;
};
struct SDKMESH_FRAME
{
char Name[MAX_FRAME_NAME];
uint32_t Mesh;
uint32_t ParentFrame;
uint32_t ChildFrame;
uint32_t SiblingFrame;
DirectX::XMFLOAT4X4 Matrix;
uint32_t AnimationDataIndex; //Used to index which set of keyframes transforms this frame
};
struct SDKMESH_MATERIAL
{
char Name[MAX_MATERIAL_NAME];
// Use MaterialInstancePath
char MaterialInstancePath[MAX_MATERIAL_PATH];
// Or fall back to d3d8-type materials
char DiffuseTexture[MAX_TEXTURE_NAME];
char NormalTexture[MAX_TEXTURE_NAME];
char SpecularTexture[MAX_TEXTURE_NAME];
DirectX::XMFLOAT4 Diffuse;
DirectX::XMFLOAT4 Ambient;
DirectX::XMFLOAT4 Specular;
DirectX::XMFLOAT4 Emissive;
float Power;
uint64_t Force64_1;
uint64_t Force64_2;
uint64_t Force64_3;
uint64_t Force64_4;
uint64_t Force64_5;
uint64_t Force64_6;
};
struct SDKMESH_MATERIAL_V2
{
char Name[MAX_MATERIAL_NAME];
// PBR materials
char RMATexture[MAX_TEXTURE_NAME];
char AlbedoTexture[MAX_TEXTURE_NAME];
char NormalTexture[MAX_TEXTURE_NAME];
char EmissiveTexture[MAX_TEXTURE_NAME];
float Alpha;
char Reserved[60];
uint64_t Force64_1;
uint64_t Force64_2;
uint64_t Force64_3;
uint64_t Force64_4;
uint64_t Force64_5;
uint64_t Force64_6;
};
struct SDKANIMATION_FILE_HEADER
{
uint32_t Version;
uint8_t IsBigEndian;
uint32_t FrameTransformType;
uint32_t NumFrames;
uint32_t NumAnimationKeys;
uint32_t AnimationFPS;
uint64_t AnimationDataSize;
uint64_t AnimationDataOffset;
};
struct SDKANIMATION_DATA
{
DirectX::XMFLOAT3 Translation;
DirectX::XMFLOAT4 Orientation;
DirectX::XMFLOAT3 Scaling;
};
struct SDKANIMATION_FRAME_DATA
{
char FrameName[MAX_FRAME_NAME];
uint64_t DataOffset;
};
#pragma pack(pop)
} // namespace
static_assert( sizeof(DXUT::D3DVERTEXELEMENT9) == 8, "Direct3D9 Decl structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_HEADER)== 104, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_VERTEX_BUFFER_HEADER) == 288, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_INDEX_BUFFER_HEADER) == 32, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_MESH) == 224, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_SUBSET) == 144, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_FRAME) == 184, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_MATERIAL) == 1256, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKMESH_MATERIAL_V2) == sizeof(DXUT::SDKMESH_MATERIAL), "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKANIMATION_FILE_HEADER) == 40, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKANIMATION_DATA) == 40, "SDK Mesh structure size incorrect" );
static_assert( sizeof(DXUT::SDKANIMATION_FRAME_DATA) == 112, "SDK Mesh structure size incorrect" );