Skip to content

Commit 4d2b077

Browse files
committed
[render] IndexBuffer class, used for triangle indices
1 parent a3c635c commit 4d2b077

File tree

3 files changed

+124
-11
lines changed

3 files changed

+124
-11
lines changed

vclib/render/include/vclib/bgfx/buffers.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
#ifndef VCL_BGFX_BUFFERS_H
2424
#define VCL_BGFX_BUFFERS_H
2525

26+
#include "buffers/index_buffer.h"
2627
#include "buffers/vertex_buffer.h"
2728

2829
#endif // VCL_BGFX_BUFFERS_H
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
/*****************************************************************************
2+
* VCLib *
3+
* Visual Computing Library *
4+
* *
5+
* Copyright(C) 2021-2025 *
6+
* Visual Computing Lab *
7+
* ISTI - Italian National Research Council *
8+
* *
9+
* All rights reserved. *
10+
* *
11+
* This program is free software; you can redistribute it and/or modify *
12+
* it under the terms of the Mozilla Public License Version 2.0 as published *
13+
* by the Mozilla Foundation; either version 2 of the License, or *
14+
* (at your option) any later version. *
15+
* *
16+
* This program is distributed in the hope that it will be useful, *
17+
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
18+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
19+
* Mozilla Public License Version 2.0 *
20+
* (https://www.mozilla.org/en-US/MPL/2.0/) for more details. *
21+
****************************************************************************/
22+
23+
#ifndef VCL_BGFX_BUFFERS_INDEX_BUFFER_H
24+
#define VCL_BGFX_BUFFERS_INDEX_BUFFER_H
25+
26+
#include <vclib/types.h>
27+
28+
#include <bgfx/bgfx.h>
29+
30+
#include <utility>
31+
32+
namespace vcl {
33+
34+
class IndexBuffer
35+
{
36+
bgfx::IndexBufferHandle mIndexBufferHandle = BGFX_INVALID_HANDLE;
37+
38+
public:
39+
IndexBuffer() = default;
40+
41+
IndexBuffer(const IndexBuffer& other) = delete;
42+
43+
IndexBuffer(IndexBuffer&& other) noexcept
44+
{
45+
mIndexBufferHandle = other.mIndexBufferHandle;
46+
other.mIndexBufferHandle = BGFX_INVALID_HANDLE;
47+
}
48+
49+
~IndexBuffer()
50+
{
51+
if (bgfx::isValid(mIndexBufferHandle))
52+
bgfx::destroy(mIndexBufferHandle);
53+
}
54+
55+
IndexBuffer& operator=(const IndexBuffer& other) = delete;
56+
57+
IndexBuffer& operator=(IndexBuffer&& other) noexcept
58+
{
59+
mIndexBufferHandle = other.mIndexBufferHandle;
60+
other.mIndexBufferHandle = BGFX_INVALID_HANDLE;
61+
return *this;
62+
}
63+
64+
void swap(IndexBuffer& other)
65+
{
66+
using std::swap;
67+
swap(mIndexBufferHandle, other.mIndexBufferHandle);
68+
}
69+
70+
friend void swap(IndexBuffer& a, IndexBuffer& b) { a.swap(b); }
71+
72+
void set(
73+
const void* bufferIndices,
74+
const uint bufferSize,
75+
PrimitiveType type,
76+
uint64_t flags = BGFX_BUFFER_NONE)
77+
{
78+
flags |= flagsForType(type);
79+
set(bgfx::makeRef(bufferIndices, bufferSize * sizeOf(type)), flags);
80+
}
81+
82+
void set(const bgfx::Memory* indices, uint64_t flags = BGFX_BUFFER_NONE)
83+
{
84+
mIndexBufferHandle = bgfx::createIndexBuffer(indices, flags);
85+
}
86+
87+
void bind() const
88+
{
89+
bgfx::setIndexBuffer(mIndexBufferHandle);
90+
}
91+
92+
void bindForCompute(
93+
uint8_t stage,
94+
bgfx::Access::Enum access = bgfx::Access::Read)
95+
{
96+
bgfx::setBuffer(stage, mIndexBufferHandle, access);
97+
}
98+
99+
private:
100+
static uint64_t flagsForType(PrimitiveType type)
101+
{
102+
switch (type) {
103+
case PrimitiveType::INT:
104+
case PrimitiveType::UINT: return BGFX_BUFFER_INDEX32;
105+
case PrimitiveType::FLOAT:
106+
return BGFX_BUFFER_COMPUTE_FORMAT_32X1 |
107+
BGFX_BUFFER_COMPUTE_TYPE_FLOAT;
108+
case PrimitiveType::DOUBLE: assert(0); // not supported
109+
default: return BGFX_BUFFER_NONE;
110+
}
111+
}
112+
};
113+
114+
} // namespace vcl
115+
116+
#endif // VCL_BGFX_BUFFERS_INDEX_BUFFER_H

vclib/render/include/vclib/bgfx/drawable/mesh/mesh_render_buffers.h

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ class MeshRenderBuffers : public vcl::MeshRenderData<MeshType>
4343
VertexBuffer mVertexUVBuffer;
4444
VertexBuffer mVertexWedgeUVBuffer;
4545

46-
bgfx::IndexBufferHandle mTriangleIndexBH = BGFX_INVALID_HANDLE;
46+
IndexBuffer mTriangleIndexBuffer;
4747
bgfx::IndexBufferHandle mTriangleNormalBH = BGFX_INVALID_HANDLE;
4848
bgfx::IndexBufferHandle mTriangleColorBH = BGFX_INVALID_HANDLE;
4949

@@ -91,7 +91,7 @@ class MeshRenderBuffers : public vcl::MeshRenderData<MeshType>
9191
swap(mVertexColorsBuffer, other.mVertexColorsBuffer);
9292
swap(mVertexUVBuffer, other.mVertexUVBuffer);
9393
swap(mVertexWedgeUVBuffer, other.mVertexWedgeUVBuffer);
94-
swap(mTriangleIndexBH, other.mTriangleIndexBH);
94+
swap(mTriangleIndexBuffer, other.mTriangleIndexBuffer);
9595
swap(mTriangleNormalBH, other.mTriangleNormalBH);
9696
swap(mTriangleColorBH, other.mTriangleColorBH);
9797
swap(mTriangleTextureIndexBH, other.mTriangleTextureIndexBH);
@@ -130,7 +130,7 @@ class MeshRenderBuffers : public vcl::MeshRenderData<MeshType>
130130
void bindIndexBuffers(uint indexBufferToBind = Base::TRIANGLES) const
131131
{
132132
if (indexBufferToBind == Base::TRIANGLES) {
133-
bgfx::setIndexBuffer(mTriangleIndexBH);
133+
mTriangleIndexBuffer.bind();
134134

135135
if (bgfx::isValid(mTriangleColorBH)) { // triangle colors
136136
bgfx::setBuffer(
@@ -226,11 +226,10 @@ class MeshRenderBuffers : public vcl::MeshRenderData<MeshType>
226226

227227
// triangle index buffer
228228
if (Base::triangleBufferData()) {
229-
mTriangleIndexBH = bgfx::createIndexBuffer(
230-
bgfx::makeRef(
231-
Base::triangleBufferData(),
232-
Base::triangleBufferSize() * sizeof(uint32_t)),
233-
BGFX_BUFFER_INDEX32);
229+
mTriangleIndexBuffer.set(
230+
Base::triangleBufferData(),
231+
Base::triangleBufferSize(),
232+
PrimitiveType::UINT);
234233
}
235234

236235
// triangle normal buffer
@@ -330,9 +329,6 @@ class MeshRenderBuffers : public vcl::MeshRenderData<MeshType>
330329

331330
void destroyBGFXBuffers()
332331
{
333-
if (bgfx::isValid(mTriangleIndexBH))
334-
bgfx::destroy(mTriangleIndexBH);
335-
336332
if (bgfx::isValid(mTriangleNormalBH))
337333
bgfx::destroy(mTriangleNormalBH);
338334

0 commit comments

Comments
 (0)