1 /** 2 Copyright: Copyright (c) 2013-2018 Andrey Penechko. 3 License: $(WEB boost.org/LICENSE_1_0.txt, Boost License 1.0). 4 Authors: Andrey Penechko. 5 */ 6 7 module voxelman.graphics.texture; 8 9 import std.conv, std.file; 10 import std.stdio; 11 import std.string; 12 13 import voxelman.graphics.gl; 14 import dlib.image.image : SuperImage; 15 16 //version = debugTexture; 17 18 enum TextureTarget : uint 19 { 20 target1d = GL_TEXTURE_1D, 21 target2d = GL_TEXTURE_2D, 22 target3d = GL_TEXTURE_3D, 23 targetRectangle = GL_TEXTURE_RECTANGLE, 24 targetBuffer = GL_TEXTURE_BUFFER, 25 targetCubeMap = GL_TEXTURE_CUBE_MAP, 26 target1dArray = GL_TEXTURE_1D_ARRAY, 27 target2dArray = GL_TEXTURE_2D_ARRAY, 28 //targetCubeMapArray = GL_TEXTURE_CUBE_MAP_ARRAY, 29 //target2dMultisample = GL_TEXTURE_2D_MULTISAMPLE, 30 //target2dMultisampleArray = GL_TEXTURE_2D_MULTISAMPLE_ARRAY, 31 } 32 33 enum TextureFormat : uint 34 { 35 r = GL_RED, 36 rg = GL_RG, 37 rgb = GL_RGB, 38 rgba = GL_RGBA, 39 } 40 41 class Texture 42 { 43 private: 44 TextureFormat texFormat; 45 uint glTextureHandle; 46 TextureTarget texTarget; 47 48 public: 49 this(TextureTarget target, TextureFormat format) 50 { 51 texTarget = target; 52 texFormat = format; 53 checkgl!glGenTextures(1, &glTextureHandle); 54 } 55 56 this(SuperImage image, TextureTarget target, TextureFormat format) 57 { 58 texTarget = target; 59 texFormat = format; 60 checkgl!glGenTextures(1, &glTextureHandle); 61 loadFromImage(image); 62 } 63 64 void bind(uint textureUnit = 0) 65 { 66 checkgl!glActiveTexture(GL_TEXTURE0 + textureUnit); 67 checkgl!glBindTexture(texTarget, glTextureHandle); 68 } 69 70 void unbind() 71 { 72 checkgl!glBindTexture(texTarget, 0); 73 } 74 75 static void unbind(TextureTarget target) 76 { 77 checkgl!glBindTexture(target, 0); 78 } 79 80 void loadFromImage(SuperImage img) 81 { 82 bind(); 83 checkgl!glTexImage2D(texTarget, 0, texFormat, img.width, img.height, 0, texFormat, GL_UNSIGNED_BYTE, null); 84 checkgl!glTexImage2D(texTarget, 0, texFormat, img.width, img.height, 0, texFormat, GL_UNSIGNED_BYTE, img.data.ptr); 85 checkgl!glTexParameteri(texTarget, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 86 checkgl!glTexParameteri(texTarget, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 87 unbind(); 88 } 89 90 void unload() 91 { 92 checkgl!glDeleteTextures(1, &glTextureHandle); 93 } 94 }