Overte C++ Documentation
ProceduralMaterialCache.h
1 //
2 // Created by Sam Gondelman on 2/9/2018
3 // Copyright 2018 High Fidelity, Inc.
4 // Copyright 2024 Overte e.V.
5 //
6 // Distributed under the Apache License, Version 2.0.
7 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
8 //
9 #ifndef hifi_MaterialCache_h
10 #define hifi_MaterialCache_h
11 
12 #include <QtCore/QSharedPointer>
13 
14 #include "glm/glm.hpp"
15 
16 #include <ResourceCache.h>
17 #include <graphics/Material.h>
18 #include <hfm/HFM.h>
19 
20 #include <material-networking/TextureCache.h>
21 
22 class NetworkMaterial : public graphics::Material {
23 public:
24  using MapChannel = graphics::Material::MapChannel;
25 
26  NetworkMaterial() : _textures(MapChannel::NUM_MAP_CHANNELS) {}
27  NetworkMaterial(const HFMMaterial& material, const QUrl& textureBaseUrl);
28  NetworkMaterial(const NetworkMaterial& material);
29 
30  void setAlbedoMap(const QUrl& url, bool useAlphaChannel);
31  void setNormalMap(const QUrl& url, bool isBumpmap);
32  void setRoughnessMap(const QUrl& url, bool isGloss);
33  void setMetallicMap(const QUrl& url, bool isSpecular);
34  void setOcclusionMap(const QUrl& url);
35  void setEmissiveMap(const QUrl& url);
36  void setScatteringMap(const QUrl& url);
37  void setLightMap(const QUrl& url);
38 
39  virtual bool isMissingTexture();
40  virtual bool checkResetOpacityMap();
41 
42  class Texture {
43  public:
44  QString name;
45  NetworkTexturePointer texture;
46  };
47  struct MapChannelHash {
48  std::size_t operator()(MapChannel mapChannel) const {
49  return static_cast<std::size_t>(mapChannel);
50  }
51  };
52  using Textures = std::unordered_map<MapChannel, Texture, MapChannelHash>;
53  Textures getTextures() { return _textures; }
54 
55 protected:
56  friend class Geometry;
57 
58  Textures _textures;
59 
60  static const QString NO_TEXTURE;
61  const QString& getTextureName(MapChannel channel);
62 
63  virtual void setTextures(const QVariantMap& textureMap);
64 
65  const bool& isOriginal() const { return _isOriginal; }
66 
67  graphics::TextureMapPointer fetchTextureMap(const QUrl& baseUrl, const HFMTexture& hfmTexture,
68  image::TextureUsage::Type type, MapChannel channel);
69  graphics::TextureMapPointer fetchTextureMap(const QUrl& url, image::TextureUsage::Type type, MapChannel channel);
70 
71  Transform _albedoTransform;
72 
73  bool _isOriginal { true };
74 
75 private:
76  // Helpers for the ctors
77  QUrl getTextureUrl(const QUrl& baseUrl, const HFMTexture& hfmTexture);
78 
79  Transform _lightmapTransform;
80  vec2 _lightmapParams;
81 };
82 
83 class NetworkMToonMaterial : public NetworkMaterial {
84 public:
85  NetworkMToonMaterial() : NetworkMaterial() { _model = VRM_MTOON; }
86  NetworkMToonMaterial(const HFMMaterial& material, const QUrl& textureBaseUrl);
87  NetworkMToonMaterial(const NetworkMToonMaterial& material);
88 
89  void setTextures(const QVariantMap& textureMap) override;
90 
91  enum MToonMapChannel {
92  // Keep aligned with graphics/ShaderConstants.h and graphics-scripting/ScriptableModel.cpp
93  SHADE_MAP = MapChannel::ROUGHNESS_MAP,
94  SHADING_SHIFT_MAP = MapChannel::METALLIC_MAP,
95  MATCAP_MAP = MapChannel::OCCLUSION_MAP,
96  RIM_MAP = MapChannel::SCATTERING_MAP,
97  UV_ANIMATION_MASK_MAP = MapChannel::LIGHT_MAP,
98  };
99 
100  enum MToonFlagBit {
101  // Must match mappings in GraphicsScriptingInterface.cpp
102  SHADE_MAP_BIT = graphics::MaterialKey::FlagBit::ROUGHNESS_MAP_BIT,
103  SHADING_SHIFT_MAP_BIT = graphics::MaterialKey::FlagBit::METALLIC_MAP_BIT,
104  MATCAP_MAP_BIT = graphics::MaterialKey::FlagBit::OCCLUSION_MAP_BIT,
105  RIM_MAP_BIT = graphics::MaterialKey::FlagBit::SCATTERING_MAP_BIT,
106  UV_ANIMATION_MASK_MAP_BIT = graphics::MaterialKey::FlagBit::LIGHT_MAP_BIT,
107 
108  SHADE_VAL_BIT = graphics::MaterialKey::FlagBit::UNLIT_VAL_BIT,
109  SHADING_SHIFT_VAL_BIT = graphics::MaterialKey::FlagBit::METALLIC_VAL_BIT,
110  SHADING_TOONY_VAL_BIT = graphics::MaterialKey::FlagBit::GLOSSY_VAL_BIT,
111  UV_ANIMATION_SCROLL_VAL_BIT = graphics::MaterialKey::FlagBit::SCATTERING_VAL_BIT,
112  MATCAP_VAL_BIT = graphics::MaterialKey::FlagBit::EXTRA_1_BIT,
113  PARAMETRIC_RIM_VAL_BIT = graphics::MaterialKey::FlagBit::EXTRA_2_BIT,
114  PARAMETRIC_RIM_POWER_VAL_BIT = graphics::MaterialKey::FlagBit::EXTRA_3_BIT,
115  PARAMETRIC_RIM_LIFT_VAL_BIT = graphics::MaterialKey::FlagBit::EXTRA_4_BIT,
116  RIM_LIGHTING_MIX_VAL_BIT = graphics::MaterialKey::FlagBit::EXTRA_5_BIT,
117 
118  OUTLINE_WIDTH_MODE_VAL_BIT = graphics::Material::ExtraFlagBit::EXTRA_1_BIT,
119  OUTLINE_WIDTH_VAL_BIT = graphics::Material::ExtraFlagBit::EXTRA_2_BIT,
120  OUTLINE_VAL_BIT = graphics::Material::ExtraFlagBit::EXTRA_3_BIT,
121  };
122 
123  enum OutlineWidthMode {
124  OUTLINE_NONE = 0,
125  OUTLINE_WORLD,
126  OUTLINE_SCREEN,
127 
128  NUM_OUTLINE_MODES
129  };
130  static std::string getOutlineWidthModeName(OutlineWidthMode mode);
131  // find the enum value from a string, return true if match found
132  static bool getOutlineWidthModeFromName(const std::string& modeName, OutlineWidthMode& mode);
133 
134  bool isMToon() const override { return true; }
135 
136  void setShadeMap(const QUrl& url);
137  void setShadingShiftMap(const QUrl& url);
138  void setMatcapMap(const QUrl& url);
139  void setRimMap(const QUrl& url);
140  void setUVAnimationMaskMap(const QUrl& url);
141 
142  void setShade(const glm::vec3& shade, bool isSRGB = true);
143  glm::vec3 getShade(bool SRGB = true) const override { return (SRGB ? ColorUtils::tosRGBVec3(_shade) : _shade); }
144 
145  void setShadingShift(float shadeShift);
146  float getShadingShift() const override { return _shadingShift; }
147 
148  void setShadingToony(float shadingToony);
149  float getShadingToony() const override { return _shadingToony; }
150 
151  void setMatcap(const glm::vec3& matcap, bool isSRGB = true);
152  glm::vec3 getMatcap(bool SRGB = true) const override { return (SRGB ? ColorUtils::tosRGBVec3(_matcap) : _matcap); }
153 
154  void setParametricRim(const glm::vec3& parametricRim, bool isSRGB = true);
155  glm::vec3 getParametricRim(bool SRGB = true) const override { return (SRGB ? ColorUtils::tosRGBVec3(_parametricRim) : _parametricRim); }
156 
157  void setParametricRimFresnelPower(float parametricRimFresnelPower);
158  float getParametricRimFresnelPower() const override { return _parametricRimFresnelPower; }
159 
160  void setParametricRimLift(float parametricRimLift);
161  float getParametricRimLift() const override { return _parametricRimLift; }
162 
163  void setRimLightingMix(float rimLightingMix);
164  float getRimLightingMix() const override { return _rimLightingMix; }
165 
166  void setUVAnimationScrollXSpeed(float uvAnimationScrollXSpeed);
167  float getUVAnimationScrollXSpeed() const override { return _uvAnimationScrollXSpeed; }
168  void setUVAnimationScrollYSpeed(float uvAnimationScrollYSpeed);
169  float getUVAnimationScrollYSpeed() const override { return _uvAnimationScrollYSpeed; }
170  void setUVAnimationRotationSpeed(float uvAnimationRotationSpeed);
171  float getUVAnimationRotationSpeed() const override { return _uvAnimationRotationSpeed; }
172 
173  void setOutlineWidthMode(OutlineWidthMode mode);
174  uint8_t getOutlineWidthMode() override { return _outlineWidthMode; }
175  void setOutlineWidth(float width);
176  float getOutlineWidth() override { return _outlineWidth; }
177  void setOutline(const glm::vec3& outline, bool isSRGB = true);
178  glm::vec3 getOutline(bool SRGB = true) const override { return (SRGB ? ColorUtils::tosRGBVec3(_outline) : _outline); }
179 
180 private:
181  glm::vec3 _shade { DEFAULT_SHADE };
182  float _shadingShift { DEFAULT_SHADING_SHIFT };
183  float _shadingToony { DEFAULT_SHADING_TOONY };
184 
185  glm::vec3 _matcap { DEFAULT_MATCAP };
186  glm::vec3 _parametricRim { DEFAULT_PARAMETRIC_RIM };
187  float _parametricRimFresnelPower { DEFAULT_PARAMETRIC_RIM_FRESNEL_POWER };
188  float _parametricRimLift { DEFAULT_PARAMETRIC_RIM_LIFT };
189  float _rimLightingMix { DEFAULT_RIM_LIGHTING_MIX };
190 
191  float _uvAnimationScrollXSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
192  float _uvAnimationScrollYSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
193  float _uvAnimationRotationSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
194 
195  OutlineWidthMode _outlineWidthMode { OutlineWidthMode::OUTLINE_NONE };
196  float _outlineWidth { 0.0f };
197  glm::vec3 _outline { DEFAULT_OUTLINE };
198 };
199 
200 class NetworkMaterialResource : public Resource {
201 public:
202  NetworkMaterialResource() : Resource() {}
203  NetworkMaterialResource(const QUrl& url);
204 
205  QString getType() const override { return "NetworkMaterial"; }
206 
207  virtual void downloadFinished(const QByteArray& data) override;
208 
209  typedef struct ParsedMaterials {
210  uint version { 1 };
211  std::vector<std::string> names;
212  std::unordered_map<std::string, std::shared_ptr<NetworkMaterial>> networkMaterials;
213 
214  void reset() {
215  version = 1;
216  names.clear();
217  networkMaterials.clear();
218  }
219 
220  } ParsedMaterials;
221 
222  ParsedMaterials parsedMaterials;
223 
224  static ParsedMaterials parseJSONMaterials(const QJsonDocument& materialJSON, const QUrl& baseUrl);
225  static ParsedMaterials parseMaterialForUUID(const QJsonValue& entityIDJSON);
226  static std::pair<std::string, std::shared_ptr<NetworkMaterial>> parseJSONMaterial(const QJsonValue& materialJSONValue, const QUrl& baseUrl = QUrl());
227 
228 private:
229  static bool parseJSONColor(const QJsonValue& array, glm::vec3& color, bool& isSRGB);
230 };
231 
232 using NetworkMaterialResourcePointer = QSharedPointer<NetworkMaterialResource>;
233 using MaterialMapping = std::vector<std::pair<std::string, NetworkMaterialResourcePointer>>;
234 Q_DECLARE_METATYPE(MaterialMapping)
235 
236 class MaterialCache : public ResourceCache, public Dependency {
237  Q_OBJECT
238  SINGLETON_DEPENDENCY
239 
240 public:
241  NetworkMaterialResourcePointer getMaterial(const QUrl& url);
242 
243 protected:
244  virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
245  QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;
246 };
247 
248 #endif
Base class for resource caches.
Definition: ResourceCache.h:196
virtual QSharedPointer< Resource > createResource(const QUrl &url)=0
Creates a new resource.
Base class for resources.
Definition: ResourceCache.h:409
virtual void downloadFinished(const QByteArray &data)
Definition: ResourceCache.h:513
A simple object wrapper for an OpenGL texture.
Definition: material-networking/src/material-networking/TextureCache.h:39
A texture map.
Definition: HFM.h:132