-
Notifications
You must be signed in to change notification settings - Fork 0
/
Utilities.h
174 lines (144 loc) · 4.81 KB
/
Utilities.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#pragma once
#define NOMINMAX
#include <windows.h>
#include <wrl.h>
#include <dxgi1_4.h>
#include <d3d12.h>
#include <D3Dcompiler.h>
#include <DirectXMath.h>
#include <DirectXPackedVector.h>
#include <DirectXColors.h>
#include <DirectXCollision.h>
#include <string>
#include <memory>
#include <algorithm>
#include <vector>
#include <array>
#include <unordered_map>
#include <cstdint>
#include <fstream>
#include <sstream>
#include <cassert>
#include "d3dx12.h"
#include "DDSTextureLoader.h"
#include "MathF.h"
inline void d3dSetDebugName(IDXGIObject* obj, const char* name)
{
if (obj)
{
obj->SetPrivateData(WKPDID_D3DDebugObjectName, lstrlenA(name), name);
}
}
inline void d3dSetDebugName(ID3D12Device* obj, const char* name)
{
if (obj)
{
obj->SetPrivateData(WKPDID_D3DDebugObjectName, lstrlenA(name), name);
}
}
inline void d3dSetDebugName(ID3D12DeviceChild* obj, const char* name)
{
if (obj)
{
obj->SetPrivateData(WKPDID_D3DDebugObjectName, lstrlenA(name), name);
}
}
inline std::wstring AnsiToWString(const std::string& str)
{
WCHAR buffer[512];
MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, buffer, 512);
return std::wstring(buffer);
}
/*
Reason for living here: needed by both shadowmap.h and light.h, but shadowmap is needed by light as it owns one.
*/
enum class LightType : int
{
DIRECTIONAL,
POINT,
SPOT
};
class Utilities
{
public:
static bool IsKeyDown(int vkeyCode);
static std::string ToString(HRESULT hr);
static UINT CalcConstantBufferByteSize(UINT byteSize);
// DX lookatlh behaves strangely... lets try constructing view mat manually
static DirectX::XMMATRIX XM_CALLCONV LookAt(DirectX::FXMVECTOR, DirectX::FXMVECTOR, DirectX::FXMVECTOR);
static Microsoft::WRL::ComPtr<ID3DBlob> LoadBinary(const std::wstring& filename);
static Microsoft::WRL::ComPtr<ID3D12Resource> CreateDefaultBuffer(
ID3D12Device* device,
ID3D12GraphicsCommandList* cmdList,
const void* initData,
UINT64 byteSize,
Microsoft::WRL::ComPtr<ID3D12Resource>& uploadBuffer);
static Microsoft::WRL::ComPtr<ID3DBlob> CompileShader(
const std::wstring& filename,
const D3D_SHADER_MACRO* defines,
const std::string& entrypoint,
const std::string& target);
};
std::vector<std::string> split(const std::string&, char delim);
class DxException
{
public:
DxException() = default;
DxException(HRESULT hr, const std::wstring& functionName, const std::wstring& filename, int lineNumber);
std::wstring ToString() const;
HRESULT ErrorCode = S_OK;
std::wstring FunctionName;
std::wstring Filename;
int LineNumber = -1;
};
struct MaterialConstants
{
DirectX::XMFLOAT4 DiffuseAlbedo = { 1.0f, 1.0f, 1.0f, 1.0f };
DirectX::XMFLOAT3 FresnelR0 = { 0.01f, 0.01f, 0.01f };
float Roughness = 0.25f;
// Used in texture mapping.
DirectX::XMFLOAT4X4 MatTransform = Math::Identity4x4();
};
// Simple struct to represent a material for our demos. A production 3D engine
// would likely create a class hierarchy of Materials.
struct Material
{
Material(int numFramesDirty) : NumFramesDirty(numFramesDirty) {};
// Unique material name for lookup.
std::string Name;
// Index into constant buffer corresponding to this material.
UINT MatCBIndex = 0;
// Index into SRV heap for diffuse texture.
UINT DiffuseSrvHeapIndex = 0;
// Index into SRV heap for normal texture.
UINT NormalSrvHeapIndex = 0;
// Dirty flag indicating the material has changed and we need to update the constant buffer.
// Because we have a material constant buffer for each FrameResource, we have to apply the
// update to each FrameResource. Thus, when we modify a material we should set
// NumFramesDirty = gNumFrameResources so that each frame resource gets the update.
int NumFramesDirty = 0;
// Material constant buffer data used for shading.
DirectX::XMFLOAT4 DiffuseAlbedo = { 1.0f, 1.0f, 1.0f, 1.0f };
DirectX::XMFLOAT3 FresnelR0 = { 0.01f, 0.01f, 0.01f };
float Roughness = .25f;
DirectX::XMFLOAT4X4 MatTransform = Math::Identity4x4();
};
struct Texture
{
// Unique material name for lookup.
std::string Name;
std::wstring Filename;
Microsoft::WRL::ComPtr<ID3D12Resource> Resource = nullptr;
Microsoft::WRL::ComPtr<ID3D12Resource> UploadHeap = nullptr;
};
#ifndef ThrowIfFailed
#define ThrowIfFailed(x) \
{ \
HRESULT hr__ = (x); \
std::wstring wfn = AnsiToWString(__FILE__); \
if(FAILED(hr__)) { throw DxException(hr__, L#x, wfn, __LINE__); } \
}
#endif
#ifndef ReleaseCom
#define ReleaseCom(x) { if(x){ x->Release(); x = 0; } }
#endif