aboutsummaryrefslogtreecommitdiff
path: root/demo/d3d11/meshRender.h
diff options
context:
space:
mode:
authorMiles Macklin <[email protected]>2017-03-10 14:51:31 +1300
committerMiles Macklin <[email protected]>2017-03-10 14:51:31 +1300
commitad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f (patch)
tree4cc6f3288363889d7342f7f8407c0251e6904819 /demo/d3d11/meshRender.h
downloadflex-ad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f.tar.xz
flex-ad3d90fafe5ee79964bdfe1f1e0704c3ffcdfd5f.zip
Initial 1.1.0 binary release
Diffstat (limited to 'demo/d3d11/meshRender.h')
-rw-r--r--demo/d3d11/meshRender.h297
1 files changed, 297 insertions, 0 deletions
diff --git a/demo/d3d11/meshRender.h b/demo/d3d11/meshRender.h
new file mode 100644
index 0000000..01ad181
--- /dev/null
+++ b/demo/d3d11/meshRender.h
@@ -0,0 +1,297 @@
+
+/*
+ * Copyright (c) 2008-2017, NVIDIA CORPORATION. All rights reserved.
+ *
+ * NVIDIA CORPORATION and its licensors retain all intellectual property
+ * and proprietary rights in and to this software, related documentation
+ * and any modifications thereto. Any use, reproduction, disclosure or
+ * distribution of this software and related documentation without an express
+ * license agreement from NVIDIA CORPORATION is strictly prohibited.
+ */
+
+#pragma once
+
+#include <DirectXMath.h>
+
+#include "appD3D11Ctx.h"
+
+#include "core/maths.h"
+
+struct ShadowMap;
+
+struct GpuMesh
+{
+ ID3D11Buffer* positionBuffer;
+ ID3D11Buffer* normalBuffer;
+ ID3D11Buffer* texcoordBuffer;
+ ID3D11Buffer* colorBuffer;
+
+ ID3D11Buffer* indexBuffer;
+
+ GpuMesh(ID3D11Device* device, ID3D11DeviceContext* deviceContext)
+ : positionBuffer(NULL)
+ , normalBuffer(NULL)
+ , texcoordBuffer(NULL)
+ , colorBuffer(NULL)
+ , indexBuffer(NULL)
+ , mDevice(device)
+ , mDeviceContext(deviceContext)
+ , mNumFaces(0)
+ , mNumVertices(0)
+ {}
+
+ ~GpuMesh()
+ {
+ Release();
+ }
+
+ void Release()
+ {
+ COMRelease(positionBuffer);
+ COMRelease(normalBuffer);
+ COMRelease(texcoordBuffer);
+ COMRelease(colorBuffer);
+ COMRelease(indexBuffer);
+ }
+
+ void Resize(int numVertices, int numFaces)
+ {
+ Release();
+
+ {
+ // vertex buffers
+ D3D11_BUFFER_DESC bufDesc;
+ bufDesc.ByteWidth = sizeof(Vec3)*numVertices;
+ bufDesc.Usage = D3D11_USAGE_DYNAMIC;
+ bufDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
+ bufDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ bufDesc.MiscFlags = 0;
+
+ mDevice->CreateBuffer(&bufDesc, NULL, &positionBuffer);
+ mDevice->CreateBuffer(&bufDesc, NULL, &normalBuffer);
+
+ bufDesc.ByteWidth = sizeof(Vec2)*numVertices;
+ mDevice->CreateBuffer(&bufDesc, NULL, &texcoordBuffer);
+
+ bufDesc.ByteWidth = sizeof(Vec4)*numVertices;
+ mDevice->CreateBuffer(&bufDesc, NULL, &colorBuffer);
+ }
+
+ {
+ // index buffer
+ D3D11_BUFFER_DESC bufDesc;
+ bufDesc.ByteWidth = sizeof(int)*numFaces*3;
+ bufDesc.Usage = D3D11_USAGE_DYNAMIC;
+ bufDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
+ bufDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
+ bufDesc.MiscFlags = 0;
+
+ mDevice->CreateBuffer(&bufDesc, NULL, &indexBuffer);
+ }
+
+ mMaxVertices = numVertices;
+ mMaxFaces = numFaces;
+ }
+
+ void UpdateData(const Vec3* positions, const Vec3* normals, const Vec2* texcoords, const Vec4* colors, const int* indices, int numVertices, int numFaces)
+ {
+ if (numVertices > mMaxVertices || numFaces > mMaxFaces)
+ {
+ Resize(numVertices, numFaces);
+ }
+
+ D3D11_MAPPED_SUBRESOURCE res;
+
+ // vertices
+ if (positions)
+ {
+ mDeviceContext->Map(positionBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, positions, sizeof(Vec3)*numVertices);
+ mDeviceContext->Unmap(positionBuffer, 0);
+ }
+
+ if (normals)
+ {
+ mDeviceContext->Map(normalBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, normals, sizeof(Vec3)*numVertices);
+ mDeviceContext->Unmap(normalBuffer, 0);
+ }
+
+ if (texcoords)
+ {
+ mDeviceContext->Map(texcoordBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, texcoords, sizeof(Vec2)*numVertices);
+ mDeviceContext->Unmap(texcoordBuffer, 0);
+ }
+
+ if (colors)
+ {
+ mDeviceContext->Map(colorBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, colors, sizeof(Vec4)*numVertices);
+ mDeviceContext->Unmap(colorBuffer, 0);
+ }
+
+ // indices
+ if (indices)
+ {
+ mDeviceContext->Map(indexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, indices, sizeof(int)*numFaces*3);
+ mDeviceContext->Unmap(indexBuffer, 0);
+ }
+
+ mNumVertices = numVertices;
+ mNumFaces = numFaces;
+ }
+
+ // duplicate method to handle conversion from vec4 to vec3 positions / normals
+ void UpdateData(const Vec4* positions, const Vec4* normals, const Vec2* texcoords, const Vec4* colors, const int* indices, int numVertices, int numFaces)
+ {
+ if (numVertices > mMaxVertices || numFaces > mMaxFaces)
+ {
+ Resize(numVertices, numFaces);
+ }
+
+ D3D11_MAPPED_SUBRESOURCE res;
+
+ // vertices
+ if (positions)
+ {
+ mDeviceContext->Map(positionBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ for (int i=0; i < numVertices; ++i)
+ ((Vec3*)res.pData)[i] = Vec3(positions[i]);
+ mDeviceContext->Unmap(positionBuffer, 0);
+ }
+
+ if (normals)
+ {
+ mDeviceContext->Map(normalBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ for (int i=0; i < numVertices; ++i)
+ ((Vec3*)res.pData)[i] = Vec3(normals[i]);
+ mDeviceContext->Unmap(normalBuffer, 0);
+ }
+
+ if (texcoords)
+ {
+ mDeviceContext->Map(texcoordBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, texcoords, sizeof(Vec2)*numVertices);
+ mDeviceContext->Unmap(texcoordBuffer, 0);
+ }
+
+ if (colors)
+ {
+ mDeviceContext->Map(colorBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, colors, sizeof(Vec4)*numVertices);
+ mDeviceContext->Unmap(colorBuffer, 0);
+ }
+
+ // indices
+ if (indices)
+ {
+ mDeviceContext->Map(indexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &res);
+ memcpy(res.pData, indices, sizeof(int)*numFaces*3);
+ mDeviceContext->Unmap(indexBuffer, 0);
+ }
+
+ mNumVertices = numVertices;
+ mNumFaces = numFaces;
+ }
+
+ int mNumVertices = 0;
+ int mNumFaces = 0;
+
+ int mMaxVertices = 0;
+ int mMaxFaces = 0;
+
+ ID3D11Device* mDevice;
+ ID3D11DeviceContext* mDeviceContext;
+};
+
+
+
+enum MeshRenderMode
+{
+ MESH_RENDER_WIREFRAME,
+ MESH_RENDER_SOLID,
+ NUM_MESH_RENDER_MODES
+};
+
+enum MeshCullMode
+{
+ MESH_CULL_NONE,
+ MESH_CULL_FRONT,
+ MESH_CULL_BACK,
+ NUM_MESH_CULL_MODES
+};
+
+enum MeshDrawStage
+{
+ MESH_DRAW_NULL,
+ MESH_DRAW_SHADOW,
+ MESH_DRAW_REFLECTION,
+ MESH_DRAW_LIGHT
+};
+
+typedef DirectX::XMFLOAT3 float3;
+typedef DirectX::XMFLOAT4 float4;
+typedef DirectX::XMFLOAT4X4 float4x4;
+
+struct MeshDrawParams
+{
+ MeshRenderMode renderMode;
+ MeshCullMode cullMode;
+ MeshDrawStage renderStage;
+
+ DirectX::XMMATRIX projection;
+ DirectX::XMMATRIX view;
+ DirectX::XMMATRIX model;
+
+ float4x4 objectTransform;
+
+ DirectX::XMMATRIX lightTransform;
+ float3 lightPos;
+ float3 lightDir;
+
+ float4 clipPlane;
+ float4 fogColor;
+ float4 color;
+ float4 secondaryColor;
+
+ float bias;
+ float expand;
+ float spotMin;
+ float spotMax;
+
+ int grid;
+ int tex;
+ int colorArray;
+
+ float4 shadowTaps[12];
+ ShadowMap* shadowMap;
+};
+
+struct MeshRenderer
+{
+ ID3D11Device* m_device = nullptr;
+ ID3D11DeviceContext* m_deviceContext = nullptr;
+
+ ID3D11InputLayout* m_inputLayout = nullptr;
+ ID3D11VertexShader* m_meshVS = nullptr;
+ ID3D11PixelShader* m_meshPS = nullptr;
+ ID3D11PixelShader* m_meshPS_Shadow = nullptr;
+ ID3D11Buffer* m_constantBuffer = nullptr;
+ ID3D11RasterizerState* m_rasterizerStateRH[NUM_MESH_RENDER_MODES][NUM_MESH_CULL_MODES];
+
+ ~MeshRenderer()
+ {
+ Destroy();
+ }
+
+ void Init(ID3D11Device* device, ID3D11DeviceContext* context);
+ void Destroy();
+
+ void Draw(const GpuMesh* mesh, const MeshDrawParams* params);
+
+};
+
+
+