Move Vector3D to common instead of expect/actual
This commit is contained in:
parent
dc805228b4
commit
d1607459a1
@ -78,7 +78,7 @@ val GDMLApp = functionalComponent<GDMLAppProps>("GDMLApp") { props ->
|
||||
}
|
||||
flexColumn {
|
||||
css {
|
||||
flex(10.0, 10.0, FlexBasis.zero)
|
||||
flex(1.0, 1.0, FlexBasis.auto)
|
||||
}
|
||||
styledDiv {
|
||||
css {
|
||||
@ -106,10 +106,11 @@ val GDMLApp = functionalComponent<GDMLAppProps>("GDMLApp") { props ->
|
||||
}
|
||||
flexColumn {
|
||||
css {
|
||||
minWidth = 500.px
|
||||
minWidth = 400.px
|
||||
height = 100.pct
|
||||
margin(left = 4.px, right = 4.px, top = 4.px)
|
||||
border(1.px, BorderStyle.solid, Color.lightGray)
|
||||
flex(0.0,1.0, FlexBasis.zero)
|
||||
}
|
||||
fileDrop("(drag file here)") { files ->
|
||||
val file = files?.get(0)
|
||||
|
@ -1,10 +1,7 @@
|
||||
@file:UseSerializers(Point3DSerializer::class)
|
||||
package ru.mipt.npm.muon.monitor
|
||||
|
||||
import hep.dataforge.vision.solid.Point3D
|
||||
import hep.dataforge.vision.solid.Point3DSerializer
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
|
||||
typealias Track = List<Point3D>
|
||||
|
||||
|
@ -1,5 +1,3 @@
|
||||
@file:UseSerializers(Point3DSerializer::class)
|
||||
|
||||
package hep.dataforge.vision.solid.demo
|
||||
|
||||
import hep.dataforge.meta.int
|
||||
@ -20,7 +18,6 @@ import info.laht.threekt.core.BufferGeometry
|
||||
import info.laht.threekt.core.Object3D
|
||||
import info.laht.threekt.geometries.BoxBufferGeometry
|
||||
import info.laht.threekt.objects.Mesh
|
||||
import kotlinx.serialization.UseSerializers
|
||||
import kotlin.math.max
|
||||
|
||||
internal fun SolidGroup.varBox(
|
||||
|
@ -1,7 +1,6 @@
|
||||
package hep.dataforge.vision.bootstrap
|
||||
|
||||
import hep.dataforge.vision.react.flexColumn
|
||||
import kotlinx.css.*
|
||||
import kotlinx.html.DIV
|
||||
import kotlinx.html.classes
|
||||
import kotlinx.html.js.onClickFunction
|
||||
@ -10,7 +9,6 @@ import react.dom.button
|
||||
import react.dom.li
|
||||
import react.dom.ul
|
||||
import styled.StyledDOMBuilder
|
||||
import styled.css
|
||||
import styled.styledDiv
|
||||
|
||||
public external class TabProps : RProps {
|
||||
@ -40,9 +38,6 @@ public val TabPane: FunctionalComponent<TabPaneProps> = functionalComponent("Tab
|
||||
}
|
||||
|
||||
flexColumn {
|
||||
css {
|
||||
flexGrow = 1.0
|
||||
}
|
||||
ul("nav nav-tabs") {
|
||||
childrenProps.forEach { cp ->
|
||||
li("nav-item") {
|
||||
@ -74,10 +69,6 @@ public class TabBuilder(internal val parentBuilder: RBuilder) {
|
||||
this.title = title
|
||||
}
|
||||
styledDiv {
|
||||
css {
|
||||
height = 100.pct
|
||||
overflowY = Overflow.auto
|
||||
}
|
||||
builder()
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ public val ThreeControls: FunctionalComponent<ThreeControlsProps> = functionalCo
|
||||
h2 { +"Object tree" }
|
||||
styledDiv {
|
||||
css {
|
||||
flex(1.0, 0.0, FlexBasis.auto)
|
||||
flex(1.0, 1.0, FlexBasis.inherit)
|
||||
}
|
||||
props.canvas.content?.let {
|
||||
objectTree(it, props.selected, props.onSelect)
|
||||
|
@ -14,7 +14,7 @@ import tornadofx.*
|
||||
/**
|
||||
* Created by darksnake on 01-May-17.
|
||||
*/
|
||||
class ColorValueChooser : ValueChooserBase<ColorPicker>() {
|
||||
public class ColorValueChooser : ValueChooserBase<ColorPicker>() {
|
||||
private fun ColorPicker.setColor(value: Value?) {
|
||||
if (value != null && value != Null) {
|
||||
try {
|
||||
|
@ -17,7 +17,7 @@ import javafx.scene.control.ComboBox
|
||||
import javafx.util.StringConverter
|
||||
import java.util.*
|
||||
|
||||
class ComboBoxValueChooser(val values: Collection<Value>? = null) : ValueChooserBase<ComboBox<Value>>() {
|
||||
public class ComboBoxValueChooser(public val values: Collection<Value>? = null) : ValueChooserBase<ComboBox<Value>>() {
|
||||
|
||||
// @Override
|
||||
// protected void displayError(String error) {
|
||||
|
@ -114,20 +114,20 @@ private class GDMLTransformer(val settings: GDMLTransformerSettings) {
|
||||
): T = apply {
|
||||
newPos?.let {
|
||||
val point = Point3D(it.x(settings.lUnit), it.y(settings.lUnit), it.z(settings.lUnit))
|
||||
if (position != null || point != World.ZERO) {
|
||||
if (position != null || point != Point3D.ZERO) {
|
||||
position = point
|
||||
}
|
||||
}
|
||||
newRotation?.let {
|
||||
val point = Point3D(it.x(settings.aUnit), it.y(settings.aUnit), it.z(settings.aUnit))
|
||||
if (rotation != null || point != World.ZERO) {
|
||||
if (rotation != null || point != Point3D.ZERO) {
|
||||
rotation = point
|
||||
}
|
||||
//this@withPosition.rotationOrder = RotationOrder.ZXY
|
||||
}
|
||||
newScale?.let {
|
||||
val point = Point3D(it.x, it.y, it.z)
|
||||
if (scale != null || point != World.ONE) {
|
||||
if (scale != null || point != Point3D.ONE) {
|
||||
scale = point
|
||||
}
|
||||
}
|
||||
|
@ -15,13 +15,10 @@ import kotlinx.serialization.Serializable
|
||||
public open class BasicSolid : VisionBase(), Solid {
|
||||
override val descriptor: NodeDescriptor get() = Solid.descriptor
|
||||
|
||||
@Serializable(Point3DSerializer::class)
|
||||
override var position: Point3D? = null
|
||||
|
||||
@Serializable(Point3DSerializer::class)
|
||||
override var rotation: Point3D? = null
|
||||
|
||||
@Serializable(Point3DSerializer::class)
|
||||
override var scale: Point3D? = null
|
||||
|
||||
override fun update(change: Vision) {
|
||||
|
@ -1,5 +1,3 @@
|
||||
@file:UseSerializers(Point3DSerializer::class)
|
||||
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
import hep.dataforge.vision.VisionContainerBuilder
|
||||
@ -7,7 +5,6 @@ import hep.dataforge.vision.set
|
||||
import hep.dataforge.vision.solid.Solid.Companion.solidEquals
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
|
||||
@Serializable
|
||||
@SerialName("solid.box")
|
||||
|
@ -1,4 +1,3 @@
|
||||
@file:UseSerializers(Point3DSerializer::class)
|
||||
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
@ -7,7 +6,6 @@ import hep.dataforge.names.NameToken
|
||||
import hep.dataforge.vision.*
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
|
||||
public enum class CompositeType {
|
||||
UNION,
|
||||
|
@ -1,12 +1,9 @@
|
||||
@file:UseSerializers(Point3DSerializer::class)
|
||||
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
import hep.dataforge.vision.VisionContainerBuilder
|
||||
import hep.dataforge.vision.set
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
import kotlin.math.cos
|
||||
import kotlin.math.sin
|
||||
|
||||
|
@ -1,12 +1,9 @@
|
||||
@file:UseSerializers(Point3DSerializer::class)
|
||||
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
import hep.dataforge.vision.VisionContainerBuilder
|
||||
import hep.dataforge.vision.set
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
|
||||
@Serializable
|
||||
@SerialName("solid.convex")
|
||||
|
@ -1,11 +1,9 @@
|
||||
@file:UseSerializers(Point2DSerializer::class, Point3DSerializer::class)
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
import hep.dataforge.vision.VisionContainerBuilder
|
||||
import hep.dataforge.vision.set
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
import kotlin.math.PI
|
||||
import kotlin.math.cos
|
||||
import kotlin.math.sin
|
||||
|
@ -1,5 +1,3 @@
|
||||
@file:UseSerializers(Point3DSerializer::class)
|
||||
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
import hep.dataforge.meta.number
|
||||
@ -11,7 +9,6 @@ import hep.dataforge.vision.props
|
||||
import hep.dataforge.vision.set
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.UseSerializers
|
||||
|
||||
@Serializable
|
||||
@SerialName("solid.line")
|
||||
|
@ -5,8 +5,13 @@ import hep.dataforge.meta.descriptors.NodeDescriptor
|
||||
import hep.dataforge.names.Name
|
||||
import hep.dataforge.names.NameToken
|
||||
import hep.dataforge.vision.*
|
||||
import kotlinx.serialization.KSerializer
|
||||
import kotlinx.serialization.SerialName
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.builtins.MapSerializer
|
||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
import kotlinx.serialization.encoding.Decoder
|
||||
import kotlinx.serialization.encoding.Encoder
|
||||
|
||||
public interface PrototypeHolder {
|
||||
public val parent: VisionGroup?
|
||||
@ -25,7 +30,7 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder {
|
||||
/**
|
||||
* A container for templates visible inside this group
|
||||
*/
|
||||
@Serializable(PrototypesSerializer::class)
|
||||
@Serializable(Prototypes.Companion::class)
|
||||
override var prototypes: MutableVisionGroup? = null
|
||||
private set
|
||||
|
||||
@ -39,13 +44,10 @@ public class SolidGroup : VisionGroupBase(), Solid, PrototypeHolder {
|
||||
}).run(builder)
|
||||
}
|
||||
|
||||
@Serializable(Point3DSerializer::class)
|
||||
override var position: Point3D? = null
|
||||
|
||||
@Serializable(Point3DSerializer::class)
|
||||
override var rotation: Point3D? = null
|
||||
|
||||
@Serializable(Point3DSerializer::class)
|
||||
override var scale: Point3D? = null
|
||||
|
||||
override fun attachChildren() {
|
||||
@ -91,7 +93,7 @@ public fun MutableVisionGroup.group(name: String, action: SolidGroup.() -> Unit
|
||||
/**
|
||||
* A special class which works as a holder for prototypes
|
||||
*/
|
||||
@Serializable(PrototypesSerializer::class)
|
||||
@Serializable(Prototypes.Companion::class)
|
||||
internal class Prototypes(
|
||||
children: Map<NameToken, Vision> = emptyMap(),
|
||||
) : VisionGroupBase(), PrototypeHolder {
|
||||
@ -118,4 +120,24 @@ internal class Prototypes(
|
||||
(it as? VisionGroup)?.attachChildren()
|
||||
}
|
||||
}
|
||||
|
||||
companion object : KSerializer<MutableVisionGroup> {
|
||||
|
||||
private val mapSerializer: KSerializer<Map<NameToken, Vision>> =
|
||||
MapSerializer(
|
||||
NameToken.serializer(),
|
||||
Vision.serializer()
|
||||
)
|
||||
|
||||
override val descriptor: SerialDescriptor get() = mapSerializer.descriptor
|
||||
|
||||
override fun deserialize(decoder: Decoder): MutableVisionGroup {
|
||||
val map = mapSerializer.deserialize(decoder)
|
||||
return Prototypes(map)
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: MutableVisionGroup) {
|
||||
mapSerializer.serialize(encoder, value.children)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,10 @@ import hep.dataforge.vision.VisionGroupBase
|
||||
import hep.dataforge.vision.VisionManager
|
||||
import hep.dataforge.vision.VisionManager.Companion.VISION_SERIALIZER_MODULE_TARGET
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.modules.*
|
||||
import kotlinx.serialization.modules.PolymorphicModuleBuilder
|
||||
import kotlinx.serialization.modules.SerializersModule
|
||||
import kotlinx.serialization.modules.polymorphic
|
||||
import kotlinx.serialization.modules.subclass
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
|
||||
@ -47,9 +50,6 @@ public class SolidManager(meta: Meta) : AbstractPlugin(meta) {
|
||||
}
|
||||
|
||||
public val serializersModuleForSolids: SerializersModule = SerializersModule {
|
||||
contextual(Point3DSerializer)
|
||||
contextual(Point2DSerializer)
|
||||
|
||||
polymorphic(Vision::class) {
|
||||
subclass(VisionGroupBase.serializer())
|
||||
solids()
|
||||
|
@ -2,45 +2,47 @@ package hep.dataforge.vision.solid
|
||||
|
||||
import hep.dataforge.meta.Meta
|
||||
import hep.dataforge.meta.MetaBuilder
|
||||
import hep.dataforge.meta.double
|
||||
import hep.dataforge.meta.get
|
||||
import hep.dataforge.meta.number
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlin.math.PI
|
||||
|
||||
public object World {
|
||||
public val ZERO: Point3D = Point3D(0.0, 0.0, 0.0)
|
||||
public val ONE: Point3D = Point3D(1.0, 1.0, 1.0)
|
||||
}
|
||||
|
||||
public const val PI2: Float = 2 * PI.toFloat()
|
||||
|
||||
public expect class Point2D(x: Number, y: Number) {
|
||||
public var x: Double
|
||||
public var y: Double
|
||||
@Serializable
|
||||
public data class Point2D(public var x: Double, public var y: Double){
|
||||
public constructor(x: Number, y: Number) : this(x.toDouble(), y.toDouble())
|
||||
}
|
||||
|
||||
public operator fun Point2D.component1(): Double = x
|
||||
public operator fun Point2D.component2(): Double = y
|
||||
|
||||
public fun Point2D.toMeta(): Meta = Meta {
|
||||
Solid.X_KEY put x
|
||||
Solid.Y_KEY put y
|
||||
}
|
||||
|
||||
internal fun Meta.point2D(): Point2D = Point2D(this["x"].number ?: 0, this["y"].number ?: 0)
|
||||
internal fun Meta.point2D(): Point2D = Point2D(this["x"].double ?: 0.0, this["y"].double ?: 0.0)
|
||||
|
||||
public expect class Point3D(x: Number, y: Number, z: Number) {
|
||||
public var x: Double
|
||||
public var y: Double
|
||||
public var z: Double
|
||||
@Serializable
|
||||
public data class Point3D(
|
||||
public var x: Double,
|
||||
public var y: Double,
|
||||
public var z: Double,
|
||||
) {
|
||||
public constructor(x: Number, y: Number, z: Number) : this(x.toDouble(), y.toDouble(), z.toDouble())
|
||||
|
||||
public companion object{
|
||||
public val ZERO: Point3D = Point3D(0.0, 0.0, 0.0)
|
||||
public val ONE: Point3D = Point3D(1.0, 1.0, 1.0)
|
||||
}
|
||||
}
|
||||
|
||||
public expect operator fun Point3D.plus(other: Point3D): Point3D
|
||||
public operator fun Point3D.plus(other: Point3D): Point3D = Point3D(
|
||||
this.x + other.x,
|
||||
this.y + other.y,
|
||||
this.z + other.z
|
||||
)
|
||||
|
||||
public operator fun Point3D.component1(): Double = x
|
||||
public operator fun Point3D.component2(): Double = y
|
||||
public operator fun Point3D.component3(): Double = z
|
||||
|
||||
internal fun Meta.point3D() = Point3D(this["x"].number ?: 0, this["y"].number ?: 0, this["y"].number ?: 0)
|
||||
internal fun Meta.point3D() = Point3D(this["x"].double ?: 0.0, this["y"].double ?: 0.0, this["y"].double ?: 0.0)
|
||||
|
||||
public fun Point3D.toMeta(): MetaBuilder = Meta {
|
||||
Solid.X_KEY put x
|
||||
|
@ -1,100 +0,0 @@
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
import hep.dataforge.names.NameToken
|
||||
import hep.dataforge.vision.MutableVisionGroup
|
||||
import hep.dataforge.vision.Vision
|
||||
import kotlinx.serialization.*
|
||||
import kotlinx.serialization.builtins.MapSerializer
|
||||
import kotlinx.serialization.builtins.nullable
|
||||
import kotlinx.serialization.builtins.serializer
|
||||
import kotlinx.serialization.descriptors.SerialDescriptor
|
||||
import kotlinx.serialization.descriptors.buildClassSerialDescriptor
|
||||
import kotlinx.serialization.descriptors.element
|
||||
import kotlinx.serialization.encoding.*
|
||||
|
||||
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
public object Point3DSerializer : KSerializer<Point3D> {
|
||||
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("hep.dataforge.vis.spatial.Point3D") {
|
||||
element<Double>("x")
|
||||
element<Double>("y")
|
||||
element<Double>("z")
|
||||
}
|
||||
|
||||
override fun deserialize(decoder: Decoder): Point3D {
|
||||
var x: Double? = null
|
||||
var y: Double? = null
|
||||
var z: Double? = null
|
||||
decoder.decodeStructure(descriptor) {
|
||||
loop@ while (true) {
|
||||
when (val i = decodeElementIndex(descriptor)) {
|
||||
CompositeDecoder.DECODE_DONE -> break@loop
|
||||
0 -> x = decodeNullableSerializableElement(descriptor, 0, Double.serializer().nullable) ?: 0.0
|
||||
1 -> y = decodeNullableSerializableElement(descriptor, 1, Double.serializer().nullable) ?: 0.0
|
||||
2 -> z = decodeNullableSerializableElement(descriptor, 2, Double.serializer().nullable) ?: 0.0
|
||||
else -> throw SerializationException("Unknown index $i")
|
||||
}
|
||||
}
|
||||
}
|
||||
return Point3D(x ?: 0.0, y ?: 0.0, z ?: 0.0)
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: Point3D) {
|
||||
encoder.encodeStructure(descriptor) {
|
||||
if (value.x != 0.0) encodeDoubleElement(descriptor, 0, value.x)
|
||||
if (value.y != 0.0) encodeDoubleElement(descriptor, 1, value.y)
|
||||
if (value.z != 0.0) encodeDoubleElement(descriptor, 2, value.z)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@OptIn(ExperimentalSerializationApi::class)
|
||||
public object Point2DSerializer : KSerializer<Point2D> {
|
||||
override val descriptor: SerialDescriptor = buildClassSerialDescriptor("hep.dataforge.vis.spatial.Point2D") {
|
||||
element<Double>("x")
|
||||
element<Double>("y")
|
||||
}
|
||||
|
||||
override fun deserialize(decoder: Decoder): Point2D {
|
||||
var x: Double? = null
|
||||
var y: Double? = null
|
||||
decoder.decodeStructure(descriptor) {
|
||||
loop@ while (true) {
|
||||
when (val i = decodeElementIndex(descriptor)) {
|
||||
CompositeDecoder.DECODE_DONE -> break@loop
|
||||
0 -> x = decodeNullableSerializableElement(descriptor, 0, Double.serializer().nullable) ?: 0.0
|
||||
1 -> y = decodeNullableSerializableElement(descriptor, 1, Double.serializer().nullable) ?: 0.0
|
||||
else -> throw SerializationException("Unknown index $i")
|
||||
}
|
||||
}
|
||||
}
|
||||
return Point2D(x ?: 0.0, y ?: 0.0)
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: Point2D) {
|
||||
encoder.encodeStructure(descriptor) {
|
||||
if (value.x != 0.0) encodeDoubleElement(descriptor, 0, value.x)
|
||||
if (value.y != 0.0) encodeDoubleElement(descriptor, 1, value.y)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
internal object PrototypesSerializer : KSerializer<MutableVisionGroup> {
|
||||
|
||||
private val mapSerializer: KSerializer<Map<NameToken, Vision>> =
|
||||
MapSerializer(
|
||||
NameToken.serializer(),
|
||||
Vision.serializer()
|
||||
)
|
||||
|
||||
override val descriptor: SerialDescriptor get() = mapSerializer.descriptor
|
||||
|
||||
override fun deserialize(decoder: Decoder): MutableVisionGroup {
|
||||
val map = mapSerializer.deserialize(decoder)
|
||||
return Prototypes(map)
|
||||
}
|
||||
|
||||
override fun serialize(encoder: Encoder, value: MutableVisionGroup) {
|
||||
mapSerializer.serialize(encoder, value.children)
|
||||
}
|
||||
}
|
@ -17,8 +17,8 @@ internal fun mergeChild(parent: VisionGroup, child: Vision): Vision {
|
||||
//parent.properties?.let { config.update(it) }
|
||||
|
||||
if (this is Solid && parent is Solid) {
|
||||
position = (position ?: World.ZERO) + (parent.position ?: World.ZERO)
|
||||
rotation = (parent.rotation ?: World.ZERO) + (parent.rotation ?: World.ZERO)
|
||||
position = (position ?: Point3D.ZERO) + (parent.position ?: Point3D.ZERO)
|
||||
rotation = (parent.rotation ?: Point3D.ZERO) + (parent.rotation ?: Point3D.ZERO)
|
||||
scale = when {
|
||||
scale == null && parent.scale == null -> null
|
||||
scale == null -> parent.scale
|
||||
|
@ -1,14 +0,0 @@
|
||||
package hep.dataforge.vision.solid
|
||||
|
||||
|
||||
import info.laht.threekt.math.Vector2
|
||||
import info.laht.threekt.math.Vector3
|
||||
import info.laht.threekt.math.plus
|
||||
|
||||
public actual typealias Point2D = Vector2
|
||||
|
||||
public actual typealias Point3D = Vector3
|
||||
|
||||
public actual operator fun Point3D.plus(other: Point3D): Point3D {
|
||||
return this.plus(other)
|
||||
}
|
@ -10,12 +10,14 @@ import info.laht.threekt.core.Face3
|
||||
import info.laht.threekt.core.Geometry
|
||||
import info.laht.threekt.math.Vector3
|
||||
|
||||
internal fun Point3D.toVector() = Vector3(x, y, z)
|
||||
|
||||
/**
|
||||
* An implementation of geometry builder for Three.js [BufferGeometry]
|
||||
*/
|
||||
public class ThreeGeometryBuilder : GeometryBuilder<BufferGeometry> {
|
||||
|
||||
private val vertices = ArrayList<Point3D>()
|
||||
private val vertices = ArrayList<Vector3>()
|
||||
private val faces = ArrayList<Face3>()
|
||||
|
||||
private val vertexCache = HashMap<Point3D, Int>()
|
||||
@ -25,14 +27,14 @@ public class ThreeGeometryBuilder : GeometryBuilder<BufferGeometry> {
|
||||
return if (index > 0) {
|
||||
index
|
||||
} else {
|
||||
vertices.add(vertex)
|
||||
vertices.add(vertex.toVector())
|
||||
vertexCache[vertex] = vertices.size - 1
|
||||
vertices.size - 1
|
||||
}
|
||||
}
|
||||
|
||||
override fun face(vertex1: Point3D, vertex2: Point3D, vertex3: Point3D, normal: Point3D?, meta: Meta) {
|
||||
val face = Face3(append(vertex1), append(vertex2), append(vertex3), normal ?: Vector3(0, 0, 0))
|
||||
val face = Face3(append(vertex1), append(vertex2), append(vertex3), normal?.toVector() ?: Vector3(0, 0, 0))
|
||||
meta["materialIndex"].int?.let { face.materialIndex = it }
|
||||
meta["color"]?.getColor()?.let { face.color = it }
|
||||
faces.add(face)
|
||||
|
@ -15,7 +15,7 @@ public object ThreeLineFactory : ThreeFactory<PolyLine> {
|
||||
|
||||
override fun invoke(obj: PolyLine): Object3D {
|
||||
val geometry = Geometry().apply {
|
||||
vertices = obj.points.toTypedArray()
|
||||
vertices = Array(obj.points.size) { obj.points[it].toVector() }
|
||||
}
|
||||
|
||||
val material = ThreeMaterials.getLineMaterial(obj.getProperty(MeshThreeFactory.EDGES_MATERIAL_KEY).node, true)
|
||||
|
@ -22,6 +22,8 @@ public fun Geometry.toBufferGeometry(): BufferGeometry = BufferGeometry().apply
|
||||
|
||||
internal fun Double.toRadians() = this * PI / 180
|
||||
|
||||
internal val ZERO = Vector3(0,0,0)
|
||||
|
||||
public fun CSG.toGeometry(): Geometry {
|
||||
val geom = Geometry()
|
||||
|
||||
@ -37,7 +39,7 @@ public fun CSG.toGeometry(): Geometry {
|
||||
}
|
||||
|
||||
for (j in 3..polygon.vertices.size) {
|
||||
val fc = Face3(v0, v0 + j - 2, v0 + j - 1, World.ZERO)
|
||||
val fc = Face3(v0, v0 + j - 2, v0 + j - 1, ZERO)
|
||||
fc.vertexNormals = arrayOf(
|
||||
Vector3().copy(pvs[0].normal),
|
||||
Vector3().copy(pvs[j - 2].normal),
|
||||
|
@ -16,6 +16,7 @@ import javafx.scene.shape.Shape3D
|
||||
import javafx.scene.text.Font
|
||||
import javafx.scene.text.Text
|
||||
import javafx.scene.transform.Rotate
|
||||
import org.fxyz3d.geometry.Point3D
|
||||
import org.fxyz3d.shapes.composites.PolyLine3D
|
||||
import org.fxyz3d.shapes.primitives.CuboidMesh
|
||||
import org.fxyz3d.shapes.primitives.SpheroidMesh
|
||||
@ -69,7 +70,7 @@ class FX3DPlugin : AbstractPlugin() {
|
||||
y = layoutBounds.height / 2
|
||||
}
|
||||
is PolyLine -> PolyLine3D(
|
||||
obj.points.map { it.point },
|
||||
obj.points.map { Point3D(it.x, it.y, it.z) },
|
||||
obj.thickness.toFloat(),
|
||||
obj.getProperty(SolidMaterial.MATERIAL_COLOR_KEY)?.color()
|
||||
).apply {
|
||||
|
@ -1,50 +0,0 @@
|
||||
package hep.dataforge.vision.solid
|
||||
import org.fxyz3d.geometry.Point3D as FXPoint3D
|
||||
|
||||
public actual data class Point2D(public actual var x: Double, public actual var y: Double) {
|
||||
actual constructor(x: Number, y: Number) : this(x.toDouble(), y.toDouble())
|
||||
}
|
||||
|
||||
public actual class Point3D(val point: FXPoint3D) {
|
||||
actual constructor(x: Number, y: Number, z: Number) : this(
|
||||
FXPoint3D(
|
||||
x.toFloat(),
|
||||
y.toFloat(),
|
||||
z.toFloat()
|
||||
)
|
||||
)
|
||||
|
||||
public actual var x: Double
|
||||
inline get() = point.x.toDouble()
|
||||
inline set(value) {
|
||||
point.x = value.toFloat()
|
||||
}
|
||||
|
||||
public actual var y: Double
|
||||
inline get() = point.y.toDouble()
|
||||
inline set(value) {
|
||||
point.y = value.toFloat()
|
||||
}
|
||||
|
||||
public actual var z: Double
|
||||
inline get() = point.z.toDouble()
|
||||
inline set(value) {
|
||||
point.z = value.toFloat()
|
||||
}
|
||||
|
||||
override fun equals(other: Any?): Boolean {
|
||||
return this.point == (other as? Point3D)?.point
|
||||
}
|
||||
|
||||
override fun hashCode(): Int {
|
||||
return point.hashCode()
|
||||
}
|
||||
|
||||
override fun toString(): String {
|
||||
return point.toString()
|
||||
}
|
||||
}
|
||||
|
||||
public actual operator fun Point3D.plus(other: Point3D): Point3D {
|
||||
return Point3D(point.add(other.point))
|
||||
}
|
Loading…
Reference in New Issue
Block a user