15 #include <QOpenGLContext>
16 #include <QOpenGLTexture>
25 m_uniqueID(QUuid::createUuid().
toString()),
36 m_clearcoatRoughness(0.0f),
38 m_ambientOcclusion(0.0f) {
44 m_textureFilename(mtl.m_textureFilename),
45 m_uniqueID(mtl.m_uniqueID),
47 m_diffuseFront(mtl.m_diffuseFront),
48 m_diffuseBack(mtl.m_diffuseBack),
49 m_ambient(mtl.m_ambient),
50 m_specular(mtl.m_specular),
51 m_emission(mtl.m_emission),
52 m_shininessFront(mtl.m_shininessFront),
53 m_shininessBack(mtl.m_shininessFront),
54 m_metallic(mtl.m_metallic),
55 m_roughness(mtl.m_roughness),
57 m_clearcoat(mtl.m_clearcoat),
58 m_clearcoatRoughness(mtl.m_clearcoatRoughness),
59 m_anisotropy(mtl.m_anisotropy),
60 m_ambientOcclusion(mtl.m_ambientOcclusion),
61 m_textureFilenames(mtl.m_textureFilenames) {}
83 bool skipDiffuse)
const {
85 Q_UNUSED(lightEnabled);
86 Q_UNUSED(skipDiffuse);
117 if (absoluteFilename.isEmpty()) {
119 "[ccMaterial::loadAndSetTexture] filename can't be empty!"));
124 const QString& nativeFilename =
133 QImage
image(nativeFilename);
134 if (
image.isNull()) {
135 CVLog::Warning(QString(
"[ccMaterial::loadAndSetTexture] Failed to "
137 .arg(nativeFilename));
148 const QString& absoluteFilename ,
151 "'%1' / size = %2 x %3")
152 .arg(absoluteFilename)
154 .arg(
image.height()));
158 if (nativeFilename.isEmpty()) {
160 nativeFilename = QString(
"tex_%1.jpg").arg(
m_uniqueID);
169 "but with a different size has already "
171 .arg(nativeFilename));
189 if (QOpenGLContext::currentContext()) {
191 if (
image.isNull()) {
211 const QString& absoluteFilename) {
223 CVLog::Print(QString(
"[ccMaterial::releaseTexture] Releasing texture '%1'")
232 const QString& absoluteFilename) {
233 if (absoluteFilename.isEmpty()) {
235 "[ccMaterial::loadAndSetTextureMap] filename can't be empty!"));
239 const QString& nativeFilename =
243 "texture map (type=%1): %2")
244 .arg(
static_cast<int>(
type))
245 .arg(nativeFilename));
249 QImage
image(nativeFilename);
250 if (
image.isNull()) {
251 CVLog::Warning(QString(
"[ccMaterial::loadAndSetTextureMap] Failed "
252 "to load image '%1'")
253 .arg(nativeFilename));
264 bool alreadyExists =
false;
265 for (
const QString& existingTex : textureList) {
266 if (existingTex == nativeFilename) {
267 alreadyExists =
true;
269 QString(
"[ccMaterial::loadAndSetTextureMap] Texture file "
270 "'%1' already exists for type %2, skipping "
273 .arg(
static_cast<int>(
type)));
278 if (!alreadyExists) {
279 textureList.push_back(nativeFilename);
281 QString(
"[ccMaterial::loadAndSetTextureMap] Added texture '%1' "
282 "for type %2 (total: %3)")
284 .arg(
static_cast<int>(
type))
285 .arg(textureList.size()));
301 return it->second[0];
313 return std::vector<QString>();
321 std::vector<std::pair<ccMaterial::TextureMapType, QString>>
323 std::vector<std::pair<TextureMapType, QString>>
result;
326 for (
const QString& texPath : pair.second) {
334 if (dataVersion < 20) {
339 QDataStream outStream(&out);
351 if (out.write((
const char*)
m_ambient.
rgba,
sizeof(
float) * 4) < 0)
353 if (out.write((
const char*)
m_specular.
rgba,
sizeof(
float) * 4) < 0)
355 if (out.write((
const char*)
m_emission.
rgba,
sizeof(
float) * 4) < 0)
372 QDataStream inStream(&in);
376 if (dataVersion < 37) {
std::shared_ptr< core::Tensor > image
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 Print(const char *format,...)
Prints out a formatted message in console.
static bool PrintVerbose(const char *format,...)
Prints out a verbose formatted message in console.
Mesh (triangle) material.
TextureMapType
Texture map types for PBR materials.
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.
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)
std::map< TextureMapType, std::vector< QString > > m_textureFilenames
ecvColor::Rgbaf m_diffuseBack
ecvColor::Rgbaf m_specular
void setShininess(float val)
Sets shininess (both front - 100% - and back - 80%)
bool toFile(QFile &out, short dataVersion) const override
void setDiffuseFront(const ecvColor::Rgbaf &color)
Sets diffuse color (front)
static void ReleaseTextures()
Release all texture objects.
ecvColor::Rgbaf m_diffuseFront
void releaseTexture()
Release the texture.
void applyGL(const QOpenGLContext *context, bool lightEnabled, bool skipDiffuse) const
Apply parameters (OpenGL)
void setDiffuseBack(const ecvColor::Rgbaf &color)
Sets diffuse color (back)
std::vector< QString > getTextureFilenames(TextureMapType type) const
Get all texture filenames for a specific map type.
void setTexture(const QImage &image, const QString &absoluteFilename=QString(), bool mirrorImage=false)
Sets texture.
void setShininessFront(float val)
Sets shininess (front)
bool fromFile(QFile &in, short dataVersion, int flags, LoadedIDMap &oldToNewIDMap) override
Loads data from binary stream.
std::vector< std::pair< TextureMapType, QString > > getAllTextureFilenames() const
Get all texture map filenames.
static QImage GetTexture(const QString &absoluteFilename)
Returns the texture image associated to a given name.
ecvColor::Rgbaf m_emission
static void AddTexture(const QImage &image, const QString &absoluteFilename)
Adds a texture to the global texture DB.
void setShininessBack(float val)
Sets shininess (back)
const QImage & getTexture() const
Returns the texture (if any)
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.
const QString & getTextureFilename() const
Returns the texture filename (if any)
QString m_textureFilename
bool loadAndSetTexture(const QString &absoluteFilename)
Loads texture from file (and set it if successful)
ccMaterial(const QString &name=QString("default"))
Default constructor.
ecvColor::Rgbaf m_ambient
void setTransparency(float val)
Sets transparency (all colors)
QMultiMap< unsigned, unsigned > LoadedIDMap
Map of loaded unique IDs (old ID --> new ID)
static bool ReadError()
Sends a custom error message (read error) and returns 'false'.
static bool WriteError()
Sends a custom error message (write error) and returns 'false'.
static QMap< QString, QImage > s_textureDB
CLOUDVIEWER_HOST_DEVICE Pair< First, Second > make_pair(const First &_first, const Second &_second)
std::string toString(T x)
constexpr Rgbaf night(0.00f, 0.00f, 0.00f, 1.00F)
constexpr Rgbaf bright(1.00f, 1.00f, 1.00f, 1.00f)