42 enum class SurfaceProgramsType {
56 SurfaceProgramsType mSurfaceProgramType = SurfaceProgramsType::UBER;
83 mMeshRenderSettingsUniforms.updateSettings(mMRS);
100 AbstractDrawableMesh::swap(
other);
101 MeshType::swap(
other);
102 swap(mMRB,
other.mMRB);
103 swap(mMeshRenderSettingsUniforms,
other.mMeshRenderSettingsUniforms);
111 void setSurfaceProgramType(SurfaceProgramsType type)
113 if (type != mSurfaceProgramType) {
114 std::cerr <<
"Program Type changed: ";
116 case SurfaceProgramsType::UBER: std::cerr <<
"UBER\n";
break;
117 case SurfaceProgramsType::SPLIT: std::cerr <<
"SPLITTED\n";
break;
118 case SurfaceProgramsType::UBER_WITH_STATIC_IF:
119 std::cerr <<
"UBER_WITH_STATIC_IF\n";
122 mSurfaceProgramType = type;
135 AbstractDrawableMesh::computeBoundingBox(
136 static_cast<const MeshType&
>(*
this));
139 mMRS.setRenderCapabilityFrom(*
this);
140 setRenderSettings(mMRS);
145 AbstractDrawableMesh::setRenderSettings(
rs);
146 mMeshRenderSettingsUniforms.updateSettings(
rs);
147 mMRB.updateEdgeSettings(
rs);
148 mMRB.updateWireframeSettings(
rs);
151 uint vertexNumber()
const override {
return MeshType::vertexNumber(); }
153 uint faceNumber()
const override
156 return MeshType::faceNumber();
161 uint edgeNumber()
const override
164 return MeshType::edgeNumber();
172 return MeshType::transformMatrix().template
cast<double>();
182 return MeshType::materials();
189 const Image& textureImage(
const std::string& path)
const override
192 return MeshType::textureImage(path);
195 return AbstractDrawableMesh::textureImage(path);
205 using enum VertFragProgram;
218 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
219 for (uint
i = 0;
i < mMRB.triangleChunksNumber(); ++
i) {
223 mMRB.bindTextures(mMRS,
i, *
this);
224 mMRB.bindVertexBuffers(mMRS);
225 mMRB.bindIndexBuffers(mMRS,
i);
229 if (settings.pbrMode) {
234 bgfx::setTransform(
model.data());
236 if (settings.pbrMode) {
241 pm.getProgram<DRAWABLE_MESH_SURFACE_UBER_PBR>());
244 bgfx::submit(settings.viewId, surfaceProgramSelector());
250 bgfx::setTransform(
model.data());
252 mMRB.drawWireframeLines(settings.viewId);
255 if (mMRS.
isEdges(MRI::Edges::VISIBLE)) {
256 bgfx::setTransform(
model.data());
258 mMRB.drawEdgeLines(settings.viewId);
261 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
264 mMRB.bindVertexBuffers(mMRS);
268 bgfx::setTransform(
model.data());
271 settings.viewId,
pm.getProgram<DRAWABLE_MESH_POINTS>());
275 mMRB.computeQuadVertexBuffers(*
this, settings.viewId);
278 mMRB.bindVertexQuadBuffer();
281 bgfx::setState(
state);
282 bgfx::setTransform(
model.data());
286 pm.getProgram<DRAWABLE_MESH_POINTS_INSTANCE>());
293 using enum VertFragProgram;
309 const std::array<float, 4>
idFloat = {
312 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
313 mMRB.bindVertexBuffers(mMRS);
314 mMRB.bindIndexBuffers(mMRS);
317 bgfx::setState(
state);
318 bgfx::setTransform(
model.data());
321 settings.viewId,
pm.getProgram<DRAWABLE_MESH_SURFACE_ID>());
347 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
350 mMRB.bindVertexBuffers(mMRS);
354 bgfx::setTransform(
model.data());
357 settings.viewId,
pm.getProgram<DRAWABLE_MESH_POINTS_ID>());
361 mMRB.computeQuadVertexBuffers(*
this, settings.viewId);
364 mMRB.bindVertexQuadBuffer();
368 bgfx::setState(
state);
369 bgfx::setTransform(
model.data());
373 pm.getProgram<DRAWABLE_MESH_POINTS_INSTANCE_ID>());
380 return std::make_shared<DrawableMeshBGFX>(*
this);
383 std::shared_ptr<DrawableObject>
clone() &&
override
385 return std::make_shared<DrawableMeshBGFX>(std::move(*
this));
391 mMeshRenderSettingsUniforms.updateSettings(mMRS);
394 std::string&
name()
override {
return MeshType::name(); }
396 const std::string&
name()
const override {
return MeshType::name(); }
399 void bindUniforms()
const
401 mMeshRenderSettingsUniforms.bind();
406 bgfx::ProgramHandle surfaceProgramSelector()
const
408 using enum VertFragProgram;
440 VertFragProgram p =
static_cast<VertFragProgram
>(6 * mul + off);
442 if (mSurfaceProgramType == SurfaceProgramsType::SPLIT) {
443 static const std::array<bgfx::ProgramHandle, 18>
444 surfaceProgramHandles = {
445 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_VERTEX>(),
446 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_MESH>(),
447 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_FACE>(),
448 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_USER>(),
449 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_VERTEX>(),
450 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_WEDGE>(),
451 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_VERTEX>(),
452 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_MESH>(),
453 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_FACE>(),
454 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_USER>(),
455 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_VERTEX>(),
456 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_WEDGE>(),
457 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_VERTEX>(),
458 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_MESH>(),
459 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_FACE>(),
460 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_USER>(),
461 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_VERTEX>(),
462 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_WEDGE>()};
464 return surfaceProgramHandles[toUnderlying(p)];
467 if (mSurfaceProgramType == SurfaceProgramsType::UBER_WITH_STATIC_IF) {
468 static const std::array<bgfx::ProgramHandle, 18>
469 surfaceProgramHandles = {
470 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_VERTEX_SI>(),
471 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_MESH_SI>(),
472 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_FACE_SI>(),
473 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_USER_SI>(),
474 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_VERTEX_SI>(),
475 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_WEDGE_SI>(),
476 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_VERTEX_SI>(),
477 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_MESH_SI>(),
478 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_FACE_SI>(),
479 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_USER_SI>(),
480 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_VERTEX_SI>(),
481 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_WEDGE_SI>(),
483 DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_VERTEX_SI>(),
484 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_MESH_SI>(),
485 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_FACE_SI>(),
486 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_USER_SI>(),
487 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_VERTEX_SI>(),
488 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_WEDGE_SI>()};
490 return surfaceProgramHandles[toUnderlying(p)];
493 return pm.getProgram<DRAWABLE_MESH_SURFACE_UBER>();
static Context & instance(void *windowHandle=nullptr, void *displayHandle=nullptr)
Return the context instance.
Definition context.cpp:371