-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathColoredIndexedTriangleList.cpp
More file actions
71 lines (61 loc) · 2.37 KB
/
ColoredIndexedTriangleList.cpp
File metadata and controls
71 lines (61 loc) · 2.37 KB
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
#include "context.h"
#include "ColoredIndexedTriangleList.h"
#include "shaders/common/bindings.h"
ColoredIndexedTriangleList::ColoredIndexedTriangleList(const glm::mat4x4& model, const std::vector<Vertex>& vertices, const std::vector<unsigned>& indices, const Material& material) : Geometry(model)
{
m_material = material;
std::vector<glm::vec3> positions(vertices.size());
std::vector<glm::vec3> norms(vertices.size());
for (size_t i = 0; i < vertices.size(); i++)
{
positions[i] = vertices[i].Position;
norms[i] = vertices[i].Normal;
}
m_vertexBuffer = new DeviceBuffer(sizeof(glm::vec3)* vertices.size(), VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR);
m_vertexBuffer->upload(norms.data());
m_indexBuffer = new DeviceBuffer(sizeof(unsigned)*indices.size(), VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR);
m_indexBuffer->upload(indices.data());
DeviceBuffer posBuf(sizeof(glm::vec3)* vertices.size(), VK_BUFFER_USAGE_SHADER_DEVICE_ADDRESS_BIT | VK_BUFFER_USAGE_ACCELERATION_STRUCTURE_BUILD_INPUT_READ_ONLY_BIT_KHR);
posBuf.upload(positions.data());
_blas_create_indexed_triangles(&posBuf, m_indexBuffer);
}
ColoredIndexedTriangleList::~ColoredIndexedTriangleList()
{
delete m_indexBuffer;
delete m_vertexBuffer;
}
struct TriangleMeshView
{
glm::mat3x4 normalMat;
glm::vec4 color;
VkDeviceAddress vertexBuf;
VkDeviceAddress indexBuf;
MaterialType type;
float fuzz;
float ref_idx;
float density;
};
GeoCls ColoredIndexedTriangleList::cls() const
{
static const char s_name[] = "ColoredIndexedTriangleList";
static const char s_fn_rchit[] = "geometry/closesthit_colored_indexed_triangle_lists.spv";
GeoCls cls = {};
cls.name = s_name;
cls.size_view = sizeof(TriangleMeshView);
cls.binding_view = BINDING_ColoredIndexedTriangleList;
cls.fn_intersection = nullptr;
cls.fn_closesthit = s_fn_rchit;
return cls;
}
void ColoredIndexedTriangleList::get_view(void* view_buf) const
{
TriangleMeshView& view = *(TriangleMeshView*)view_buf;
view.normalMat = m_norm_mat;
view.color = { m_material.color, 1.0f };
view.vertexBuf = m_vertexBuffer->get_device_address();
view.indexBuf = m_indexBuffer->get_device_address();
view.type = m_material.type;
view.fuzz = m_material.fuzz;
view.ref_idx = m_material.ref_idx;
view.density = m_material.density;
}