texture.d 9.9 KB

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