diff options
Diffstat (limited to 'src/main/kotlin')
| -rw-r--r-- | src/main/kotlin/Terrain.kt | 62 | ||||
| -rw-r--r-- | src/main/kotlin/Water.kt | 10 | ||||
| -rw-r--r-- | src/main/kotlin/WaterParams.kt | 12 |
3 files changed, 62 insertions, 22 deletions
diff --git a/src/main/kotlin/Terrain.kt b/src/main/kotlin/Terrain.kt index 054055e..55dcba5 100644 --- a/src/main/kotlin/Terrain.kt +++ b/src/main/kotlin/Terrain.kt @@ -7,9 +7,11 @@ import info.laht.threekt.external.libs.datgui.dat import info.laht.threekt.geometries.BoxGeometry import info.laht.threekt.geometries.PlaneGeometry import info.laht.threekt.lights.AmbientLight -import info.laht.threekt.lights.PointLight -import info.laht.threekt.materials.MeshBasicMaterial +import info.laht.threekt.lights.DirectionalLight +import info.laht.threekt.lights.Light +import info.laht.threekt.loaders.TextureLoader import info.laht.threekt.materials.MeshPhongMaterial +import info.laht.threekt.math.Color import info.laht.threekt.math.ColorConstants import info.laht.threekt.objects.Mesh import info.laht.threekt.renderers.WebGLRenderer @@ -20,6 +22,7 @@ import kotlin.browser.document import kotlin.browser.window import kotlin.dom.addClass import kotlin.dom.removeClass +import kotlin.math.PI import kotlin.math.pow class Terrain { @@ -31,6 +34,7 @@ class Terrain { private lateinit var simplexNoise: SimplexNoise private lateinit var terrainMesh: Mesh private lateinit var waterMesh: Mesh + private var light: Light private val size: Int = 256 @@ -53,19 +57,19 @@ class Terrain { scene.add(AmbientLight(0xeeeeee)) - PointLight(0xffffff) + light = DirectionalLight(0xffffff, 0.8) .apply { castShadow = true - position.set(0, 90, 200) - }.also(scene::add) + position.set(60, 170, -110) + } + .also(scene::add) camera = PerspectiveCamera(75, window.innerWidth.toDouble() / window.innerHeight, 0.1, 1000) - camera.position.setZ(45) - camera.position.setY(-73) + camera.position.set(0, 57, 76) renderer = WebGLRenderer(WebGLRendererParams(antialias = true)) .apply { - setClearColor(ColorConstants.black, 1) + setClearColor(ColorConstants.skyblue, 1) setSize(window.innerWidth, window.innerHeight) } @@ -95,7 +99,7 @@ class Terrain { fun reseedNoise() { seedNoise() - generateTerrain() + regenerateTerrain() } private fun regenerateTerrain() { @@ -157,13 +161,16 @@ class Terrain { } terrainMesh = Mesh(terrainGeom, terrainMaterial) - .apply { receiveShadows = true } + .apply { + receiveShadows = true + rotation.x = -PI / 2 + } .also(scene::add) - generateWater() - val genEnd = window.performance.now() println("Terrain generation took ${genEnd - genStart} ms") + + generateWater() } private fun applyHeightMapColour(planeGeometry: PlaneGeometry) { @@ -185,19 +192,28 @@ class Terrain { scene.remove(waterMesh) } - val waterGeom = BoxGeometry(99, 99, options.waterHeight) - val waterMaterial = MeshBasicMaterial() + waterMesh = Water(BoxGeometry(99,99, options.waterHeight), + WaterParams( + waterNormals = TextureLoader().load("waternormals.jpg", { + it.wrapS = THREE.RepeatWrapping + it.wrapT = THREE.RepeatWrapping + }), + alpha = 1.0, + sunDirection = light.position.clone().normalize(), + sunColor = Color(0xffffff), + waterColor = Color(0x001e0f), + distortionScale = 5.0 + )) .apply { - color.set(ColorConstants.aqua) - transparent = true - opacity = 0.7 + receiveShadows = true + translateZ(options.waterHeight) + rotation.x = -PI / 2 + position.set(0, options.waterHeight / 2 , 0) } + .also(scene::add) - waterMesh = Mesh(waterGeom, waterMaterial) - .also { - scene.add(it) - it.translateZ(options.waterHeight/2) - } + var waterMeshJsVar = waterMesh + js("waterMeshJsVar.material.uniforms.size.value = 7") } @Suppress("UNCHECKED_CAST_TO_EXTERNAL_INTERFACE") @@ -266,6 +282,8 @@ class Terrain { waterMesh.rotation.z += 0.005 // println("x:${camera.position.x} y: ${camera.position.y} z:${camera.position.z}") } + var waterMeshJsVar = waterMesh + js("waterMeshJsVar.material.uniforms[ 'time' ].value += 1.0 / 60.0;") animate() } diff --git a/src/main/kotlin/Water.kt b/src/main/kotlin/Water.kt new file mode 100644 index 0000000..51e809f --- /dev/null +++ b/src/main/kotlin/Water.kt @@ -0,0 +1,10 @@ +@file:JsQualifier("THREE") + +import info.laht.threekt.core.Geometry +import info.laht.threekt.objects.Mesh + +external class Water ( + geometry: Geometry, + options: WaterParams +) : Mesh + diff --git a/src/main/kotlin/WaterParams.kt b/src/main/kotlin/WaterParams.kt new file mode 100644 index 0000000..61cb2a0 --- /dev/null +++ b/src/main/kotlin/WaterParams.kt @@ -0,0 +1,12 @@ +import info.laht.threekt.math.Color +import info.laht.threekt.math.Vector3 +import info.laht.threekt.textures.Texture + +data class WaterParams( + val waterNormals: Texture, + val alpha: Double, + val sunDirection: Vector3, + val sunColor: Color, + val waterColor: Color, + val distortionScale: Double +)
\ No newline at end of file |