Texture with its own pixel data

Introduced properties

fun delete

gamnit :: RootTexture :: delete

Delete this texture and free all its resources
fun deleted: Bool

gamnit :: RootTexture :: deleted

Has this resource been deleted?
protected fun deleted=(deleted: Bool)

gamnit :: RootTexture :: deleted=

Has this resource been deleted?
protected fun gl_texture=(gl_texture: Int)

gamnit :: RootTexture :: gl_texture=

fun loaded: Bool

gamnit :: RootTexture :: loaded

Has this texture been loaded yet?
protected fun loaded=(loaded: Bool)

gamnit :: RootTexture :: loaded=

Has this texture been loaded yet?
fun premultiply_alpha: Bool

gamnit :: RootTexture :: premultiply_alpha

Should the pixels RGB values be premultiplied by their alpha value at loading?
fun premultiply_alpha=(premultiply_alpha: Bool)

gamnit :: RootTexture :: premultiply_alpha=

Should the pixels RGB values be premultiplied by their alpha value at loading?

Redefined properties

redef type SELF: RootTexture

gamnit $ RootTexture :: SELF

Type of this instance, automatically specialized in every class
redef fun gl_texture: Int

gamnit $ RootTexture :: gl_texture

OpenGL handle to this texture
redef init init

gamnit $ RootTexture :: init

redef fun root: RootTexture

gamnit $ RootTexture :: root

Root texture from which self is derived

All properties

fun !=(other: nullable Object): Bool

core :: Object :: !=

Have self and other different values?
fun ==(other: nullable Object): Bool

core :: Object :: ==

Have self and other the same value?
type CLASS: Class[SELF]

core :: Object :: CLASS

The type of the class of self.
type SELF: Object

core :: Object :: SELF

Type of this instance, automatically specialized in every class
protected fun class_factory(name: String): CLASS

core :: Object :: class_factory

Implementation used by get_class to create the specific class.
fun class_name: String

core :: Object :: class_name

The class name of the object.
fun delete

gamnit :: RootTexture :: delete

Delete this texture and free all its resources
fun deleted: Bool

gamnit :: RootTexture :: deleted

Has this resource been deleted?
protected fun deleted=(deleted: Bool)

gamnit :: RootTexture :: deleted=

Has this resource been deleted?
fun error: nullable Error

gamnit :: Texture :: error

Last error on this texture
protected fun error=(error: nullable Error)

gamnit :: Texture :: error=

Last error on this texture
fun get_class: CLASS

core :: Object :: get_class

The meta-object representing the dynamic type of self.
fun gl_texture: Int

gamnit :: Texture :: gl_texture

OpenGL handle to this texture
protected fun gl_texture=(gl_texture: Int)

gamnit :: RootTexture :: gl_texture=

fun hash: Int

core :: Object :: hash

The hash code of the object.
fun height: Float

gamnit :: Texture :: height

Height in pixels of this texture
protected fun height=(height: Float)

gamnit :: Texture :: height=

Height in pixels of this texture
init init

core :: Object :: init

fun inspect: String

core :: Object :: inspect

Developer readable representation of self.
protected fun inspect_head: String

core :: Object :: inspect_head

Return "CLASSNAME:#OBJECTID".
intern fun is_same_instance(other: nullable Object): Bool

core :: Object :: is_same_instance

Return true if self and other are the same instance (i.e. same identity).
fun is_same_serialized(other: nullable Object): Bool

core :: Object :: is_same_serialized

Is self the same as other in a serialization context?
intern fun is_same_type(other: Object): Bool

core :: Object :: is_same_type

Return true if self and other have the same dynamic type.
fun load(force: nullable Bool)

gamnit :: Texture :: load

Load this texture, force reloading it if force
fun loaded: Bool

gamnit :: RootTexture :: loaded

Has this texture been loaded yet?
protected fun loaded=(loaded: Bool)

gamnit :: RootTexture :: loaded=

Has this texture been loaded yet?
init new(path: Text): Texture

gamnit :: Texture :: new

Prepare a texture located at path within the assets folder
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
fun offset_bottom: Float

gamnit :: Texture :: offset_bottom

Offset of the bottom border on root from 0.0 to 1.0
fun offset_left: Float

gamnit :: Texture :: offset_left

Offset of the left border on root from 0.0 to 1.0
fun offset_right: Float

gamnit :: Texture :: offset_right

Offset of the right border on root from 0.0 to 1.0
fun offset_top: Float

gamnit :: Texture :: offset_top

Offset of the top border on root from 0.0 to 1.0
fun output

core :: Object :: output

Display self on stdout (debug only).
intern fun output_class_name

core :: Object :: output_class_name

Display class name on stdout (debug only).
fun pixelated=(pixelated: Bool)

gamnit :: Texture :: pixelated=

Should this texture be drawn pixelated when magnified? otherwise it is interpolated
fun premultiply_alpha: Bool

gamnit :: RootTexture :: premultiply_alpha

Should the pixels RGB values be premultiplied by their alpha value at loading?
fun premultiply_alpha=(premultiply_alpha: Bool)

gamnit :: RootTexture :: premultiply_alpha=

Should the pixels RGB values be premultiplied by their alpha value at loading?
abstract fun root: RootTexture

gamnit :: Texture :: root

Root texture from which self is derived
fun serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
fun subtexture(left: Numeric, top: Numeric, width: Numeric, height: Numeric): Subtexture

gamnit :: Texture :: subtexture

Prepare a subtexture from this texture, from the given pixel offsets
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
fun to_animation(fps: Float, x: Int, y: Int): Animation

gamnit :: Texture :: to_animation

Convert to a sprite animation at fps speed with x or y frames
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
fun width: Float

gamnit :: Texture :: width

Width in pixels of this texture
protected fun width=(width: Float)

gamnit :: Texture :: width=

Width in pixels of this texture
package_diagram gamnit::RootTexture RootTexture gamnit::Texture Texture gamnit::RootTexture->gamnit::Texture core::Object Object gamnit::Texture->core::Object ...core::Object ... ...core::Object->core::Object gamnit::CheckerTexture CheckerTexture gamnit::CheckerTexture->gamnit::RootTexture gamnit::CustomTexture CustomTexture gamnit::CustomTexture->gamnit::RootTexture gamnit::TextureAsset TextureAsset gamnit::TextureAsset->gamnit::RootTexture

Ancestors

interface Object

core :: Object

The root of the class hierarchy.

Parents

abstract class Texture

gamnit :: Texture

Texture composed of pixels, loaded from the assets folder by default

Children

class CheckerTexture

gamnit :: CheckerTexture

Colorful small texture of 32x32 pixels by default
class CustomTexture

gamnit :: CustomTexture

Custom texture with pixel values filled programmatically
class TextureAsset

gamnit :: TextureAsset

Texture loaded from the assets folder

Class definitions

gamnit $ RootTexture
# Texture with its own pixel data
class RootTexture
	super Texture

	redef fun root do return self

	# Has this texture been loaded yet?
	var loaded = false

	redef var gl_texture = -1

	init do all_root_textures.add self

	# Should the pixels RGB values be premultiplied by their alpha value at loading?
	#
	# All gamnit textures must have premultiplied alpha, it provides a better
	# alpha blending, avoids artifacts and allows for additive blending.
	#
	# When at `true`, the default, pixels RGB values are premultiplied
	# at loading. Set to `false` if pixels RGB values are already
	# premultiplied in the source data.
	#
	# This value must be set before calling `load`.
	var premultiply_alpha = true is writable

	private fun load_from_pixels(pixels: Pointer, width, height: Int, format: GLPixelFormat)
	do
		var max_texture_size = glGetIntegerv(gl_MAX_TEXTURE_SIZE, 0)
		if width > max_texture_size then
			error = new Error("Texture width larger than gl_MAX_TEXTURE_SIZE ({max_texture_size}) in {self} at {width}")
			return
		else if height > max_texture_size then
			error = new Error("Texture height larger than gl_MAX_TEXTURE_SIZE ({max_texture_size}) in {self} at {height}")
			return
		end

		# Premultiply alpha?
		if premultiply_alpha and format == gl_RGBA then
			pixels.premultiply_alpha(width, height)
		end

		glPixelStorei(gl_UNPACK_ALIGNEMENT, 1)
		var tex = glGenTextures(1)[0]
		gl_texture = tex

		glBindTexture(gl_TEXTURE_2D, tex)
		glTexImage2D(gl_TEXTURE_2D, 0, format, width, height, 0, format, gl_UNSIGNED_BYTE, pixels)

		glHint(gl_GENERATE_MIPMAP_HINT, gl_NICEST)
		glGenerateMipmap(gl_TEXTURE_2D)
		glTexParameteri(gl_TEXTURE_2D, gl_TEXTURE_MIN_FILTER, gl_LINEAR_MIPMAP_LINEAR)

		glBindTexture(gl_TEXTURE_2D, 0)
	end

	private fun load_checker(size: Int)
	do
		var cpixels = new CByteArray(3*size*size)

		var i = 0
		for x in [0..size[ do
			var quadrant_x = if x < size/2 then 0 else 1
			for y in [0..size[ do
				var quadrant_y = if y < size/2 then 0 else 1
				var color = if quadrant_x == quadrant_y then
					[0u8, 0u8, 0u8, 255u8]
				else [255u8, 255u8, 255u8, 255u8]

				for j in [0..3[ do cpixels[i+j] = color[j]
				i += 3
			end
		end

		width = size.to_f
		height = size.to_f
		load_from_pixels(cpixels.native_array, size, size, gl_RGB)

		cpixels.destroy
	end

	# Has this resource been deleted?
	var deleted = false

	# Delete this texture and free all its resources
	#
	# Use caution with this service as the subtextures may rely on the deleted data.
	fun delete
	do
		if deleted or not loaded then return

		deleted = true
	end
end
lib/gamnit/textures.nit:217,1--309,3