replicate mesh

This commit is contained in:
Alexander Nozik 2020-08-26 22:54:26 +03:00
parent b362f86f9b
commit 998afb1ce0
4 changed files with 34 additions and 17 deletions

View File

@ -1,5 +1,6 @@
import scientifik.DependencyConfiguration
import scientifik.FXModule
import scientifik.useFx
plugins {
id("scientifik.mpp")

View File

@ -67,7 +67,6 @@ val GDMLApp = component<GDMLAppProps> { props ->
error("File extension is not recognized: $name")
}
}
parsedVision.config["edges.enabled"] = false
vision = parsedVision
}

View File

@ -2,6 +2,7 @@ package hep.dataforge.vision.gdml
import hep.dataforge.meta.Meta
import hep.dataforge.meta.MetaBuilder
import hep.dataforge.meta.set
import hep.dataforge.names.Name
import hep.dataforge.names.asName
import hep.dataforge.names.plus
@ -15,6 +16,9 @@ import kotlin.math.cos
import kotlin.math.sin
import kotlin.random.Random
private val solidsName = "solids".asName()
private val volumesName = "volumes".asName()
class GDMLTransformer(val root: GDML) {
//private val materialCache = HashMap<GDMLMaterial, Meta>()
private val random = Random(222)
@ -35,6 +39,18 @@ class GDMLTransformer(val root: GDML) {
* A special group for local templates
*/
internal val proto by lazy { SolidGroup() }
internal val solids by lazy {
proto.group(solidsName) {
config["edges.enabled"] = false
}
}
internal val volumes by lazy {
proto.group(volumesName) {
config["edges.enabled"] = true
}
}
private val styleCache = HashMap<Name, Meta>()
var solidConfiguration: Solid.(parent: GDMLVolume, solid: GDMLSolid) -> Unit = { parent, _ ->
@ -231,7 +247,7 @@ private fun SolidGroup.addSolid(
}
private val solidsName = "solids".asName()
private fun SolidGroup.addSolidWithCaching(
context: GDMLTransformer,
@ -245,8 +261,7 @@ private fun SolidGroup.addSolidWithCaching(
GDMLTransformer.Action.CACHE -> {
val fullName = solidsName + solid.name.asName()
if (context.proto[fullName] == null) {
val parent = (context.proto[solidsName] as? SolidGroup) ?: context.proto.group(solidsName)
parent.addSolid(context, solid, solid.name)
context.solids.addSolid(context, solid, solid.name)
}
ref(fullName, name)
}
@ -257,7 +272,6 @@ private fun SolidGroup.addSolidWithCaching(
}
}
private val volumesName = "volumes".asName()
private fun SolidGroup.addPhysicalVolume(
context: GDMLTransformer,
@ -288,7 +302,7 @@ private fun SolidGroup.addPhysicalVolume(
context.proto[fullName] = volume(context, volume)
}
this[physVolume.name ?: ""] = Proxy(this, fullName).withPosition(context, physVolume)
ref(fullName,physVolume.name ?: "").withPosition(context, physVolume)
}
GDMLTransformer.Action.REJECT -> {
//ignore

View File

@ -4,6 +4,7 @@ import hep.dataforge.names.toName
import hep.dataforge.vision.solid.Proxy
import hep.dataforge.vision.solid.Proxy.Companion.PROXY_CHILD_PROPERTY_PREFIX
import hep.dataforge.vision.solid.Solid
import info.laht.threekt.core.BufferGeometry
import info.laht.threekt.core.Object3D
import info.laht.threekt.objects.Mesh
import kotlin.reflect.KClass
@ -13,16 +14,18 @@ class ThreeProxyFactory(val three: ThreePlugin) : ThreeFactory<Proxy> {
override val type: KClass<Proxy> = Proxy::class
// private fun Object3D.replicate(): Object3D {
// return when (this) {
// is Mesh -> Mesh(geometry as BufferGeometry, material)
// else -> clone(false)
// }.also { obj: Object3D ->
// children.forEach { child: Object3D ->
// obj.add(child.replicate())
// }
// }
// }
private fun Object3D.replicate(): Object3D {
return when (this) {
is Mesh -> Mesh(geometry as BufferGeometry, material).also {
it.applyMatrix(matrix)
}
else -> clone(false)
}.also { obj: Object3D ->
children.forEach { child: Object3D ->
obj.add(child.replicate())
}
}
}
override fun invoke(obj: Proxy): Object3D {
val template = obj.prototype
@ -30,7 +33,7 @@ class ThreeProxyFactory(val three: ThreePlugin) : ThreeFactory<Proxy> {
three.buildObject3D(template)
}
val object3D: Object3D = cachedObject.clone()//cachedObject.replicate()
val object3D: Object3D = cachedObject.replicate()
object3D.updatePosition(obj)
if(object3D is Mesh){