9 #ifndef hifi_MaterialCache_h
10 #define hifi_MaterialCache_h
12 #include <QtCore/QSharedPointer>
14 #include "glm/glm.hpp"
16 #include <ResourceCache.h>
17 #include <graphics/Material.h>
20 #include <material-networking/TextureCache.h>
22 class NetworkMaterial :
public graphics::Material {
24 using MapChannel = graphics::Material::MapChannel;
26 NetworkMaterial() : _textures(MapChannel::NUM_MAP_CHANNELS) {}
27 NetworkMaterial(
const HFMMaterial& material,
const QUrl& textureBaseUrl);
28 NetworkMaterial(
const NetworkMaterial& material);
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);
40 virtual bool isMissingTexture();
41 virtual bool checkResetOpacityMap();
46 NetworkTexturePointer texture;
48 struct MapChannelHash {
49 std::size_t operator()(MapChannel mapChannel)
const {
50 return static_cast<std::size_t
>(mapChannel);
53 using Textures = std::unordered_map<MapChannel, Texture, MapChannelHash>;
54 Textures getTextures() {
return _textures; }
57 friend class Geometry;
61 static const QString NO_TEXTURE;
62 const QString& getTextureName(MapChannel channel);
64 virtual void setTextures(
const QVariantMap& textureMap);
66 const bool& isOriginal()
const {
return _isOriginal; }
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);
72 Transform _albedoTransform;
74 bool _isOriginal {
true };
78 QUrl getTextureUrl(
const QUrl& baseUrl,
const HFMTexture& hfmTexture);
80 Transform _lightmapTransform;
84 class NetworkMToonMaterial :
public NetworkMaterial {
86 NetworkMToonMaterial() : NetworkMaterial() { _model = VRM_MTOON; }
87 NetworkMToonMaterial(
const HFMMaterial& material,
const QUrl& textureBaseUrl);
88 NetworkMToonMaterial(
const NetworkMToonMaterial& material);
90 void setTextures(
const QVariantMap& textureMap)
override;
92 enum MToonMapChannel {
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,
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,
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,
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,
124 enum OutlineWidthMode {
131 static std::string getOutlineWidthModeName(OutlineWidthMode mode);
133 static bool getOutlineWidthModeFromName(
const std::string& modeName, OutlineWidthMode& mode);
135 bool isMToon()
const override {
return true; }
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);
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); }
146 void setShadingShift(
float shadeShift);
147 float getShadingShift()
const override {
return _shadingShift; }
149 void setShadingToony(
float shadingToony);
150 float getShadingToony()
const override {
return _shadingToony; }
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); }
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); }
158 void setParametricRimFresnelPower(
float parametricRimFresnelPower);
159 float getParametricRimFresnelPower()
const override {
return _parametricRimFresnelPower; }
161 void setParametricRimLift(
float parametricRimLift);
162 float getParametricRimLift()
const override {
return _parametricRimLift; }
164 void setRimLightingMix(
float rimLightingMix);
165 float getRimLightingMix()
const override {
return _rimLightingMix; }
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; }
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); }
182 glm::vec3 _shade { DEFAULT_SHADE };
183 float _shadingShift { DEFAULT_SHADING_SHIFT };
184 float _shadingToony { DEFAULT_SHADING_TOONY };
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 };
192 float _uvAnimationScrollXSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
193 float _uvAnimationScrollYSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
194 float _uvAnimationRotationSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
196 OutlineWidthMode _outlineWidthMode { OutlineWidthMode::OUTLINE_NONE };
197 float _outlineWidth { 0.0f };
198 glm::vec3 _outline { DEFAULT_OUTLINE };
201 class NetworkMaterialResource :
public Resource {
203 NetworkMaterialResource() :
Resource() {}
204 NetworkMaterialResource(
const QUrl& url);
206 QString getType()
const override {
return "NetworkMaterial"; }
210 typedef struct ParsedMaterials {
212 std::vector<std::string> names;
213 std::unordered_map<std::string, std::shared_ptr<NetworkMaterial>> networkMaterials;
218 networkMaterials.clear();
223 ParsedMaterials parsedMaterials;
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());
230 using NetworkMaterialResourcePointer = QSharedPointer<NetworkMaterialResource>;
231 using MaterialMapping = std::vector<std::pair<std::string, NetworkMaterialResourcePointer>>;
232 Q_DECLARE_METATYPE(MaterialMapping)
234 class MaterialCache :
public ResourceCache,
public Dependency {
239 NetworkMaterialResourcePointer getMaterial(
const QUrl& url);
242 virtual QSharedPointer<Resource>
createResource(
const QUrl& url)
override;
243 QSharedPointer<Resource> createResourceCopy(
const QSharedPointer<Resource>& resource)
override;
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