69 std::vector<std::unique_ptr<TextureUnit>> mTextureUnits;
100 swap(mVertexCoordsBuffer,
other.mVertexCoordsBuffer);
101 swap(mVertexNormalsBuffer,
other.mVertexNormalsBuffer);
102 swap(mVertexColorsBuffer,
other.mVertexColorsBuffer);
103 swap(mVertexUVBuffer,
other.mVertexUVBuffer);
104 swap(mVertexWedgeUVBuffer,
other.mVertexWedgeUVBuffer);
105 swap(mTriangleIndexBuffer,
other.mTriangleIndexBuffer);
106 swap(mTriangleNormalBuffer,
other.mTriangleNormalBuffer);
107 swap(mTriangleColorBuffer,
other.mTriangleColorBuffer);
108 swap(mVertexTextureIndexBuffer,
other.mVertexTextureIndexBuffer);
109 swap(mWedgeTextureIndexBuffer,
other.mWedgeTextureIndexBuffer);
110 swap(mEdgeIndexBuffer,
other.mEdgeIndexBuffer);
111 swap(mEdgeNormalBuffer,
other.mEdgeNormalBuffer);
112 swap(mEdgeColorBuffer,
other.mEdgeColorBuffer);
113 swap(mWireframeIndexBuffer,
other.mWireframeIndexBuffer);
114 swap(mTextureUnits,
other.mTextureUnits);
115 swap(mMeshUniforms,
other.mMeshUniforms);
124 mVertexCoordsBuffer.
bind(0);
125 mVertexNormalsBuffer.
bind(1);
126 mVertexColorsBuffer.
bind(2);
128 if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_VERTEX_TEX)) {
129 mVertexUVBuffer.
bind(3);
131 else if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_WEDGE_TEX)) {
132 mVertexWedgeUVBuffer.
bind(3);
136 void bindIndexBuffers(
140 using enum MRI::Buffers;
143 mTriangleIndexBuffer.
bind();
145 mTriangleNormalBuffer.
bind(VCL_MRB_PRIMITIVE_NORMAL_BUFFER);
147 mTriangleColorBuffer.
bind(VCL_MRB_PRIMITIVE_COLOR_BUFFER);
149 if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_VERTEX_TEX)) {
150 mVertexTextureIndexBuffer.
bind(
151 VCL_MRB_TRIANGLE_TEXTURE_ID_BUFFER);
153 else if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_WEDGE_TEX)) {
154 mWedgeTextureIndexBuffer.
bind(
155 VCL_MRB_TRIANGLE_TEXTURE_ID_BUFFER);
159 mEdgeIndexBuffer.
bind();
161 mEdgeNormalBuffer.
bind(VCL_MRB_PRIMITIVE_NORMAL_BUFFER);
163 mEdgeColorBuffer.
bind(VCL_MRB_PRIMITIVE_COLOR_BUFFER);
166 mWireframeIndexBuffer.
bind();
170 void bindTextures()
const
172 uint i = VCL_MRB_TEXTURE0;
173 for (
const auto& ptr : mTextureUnits) {
179 void bindUniforms()
const { mMeshUniforms.bind(); }
182 void setVertexCoordsBuffer(
const MeshType& mesh)
184 uint nv = Base::numVerts();
189 Base::fillVertexCoords(mesh, buffer);
191 mVertexCoordsBuffer.
create(
194 bgfx::Attrib::Position,
196 PrimitiveType::FLOAT,
201 void setVertexNormalsBuffer(
const MeshType& mesh)
203 uint nv = Base::numVerts();
208 Base::fillVertexNormals(mesh, buffer);
210 mVertexNormalsBuffer.
create(
213 bgfx::Attrib::Normal,
215 PrimitiveType::FLOAT,
220 void setVertexColorsBuffer(
const MeshType& mesh)
222 uint nv = Base::numVerts();
226 Base::fillVertexColors(mesh, buffer, Color::Format::ABGR);
228 mVertexColorsBuffer.
create(
231 bgfx::Attrib::Color0,
233 PrimitiveType::UCHAR,
238 void setVertexTexCoordsBuffer(
const MeshType& mesh)
240 uint nv = Base::numVerts();
245 Base::fillVertexTexCoords(mesh, buffer);
250 bgfx::Attrib::TexCoord0,
252 PrimitiveType::FLOAT,
257 void setWedgeTexCoordsBuffer(
const MeshType& mesh)
259 uint nv = Base::numVerts();
264 Base::fillWedgeTexCoords(mesh, buffer);
266 mVertexWedgeUVBuffer.
create(
269 bgfx::Attrib::TexCoord1,
271 PrimitiveType::FLOAT,
276 void setTriangleIndicesBuffer(
const MeshType& mesh)
278 uint nt = Base::numTris();
282 Base::fillTriangleIndices(mesh, buffer);
287 void setTriangleNormalsBuffer(
const MeshType& mesh)
289 uint nt = Base::numTris();
294 Base::fillTriangleNormals(mesh, buffer);
299 PrimitiveType::FLOAT,
304 void setTriangleColorsBuffer(
const MeshType& mesh)
306 uint nt = Base::numTris();
310 Base::fillTriangleColors(mesh, buffer, Color::Format::ABGR);
313 buffer,
nt, PrimitiveType::UINT, bgfx::Access::Read,
releaseFn);
316 void setVertexTextureIndicesBuffer(
const MeshType& mesh)
318 uint nt = Base::numTris();
322 Base::fillVertexTextureIndices(mesh, buffer);
325 buffer,
nt, PrimitiveType::UINT, bgfx::Access::Read,
releaseFn);
328 void setWedgeTextureIndicesBuffer(
const MeshType& mesh)
330 uint nt = Base::numTris();
334 Base::fillWedgeTextureIndices(mesh, buffer);
337 buffer,
nt, PrimitiveType::UINT, bgfx::Access::Read,
releaseFn);
340 void setEdgeIndicesBuffer(
const MeshType& mesh)
342 uint ne = Base::numEdges();
346 Base::fillEdgeIndices(mesh, buffer);
348 mEdgeIndexBuffer.
create(buffer,
ne * 2);
351 void setEdgeNormalsBuffer(
const MeshType& mesh)
353 uint ne = Base::numEdges();
358 Base::fillEdgeNormals(mesh, buffer);
363 PrimitiveType::FLOAT,
368 void setEdgeColorsBuffer(
const MeshType& mesh)
370 uint ne = Base::numEdges();
374 Base::fillEdgeColors(mesh, buffer, Color::Format::ABGR);
377 buffer,
ne, PrimitiveType::UINT, bgfx::Access::Read,
releaseFn);
380 void setWireframeIndicesBuffer(
const MeshType& mesh)
382 const uint nw = Base::numWireframeLines();
386 Base::fillWireframeIndices(mesh, buffer);
391 void setTextureUnits(
const MeshType& mesh)
393 mTextureUnits.clear();
394 mTextureUnits.reserve(mesh.textureNumber());
395 for (
uint i = 0;
i < mesh.textureNumber(); ++
i) {
398 if (mesh.texture(
i).image().isNull()) {
402 txt = mesh.texture(
i).image();
419 auto tu = std::make_unique<TextureUnit>();
423 "s_tex" + std::to_string(
i),
427 mTextureUnits.push_back(std::move(
tu));
431 void setMeshUniforms(
const MeshType& mesh)
433 mMeshUniforms.update(mesh);
437 std::pair<T*, bgfx::ReleaseFn> getAllocatedBufferAndReleaseFn(
uint size)
439 T* buffer =
new T[size];
441 return std::make_pair(buffer, [](
void* ptr,
void*) {
442 delete[]
static_cast<T*
>(ptr);
void create(const void *bufferData, uint vertNum, bgfx::Attrib::Enum attrib, uint attribNumPerVertex, PrimitiveType attribType, bool normalize=false, bgfx::ReleaseFn releaseFn=nullptr)
Creates the vertex buffer and sets the data for rendering.
Definition vertex_buffer.h:106
Concept that checks if a Mesh has the TextureImages component.
Definition per_mesh.h:103