1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright 1996-2023 Cyberbotics Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#ifndef TEXTURE_2D_HPP
#define TEXTURE_2D_HPP
#include "Cache.hpp"
#include "Texture.hpp"
#include <string>
#include <unordered_map>
namespace wren {
class Transform;
// Basic 2d texture which takes its data in BGRA format.
class Texture2d : public Texture {
public:
// Encapsulate memory management
static Texture2d *createTexture2d() { return new Texture2d(); }
// Return an instance if cached, NULL otherwise
static Texture2d *copyFromCache(const std::string &filePath);
static size_t cachedItemCount();
static void printCacheContents();
void setCachePersistency(bool persistent) { mIsCachePersistent = persistent; }
bool isCachePersistent() const { return mIsCachePersistent; }
void setData(const char *data) { mData = data; }
// The file path is used to produce a hash instead of hashing the texture data,
// which can be unbearably slow if there are many/big textures.
// The user must ensure to always provide a file path, otherwise an assert will be triggered.
void setFilePath(const std::string &filePath) { mFilePath.assign(filePath); }
void setup() override;
WrTextureType type() const override { return WR_TEXTURE_TYPE_2D; }
unsigned int glName() const override { return mCacheData ? mCacheData->mGlName : 0; }
private:
static std::unordered_map<cache::Key, cache::Texture2dData> cCache;
Texture2d();
virtual ~Texture2d() {}
void setGlName(unsigned int glName) override { mCacheData->mGlName = glName; };
void prepareGl() override;
void cleanupGl() override;
const void *mData;
std::string mFilePath;
bool mIsCachePersistent;
cache::Key mCacheKey;
cache::Texture2dData *mCacheData;
};
} // namespace wren
#endif // TEXTURE_2D_HPP