12 #ifndef hifi_TextureCache_h
13 #define hifi_TextureCache_h
15 #include <gpu/Texture.h>
21 #include <QtCore/QSharedPointer>
23 #include <DependencyManager.h>
24 #include <ResourceCache.h>
25 #include <graphics/TextureMap.h>
26 #include <image/ColorChannel.h>
27 #include <image/TextureProcessing.h>
29 #include <TextureMeta.h>
31 #include <gpu/Context.h>
41 gpu::TexturePointer getGPUTexture()
const {
return _textureSource->getGPUTexture(); }
42 gpu::TextureSourcePointer _textureSource;
44 static std::function<gpu::TexturePointer()> getTextureForUUIDOperator(
const QUuid& uuid);
45 static void setUnboundTextureForUUIDOperator(std::function<gpu::TexturePointer(
const QUuid&)> textureForUUIDOperator);
48 static std::function<gpu::TexturePointer(
const QUuid&)> _unboundTextureForUUIDOperator;
60 QString getType()
const override {
return "NetworkTexture"; }
62 int getOriginalWidth()
const {
return _textureSource->getGPUTexture() ? _textureSource->getGPUTexture()->getOriginalWidth() : 0; }
63 int getOriginalHeight()
const {
return _textureSource->getGPUTexture() ? _textureSource->getGPUTexture()->getOriginalHeight() : 0; }
64 int getWidth()
const {
return _textureSource->getGPUTexture() ? _textureSource->getGPUTexture()->getWidth() : 0; }
65 int getHeight()
const {
return _textureSource->getGPUTexture() ? _textureSource->getGPUTexture()->getHeight() : 0; }
66 image::TextureUsage::Type getTextureType()
const {
return _type; }
68 gpu::TexturePointer getFallbackTexture()
const;
72 Q_INVOKABLE
void setOriginalDescriptor(ktx::KTXDescriptor* descriptor) { _originalKtxDescriptor.reset(descriptor); }
74 void setExtra(
void* extra)
override;
77 void networkTextureCreated(
const QWeakPointer<NetworkTexture>&
self);
80 void ktxInitialDataRequestFinished();
81 void ktxMipRequestFinished();
85 void makeLocalRequest();
86 Q_INVOKABLE
void handleLocalRequestCompleted();
92 Q_INVOKABLE
void loadMetaContent(
const QByteArray& content);
93 Q_INVOKABLE
void loadTextureContent(
const QByteArray& content);
95 Q_INVOKABLE
void setImage(gpu::TexturePointer texture,
int originalWidth,
int originalHeight);
96 void setImageOperator(std::function<gpu::TexturePointer()> textureOperator);
98 Q_INVOKABLE
void startRequestForNextMipLevel();
100 void startMipRangeRequest(uint16_t low, uint16_t high);
101 void handleFinishedInitialLoad();
104 friend class KTXReader;
105 friend class ImageReader;
107 image::TextureUsage::Type _type { image::TextureUsage::UNUSED_TEXTURE };
108 image::ColorChannel _sourceChannel;
110 enum class ResourceType {
116 ResourceType _currentlyLoadingResourceType { ResourceType::META };
118 static const uint16_t NULL_MIP_LEVEL;
119 enum KTXResourceState {
120 PENDING_INITIAL_LOAD = 0,
121 LOADING_INITIAL_DATA,
122 WAITING_FOR_MIP_REQUEST,
128 KTXResourceState _ktxResourceState { PENDING_INITIAL_LOAD };
131 std::pair<uint16_t, uint16_t> _ktxMipLevelRangeInFlight{ NULL_MIP_LEVEL, NULL_MIP_LEVEL };
133 ResourceRequest* _ktxHeaderRequest {
nullptr };
134 ResourceRequest* _ktxMipRequest {
nullptr };
135 QByteArray _ktxHeaderData;
136 QByteArray _ktxHighMipData;
138 uint16_t _lowestRequestedMipLevel { NULL_MIP_LEVEL };
139 uint16_t _lowestKnownPopulatedMip { NULL_MIP_LEVEL };
145 ktx::KTXDescriptorPointer _originalKtxDescriptor;
149 int _maxNumPixels { ABSOLUTE_MAX_TEXTURE_NUM_PIXELS };
152 friend class TextureCache;
155 using NetworkTexturePointer = QSharedPointer<NetworkTexture>;
157 Q_DECLARE_METATYPE(QWeakPointer<NetworkTexture>)
160 class TextureCache :
public ResourceCache,
public Dependency {
170 const gpu::TexturePointer& getPermutationNormalTexture();
173 const gpu::TexturePointer& getWhiteTexture();
176 const gpu::TexturePointer& getGrayTexture();
179 const gpu::TexturePointer& getBlueTexture();
182 const gpu::TexturePointer& getBlackTexture();
185 static gpu::TexturePointer getImageTexture(
const QString& path, image::TextureUsage::Type type = image::TextureUsage::DEFAULT_TEXTURE);
188 NetworkTexturePointer getTexture(
const QUrl& url, image::TextureUsage::Type type = image::TextureUsage::DEFAULT_TEXTURE,
189 const QByteArray& content = QByteArray(),
int maxNumPixels = ABSOLUTE_MAX_TEXTURE_NUM_PIXELS,
190 image::ColorChannel sourceChannel = image::ColorChannel::NONE);
192 std::pair<gpu::TexturePointer, glm::ivec2> getTextureByHash(
const std::string& hash);
193 std::pair<gpu::TexturePointer, glm::ivec2> cacheTextureByHash(
const std::string& hash,
const std::pair<gpu::TexturePointer, glm::ivec2>& textureAndSize);
195 NetworkTexturePointer getResourceTexture(
const QUrl& resourceTextureUrl);
196 const gpu::FramebufferPointer& getHmdPreviewFramebuffer(
int width,
int height);
197 const gpu::FramebufferPointer& getSpectatorCameraFramebuffer();
198 const gpu::FramebufferPointer& getSpectatorCameraFramebuffer(
int width,
int height);
199 void updateSpectatorCameraNetworkTexture();
201 NetworkTexturePointer getTextureByUUID(
const QString& uuid);
203 static const int DEFAULT_SPECTATOR_CAM_WIDTH { 2048 };
204 static const int DEFAULT_SPECTATOR_CAM_HEIGHT { 1024 };
206 void setGPUContext(
const gpu::ContextPointer& context) { _gpuContext = context; }
207 gpu::ContextPointer getGPUContext()
const {
return _gpuContext; }
210 void spectatorCameraFramebufferReset();
215 Q_INVOKABLE
ScriptableResource* prefetch(
const QUrl& url,
int type,
int maxNumPixels = ABSOLUTE_MAX_TEXTURE_NUM_PIXELS, image::ColorChannel sourceChannel = image::ColorChannel::NONE);
217 virtual QSharedPointer<Resource>
createResource(
const QUrl& url)
override;
218 QSharedPointer<Resource> createResourceCopy(
const QSharedPointer<Resource>& resource)
override;
221 friend class ImageReader;
223 friend class DilatableNetworkTexture;
224 friend class TextureCacheScriptingInterface;
227 virtual ~TextureCache();
229 static const std::string KTX_DIRNAME;
230 static const std::string KTX_EXT;
232 gpu::ContextPointer _gpuContext {
nullptr };
234 std::shared_ptr<cache::FileCache> _ktxCache { std::make_shared<KTXCache>(KTX_DIRNAME, KTX_EXT) };
237 std::unordered_map<std::string, std::pair<std::weak_ptr<gpu::Texture>, glm::ivec2>> _texturesByHashes;
238 std::mutex _texturesByHashesMutex;
240 gpu::TexturePointer _permutationNormalTexture;
241 gpu::TexturePointer _whiteTexture;
242 gpu::TexturePointer _grayTexture;
243 gpu::TexturePointer _blueTexture;
244 gpu::TexturePointer _blackTexture;
246 NetworkTexturePointer _spectatorCameraNetworkTexture;
247 gpu::FramebufferPointer _spectatorCameraFramebuffer;
249 NetworkTexturePointer _hmdPreviewNetworkTexture;
250 gpu::FramebufferPointer _hmdPreviewFramebuffer;
A texture loaded from the network.
Definition: material-networking/src/material-networking/TextureCache.h:52
virtual Q_INVOKABLE void downloadFinished(const QByteArray &data) override
Definition: material-networking/src/material-networking/TextureCache.cpp:1058
void makeRequest() override
Definition: material-networking/src/material-networking/TextureCache.cpp:533
bool handleFailedRequest(ResourceRequest::Result result) override
Return true if the resource will be retried.
Definition: material-networking/src/material-networking/TextureCache.cpp:676
void refresh() override
Refreshes the resource.
Definition: material-networking/src/material-networking/TextureCache.cpp:1146
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
Wrapper to expose resources to JS/QML.
Definition: ResourceCache.h:91
A simple object wrapper for an OpenGL texture.
Definition: material-networking/src/material-networking/TextureCache.h:39