forked from NatronGitHub/Natron
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Texture.h
175 lines (143 loc) · 4.67 KB
/
Texture.h
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
/* ***** BEGIN LICENSE BLOCK *****
* This file is part of Natron <https://natrongithub.github.io/>,
* (C) 2018-2021 The Natron developers
* (C) 2013-2018 INRIA and Alexandre Gauthier-Foichat
*
* Natron is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* Natron is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Natron. If not, see <http://www.gnu.org/licenses/gpl-2.0.html>
* ***** END LICENSE BLOCK ***** */
#ifndef NATRON_GUI_TEXTURE_H
#define NATRON_GUI_TEXTURE_H
// ***** BEGIN PYTHON BLOCK *****
// from <https://docs.python.org/3/c-api/intro.html#include-files>:
// "Since Python may define some pre-processor definitions which affect the standard headers on some systems, you must include Python.h before any standard headers are included."
#include <Python.h>
// ***** END PYTHON BLOCK *****
#include "Global/Macros.h"
#include "Global/GlobalDefines.h"
#include "Engine/TextureRect.h"
#include "Engine/EngineFwd.h"
#include "Global/GLIncludes.h"
NATRON_NAMESPACE_ENTER
class Texture
{
public:
enum DataTypeEnum
{
eDataTypeNone,
eDataTypeByte,
eDataTypeFloat,
eDataTypeUShort,
eDataTypeHalf,
};
Texture(U32 target,
int minFilter,
int magFilter,
int clamp,
DataTypeEnum type,
int format,
int internalFormat,
int glType);
static void getRecommendedTexParametersForRGBAByteTexture(int* format, int* internalFormat, int* glType);
static void getRecommendedTexParametersForRGBAFloatTexture(int* format, int* internalFormat, int* glType);
U32 getTexID() const
{
return _texID;
}
int getTexTarget() const
{
return _target;
}
int w() const
{
return _textureRect.width();
}
int h() const
{
return _textureRect.height();
}
/**
* @brief The bitdepth of the texture
**/
DataTypeEnum type() const
{
return _type;
}
std::size_t getDataSizeOf() const
{
switch (_type) {
case eDataTypeByte:
return sizeof(unsigned char);
case eDataTypeFloat:
return sizeof(float);
case eDataTypeHalf:
// Fixme when we support half
return sizeof(float);
case eDataTypeNone:
default:
return 0;
}
}
/**
* @brief Returns the size occupied by this texture in bytes
**/
std::size_t getSize() const
{
// textures are always RGBA for now.
return _textureRect.area() * getDataSizeOf() * 4;
}
/*
* @brief Ensures that the texture is of size texRect and of the given type
* @returns True if something changed, false otherwise
* Note: Internally this function calls glTexImage2D to reallocate the texture buffer
* @param originalRAMBuffer Optional pointer to a mapped PBO for asynchronous texture upload
*/
bool ensureTextureHasSize(const TextureRect& texRect, const unsigned char* originalRAMBuffer);
/**
* @brief Update the texture with the currently bound PBO across the given rectangle.
* @param texRect The bounds of the texture, if the texture does not match these bounds, it will be reallocated
* using ensureTextureHasSize(texRect,type)/
* @param roi if updateOnlyRoi is true, this will be the portion of the texture to update with glTexSubImage2D
* @param updateOnlyRoI if updateOnlyRoi is true, only the portion defined by roi will be updated on the texture
**/
void fillOrAllocateTexture(const TextureRect & texRect, const RectI& roi, bool updateOnlyRoi, const unsigned char* originalRAMBuffer);
/**
* @brief The bounds of the texture
**/
const TextureRect & getTextureRect() const
{
return _textureRect;
}
int getFormat() const
{
return _format;
}
int getInternalFormat() const
{
return _internalFormat;
}
int getGLType() const
{
return _glType;
}
virtual ~Texture();
private:
U32 _texID;
U32 _target;
int _minFilter, _magFilter, _clamp;
int _internalFormat, _format, _glType;
TextureRect _textureRect;
DataTypeEnum _type;
};
NATRON_NAMESPACE_EXIT
#endif /* defined(NATRON_GUI_TEXTURE_H_) */