Compare commits

..

No commits in common. "ba70af3a2445b5473abd87dff7a883a5facd9961" and "6a801f9999df5d29640802f74f6bff5c93ceff51" have entirely different histories.

226 changed files with 104 additions and 120 deletions

View File

@ -1,4 +1,5 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile
import space.kscience.gradle.isInDevelopment
import space.kscience.gradle.useApache2Licence import space.kscience.gradle.useApache2Licence
import space.kscience.gradle.useSPCTeam import space.kscience.gradle.useSPCTeam
@ -44,7 +45,14 @@ ksciencePublish {
useApache2Licence() useApache2Licence()
useSPCTeam() useSPCTeam()
} }
repository("spc","https://maven.sciprog.center/kscience") github(githubProject = "visionforge", githubOrg = "SciProgCentre")
space(
if (isInDevelopment) {
"https://maven.pkg.jetbrains.space/spc/p/sci/dev"
} else {
"https://maven.pkg.jetbrains.space/spc/p/sci/maven"
}
)
sonatype() sonatype()
} }

View File

@ -5,17 +5,12 @@ import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.parseAsName import space.kscience.dataforge.names.parseAsName
import space.kscience.dataforge.names.plus import space.kscience.dataforge.names.plus
import space.kscience.dataforge.names.withIndex import space.kscience.dataforge.names.withIndex
import space.kscience.kmath.complex.Quaternion
import space.kscience.kmath.geometry.fromRotationMatrix
import space.kscience.kmath.linear.VirtualMatrix
import space.kscience.visionforge.MutableVisionContainer import space.kscience.visionforge.MutableVisionContainer
import space.kscience.visionforge.isEmpty import space.kscience.visionforge.isEmpty
import space.kscience.visionforge.set import space.kscience.visionforge.set
import space.kscience.visionforge.solid.* import space.kscience.visionforge.solid.*
import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY import space.kscience.visionforge.solid.SolidMaterial.Companion.MATERIAL_COLOR_KEY
import kotlin.math.PI import kotlin.math.*
import kotlin.math.cos
import kotlin.math.sin
private val volumesName = Name.EMPTY //"volumes".asName() private val volumesName = Name.EMPTY //"volumes".asName()
@ -33,10 +28,12 @@ private data class RootToSolidContext(
val colorCache: MutableMap<Meta, String> = mutableMapOf(), val colorCache: MutableMap<Meta, String> = mutableMapOf(),
) )
// apply rotation from a matrix // converting to XYZ to TaitBryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix
private fun Solid.rotate(rot: DoubleArray) { private fun Solid.rotate(rot: DoubleArray) {
val matrix = VirtualMatrix(3, 3) { i, j -> rot[i * 3 + j] } val xAngle = atan2(-rot[5], rot[8])
quaternion = Quaternion.fromRotationMatrix(matrix) val yAngle = atan2(rot[2], sqrt(1.0 - rot[2].pow(2)))
val zAngle = atan2(-rot[1], rot[0])
rotation = Float32Vector3D(xAngle, yAngle, zAngle)
} }
private fun Solid.translate(trans: DoubleArray) { private fun Solid.translate(trans: DoubleArray) {

View File

@ -2,8 +2,6 @@ plugins {
id("space.kscience.gradle.mpp") id("space.kscience.gradle.mpp")
} }
group = "demo"
kscience { kscience {
jvm() jvm()
js { js {

View File

@ -1,19 +1,19 @@
plugins { plugins {
id("space.kscience.gradle.mpp") id("space.kscience.gradle.js")
} }
kscience { kscience{
useCoroutines() useCoroutines()
} }
kotlin { kotlin{
explicitApi = null explicitApi = null
js { js{
useCommonJs() useCommonJs()
browser { browser {
binaries.executable() binaries.executable()
commonWebpackConfig { commonWebpackConfig {
cssSupport { cssSupport{
enabled.set(false) enabled.set(false)
} }
} }
@ -21,15 +21,11 @@ kotlin {
} }
} }
kscience {
dependencies { dependencies{
implementation(projects.visionforge.visionforgeGdml) implementation(projects.visionforge.visionforgeGdml)
implementation(projects.visionforge.visionforgePlotly) implementation(projects.visionforge.visionforgePlotly)
implementation(projects.visionforge.visionforgeMarkdown) implementation(projects.visionforge.visionforgeMarkdown)
implementation(projects.visionforge.visionforgeThreejs) implementation(projects.visionforge.visionforgeThreejs)
} implementation(projects.ui.ring)
jsMain {
implementation(projects.ui.ring)
}
} }

View File

@ -34,8 +34,8 @@ kscience {
implementation("ch.qos.logback:logback-classic:1.2.11") implementation("ch.qos.logback:logback-classic:1.2.11")
} }
jsMain { jsMain {
implementation(projects.ui.ring) implementation(project(":ui:ring"))
implementation(projects.visionforgeThreejs) implementation(project(":visionforge-threejs"))
//implementation(devNpm("webpack-bundle-analyzer", "4.4.0")) //implementation(devNpm("webpack-bundle-analyzer", "4.4.0"))
} }
} }

View File

@ -15,13 +15,13 @@ import kotlin.math.sin
fun main() = serve { fun main() = serve {
// val azimuth = 60.degrees val azimuth = 60.degrees
// val inclination = 15.degrees val inclination = 15.degrees
// val direction = with(QuaternionField) { val direction = with(QuaternionField) {
// Quaternion.fromRotation(-azimuth, Euclidean3DSpace.zAxis) * Quaternion.fromRotation(-azimuth, Euclidean3DSpace.zAxis) *
// Quaternion.fromRotation(Angle.piDiv2 - inclination, Euclidean3DSpace.yAxis) Quaternion.fromRotation(Angle.piDiv2 - inclination, Euclidean3DSpace.yAxis)
// } }
//val direction2 = Quaternion.fromEuler(Angle.zero, Angle.piDiv2 - inclination, -azimuth, RotationOrder.ZYX) //val direction2 = Quaternion.fromEuler(Angle.zero, Angle.piDiv2 - inclination, -azimuth, RotationOrder.ZYX)
@ -43,7 +43,7 @@ fun main() = serve {
solidGroup("frame") { solidGroup("frame") {
z = 60 z = 60
solidGroup("antenna") { val antenna = solidGroup("antenna") {
axes(200) axes(200)
tube(40, 10, 30) tube(40, 10, 30)
sphereLayer(100, 95, theta = PI / 6) { sphereLayer(100, 95, theta = PI / 6) {

View File

@ -6,8 +6,5 @@ kotlin.incremental.js.ir=true
org.gradle.parallel=true org.gradle.parallel=true
org.gradle.jvmargs=-Xmx4G org.gradle.jvmargs=-Xmx4G
toolsVersion=0.14.9-kotlin-1.8.20
org.jetbrains.compose.experimental.jscanvas.enabled=true org.jetbrains.compose.experimental.jscanvas.enabled=true
toolsVersion=0.15.0-kotlin-1.9.20-Beta
#kotlin.experimental.tryK2=true
#kscience.wasm.disabled=true

View File

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

View File

@ -1,19 +1,15 @@
plugins { plugins {
id("space.kscience.gradle.mpp") kotlin("js")
id("space.kscience.gradle.js")
} }
val dataforgeVersion: String by rootProject.extra val dataforgeVersion: String by rootProject.extra
kscience{ dependencies {
js() api(project(":visionforge-solid"))
jsMain{ api(project(":ui:react"))
dependencies { implementation(npm("file-saver", "2.0.2"))
api(project(":visionforge-solid")) implementation(npm("bootstrap","4.6.0"))
api(project(":ui:react")) implementation(npm("jquery","3.5.1"))
implementation(npm("file-saver", "2.0.2")) implementation(npm("popper.js","1.16.1"))
implementation(npm("bootstrap","4.6.0"))
implementation(npm("jquery","3.5.1"))
implementation(npm("popper.js","1.16.1"))
}
}
} }

View File

@ -8,7 +8,7 @@ import kotlinx.css.padding
import kotlinx.css.properties.border import kotlinx.css.properties.border
import kotlinx.css.px import kotlinx.css.px
import kotlinx.html.js.onClickFunction import kotlinx.html.js.onClickFunction
import org.w3c.dom.events.Event import kotlinx.html.org.w3c.dom.events.Event
import org.w3c.files.Blob import org.w3c.files.Blob
import org.w3c.files.BlobPropertyBag import org.w3c.files.BlobPropertyBag
import react.FC import react.FC

View File

@ -1,16 +1,11 @@
plugins { plugins {
id("space.kscience.gradle.mpp") id("space.kscience.gradle.js")
} }
kscience { dependencies{
js() api(project(":visionforge-solid"))
jsMain { api("org.jetbrains.kotlin-wrappers:kotlin-styled")
dependencies { api("org.jetbrains.kotlin-wrappers:kotlin-react-dom")
api(projects.visionforgeSolid)
api("org.jetbrains.kotlin-wrappers:kotlin-styled")
api("org.jetbrains.kotlin-wrappers:kotlin-react-dom")
// implementation(npm("react-select","4.3.0")) // implementation(npm("react-select","4.3.0"))
api(projects.visionforgeThreejs) implementation(project(":visionforge-threejs"))
}
}
} }

View File

@ -3,7 +3,7 @@ package space.kscience.visionforge.react
import kotlinx.css.Align import kotlinx.css.Align
import kotlinx.css.alignItems import kotlinx.css.alignItems
import kotlinx.html.js.onClickFunction import kotlinx.html.js.onClickFunction
import org.w3c.dom.events.Event import kotlinx.html.org.w3c.dom.events.Event
import react.* import react.*
import react.dom.a import react.dom.a
import react.dom.attrs import react.dom.attrs

View File

@ -1,10 +1,10 @@
package space.kscience.visionforge.react package space.kscience.visionforge.react
import kotlinx.html.js.onChangeFunction import kotlinx.html.js.onChangeFunction
import kotlinx.html.org.w3c.dom.events.Event
import org.w3c.dom.HTMLOptionElement import org.w3c.dom.HTMLOptionElement
import org.w3c.dom.HTMLSelectElement import org.w3c.dom.HTMLSelectElement
import org.w3c.dom.asList import org.w3c.dom.asList
import org.w3c.dom.events.Event
import react.FC import react.FC
import react.dom.attrs import react.dom.attrs
import react.dom.option import react.dom.option

View File

@ -10,16 +10,13 @@ import kotlinx.coroutines.launch
import kotlinx.css.* import kotlinx.css.*
import kotlinx.css.properties.TextDecoration import kotlinx.css.properties.TextDecoration
import kotlinx.html.js.onClickFunction import kotlinx.html.js.onClickFunction
import org.w3c.dom.events.Event import kotlinx.html.org.w3c.dom.events.Event
import react.* import react.*
import react.dom.attrs import react.dom.attrs
import space.kscience.dataforge.meta.MutableMeta import space.kscience.dataforge.meta.*
import space.kscience.dataforge.meta.ObservableMutableMeta
import space.kscience.dataforge.meta.descriptors.MetaDescriptor import space.kscience.dataforge.meta.descriptors.MetaDescriptor
import space.kscience.dataforge.meta.descriptors.ValueRequirement import space.kscience.dataforge.meta.descriptors.ValueRequirement
import space.kscience.dataforge.meta.descriptors.get import space.kscience.dataforge.meta.descriptors.get
import space.kscience.dataforge.meta.get
import space.kscience.dataforge.meta.remove
import space.kscience.dataforge.names.* import space.kscience.dataforge.names.*
import space.kscience.visionforge.hidden import space.kscience.visionforge.hidden
import styled.css import styled.css
@ -151,7 +148,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) {
css { css {
//+TreeStyles.resizeableInput //+TreeStyles.resizeableInput
width = 160.px width = 160.px
margin = Margin(1.px, 5.px) margin(1.px, 5.px)
} }
ValueChooser { ValueChooser {
attrs { attrs {
@ -170,7 +167,7 @@ private fun RBuilder.propertyEditorItem(props: PropertyEditorProps) {
css { css {
width = 24.px width = 24.px
alignSelf = Align.stretch alignSelf = Align.stretch
margin = Margin(1.px, 5.px) margin(1.px, 5.px)
backgroundColor = Color.white backgroundColor = Color.white
borderStyle = BorderStyle.solid borderStyle = BorderStyle.solid
borderRadius = 2.px borderRadius = 2.px

View File

@ -4,9 +4,8 @@ import kotlinx.css.pct
import kotlinx.css.width import kotlinx.css.width
import kotlinx.html.InputType import kotlinx.html.InputType
import kotlinx.html.js.onChangeFunction import kotlinx.html.js.onChangeFunction
import kotlinx.html.js.onInputFunction import kotlinx.html.org.w3c.dom.events.Event
import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLInputElement
import org.w3c.dom.events.Event
import react.FC import react.FC
import react.dom.attrs import react.dom.attrs
import react.fc import react.fc
@ -59,8 +58,8 @@ public val RangeValueChooser: FC<ValueChooserProps> = fc("RangeValueChooser") {
attrs { attrs {
disabled = rangeDisabled disabled = rangeDisabled
value = innerValue?.toString() ?: "" value = innerValue?.toString() ?: ""
// onChangeFunction = handleChange onChangeFunction = handleChange
onInputFunction = handleChange consumer.onTagEvent(this, "input", handleChange)
val minValue = props.descriptor?.attributes?.get("min").string val minValue = props.descriptor?.attributes?.get("min").string
minValue?.let { minValue?.let {
min = it min = it

View File

@ -52,10 +52,10 @@ public object TreeStyles : StyleSheet("treeStyles", true) {
} }
public val treeLabel:RuleSet by css { public val treeLabel:RuleSet by css {
border = Border.none border = "none"
padding = Padding(left = 4.pt, right = 4.pt, top = 0.pt, bottom = 0.pt) padding(left = 4.pt, right = 4.pt, top = 0.pt, bottom = 0.pt)
textAlign = TextAlign.left textAlign = TextAlign.left
flex = Flex(1.0) flex(1.0)
} }
public val treeLabelInactive: RuleSet by css { public val treeLabelInactive: RuleSet by css {

View File

@ -1,10 +1,13 @@
package space.kscience.visionforge.react package space.kscience.visionforge.react
import kotlinx.css.* import kotlinx.css.Color
import kotlinx.css.properties.TextDecoration import kotlinx.css.Cursor
import kotlinx.css.color
import kotlinx.css.cursor
import kotlinx.css.properties.TextDecorationLine import kotlinx.css.properties.TextDecorationLine
import kotlinx.css.properties.textDecoration
import kotlinx.html.js.onClickFunction import kotlinx.html.js.onClickFunction
import org.w3c.dom.events.Event import kotlinx.html.org.w3c.dom.events.Event
import react.* import react.*
import react.dom.attrs import react.dom.attrs
import space.kscience.dataforge.names.Name import space.kscience.dataforge.names.Name
@ -34,7 +37,7 @@ private val TreeLabel = fc<ObjectTreeProps> { props ->
color = Color("#069") color = Color("#069")
cursor = Cursor.pointer cursor = Cursor.pointer
hover { hover {
textDecoration = TextDecoration(setOf(TextDecorationLine.underline)) textDecoration(TextDecorationLine.underline)
} }
if (props.name == props.selected) { if (props.name == props.selected) {
+TreeStyles.treeLabelSelected +TreeStyles.treeLabelSelected

View File

@ -1,12 +1,15 @@
package space.kscience.visionforge.react package space.kscience.visionforge.react
import kotlinx.css.* import kotlinx.css.margin
import kotlinx.css.pct
import kotlinx.css.px
import kotlinx.css.width
import kotlinx.html.InputType import kotlinx.html.InputType
import kotlinx.html.js.onChangeFunction import kotlinx.html.js.onChangeFunction
import kotlinx.html.js.onKeyDownFunction import kotlinx.html.js.onKeyDownFunction
import kotlinx.html.org.w3c.dom.events.Event
import org.w3c.dom.HTMLInputElement import org.w3c.dom.HTMLInputElement
import org.w3c.dom.HTMLSelectElement import org.w3c.dom.HTMLSelectElement
import org.w3c.dom.events.Event
import react.FC import react.FC
import react.Props import react.Props
import react.dom.attrs import react.dom.attrs
@ -142,7 +145,7 @@ public val ColorValueChooser: FC<ValueChooserProps> = fc("ColorValueChooser") {
styledInput(type = InputType.color) { styledInput(type = InputType.color) {
css { css {
width = 100.pct width = 100.pct
margin = Margin(0.px) margin(0.px)
} }
attrs { attrs {
this.value = props.value?.let { value -> this.value = props.value?.let { value ->

View File

@ -1,11 +1,11 @@
plugins { plugins {
id("space.kscience.gradle.mpp") id("space.kscience.gradle.js")
} }
val dataforgeVersion: String by rootProject.extra val dataforgeVersion: String by rootProject.extra
kscience{ kotlin{
js{ js(IR){
useCommonJs() useCommonJs()
browser { browser {
commonWebpackConfig { commonWebpackConfig {
@ -15,11 +15,12 @@ kscience{
} }
} }
} }
jsMain{ }
api(projects.ui.react)
api("org.jetbrains.kotlin-wrappers:kotlin-ring-ui") dependencies{
api(project(":ui:react"))
implementation(npm("core-js","3.12.1")) api("org.jetbrains.kotlin-wrappers:kotlin-ring-ui")
implementation(npm("file-saver", "2.0.2"))
} implementation(npm("core-js","3.12.1"))
implementation(npm("file-saver", "2.0.2"))
} }

View File

@ -8,7 +8,7 @@ import kotlinx.css.padding
import kotlinx.css.properties.border import kotlinx.css.properties.border
import kotlinx.css.px import kotlinx.css.px
import kotlinx.html.js.onClickFunction import kotlinx.html.js.onClickFunction
import org.w3c.dom.events.Event import kotlinx.html.org.w3c.dom.events.Event
import org.w3c.files.Blob import org.w3c.files.Blob
import org.w3c.files.BlobPropertyBag import org.w3c.files.BlobPropertyBag
import react.FC import react.FC

View File

@ -9,7 +9,7 @@ kscience {
} }
dependencies { dependencies {
api(projects.visionforgeSolid) api(projects.visionforgeSolid)
api("space.kscience:gdml:0.5.0") api("space.kscience:gdml:0.4.0")
} }
dependencies(jvmTest) { dependencies(jvmTest) {
implementation(spclibs.logback.classic) implementation(spclibs.logback.classic)

View File

@ -206,7 +206,7 @@ public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f)
/** /**
* Raw quaternion value defined in properties * Raw quaternion value defined in properties
*/ */
public var Solid.quaternionOrNull: Quaternion? public var Solid.quaternionValue: Quaternion?
get() = properties.getValue(ROTATION_KEY)?.list?.let { get() = properties.getValue(ROTATION_KEY)?.list?.let {
require(it.size == 4) { "Quaternion must be a number array of 4 elements" } require(it.size == 4) { "Quaternion must be a number array of 4 elements" }
Quaternion(it[0].float, it[1].float, it[2].float, it[3].float) Quaternion(it[0].float, it[1].float, it[2].float, it[3].float)
@ -229,14 +229,14 @@ public var Solid.quaternionOrNull: Quaternion?
* Quaternion value including information from euler angles * Quaternion value including information from euler angles
*/ */
public var Solid.quaternion: Quaternion public var Solid.quaternion: Quaternion
get() = quaternionOrNull ?: Quaternion.fromEuler( get() = quaternionValue ?: Quaternion.fromEuler(
rotationX.radians, rotationX.radians,
rotationY.radians, rotationY.radians,
rotationZ.radians, rotationZ.radians,
rotationOrder rotationOrder
) )
set(value) { set(value) {
quaternionOrNull = value quaternionValue = value
} }
public var Solid.scaleX: Number by float(X_SCALE_KEY, 1f) public var Solid.scaleX: Number by float(X_SCALE_KEY, 1f)

View File

@ -25,8 +25,8 @@ public class TableVisionJsPlugin : AbstractPlugin(), ElementVisionRenderer {
override fun attach(context: Context) { override fun attach(context: Context) {
super.attach(context) super.attach(context)
kotlinext.js.require<Any>("tabulator-tables/dist/css/tabulator.min.css") kotlinext.js.require("tabulator-tables/dist/css/tabulator.min.css")
kotlinext.js.require<Any>("tabulator-tables/src/js/modules/ResizeColumns/ResizeColumns.js") kotlinext.js.require("tabulator-tables/src/js/modules/ResizeColumns/ResizeColumns.js")
} }
override fun rateVision(vision: Vision): Int = when (vision) { override fun rateVision(vision: Vision): Int = when (vision) {

View File

@ -1,23 +1,17 @@
plugins { plugins {
id("space.kscience.gradle.mpp") id("space.kscience.gradle.js")
} }
kotlin{ kotlin{
explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled explicitApi = org.jetbrains.kotlin.gradle.dsl.ExplicitApiMode.Disabled
}
kscience{
js{ js{
binaries.library() binaries.library()
} }
jsMain{
dependencies {
api(projects.visionforgeSolid)
implementation(npm("three", "0.143.0"))
implementation(npm("three-csg-ts", "3.1.10"))
implementation(npm("three.meshline","1.4.0"))
}
}
} }
dependencies {
api(projects.visionforgeSolid)
implementation(npm("three", "0.143.0"))
implementation(npm("three-csg-ts", "3.1.10"))
implementation(npm("three.meshline","1.4.0"))
}

View File

@ -41,7 +41,7 @@ public fun Object3D.updatePosition(vision: Vision) {
if (vision is Solid) { if (vision is Solid) {
position.set(vision.x, vision.y, vision.z) position.set(vision.x, vision.y, vision.z)
val quaternion = vision.quaternionOrNull val quaternion = vision.quaternionValue
if (quaternion != null) { if (quaternion != null) {
setRotationFromQuaternion( setRotationFromQuaternion(

Some files were not shown because too many files have changed in this diff Show More