diff --git a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt index e575e103..f8cd3be7 100644 --- a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt +++ b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GDMLAppComponent.kt @@ -29,7 +29,7 @@ import styled.styledDiv external interface GDMLAppProps : RProps { var context: Context - var rootObject: Vision? + var rootVision: Vision? var selected: Name? } @@ -45,7 +45,7 @@ external interface GDMLAppProps : RProps { val GDMLApp = functionalComponent("GDMLApp") { props -> var selected by useState { props.selected } var canvas: ThreeCanvas? by useState { null } - var vision: Vision? by useState { props.rootObject } + var vision: Vision? by useState { props.rootVision } val onSelect: (Name?) -> Unit = { selected = it diff --git a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GdmlJsDemoApp.kt b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GdmlJsDemoApp.kt index f3aa4417..6058db60 100644 --- a/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GdmlJsDemoApp.kt +++ b/demo/gdml/src/jsMain/kotlin/hep/dataforge/vision/gdml/demo/GdmlJsDemoApp.kt @@ -3,6 +3,7 @@ package hep.dataforge.vision.gdml.demo import hep.dataforge.context.Global import hep.dataforge.vision.Application import hep.dataforge.vision.gdml.toVision +import hep.dataforge.vision.solid.three.ThreePlugin import hep.dataforge.vision.startApplication import kotlinx.browser.document import react.child @@ -14,12 +15,16 @@ private class GDMLDemoApp : Application { override fun start(state: Map) { val element = document.getElementById("app") ?: error("Element with id 'app' not found on page") - val context = Global.context("demo") {} + val context = Global.context("demo") .apply{ + plugins.fetch(ThreePlugin) + } render(element) { child(GDMLApp) { + val vision = cubes().toVision() + //println(context.plugins.fetch(VisionManager).encodeToString(vision)) attrs { this.context = context - this.rootObject = cubes().toVision() + this.rootVision = vision } } } diff --git a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt index 80d5cdd2..3662be02 100644 --- a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt +++ b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/StyleSheet.kt @@ -99,17 +99,8 @@ public tailrec fun Vision.getStyle(name: String): Meta? = /** * Resolve an item in all style layers */ -public fun Vision.getStyleItems(name: Name): Sequence { - return styles.asSequence().map { - getStyle(it) - }.map { - it[name] - }.filterNotNull() -} - -/** - * Collect all styles for this object in a single laminate - */ -public val Vision.allStyles: Laminate get() = Laminate(styles.mapNotNull(::getStyle)) +public fun Vision.getStyleItems(name: Name): Sequence = styles.asSequence().map { + getStyle(it)[name] +}.filterNotNull() diff --git a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt index 2465c662..210906f1 100644 --- a/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt +++ b/visionforge-core/src/commonMain/kotlin/hep/dataforge/vision/VisionManager.kt @@ -29,6 +29,7 @@ public class VisionManager(meta: Meta) : AbstractPlugin(meta) { public val jsonFormat: Json get() = Json(defaultJson) { + encodeDefaults = false serializersModule = this@VisionManager.serializersModule } diff --git a/visionforge-gdml/src/commonMain/kotlin/hep/dataforge/vision/gdml/GDMLTransformer.kt b/visionforge-gdml/src/commonMain/kotlin/hep/dataforge/vision/gdml/GDMLTransformer.kt index 2ac28d6b..a4008d2b 100644 --- a/visionforge-gdml/src/commonMain/kotlin/hep/dataforge/vision/gdml/GDMLTransformer.kt +++ b/visionforge-gdml/src/commonMain/kotlin/hep/dataforge/vision/gdml/GDMLTransformer.kt @@ -97,7 +97,7 @@ private class GDMLTransformer(val settings: GDMLTransformerSettings) { fun configureSolid(root: GDML, obj: Solid, parent: GDMLVolume, solid: GDMLSolid) { val material = parent.materialref.resolve(root) ?: GDMLElement(parent.materialref.ref) - val styleName = "material[${material.name}]" + val styleName = "materials.${material.name}" obj.useStyle(styleName) { MATERIAL_COLOR_KEY put random.nextInt(16777216) diff --git a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/MeshThreeFactory.kt b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/MeshThreeFactory.kt index f04e7a1a..a9d405f2 100644 --- a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/MeshThreeFactory.kt +++ b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/MeshThreeFactory.kt @@ -42,6 +42,7 @@ public abstract class MeshThreeFactory( //add listener to object properties obj.onPropertyChange(three.updateScope) { name -> + println("Property $name of mesh ${mesh.name} updated") when { name.startsWith(Solid.GEOMETRY_KEY) -> { val oldGeometry = mesh.geometry as BufferGeometry diff --git a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeCanvas.kt index 37e6f241..f6bec606 100644 --- a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeCanvas.kt @@ -197,7 +197,7 @@ public class ThreeCanvas( } public fun render(vision: Solid) { - three.logger.info { "Replacing root node in $this" } + three.logger.info { "Replacing root node in three canvas" } scene.findChild("@root".asName())?.let { scene.remove(it) } val object3D = three.buildObject3D(vision) diff --git a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeMaterials.kt b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeMaterials.kt index 0403fdb9..218533c6 100644 --- a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeMaterials.kt +++ b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeMaterials.kt @@ -7,7 +7,6 @@ import hep.dataforge.values.int import hep.dataforge.values.string import hep.dataforge.vision.Colors import hep.dataforge.vision.Vision -import hep.dataforge.vision.allStyles import hep.dataforge.vision.solid.SolidMaterial import info.laht.threekt.materials.LineBasicMaterial import info.laht.threekt.materials.Material @@ -83,26 +82,12 @@ public object ThreeMaterials { } } - internal fun cacheMeta(meta: Meta): Material = materialCache.getOrPut(meta) { + internal fun cacheMaterial(meta: Meta): Material = materialCache.getOrPut(meta) { buildMaterial(meta).apply { cached = true } } - -// internal fun getMaterial(vision: Vision, cache: Boolean): Material { -// val meta = vision.getProperty(SolidMaterial.MATERIAL_KEY, inherit = true).node ?: return DEFAULT -// return if (cache) { -// materialCache.getOrPut(meta) { -// buildMaterial(meta).apply { -// cached = true -// } -// } -// } else { -// buildMaterial(meta) -// } -// } - } /** @@ -135,7 +120,6 @@ private var Material.cached: Boolean public fun Mesh.updateMaterial(vision: Vision) { //val meta = vision.getProperty(SolidMaterial.MATERIAL_KEY, inherit = true).node val ownMaterialMeta = vision.getOwnProperty(SolidMaterial.MATERIAL_KEY) - val stylesMaterialMeta = vision.allStyles[SolidMaterial.MATERIAL_KEY] val parentMaterialMeta = vision.parent?.getProperty( SolidMaterial.MATERIAL_KEY, inherit = true, @@ -144,16 +128,22 @@ public fun Mesh.updateMaterial(vision: Vision) { ) material = when { - ownMaterialMeta == null && stylesMaterialMeta == null && parentMaterialMeta == null -> { - //use default is not material properties are defined - ThreeMaterials.DEFAULT - } ownMaterialMeta == null && parentMaterialMeta == null -> { //If material is style-based, use cached - ThreeMaterials.cacheMeta(stylesMaterialMeta.node ?: Meta.EMPTY) + vision.getProperty( + SolidMaterial.MATERIAL_KEY, + inherit = false, + includeStyles = true, + includeDefaults = false + ).node?.let { + ThreeMaterials.cacheMaterial(it) + } ?: ThreeMaterials.DEFAULT } else -> { - vision.getProperty(SolidMaterial.MATERIAL_KEY).node?.let { + vision.getProperty( + SolidMaterial.MATERIAL_KEY, + inherit = true + ).node?.let { ThreeMaterials.buildMaterial(it) } ?: ThreeMaterials.DEFAULT } @@ -182,7 +172,7 @@ public fun Mesh.updateMaterialProperty(vision: Vision, propertyName: Name) { includeStyles = true, includeDefaults = false ).double ?: 1.0 - material.asDynamic().opacity = opacity + material.opacity = opacity material.transparent = opacity < 1.0 material.needsUpdate = true } diff --git a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeReferenceFactory.kt b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeReferenceFactory.kt index a1a98572..34b1aebd 100644 --- a/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeReferenceFactory.kt +++ b/visionforge-threejs/src/main/kotlin/hep/dataforge/vision/solid/three/ThreeReferenceFactory.kt @@ -1,11 +1,9 @@ package hep.dataforge.vision.solid.three -import hep.dataforge.meta.node import hep.dataforge.names.cutFirst import hep.dataforge.names.firstOrNull import hep.dataforge.names.toName import hep.dataforge.vision.solid.Solid -import hep.dataforge.vision.solid.SolidMaterial import hep.dataforge.vision.solid.SolidReferenceGroup import hep.dataforge.vision.solid.SolidReferenceGroup.Companion.REFERENCE_CHILD_PROPERTY_PREFIX import info.laht.threekt.core.BufferGeometry @@ -49,6 +47,7 @@ public object ThreeReferenceFactory : ThreeFactory { //TODO apply child properties obj.onPropertyChange(three.updateScope) { name-> + println("Property $name of reference ${object3D.name} updated") if (name.firstOrNull()?.body == REFERENCE_CHILD_PROPERTY_PREFIX) { val childName = name.firstOrNull()?.index?.toName() ?: error("Wrong syntax for reference child property: '$name'") val propertyName = name.cutFirst()