Mercurial > projects > mde
view mde/gl/texture.d @ 62:960206198cbd
Documentation changes only. (Idea for new gui.content.Items module; unused gl.texture module commented out.)
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Fri, 27 Jun 2008 17:19:46 +0100 |
parents | f3d8c0441408 |
children |
line wrap: on
line source
/* LICENSE BLOCK Part of mde: a Modular D game-oriented Engine Copyright © 2007-2008 Diggory Hardy This program 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. This program 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 this program. If not, see <http://www.gnu.org/licenses/>. */ /++ This module is unused and untested. The main reason being using glBindTexture to use multiple textures isn't working for me. --- /** Simple module for loading images. */ module mde.resource.image; import mde.resource.exception; import tango.std.stringz; import derelict.sdl.sdl; import derelict.sdl.image; import derelict.opengl.gl; /// The usual texture.... alias Texture!(GL_TEXTURE_2D) Texture2D; /** Represents a texture. */ class Texture(TARGET) { static assert (TARGET == GL_TEXTURE_1D || TARGET == GL_TEXTURE_2D || TARGET == GL_TEXTURE_3D || TARGET == GL_TEXTURE_CUBE_MAP); /** Create a new Texture. * * The Texture is not associated with an OpenGL texture name until load is called. * * Params: * components = The number of components per pixel, 3 (RGB) or 4 (RGBA), or 0 in which case * components is derived from the image loaded. */ this (ubyte components) { components_ = components; } /// Free the texture ID. ~this () { glDeleteTextures(1, &texID); } /// Bind as current opengl texture. void bind () { assert (texID != 0, "No texture loaded yet!"); glBindTexture (TARGET, texID); } /// Load from a file void load (char[] file) { static assert (TARGET == GL_TEXTURE_2D); // no other support assert (texID == 0, "Texture already loaded."); glGenTextures (1, &texID); bind; SDL_Surface* image; image = IMG_Load (toStringz(file)); if (image is null) throw new ImageException ("Unable to load "~file); // SDL_Surfaces sometimes need locking... really just for spec compliance: assert (!SDL_MUSTLOCK(image), "Didn't expect to have to lock a surface loaded from a file; no locks used!"); GLenum format; if (image.format.BytesPerPixel == 3) format = GL_RGB; else if (image.format.BytesPerPixel == 4) format = GL_RGBA; else throw new ImageException ("Only 8-bit-per-channel RGB/RGBA images are supported"); // Assume format is RGB(A); i.e. don't bother checking what // image.format.[RGBA]mask/shift/loss are. if (components_ == 0) components_ = image.format.BytesPerPixel; if (image.pitch != image.w) throw new ImageException ("pitch != width; this is unsupported"); glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glPixelStorei (GL_UNPACK_ROW_LENGTH, 0); glTexImage2D(TARGET, 0, components_, w, h, 0, format, GL_UNSIGNED_BYTE, image.pixels); SDL_FreeSurface (image); } int width () { return w; } int height () { return h; } /// 3 for RGB, 4 for RGBA, 0 if no image loaded and format will be derived from the image. ubyte components () { return components_; } private { int w, h; // size ubyte components_ = 0; // 3 for RGB, 4 for RGBA uint texID = 0; } } --- +/