diff --git a/CHANGELOG.md b/CHANGELOG.md index 7a62abf7..b4aa96fb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,10 +3,12 @@ ## Unreleased ### Added +- Plotly refactored on top of visionforge/server ### Changed - Simplified Vision and VisionGroup logic. Observation logic moved out. - Use `Name` for child designation and `Path` for tree access +- Default intensity for AmbientLight is 2.0 ### Deprecated diff --git a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt index 14dab6b9..0004b658 100644 --- a/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt +++ b/demo/js-playground/src/jsMain/kotlin/JsPlaygroundApp.kt @@ -2,7 +2,7 @@ import org.jetbrains.compose.web.css.* import org.jetbrains.compose.web.dom.Div import org.jetbrains.compose.web.renderComposable import space.kscience.dataforge.context.Context -import space.kscience.plotly.PlotlyPlugin +import space.kscience.plotly.PlotlyJSPlugin import space.kscience.plotly.models.Trace import space.kscience.plotly.models.scatter import space.kscience.visionforge.Colors @@ -25,7 +25,7 @@ fun Trace.appendXYLatest(x: Number, y: Number, history: Int = 400, xErr: Number? public fun main() { val playgroundContext = Context { plugin(ThreePlugin) - plugin(PlotlyPlugin) + plugin(PlotlyJSPlugin) plugin(MarkupPlugin) } startApplication { document -> diff --git a/demo/playground/build.gradle.kts b/demo/playground/build.gradle.kts index f484c829..a1ddb35a 100644 --- a/demo/playground/build.gradle.kts +++ b/demo/playground/build.gradle.kts @@ -1,8 +1,8 @@ plugins { kotlin("multiplatform") kotlin("jupyter.api") - id("com.github.johnrengelman.shadow") version "7.1.2" -// application + id("com.gradleup.shadow") version "8.3.6" + } repositories { @@ -15,13 +15,15 @@ kotlin { jvmToolchain(17) js(IR) { browser { + commonWebpackConfig { + cssSupport { + enabled = true + } + scssSupport { + enabled = true + } + } webpackTask { - cssSupport{ - enabled = true - } - scssSupport{ - enabled = true - } mainOutputFileName.set("js/visionforge-playground.js") } } @@ -43,9 +45,9 @@ kotlin { val commonMain by getting { dependencies { implementation(projects.visionforgeSolid) -// implementation(projects.visionforgePlotly) + implementation(projects.plotly.plotlyktCore) implementation(projects.visionforgeMarkdown) -// implementation(projects.visionforgeTables) + implementation(projects.visionforgeTables) implementation(projects.cernRootLoader) api(projects.visionforgeJupyter.visionforgeJupyterCommon) } @@ -60,7 +62,7 @@ kotlin { val jvmMain by getting { dependencies { - implementation("io.ktor:ktor-server-cio:${spclibs.versions.ktor.get()}") + implementation("io.ktor:ktor-server-cio") implementation(projects.visionforgeGdml) implementation(projects.visionforgeServer) implementation(spclibs.logback.classic) @@ -77,9 +79,7 @@ val jsBrowserDistribution = tasks.getByName("jsBrowserDistribution") tasks.getByName<ProcessResources>("jvmProcessResources") { dependsOn(jsBrowserDistribution) - from(jsBrowserDistribution) { - exclude("**/*.js.map") - } + from(jsBrowserDistribution) } val processJupyterApiResources by tasks.getting(org.jetbrains.kotlinx.jupyter.api.plugin.tasks.JupyterApiResourcesTask::class) { diff --git a/demo/playground/src/jsMain/kotlin/playgroundMain.kt b/demo/playground/src/jsMain/kotlin/playgroundMain.kt index 99d79225..a2e530df 100644 --- a/demo/playground/src/jsMain/kotlin/playgroundMain.kt +++ b/demo/playground/src/jsMain/kotlin/playgroundMain.kt @@ -1,5 +1,5 @@ import space.kscience.dataforge.misc.DFExperimental -import space.kscience.plotly.PlotlyPlugin +import space.kscience.plotly.PlotlyJSPlugin import space.kscience.visionforge.html.runVisionClient import space.kscience.visionforge.jupyter.VFNotebookClient import space.kscience.visionforge.markup.MarkupPlugin @@ -9,7 +9,7 @@ import space.kscience.visionforge.tables.TableVisionJsPlugin @DFExperimental fun main() = runVisionClient { plugin(ThreePlugin) - plugin(PlotlyPlugin) + plugin(PlotlyJSPlugin) plugin(MarkupPlugin) plugin(TableVisionJsPlugin) plugin(VFNotebookClient) diff --git a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt index 363f332b..97de6c44 100644 --- a/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt +++ b/demo/playground/src/jvmMain/kotlin/allThingsDemo.kt @@ -2,6 +2,7 @@ package space.kscience.visionforge.examples import kotlinx.html.h2 import space.kscience.dataforge.meta.ValueType +import space.kscience.plotly.PlotlyPlugin import space.kscience.plotly.layout import space.kscience.plotly.models.ScatterMode import space.kscience.plotly.models.TextPosition @@ -43,6 +44,7 @@ fun main() = makeVisionFile( h2 { +"Interactive plots with Plotly" } vision("plot") { + requirePlugin(PlotlyPlugin) plotly { scatter { x(1, 2, 3, 4) diff --git a/demo/playground/src/jvmMain/kotlin/antenna.kt b/demo/playground/src/jvmMain/kotlin/antenna.kt index 3191280e..6da8afb5 100644 --- a/demo/playground/src/jvmMain/kotlin/antenna.kt +++ b/demo/playground/src/jvmMain/kotlin/antenna.kt @@ -19,7 +19,11 @@ import kotlin.math.PI import kotlin.math.cos import kotlin.math.sin -suspend fun main() = serve { +suspend fun main() = serve( + routeConfiguration = { + updateInterval = 100 + } +) { // val azimuth = 60.degrees // val inclination = 15.degrees @@ -45,6 +49,7 @@ suspend fun main() = serve { //axes(200) ambientLight { color(Colors.white) + intensity = 3.0 } val platform = solidGroup("platform") { cylinder(50, 5, name = "base") @@ -87,7 +92,7 @@ suspend fun main() = serve { var time: Long = 0L while (isActive) { with(QuaternionAlgebra) { - delay(200) + delay(100) platform.quaternion = Quaternion.fromRotation( 15.degrees * sin(time.toDouble() * 2 * PI / xPeriod), Float64Space3D.xAxis @@ -100,7 +105,7 @@ suspend fun main() = serve { antenna.quaternion = qi.conjugate * incRot.conjugate * target - time += 200 + time += 100 //antenna.quaternion = Quaternion.fromRotation(5.degrees, Euclidean3DSpace.zAxis) * antenna.quaternion } } diff --git a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt index 4cac02b1..4f2c34ba 100644 --- a/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt +++ b/demo/playground/src/jvmMain/kotlin/gdmlCurve.kt @@ -27,7 +27,7 @@ fun main() = makeVisionFile(Path.of("curves.html"), resourceLocation = ResourceL val cathodeTeflonDiskThickness = 5 val cathodeCopperSupportOuterRadius = 45 val cathodeCopperSupportInnerRadius = 8.5 - val cathodeCopperSupportThickness = 1 + val cathodeCopperSupportThickness = 1.0 // mylar cathode val mylarCathodeThickness = 0.004 // patern diff --git a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt index 727fe050..6fd5cb35 100644 --- a/demo/playground/src/jvmMain/kotlin/serverExtensions.kt +++ b/demo/playground/src/jvmMain/kotlin/serverExtensions.kt @@ -9,6 +9,7 @@ import space.kscience.dataforge.context.Global import space.kscience.plotly.PlotlyPlugin import space.kscience.visionforge.html.* import space.kscience.visionforge.markup.MarkupPlugin +import space.kscience.visionforge.server.VisionRoute import space.kscience.visionforge.server.close import space.kscience.visionforge.server.openInBrowser import space.kscience.visionforge.server.visionPage @@ -42,6 +43,7 @@ public fun makeVisionFile( public suspend fun serve( title: String = "VisionForge page", show: Boolean = true, + routeConfiguration: VisionRoute.() -> Unit = {}, content: HtmlVisionFragment, ) { val context = Context("playground") { @@ -62,6 +64,7 @@ public suspend fun serve( defer = true }, VisionPage.title(title), + routeConfiguration = routeConfiguration, visionFragment = content ) }.start(false) diff --git a/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt b/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt index 25d0c6a3..b94c0f39 100644 --- a/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt +++ b/demo/sat-demo/src/jvmMain/kotlin/ru/mipt/npm/sat/satServer.kt @@ -36,6 +36,7 @@ suspend fun main() { val sat = solids.visionOfSatellite(ySegments = 3).apply { ambientLight { color(Colors.white) + intensity = 3.0 } } val server = embeddedServer(CIO, port = 7777) { diff --git a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt index 4a55fbcd..180b5f7d 100644 --- a/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt +++ b/demo/solid-showcase/src/commonMain/kotlin/space/kscience/visionforge/solid/demo/demo.kt @@ -25,7 +25,6 @@ fun VisionLayout<Solid>.demo(name: String, title: String = name, block: SolidGro block() ambientLight { color(Colors.white) - intensity = 0.5 } pointLight(0, 0, 1000) { color(Colors.white) diff --git a/plotly/examples/build.gradle.kts b/plotly/examples/build.gradle.kts index 21eb53dd..4a5f25e0 100644 --- a/plotly/examples/build.gradle.kts +++ b/plotly/examples/build.gradle.kts @@ -11,7 +11,7 @@ dependencies { implementation(projects.plotly.plotlyktServer) implementation(projects.plotly.plotlyktScript) implementation(kotlin("script-runtime")) - implementation("org.jetbrains.kotlinx:dataframe:0.13.1") + implementation("org.jetbrains.kotlinx:dataframe:0.15.0") } kotlin{ diff --git a/plotly/examples/fx-demo/build.gradle.kts b/plotly/examples/fx-demo/build.gradle.kts index 096c6309..33b21339 100644 --- a/plotly/examples/fx-demo/build.gradle.kts +++ b/plotly/examples/fx-demo/build.gradle.kts @@ -16,7 +16,7 @@ dependencies { javafx{ modules("javafx.web") - version = "11" + version = "17" } application { @@ -24,6 +24,6 @@ application { } kotlin{ - jvmToolchain(11) + jvmToolchain(17) } diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt index a2ae4c52..164d09c7 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Extruded.kt @@ -1,11 +1,14 @@ +@file:UseSerializers(Float32Space2D.VectorSerializer::class) package space.kscience.visionforge.solid import kotlinx.serialization.SerialName import kotlinx.serialization.Serializable +import kotlinx.serialization.UseSerializers import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.update import space.kscience.kmath.geometry.component1 import space.kscience.kmath.geometry.component2 +import space.kscience.kmath.geometry.euclidean2d.Float32Space2D import space.kscience.kmath.geometry.euclidean2d.Float32Vector2D import space.kscience.kmath.geometry.euclidean3d.Float32Vector3D import space.kscience.visionforge.MutableVisionContainer diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt index 3ed2723f..154bc4a4 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/LightSource.kt @@ -17,7 +17,7 @@ public abstract class LightSource : MiscSolid() { override val descriptor: MetaDescriptor get() = LightSource.descriptor public val color: ColorAccessor by colorProperty(SolidMaterial.COLOR_KEY) - public var intensity: Number by properties.number(INTENSITY_KEY) { 1.0 } + public var intensity: Number by properties.number(INTENSITY_KEY) { 2.0 } public companion object { public val INTENSITY_KEY: Name = "intensity".asName() diff --git a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Shape2D.kt b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Shape2D.kt index f7b2132a..0a0167a1 100644 --- a/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Shape2D.kt +++ b/visionforge-solid/src/commonMain/kotlin/space/kscience/visionforge/solid/Shape2D.kt @@ -1,6 +1,9 @@ +@file:UseSerializers(Float32Space2D.VectorSerializer::class) package space.kscience.visionforge.solid import kotlinx.serialization.Serializable +import kotlinx.serialization.UseSerializers +import space.kscience.kmath.geometry.euclidean2d.Float32Space2D import space.kscience.kmath.geometry.euclidean2d.Float32Vector2D import kotlin.math.PI import kotlin.math.cos diff --git a/visionforge-tables/build.gradle.kts b/visionforge-tables/build.gradle.kts index 9d3e1907..e2c00068 100644 --- a/visionforge-tables/build.gradle.kts +++ b/visionforge-tables/build.gradle.kts @@ -10,6 +10,9 @@ kscience { binaries.library() browser { webpackTask{ + cssSupport { + enabled = true + } scssSupport { enabled = true } @@ -23,8 +26,8 @@ kscience { api("space.kscience:tables-kt:${tablesVersion}") } jsMain { - api(npm("tabulator-tables", "5.5.2")) - api(npm("@types/tabulator-tables", "5.5.3")) + api(npm("tabulator-tables", "6.3.1")) + api(npm("@types/tabulator-tables", "6.2.3")) } } diff --git a/visionforge-threejs/build.gradle.kts b/visionforge-threejs/build.gradle.kts index 42543e84..26608120 100644 --- a/visionforge-threejs/build.gradle.kts +++ b/visionforge-threejs/build.gradle.kts @@ -25,7 +25,7 @@ kscience { // api(npm("@types/file-saver", "2.0.7")) implementation(npm("three", "0.173.0")) implementation(npm("three-csg-ts", "3.2.0")) - implementation(npm("three.meshline", "1.4.0")) + implementation(npm("meshline", "3.3.1")) } } diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt index 786a0cc1..749f1e27 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeCanvas.kt @@ -8,8 +8,13 @@ import org.w3c.dom.Node import org.w3c.dom.events.MouseEvent import space.kscience.dataforge.context.info import space.kscience.dataforge.context.logger -import space.kscience.dataforge.meta.* -import space.kscience.dataforge.names.* +import space.kscience.dataforge.meta.get +import space.kscience.dataforge.meta.isEmpty +import space.kscience.dataforge.meta.string +import space.kscience.dataforge.meta.useProperty +import space.kscience.dataforge.names.Name +import space.kscience.dataforge.names.asName +import space.kscience.dataforge.names.plus import space.kscience.visionforge.Colors import space.kscience.visionforge.solid.Solid import space.kscience.visionforge.solid.specifications.* @@ -21,7 +26,10 @@ import three.external.controls.OrbitControls import three.external.controls.TrackballControls import three.geometries.EdgesGeometry import three.materials.Material -import three.math.* +import three.math.Box3 +import three.math.Plane +import three.math.Vector2 +import three.math.Vector3 import three.meshline.MeshLine import three.meshline.MeshLineMaterial import three.meshline.isMeshLineMaterial @@ -104,10 +112,6 @@ public class ThreeCanvas( camera.updateProjectionMatrix() } - - /** - * Attach canvas to given [HTMLElement] - */ init { check(element.getElementsByClassName("three-canvas").length == 0) { "Three canvas already created in this element" @@ -311,13 +315,13 @@ public class ThreeCanvas( public companion object { public val SELECTED_MATERIAL: MeshLineMaterial = MeshLineMaterial().apply { color.set(Colors.ivory) - thickness = 2f + lineWidth = 2f cached = true } public val HIGHLIGHT_MATERIAL: MeshLineMaterial = MeshLineMaterial().apply { color.set(Colors.blue) - thickness = 1f + lineWidth = 1f cached = true } // diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt index f4c2f211..3e191e16 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeMeshLineFactory.kt @@ -23,7 +23,7 @@ public object ThreeMeshLineFactory : ThreeFactory<PolyLine> { ) val material = MeshLineMaterial().apply { - thickness = vision.thickness.toFloat() + lineWidth = vision.thickness.toFloat() color = vision.color.string?.let { Color(it) } ?: ThreeMaterials.DEFAULT_LINE_COLOR } diff --git a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt index b3609b66..23facd4e 100644 --- a/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt +++ b/visionforge-threejs/src/jsMain/kotlin/space/kscience/visionforge/solid/three/ThreeSmartLineFactory.kt @@ -11,7 +11,7 @@ public object ThreeSmartLineFactory : ThreeFactory<PolyLine> { three: ThreePlugin, vision: PolyLine, observe: Boolean, - ): Object3D = if (vision.thickness == 1.0) { + ): Object3D = if (vision.thickness == PolyLine.DEFAULT_THICKNESS) { ThreeLineFactory.build(three, vision, observe) } else { ThreeMeshLineFactory.build(three, vision, observe) diff --git a/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLine.kt b/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLineGeometry.kt similarity index 64% rename from visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLine.kt rename to visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLineGeometry.kt index b6bb04bc..3d0ecc12 100644 --- a/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLine.kt +++ b/visionforge-threejs/src/jsMain/kotlin/three/meshline/MeshLineGeometry.kt @@ -1,4 +1,4 @@ -@file:JsModule("three.meshline") +@file:JsModule("meshline") package three.meshline @@ -6,6 +6,7 @@ package three.meshline import three.core.BufferGeometry import three.materials.ShaderMaterial import three.math.Color +import three.math.Vector2 import three.math.Vector3 import three.textures.Texture @@ -13,25 +14,25 @@ import three.textures.Texture * https://github.com/spite/THREE.MeshLine */ -public external class MeshLine : BufferGeometry { - public fun setGeometry(geometry: BufferGeometry) +public external class MeshLineGeometry : BufferGeometry { +// public fun setGeometry(geometry: BufferGeometry) public fun setPoints(points: Array<Vector3>) } public external class MeshLineMaterial : ShaderMaterial { - @JsName("lineWidth") - public var thickness: Float + public var lineWidth: Float public var color: Color public var map: Texture? - public var useMap: Boolean + public var useMap: Float public var alphaMap: Texture? - public var useAlphaMap: Boolean + public var useAlphaMap: Float + public var gradient: Array<Color> - public var repeat: dynamic // - THREE.Vector2 to define the texture tiling (applies to map and alphaMap - MIGHT CHANGE IN THE FUTURE) - public var dashArray: dynamic //- the length and space between dashes. (0 - no dash) + public var repeat: Vector2 // - THREE.Vector2 to define the texture tiling (applies to map and alphaMap - MIGHT CHANGE IN THE FUTURE) + public var dashArray: Float //- the length and space between dashes. (0 - no dash) public var dashOffset: dynamic // - defines the location where the dash will begin. Ideal to animate the line. public var dashRatio: dynamic // - defines the ratio between that is visible or not (0 - more visible, 1 - more invisible). - public var resolution: dynamic // - THREE.Vector2 specifying the canvas size (REQUIRED) + public var resolution: Vector2 // - THREE.Vector2 specifying the canvas size (REQUIRED) public var sizeAttenuation: Int // - makes the line width constant regardless distance (1 unit is 1px on screen) (0 - attenuate, 1 - don't attenuate) } \ No newline at end of file diff --git a/visionforge-threejs/src/jsMain/kotlin/three/meshline/meshLineExt.kt b/visionforge-threejs/src/jsMain/kotlin/three/meshline/meshLineExt.kt index 60047884..27fe84fd 100644 --- a/visionforge-threejs/src/jsMain/kotlin/three/meshline/meshLineExt.kt +++ b/visionforge-threejs/src/jsMain/kotlin/three/meshline/meshLineExt.kt @@ -4,8 +4,8 @@ import three.core.BufferGeometry import three.materials.Material import three.math.Vector3 -public fun MeshLine(geometry: BufferGeometry): MeshLine = MeshLine().apply { setGeometry(geometry) } +public fun MeshLine(geometry: BufferGeometry): MeshLineGeometry = MeshLineGeometry().apply { copy(geometry) } -public fun MeshLine(points: Array<Vector3>): MeshLine = MeshLine().apply { setPoints(points) } +public fun MeshLine(points: Array<Vector3>): MeshLineGeometry = MeshLineGeometry().apply { setPoints(points) } internal fun isMeshLineMaterial(material: Material): Boolean = material.asDynamic().isMeshLineMaterial == true \ No newline at end of file