1
1

texture.d 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342
  1. // Written in the D programming language.
  2. /**
  3. Copyright: Copyright Felix 'Zoadian' Hufnagel 2014-.
  4. License: $(WEB http://www.gnu.org/licenses/lgpl.html, LGPLv3).
  5. Authors: $(WEB zoadian.de, Felix 'Zoadian' Hufnagel)
  6. */
  7. module three.gl.texture;
  8. import derelict.opengl3.gl3;
  9. import three.gl.util;
  10. //==============================================================================
  11. enum TextureTarget : GLenum {
  12. Texture1D = GL_TEXTURE_1D,
  13. Texture2D = GL_TEXTURE_2D,
  14. Texture3D = GL_TEXTURE_3D,
  15. Texture1DArray = GL_TEXTURE_1D_ARRAY,
  16. Texture2DArray = GL_TEXTURE_2D_ARRAY,
  17. TextureRectangle = GL_TEXTURE_RECTANGLE,
  18. TextureCubeMap = GL_TEXTURE_CUBE_MAP,
  19. TextureCubeMapArray = GL_TEXTURE_CUBE_MAP_ARRAY,
  20. TextureBuffer = GL_TEXTURE_BUFFER,
  21. Texture2DMultisample = GL_TEXTURE_2D_MULTISAMPLE,
  22. Texture2DMultisampleArray = GL_TEXTURE_2D_MULTISAMPLE_ARRAY,
  23. //~ CubeMapPositiveX = GL_TEXTURE_CUBE_MAP_POSITIVE_X,
  24. //~ CubeMapNegativeX = GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
  25. //~ CubeMapPositiveY = GL_TEXTURE_CUBE_MAP_POSITIVE_Y,
  26. //~ CubeMapNegativeY = GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
  27. //~ CubeMapPositiveZ = GL_TEXTURE_CUBE_MAP_POSITIVE_Z,
  28. //~ CubeMapNegativeZ = GL_TEXTURE_CUBE_MAP_NEGATIVE_Z,
  29. }
  30. //==============================================================================
  31. static struct TextureUnit(size_t locationIdx, TextureTarget textureTarget) {
  32. @disable this();
  33. @disable this(this);
  34. public:
  35. static void makeActive() {
  36. check!glActiveTexture(GL_TEXTURE0 + locationIdx);
  37. }
  38. static void bindTexture(Texture texture) {
  39. glBindTexture(textureTarget, texture._id);
  40. }
  41. static void unbindTexture() {
  42. glBindTexture(textureTarget, 0);
  43. }
  44. public:
  45. version(OpenGL4) {
  46. @property void depthStencilTextureMode(StencilTextureMode opt) {
  47. glTexParameteri(textureTarget, GL_DEPTH_STENCIL_TEXTURE_MODE, opt);
  48. }
  49. @property StencilTextureMode depthStencilTextureMode(Target target) {
  50. StencilTextureMode opt;
  51. glGetTexParameteri(textureTarget, GL_DEPTH_STENCIL_TEXTURE_MODE, &opt);
  52. return opt;
  53. }
  54. }
  55. @property void baseLevel(int opt) {
  56. glTexParameteri(textureTarget, GL_TEXTURE_BASE_LEVEL, opt);
  57. }
  58. @property int baseLevel() {
  59. int opt;
  60. glGetTexParameteriv(textureTarget, GL_TEXTURE_BASE_LEVEL, &opt);
  61. return opt;
  62. }
  63. @property void borderColor(Color color) {
  64. glTexParameterfv(textureTarget, GL_TEXTURE_BORDER_COLOR, color.data.ptr);
  65. }
  66. @property Color borderColor() {
  67. Color color;
  68. glGetTexParameterfv(textureTarget, GL_TEXTURE_BORDER_COLOR, color.data.ptr);
  69. return color;
  70. }
  71. @property void compareFunction(CompareFunction opt) {
  72. glTexParameteri(textureTarget, GL_TEXTURE_COMPARE_FUNC, opt);
  73. }
  74. @property CompareFunction compareFunction() {
  75. CompareFunction opt;
  76. glGetTexParameteriv(textureTarget, GL_TEXTURE_COMPARE_FUNC, cast(int*)&opt);
  77. return opt;
  78. }
  79. @property void compareMode(CompareMode opt) {
  80. glTexParameteri(textureTarget, GL_TEXTURE_COMPARE_MODE, opt);
  81. }
  82. @property int compareMode() {
  83. CompareMode opt;
  84. glGetTexParameteriv(textureTarget, GL_TEXTURE_COMPARE_MODE, cast(int*)&opt);
  85. return opt;
  86. }
  87. @property void lodBias(float opt) {
  88. glTexParameterf(textureTarget, GL_TEXTURE_LOD_BIAS, opt);
  89. }
  90. @property float lodBias() {
  91. float opt;
  92. glGetTexParameteriv(textureTarget, GL_TEXTURE_LOD_BIAS, cast(int*)&opt);
  93. return opt;
  94. }
  95. @property void minFilter(MinFilter opt) {
  96. glTexParameteri(textureTarget, GL_TEXTURE_MIN_FILTER, opt);
  97. }
  98. @property MinFilter minFilter() {
  99. MinFilter opt;
  100. glGetTexParameteriv(textureTarget, GL_TEXTURE_MIN_FILTER, cast(int*)&opt);
  101. return opt;
  102. }
  103. @property void magFilter(MagFilter opt) {
  104. glTexParameteri(textureTarget, GL_TEXTURE_MAG_FILTER, opt);
  105. }
  106. @property MagFilter magFilter() {
  107. MagFilter opt;
  108. glGetTexParameteriv(textureTarget, GL_TEXTURE_MAG_FILTER, cast(int*)&opt);
  109. return opt;
  110. }
  111. @property void minLod(int opt) {
  112. glTexParameteri(textureTarget, GL_TEXTURE_MIN_LOD, opt);
  113. }
  114. @property int minLod() {
  115. int opt;
  116. glGetTexParameteriv(textureTarget, GL_TEXTURE_MIN_LOD, cast(int*)&opt);
  117. return opt;
  118. }
  119. @property void maxLod(int opt) {
  120. glTexParameteri(textureTarget, GL_TEXTURE_MAX_LOD, opt);
  121. }
  122. @property int maxLod() {
  123. int opt;
  124. glGetTexParameteriv(textureTarget, GL_TEXTURE_MAX_LOD, cast(int*)&opt);
  125. return opt;
  126. }
  127. @property void maxLevel(int opt) {
  128. glTexParameteri(textureTarget, GL_TEXTURE_MAX_LEVEL, opt);
  129. }
  130. @property int maxLevel() {
  131. int opt;
  132. glGetTexParameteriv(textureTarget, GL_TEXTURE_MAX_LEVEL, cast(int*)&opt);
  133. return opt;
  134. }
  135. void setSwizzle(Swizzle r, Swizzle g, Swizzle b, Swizzle a) {
  136. glTexParameteri(textureTarget, GL_TEXTURE_SWIZZLE_R, r);
  137. glTexParameteri(textureTarget, GL_TEXTURE_SWIZZLE_G, g);
  138. glTexParameteri(textureTarget, GL_TEXTURE_SWIZZLE_B, b);
  139. glTexParameteri(textureTarget, GL_TEXTURE_SWIZZLE_A, a);
  140. }
  141. void getSwizzle(out Swizzle r, out Swizzle g, out Swizzle b, out Swizzle a) {
  142. glGetTexParameteriv(textureTarget, GL_TEXTURE_SWIZZLE_R, cast(int*)&r);
  143. glGetTexParameteriv(textureTarget, GL_TEXTURE_SWIZZLE_G, cast(int*)&g);
  144. glGetTexParameteriv(textureTarget, GL_TEXTURE_SWIZZLE_B, cast(int*)&b);
  145. glGetTexParameteriv(textureTarget, GL_TEXTURE_SWIZZLE_A, cast(int*)&a);
  146. }
  147. @property void swizzle(Swizzle rgba) {
  148. glTexParameteri(textureTarget, GL_TEXTURE_SWIZZLE_RGBA, rgba);
  149. }
  150. @property Swizzle swizzle() {
  151. Swizzle rgba;
  152. glGetTexParameteriv(textureTarget, GL_TEXTURE_SWIZZLE_R, cast(int*)&rgba);
  153. return rgba;
  154. }
  155. void setWrap(Wrap s, Wrap t, Wrap r) {
  156. glTexParameteri(textureTarget, GL_TEXTURE_WRAP_S, s);
  157. glTexParameteri(textureTarget, GL_TEXTURE_WRAP_T, t);
  158. glTexParameteri(textureTarget, GL_TEXTURE_WRAP_R, r);
  159. }
  160. void getWrap(out Wrap s, out Wrap t, out Wrap r) {
  161. glGetTexParameteriv(textureTarget, GL_TEXTURE_WRAP_S, cast(int*)&s);
  162. glGetTexParameteriv(textureTarget, GL_TEXTURE_WRAP_T, cast(int*)&t);
  163. glGetTexParameteriv(textureTarget, GL_TEXTURE_WRAP_R, cast(int*)&r);
  164. }
  165. }
  166. private void _isTextureUnit(T...)(TextureUnit!(T) t) {}
  167. enum isTextureUnit(T) = is(typeof(_isTextureUnit(T.init)));
  168. //==============================================================================
  169. version(OpenGL4){
  170. enum StencilTextureMode : GLenum {
  171. DepthComponent = GL_DEPTH_COMPONENT,
  172. //TODO: StencilComponent = GL_STENCIL_COMPONENT
  173. }
  174. }
  175. //==============================================================================
  176. enum CompareFunction : GLenum {
  177. LessOrEqual = GL_LEQUAL,
  178. GreaterOrEqual = GL_GEQUAL,
  179. Less = GL_LESS,
  180. Greater = GL_GREATER,
  181. Equal = GL_EQUAL,
  182. NotEqual = GL_NOTEQUAL,
  183. Always = GL_ALWAYS,
  184. Never = GL_NEVER
  185. }
  186. //==============================================================================
  187. enum CompareMode : GLenum {
  188. CompareRefToTexture = GL_COMPARE_REF_TO_TEXTURE,
  189. None = GL_NONE
  190. }
  191. //==============================================================================
  192. enum MinFilter : GLenum {
  193. Nearest = GL_NEAREST,
  194. Linear = GL_LINEAR,
  195. NearestMipmapNearest = GL_NEAREST_MIPMAP_NEAREST,
  196. LinearMipmapNearest = GL_LINEAR_MIPMAP_NEAREST,
  197. NearestMipmapLinear = GL_NEAREST_MIPMAP_LINEAR,
  198. LinearMipmapLinear = GL_LINEAR_MIPMAP_LINEAR
  199. }
  200. //==============================================================================
  201. enum MagFilter : GLenum {
  202. Nearest = GL_NEAREST,
  203. Linear = GL_LINEAR
  204. }
  205. //==============================================================================
  206. enum Swizzle : GLenum {
  207. Red = GL_RED,
  208. Green = GL_GREEN,
  209. Blue = GL_BLUE,
  210. Alpha = GL_ALPHA,
  211. Zero = GL_ZERO,
  212. One = GL_ONE
  213. }
  214. //==============================================================================
  215. enum Wrap : GLenum {
  216. ClampToEdge = GL_CLAMP_TO_EDGE,
  217. ClampToBorder = GL_CLAMP_TO_BORDER,
  218. MirroredRepeat = GL_MIRRORED_REPEAT,
  219. Repeat = GL_REPEAT
  220. }
  221. //==============================================================================
  222. enum TextureFormat : GLenum {
  223. Red = GL_RED,
  224. RG = GL_RG,
  225. RBG = GL_RGB,
  226. BGR = GL_BGR,
  227. RGBA = GL_RGBA,
  228. BGRA = GL_BGRA,
  229. DepthComponent = GL_DEPTH_COMPONENT,
  230. StencilIndex = GL_STENCIL_INDEX,
  231. }
  232. //==============================================================================
  233. enum TextureType : GLenum {
  234. UByte = GL_UNSIGNED_BYTE,
  235. Byte = GL_BYTE,
  236. UShort = GL_UNSIGNED_SHORT,
  237. Short = GL_SHORT,
  238. UInt = GL_UNSIGNED_INT,
  239. Int = GL_INT,
  240. Float = GL_FLOAT,
  241. //GL_UNSIGNED_BYTE_3_3_2,
  242. //GL_UNSIGNED_BYTE_2_3_3_REV,
  243. //GL_UNSIGNED_SHORT_5_6_5,
  244. //GL_UNSIGNED_SHORT_5_6_5_REV,
  245. //GL_UNSIGNED_SHORT_4_4_4_4,
  246. //GL_UNSIGNED_SHORT_4_4_4_4_REV,
  247. //GL_UNSIGNED_SHORT_5_5_5_1,
  248. //GL_UNSIGNED_SHORT_1_5_5_5_REV,
  249. //GL_UNSIGNED_INT_8_8_8_8,
  250. //GL_UNSIGNED_INT_8_8_8_8_REV,
  251. //GL_UNSIGNED_INT_10_10_10_2,
  252. //GL_UNSIGNED_INT_2_10_10_10_REV,
  253. }
  254. //==============================================================================
  255. ///
  256. final class Texture(TextureFormat FORMAT, TextureType TYPE) {
  257. private:
  258. uint _id;
  259. public:
  260. ///
  261. this() {
  262. check!glGenTextures(1, &this._id);
  263. }
  264. ///
  265. ~this() {
  266. check!glDeleteTextures(1, &this._id);
  267. }
  268. public:
  269. ///
  270. @property bool isValid() const @safe nothrow {
  271. return (this._id > 0);
  272. }
  273. }
  274. private void _isTexture(T...)(Texture!(T) t) {}
  275. enum isTexture(T) = is(typeof(_isTexture(T.init)));