[WIP] layer marking

This commit is contained in:
Alexander Nozik 2021-07-12 22:50:00 +03:00
parent 0d53b6f77d
commit f2e7e16d62
8 changed files with 70 additions and 30 deletions

View File

@ -21,6 +21,7 @@
- Tube is replaced by more general ConeSurface
- position, rotation and size moved to properties
- prototypes moved to children
- Immutable Solid instances
### Deprecated

View File

@ -32,7 +32,10 @@ val GDMLApp = functionalComponent<GDMLAppProps>("GDMLApp") { props ->
val parsedVision = when {
name.endsWith(".gdml") || name.endsWith(".xml") -> {
val gdml = Gdml.decodeFromString(data)
gdml.toVision()
gdml.toVision().apply {
// console.info("Marking layers for file $name")
// markLayers()
}
}
name.endsWith(".json") -> visionManager.decodeFromString(data)
else -> {

View File

@ -1,23 +0,0 @@
package space.kscience.visionforge.gdml
import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.plus
import space.kscience.visionforge.VisionGroup
private fun VisionGroup.countChildren(namePrefix: Name, cache: MutableMap<Name, Int> = hashMapOf()): Int {
var counter = 0
children.forEach { (token, child) ->
if (child is VisionGroup) {
counter += child.countChildren(namePrefix + token, cache)
} else {
counter++
}
}
cache[namePrefix] = counter
return counter
}
public fun VisionGroup.processLayers() {
}

View File

@ -0,0 +1,62 @@
package space.kscience.visionforge.gdml
import space.kscience.dataforge.names.Name
import space.kscience.dataforge.names.NameToken
import space.kscience.dataforge.names.length
import space.kscience.dataforge.names.plus
import space.kscience.visionforge.VisionGroup
import space.kscience.visionforge.solid.Solid
import space.kscience.visionforge.solid.SolidGroup
import space.kscience.visionforge.solid.layer
private class VisionCounterTree(
val name: Name,
val vision: Solid,
) {
val children: Map<NameToken, VisionCounterTree> =
(vision as? VisionGroup)?.children?.mapValues {
VisionCounterTree(name + it.key, it.value as Solid)
} ?: emptyMap()
//
// val directChildrenCount: Int by lazy {
// children.size
// }
val childrenCount: Int =
children.values.sumOf { it.childrenCount + 1 }
}
private fun VisionCounterTree.topToBottom(): Sequence<VisionCounterTree> = sequence {
yield(this@topToBottom)
children.values.forEach {
yieldAll(it.topToBottom())
}
}
public fun SolidGroup.markLayers(thresholds: List<Int> = listOf(1000, 20000, 100000)) {
val counterTree = VisionCounterTree(Name.EMPTY, this)
val totalCount = counterTree.childrenCount
if (totalCount > thresholds.firstOrNull() ?: 0) {
val allNodes = counterTree.topToBottom().toMutableList()
//println("tree construction finished")
allNodes.sortWith(compareBy<VisionCounterTree>({ it.name.length }, { it.childrenCount }).reversed())
//mark layers
var removed = 0
var thresholdIndex = thresholds.indexOfLast { it < totalCount }
for (node in allNodes) {
node.vision.layer = thresholdIndex + 1
removed++
if (totalCount - removed < thresholds[thresholdIndex]) {
thresholdIndex--
}
if (thresholdIndex < 0) break
}
}
}

View File

@ -100,7 +100,7 @@ public class SolidReferenceGroup(
private class ReferenceChild(
val owner: SolidReferenceGroup,
private val childName: Name
) : SolidReference, VisionGroup {
) : SolidReference, VisionGroup, Solid {
override val prototype: Solid by lazy {
if (childName.isEmpty()) owner.prototype else {

View File

@ -17,7 +17,7 @@ public class Sphere(
public val phiStart: Float = 0f,
public val phi: Float = PI2,
public val thetaStart: Float = 0f,
public val theta: Float = PI.toFloat(),
public val theta: Float = PI .toFloat(),
) : SolidBase(), GeometrySolid, VisionPropertyContainer<Sphere> {
override fun <T : Any> toGeometry(geometryBuilder: GeometryBuilder<T>) {

View File

@ -5,5 +5,5 @@ plugins {
dependencies {
api(project(":visionforge-solid"))
implementation(npm("three", "0.130.1"))
implementation(npm("three-csg-ts", "3.1.4"))
implementation(npm("three-csg-ts", "3.1.5"))
}

View File

@ -54,9 +54,6 @@ public class ThreeGeometryBuilder : GeometryBuilder<BufferGeometry> {
setAttribute("position", Float32BufferAttribute(positions.toTypedArray(), 3))
setAttribute("normal", Float32BufferAttribute(normals.toTypedArray(), 3))
//setAttribute("color", Float32BufferAttribute(colors.toFloatArray(), 3))
//a temporary fix for CSG problem
val uvsArray = Array<Float>((counter+1)*2){0f}
setAttribute("uv", Float32BufferAttribute(uvsArray, 2))
computeBoundingSphere()
}