60 mutable bool mVertexQuadBufferGenerated =
false;
77 std::vector<std::unique_ptr<TextureUnit>> mTextureUnits;
108 swap(mVertexPositionsBuffer,
other.mVertexPositionsBuffer);
109 swap(mVertexNormalsBuffer,
other.mVertexNormalsBuffer);
110 swap(mVertexColorsBuffer,
other.mVertexColorsBuffer);
111 swap(mVertexUVBuffer,
other.mVertexUVBuffer);
112 swap(mVertexWedgeUVBuffer,
other.mVertexWedgeUVBuffer);
113 swap(mVertexQuadIndexBuffer,
other.mVertexQuadIndexBuffer);
114 swap(mVertexQuadBuffer,
other.mVertexQuadBuffer);
115 swap(mVertexQuadBufferGenerated,
other.mVertexQuadBufferGenerated);
116 swap(mTriangleIndexBuffer,
other.mTriangleIndexBuffer);
117 swap(mTriangleNormalBuffer,
other.mTriangleNormalBuffer);
118 swap(mTriangleColorBuffer,
other.mTriangleColorBuffer);
119 swap(mVertexTextureIndexBuffer,
other.mVertexTextureIndexBuffer);
120 swap(mWedgeTextureIndexBuffer,
other.mWedgeTextureIndexBuffer);
121 swap(mEdgeIndexBuffer,
other.mEdgeIndexBuffer);
122 swap(mEdgeNormalBuffer,
other.mEdgeNormalBuffer);
123 swap(mEdgeColorBuffer,
other.mEdgeColorBuffer);
124 swap(mWireframeIndexBuffer,
other.mWireframeIndexBuffer);
125 swap(mTextureUnits,
other.mTextureUnits);
126 swap(mMeshUniforms,
other.mMeshUniforms);
134 mVertexPositionsBuffer.bindVertex(VCL_MRB_VERTEX_POSITION_STREAM);
135 mVertexNormalsBuffer.bindVertex(VCL_MRB_VERTEX_NORMAL_STREAM);
136 mVertexColorsBuffer.bindVertex(VCL_MRB_VERTEX_COLOR_STREAM);
138 if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_VERTEX_TEX)) {
139 mVertexUVBuffer.
bind(VCL_MRB_VERTEX_TEXCOORD_STREAM);
141 else if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_WEDGE_TEX)) {
142 mVertexWedgeUVBuffer.
bind(VCL_MRB_VERTEX_TEXCOORD_STREAM);
147 void computeQuadVertexBuffers(
149 const bgfx::ViewId viewId)
const
151 if (!mVertexQuadBuffer.isValid() || mVertexQuadBufferGenerated) {
157 VCL_MRB_VERTEX_POSITION_STREAM, bgfx::Access::Read);
159 VCL_MRB_VERTEX_NORMAL_STREAM, bgfx::Access::Read);
161 VCL_MRB_VERTEX_COLOR_STREAM, bgfx::Access::Read);
163 mVertexQuadBuffer.
bindCompute(4, bgfx::Access::Write);
168 pm.getComputeProgram<ComputeProgram::DRAWABLE_MESH_POINTS>(),
173 mVertexQuadBufferGenerated =
true;
177 void bindVertexQuadBuffer()
const
179 mVertexQuadBuffer.
bind(VCL_MRB_VERTEX_POSITION_STREAM);
180 mVertexQuadIndexBuffer.
bind();
183 void bindIndexBuffers(
187 using enum MRI::Buffers;
190 mTriangleIndexBuffer.
bind();
192 mTriangleNormalBuffer.
bind(VCL_MRB_PRIMITIVE_NORMAL_BUFFER);
194 mTriangleColorBuffer.
bind(VCL_MRB_PRIMITIVE_COLOR_BUFFER);
196 if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_VERTEX_TEX)) {
197 mVertexTextureIndexBuffer.
bind(
198 VCL_MRB_TRIANGLE_TEXTURE_ID_BUFFER);
200 else if (
mrs.isSurface(MeshRenderInfo::Surface::COLOR_WEDGE_TEX)) {
201 mWedgeTextureIndexBuffer.
bind(
202 VCL_MRB_TRIANGLE_TEXTURE_ID_BUFFER);
206 mEdgeIndexBuffer.
bind();
208 mEdgeNormalBuffer.
bind(VCL_MRB_PRIMITIVE_NORMAL_BUFFER);
210 mEdgeColorBuffer.
bind(VCL_MRB_PRIMITIVE_COLOR_BUFFER);
213 mWireframeIndexBuffer.
bind();
217 void bindTextures()
const
219 uint i = VCL_MRB_TEXTURE0;
220 for (
const auto& ptr : mTextureUnits) {
226 void bindUniforms()
const { mMeshUniforms.bind(); }
229 void setVertexPositionsBuffer(
const MeshType& mesh)
231 uint nv = Base::numVerts();
236 Base::fillVertexPositions(mesh, buffer);
241 bgfx::Attrib::Position,
243 PrimitiveType::FLOAT,
252 bgfx::VertexLayout
layout;
254 .
add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float)
255 .
add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8,
true)
256 .
add(bgfx::Attrib::Normal, 3, bgfx::AttribType::Float)
257 .
add(bgfx::Attrib::TexCoord0, 1, bgfx::AttribType::Float)
268 mVertexQuadBufferGenerated =
false;
285 Base::fillVertexQuadIndices(mesh, buffer);
293 void setVertexNormalsBuffer(
const MeshType& mesh)
295 uint
nv = Base::numVerts();
300 Base::fillVertexNormals(mesh, buffer);
305 bgfx::Attrib::Normal,
307 PrimitiveType::FLOAT,
313 void setVertexColorsBuffer(
const MeshType& mesh)
315 uint nv = Base::numVerts();
317 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(nv);
319 Base::fillVertexColors(mesh, buffer, Color::Format::ABGR);
324 bgfx::Attrib::Color0,
326 PrimitiveType::UCHAR,
332 void setVertexTexCoordsBuffer(
const MeshType& mesh)
334 uint nv = Base::numVerts();
336 auto [buffer, releaseFn] =
337 getAllocatedBufferAndReleaseFn<float>(nv * 2);
339 Base::fillVertexTexCoords(mesh, buffer);
344 bgfx::Attrib::TexCoord0,
346 PrimitiveType::FLOAT,
351 void setWedgeTexCoordsBuffer(
const MeshType& mesh)
353 uint nv = Base::numVerts();
355 auto [buffer, releaseFn] =
356 getAllocatedBufferAndReleaseFn<float>(nv * 2);
358 Base::fillWedgeTexCoords(mesh, buffer);
360 mVertexWedgeUVBuffer.
create(
363 bgfx::Attrib::TexCoord1,
365 PrimitiveType::FLOAT,
370 void setTriangleIndicesBuffer(
const MeshType& mesh)
372 uint nt = Base::numTris();
374 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(nt * 3);
376 Base::fillTriangleIndices(mesh, buffer);
378 mTriangleIndexBuffer.
create(buffer, nt * 3,
true, releaseFn);
381 void setTriangleNormalsBuffer(
const MeshType& mesh)
383 uint nt = Base::numTris();
385 auto [buffer, releaseFn] =
386 getAllocatedBufferAndReleaseFn<float>(nt * 3);
388 Base::fillTriangleNormals(mesh, buffer);
393 PrimitiveType::FLOAT,
398 void setTriangleColorsBuffer(
const MeshType& mesh)
400 uint nt = Base::numTris();
402 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(nt);
404 Base::fillTriangleColors(mesh, buffer, Color::Format::ABGR);
407 buffer, nt, PrimitiveType::UINT, bgfx::Access::Read, releaseFn);
410 void setVertexTextureIndicesBuffer(
const MeshType& mesh)
412 uint nt = Base::numTris();
414 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(nt);
416 Base::fillVertexTextureIndices(mesh, buffer);
419 buffer, nt, PrimitiveType::UINT, bgfx::Access::Read, releaseFn);
422 void setWedgeTextureIndicesBuffer(
const MeshType& mesh)
424 uint nt = Base::numTris();
426 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(nt);
428 Base::fillWedgeTextureIndices(mesh, buffer);
431 buffer, nt, PrimitiveType::UINT, bgfx::Access::Read, releaseFn);
434 void setEdgeIndicesBuffer(
const MeshType& mesh)
436 uint ne = Base::numEdges();
438 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(ne * 2);
440 Base::fillEdgeIndices(mesh, buffer);
442 mEdgeIndexBuffer.
create(buffer, ne * 2);
445 void setEdgeNormalsBuffer(
const MeshType& mesh)
447 uint ne = Base::numEdges();
449 auto [buffer, releaseFn] =
450 getAllocatedBufferAndReleaseFn<float>(ne * 3);
452 Base::fillEdgeNormals(mesh, buffer);
457 PrimitiveType::FLOAT,
462 void setEdgeColorsBuffer(
const MeshType& mesh)
464 uint ne = Base::numEdges();
466 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(ne);
468 Base::fillEdgeColors(mesh, buffer, Color::Format::ABGR);
471 buffer, ne, PrimitiveType::UINT, bgfx::Access::Read, releaseFn);
474 void setWireframeIndicesBuffer(
const MeshType& mesh)
476 const uint nw = Base::numWireframeLines();
478 auto [buffer, releaseFn] = getAllocatedBufferAndReleaseFn<uint>(nw * 2);
480 Base::fillWireframeIndices(mesh, buffer);
482 mWireframeIndexBuffer.
create(buffer, nw * 2,
true, releaseFn);
485 void setTextureUnits(
const MeshType& mesh)
487 mTextureUnits.clear();
488 mTextureUnits.reserve(mesh.textureNumber());
489 for (uint i = 0; i < mesh.textureNumber(); ++i) {
492 if (mesh.texture(i).image().isNull()) {
493 txt = vcl::loadImage(
494 mesh.meshBasePath() + mesh.texturePath(i));
497 txt = mesh.texture(i).image();
501 txt = vcl::loadImage(mesh.meshBasePath() + mesh.texturePath(i));
509 const uint size = txt.width() * txt.height();
512 auto [buffer, releaseFn] =
513 getAllocatedBufferAndReleaseFn<uint>(size);
515 const uint* tdata =
reinterpret_cast<const uint*
>(txt.data());
517 std::copy(tdata, tdata + size, buffer);
519 auto tu = std::make_unique<TextureUnit>();
523 "s_tex" + std::to_string(i),
527 mTextureUnits.push_back(std::move(tu));
531 void setMeshUniforms(
const MeshType& mesh)
533 mMeshUniforms.update(mesh);
537 std::pair<T*, bgfx::ReleaseFn> getAllocatedBufferAndReleaseFn(uint size)
539 T* buffer =
new T[size];
541 return std::make_pair(buffer, [](
void* ptr,
void*) {
542 delete[]
static_cast<T*
>(ptr);
static Context & instance(void *windowHandle=nullptr, void *displayHandle=nullptr)
Return the context instance.
Definition context.cpp:371