diff --git a/src/main/kotlin/Game.kt b/src/main/kotlin/Game.kt index 9265021..0049340 100644 --- a/src/main/kotlin/Game.kt +++ b/src/main/kotlin/Game.kt @@ -18,6 +18,9 @@ import com.badlogic.gdx.math.* import com.badlogic.gdx.utils.Array import com.badlogic.gdx.utils.ScreenUtils import gay.pizza.CavesOfJolk.Resources.Companion.assetManager +import ktx.math.times +import org.lwjgl.system.MathUtil +import kotlin.random.Random class Game: ApplicationAdapter() { @@ -37,6 +40,7 @@ class Game: ApplicationAdapter() private lateinit var cubeInstance: ModelInstance private lateinit var floorInstance: ModelInstance private lateinit var suzanneInstance: ModelInstance + private lateinit var rocks: kotlin.Array private fun makeCube(texture: Texture): Model { @@ -122,7 +126,6 @@ class Game: ApplicationAdapter() texJolk = assetManager.get("jolkmeup.jpg") fntComic = assetManager.get("Comic Sans MS.ttf") - val suzanne = assetManager.get("suzanne.g3db", Model::class.java) cube = makeCube(texJolk) floor = makeFloor() @@ -168,7 +171,30 @@ class Game: ApplicationAdapter() cubeInstance = ModelInstance(cube) floorInstance = ModelInstance(floor) - suzanneInstance = ModelInstance(suzanne) + suzanneInstance = ModelInstance(assetManager.get("suzanne.g3db", Model::class.java)) + val rock = assetManager.get("rock.g3db", Model::class.java) + val rand = RandomXS128(69 + 420 + 1919 + 916 + 42 + 911) + val randQuaternion = { rand: RandomXS128 -> + var x: Float + var y: Float + var z: Float + do { x = rand.nextFloat(-1.0f, 1.0f); y = rand.nextFloat(-1.0f, 1.0f); z = x * x + y * y } while (z > 1.0f) + var u: Float + var v: Float + var w: Float + do { u = rand.nextFloat(-1.0f, 1.0f); v = rand.nextFloat(-1.0f, 1.0f); w = u * u + v * v } while (w > 1.0f) + val s = kotlin.math.sqrt((1.0f - z) / w) + Quaternion(x, y, s * u, s * v) + } + rocks = Array(50) { i-> + ModelInstance(rock, Matrix4( + Vector3( + rand.nextFloat(16.0f), + rand.nextFloat(-0.75f, 0.125f), + -rand.nextFloat(16.0f)), + randQuaternion(rand), + Util.one * rand.nextFloat(0.6f, 1.2f))) + } suzanneInstance.transform = Matrix4().translate(3.0f, 1.0f, -3.5f) } @@ -227,6 +253,7 @@ class Game: ApplicationAdapter() modelBatch.begin(colin.camera) modelBatch.render(floorInstance, env) + modelBatch.render(rocks.asIterable(), env) modelBatch.render(cubeInstance, env) modelBatch.render(suzanneInstance, env) modelBatch.end() diff --git a/src/main/kotlin/Resources.kt b/src/main/kotlin/Resources.kt index d2b82ac..e015459 100644 --- a/src/main/kotlin/Resources.kt +++ b/src/main/kotlin/Resources.kt @@ -49,6 +49,7 @@ class Resources private constructor() assetManager.load("cobblestone.png", Texture::class.java, linearMipped) assetManager.load("cobblestone_normal.png", Texture::class.java, linearMipped) assetManager.load("cobblestone_specular.png", Texture::class.java, linearMipped) + assetManager.load("rock.g3db", Model::class.java) } } diff --git a/src/main/kotlin/Util.kt b/src/main/kotlin/Util.kt index 2f4588f..7e15b83 100644 --- a/src/main/kotlin/Util.kt +++ b/src/main/kotlin/Util.kt @@ -11,6 +11,7 @@ import ktx.math.times import ktx.math.unaryMinus import org.hsluv.HUSLColorConverter import kotlin.math.pow +import kotlin.random.Random fun Float.axisDeadzone(min: Float, max: Float): Float { @@ -72,3 +73,5 @@ fun Color.mix(rhs: Color, x: Float) = Color( //FIXME: find some way to get rid of these warnings @Suppress("EXTENSION_SHADOWED_BY_MEMBER", "UNCHECKED_CAST") fun Attributes.get(type: Long) = get(type) as? T + +fun Random.nextFloat(min: Float, max: Float) = min + nextFloat() * (max - min) diff --git a/src/main/resources/rock.g3db b/src/main/resources/rock.g3db new file mode 100644 index 0000000..2e1ab12 Binary files /dev/null and b/src/main/resources/rock.g3db differ diff --git a/src/main/resources/rock.png b/src/main/resources/rock.png new file mode 100644 index 0000000..33a66c1 Binary files /dev/null and b/src/main/resources/rock.png differ diff --git a/src/main/resources/rocknorm.png b/src/main/resources/rocknorm.png new file mode 100644 index 0000000..2c32637 Binary files /dev/null and b/src/main/resources/rocknorm.png differ