Simple material with static colors

Introduced properties

fun ambient_color: Array[Float]

gamnit :: SmoothMaterial :: ambient_color

Ambient color, always visible
fun ambient_color=(ambient_color: Array[Float])

gamnit :: SmoothMaterial :: ambient_color=

Ambient color, always visible
init defaultinit(ambient_color: Array[Float], diffuse_color: Array[Float], specular_color: Array[Float])

gamnit :: SmoothMaterial :: defaultinit

fun diffuse_color: Array[Float]

gamnit :: SmoothMaterial :: diffuse_color

Diffuse color when covered by a light source
fun diffuse_color=(diffuse_color: Array[Float])

gamnit :: SmoothMaterial :: diffuse_color=

Diffuse color when covered by a light source
fun specular_color: Array[Float]

gamnit :: SmoothMaterial :: specular_color

Specular color affecting reflections
fun specular_color=(specular_color: Array[Float])

gamnit :: SmoothMaterial :: specular_color=

Specular color affecting reflections

Redefined properties

redef type SELF: SmoothMaterial

gamnit $ SmoothMaterial :: SELF

Type of this instance, automatically specialized in every class
redef fun draw(actor: Actor, model: LeafModel, camera: Camera)

gamnit $ SmoothMaterial :: draw

Draw a model from actor

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
fun ambient_color: Array[Float]

gamnit :: SmoothMaterial :: ambient_color

Ambient color, always visible
fun ambient_color=(ambient_color: Array[Float])

gamnit :: SmoothMaterial :: ambient_color=

Ambient color, always visible
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.
init defaultinit(ambient_color: Array[Float], diffuse_color: Array[Float], specular_color: Array[Float])

gamnit :: SmoothMaterial :: defaultinit

fun diffuse_color: Array[Float]

gamnit :: SmoothMaterial :: diffuse_color

Diffuse color when covered by a light source
fun diffuse_color=(diffuse_color: Array[Float])

gamnit :: SmoothMaterial :: diffuse_color=

Diffuse color when covered by a light source
fun draw(actor: Actor, model: LeafModel, camera: Camera)

gamnit :: Material :: draw

Draw a model from actor
protected fun draw_depth(actor: Actor, model: LeafModel, camera: Camera)

gamnit :: Material :: draw_depth

Optimized draw of model, a part of actor, from the view of camera
protected fun draw_selection(actor: Actor, model: LeafModel, id: Int)

gamnit :: Material :: draw_selection

Draw actor to selection values
fun get_class: CLASS

core :: Object :: get_class

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

core :: Object :: hash

The hash code of the object.
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.
init new: Material

gamnit :: Material :: new

Get the default blueish material
intern fun object_id: Int

core :: Object :: object_id

An internal hash code for the object based on its identity.
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 serialization_hash: Int

core :: Object :: serialization_hash

Hash value use for serialization
fun specular_color: Array[Float]

gamnit :: SmoothMaterial :: specular_color

Specular color affecting reflections
fun specular_color=(specular_color: Array[Float])

gamnit :: SmoothMaterial :: specular_color=

Specular color affecting reflections
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_s: String

core :: Object :: to_s

User readable representation of self.
package_diagram gamnit::SmoothMaterial SmoothMaterial gamnit::Material Material gamnit::SmoothMaterial->gamnit::Material core::Object Object gamnit::Material->core::Object ...core::Object ... ...core::Object->core::Object gamnit::TexturedMaterial TexturedMaterial gamnit::TexturedMaterial->gamnit::SmoothMaterial

Ancestors

interface Object

core :: Object

The root of the class hierarchy.

Parents

abstract class Material

gamnit :: Material

Material for models, or how to draw the model

Children

class TexturedMaterial

gamnit :: TexturedMaterial

Material with potential diffuse_texture and specular_texture

Class definitions

gamnit $ SmoothMaterial
# Simple material with static colors
class SmoothMaterial
	super Material

	# Ambient color, always visible
	#
	# The RGB values should be premultiplied by the alpha value.
	var ambient_color: Array[Float] is writable

	# Diffuse color when covered by a light source
	#
	# The RGB values should be premultiplied by the alpha value.
	var diffuse_color: Array[Float] is writable

	# Specular color affecting reflections
	#
	# The RGB values should be premultiplied by the alpha value.
	var specular_color: Array[Float] is writable

	redef fun draw(actor, model, camera)
	do
		var program = app.blinn_phong_program
		program.use
		program.mvp.uniform camera.mvp_matrix

		var mesh = model.mesh

		# Actor specs
		glDisableVertexAttribArray program.translation.location
		glDisableVertexAttribArray program.scale.location

		program.translation.uniform(actor.center.x, actor.center.y, actor.center.z, 0.0)
		program.scale.uniform actor.scale
		program.alpha.uniform actor.alpha
		program.rotation = new Matrix.gamnit_euler_rotation(actor.pitch, actor.yaw, actor.roll)

		# From mesh
		program.coord.array_enabled = true
		program.coord.array(mesh.vertices, 3)

		program.normal.array_enabled = true
		program.normal.array(mesh.normals, 3)

		# No textures
		program.use_map_ambient.uniform false
		program.use_map_diffuse.uniform false
		program.use_map_specular.uniform false
		program.tex_coord.array_enabled = false

		# Camera
		program.camera.uniform(camera.position.x, camera.position.y, camera.position.z)

		# Colors from the material
		program.ambient_color.uniform(ambient_color[0], ambient_color[1],
		                              ambient_color[2], ambient_color[3])
		program.diffuse_color.uniform(diffuse_color[0], diffuse_color[1],
		                              diffuse_color[2], diffuse_color[3])
		program.specular_color.uniform(specular_color[0], specular_color[1],
		                               specular_color[2], specular_color[3])

		setup_lights(camera, program)

		# Execute draw
		if mesh.indices.is_empty then
			glDrawArrays(mesh.draw_mode, 0, mesh.vertices.length/3)
		else
			glDrawElements(mesh.draw_mode, mesh.indices.length, gl_UNSIGNED_SHORT, mesh.indices_c.native_array)
		end

		assert glGetError == gl_NO_ERROR
	end

	private fun setup_lights(camera: Camera, program: BlinnPhongProgram)
	do
		# TODO use a list of lights

		# Light, for Lambert and Blinn-Phong
		var light = app.light
		if light isa ParallelLight then
			program.light_kind.uniform 1

			# Vector parallel to the light source
			program.light_center.uniform(
				-light.pitch.sin * light.yaw.sin,
				light.pitch.cos,
				-light.yaw.cos)
		else if light isa PointLight then
			program.light_kind.uniform 2

			# Position of the light source
			program.light_center.uniform(app.light.position.x, app.light.position.y, app.light.position.z)
		else
			program.light_kind.uniform 0
		end

		# Draw projected shadows?
		if not light isa LightCastingShadows or not app.shadow_depth_texture_available then
			program.use_shadows.uniform false
			return
		else program.use_shadows.uniform true

		# Light point of view
		program.light_mvp.uniform light.camera.mvp_matrix

		# Depth texture
		glActiveTexture gl_TEXTURE4
		glBindTexture(gl_TEXTURE_2D, app.shadow_context.depth_texture)
		program.depth_texture.uniform 4
		program.depth_texture_size.uniform app.shadow_resolution.to_f
		program.depth_texture_taps.uniform 2 # TODO make configurable
	end
end
lib/gamnit/depth/more_materials.nit:31,1--142,3