forked from kscience/visionforge
Optimizations... optimizations
This commit is contained in:
parent
e2f281debe
commit
98bb935de5
@ -10,6 +10,6 @@ kotlin{
|
|||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
api(project(":visionforge-solid"))
|
api(project(":visionforge-solid"))
|
||||||
implementation(npm("three", "0.137.5"))
|
implementation(npm("three", "0.143.0"))
|
||||||
implementation(npm("three-csg-ts", "3.1.10"))
|
implementation(npm("three-csg-ts", "3.1.10"))
|
||||||
}
|
}
|
||||||
|
@ -212,7 +212,7 @@ public class ThreeCanvas(
|
|||||||
}
|
}
|
||||||
|
|
||||||
//find first non-static parent in this object ancestry
|
//find first non-static parent in this object ancestry
|
||||||
private fun Object3D?.upTrace(): Object3D? = if (this?.name?.startsWith("@") == true) parent else this
|
private tailrec fun Object3D.upTrace(): Object3D? = if (!name.startsWith("@")) this else parent?.upTrace()
|
||||||
|
|
||||||
private fun pick(): Object3D? {
|
private fun pick(): Object3D? {
|
||||||
// update the picking ray with the camera and mouse position
|
// update the picking ray with the camera and mouse position
|
||||||
@ -222,8 +222,8 @@ public class ThreeCanvas(
|
|||||||
return root?.let { root ->
|
return root?.let { root ->
|
||||||
val intersects = raycaster.intersectObject(root, true)
|
val intersects = raycaster.intersectObject(root, true)
|
||||||
//skip invisible objects
|
//skip invisible objects
|
||||||
val obj = intersects.map { it.`object` }.firstOrNull { it.visible }
|
val obj: Object3D? = intersects.map { it.`object` }.firstOrNull { it.visible }
|
||||||
obj.upTrace()
|
obj?.upTrace()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -280,20 +280,22 @@ public class ThreeCanvas(
|
|||||||
edgesName: String,
|
edgesName: String,
|
||||||
material: LineBasicMaterial = SELECTED_MATERIAL,
|
material: LineBasicMaterial = SELECTED_MATERIAL,
|
||||||
) {
|
) {
|
||||||
|
|
||||||
if (userData[DO_NOT_HIGHLIGHT_TAG] == true) {
|
if (userData[DO_NOT_HIGHLIGHT_TAG] == true) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (this is Mesh) {
|
|
||||||
val edges = getObjectByName(edgesName) ?: LineSegments(
|
if (isMesh(this)) {
|
||||||
|
val highlightMesh = getObjectByName(edgesName) ?: LineSegments(
|
||||||
EdgesGeometry(geometry),
|
EdgesGeometry(geometry),
|
||||||
material
|
material
|
||||||
).also {
|
).also {
|
||||||
it.name = edgesName
|
it.name = edgesName
|
||||||
add(it)
|
add(it)
|
||||||
}
|
}
|
||||||
edges.visible = highlight
|
highlightMesh.visible = highlight
|
||||||
} else {
|
} else {
|
||||||
children.filter { it.name != edgesName }.forEach {
|
children.filter { !it.name.startsWith("@") && it.name != edgesName }.forEach {
|
||||||
it.toggleHighlight(highlight, edgesName, material)
|
it.toggleHighlight(highlight, edgesName, material)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3,7 +3,6 @@ package space.kscience.visionforge.solid.three
|
|||||||
import info.laht.threekt.core.BufferGeometry
|
import info.laht.threekt.core.BufferGeometry
|
||||||
import info.laht.threekt.core.Object3D
|
import info.laht.threekt.core.Object3D
|
||||||
import info.laht.threekt.math.Euler
|
import info.laht.threekt.math.Euler
|
||||||
import info.laht.threekt.objects.Mesh
|
|
||||||
import space.kscience.dataforge.misc.Type
|
import space.kscience.dataforge.misc.Type
|
||||||
import space.kscience.dataforge.names.Name
|
import space.kscience.dataforge.names.Name
|
||||||
import space.kscience.dataforge.names.startsWith
|
import space.kscience.dataforge.names.startsWith
|
||||||
@ -62,7 +61,7 @@ public fun Object3D.updatePosition(vision: Vision) {
|
|||||||
*/
|
*/
|
||||||
public fun Object3D.updateProperty(source: Vision, propertyName: Name) {
|
public fun Object3D.updateProperty(source: Vision, propertyName: Name) {
|
||||||
// console.log("$source updated $propertyName with ${source.computeProperty(propertyName)}")
|
// console.log("$source updated $propertyName with ${source.computeProperty(propertyName)}")
|
||||||
if (this is Mesh && propertyName.startsWith(MATERIAL_KEY)) {
|
if (isMesh(this) && propertyName.startsWith(MATERIAL_KEY)) {
|
||||||
updateMaterialProperty(source, propertyName)
|
updateMaterialProperty(source, propertyName)
|
||||||
} else if (
|
} else if (
|
||||||
propertyName.startsWith(Solid.POSITION_KEY)
|
propertyName.startsWith(Solid.POSITION_KEY)
|
||||||
|
@ -39,13 +39,13 @@ public object ThreeMaterials {
|
|||||||
|
|
||||||
public val SELECTED_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply {
|
public val SELECTED_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply {
|
||||||
color.set(Colors.ivory)
|
color.set(Colors.ivory)
|
||||||
linewidth = 8.0
|
linewidth = 2.0
|
||||||
cached = true
|
cached = true
|
||||||
}
|
}
|
||||||
|
|
||||||
public val HIGHLIGHT_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply {
|
public val HIGHLIGHT_MATERIAL: LineBasicMaterial = LineBasicMaterial().apply {
|
||||||
color.set(Colors.blue)
|
color.set(Colors.blue)
|
||||||
linewidth = 8.0
|
linewidth = 2.0
|
||||||
cached = true
|
cached = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,7 @@ import space.kscience.visionforge.solid.SolidMaterial
|
|||||||
import space.kscience.visionforge.solid.layer
|
import space.kscience.visionforge.solid.layer
|
||||||
import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_ENABLED_KEY
|
import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_ENABLED_KEY
|
||||||
import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_MATERIAL_KEY
|
import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_MATERIAL_KEY
|
||||||
|
import space.kscience.visionforge.solid.three.ThreeMeshFactory.Companion.EDGES_OBJECT_NAME
|
||||||
import kotlin.reflect.KClass
|
import kotlin.reflect.KClass
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -66,6 +67,7 @@ public abstract class ThreeMeshFactory<in T : Solid>(
|
|||||||
|
|
||||||
public companion object {
|
public companion object {
|
||||||
public val EDGES_KEY: Name = "edges".asName()
|
public val EDGES_KEY: Name = "edges".asName()
|
||||||
|
internal const val EDGES_OBJECT_NAME: String = "@edges"
|
||||||
|
|
||||||
//public val WIREFRAME_KEY: Name = "wireframe".asName()
|
//public val WIREFRAME_KEY: Name = "wireframe".asName()
|
||||||
public val ENABLED_KEY: Name = "enabled".asName()
|
public val ENABLED_KEY: Name = "enabled".asName()
|
||||||
@ -93,7 +95,7 @@ internal fun Mesh.applyProperties(vision: Solid): Mesh = apply {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public fun Mesh.applyEdges(vision: Solid) {
|
public fun Mesh.applyEdges(vision: Solid) {
|
||||||
val edges = children.find { it.name == "@edges" } as? LineSegments
|
val edges = children.find { it.name == EDGES_OBJECT_NAME } as? LineSegments
|
||||||
//inherited edges definition, enabled by default
|
//inherited edges definition, enabled by default
|
||||||
if (vision.properties.getValue(EDGES_ENABLED_KEY, inherit = true)?.boolean != false) {
|
if (vision.properties.getValue(EDGES_ENABLED_KEY, inherit = true)?.boolean != false) {
|
||||||
val bufferGeometry = geometry as? BufferGeometry ?: return
|
val bufferGeometry = geometry as? BufferGeometry ?: return
|
||||||
@ -104,7 +106,7 @@ public fun Mesh.applyEdges(vision: Solid) {
|
|||||||
EdgesGeometry(bufferGeometry),
|
EdgesGeometry(bufferGeometry),
|
||||||
material
|
material
|
||||||
).apply {
|
).apply {
|
||||||
name = "@edges"
|
name = EDGES_OBJECT_NAME
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
|
@ -17,11 +17,10 @@ public object ThreeReferenceFactory : ThreeFactory<SolidReference> {
|
|||||||
override val type: KClass<SolidReference> = SolidReference::class
|
override val type: KClass<SolidReference> = SolidReference::class
|
||||||
|
|
||||||
private fun Object3D.replicate(): Object3D {
|
private fun Object3D.replicate(): Object3D {
|
||||||
return when (this) {
|
return when {
|
||||||
is Mesh -> Mesh(geometry, material).also {
|
isMesh(this) -> Mesh(geometry, material).also {
|
||||||
it.applyMatrix4(matrix)
|
it.applyMatrix4(matrix)
|
||||||
}
|
}
|
||||||
|
|
||||||
else -> clone(false)
|
else -> clone(false)
|
||||||
}.also { obj: Object3D ->
|
}.also { obj: Object3D ->
|
||||||
obj.name = this.name
|
obj.name = this.name
|
||||||
@ -40,7 +39,7 @@ public object ThreeReferenceFactory : ThreeFactory<SolidReference> {
|
|||||||
val object3D: Object3D = cachedObject.replicate()
|
val object3D: Object3D = cachedObject.replicate()
|
||||||
object3D.updatePosition(vision)
|
object3D.updatePosition(vision)
|
||||||
|
|
||||||
if (object3D is Mesh) {
|
if (isMesh(object3D)) {
|
||||||
//object3D.material = ThreeMaterials.buildMaterial(obj.getProperty(SolidMaterial.MATERIAL_KEY).node!!)
|
//object3D.material = ThreeMaterials.buildMaterial(obj.getProperty(SolidMaterial.MATERIAL_KEY).node!!)
|
||||||
object3D.applyProperties(vision)
|
object3D.applyProperties(vision)
|
||||||
}
|
}
|
||||||
|
@ -11,6 +11,7 @@ import info.laht.threekt.textures.Texture
|
|||||||
import space.kscience.dataforge.meta.Meta
|
import space.kscience.dataforge.meta.Meta
|
||||||
import space.kscience.dataforge.meta.float
|
import space.kscience.dataforge.meta.float
|
||||||
import space.kscience.dataforge.meta.get
|
import space.kscience.dataforge.meta.get
|
||||||
|
import kotlin.contracts.contract
|
||||||
import kotlin.math.PI
|
import kotlin.math.PI
|
||||||
|
|
||||||
public val Meta.vector: Vector3 get() = Vector3(this["x"].float ?: 0f, this["y"].float ?: 0f, this["z"].float ?: 0f)
|
public val Meta.vector: Vector3 get() = Vector3(this["x"].float ?: 0f, this["y"].float ?: 0f, this["z"].float ?: 0f)
|
||||||
@ -34,6 +35,14 @@ internal fun Any.dispose() {
|
|||||||
|
|
||||||
public fun Layers.check(layer: Int): Boolean = (mask shr (layer) and 0x00000001) > 0
|
public fun Layers.check(layer: Int): Boolean = (mask shr (layer) and 0x00000001) > 0
|
||||||
|
|
||||||
|
|
||||||
|
internal fun isMesh(object3D: Object3D): Boolean{
|
||||||
|
contract {
|
||||||
|
returns(true) implies (object3D is Mesh)
|
||||||
|
}
|
||||||
|
return object3D.asDynamic().isMesh as? Boolean ?: false
|
||||||
|
}
|
||||||
|
|
||||||
internal fun Object3D.takeIfMesh(): Mesh? {
|
internal fun Object3D.takeIfMesh(): Mesh? {
|
||||||
val d = asDynamic()
|
val d = asDynamic()
|
||||||
return if(d.isMesh as Boolean){
|
return if(d.isMesh as Boolean){
|
||||||
|
Loading…
Reference in New Issue
Block a user