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