Class name refactoring

This commit is contained in:
Alexander Nozik 2020-08-05 22:39:56 +03:00
parent 3217a53dd6
commit 9805c249ad
48 changed files with 225 additions and 221 deletions

View File

@ -13,7 +13,7 @@ class GDMLVisualTest {
@Test
fun testPrototypeProperty() {
val gdml = cubes()
val visual = gdml.toVisual()
val visual = gdml.toVision()
visual["composite000.segment0".toName()]?.setItem(Material3D.MATERIAL_COLOR_KEY, "red".asValue())
assertEquals("red", visual["composite000.segment0".toName()]?.getItem(Material3D.MATERIAL_COLOR_KEY).string)
}

View File

@ -10,9 +10,9 @@ import hep.dataforge.vision.react.component
import hep.dataforge.vision.react.configEditor
import hep.dataforge.vision.react.flexColumn
import hep.dataforge.vision.react.state
import hep.dataforge.vision.spatial.Vision3D
import hep.dataforge.vision.spatial.VisionGroup3D
import hep.dataforge.vision.spatial.VisualObject3D
import hep.dataforge.vision.spatial.gdml.toVisual
import hep.dataforge.vision.spatial.gdml.toVision
import hep.dataforge.vision.spatial.specifications.Camera
import hep.dataforge.vision.spatial.specifications.Canvas3DOptions
import hep.dataforge.vision.spatial.three.ThreeCanvas
@ -60,7 +60,7 @@ val GDMLApp = component<GDMLAppProps> { props ->
visual = when {
name.endsWith(".gdml") || name.endsWith(".xml") -> {
val gdml = GDML.parse(data)
gdml.toVisual(gdmlConfiguration)
gdml.toVision(gdmlConfiguration)
}
name.endsWith(".json") -> VisionGroup3D.parseJson(data)
else -> {
@ -107,7 +107,7 @@ val GDMLApp = component<GDMLAppProps> { props ->
gridColumn(6, maxSize= GridMaxSize.XL, classes = "order-1 order-xl-2") {
//canvas
(visual as? VisualObject3D)?.let { visual3D ->
(visual as? Vision3D)?.let { visual3D ->
child(ThreeCanvasComponent::class) {
attrs {
this.context = props.context

View File

@ -6,7 +6,7 @@ import hep.dataforge.js.startApplication
import hep.dataforge.vision.spatial.Material3D.Companion.MATERIAL_OPACITY_KEY
import hep.dataforge.vision.spatial.gdml.GDMLTransformer
import hep.dataforge.vision.spatial.gdml.LUnit
import hep.dataforge.vision.spatial.gdml.toVisual
import hep.dataforge.vision.spatial.gdml.toVision
import kotlinx.css.*
import react.child
import react.dom.render
@ -60,7 +60,7 @@ private class GDMLDemoApp : Application {
child(GDMLApp) {
attrs {
this.context = context
this.rootObject = cubes().toVisual(gdmlConfiguration)
this.rootObject = cubes().toVision(gdmlConfiguration)
}
}
}

View File

@ -4,10 +4,10 @@ import hep.dataforge.context.Global
import hep.dataforge.vision.editor.VisualObjectEditorFragment
import hep.dataforge.vision.editor.VisualObjectTreeFragment
import hep.dataforge.vision.spatial.Material3D
import hep.dataforge.vision.spatial.Visual3D
import hep.dataforge.vision.spatial.SpatialVisionManager
import hep.dataforge.vision.spatial.fx.FX3DPlugin
import hep.dataforge.vision.spatial.fx.FXCanvas3D
import hep.dataforge.vision.spatial.gdml.toVisual
import hep.dataforge.vision.spatial.gdml.toVision
import javafx.geometry.Orientation
import javafx.scene.Parent
import javafx.stage.FileChooser
@ -39,7 +39,7 @@ class GDMLView : View() {
runAsync {
val file = chooseFile("Select a GDML/json file", filters = fileNameFilter).firstOrNull()
?: return@runAsync null
Visual3D.readFile(file)
SpatialVisionManager.readFile(file)
} ui {
if (it != null) {
canvas.render(it)
@ -58,7 +58,7 @@ class GDMLView : View() {
init {
runAsync {
cubes().toVisual()
cubes().toVision()
} ui {
canvas.render(it)
}

View File

@ -3,19 +3,19 @@ package hep.dataforge.vision.spatial.gdml.demo
import hep.dataforge.meta.setItem
import hep.dataforge.values.asValue
import hep.dataforge.vision.spatial.Material3D
import hep.dataforge.vision.spatial.SpatialVisionManager
import hep.dataforge.vision.spatial.VisionGroup3D
import hep.dataforge.vision.spatial.Visual3D
import hep.dataforge.vision.spatial.gdml.LUnit
import hep.dataforge.vision.spatial.gdml.readFile
import hep.dataforge.vision.spatial.gdml.toVisual
import hep.dataforge.vision.spatial.gdml.toVision
import scientifik.gdml.GDML
import java.io.File
import java.util.zip.GZIPInputStream
import java.util.zip.ZipInputStream
fun Visual3D.Companion.readFile(file: File): VisionGroup3D = when {
fun SpatialVisionManager.Companion.readFile(file: File): VisionGroup3D = when {
file.extension == "gdml" || file.extension == "xml" -> {
GDML.readFile(file.toPath()).toVisual {
GDML.readFile(file.toPath()).toVision {
lUnit = LUnit.CM
solidConfiguration = { parent, solid ->
@ -48,4 +48,4 @@ fun Visual3D.Companion.readFile(file: File): VisionGroup3D = when {
else -> error("Unknown extension ${file.extension}")
}
fun Visual3D.Companion.readFile(fileName: String): VisionGroup3D = readFile(File(fileName))
fun SpatialVisionManager.Companion.readFile(fileName: String): VisionGroup3D = readFile(File(fileName))

View File

@ -2,7 +2,7 @@ package hep.dataforge.vision.spatial.gdml.demo
import hep.dataforge.vision.spatial.gdml.LUnit
import hep.dataforge.vision.spatial.gdml.readFile
import hep.dataforge.vision.spatial.gdml.toVisual
import hep.dataforge.vision.spatial.gdml.toVision
import hep.dataforge.vision.spatial.stringify
import scientifik.gdml.GDML
import java.io.File
@ -17,7 +17,7 @@ fun main(args: Array<String>) {
val gdml = GDML.readFile(Paths.get(inputFileName))
//GDML.readFile(Paths.get("D:\\Work\\Projects\\visionforge\\visionforge-spatial-gdml\\src\\jvmTest\\resources\\gdml\\simple1.gdml"))
val visual = gdml.toVisual {
val visual = gdml.toVision {
lUnit = LUnit.CM
}

View File

@ -3,7 +3,7 @@ package ru.mipt.npm.muon.monitor
import hep.dataforge.context.Global
import hep.dataforge.js.Application
import hep.dataforge.js.startApplication
import hep.dataforge.vision.spatial.Visual3D
import hep.dataforge.vision.spatial.SpatialVisionManager
import io.ktor.client.HttpClient
import io.ktor.client.features.json.JsonFeature
import io.ktor.client.features.json.serializer.KotlinxSerializer
@ -19,7 +19,7 @@ private class MMDemoApp : Application {
private val connection = HttpClient {
install(JsonFeature) {
serializer = KotlinxSerializer(Json(context = Visual3D.serialModule))
serializer = KotlinxSerializer(Json(context = SpatialVisionManager.serialModule))
}
}

View File

@ -1,7 +1,7 @@
package ru.mipt.npm.muon.monitor.server
import hep.dataforge.vision.spatial.Visual3D
import hep.dataforge.vision.spatial.SpatialVisionManager
import io.ktor.application.Application
import io.ktor.application.call
import io.ktor.application.install
@ -36,7 +36,7 @@ fun Application.module() {
install(DefaultHeaders)
install(CallLogging)
install(ContentNegotiation) {
json(module = Visual3D.serialModule)
json(module = SpatialVisionManager.serialModule)
}
install(Routing) {
get("/event") {

View File

@ -11,7 +11,7 @@ import hep.dataforge.values.asValue
import hep.dataforge.vision.getProperty
import hep.dataforge.vision.set
import hep.dataforge.vision.spatial.*
import hep.dataforge.vision.spatial.VisualObject3D.Companion.GEOMETRY_KEY
import hep.dataforge.vision.spatial.Vision3D.Companion.GEOMETRY_KEY
import hep.dataforge.vision.spatial.demo.VariableBoxThreeFactory.Z_SIZE_KEY
import hep.dataforge.vision.spatial.three.*
import hep.dataforge.vision.spatial.three.ThreeMaterials.getMaterial
@ -23,13 +23,13 @@ import kotlinx.serialization.UseSerializers
import kotlin.math.max
import kotlin.reflect.KClass
internal var VisualObject3D.variableZSize: Number
internal var Vision3D.variableZSize: Number
get() = getProperty(Z_SIZE_KEY, false).number ?: 0f
set(value) {
setItem(Z_SIZE_KEY, value.asValue())
}
internal var VisualObject3D.value: Int
internal var Vision3D.value: Int
get() = getProperty("value", false).int ?: 0
set(value) {
setItem("value", value.asValue())
@ -48,21 +48,21 @@ fun VisionGroup3D.varBox(
ySize: Number,
zSize: Number,
name: String = "",
action: VisualObject3D.() -> Unit = {}
) = CustomThreeVisualObject(VariableBoxThreeFactory).apply {
action: Vision3D.() -> Unit = {}
) = CustomThreeVision(VariableBoxThreeFactory).apply {
scaleX = xSize
scaleY = ySize
scaleZ = zSize
}.apply(action).also { set(name, it) }
private object VariableBoxThreeFactory : ThreeFactory<VisualObject3D> {
private object VariableBoxThreeFactory : ThreeFactory<Vision3D> {
val X_SIZE_KEY = GEOMETRY_KEY + "xSize"
val Y_SIZE_KEY = GEOMETRY_KEY + "ySize"
val Z_SIZE_KEY = GEOMETRY_KEY + "zSize"
override val type: KClass<in VisualObject3D> get() = VisualObject3D::class
override val type: KClass<in Vision3D> get() = Vision3D::class
override fun invoke(obj: VisualObject3D): Object3D {
override fun invoke(obj: Vision3D): Object3D {
val xSize = obj.getProperty(X_SIZE_KEY, false).number?.toDouble() ?: 1.0
val ySize = obj.getProperty(Y_SIZE_KEY, false).number?.toDouble() ?: 1.0
val zSize = obj.getProperty(Z_SIZE_KEY, false).number?.toDouble() ?: 1.0

View File

@ -14,7 +14,7 @@ internal data class PropertyListener(
val action: (name: Name, oldItem: MetaItem<*>?, newItem: MetaItem<*>?) -> Unit
)
abstract class AbstractVisualObject : Vision {
abstract class AbstractVision : Vision {
@Transient
override var parent: VisionGroup? = null

View File

@ -11,7 +11,7 @@ import kotlinx.serialization.Transient
/**
* Abstract implementation of mutable group of [Vision]
*/
abstract class AbstractVision : AbstractVisualObject(), MutableVisionGroup {
abstract class AbstractVisionGroup : AbstractVision(), MutableVisionGroup {
//protected abstract val _children: MutableMap<NameToken, T>
@ -86,7 +86,7 @@ abstract class AbstractVision : AbstractVisualObject(), MutableVisionGroup {
protected open fun addStatic(child: Vision) =
set(NameToken("@static(${child.hashCode()})").asName(), child)
protected abstract fun createGroup(): AbstractVision
protected abstract fun createGroup(): AbstractVisionGroup
/**
* Set this node as parent for given node
@ -102,7 +102,7 @@ abstract class AbstractVision : AbstractVisualObject(), MutableVisionGroup {
/**
* Recursively create a child group
*/
private fun createGroups(name: Name): AbstractVision {
private fun createGroups(name: Name): AbstractVisionGroup {
return when {
name.isEmpty() -> error("Should be unreachable")
name.length == 1 -> {
@ -112,7 +112,7 @@ abstract class AbstractVision : AbstractVisualObject(), MutableVisionGroup {
attach(child)
setChild(token, child)
}
is AbstractVision -> current
is AbstractVisionGroup -> current
else -> error("Can't create group with name $name because it exists and not a group")
}
}

View File

@ -8,7 +8,7 @@ import kotlinx.serialization.Serializable
@Serializable
@SerialName("group")
class SimpleVisionGroup : AbstractVision() {
class SimpleVisionGroup : AbstractVisionGroup() {
override var styleSheet: StyleSheet? = null

View File

@ -4,13 +4,8 @@ import hep.dataforge.context.*
import hep.dataforge.meta.Meta
import kotlin.reflect.KClass
interface VisualFactory<T : Vision> {
interface VisionFactory<T : Vision> : Factory<T> {
val type: KClass<T>
operator fun invoke(
context: Context,
parent: Vision?,
meta: Meta
): T
}
class VisionManager(meta: Meta) : AbstractPlugin(meta) {
@ -19,12 +14,18 @@ class VisionManager(meta: Meta) : AbstractPlugin(meta) {
/**
* Create a list of factories on first call and cache it
*/
val visualFactories by lazy {
context.content<VisualFactory<*>>(VISUAL_FACTORY_TYPE).mapKeys { it.value.type }
private val factories by lazy {
context.content<VisionFactory<*>>(VISION_FACTORY_TYPE).mapKeys { it.value.type }
}
inline fun <reified T : Vision> buildVisual(parent: Vision?, meta: Meta): T? {
return visualFactories[T::class]?.invoke(context, parent, meta) as T?
@Suppress("UNCHECKED_CAST")
fun <T : Vision> resolveVisionFactory(type: KClass<out T>): VisionFactory<T>? =
factories[type] as VisionFactory<T>
inline fun <reified T : Vision> buildVision(parent: VisionGroup?, meta: Meta): T? {
return resolveVisionFactory(T::class)?.invoke(meta, context)?.apply {
this.parent = parent
}
}
companion object : PluginFactory<VisionManager> {
@ -33,6 +34,6 @@ class VisionManager(meta: Meta) : AbstractPlugin(meta) {
override fun invoke(meta: Meta, context: Context): VisionManager = VisionManager(meta)
const val VISUAL_FACTORY_TYPE = "vision.factory"
const val VISION_FACTORY_TYPE = "vision.factory"
}
}

View File

@ -33,7 +33,7 @@ class GDMLTransformer(val root: GDML) {
var volumeAction: (GDMLGroup) -> Action = { Action.CACHE }
var solidConfiguration: VisualObject3D.(parent: GDMLVolume, solid: GDMLSolid) -> Unit = { parent, _ ->
var solidConfiguration: Vision3D.(parent: GDMLVolume, solid: GDMLSolid) -> Unit = { parent, _ ->
lUnit = LUnit.CM
if (parent.physVolumes.isNotEmpty()) {
useStyle("opaque") {
@ -42,14 +42,14 @@ class GDMLTransformer(val root: GDML) {
}
}
fun VisualObject3D.useStyle(name: String, builder: MetaBuilder.() -> Unit) {
fun Vision3D.useStyle(name: String, builder: MetaBuilder.() -> Unit) {
styleCache.getOrPut(name.toName()) {
Meta(builder)
}
useStyle(name)
}
internal fun configureSolid(obj: VisualObject3D, parent: GDMLVolume, solid: GDMLSolid) {
internal fun configureSolid(obj: Vision3D, parent: GDMLVolume, solid: GDMLSolid) {
val material = parent.materialref.resolve(root) ?: GDMLElement(parent.materialref.ref)
val styleName = "material[${material.name}]"

View File

@ -14,12 +14,12 @@ import kotlin.math.cos
import kotlin.math.sin
private fun VisualObject3D.withPosition(
private fun Vision3D.withPosition(
lUnit: LUnit,
newPos: GDMLPosition? = null,
newRotation: GDMLRotation? = null,
newScale: GDMLScale? = null
): VisualObject3D = apply {
): Vision3D = apply {
newPos?.let {
val point = Point3D(it.x(lUnit), it.y(lUnit), it.z(lUnit))
if (position != null || point != ZERO) {
@ -52,8 +52,8 @@ private fun VisionGroup3D.addSolid(
context: GDMLTransformer,
solid: GDMLSolid,
name: String = "",
block: VisualObject3D.() -> Unit = {}
): VisualObject3D {
block: Vision3D.() -> Unit = {}
): Vision3D {
//context.solidAdded(solid)
val lScale = solid.lscale(context.lUnit)
val aScale = solid.ascale()
@ -253,7 +253,7 @@ private fun volume(
}
}
fun GDML.toVisual(block: GDMLTransformer.() -> Unit = {}): VisionGroup3D {
fun GDML.toVision(block: GDMLTransformer.() -> Unit = {}): VisionGroup3D {
val context = GDMLTransformer(this).apply(block)
return context.finalize(volume(context, world))
}
@ -262,7 +262,7 @@ fun GDML.toVisual(block: GDMLTransformer.() -> Unit = {}): VisionGroup3D {
* Append gdml node to the group
*/
fun VisionGroup3D.gdml(gdml: GDML, key: String = "", transformer: GDMLTransformer.() -> Unit = {}) {
val visual = gdml.toVisual(transformer)
val visual = gdml.toVision(transformer)
//println(Visual3DPlugin.json.stringify(VisualGroup3D.serializer(), visual))
set(key, visual)
}

View File

@ -13,7 +13,7 @@ class TestConvertor {
val xmlReader = StAXReader(stream, "UTF-8")
val xml = GDML.format.parse(GDML.serializer(), xmlReader)
val visual = xml.toVisual()
val visual = xml.toVision()
println(visual.stringify())
}
@ -23,7 +23,7 @@ class TestConvertor {
val xmlReader = StAXReader(stream, "UTF-8")
val xml = GDML.format.parse(GDML.serializer(), xmlReader)
val visual = xml.toVisual()
val visual = xml.toVision()
// println(visual)
}
@ -33,7 +33,7 @@ class TestConvertor {
val xmlReader = StAXReader(stream, "UTF-8")
val xml = GDML.format.parse(GDML.serializer(), xmlReader)
val visual = xml.toVisual()
val visual = xml.toVision()
println(visual.stringify())
}
}

View File

@ -6,7 +6,10 @@ import hep.dataforge.meta.Config
import hep.dataforge.meta.Meta
import hep.dataforge.meta.float
import hep.dataforge.meta.get
import hep.dataforge.vision.*
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.VisionFactory
import hep.dataforge.vision.set
import hep.dataforge.vision.spatial.Box.Companion.TYPE_NAME
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
@ -19,7 +22,7 @@ class Box(
val xSize: Float,
val ySize: Float,
val zSize: Float
) : AbstractVisualObject(), VisualObject3D, Shape {
) : AbstractVision(), Vision3D, Shape {
override var position: Point3D? = null
override var rotation: Point3D? = null
@ -48,13 +51,13 @@ class Box(
geometryBuilder.face4(node8, node5, node6, node7)
}
companion object : VisualFactory<Box> {
companion object : VisionFactory<Box> {
const val TYPE_NAME = "3d.box"
override val type: KClass<Box> get() = Box::class
override fun invoke(context: Context, parent: Vision?, meta: Meta): Box = Box(
override fun invoke(meta: Meta, context: Context): Box = Box(
meta["xSize"].float!!,
meta["ySize"].float!!,
meta["zSize"].float!!

View File

@ -20,9 +20,9 @@ enum class CompositeType {
@SerialName("3d.composite")
class Composite(
val compositeType: CompositeType,
val first: VisualObject3D,
val second: VisualObject3D
) : AbstractVisualObject(), VisualObject3D, VisionGroup {
val first: Vision3D,
val second: Vision3D
) : AbstractVision(), Vision3D, VisionGroup {
init {
first.parent = this
@ -48,7 +48,7 @@ inline fun MutableVisionGroup.composite(
builder: VisionGroup3D.() -> Unit
): Composite {
val group = VisionGroup3D().apply(builder)
val children = group.children.values.filterIsInstance<VisualObject3D>()
val children = group.children.values.filterIsInstance<Vision3D>()
if (children.size != 2) error("Composite requires exactly two children")
return Composite(type, children[0], children[1]).also {
it.config.update(group.config)

View File

@ -3,7 +3,7 @@
package hep.dataforge.vision.spatial
import hep.dataforge.meta.Config
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set
import kotlinx.serialization.SerialName
@ -23,7 +23,7 @@ class ConeSegment(
var upperRadius: Float,
var startAngle: Float = 0f,
var angle: Float = PI2
) : AbstractVisualObject(), VisualObject3D, Shape {
) : AbstractVision(), Vision3D, Shape {
override var ownProperties: Config? = null

View File

@ -3,7 +3,7 @@
package hep.dataforge.vision.spatial
import hep.dataforge.meta.Config
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set
import kotlinx.serialization.SerialName
@ -12,7 +12,7 @@ import kotlinx.serialization.UseSerializers
@Serializable
@SerialName("3d.convex")
class Convex(val points: List<Point3D>) : AbstractVisualObject(), VisualObject3D {
class Convex(val points: List<Point3D>) : AbstractVision(), Vision3D {
override var ownProperties: Config? = null

View File

@ -2,7 +2,7 @@
package hep.dataforge.vision.spatial
import hep.dataforge.meta.Config
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set
import kotlinx.serialization.SerialName
@ -43,7 +43,7 @@ data class Layer(var x: Float, var y: Float, var z: Float, var scale: Float)
class Extruded(
var shape: List<Point2D> = ArrayList(),
var layers: MutableList<Layer> = ArrayList()
) : AbstractVisualObject(), VisualObject3D, Shape {
) : AbstractVision(), Vision3D, Shape {
override var ownProperties: Config? = null

View File

@ -31,9 +31,9 @@ fun GeometryBuilder<*>.face4(
}
/**
* [Shape] is a [VisualObject3D] that can represent its own geometry as a set of polygons.
* [Shape] is a [Vision3D] that can represent its own geometry as a set of polygons.
*/
interface Shape : VisualObject3D {
interface Shape : Vision3D {
fun <T : Any> toGeometry(geometryBuilder: GeometryBuilder<T>)
}

View File

@ -3,7 +3,7 @@
package hep.dataforge.vision.spatial
import hep.dataforge.meta.Config
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set
import kotlinx.serialization.SerialName
@ -12,7 +12,7 @@ import kotlinx.serialization.UseSerializers
@Serializable
@SerialName("3d.label")
class Label3D(var text: String, var fontSize: Double, var fontFamily: String) : AbstractVisualObject(), VisualObject3D {
class Label3D(var text: String, var fontSize: Double, var fontFamily: String) : AbstractVision(), Vision3D {
override var ownProperties: Config? = null
override var position: Point3D? = null

View File

@ -77,18 +77,18 @@ class Material3D : Scheme() {
/**
* Set color as web-color
*/
fun VisualObject3D.color(webColor: String) {
fun Vision3D.color(webColor: String) {
setItem(MATERIAL_COLOR_KEY, webColor.asValue())
}
/**
* Set color as integer
*/
fun VisualObject3D.color(rgb: Int) {
fun Vision3D.color(rgb: Int) {
setItem(MATERIAL_COLOR_KEY, rgb.asValue())
}
fun VisualObject3D.color(r: UByte, g: UByte, b: UByte) = setItem(
fun Vision3D.color(r: UByte, g: UByte, b: UByte) = setItem(
MATERIAL_COLOR_KEY,
Colors.rgbToMeta(r, g, b)
)
@ -96,16 +96,16 @@ fun VisualObject3D.color(r: UByte, g: UByte, b: UByte) = setItem(
/**
* Web colors representation of the color in `#rrggbb` format or HTML name
*/
var VisualObject3D.color: String?
var Vision3D.color: String?
get() = getItem(MATERIAL_COLOR_KEY)?.let { Colors.fromMeta(it) }
set(value) {
setItem(MATERIAL_COLOR_KEY, value?.asValue())
}
val VisualObject3D.material: Material3D?
val Vision3D.material: Material3D?
get() = getItem(MATERIAL_KEY).node?.let { Material3D.wrap(it) }
fun VisualObject3D.material(builder: Material3D.() -> Unit) {
fun Vision3D.material(builder: Material3D.() -> Unit) {
val node = config[MATERIAL_KEY].node
if (node != null) {
Material3D.update(node, builder)
@ -114,7 +114,7 @@ fun VisualObject3D.material(builder: Material3D.() -> Unit) {
}
}
var VisualObject3D.opacity: Double?
var Vision3D.opacity: Double?
get() = getItem(MATERIAL_OPACITY_KEY).double
set(value) {
setItem(MATERIAL_OPACITY_KEY, value?.asValue())

View File

@ -6,7 +6,7 @@ import hep.dataforge.meta.Config
import hep.dataforge.meta.number
import hep.dataforge.names.asName
import hep.dataforge.names.plus
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set
import kotlinx.serialization.SerialName
@ -15,7 +15,7 @@ import kotlinx.serialization.UseSerializers
@Serializable
@SerialName("3d.line")
class PolyLine(var points: List<Point3D>) : AbstractVisualObject(), VisualObject3D {
class PolyLine(var points: List<Point3D>) : AbstractVision(), Vision3D {
override var ownProperties: Config? = null
override var position: Point3D? = null

View File

@ -16,13 +16,13 @@ import kotlinx.serialization.UseSerializers
import kotlin.collections.set
/**
* A proxy [VisualObject3D] to reuse a template object
* A proxy [Vision3D] to reuse a template object
*/
@Serializable
@SerialName("3d.proxy")
class Proxy private constructor(
val templateName: Name
) : AbstractVisualObject(), VisionGroup, VisualObject3D {
) : AbstractVision(), VisionGroup, Vision3D {
constructor(parent: VisionGroup3D, templateName: Name) : this(templateName) {
this.parent = parent
@ -37,7 +37,7 @@ class Proxy private constructor(
/**
* Recursively search for defined template in the parent
*/
val prototype: VisualObject3D
val prototype: Vision3D
get() = (parent as? VisionGroup3D)?.getPrototype(templateName)
?: error("Prototype with name $templateName not found in $parent")
@ -94,7 +94,7 @@ class Proxy private constructor(
override val descriptor: NodeDescriptor?
get() = prototype.descriptor
inner class ProxyChild(val name: Name) : AbstractVisualObject(),
inner class ProxyChild(val name: Name) : AbstractVision(),
VisionGroup {
val prototype: Vision get() = prototypeFor(name)
@ -179,7 +179,7 @@ fun VisionGroup3D.ref(
*/
fun VisionGroup3D.proxy(
name: String,
obj: VisualObject3D,
obj: Vision3D,
templateName: Name = name.toName()
): Proxy {
val existing = getPrototype(templateName)

View File

@ -17,29 +17,29 @@ import kotlinx.serialization.modules.SerializersModule
import kotlinx.serialization.modules.contextual
import kotlin.reflect.KClass
class Visual3D(meta: Meta) : AbstractPlugin(meta) {
class SpatialVisionManager(meta: Meta) : AbstractPlugin(meta) {
val visual by require(VisionManager)
val visionManager by require(VisionManager)
override val tag: PluginTag get() = Companion.tag
override fun provideTop(target: String): Map<Name, Any> = if (target == VisionManager.VISUAL_FACTORY_TYPE) {
override fun provideTop(target: String): Map<Name, Any> = if (target == VisionManager.VISION_FACTORY_TYPE) {
mapOf(Box.TYPE_NAME.toName() to Box)
} else {
super.provideTop(target)
}
companion object : PluginFactory<Visual3D> {
companion object : PluginFactory<SpatialVisionManager> {
override val tag: PluginTag = PluginTag(name = "visual.spatial", group = PluginTag.DATAFORGE_GROUP)
override val type: KClass<out Visual3D> = Visual3D::class
override fun invoke(meta: Meta, context: Context): Visual3D = Visual3D(meta)
override val type: KClass<out SpatialVisionManager> = SpatialVisionManager::class
override fun invoke(meta: Meta, context: Context): SpatialVisionManager = SpatialVisionManager(meta)
val serialModule = SerializersModule {
contextual(Point3DSerializer)
contextual(Point2DSerializer)
polymorphic(Vision::class, VisualObject3D::class) {
polymorphic(Vision::class, Vision3D::class) {
subclass(SimpleVisionGroup.serializer())
subclass(VisionGroup3D.serializer())
subclass(Proxy.serializer())
@ -67,15 +67,15 @@ class Visual3D(meta: Meta) : AbstractPlugin(meta) {
}
}
internal fun VisualObject3D.update(meta: Meta) {
internal fun Vision3D.update(meta: Meta) {
fun Meta.toVector(default: Float = 0f) = Point3D(
this[VisualObject3D.X_KEY].float ?: default,
this[VisualObject3D.Y_KEY].float ?: default,
this[VisualObject3D.Z_KEY].float ?: default
this[Vision3D.X_KEY].float ?: default,
this[Vision3D.Y_KEY].float ?: default,
this[Vision3D.Z_KEY].float ?: default
)
meta[VisualObject3D.POSITION_KEY].node?.toVector()?.let { position = it }
meta[VisualObject3D.ROTATION].node?.toVector()?.let { rotation = it }
meta[VisualObject3D.SCALE_KEY].node?.toVector(1f)?.let { scale = it }
meta[Vision3D.POSITION_KEY].node?.toVector()?.let { position = it }
meta[Vision3D.ROTATION].node?.toVector()?.let { rotation = it }
meta[Vision3D.SCALE_KEY].node?.toVector(1f)?.let { scale = it }
meta["properties"].node?.let { configure(it) }
}

View File

@ -3,7 +3,7 @@
package hep.dataforge.vision.spatial
import hep.dataforge.meta.Config
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set
import kotlinx.serialization.SerialName
@ -21,7 +21,7 @@ class Sphere(
var phi: Float = PI2,
var thetaStart: Float = 0f,
var theta: Float = PI.toFloat()
) : AbstractVisualObject(), VisualObject3D, Shape {
) : AbstractVision(), Vision3D, Shape {
override var ownProperties: Config? = null

View File

@ -3,7 +3,7 @@
package hep.dataforge.vision.spatial
import hep.dataforge.meta.Config
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.MutableVisionGroup
import hep.dataforge.vision.set
import kotlinx.serialization.SerialName
@ -24,7 +24,7 @@ class Tube(
var innerRadius: Float = 0f,
var startAngle: Float = 0f,
var angle: Float = PI2
) : AbstractVisualObject(), VisualObject3D, Shape {
) : AbstractVision(), Vision3D, Shape {
override var position: Point3D? = null
override var rotation: Point3D? = null

View File

@ -11,16 +11,16 @@ import hep.dataforge.values.ValueType
import hep.dataforge.values.asValue
import hep.dataforge.vision.Vision
import hep.dataforge.vision.enum
import hep.dataforge.vision.spatial.VisualObject3D.Companion.DETAIL_KEY
import hep.dataforge.vision.spatial.VisualObject3D.Companion.IGNORE_KEY
import hep.dataforge.vision.spatial.VisualObject3D.Companion.LAYER_KEY
import hep.dataforge.vision.spatial.VisualObject3D.Companion.VISIBLE_KEY
import hep.dataforge.vision.spatial.Vision3D.Companion.DETAIL_KEY
import hep.dataforge.vision.spatial.Vision3D.Companion.IGNORE_KEY
import hep.dataforge.vision.spatial.Vision3D.Companion.LAYER_KEY
import hep.dataforge.vision.spatial.Vision3D.Companion.VISIBLE_KEY
import kotlinx.serialization.UseSerializers
/**
* Interface for 3-dimensional [Vision]
*/
interface VisualObject3D : Vision {
interface Vision3D : Vision {
var position: Point3D?
var rotation: Point3D?
var scale: Point3D?
@ -86,13 +86,13 @@ interface VisualObject3D : Vision {
/**
* Count number of layers to the top object. Return 1 if this is top layer
*/
var VisualObject3D.layer: Int
var Vision3D.layer: Int
get() = getItem(LAYER_KEY).int ?: 0
set(value) {
setItem(LAYER_KEY, value.asValue())
}
fun Renderer<VisualObject3D>.render(meta: Meta = Meta.EMPTY, action: VisionGroup3D.() -> Unit) =
fun Renderer<Vision3D>.render(meta: Meta = Meta.EMPTY, action: VisionGroup3D.() -> Unit) =
render(VisionGroup3D().apply(action), meta)
// Common properties
@ -109,15 +109,15 @@ enum class RotationOrder {
/**
* Rotation order
*/
var VisualObject3D.rotationOrder: RotationOrder
get() = getItem(VisualObject3D.ROTATION_ORDER_KEY).enum<RotationOrder>() ?: RotationOrder.XYZ
set(value) = setItem(VisualObject3D.ROTATION_ORDER_KEY, value.name.asValue())
var Vision3D.rotationOrder: RotationOrder
get() = getItem(Vision3D.ROTATION_ORDER_KEY).enum<RotationOrder>() ?: RotationOrder.XYZ
set(value) = setItem(Vision3D.ROTATION_ORDER_KEY, value.name.asValue())
/**
* Preferred number of polygons for displaying the object. If not defined, uses shape or renderer default. Not inherited
*/
var VisualObject3D.detail: Int?
var Vision3D.detail: Int?
get() = getProperty(DETAIL_KEY, false).int
set(value) = setItem(DETAIL_KEY, value?.asValue())
@ -137,74 +137,74 @@ var Vision.ignore: Boolean?
// get() = getProperty(SELECTED_KEY).boolean
// set(value) = setProperty(SELECTED_KEY, value)
private fun VisualObject3D.position(): Point3D =
private fun Vision3D.position(): Point3D =
position ?: Point3D(0.0, 0.0, 0.0).also { position = it }
var VisualObject3D.x: Number
var Vision3D.x: Number
get() = position?.x ?: 0f
set(value) {
position().x = value.toDouble()
propertyInvalidated(VisualObject3D.X_POSITION_KEY)
propertyInvalidated(Vision3D.X_POSITION_KEY)
}
var VisualObject3D.y: Number
var Vision3D.y: Number
get() = position?.y ?: 0f
set(value) {
position().y = value.toDouble()
propertyInvalidated(VisualObject3D.Y_POSITION_KEY)
propertyInvalidated(Vision3D.Y_POSITION_KEY)
}
var VisualObject3D.z: Number
var Vision3D.z: Number
get() = position?.z ?: 0f
set(value) {
position().z = value.toDouble()
propertyInvalidated(VisualObject3D.Z_POSITION_KEY)
propertyInvalidated(Vision3D.Z_POSITION_KEY)
}
private fun VisualObject3D.rotation(): Point3D =
private fun Vision3D.rotation(): Point3D =
rotation ?: Point3D(0.0, 0.0, 0.0).also { rotation = it }
var VisualObject3D.rotationX: Number
var Vision3D.rotationX: Number
get() = rotation?.x ?: 0f
set(value) {
rotation().x = value.toDouble()
propertyInvalidated(VisualObject3D.X_ROTATION_KEY)
propertyInvalidated(Vision3D.X_ROTATION_KEY)
}
var VisualObject3D.rotationY: Number
var Vision3D.rotationY: Number
get() = rotation?.y ?: 0f
set(value) {
rotation().y = value.toDouble()
propertyInvalidated(VisualObject3D.Y_ROTATION_KEY)
propertyInvalidated(Vision3D.Y_ROTATION_KEY)
}
var VisualObject3D.rotationZ: Number
var Vision3D.rotationZ: Number
get() = rotation?.z ?: 0f
set(value) {
rotation().z = value.toDouble()
propertyInvalidated(VisualObject3D.Z_ROTATION_KEY)
propertyInvalidated(Vision3D.Z_ROTATION_KEY)
}
private fun VisualObject3D.scale(): Point3D =
private fun Vision3D.scale(): Point3D =
scale ?: Point3D(1.0, 1.0, 1.0).also { scale = it }
var VisualObject3D.scaleX: Number
var Vision3D.scaleX: Number
get() = scale?.x ?: 1f
set(value) {
scale().x = value.toDouble()
propertyInvalidated(VisualObject3D.X_SCALE_KEY)
propertyInvalidated(Vision3D.X_SCALE_KEY)
}
var VisualObject3D.scaleY: Number
var Vision3D.scaleY: Number
get() = scale?.y ?: 1f
set(value) {
scale().y = value.toDouble()
propertyInvalidated(VisualObject3D.Y_SCALE_KEY)
propertyInvalidated(Vision3D.Y_SCALE_KEY)
}
var VisualObject3D.scaleZ: Number
var Vision3D.scaleZ: Number
get() = scale?.z ?: 1f
set(value) {
scale().z = value.toDouble()
propertyInvalidated(VisualObject3D.Z_SCALE_KEY)
propertyInvalidated(Vision3D.Z_SCALE_KEY)
}

View File

@ -24,7 +24,7 @@ interface PrototypeHolder {
*/
@Serializable
@SerialName("group.3d")
class VisionGroup3D : AbstractVision(), VisualObject3D, PrototypeHolder {
class VisionGroup3D : AbstractVisionGroup(), Vision3D, PrototypeHolder {
override var styleSheet: StyleSheet? = null
@ -82,15 +82,15 @@ class VisionGroup3D : AbstractVision(), VisualObject3D, PrototypeHolder {
// val PROTOTYPES_KEY = NameToken("@prototypes")
fun parseJson(json: String): VisionGroup3D =
Visual3D.json.parse(serializer(), json).also { it.attachChildren() }
SpatialVisionManager.json.parse(serializer(), json).also { it.attachChildren() }
}
}
/**
* Ger a prototype redirecting the request to the parent if prototype is not found
*/
tailrec fun PrototypeHolder.getPrototype(name: Name): VisualObject3D? =
prototypes?.get(name) as? VisualObject3D ?: (parent as? PrototypeHolder)?.getPrototype(name)
tailrec fun PrototypeHolder.getPrototype(name: Name): Vision3D? =
prototypes?.get(name) as? Vision3D ?: (parent as? PrototypeHolder)?.getPrototype(name)
/**
* Define a group with given [name], attach it to this parent and return it.
@ -102,7 +102,7 @@ fun MutableVisionGroup.group(name: String = "", action: VisionGroup3D.() -> Unit
internal class Prototypes(
override var children: MutableMap<NameToken, Vision> = LinkedHashMap()
) : AbstractVision(), MutableVisionGroup, PrototypeHolder {
) : AbstractVisionGroup(), MutableVisionGroup, PrototypeHolder {
override var styleSheet: StyleSheet?
get() = null

View File

@ -21,8 +21,8 @@ operator fun Point2D.component1() = x
operator fun Point2D.component2() = y
fun Point2D.toMeta() = Meta {
VisualObject3D.X_KEY put x
VisualObject3D.Y_KEY put y
Vision3D.X_KEY put x
Vision3D.Y_KEY put y
}
fun Meta.point2D() = Point2D(this["x"].number ?: 0, this["y"].number ?: 0)
@ -42,7 +42,7 @@ operator fun Point3D.component3() = z
fun Meta.point3D() = Point3D(this["x"].number ?: 0, this["y"].number ?: 0, this["y"].number ?: 0)
fun Point3D.toMeta() = Meta {
VisualObject3D.X_KEY put x
VisualObject3D.Y_KEY put y
VisualObject3D.Z_KEY put z
Vision3D.X_KEY put x
Vision3D.Y_KEY put y
Vision3D.Z_KEY put z
}

View File

@ -118,9 +118,9 @@ internal object PrototypesSerializer : KSerializer<MutableVisionGroup> {
}
}
fun Vision.stringify(): String = Visual3D.json.stringify(Vision.serializer(), this)
fun Vision.stringify(): String = SpatialVisionManager.json.stringify(Vision.serializer(), this)
fun Vision.Companion.parseJson(str: String) = Visual3D.json.parse(Vision.serializer(), str).also {
fun Vision.Companion.parseJson(str: String) = SpatialVisionManager.json.parse(Vision.serializer(), str).also {
if(it is VisionGroup){
it.attachChildren()
}

View File

@ -14,7 +14,7 @@ internal fun mergeChild(parent: VisionGroup, child: Vision): Vision {
//parent.properties?.let { config.update(it) }
if (this is VisualObject3D && parent is VisualObject3D) {
if (this is Vision3D && parent is Vision3D) {
position = (position ?: World.ZERO) + (parent.position ?: World.ZERO)
rotation = (parent.rotation ?: World.ZERO) + (parent.rotation ?: World.ZERO)
scale = when {

View File

@ -26,7 +26,7 @@ class ConvexTest {
val convex = group.children.values.first() as Convex
val json = Visual3D.json.toJson(Convex.serializer(), convex)
val json = SpatialVisionManager.json.toJson(Convex.serializer(), convex)
val meta = json.toMetaItem().node!!
val points = meta.getIndexed("points").values.map { (it as MetaItem.NodeItem<*>).node.point3D() }

View File

@ -45,7 +45,7 @@ class GroupTest {
}
assertEquals(3, group.children.count())
assertEquals(300.0, (group["intersect"] as VisualObject3D).y.toDouble())
assertEquals(-300.0, (group["subtract"] as VisualObject3D).y.toDouble())
assertEquals(300.0, (group["intersect"] as Vision3D).y.toDouble())
assertEquals(-300.0, (group["subtract"] as Vision3D).y.toDouble())
}
}

View File

@ -6,7 +6,7 @@ import hep.dataforge.names.asName
import hep.dataforge.names.plus
import hep.dataforge.names.startsWith
import hep.dataforge.vision.spatial.Material3D
import hep.dataforge.vision.spatial.VisualObject3D
import hep.dataforge.vision.spatial.Vision3D
import hep.dataforge.vision.spatial.layer
import hep.dataforge.vision.spatial.three.ThreeMaterials.getMaterial
import info.laht.threekt.core.BufferGeometry
@ -19,7 +19,7 @@ import kotlin.reflect.KClass
/**
* Basic geometry-based factory
*/
abstract class MeshThreeFactory<in T : VisualObject3D>(
abstract class MeshThreeFactory<in T : Vision3D>(
override val type: KClass<in T>
) : ThreeFactory<T> {
/**
@ -52,7 +52,7 @@ abstract class MeshThreeFactory<in T : VisualObject3D>(
//add listener to object properties
obj.onPropertyChange(this) { name, _, _ ->
when {
name.startsWith(VisualObject3D.GEOMETRY_KEY) -> {
name.startsWith(Vision3D.GEOMETRY_KEY) -> {
val oldGeometry = mesh.geometry as BufferGeometry
val newGeometry = buildGeometry(obj)
oldGeometry.attributes = newGeometry.attributes
@ -79,7 +79,7 @@ abstract class MeshThreeFactory<in T : VisualObject3D>(
}
}
fun Mesh.applyEdges(obj: VisualObject3D) {
fun Mesh.applyEdges(obj: Vision3D) {
children.find { it.name == "@edges" }?.let {
remove(it)
(it as LineSegments).dispose()
@ -99,7 +99,7 @@ fun Mesh.applyEdges(obj: VisualObject3D) {
}
}
fun Mesh.applyWireFrame(obj: VisualObject3D) {
fun Mesh.applyWireFrame(obj: Vision3D) {
children.find { it.name == "@wireframe" }?.let {
remove(it)
(it as LineSegments).dispose()

View File

@ -9,7 +9,7 @@ import hep.dataforge.names.plus
import hep.dataforge.names.toName
import hep.dataforge.output.Renderer
import hep.dataforge.vision.Colors
import hep.dataforge.vision.spatial.VisualObject3D
import hep.dataforge.vision.spatial.Vision3D
import hep.dataforge.vision.spatial.specifications.Camera
import hep.dataforge.vision.spatial.specifications.Canvas3DOptions
import hep.dataforge.vision.spatial.specifications.Controls
@ -41,11 +41,11 @@ import kotlin.math.sin
/**
*
*/
class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val options: Canvas3DOptions) : Renderer<VisualObject3D> {
class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val options: Canvas3DOptions) : Renderer<Vision3D> {
override val context: Context get() = three.context
var content: VisualObject3D? = null
var content: Vision3D? = null
private set
private var root: Object3D? = null
@ -172,7 +172,7 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val options: Can
}
}
override fun render(obj: VisualObject3D, meta: Meta) {
override fun render(obj: Vision3D, meta: Meta) {
//clear old root
clear()
@ -244,5 +244,5 @@ class ThreeCanvas(element: HTMLElement, val three: ThreePlugin, val options: Can
fun ThreePlugin.output(element: HTMLElement, spec: Canvas3DOptions = Canvas3DOptions.empty()): ThreeCanvas =
ThreeCanvas(element, this, spec)
fun ThreePlugin.render(element: HTMLElement, obj: VisualObject3D, spec: Canvas3DOptions = Canvas3DOptions.empty()): Unit =
fun ThreePlugin.render(element: HTMLElement, obj: Vision3D, spec: Canvas3DOptions = Canvas3DOptions.empty()): Unit =
output(element, spec).render(obj)

View File

@ -2,7 +2,7 @@ package hep.dataforge.vision.spatial.three
import hep.dataforge.context.Context
import hep.dataforge.names.Name
import hep.dataforge.vision.spatial.VisualObject3D
import hep.dataforge.vision.spatial.Vision3D
import hep.dataforge.vision.spatial.specifications.Canvas3DOptions
import org.w3c.dom.Element
import org.w3c.dom.HTMLElement
@ -15,7 +15,7 @@ import react.dom.findDOMNode
interface ThreeCanvasProps : RProps {
var context: Context
var obj: VisualObject3D
var obj: Vision3D
var options: Canvas3DOptions?
var selected: Name?
var clickCallback: (Name?) -> Unit
@ -61,7 +61,7 @@ class ThreeCanvasComponent : RComponent<ThreeCanvasProps, ThreeCanvasState>() {
}
}
fun RBuilder.threeCanvas(object3D: VisualObject3D, options: Canvas3DOptions.() -> Unit = {}) {
fun RBuilder.threeCanvas(object3D: Vision3D, options: Canvas3DOptions.() -> Unit = {}) {
child(ThreeCanvasComponent::class) {
attrs {
this.obj = object3D

View File

@ -33,7 +33,7 @@ interface ThreeFactory<in T : Vision> {
*/
fun Object3D.updatePosition(obj: Vision) {
visible = obj.visible ?: true
if(obj is VisualObject3D) {
if(obj is Vision3D) {
position.set(obj.x, obj.y, obj.z)
setRotationFromEuler(obj.euler)
scale.set(obj.scaleX, obj.scaleY, obj.scaleZ)
@ -60,13 +60,13 @@ fun Object3D.updateProperty(source: Vision, propertyName: Name) {
if (this is Mesh && propertyName.startsWith(MATERIAL_KEY)) {
this.material = getMaterial(source)
} else if (
propertyName.startsWith(VisualObject3D.POSITION_KEY)
|| propertyName.startsWith(VisualObject3D.ROTATION)
|| propertyName.startsWith(VisualObject3D.SCALE_KEY)
propertyName.startsWith(Vision3D.POSITION_KEY)
|| propertyName.startsWith(Vision3D.ROTATION)
|| propertyName.startsWith(Vision3D.SCALE_KEY)
) {
//update position of mesh using this object
updatePosition(source)
} else if (propertyName == VisualObject3D.VISIBLE_KEY) {
} else if (propertyName == Vision3D.VISIBLE_KEY) {
visible = source.visible ?: true
}
}

View File

@ -13,7 +13,7 @@ import info.laht.threekt.objects.Group as ThreeGroup
class ThreePlugin : AbstractPlugin() {
override val tag: PluginTag get() = Companion.tag
private val objectFactories = HashMap<KClass<out VisualObject3D>, ThreeFactory<*>>()
private val objectFactories = HashMap<KClass<out Vision3D>, ThreeFactory<*>>()
private val compositeFactory = ThreeCompositeFactory(this)
private val proxyFactory = ThreeProxyFactory(this)
@ -28,20 +28,20 @@ class ThreePlugin : AbstractPlugin() {
}
@Suppress("UNCHECKED_CAST")
private fun findObjectFactory(type: KClass<out Vision>): ThreeFactory<VisualObject3D>? {
private fun findObjectFactory(type: KClass<out Vision>): ThreeFactory<Vision3D>? {
return (objectFactories[type]
?: context.content<ThreeFactory<*>>(ThreeFactory.TYPE).values.find { it.type == type })
as ThreeFactory<VisualObject3D>?
as ThreeFactory<Vision3D>?
}
fun buildObject3D(obj: VisualObject3D): Object3D {
fun buildObject3D(obj: Vision3D): Object3D {
return when (obj) {
is ThreeVisualObject -> obj.toObject3D()
is ThreeVision -> obj.toObject3D()
is Proxy -> proxyFactory(obj)
is VisionGroup3D -> {
val group = ThreeGroup()
obj.children.forEach { (token, child) ->
if (child is VisualObject3D && child.ignore != true) {
if (child is Vision3D && child.ignore != true) {
try {
val object3D = buildObject3D(child)
group[token] = object3D
@ -57,13 +57,13 @@ class ThreePlugin : AbstractPlugin() {
obj.onPropertyChange(this) { name, _, _ ->
if (
name.startsWith(VisualObject3D.POSITION_KEY) ||
name.startsWith(VisualObject3D.ROTATION) ||
name.startsWith(VisualObject3D.SCALE_KEY)
name.startsWith(Vision3D.POSITION_KEY) ||
name.startsWith(Vision3D.ROTATION) ||
name.startsWith(Vision3D.SCALE_KEY)
) {
//update position of mesh using this object
updatePosition(obj)
} else if (name == VisualObject3D.VISIBLE_KEY) {
} else if (name == Vision3D.VISIBLE_KEY) {
visible = obj.visible ?: true
}
}
@ -83,7 +83,7 @@ class ThreePlugin : AbstractPlugin() {
}
//adding new object
if (child != null && child is VisualObject3D) {
if (child != null && child is Vision3D) {
try {
val object3D = buildObject3D(child)
set(name, object3D)
@ -97,7 +97,7 @@ class ThreePlugin : AbstractPlugin() {
is Composite -> compositeFactory(obj)
else -> {
//find specialized factory for this type if it is present
val factory: ThreeFactory<VisualObject3D>? = findObjectFactory(obj::class)
val factory: ThreeFactory<Vision3D>? = findObjectFactory(obj::class)
when {
factory != null -> factory(obj)
obj is Shape -> ThreeShapeFactory(obj)

View File

@ -3,11 +3,11 @@ package hep.dataforge.vision.spatial.three
import hep.dataforge.names.toName
import hep.dataforge.vision.spatial.Proxy
import hep.dataforge.vision.spatial.Proxy.Companion.PROXY_CHILD_PROPERTY_PREFIX
import hep.dataforge.vision.spatial.VisualObject3D
import hep.dataforge.vision.spatial.Vision3D
import info.laht.threekt.core.Object3D
class ThreeProxyFactory(val three: ThreePlugin) : ThreeFactory<Proxy> {
private val cache = HashMap<VisualObject3D, Object3D>()
private val cache = HashMap<Vision3D, Object3D>()
override val type = Proxy::class

View File

@ -3,10 +3,10 @@
package hep.dataforge.vision.spatial.three
import hep.dataforge.meta.Config
import hep.dataforge.vision.AbstractVisualObject
import hep.dataforge.vision.AbstractVision
import hep.dataforge.vision.spatial.Point3D
import hep.dataforge.vision.spatial.Point3DSerializer
import hep.dataforge.vision.spatial.VisualObject3D
import hep.dataforge.vision.spatial.Vision3D
import info.laht.threekt.core.Object3D
import kotlinx.serialization.Serializable
import kotlinx.serialization.UseSerializers
@ -14,13 +14,13 @@ import kotlinx.serialization.UseSerializers
/**
* A custom visual object that has its own Three.js renderer
*/
interface ThreeVisualObject : VisualObject3D {
interface ThreeVision : Vision3D {
fun toObject3D(): Object3D
}
@Serializable
class CustomThreeVisualObject(val threeFactory: ThreeFactory<VisualObject3D>) : AbstractVisualObject(),
ThreeVisualObject {
class CustomThreeVision(val threeFactory: ThreeFactory<Vision3D>) : AbstractVision(),
ThreeVision {
override var position: Point3D? = null
override var rotation: Point3D? = null
override var scale: Point3D? = null

View File

@ -3,8 +3,8 @@ package hep.dataforge.vision.spatial.three
import hep.dataforge.js.requireJS
import hep.dataforge.vision.bootstrap.accordion
import hep.dataforge.vision.bootstrap.entry
import hep.dataforge.vision.spatial.SpatialVisionManager
import hep.dataforge.vision.spatial.VisionGroup3D
import hep.dataforge.vision.spatial.Visual3D
import kotlinx.html.*
import kotlinx.html.dom.append
import kotlinx.html.js.onChangeFunction
@ -53,7 +53,7 @@ fun RBuilder.canvasControls(canvas: ThreeCanvas) = accordion("controls") {
attrs {
onClickFunction = {
val json = (canvas.content as? VisionGroup3D)?.let { group ->
Visual3D.json.stringify(
SpatialVisionManager.json.stringify(
VisionGroup3D.serializer(),
group
)
@ -117,7 +117,7 @@ fun Element.displayCanvasControls(canvas: ThreeCanvas, block: TagConsumer<HTMLEl
+"Export"
onClickFunction = {
val json = (canvas.content as? VisionGroup3D)?.let { group ->
Visual3D.json.stringify(
SpatialVisionManager.json.stringify(
VisionGroup3D.serializer(),
group
)

View File

@ -17,7 +17,7 @@ import info.laht.threekt.objects.Mesh
import info.laht.threekt.textures.Texture
import kotlin.math.PI
val VisualObject3D.euler get() = Euler(rotationX, rotationY, rotationZ, rotationOrder.name)
val Vision3D.euler get() = Euler(rotationX, rotationY, rotationZ, rotationOrder.name)
val MetaItem<*>.vector get() = Vector3(node["x"].float ?: 0f, node["y"].float ?: 0f, node["z"].float ?: 0f)

View File

@ -26,7 +26,7 @@ import kotlin.reflect.KClass
class FX3DPlugin : AbstractPlugin() {
override val tag: PluginTag get() = Companion.tag
private val objectFactories = HashMap<KClass<out VisualObject3D>, FX3DFactory<*>>()
private val objectFactories = HashMap<KClass<out Vision3D>, FX3DFactory<*>>()
private val compositeFactory = FXCompositeFactory(this)
private val proxyFactory = FXProxyFactory(this)
@ -37,18 +37,18 @@ class FX3DPlugin : AbstractPlugin() {
@Suppress("UNCHECKED_CAST")
private fun findObjectFactory(type: KClass<out VisualObject3D>): FX3DFactory<VisualObject3D>? {
private fun findObjectFactory(type: KClass<out Vision3D>): FX3DFactory<Vision3D>? {
return (objectFactories[type] ?: context.content<FX3DFactory<*>>(TYPE).values.find { it.type == type })
as FX3DFactory<VisualObject3D>?
as FX3DFactory<Vision3D>?
}
fun buildNode(obj: VisualObject3D): Node {
fun buildNode(obj: Vision3D): Node {
val binding = VisualObjectFXBinding(obj)
return when (obj) {
is Proxy -> proxyFactory(obj, binding)
is VisionGroup3D -> {
Group(obj.children.mapNotNull { (token, obj) ->
(obj as? VisualObject3D)?.let {
(obj as? Vision3D)?.let {
buildNode(it).apply {
properties["name"] = token.toString()
}
@ -77,7 +77,7 @@ class FX3DPlugin : AbstractPlugin() {
}
else -> {
//find specialized factory for this type if it is present
val factory: FX3DFactory<VisualObject3D>? = findObjectFactory(obj::class)
val factory: FX3DFactory<Vision3D>? = findObjectFactory(obj::class)
when {
factory != null -> factory(obj, binding)
obj is Shape -> FXShapeFactory(obj, binding)
@ -85,23 +85,23 @@ class FX3DPlugin : AbstractPlugin() {
}
}
}.apply {
translateXProperty().bind(binding[VisualObject3D.X_POSITION_KEY].float(obj.x.toFloat()))
translateYProperty().bind(binding[VisualObject3D.Y_POSITION_KEY].float(obj.y.toFloat()))
translateZProperty().bind(binding[VisualObject3D.Z_POSITION_KEY].float(obj.z.toFloat()))
scaleXProperty().bind(binding[VisualObject3D.X_SCALE_KEY].float(obj.scaleX.toFloat()))
scaleYProperty().bind(binding[VisualObject3D.Y_SCALE_KEY].float(obj.scaleY.toFloat()))
scaleZProperty().bind(binding[VisualObject3D.Z_SCALE_KEY].float(obj.scaleZ.toFloat()))
translateXProperty().bind(binding[Vision3D.X_POSITION_KEY].float(obj.x.toFloat()))
translateYProperty().bind(binding[Vision3D.Y_POSITION_KEY].float(obj.y.toFloat()))
translateZProperty().bind(binding[Vision3D.Z_POSITION_KEY].float(obj.z.toFloat()))
scaleXProperty().bind(binding[Vision3D.X_SCALE_KEY].float(obj.scaleX.toFloat()))
scaleYProperty().bind(binding[Vision3D.Y_SCALE_KEY].float(obj.scaleY.toFloat()))
scaleZProperty().bind(binding[Vision3D.Z_SCALE_KEY].float(obj.scaleZ.toFloat()))
val rotateX = Rotate(0.0, Rotate.X_AXIS).apply {
angleProperty().bind(binding[VisualObject3D.X_ROTATION_KEY].float(obj.rotationX.toFloat()).multiply(180.0 / PI))
angleProperty().bind(binding[Vision3D.X_ROTATION_KEY].float(obj.rotationX.toFloat()).multiply(180.0 / PI))
}
val rotateY = Rotate(0.0, Rotate.Y_AXIS).apply {
angleProperty().bind(binding[VisualObject3D.Y_ROTATION_KEY].float(obj.rotationY.toFloat()).multiply(180.0 / PI))
angleProperty().bind(binding[Vision3D.Y_ROTATION_KEY].float(obj.rotationY.toFloat()).multiply(180.0 / PI))
}
val rotateZ = Rotate(0.0, Rotate.Z_AXIS).apply {
angleProperty().bind(binding[VisualObject3D.Z_ROTATION_KEY].float(obj.rotationZ.toFloat()).multiply(180.0 / PI))
angleProperty().bind(binding[Vision3D.Z_ROTATION_KEY].float(obj.rotationZ.toFloat()).multiply(180.0 / PI))
}
when (obj.rotationOrder) {
@ -140,7 +140,7 @@ class FX3DPlugin : AbstractPlugin() {
* Builder and updater for three.js object
*/
@Type(TYPE)
interface FX3DFactory<in T : VisualObject3D> {
interface FX3DFactory<in T : Vision3D> {
val type: KClass<in T>

View File

@ -4,7 +4,7 @@ import hep.dataforge.context.Context
import hep.dataforge.context.ContextAware
import hep.dataforge.meta.Meta
import hep.dataforge.output.Renderer
import hep.dataforge.vision.spatial.VisualObject3D
import hep.dataforge.vision.spatial.Vision3D
import hep.dataforge.vision.spatial.specifications.Canvas3DOptions
import javafx.application.Platform
import javafx.beans.property.ObjectProperty
@ -15,7 +15,7 @@ import org.fxyz3d.scene.Axes
import tornadofx.*
class FXCanvas3D(val plugin: FX3DPlugin, val spec: Canvas3DOptions = Canvas3DOptions.empty()) :
Fragment(), Renderer<VisualObject3D>, ContextAware {
Fragment(), Renderer<Vision3D>, ContextAware {
override val context: Context get() = plugin.context
@ -58,8 +58,8 @@ class FXCanvas3D(val plugin: FX3DPlugin, val spec: Canvas3DOptions = Canvas3DOpt
world.add(it.centerMarker)
}
val rootObjectProperty: ObjectProperty<VisualObject3D> = SimpleObjectProperty()
var rootObject: VisualObject3D? by rootObjectProperty
val rootObjectProperty: ObjectProperty<Vision3D> = SimpleObjectProperty()
var rootObject: Vision3D? by rootObjectProperty
private val rootNodeProperty = rootObjectProperty.objectBinding {
it?.let { plugin.buildNode(it) }
@ -80,7 +80,7 @@ class FXCanvas3D(val plugin: FX3DPlugin, val spec: Canvas3DOptions = Canvas3DOpt
}
}
override fun render(obj: VisualObject3D, meta: Meta) {
override fun render(obj: Vision3D, meta: Meta) {
rootObject = obj
}
}

View File

@ -142,11 +142,11 @@ private fun jsonSchema(descriptor: SerialDescriptor, context: SerialModule): Jso
}
fun main() {
val context = Visual3D.serialModule
val context = SpatialVisionManager.serialModule
val definitions = json {
"children" to json {
"anyOf" to jsonArray {
context.enumerate(VisualObject3D::class).forEach {
context.enumerate(Vision3D::class).forEach {
if (it.serialName == "hep.dataforge.vis.spatial.VisualGroup3D") {
+json {
"\$ref" to "#/$definitionNode/${it.serialName}"