aboutsummaryrefslogtreecommitdiff
path: root/NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp
diff options
context:
space:
mode:
authorMarijn Tamis <[email protected]>2018-05-03 18:22:48 +0200
committerMarijn Tamis <[email protected]>2018-05-03 18:22:48 +0200
commitca32c59a58d37c1822e185a2d5f3d0d3e8943593 (patch)
treeb06b9eec03f34344ef8fc31aa147b2714d3962ee /NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp
parentForced rename of platform folders in cmake dir. Git didn't pick this up before. (diff)
downloadnvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.tar.xz
nvcloth-ca32c59a58d37c1822e185a2d5f3d0d3e8943593.zip
NvCloth 1.1.4 Release. (24070740)
Diffstat (limited to 'NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp')
-rw-r--r--NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp58
1 files changed, 49 insertions, 9 deletions
diff --git a/NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp b/NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp
index 8dfbbb6..c634921 100644
--- a/NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp
+++ b/NvCloth/samples/SampleBase/renderer/CustomRenderMesh.cpp
@@ -9,7 +9,7 @@
*/
#include "CustomRenderMesh.h"
-
+#include <assert.h>
CustomRenderMesh::CustomRenderMesh()
: m_indexBuffer(nullptr)
@@ -17,14 +17,14 @@ CustomRenderMesh::CustomRenderMesh()
}
CustomRenderMesh::CustomRenderMesh(const void* vertices, uint32_t numVertices, uint32_t vertexSize,
- std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces, uint32_t numFaces)
+ std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces, uint32_t numFaces, int flags)
: m_indexBuffer(nullptr)
{
- initialize(vertices, numVertices, vertexSize, inputDesc, faces, numFaces);
+ initialize(vertices, numVertices, vertexSize, inputDesc, faces, numFaces, flags);
}
void CustomRenderMesh::initialize(const void* vertices, uint32_t numVertices, uint32_t vertexSize,
- std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces, uint32_t numFaces)
+ std::vector<D3D11_INPUT_ELEMENT_DESC>& inputDesc, const uint16_t* faces, uint32_t numFaces, int flags)
{
ID3D11Device* device = GetDeviceManager()->GetDevice();
@@ -32,6 +32,8 @@ void CustomRenderMesh::initialize(const void* vertices, uint32_t numVertices, ui
m_numVertices = numVertices;
m_vertexSize = vertexSize;
m_numFaces = numFaces;
+ m_vertexCapacity = max(1,numVertices);
+ m_indexCapacity = max(1,numFaces);
// VB
{
@@ -40,16 +42,26 @@ void CustomRenderMesh::initialize(const void* vertices, uint32_t numVertices, ui
ZeroMemory(&vertexBufferData, sizeof(vertexBufferData));
vertexBufferData.pSysMem = vertices;
+ void* backupBuffer = nullptr;
+ if(vertices == nullptr)
+ {
+ void* backupBuffer = malloc(vertexSize * m_vertexCapacity);
+ vertexBufferData.pSysMem = backupBuffer;
+ }
+
D3D11_BUFFER_DESC bufferDesc;
memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC));
bufferDesc.BindFlags = D3D11_BIND_VERTEX_BUFFER;
- bufferDesc.ByteWidth = vertexSize * numVertices;
- bufferDesc.CPUAccessFlags = 0;
+ bufferDesc.ByteWidth = vertexSize * m_vertexCapacity;
+ bufferDesc.CPUAccessFlags = (flags&DYNAMIC_VERTEX_BUFFER) ? D3D11_CPU_ACCESS_WRITE : 0;
bufferDesc.MiscFlags = 0;
- bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
+ bufferDesc.Usage = (flags&DYNAMIC_VERTEX_BUFFER) ? D3D11_USAGE_DYNAMIC : D3D11_USAGE_IMMUTABLE;
V(device->CreateBuffer(&bufferDesc, &vertexBufferData, &m_vertexBuffer));
+
+ if(vertices = nullptr)
+ free(backupBuffer);
}
// IB
@@ -60,16 +72,26 @@ void CustomRenderMesh::initialize(const void* vertices, uint32_t numVertices, ui
ZeroMemory(&indexBufferData, sizeof(indexBufferData));
indexBufferData.pSysMem = faces;
+ void* backupBuffer = nullptr;
+ if(faces == nullptr)
+ {
+ void* backupBuffer = malloc(sizeof(uint16_t) * m_indexCapacity);
+ indexBufferData.pSysMem = backupBuffer;
+ }
+
D3D11_BUFFER_DESC bufferDesc;
memset(&bufferDesc, 0, sizeof(D3D11_BUFFER_DESC));
bufferDesc.BindFlags = D3D11_BIND_INDEX_BUFFER;
- bufferDesc.ByteWidth = sizeof(uint16_t) * numFaces;
+ bufferDesc.ByteWidth = sizeof(uint16_t) * m_indexCapacity;
bufferDesc.CPUAccessFlags = 0;
bufferDesc.MiscFlags = 0;
bufferDesc.Usage = D3D11_USAGE_IMMUTABLE;
V(device->CreateBuffer(&bufferDesc, &indexBufferData, &m_indexBuffer));
+
+ if(faces = nullptr)
+ free(backupBuffer);
}
}
@@ -79,8 +101,26 @@ CustomRenderMesh::~CustomRenderMesh()
SAFE_RELEASE(m_indexBuffer);
}
+void CustomRenderMesh::updateVertices(const void* vertices, uint32_t numVertices, uint32_t vertexSize)
+{
+ assert(numVertices <= m_vertexCapacity);
+ assert(vertexSize == m_vertexSize);
+ ID3D11Device* device = GetDeviceManager()->GetDevice();
+ ID3D11DeviceContext* context;
+ device->GetImmediateContext(&context);
+
+ D3D11_MAPPED_SUBRESOURCE mappedResource;
+ ZeroMemory(&mappedResource, sizeof(D3D11_MAPPED_SUBRESOURCE));
+
+ context->Map(m_vertexBuffer, 0, D3D11_MAP_WRITE_DISCARD, 0, &mappedResource);
+ // Update the vertex buffer here.
+ memcpy(mappedResource.pData, vertices, vertexSize*numVertices);
+ // Reenable GPU access to the vertex buffer data.
+ context->Unmap(m_vertexBuffer, 0);
+}
+
-void CustomRenderMesh::render(ID3D11DeviceContext& context) const
+void CustomRenderMesh::render(ID3D11DeviceContext& context, int submesh) const
{
context.IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);