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 
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 
196  const QString& absoluteFilename);
197 
200 
202 
204  std::vector<QString> getTextureFilenames(TextureMapType type) const;
205 
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 
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 };
#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
static void AddTexture(const QImage &image, const QString &absoluteFilename)
Adds a texture to the global texture DB.
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
bool compare(const ccMaterial &mtl) const
Compares this material with another one.
bool loadAndSetTextureMap(TextureMapType type, const QString &absoluteFilename)
Load and set a specific texture map type.
float m_clearcoatRoughness
Definition: ecvMaterial.h:267
short minimumFileVersion() const override
Returns the minimum file version required to save this instance.
bool hasTexture() const
Returns whether the material has an associated texture or not.
GLuint getTextureID() const
Returns the texture ID (if any)
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
static QImage GetTexture(const QString &absoluteFilename)
Returns the texture image associated to a given name.
void setShininess(float val)
Sets shininess (both front - 100% - and back - 80%)
bool toFile(QFile &out, short dataVersion) const override
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
std::vector< QString > getTextureFilenames(TextureMapType type) const
Get all texture filenames for a specific map type.
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 releaseTexture()
Release the texture.
QString getTextureFilename(TextureMapType type) const
Get texture filename for a specific map type (returns first one)
void applyGL(const QOpenGLContext *context, bool lightEnabled, bool skipDiffuse) const
Apply parameters (OpenGL)
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 setTexture(const QImage &image, const QString &absoluteFilename=QString(), bool mirrorImage=false)
Sets texture.
void setShininessFront(float val)
Sets shininess (front)
Definition: ecvMaterial.h:96
const ecvColor::Rgbaf & getDiffuseFront() const
Returns front diffuse color.
Definition: ecvMaterial.h:61
bool fromFile(QFile &in, short dataVersion, int flags, LoadedIDMap &oldToNewIDMap) override
Loads data from binary stream.
void setRoughness(float val)
Sets roughness factor (PBR)
Definition: ecvMaterial.h:113
ecvColor::Rgbaf m_emission
Definition: ecvMaterial.h:258
const QImage & getTexture() const
Returns the texture (if any)
void setShininessBack(float val)
Sets shininess (back)
Definition: ecvMaterial.h:98
QSharedPointer< ccMaterial > Shared
Shared type.
Definition: ecvMaterial.h:33
void setDiffuse(const ecvColor::Rgbaf &color)
Sets diffuse color (both front and back)
bool hasTextureMap(TextureMapType type) const
Check if a specific texture map type exists.
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
std::vector< std::pair< TextureMapType, QString > > getAllTextureFilenames() const
Get all texture map filenames.
const ecvColor::Rgbaf & getAmbient() const
Returns ambient color.
Definition: ecvMaterial.h:72
bool loadAndSetTexture(const QString &absoluteFilename)
Loads texture from file (and set it if successful)
float m_anisotropy
Definition: ecvMaterial.h:268
float m_sheen
Definition: ecvMaterial.h:265
float getAnisotropy() const
Returns anisotropy factor.
Definition: ecvMaterial.h:135
ccMaterial(const QString &name=QString("default"))
Default constructor.
ccMaterial(const ccMaterial &mtl)
Copy constructor.
void setClearcoatRoughness(float val)
Sets clearcoat roughness (PBR)
Definition: ecvMaterial.h:128
ecvColor::Rgbaf m_ambient
Definition: ecvMaterial.h:256
void setTransparency(float val)
Sets transparency (all colors)
const QString & getName() const
Returns the material name.
Definition: ecvMaterial.h:42
static void ReleaseTextures()
Release all texture objects.
const ecvColor::Rgbaf & getDiffuseBack() const
Returns back diffuse color.
Definition: ecvMaterial.h:65
Serializable object interface.
QMultiMap< unsigned, unsigned > LoadedIDMap
Map of loaded unique IDs (old ID --> new ID)
RGBA color structure.
ImGuiContext * context
Definition: Window.cpp:76
constexpr ColorCompType OPACITY
Definition: ecvColorTypes.h:35