ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
MeshMaterialExtractor.cpp
Go to the documentation of this file.
1 // ----------------------------------------------------------------------------
2 // - CloudViewer: www.cloudViewer.org -
3 // ----------------------------------------------------------------------------
4 // Copyright (c) 2018-2024 www.cloudViewer.org
5 // SPDX-License-Identifier: MIT
6 // ----------------------------------------------------------------------------
7 
9 
10 #include <CVLog.h>
11 #include <ecvGenericMesh.h>
12 #include <ecvMaterialSet.h>
13 
16 
17 // VTK
18 #include <vtkLODActor.h>
19 #include <vtkPolyData.h>
20 #include <vtkPolyDataMapper.h>
21 #include <vtkRenderer.h>
22 
23 namespace PclUtils {
24 namespace renders {
25 
27  vtkLODActor* actor,
28  const ccGenericMesh* mesh,
29  vtkPolyData* polydata,
30  TextureRenderManager* render_manager,
31  vtkRenderer* renderer) {
32  if (!actor) {
34  "[MeshMaterialExtractor::ApplyMaterialFromMesh] Actor is null");
35  return false;
36  }
37 
38  if (!render_manager) {
40  "[MeshMaterialExtractor::ApplyMaterialFromMesh] Render manager "
41  "is null");
42  return false;
43  }
44 
45  if (!mesh) {
47  "[MeshMaterialExtractor::ApplyMaterialFromMesh] Mesh is null, "
48  "using default material");
49  // Use default material via render manager
50  ccMaterialSet default_materials("DefaultMaterial");
52  default_mat->setName("default");
53  default_mat->setDiffuse(ecvColor::Rgbaf(0.8f, 0.8f, 0.8f, 1.0f));
54  default_materials.addMaterial(default_mat);
55 
56  return render_manager->Apply(actor, &default_materials, polydata,
57  renderer);
58  }
59 
61  "[MeshMaterialExtractor::ApplyMaterialFromMesh] Extracting "
62  "material from mesh");
63 
64  // Try to get materials
65  const ccMaterialSet* materials =
66  const_cast<ccGenericMesh*>(mesh)->getMaterialSet();
67  if (!materials || materials->size() == 0) {
69  "[MeshMaterialExtractor::ApplyMaterialFromMesh] No materials "
70  "found in mesh, using default");
71  // Use default material
72  ccMaterialSet default_materials("DefaultMaterial");
74  default_mat->setName("mesh_default");
75 
76  // Try to get color from mesh
77  if (mesh->hasColors()) {
78  // Use first vertex color as base color
79  // Note: Simplified handling, may need more complex logic in
80  // practice
81  default_mat->setDiffuse(ecvColor::Rgbaf(0.8f, 0.8f, 0.8f, 1.0f));
82  } else {
83  default_mat->setDiffuse(ecvColor::Rgbaf(0.8f, 0.8f, 0.8f, 1.0f));
84  }
85  default_materials.addMaterial(default_mat);
86 
87  return render_manager->Apply(actor, &default_materials, polydata,
88  renderer);
89  }
90 
91  // Apply materials using render manager
92  return render_manager->Apply(actor, materials, polydata, renderer);
93 }
94 
95 } // namespace renders
96 } // namespace PclUtils
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
Definition: CVLog.cpp:133
static bool Print(const char *format,...)
Prints out a formatted message in console.
Definition: CVLog.cpp:113
static bool Error(const char *format,...)
Display an error dialog with formatted message.
Definition: CVLog.cpp:143
static bool ApplyMaterialFromMesh(vtkLODActor *actor, const ccGenericMesh *mesh, vtkPolyData *polydata, TextureRenderManager *render_manager, class vtkRenderer *renderer=nullptr)
Extract and apply material from ccMesh to actor.
bool Apply(vtkLODActor *actor, const ccMaterialSet *materials, vtkPolyData *polydata, vtkRenderer *renderer)
Apply rendering to actor.
virtual bool hasColors() const
Returns whether colors are enabled or not.
Generic mesh interface.
Mesh (triangle) material.
int addMaterial(ccMaterial::CShared mat, bool allowDuplicateNames=false)
Adds a material.
Mesh (triangle) material.
Definition: ecvMaterial.h:28
QSharedPointer< ccMaterial > Shared
Shared type.
Definition: ecvMaterial.h:33
RGBA color structure.