X-Git-Url: http://nitlanguage.org diff --git a/lib/gamnit/textures.nit b/lib/gamnit/textures.nit index 04efeb1..415aa90 100644 --- a/lib/gamnit/textures.nit +++ b/lib/gamnit/textures.nit @@ -23,24 +23,6 @@ abstract class Texture # Prepare a texture located at `path` within the `assets` folder new (path: Text) do return new GamnitAssetTexture(path.to_s) - # Prepare and load a colorful small texture of 2x2 pixels - new checker - do - var pixels = [0xFFu8, 0x00u8, 0x00u8, - 0x00u8, 0xFFu8, 0x00u8, - 0x00u8, 0x00u8, 0xFFu8, - 0xFFu8, 0xFFu8, 0xFFu8] - var cpixels = new CByteArray.from(pixels) - - var tex = new GamnitRootTexture - tex.width = 2.0 - tex.height = 2.0 - tex.load_from_pixels(cpixels.native_array, 2, 2, gl_RGB) - - cpixels.destroy - return tex - end - # Root texture of which `self` is derived fun root: GamnitRootTexture is abstract @@ -57,34 +39,48 @@ abstract class Texture var error: nullable Error = null # OpenGL handle to this texture - var gl_texture: Int is noinit + fun gl_texture: Int do return root.gl_texture # Prepare a subtexture from this texture fun subtexture(left, top, width, height: Numeric): GamnitSubtexture do - # We want only floats - left = left.to_f - top = top.to_f - width = width.to_f - height = height.to_f - # Setup the subtexture - var subtex = new GamnitSubtexture(root) - subtex.width = width - subtex.height = height - - subtex.offset_left = offset_left + left / root.width - subtex.offset_top = offset_top + top / root.height - subtex.offset_right = offset_left + width / root.width - subtex.offset_bottom = offset_top + height / root.height - + var subtex = new GamnitSubtexture(root, self, left.to_f, top.to_f, width.to_f, height.to_f) return subtex end - private fun offset_left: Float do return 0.0 - private fun offset_top: Float do return 0.0 - private fun offset_right: Float do return 1.0 - private fun offset_bottom: Float do return 1.0 + # Offset of the left border on `root` from 0.0 to 1.0 + fun offset_left: Float do return 0.0 + + # Offset of the top border on `root` from 0.0 to 1.0 + fun offset_top: Float do return 0.0 + + # Offset of the right border on `root` from 0.0 to 1.0 + fun offset_right: Float do return 1.0 + + # Offset of the bottom border on `root` from 0.0 to 1.0 + fun offset_bottom: Float do return 1.0 +end + +# Colorful small texture of 2x2 pixels +class CheckerTexture + super GamnitRootTexture + + redef fun load(force) + do + var pixels = [0xFFu8, 0x00u8, 0x00u8, + 0x00u8, 0xFFu8, 0x00u8, + 0x00u8, 0x00u8, 0xFFu8, + 0xFFu8, 0xFFu8, 0xFFu8] + + var cpixels = new CByteArray.from(pixels) + + width = 2.0 + height = 2.0 + load_from_pixels(cpixels.native_array, 2, 2, gl_RGB) + + cpixels.destroy + end end # Texture with its own pixels @@ -96,6 +92,8 @@ class GamnitRootTexture # Has this texture been loaded yet? var loaded = false + redef var gl_texture = -1 + init do all_root_textures.add self private fun load_from_pixels(pixels: Pointer, width, height: Int, format: GLPixelFormat) @@ -113,16 +111,23 @@ class GamnitRootTexture glBindTexture(gl_TEXTURE_2D, tex) glTexImage2D(gl_TEXTURE_2D, 0, format, width, height, 0, format, gl_UNSIGNED_BYTE, pixels) - # TODO make these settings attributes of the class - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_NEAREST) - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, gl_NEAREST) - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_S, gl_REPEAT) - glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_WRAP_T, gl_REPEAT) - glHint(gl_GENERATE_MIPMAP_HINT, gl_NICEST) glGenerateMipmap(gl_TEXTURE_2D) end + # Set whether this texture should be pixelated when drawn, otherwise it is interpolated + fun pixelated=(pixelated: Bool) + do + # TODO this service could be made available in `Texture` when using + # the kind of texture wrapper of gles v2 or maybe 3 + + glBindTexture(gl_TEXTURE_2D, gl_texture) + + var param = if pixelated then gl_NEAREST else gl_LINEAR + glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, param) + glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MAG_FILTER, param) + end + # Has this resource been deleted? var deleted = false @@ -167,16 +172,32 @@ class GamnitSubtexture redef var root + # Parent texture, from which this texture was created + var parent: Texture + + # Left border of this texture compared to `parent` + var left: Float + + # Top border of this texture compared to `parent` + var top: Float + + private fun set_wh(width, height: Float) + is autoinit do + self.width = width + self.height = height + end + redef fun load(force) do root.load(force) - redef var offset_left = 0.0 - redef var offset_top = 0.0 - redef var offset_right = 1.0 - redef var offset_bottom = 1.0 + redef var offset_left = parent.offset_left + left / root.width is lazy + redef var offset_top = parent.offset_top + top / root.height is lazy + redef var offset_right = offset_left + width / root.width is lazy + redef var offset_bottom = offset_top + height / root.height is lazy end redef class Sys - private var all_root_textures = new TextureSet + # All declared root textures + var all_root_textures = new TextureSet end # Group of `Texture`