Direct translation of Ken Perlin's improved noise Java implementation

This implementation differs from PerlinNoise on two main points. This noise is calculated for a 3D point, vs 2D in PerlinNoise. PerlinNoise is based off a customizable seed, while this noise has a static data source.

Introduced properties

fun noise(x: Float, y: Float, z: Float): Float

noise :: ImprovedNoise :: noise

Noise value in [-1..1] at 3D coordinates x, y, z

Redefined properties

redef type SELF: ImprovedNoise

noise $ ImprovedNoise :: SELF

Type of this instance, automatically specialized in every class
redef fun core_serialize_to(v: Serializer)

noise $ ImprovedNoise :: core_serialize_to

Actual serialization of self to serializer
redef init from_deserializer(v: Deserializer)

noise $ ImprovedNoise :: from_deserializer

Create an instance of this class from the deserializer

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 accept_json_serializer(v: JsonSerializer)

serialization :: Serializable :: accept_json_serializer

Refinable service to customize the serialization of this class to JSON
protected fun accept_msgpack_attribute_counter(v: AttributeCounter)

serialization :: Serializable :: accept_msgpack_attribute_counter

Hook to customize the behavior of the AttributeCounter
protected fun accept_msgpack_serializer(v: MsgPackSerializer)

serialization :: Serializable :: accept_msgpack_serializer

Hook to customize the serialization of this class to MessagePack
protected fun add_to_bundle(bundle: NativeBundle, key: JavaString)

serialization :: Serializable :: add_to_bundle

Called by []= to dynamically choose the appropriate method according
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 core_serialize_to(serializer: Serializer)

serialization :: Serializable :: core_serialize_to

Actual serialization of self to serializer
init from_deserializer(deserializer: Deserializer)

serialization :: Serializable :: from_deserializer

Create an instance of this class from the deserializer
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.
protected fun msgpack_extra_array_items: Int

serialization :: Serializable :: msgpack_extra_array_items

Hook to request a larger than usual metadata array
fun noise(x: Float, y: Float, z: Float): Float

noise :: ImprovedNoise :: noise

Noise value in [-1..1] at 3D coordinates x, y, z
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 serialize_msgpack(plain: nullable Bool): Bytes

serialization :: Serializable :: serialize_msgpack

Serialize self to MessagePack bytes
fun serialize_to(serializer: Serializer)

serialization :: Serializable :: serialize_to

Serialize self to serializer
fun serialize_to_json(plain: nullable Bool, pretty: nullable Bool): String

serialization :: Serializable :: serialize_to_json

Serialize self to JSON
intern fun sys: Sys

core :: Object :: sys

Return the global sys object, the only instance of the Sys class.
fun to_json: String

serialization :: Serializable :: to_json

Serialize self to plain JSON
abstract fun to_jvalue(env: JniEnv): JValue

core :: Object :: to_jvalue

fun to_pretty_json: String

serialization :: Serializable :: to_pretty_json

Serialize self to plain pretty JSON
fun to_s: String

core :: Object :: to_s

User readable representation of self.
package_diagram noise::ImprovedNoise ImprovedNoise serialization::Serializable Serializable noise::ImprovedNoise->serialization::Serializable core::Object Object serialization::Serializable->core::Object ...core::Object ... ...core::Object->core::Object

Ancestors

interface Object

core :: Object

The root of the class hierarchy.

Parents

interface Serializable

serialization :: Serializable

Instances of this class can be passed to Serializer::serialize

Class definitions

noise $ ImprovedNoise
# Direct translation of Ken Perlin's improved noise Java implementation
#
# This implementation differs from `PerlinNoise` on two main points.
# This noise is calculated for a 3D point, vs 2D in `PerlinNoise`.
# `PerlinNoise` is based off a customizable seed, while this noise has a static data source.
class ImprovedNoise

	# Permutations
	private var p: Array[Int] = [151,160,137,91,90,15,
		131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23,
		190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33,
		88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166,
		77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244,
		102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196,
		135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123,
		5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42,
		223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9,
		129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228,
		251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107,
		49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254,
		138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180] * 2

	# Noise value in [-1..1] at 3D coordinates `x, y, z`
	fun noise(x, y, z: Float): Float
	do
		var xx = x.floor.to_i & 255
		var yy = y.floor.to_i & 255
		var zz = z.floor.to_i & 255

		x -= x.floor
		y -= y.floor
		z -= z.floor

		var u = x.fade
		var v = y.fade
		var w = z.fade

		var a  = p[xx  ] + yy
		var aa = p[a   ] + zz
		var ab = p[a+1 ] + zz
		var b  = p[xx+1] + yy
		var ba = p[b   ] + zz
		var bb = p[b+1 ] + zz

		return w.lerp(v.lerp(u.lerp(grad(p[aa  ], x,     y,     z    ),
		                            grad(p[ba  ], x-1.0, y,     z    )),
		                     u.lerp(grad(p[ab  ], x,     y-1.0, z    ),
		                            grad(p[bb  ], x-1.0, y-1.0, z    ))),
                      v.lerp(u.lerp(grad(p[aa+1], x,     y,     z-1.0),
		                            grad(p[ba+1], x-1.0, y,     z-1.0)),
		                     u.lerp(grad(p[ab+1], x,     y-1.0, z-1.0),
		                            grad(p[bb+1], x-1.0, y-1.0, z-1.0))))
	end

	# Value at a corner of the grid
	private fun grad(hash: Int, x, y, z: Float): Float
	do
		var h = hash & 15
		var u = if h < 8 then x else y
		var v = if h < 4 then y else if h == 12 or h == 14 then x else z
		return (if h.is_even then u else -u) + (if h & 2 == 0 then v else -v)
	end
end
lib/noise/noise.nit:368,1--430,3