43 enum class SurfaceProgramsType {
53 SurfaceProgramsType mSurfaceProgramType = SurfaceProgramsType::UBER;
55 inline static const uint N_TEXTURE_TYPES =
99 AbstractDrawableMesh::swap(
other);
100 MeshType::swap(
other);
101 swap(mSurfaceProgramType,
other.mSurfaceProgramType);
102 swap(mMRB,
other.mMRB);
110 void setSurfaceProgramType(SurfaceProgramsType type)
112 if (type != mSurfaceProgramType) {
113 std::cerr <<
"Program Type changed: ";
115 case SurfaceProgramsType::UBER: std::cerr <<
"UBER\n";
break;
116 case SurfaceProgramsType::SPLIT: std::cerr <<
"SPLITTED\n";
break;
117 case SurfaceProgramsType::UBER_WITH_STATIC_IF:
118 std::cerr <<
"UBER_WITH_STATIC_IF\n";
121 mSurfaceProgramType = type;
134 AbstractDrawableMesh::computeBoundingBox(
135 static_cast<const MeshType&
>(*
this));
138 mMRS.setRenderCapabilityFrom(*
this);
139 setRenderSettings(mMRS);
144 AbstractDrawableMesh::setRenderSettings(
rs);
145 mMRB.updateEdgeSettings(
rs);
146 mMRB.updateWireframeSettings(
rs);
149 uint vertexCount()
const override {
return MeshType::vertexCount(); }
151 uint faceCount()
const override
154 return MeshType::faceCount();
159 uint edgeCount()
const override
162 return MeshType::edgeCount();
170 return MeshType::transformMatrix().template
cast<double>();
180 return MeshType::materials();
187 const Image& textureImage(
const std::string& path)
const override
190 return MeshType::textureImage(path);
193 return AbstractDrawableMesh::textureImage(path);
203 using enum VertFragProgram;
216 DrawableMeshUniforms::setColor(*
this);
217 MeshRenderSettingsUniforms::set(mMRS);
219 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
223 bool iblEnabled = pbrSettings.imageBasedLighting &&
224 env !=
nullptr &&
env->canDraw();
226 for (uint
i = 0;
i < mMRB.triangleChunksNumber(); ++
i) {
230 mMRB.bindTextures(mMRS,
i, *
this);
233 env->bindTexture(BRDF_LUT, VCL_MRB_TEXTURE5);
234 env->bindTexture(IRRADIANCE, VCL_MRB_CUBEMAP0);
235 env->bindTexture(SPECULAR, VCL_MRB_CUBEMAP1);
239 mMRB.bindVertexBuffers(mMRS);
240 mMRB.bindIndexBuffers(mMRS,
i);
243 DrawableMeshUniforms::setFirstChunkIndex(
244 mMRB.triangleChunk(
i).startIndex);
250 bgfx::setTransform(
model.data());
254 if (pbrSettings.pbrMode) {
261 if (pbrSettings.pbrMode) {
264 pm.getProgram<DRAWABLE_MESH_SURFACE_UBER_PBR>());
267 bgfx::submit(settings.viewId, surfaceProgramSelector());
273 bgfx::setTransform(
model.data());
275 mMRB.drawWireframeLines(settings.viewId);
278 if (mMRS.
isEdges(MRI::Edges::VISIBLE)) {
279 bgfx::setTransform(
model.data());
281 mMRB.drawEdgeLines(settings.viewId);
284 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
287 mMRB.bindVertexBuffers(mMRS);
291 bgfx::setTransform(
model.data());
294 settings.viewId,
pm.getProgram<DRAWABLE_MESH_POINTS>());
298 mMRB.computeQuadVertexBuffers(*
this, settings.viewId);
301 mMRB.bindVertexQuadBuffer();
304 bgfx::setState(
state);
305 bgfx::setTransform(
model.data());
309 pm.getProgram<DRAWABLE_MESH_POINTS_INSTANCE>());
316 using enum VertFragProgram;
332 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
333 mMRB.bindVertexBuffers(mMRS);
334 mMRB.bindIndexBuffers(mMRS);
335 DrawableMeshUniforms::setMeshId(settings.objectId);
336 DrawableMeshUniforms::setFirstChunkIndex(0);
339 bgfx::setState(
state);
340 bgfx::setTransform(
model.data());
343 settings.viewId,
pm.getProgram<DRAWABLE_MESH_SURFACE_ID>());
369 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
372 mMRB.bindVertexBuffers(mMRS);
374 DrawableMeshUniforms::setMeshId(settings.objectId);
378 bgfx::setTransform(
model.data());
381 settings.viewId,
pm.getProgram<DRAWABLE_MESH_POINTS_ID>());
385 mMRB.computeQuadVertexBuffers(*
this, settings.viewId);
388 mMRB.bindVertexQuadBuffer();
389 DrawableMeshUniforms::setMeshId(settings.objectId);
392 bgfx::setState(
state);
393 bgfx::setTransform(
model.data());
397 pm.getProgram<DRAWABLE_MESH_POINTS_INSTANCE_ID>());
404 return std::make_shared<DrawableMeshBGFX>(*
this);
407 std::shared_ptr<DrawableObject>
clone() &&
override
409 return std::make_shared<DrawableMeshBGFX>(std::move(*
this));
412 std::string&
name()
override {
return MeshType::name(); }
414 const std::string&
name()
const override {
return MeshType::name(); }
417 void bindUniforms()
const
419 MeshRenderSettingsUniforms::bind();
420 DrawableMeshUniforms::bind();
433 bool imageBasedLighting)
const
443 MaterialUniforms::set(
445 isPerVertexColorAvailable(*
this),
447 isPerVertexTangentAvailable(*
this),
457 MaterialUniforms::set(
459 isPerVertexColorAvailable(*
this),
461 isPerVertexTangentAvailable(*
this),
466 mMRB.textureAvailableArray(*
this,
materialId);
468 MaterialUniforms::set(
470 isPerVertexColorAvailable(*
this),
472 isPerVertexTangentAvailable(*
this),
476 if (!MeshType::material(
materialId).doubleSided()) {
480 if (MeshType::material(
materialId).alphaMode() == ALPHA_BLEND) {
486 MaterialUniforms::bind();
491 bgfx::ProgramHandle surfaceProgramSelector()
const
493 using enum VertFragProgram;
525 VertFragProgram p =
static_cast<VertFragProgram
>(6 * mul + off);
527 if (mSurfaceProgramType == SurfaceProgramsType::SPLIT) {
528 static const std::array<bgfx::ProgramHandle, 18>
529 surfaceProgramHandles = {
530 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_VERTEX>(),
531 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_MESH>(),
532 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_FACE>(),
533 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_USER>(),
534 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_VERTEX>(),
535 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_WEDGE>(),
536 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_VERTEX>(),
537 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_MESH>(),
538 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_FACE>(),
539 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_USER>(),
540 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_VERTEX>(),
541 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_WEDGE>(),
542 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_VERTEX>(),
543 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_MESH>(),
544 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_FACE>(),
545 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_USER>(),
546 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_VERTEX>(),
547 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_WEDGE>()};
549 return surfaceProgramHandles[toUnderlying(p)];
552 if (mSurfaceProgramType == SurfaceProgramsType::UBER_WITH_STATIC_IF) {
553 static const std::array<bgfx::ProgramHandle, 18>
554 surfaceProgramHandles = {
555 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_VERTEX_SI>(),
556 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_MESH_SI>(),
557 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_FACE_SI>(),
558 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_USER_SI>(),
559 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_VERTEX_SI>(),
560 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_WEDGE_SI>(),
561 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_VERTEX_SI>(),
562 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_MESH_SI>(),
563 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_FACE_SI>(),
564 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_USER_SI>(),
565 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_VERTEX_SI>(),
566 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_WEDGE_SI>(),
568 DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_VERTEX_SI>(),
569 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_MESH_SI>(),
570 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_FACE_SI>(),
571 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_USER_SI>(),
572 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_VERTEX_SI>(),
573 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_WEDGE_SI>()};
575 return surfaceProgramHandles[toUnderlying(p)];
578 return pm.getProgram<DRAWABLE_MESH_SURFACE_UBER>();
static Context & instance(void *windowHandle=nullptr, void *displayHandle=nullptr)
Return the context instance.
Definition context.cpp:371