ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
ecvMaterial.h
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 
8 #pragma once
9 
10 // Local
11 #include "ecvColorTypes.h"
12 #include "ecvSerializableObject.h"
13 
14 // Qt
15 #include <QtGui/qopengl.h>
16 
17 #include <QSharedPointer>
18 
19 // STL
20 #include <map>
21 #include <utility>
22 #include <vector>
23 
24 class QImage;
25 class QOpenGLContext;
26 
29 public:
31  typedef QSharedPointer<const ccMaterial> CShared;
33  typedef QSharedPointer<ccMaterial> Shared;
34 
36  explicit ccMaterial(const QString& name = QString("default"));
37 
39  ccMaterial(const ccMaterial& mtl);
40 
42  inline const QString& getName() const { return m_name; }
44  inline const QString& getTextureFilename() const {
45  return m_textureFilename;
46  }
48  inline void setName(QString name) { m_name = name; }
49 
51  void setDiffuse(const ecvColor::Rgbaf& color);
53  inline void setDiffuseFront(const ecvColor::Rgbaf& color) {
54  m_diffuseFront = color;
55  }
57  inline void setDiffuseBack(const ecvColor::Rgbaf& color) {
58  m_diffuseBack = color;
59  }
61  inline const ecvColor::Rgbaf& getDiffuseFront() const {
62  return m_diffuseFront;
63  }
65  inline const ecvColor::Rgbaf& getDiffuseBack() const {
66  return m_diffuseBack;
67  }
68 
70  inline void setAmbient(const ecvColor::Rgbaf& color) { m_ambient = color; }
72  inline const ecvColor::Rgbaf& getAmbient() const { return m_ambient; }
73 
75  inline void setIllum(int illum) { m_illum = illum; }
77  inline int getIllum() const { return m_illum; }
78 
80  inline void setSpecular(const ecvColor::Rgbaf& color) {
81  m_specular = color;
82  }
84  inline const ecvColor::Rgbaf& getSpecular() const { return m_specular; }
85 
87  inline void setEmission(const ecvColor::Rgbaf& color) {
88  m_emission = color;
89  }
91  inline const ecvColor::Rgbaf& getEmission() const { return m_emission; }
92 
94  void setShininess(float val);
96  inline void setShininessFront(float val) { m_shininessFront = val; }
98  inline void setShininessBack(float val) { m_shininessBack = val; }
100  inline float getShininessFront() const { return m_shininessFront; }
102  inline float getShininessBack() const { return m_shininessBack; }
103 
105  void setTransparency(float val);
106 
108  inline void setMetallic(float val) { m_metallic = val; }
110  inline float getMetallic() const { return m_metallic; }
111 
113  inline void setRoughness(float val) { m_roughness = val; }
115  inline float getRoughness() const { return m_roughness; }
116 
118  inline void setSheen(float val) { m_sheen = val; }
120  inline float getSheen() const { return m_sheen; }
121 
123  inline void setClearcoat(float val) { m_clearcoat = val; }
125  inline float getClearcoat() const { return m_clearcoat; }
126 
128  inline void setClearcoatRoughness(float val) { m_clearcoatRoughness = val; }
130  inline float getClearcoatRoughness() const { return m_clearcoatRoughness; }
131 
133  inline void setAnisotropy(float val) { m_anisotropy = val; }
135  inline float getAnisotropy() const { return m_anisotropy; }
136 
138  inline void setAmbientOcclusion(float val) { m_ambientOcclusion = val; }
140  inline float getAmbientOcclusion() const { return m_ambientOcclusion; }
141 
143  void applyGL(const QOpenGLContext* context,
144  bool lightEnabled,
145  bool skipDiffuse) const;
146 
148  bool hasTexture() const;
149 
151 
153  void setTexture(const QImage& image,
154  const QString& absoluteFilename = QString(),
155  bool mirrorImage = false);
156 
158 
162  bool loadAndSetTexture(const QString& absoluteFilename);
163 
165  const QImage& getTexture() const;
166 
168  GLuint getTextureID() const;
169 
171  static QImage GetTexture(const QString& absoluteFilename);
172 
173  // ========== Multi-Texture PBR Support ==========
174 
176  enum class TextureMapType {
177  DIFFUSE, // map_Kd - Diffuse/Albedo
178  AMBIENT, // map_Ka - Ambient Occlusion
179  SPECULAR, // map_Ks - Specular
180  NORMAL, // map_Bump, map_bump, norm, bump - Normal map
181  METALLIC, // map_Pm - Metallic
182  ROUGHNESS, // map_Pr - Roughness
183  SHININESS, // map_Ns - Shininess/Glossiness (inverse of roughness)
184  EMISSIVE, // map_Ke - Emissive
185  OPACITY, // map_d - Opacity/Alpha
186  DISPLACEMENT, // map_disp, disp - Displacement
187  REFLECTION, // refl - Reflection
188  SHEEN, // map_Ps - Sheen (fabric-like materials)
189  CLEARCOAT, // map_Pc - Clearcoat layer
190  CLEARCOAT_ROUGHNESS, // map_Pcr - Clearcoat roughness
191  ANISOTROPY // map_aniso - Anisotropic reflection
192  };
193 
195  bool loadAndSetTextureMap(TextureMapType type,
196  const QString& absoluteFilename);
197 
199  QString getTextureFilename(TextureMapType type) const;
200 
202 
204  std::vector<QString> getTextureFilenames(TextureMapType type) const;
205 
207  bool hasTextureMap(TextureMapType type) const;
208 
210 
212  std::vector<std::pair<TextureMapType, QString>> getAllTextureFilenames()
213  const;
214 
216  static void AddTexture(const QImage& image,
217  const QString& absoluteFilename);
218 
220 
222  static void ReleaseTextures();
223 
225 
227  void releaseTexture();
228 
230 
232  bool compare(const ccMaterial& mtl) const;
233 
234  // inherited from ccSerializableObject
235  bool isSerializable() const override { return true; }
238  bool toFile(QFile& out, short dataVersion) const override;
239  short minimumFileVersion() const override;
240  bool fromFile(QFile& in,
241  short dataVersion,
242  int flags,
243  LoadedIDMap& oldToNewIDMap) override;
244 
246  inline QString getUniqueIdentifier() const { return m_uniqueID; }
247 
248 protected:
249  QString m_name;
250  QString m_textureFilename; // Legacy: main diffuse texture
251  QString m_uniqueID;
252  int m_illum;
253 
261 
262  // PBR scalar parameters
263  float m_metallic; // Pm - Metallic factor [0,1]
264  float m_roughness; // Pr - Roughness factor [0,1]
265  float m_sheen; // Ps - Sheen factor [0,1]
266  float m_clearcoat; // Pc - Clearcoat factor [0,1]
267  float m_clearcoatRoughness; // Pcr - Clearcoat roughness [0,1]
268  float m_anisotropy; // aniso - Anisotropy factor [0,1]
269  float m_ambientOcclusion; // Pa - Ambient Occlusion factor [0,1]
270 
271  // Multi-texture PBR support
272  // Support multiple textures of the same type (e.g., multiple map_Kd)
273  std::map<TextureMapType, std::vector<QString>> m_textureFilenames;
274 };
Compare compare
#define CV_DB_LIB_API
Definition: CV_db.h:15
std::shared_ptr< core::Tensor > image
std::string name
char type
math::float4 color
Mesh (triangle) material.
Definition: ecvMaterial.h:28
float getClearcoatRoughness() const
Returns clearcoat roughness.
Definition: ecvMaterial.h:130
float m_shininessBack
Definition: ecvMaterial.h:260
void setMetallic(float val)
Sets metallic factor (PBR)
Definition: ecvMaterial.h:108
bool isSerializable() const override
Returns whether object is serializable of not.
Definition: ecvMaterial.h:235
float m_roughness
Definition: ecvMaterial.h:264
QString getUniqueIdentifier() const
Returns unique identifier (UUID)
Definition: ecvMaterial.h:246
TextureMapType
Texture map types for PBR materials.
Definition: ecvMaterial.h:176
float m_clearcoatRoughness
Definition: ecvMaterial.h:267
float getRoughness() const
Returns roughness factor.
Definition: ecvMaterial.h:115
void setSheen(float val)
Sets sheen factor (PBR)
Definition: ecvMaterial.h:118
float getSheen() const
Returns sheen factor.
Definition: ecvMaterial.h:120
std::map< TextureMapType, std::vector< QString > > m_textureFilenames
Definition: ecvMaterial.h:273
float getAmbientOcclusion() const
Returns ambient occlusion factor.
Definition: ecvMaterial.h:140
ecvColor::Rgbaf m_diffuseBack
Definition: ecvMaterial.h:255
void setAmbientOcclusion(float val)
Sets ambient occlusion factor (PBR)
Definition: ecvMaterial.h:138
ecvColor::Rgbaf m_specular
Definition: ecvMaterial.h:257
float m_shininessFront
Definition: ecvMaterial.h:259
void setDiffuseFront(const ecvColor::Rgbaf &color)
Sets diffuse color (front)
Definition: ecvMaterial.h:53
float getMetallic() const
Returns metallic factor.
Definition: ecvMaterial.h:110
QSharedPointer< const ccMaterial > CShared
Const + Shared type.
Definition: ecvMaterial.h:31
QString m_name
Definition: ecvMaterial.h:249
float getShininessFront() const
Returns front shininess.
Definition: ecvMaterial.h:100
ecvColor::Rgbaf m_diffuseFront
Definition: ecvMaterial.h:254
void setName(QString name)
Sets the material name.
Definition: ecvMaterial.h:48
void setIllum(int illum)
Sets illum mode.
Definition: ecvMaterial.h:75
const ecvColor::Rgbaf & getEmission() const
Returns emission color.
Definition: ecvMaterial.h:91
void setEmission(const ecvColor::Rgbaf &color)
Sets emission color.
Definition: ecvMaterial.h:87
int getIllum() const
Returns illum mode.
Definition: ecvMaterial.h:77
void setDiffuseBack(const ecvColor::Rgbaf &color)
Sets diffuse color (back)
Definition: ecvMaterial.h:57
const ecvColor::Rgbaf & getSpecular() const
Returns specular color.
Definition: ecvMaterial.h:84
float m_metallic
Definition: ecvMaterial.h:263
float m_ambientOcclusion
Definition: ecvMaterial.h:269
void setAmbient(const ecvColor::Rgbaf &color)
Sets ambient color.
Definition: ecvMaterial.h:70
void setShininessFront(float val)
Sets shininess (front)
Definition: ecvMaterial.h:96
const ecvColor::Rgbaf & getDiffuseFront() const
Returns front diffuse color.
Definition: ecvMaterial.h:61
void setRoughness(float val)
Sets roughness factor (PBR)
Definition: ecvMaterial.h:113
ecvColor::Rgbaf m_emission
Definition: ecvMaterial.h:258
void setShininessBack(float val)
Sets shininess (back)
Definition: ecvMaterial.h:98
QSharedPointer< ccMaterial > Shared
Shared type.
Definition: ecvMaterial.h:33
float m_clearcoat
Definition: ecvMaterial.h:266
float getShininessBack() const
Returns back shininess.
Definition: ecvMaterial.h:102
QString m_uniqueID
Definition: ecvMaterial.h:251
const QString & getTextureFilename() const
Returns the texture filename (if any)
Definition: ecvMaterial.h:44
void setAnisotropy(float val)
Sets anisotropy factor (PBR)
Definition: ecvMaterial.h:133
void setClearcoat(float val)
Sets clearcoat factor (PBR)
Definition: ecvMaterial.h:123
void setSpecular(const ecvColor::Rgbaf &color)
Sets specular color.
Definition: ecvMaterial.h:80
float getClearcoat() const
Returns clearcoat factor.
Definition: ecvMaterial.h:125
QString m_textureFilename
Definition: ecvMaterial.h:250
const ecvColor::Rgbaf & getAmbient() const
Returns ambient color.
Definition: ecvMaterial.h:72
float m_anisotropy
Definition: ecvMaterial.h:268
float m_sheen
Definition: ecvMaterial.h:265
float getAnisotropy() const
Returns anisotropy factor.
Definition: ecvMaterial.h:135
void setClearcoatRoughness(float val)
Sets clearcoat roughness (PBR)
Definition: ecvMaterial.h:128
ecvColor::Rgbaf m_ambient
Definition: ecvMaterial.h:256
const QString & getName() const
Returns the material name.
Definition: ecvMaterial.h:42
const ecvColor::Rgbaf & getDiffuseBack() const
Returns back diffuse color.
Definition: ecvMaterial.h:65
Serializable object interface.
virtual short minimumFileVersion() const =0
Returns the minimum file version required to save this instance.
virtual bool toFile(QFile &out, short dataVersion) const
Saves data to binary stream.
virtual bool fromFile(QFile &in, short dataVersion, int flags, LoadedIDMap &oldToNewIDMap)
Loads data from binary stream.
RGBA color structure.
ImGuiContext * context
Definition: Window.cpp:76
constexpr ColorCompType OPACITY
Definition: ecvColorTypes.h:35