From df818b9ff16f394ac1dd33d36951cbbf6db6c97b Mon Sep 17 00:00:00 2001 From: Edwin Jakobs Date: Tue, 26 May 2020 09:05:34 +0200 Subject: [PATCH] Add support for KHR_lights_punctual --- build.gradle | 2 +- .../gltf-models/directional-light/Scene.glb | Bin 0 -> 20756 bytes demo-data/gltf-models/point-light/Scene.glb | Bin 0 -> 5724 bytes demo-data/gltf-models/spot-light/Scene.glb | Bin 0 -> 7376 bytes orx-dnk3/src/demo/kotlin/DemoAnimations01.kt | 4 +- orx-dnk3/src/demo/kotlin/DemoLights01.kt | 49 +++++++++++++++++ orx-dnk3/src/demo/kotlin/DemoLights02.kt | 50 ++++++++++++++++++ orx-dnk3/src/demo/kotlin/DemoLights03.kt | 49 +++++++++++++++++ orx-dnk3/src/main/kotlin/PBRMaterial.kt | 1 - orx-dnk3/src/main/kotlin/gltf/Gltf.kt | 21 +++++++- orx-dnk3/src/main/kotlin/gltf/GltfScene.kt | 37 +++++++++++-- 11 files changed, 204 insertions(+), 9 deletions(-) create mode 100644 demo-data/gltf-models/directional-light/Scene.glb create mode 100644 demo-data/gltf-models/point-light/Scene.glb create mode 100644 demo-data/gltf-models/spot-light/Scene.glb create mode 100644 orx-dnk3/src/demo/kotlin/DemoLights01.kt create mode 100644 orx-dnk3/src/demo/kotlin/DemoLights02.kt create mode 100644 orx-dnk3/src/demo/kotlin/DemoLights03.kt diff --git a/build.gradle b/build.gradle index 1692e622..e96f5ab1 100644 --- a/build.gradle +++ b/build.gradle @@ -14,7 +14,7 @@ buildscript { apply plugin: 'org.jetbrains.dokka' project.ext { - openrndrVersion = "0.3.43-rc.2" + openrndrVersion = "0.3.43-rc.3" kotlinVersion = "1.3.72" spekVersion = "2.0.10" libfreenectVersion = "0.5.7-1.5.3" diff --git a/demo-data/gltf-models/directional-light/Scene.glb b/demo-data/gltf-models/directional-light/Scene.glb new file mode 100644 index 0000000000000000000000000000000000000000..5145de2271c1609b43bafc5c5589c930875d1118 GIT binary patch literal 20756 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 literal 0 HcmV?d00001 diff --git a/demo-data/gltf-models/spot-light/Scene.glb b/demo-data/gltf-models/spot-light/Scene.glb new file mode 100644 index 0000000000000000000000000000000000000000..2b15b6b9605413d978209b267c538272443edac9 GIT binary patch literal 7376 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 literal 0 HcmV?d00001 diff --git a/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt b/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt index 8c2cca6b..95f60fc7 100644 --- a/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt +++ b/orx-dnk3/src/demo/kotlin/DemoAnimations01.kt @@ -26,7 +26,7 @@ fun main() = application { } } - val gltf = loadGltfFromFile(File("demo-data/gltf-models/box-animated/BoxAnimated.glb")) + val gltf = loadGltfFromFile(File("demo-data/gltf-models/oh-no-cubes-2.glb")) val scene = Scene(SceneNode()) @@ -53,7 +53,7 @@ fun main() = application { fov = 40.0 } extend { - sceneData.animations[0].applyToTargets(seconds.mod_(4.0)) + sceneData.animations[0].applyToTargets(seconds.mod_(sceneData.animations[0].duration)) drawer.clear(ColorRGBa.PINK) renderer.draw(drawer, scene) } diff --git a/orx-dnk3/src/demo/kotlin/DemoLights01.kt b/orx-dnk3/src/demo/kotlin/DemoLights01.kt new file mode 100644 index 00000000..0d4023eb --- /dev/null +++ b/orx-dnk3/src/demo/kotlin/DemoLights01.kt @@ -0,0 +1,49 @@ +import org.openrndr.application +import org.openrndr.color.ColorRGBa +import org.openrndr.extensions.SingleScreenshot +import org.openrndr.extra.dnk3.* +import org.openrndr.extra.dnk3.gltf.buildSceneNodes +import org.openrndr.extra.dnk3.gltf.loadGltfFromFile +import org.openrndr.extras.camera.Orbital +import org.openrndr.math.* +import org.openrndr.math.transforms.transform +import java.io.File + +fun main() = application { + configure { + width = 1280 + height = 720 + //multisample = WindowMultisample.SampleCount(8) + } + + program { + if (System.getProperty("takeScreenshot") == "true") { + extend(SingleScreenshot()) { + this.outputFile = System.getProperty("screenshotPath") + } + } + + val gltf = loadGltfFromFile(File("demo-data/gltf-models/point-light/Scene.glb")) + val scene = Scene(SceneNode()) + + scene.root.entities.add(HemisphereLight().apply { + upColor = ColorRGBa(0.1, 0.1, 0.4) + downColor = ColorRGBa(0.1, 0.0, 0.0) + }) + + val sceneData = gltf.buildSceneNodes() + scene.root.children.addAll(sceneData.scenes.first()) + + // -- create a renderer + val renderer = dryRenderer() + val orb = extend(Orbital()) { + far = 50.0 + camera.setView(Vector3.ZERO, Spherical(30.50, 26.0, 5.6), 40.0) + } + extend { + sceneData.animations[0].applyToTargets(seconds.mod_(sceneData.animations[0].duration)) + drawer.clear(ColorRGBa.PINK) + renderer.draw(drawer, scene) + } + } +} \ No newline at end of file diff --git a/orx-dnk3/src/demo/kotlin/DemoLights02.kt b/orx-dnk3/src/demo/kotlin/DemoLights02.kt new file mode 100644 index 00000000..58398b2e --- /dev/null +++ b/orx-dnk3/src/demo/kotlin/DemoLights02.kt @@ -0,0 +1,50 @@ +import org.openrndr.application +import org.openrndr.color.ColorRGBa +import org.openrndr.extensions.SingleScreenshot +import org.openrndr.extra.dnk3.* +import org.openrndr.extra.dnk3.gltf.buildSceneNodes +import org.openrndr.extra.dnk3.gltf.loadGltfFromFile +import org.openrndr.extras.camera.Orbital +import org.openrndr.math.* +import org.openrndr.math.transforms.transform +import java.io.File + +fun main() = application { + configure { + width = 1280 + height = 720 + //multisample = WindowMultisample.SampleCount(8) + } + + program { + if (System.getProperty("takeScreenshot") == "true") { + extend(SingleScreenshot()) { + this.outputFile = System.getProperty("screenshotPath") + } + } + + val gltf = loadGltfFromFile(File("demo-data/gltf-models/spot-light/Scene.glb")) + val scene = Scene(SceneNode()) + + scene.root.entities.add(HemisphereLight().apply { + upColor = ColorRGBa(0.1, 0.1, 0.4) + downColor = ColorRGBa(0.1, 0.0, 0.0) + }) + + + val sceneData = gltf.buildSceneNodes() + scene.root.children.addAll(sceneData.scenes.first()) + + // -- create a renderer + val renderer = dryRenderer() + val orb = extend(Orbital()) { + far = 50.0 + camera.setView(Vector3(-0.514, -0.936, -1.122), Spherical(454.346, 25.0, 8.444), 40.0) + } + extend { + sceneData.animations[0].applyToTargets(seconds.mod_(sceneData.animations[0].duration)) + drawer.clear(ColorRGBa.PINK) + renderer.draw(drawer, scene) + } + } +} \ No newline at end of file diff --git a/orx-dnk3/src/demo/kotlin/DemoLights03.kt b/orx-dnk3/src/demo/kotlin/DemoLights03.kt new file mode 100644 index 00000000..8b010e9f --- /dev/null +++ b/orx-dnk3/src/demo/kotlin/DemoLights03.kt @@ -0,0 +1,49 @@ +import org.openrndr.application +import org.openrndr.color.ColorRGBa +import org.openrndr.extensions.SingleScreenshot +import org.openrndr.extra.dnk3.* +import org.openrndr.extra.dnk3.gltf.buildSceneNodes +import org.openrndr.extra.dnk3.gltf.loadGltfFromFile +import org.openrndr.extras.camera.Orbital +import org.openrndr.math.* +import org.openrndr.math.transforms.transform +import java.io.File + +fun main() = application { + configure { + width = 1280 + height = 720 + //multisample = WindowMultisample.SampleCount(8) + } + + program { + if (System.getProperty("takeScreenshot") == "true") { + extend(SingleScreenshot()) { + this.outputFile = System.getProperty("screenshotPath") + } + } + + val gltf = loadGltfFromFile(File("demo-data/gltf-models/directional-light/Scene.glb")) + val scene = Scene(SceneNode()) + + scene.root.entities.add(HemisphereLight().apply { + upColor = ColorRGBa(0.1, 0.1, 0.4) + downColor = ColorRGBa(0.1, 0.0, 0.0) + }) + + val sceneData = gltf.buildSceneNodes() + scene.root.children.addAll(sceneData.scenes.first()) + + // -- create a renderer + val renderer = dryRenderer() + val orb = extend(Orbital()) { + camera.setView(Vector3(-0.49, -0.24, 0.20), Spherical(26.56, 90.0, 6.533), 40.0) + } + + extend { + sceneData.animations[0].applyToTargets(seconds.mod_(sceneData.animations[0].duration)) + drawer.clear(ColorRGBa.PINK) + renderer.draw(drawer, scene) + } + } +} \ No newline at end of file diff --git a/orx-dnk3/src/main/kotlin/PBRMaterial.kt b/orx-dnk3/src/main/kotlin/PBRMaterial.kt index c1d1dd62..73fc53f8 100644 --- a/orx-dnk3/src/main/kotlin/PBRMaterial.kt +++ b/orx-dnk3/src/main/kotlin/PBRMaterial.kt @@ -346,7 +346,6 @@ class PBRMaterial : Material { + p_jointTransforms[j.y] * a_weights.y + p_jointTransforms[j.z] * a_weights.z + p_jointTransforms[j.w] * a_weights.w; - ${if (primitiveContext.hasNormalAttribute) """ x_normal = normalize(mat3(skinTransform) * x_normal); """.trimIndent() else ""} diff --git a/orx-dnk3/src/main/kotlin/gltf/Gltf.kt b/orx-dnk3/src/main/kotlin/gltf/Gltf.kt index 8f065a5b..ea96873b 100644 --- a/orx-dnk3/src/main/kotlin/gltf/Gltf.kt +++ b/orx-dnk3/src/main/kotlin/gltf/Gltf.kt @@ -35,7 +35,15 @@ class GltfNode(val name:String, val rotation: DoubleArray?, val translation: DoubleArray?, val mesh: Int?, - val skin: Int?) + val skin: Int?, + val extensions: GltfNodeExtensions?) + +class KHRLightsPunctualIndex(val light: Int) + +class GltfNodeExtensions(val KHR_lights_punctual: KHRLightsPunctualIndex?) { + +} + class GltfPrimitive(val attributes: LinkedHashMap, val indices: Int?, val mode: Int?, val material: Int) { fun createDrawCommand(gltfFile: GltfFile): GltfDrawCommand { @@ -244,6 +252,14 @@ class GltfChannel(val sampler: Int, val target: GltfChannelTarget) class GltfSkin(val inverseBindMatrices: Int, val joints: IntArray, val skeleton: Int) + +class KHRLightsPunctualLight(val color: DoubleArray?, val type: String, val intensity: Double?, val range: Double, val spot: KHRLightsPunctualLightSpot?) +class KHRLightsPunctualLightSpot(val innerConeAngle: Double?, val outerConeAngle: Double?) + +class KHRLightsPunctual(val lights: List) + +class GltfExtensions(val KHR_lights_punctual: KHRLightsPunctual?) + class GltfFile( val asset: GltfAsset?, val scene: Int?, @@ -258,7 +274,8 @@ class GltfFile( val textures: List?, val samplers: List?, val animations: List?, - val skins: List? + val skins: List?, + val extensions: GltfExtensions? ) { @Transient lateinit var file: File diff --git a/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt b/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt index 78c2c374..c76392fa 100644 --- a/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt +++ b/orx-dnk3/src/main/kotlin/gltf/GltfScene.kt @@ -17,9 +17,9 @@ import kotlin.reflect.KMutableProperty0 class SceneAnimation(var channels: List) { val duration: Double - get() { - return channels.maxBy { it.duration }?.duration ?:0.0 - } + get() { + return channels.maxBy { it.duration }?.duration ?: 0.0 + } fun applyToTargets(input: Double) { @@ -49,6 +49,7 @@ class Vector3Channel(val target: KMutableProperty0, override fun applyToTarget(input: Double) { target.set(keyframer.value(input) ?: default) } + override val duration: Double get() = keyframer.duration() } @@ -270,6 +271,36 @@ fun GltfFile.buildSceneNodes(): GltfSceneData { val skin = gltfNode.skin?.let { (skins!!)[it] } sceneNode.entities.add(meshes[it].createSceneMesh(skin)) } + gltfNode.extensions?.let { exts -> + exts.KHR_lights_punctual?.let { lightIndex -> + extensions?.KHR_lights_punctual?.lights?.get(lightIndex.light)?.let { light -> + val sceneLight = when (light.type) { + "point" -> { + PointLight() + } + "directional" -> { + DirectionalLight().apply { + shadows = Shadows.PCF() + } + } + "spot" -> { + SpotLight().apply { + innerAngle = Math.toDegrees(light.spot!!.innerConeAngle ?: 0.0) + outerAngle = Math.toDegrees(light.spot.outerConeAngle ?: Math.PI / 4.0) + shadows = Shadows.PCF() + } + + } + else -> error("unsupported light type ${light.type}") + } + sceneLight.apply { + val lightColor = (light.color ?: doubleArrayOf(1.0, 1.0, 1.0)) + color = ColorRGBa(lightColor[0], lightColor[1], lightColor[2]) + } + sceneNode.entities.add(sceneLight) + } + } + } } val sceneAnimations = animations?.map { animation ->