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);
39 virtual bool isMissingTexture();
40 virtual bool checkResetOpacityMap();
45 NetworkTexturePointer texture;
47 struct MapChannelHash {
48 std::size_t operator()(MapChannel mapChannel)
const {
49 return static_cast<std::size_t
>(mapChannel);
52 using Textures = std::unordered_map<MapChannel, Texture, MapChannelHash>;
53 Textures getTextures() {
return _textures; }
56 friend class Geometry;
60 static const QString NO_TEXTURE;
61 const QString& getTextureName(MapChannel channel);
63 virtual void setTextures(
const QVariantMap& textureMap);
65 const bool& isOriginal()
const {
return _isOriginal; }
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);
71 Transform _albedoTransform;
73 bool _isOriginal {
true };
77 QUrl getTextureUrl(
const QUrl& baseUrl,
const HFMTexture& hfmTexture);
79 Transform _lightmapTransform;
83 class NetworkMToonMaterial :
public NetworkMaterial {
85 NetworkMToonMaterial() : NetworkMaterial() { _model = VRM_MTOON; }
86 NetworkMToonMaterial(
const HFMMaterial& material,
const QUrl& textureBaseUrl);
87 NetworkMToonMaterial(
const NetworkMToonMaterial& material);
89 void setTextures(
const QVariantMap& textureMap)
override;
91 enum MToonMapChannel {
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,
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,
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,
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,
123 enum OutlineWidthMode {
130 static std::string getOutlineWidthModeName(OutlineWidthMode mode);
132 static bool getOutlineWidthModeFromName(
const std::string& modeName, OutlineWidthMode& mode);
134 bool isMToon()
const override {
return true; }
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);
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); }
145 void setShadingShift(
float shadeShift);
146 float getShadingShift()
const override {
return _shadingShift; }
148 void setShadingToony(
float shadingToony);
149 float getShadingToony()
const override {
return _shadingToony; }
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); }
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); }
157 void setParametricRimFresnelPower(
float parametricRimFresnelPower);
158 float getParametricRimFresnelPower()
const override {
return _parametricRimFresnelPower; }
160 void setParametricRimLift(
float parametricRimLift);
161 float getParametricRimLift()
const override {
return _parametricRimLift; }
163 void setRimLightingMix(
float rimLightingMix);
164 float getRimLightingMix()
const override {
return _rimLightingMix; }
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; }
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); }
181 glm::vec3 _shade { DEFAULT_SHADE };
182 float _shadingShift { DEFAULT_SHADING_SHIFT };
183 float _shadingToony { DEFAULT_SHADING_TOONY };
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 };
191 float _uvAnimationScrollXSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
192 float _uvAnimationScrollYSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
193 float _uvAnimationRotationSpeed { DEFAULT_UV_ANIMATION_SCROLL_SPEED };
195 OutlineWidthMode _outlineWidthMode { OutlineWidthMode::OUTLINE_NONE };
196 float _outlineWidth { 0.0f };
197 glm::vec3 _outline { DEFAULT_OUTLINE };
200 class NetworkMaterialResource :
public Resource {
202 NetworkMaterialResource() :
Resource() {}
203 NetworkMaterialResource(
const QUrl& url);
205 QString getType()
const override {
return "NetworkMaterial"; }
209 typedef struct ParsedMaterials {
211 std::vector<std::string> names;
212 std::unordered_map<std::string, std::shared_ptr<NetworkMaterial>> networkMaterials;
217 networkMaterials.clear();
222 ParsedMaterials parsedMaterials;
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());
229 static bool parseJSONColor(
const QJsonValue& array, glm::vec3& color,
bool& isSRGB);
232 using NetworkMaterialResourcePointer = QSharedPointer<NetworkMaterialResource>;
233 using MaterialMapping = std::vector<std::pair<std::string, NetworkMaterialResourcePointer>>;
234 Q_DECLARE_METATYPE(MaterialMapping)
236 class MaterialCache :
public ResourceCache,
public Dependency {
241 NetworkMaterialResourcePointer getMaterial(
const QUrl& url);
244 virtual QSharedPointer<Resource>
createResource(
const QUrl& url)
override;
245 QSharedPointer<Resource> createResourceCopy(
const QSharedPointer<Resource>& resource)
override;
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