forked from kscience/visionforge
Add quaternion support
This commit is contained in:
parent
40b784f551
commit
75540a078f
@ -34,11 +34,11 @@ public interface HtmlVisionContext : ContextAware {
|
||||
|
||||
public typealias HtmlVisionContextFragment = context(HtmlVisionContext) TagConsumer<*>.() -> Unit
|
||||
|
||||
context(HtmlVisionContext)
|
||||
public fun HtmlVisionContextFragment(content: TagConsumer<*>.() -> Unit): HtmlVisionFragment = content
|
||||
context(HtmlVisionContext) public fun HtmlVisionFragment(
|
||||
content: TagConsumer<*>.() -> Unit
|
||||
): HtmlVisionFragment = content
|
||||
|
||||
context(HtmlVisionContext)
|
||||
private fun <T> TagConsumer<T>.vision(
|
||||
context(HtmlVisionContext) private fun <T> TagConsumer<T>.vision(
|
||||
visionManager: VisionManager,
|
||||
name: Name,
|
||||
vision: Vision,
|
||||
|
@ -97,6 +97,8 @@ public class FX3DPlugin : AbstractPlugin() {
|
||||
scaleYProperty().bind(binding[Solid.Y_SCALE_KEY].float(obj.scaleY.toFloat()))
|
||||
scaleZProperty().bind(binding[Solid.Z_SCALE_KEY].float(obj.scaleZ.toFloat()))
|
||||
|
||||
if(obj.quaternion!= null) TODO("Quaternion support not implemented")
|
||||
|
||||
val rotateX = Rotate(0.0, Rotate.X_AXIS).apply {
|
||||
angleProperty().bind(binding[Solid.X_ROTATION_KEY].float(obj.rotationX.toFloat()).multiply(180.0 / PI))
|
||||
}
|
||||
|
@ -203,6 +203,26 @@ public var Solid.rotationX: Number by float(X_ROTATION_KEY, 0f)
|
||||
public var Solid.rotationY: Number by float(Y_ROTATION_KEY, 0f)
|
||||
public var Solid.rotationZ: Number by float(Z_ROTATION_KEY, 0f)
|
||||
|
||||
public var Solid.quaternion: Pair<Float, Point3D>?
|
||||
get() = properties.getValue(Solid.QUATERNION_KEY)?.list?.let {
|
||||
require(it.size == 4) { "Quaternion must be a number array of 4 elements" }
|
||||
it[0].float to Point3D(it[1].float, it[2].float, it[3].float)
|
||||
}
|
||||
set(value) {
|
||||
properties.setValue(
|
||||
Solid.QUATERNION_KEY,
|
||||
value?.let {
|
||||
ListValue(
|
||||
value.first,
|
||||
value.second.x,
|
||||
value.second.y,
|
||||
value.second.z
|
||||
)
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
|
||||
//public var Solid.quaternion: Quaternion?
|
||||
// get() = meta[Solid::quaternion.name]?.value?.doubleArray?.let { Quaternion(it) }
|
||||
// set(value) {
|
||||
|
@ -14,6 +14,7 @@ internal fun Solid.updateFrom(other: Solid): Solid {
|
||||
x += other.x
|
||||
y += other.y
|
||||
z += other.y
|
||||
if(quaternion != null || other.quaternion != null) TODO("Quaternion support not implemented")
|
||||
rotationX += other.rotationX
|
||||
rotationY += other.rotationY
|
||||
rotationZ += other.rotationZ
|
||||
|
@ -11,6 +11,7 @@ import space.kscience.visionforge.visible
|
||||
import three.core.BufferGeometry
|
||||
import three.core.Object3D
|
||||
import three.math.Euler
|
||||
import three.math.Quaternion
|
||||
import kotlin.reflect.KClass
|
||||
|
||||
/**
|
||||
@ -48,8 +49,20 @@ public fun Object3D.updatePosition(vision: Vision) {
|
||||
// } else {
|
||||
// setRotationFromEuler( Euler(obj.rotationX, obj.rotationY, obj.rotationZ, obj.rotationOrder.name))
|
||||
// }
|
||||
val quaternion = vision.quaternion
|
||||
|
||||
setRotationFromEuler(Euler(vision.rotationX, vision.rotationY, vision.rotationZ, vision.rotationOrder.name))
|
||||
if (quaternion != null) {
|
||||
setRotationFromQuaternion(
|
||||
Quaternion(
|
||||
quaternion.second.x,
|
||||
quaternion.second.y,
|
||||
quaternion.second.z,
|
||||
quaternion.first
|
||||
)
|
||||
)
|
||||
} else {
|
||||
setRotationFromEuler(Euler(vision.rotationX, vision.rotationY, vision.rotationZ, vision.rotationOrder.name))
|
||||
}
|
||||
|
||||
scale.set(vision.scaleX, vision.scaleY, vision.scaleZ)
|
||||
updateMatrix()
|
||||
|
Loading…
Reference in New Issue
Block a user