20 #include <vtkLODActor.h>
21 #include <vtkPolyData.h>
22 #include <vtkRenderer.h>
31 void TextureRenderManager::InitializeRenderers() {
37 renderers_.push_back(std::make_unique<PBRRenderer>());
38 renderers_.push_back(std::make_unique<MultiTextureRenderer>());
44 TextureRenderManager::MaterialAnalysis TextureRenderManager::AnalyzeMaterials(
46 MaterialAnalysis analysis;
48 if (!materials || materials->empty()) {
52 analysis.material_count = materials->size();
55 auto firstMaterial = materials->at(0);
57 analysis.has_pbr_textures =
62 analysis.has_multiple_map_kd =
66 if (!analysis.has_pbr_textures) {
68 analysis.has_pbr_textures = pbr_material.hasPBRTextures();
74 analysis.has_any_texture = HasAnyTextureFiles(materials);
77 "[TextureRenderManager::AnalyzeMaterials] Analysis complete: "
78 "count=%zu, has_pbr=%d, has_multiple_map_kd=%d, has_any_texture=%d",
79 analysis.material_count, analysis.has_pbr_textures,
80 analysis.has_multiple_map_kd, analysis.has_any_texture);
87 if (!materials || materials->empty()) {
89 "[TextureRenderManager::SelectRenderer] No materials "
94 MaterialAnalysis analysis = AnalyzeMaterials(materials);
97 "[TextureRenderManager::SelectRenderer] Analysis: count=%zu, "
98 "has_pbr=%d, has_multiple_map_kd=%d",
99 analysis.material_count, analysis.has_pbr_textures,
100 analysis.has_multiple_map_kd);
103 for (
auto& renderer : renderers_) {
104 if (renderer->CanHandle(analysis.material_count,
105 analysis.has_pbr_textures,
106 analysis.has_multiple_map_kd)) {
108 "[TextureRenderManager::SelectRenderer] Selected: %s",
109 renderer->GetName().c_str());
110 return renderer.get();
115 "[TextureRenderManager::SelectRenderer] No renderer can handle "
122 for (
auto& renderer : renderers_) {
123 if (renderer->GetMode() == mode) {
124 return renderer.get();
130 bool TextureRenderManager::HasAnyTextureFiles(
132 if (!materials || materials->empty()) {
136 for (
size_t i = 0; i < materials->size(); ++i) {
137 auto mat = materials->at(i);
143 if (mat->hasTextureMap(
static_cast<TexType
>(
type))) {
145 std::vector<QString> textureFiles =
146 mat->getTextureFilenames(
static_cast<TexType
>(
type));
147 for (
const auto& file : textureFiles) {
148 if (!file.isEmpty()) {
161 vtkPolyData* polydata,
162 vtkRenderer* renderer) {
164 CVLog::Error(
"[TextureRenderManager::Apply] Actor is null");
169 if (!selected_renderer) {
171 "[TextureRenderManager::Apply] Cannot select renderer for "
177 "[TextureRenderManager::Apply] Applying rendering using %s",
178 selected_renderer->
GetName().c_str());
180 return selected_renderer->
Apply(actor, materials, polydata, renderer);
185 vtkPolyData* polydata,
186 vtkRenderer* renderer) {
188 CVLog::Error(
"[TextureRenderManager::Update] Actor is null");
193 if (!selected_renderer) {
195 "[TextureRenderManager::Update] Cannot select renderer for "
201 "[TextureRenderManager::Update] Updating rendering using %s",
202 selected_renderer->
GetName().c_str());
204 return selected_renderer->
Update(actor, materials, polydata, renderer);
static bool PrintDebug(const char *format,...)
Same as Print, but works only in Debug mode.
static bool Warning(const char *format,...)
Prints out a formatted warning message in console.
static bool Error(const char *format,...)
Display an error dialog with formatted message.
static bool HasPBREncoding(const ccMaterial *material)
Detect if material has PBR encoding.
static bool HasMultipleMapKd(const ccMaterialSet *materials)
Detect if material set has multiple map_Kd textures.
static VtkUtils::VtkMultiTextureRenderer::PBRMaterial FromMaterialSet(const ccMaterialSet *materials)
Convert first material from ccMaterialSet to PBRMaterial.
TextureRendererBase * SelectRenderer(const ccMaterialSet *materials) const
Detect and select appropriate renderer for materials.
bool Update(vtkActor *actor, const ccMaterialSet *materials, vtkPolyData *polydata, vtkRenderer *renderer)
Update existing actor with new materials.
TextureRendererBase * GetRenderer(RenderingMode mode) const
Get renderer by mode.
bool Apply(vtkLODActor *actor, const ccMaterialSet *materials, vtkPolyData *polydata, vtkRenderer *renderer)
Apply rendering to actor.
Base class for all texture renderers.
virtual bool Apply(vtkLODActor *actor, const class ccMaterialSet *materials, vtkPolyData *polydata, vtkRenderer *renderer)=0
Apply rendering to actor.
virtual bool Update(vtkActor *actor, const class ccMaterialSet *materials, vtkPolyData *polydata, vtkRenderer *renderer)=0
Update existing actor with new materials.
virtual std::string GetName() const =0
Get renderer name for logging.
Mesh (triangle) material.
TextureMapType
Texture map types for PBR materials.
RenderingMode
Rendering mode enumeration.