42 enum class SurfaceProgramsType {
58 SurfaceProgramsType mSurfaceProgramType = SurfaceProgramsType::UBER;
81 mMeshRenderSettingsUniforms(
103 AbstractDrawableMesh::swap(
other);
104 MeshType::swap(
other);
105 swap(mBoundingBox,
other.mBoundingBox);
106 swap(mMRB,
other.mMRB);
107 swap(mMeshRenderSettingsUniforms,
other.mMeshRenderSettingsUniforms);
113 void setSurfaceProgramType(SurfaceProgramsType type)
115 if (type != mSurfaceProgramType) {
116 std::cerr <<
"Program Type changed: ";
118 case SurfaceProgramsType::UBER: std::cerr <<
"UBER\n";
break;
119 case SurfaceProgramsType::SPLIT: std::cerr <<
"SPLITTED\n";
break;
120 case SurfaceProgramsType::UBER_WITH_STATIC_IF:
121 std::cerr <<
"UBER_WITH_STATIC_IF\n";
124 mSurfaceProgramType = type;
139 if (this->MeshType::boundingBox().isNull()) {
153 mBoundingBox.
min() *=
155 mBoundingBox.
max() *=
160 mMRS.setRenderCapabilityFrom(*
this);
161 mMeshRenderSettingsUniforms.updateSettings(mMRS);
166 AbstractDrawableMesh::setRenderSettings(
rs);
167 mMeshRenderSettingsUniforms.updateSettings(
rs);
170 uint vertexNumber()
const override {
return MeshType::vertexNumber(); }
172 uint faceNumber()
const override
175 return MeshType::faceNumber();
180 uint edgeNumber()
const override
183 return MeshType::edgeNumber();
191 return MeshType::transformMatrix().template
cast<double>();
198 std::vector<std::string> textures()
const override
200 std::vector<std::string>
txs;
202 txs.reserve(MeshType::textureNumber());
203 for (
const auto&
tpath : MeshType::texturePaths()) {
214 void draw(uint viewId)
const override
216 using enum VertFragProgram;
229 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
231 mMRB.bindVertexBuffers(mMRS);
232 mMRB.bindIndexBuffers(mMRS);
235 bgfx::setState(
state);
236 bgfx::setTransform(
model.data());
238 bgfx::submit(viewId, surfaceProgramSelector());
242 mMRB.bindVertexBuffers(mMRS);
243 mMRB.bindIndexBuffers(mMRS, MRI::Buffers::WIREFRAME);
247 bgfx::setTransform(
model.data());
249 bgfx::submit(viewId,
pm.getProgram<DRAWABLE_MESH_WIREFRAME>());
252 if (mMRS.
isEdges(MRI::Edges::VISIBLE)) {
253 mMRB.bindVertexBuffers(mMRS);
254 mMRB.bindIndexBuffers(mMRS, MRI::Buffers::EDGES);
258 bgfx::setTransform(
model.data());
260 bgfx::submit(viewId,
pm.getProgram<DRAWABLE_MESH_EDGES>());
263 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
266 mMRB.bindVertexBuffers(mMRS);
270 bgfx::setTransform(
model.data());
272 bgfx::submit(viewId,
pm.getProgram<DRAWABLE_MESH_POINTS>());
276 mMRB.computeQuadVertexBuffers(*
this, viewId);
279 mMRB.bindVertexQuadBuffer();
282 bgfx::setState(
state);
283 bgfx::setTransform(
model.data());
286 viewId,
pm.getProgram<DRAWABLE_MESH_POINTS_INSTANCE>());
291 void drawId(uint viewId, uint
id)
const override
293 using enum VertFragProgram;
309 const std::array<float, 4>
idFloat = {
310 Uniform::uintBitsToFloat(
id), 0.0f, 0.0f, 0.0f};
312 if (mMRS.
isSurface(MRI::Surface::VISIBLE)) {
314 mMRB.bindVertexBuffers(mMRS);
315 mMRB.bindIndexBuffers(mMRS);
318 bgfx::setState(
state);
319 bgfx::setTransform(
model.data());
321 bgfx::submit(viewId,
pm.getProgram<DRAWABLE_MESH_SURFACE_ID>());
325 mMRB.bindVertexBuffers(mMRS);
326 mMRB.bindIndexBuffers(mMRS, MRI::Buffers::WIREFRAME);
330 bgfx::setTransform(
model.data());
332 bgfx::submit(viewId,
pm.getProgram<DRAWABLE_MESH_WIREFRAME_ID>());
335 if (mMRS.
isEdges(MRI::Edges::VISIBLE)) {
336 mMRB.bindVertexBuffers(mMRS);
337 mMRB.bindIndexBuffers(mMRS, MRI::Buffers::EDGES);
341 bgfx::setTransform(
model.data());
343 bgfx::submit(viewId,
pm.getProgram<DRAWABLE_MESH_EDGES_ID>());
346 if (mMRS.
isPoints(MRI::Points::VISIBLE)) {
349 mMRB.bindVertexBuffers(mMRS);
353 bgfx::setTransform(
model.data());
355 bgfx::submit(viewId,
pm.getProgram<DRAWABLE_MESH_POINTS_ID>());
359 mMRB.computeQuadVertexBuffers(*
this, viewId);
362 mMRB.bindVertexQuadBuffer();
366 bgfx::setState(
state);
367 bgfx::setTransform(
model.data());
370 viewId,
pm.getProgram<DRAWABLE_MESH_POINTS_INSTANCE_ID>());
379 return std::make_shared<DrawableMeshBGFX>(*
this);
382 std::shared_ptr<DrawableObject>
clone() &&
override
384 return std::make_shared<DrawableMeshBGFX>(std::move(*
this));
390 mMeshRenderSettingsUniforms.updateSettings(mMRS);
393 std::string&
name()
override {
return MeshType::name(); }
395 const std::string&
name()
const override {
return MeshType::name(); }
398 void bindUniforms()
const
400 mMeshRenderSettingsUniforms.bind();
405 bgfx::ProgramHandle surfaceProgramSelector()
const
407 using enum VertFragProgram;
439 VertFragProgram p =
static_cast<VertFragProgram
>(6 * mul + off);
441 if (mSurfaceProgramType == SurfaceProgramsType::SPLIT) {
442 static const std::array<bgfx::ProgramHandle, 18>
443 surfaceProgramHandles = {
444 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_VERTEX>(),
445 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_MESH>(),
446 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_FACE>(),
447 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_USER>(),
448 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_VERTEX>(),
449 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_WEDGE>(),
450 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_VERTEX>(),
451 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_MESH>(),
452 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_FACE>(),
453 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_USER>(),
454 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_VERTEX>(),
455 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_WEDGE>(),
456 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_VERTEX>(),
457 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_MESH>(),
458 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_FACE>(),
459 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_USER>(),
460 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_VERTEX>(),
461 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_WEDGE>()};
463 return surfaceProgramHandles[toUnderlying(p)];
466 if (mSurfaceProgramType == SurfaceProgramsType::UBER_WITH_STATIC_IF) {
467 static const std::array<bgfx::ProgramHandle, 18>
468 surfaceProgramHandles = {
469 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_VERTEX_SI>(),
470 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_MESH_SI>(),
471 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_FACE_SI>(),
472 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_COLOR_USER_SI>(),
473 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_VERTEX_SI>(),
474 pm.getProgram<DRAWABLE_MESH_SURFACE_NONE_TEX_WEDGE_SI>(),
475 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_VERTEX_SI>(),
476 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_MESH_SI>(),
477 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_FACE_SI>(),
478 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_COLOR_USER_SI>(),
479 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_VERTEX_SI>(),
480 pm.getProgram<DRAWABLE_MESH_SURFACE_FLAT_TEX_WEDGE_SI>(),
482 DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_VERTEX_SI>(),
483 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_MESH_SI>(),
484 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_FACE_SI>(),
485 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_COLOR_USER_SI>(),
486 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_VERTEX_SI>(),
487 pm.getProgram<DRAWABLE_MESH_SURFACE_SMOOTH_TEX_WEDGE_SI>()};
489 return surfaceProgramHandles[toUnderlying(p)];
492 return pm.getProgram<DRAWABLE_MESH_SURFACE_UBER>();
static Context & instance(void *windowHandle=nullptr, void *displayHandle=nullptr)
Return the context instance.
Definition context.cpp:371
Concept that checks if a Mesh has the TexturePaths component.
Definition mesh_requirements.h:105