Cleanup and fix ROOT bug
This commit is contained in:
parent
4ec611eda3
commit
c921d5541b
1
.gitignore
vendored
1
.gitignore
vendored
@ -9,4 +9,3 @@ data/
|
||||
!gradle-wrapper.jar
|
||||
|
||||
/kotlin-js-store/yarn.lock
|
||||
.
|
||||
|
@ -1,3 +1,4 @@
|
||||
import org.jetbrains.kotlin.gradle.dsl.KotlinJsCompile
|
||||
import space.kscience.gradle.isInDevelopment
|
||||
import space.kscience.gradle.useApache2Licence
|
||||
import space.kscience.gradle.useSPCTeam
|
||||
@ -30,6 +31,12 @@ subprojects {
|
||||
freeCompilerArgs = freeCompilerArgs + "-Xcontext-receivers"
|
||||
}
|
||||
}
|
||||
|
||||
tasks.withType<KotlinJsCompile>{
|
||||
kotlinOptions{
|
||||
useEsClasses = true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
ksciencePublish {
|
||||
|
@ -1,10 +1,8 @@
|
||||
package ru.mipt.npm.root
|
||||
|
||||
import space.kscience.dataforge.meta.double
|
||||
import space.kscience.dataforge.meta.doubleArray
|
||||
import space.kscience.dataforge.meta.get
|
||||
import space.kscience.dataforge.meta.int
|
||||
import space.kscience.dataforge.meta.*
|
||||
import space.kscience.dataforge.names.Name
|
||||
import space.kscience.dataforge.names.parseAsName
|
||||
import space.kscience.dataforge.names.plus
|
||||
import space.kscience.visionforge.MutableVisionContainer
|
||||
import space.kscience.visionforge.isEmpty
|
||||
@ -25,6 +23,8 @@ private data class RootToSolidContext(
|
||||
val prototypeHolder: PrototypeHolder,
|
||||
val currentLayer: Int = 0,
|
||||
val maxLayer: Int = 5,
|
||||
val ignoreRootColors: Boolean = false,
|
||||
val colorCache: MutableMap<Meta, String> = mutableMapOf(),
|
||||
)
|
||||
|
||||
// converting to XYZ to Tait–Bryan angles according to https://en.wikipedia.org/wiki/Euler_angles#Rotation_matrix
|
||||
@ -300,7 +300,7 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid?
|
||||
layer = context.currentLayer
|
||||
val nodes = volume.fNodes
|
||||
|
||||
if (nodes.isEmpty() || context.currentLayer >= context.maxLayer) {
|
||||
if (volume.typename != "TGeoVolumeAssembly" && (nodes.isEmpty() || context.currentLayer >= context.maxLayer)) {
|
||||
//TODO add smart filter
|
||||
volume.fShape?.let { shape ->
|
||||
addShape(shape, context)
|
||||
@ -326,6 +326,16 @@ private fun buildVolume(volume: DGeoVolume, context: RootToSolidContext): Solid?
|
||||
group.items.values.first().apply { parent = null }
|
||||
} else {
|
||||
group
|
||||
}.apply {
|
||||
volume.fMedium?.let { medium ->
|
||||
color.set(context.colorCache.getOrPut(medium.meta) { RootColors[11 + context.colorCache.size] })
|
||||
}
|
||||
|
||||
if (!context.ignoreRootColors) {
|
||||
volume.fFillColor?.let {
|
||||
properties[MATERIAL_COLOR_KEY] = RootColors[it]
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -338,6 +348,7 @@ private fun SolidGroup.addRootVolume(
|
||||
cache: Boolean = true,
|
||||
block: Solid.() -> Unit = {},
|
||||
) {
|
||||
|
||||
val combinedName = if (volume.fName.isEmpty()) {
|
||||
name
|
||||
} else if (name == null) {
|
||||
@ -347,12 +358,7 @@ private fun SolidGroup.addRootVolume(
|
||||
}
|
||||
|
||||
if (!cache) {
|
||||
val group = buildVolume(volume, context)?.apply {
|
||||
volume.fFillColor?.let {
|
||||
properties[MATERIAL_COLOR_KEY] = RootColors[it]
|
||||
}
|
||||
block()
|
||||
}
|
||||
val group = buildVolume(volume, context)?.apply(block)
|
||||
setChild(combinedName?.let { Name.parse(it) }, group)
|
||||
} else {
|
||||
val templateName = volumesName + volume.name
|
||||
@ -364,17 +370,17 @@ private fun SolidGroup.addRootVolume(
|
||||
}
|
||||
}
|
||||
|
||||
ref(templateName, name).apply {
|
||||
volume.fFillColor?.let {
|
||||
properties[MATERIAL_COLOR_KEY] = RootColors[it]
|
||||
}
|
||||
block()
|
||||
}
|
||||
ref(templateName, name).apply(block)
|
||||
}
|
||||
}
|
||||
|
||||
public fun MutableVisionContainer<Solid>.rootGeo(dGeoManager: DGeoManager): SolidGroup = solidGroup {
|
||||
val context = RootToSolidContext(this)
|
||||
public fun MutableVisionContainer<Solid>.rootGeo(
|
||||
dGeoManager: DGeoManager,
|
||||
name: String? = null,
|
||||
maxLayer: Int = 5,
|
||||
ignoreRootColors: Boolean = false,
|
||||
): SolidGroup = solidGroup(name = name?.parseAsName()) {
|
||||
val context = RootToSolidContext(this, maxLayer = maxLayer, ignoreRootColors = ignoreRootColors)
|
||||
dGeoManager.fNodes.forEach { node ->
|
||||
addRootNode(node, context)
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
package ru.mipt.npm.root
|
||||
|
||||
public object RootColors {
|
||||
private val colorMap = Array<String>(924) { "white" }
|
||||
private val colorMap = MutableList(924) { "white" }
|
||||
|
||||
//colorMap[110] = "white"
|
||||
|
||||
|
@ -23,7 +23,7 @@ import ru.mipt.npm.muon.monitor.sim.Cos2TrackGenerator
|
||||
import ru.mipt.npm.muon.monitor.sim.simulateOne
|
||||
import space.kscience.dataforge.context.Context
|
||||
import space.kscience.dataforge.context.Global
|
||||
import space.kscience.dataforge.context.fetch
|
||||
import space.kscience.dataforge.context.request
|
||||
import space.kscience.dataforge.misc.DFExperimental
|
||||
import space.kscience.visionforge.solid.Solids
|
||||
import java.awt.Desktop
|
||||
@ -36,7 +36,7 @@ private val generator = Cos2TrackGenerator(JDKRandomGenerator(223))
|
||||
fun Application.module(context: Context = Global) {
|
||||
val currentDir = File(".").absoluteFile
|
||||
environment.log.info("Current directory: $currentDir")
|
||||
val solidManager = context.fetch(Solids)
|
||||
val solidManager = context.request(Solids)
|
||||
|
||||
install(ContentNegotiation) {
|
||||
json()
|
||||
|
@ -7,9 +7,14 @@ import space.kscience.dataforge.meta.Meta
|
||||
import space.kscience.dataforge.meta.get
|
||||
import space.kscience.dataforge.meta.isLeaf
|
||||
import space.kscience.dataforge.meta.string
|
||||
import space.kscience.visionforge.Colors
|
||||
import space.kscience.visionforge.html.ResourceLocation
|
||||
import space.kscience.visionforge.solid.Solids
|
||||
import java.nio.file.Paths
|
||||
import space.kscience.visionforge.solid.ambientLight
|
||||
import space.kscience.visionforge.solid.set
|
||||
import space.kscience.visionforge.solid.solid
|
||||
import java.util.zip.ZipInputStream
|
||||
import kotlin.io.path.Path
|
||||
import kotlin.io.path.writeText
|
||||
|
||||
|
||||
@ -34,73 +39,17 @@ fun main() {
|
||||
println(it)
|
||||
}
|
||||
|
||||
val solid = Solids.rootGeo(geo)
|
||||
|
||||
Paths.get("BM@N.vf.json").writeText(Solids.encodeToString(solid))
|
||||
//println(Solids.encodeToString(solid))
|
||||
|
||||
makeVisionFile {
|
||||
makeVisionFile(path = Path("data/output.html"), resourceLocation = ResourceLocation.EMBED) {
|
||||
vision("canvas") {
|
||||
requirePlugin(Solids)
|
||||
solid
|
||||
solid {
|
||||
ambientLight {
|
||||
color.set(Colors.white)
|
||||
}
|
||||
rootGeo(geo,"BM@N", maxLayer = 3, ignoreRootColors = true).also {
|
||||
Path("data/BM@N.vf.json").writeText(Solids.encodeToString(it))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* SolidGroup {
|
||||
set(
|
||||
"Coil",
|
||||
solid.getPrototype("Coil".asName())!!.apply {
|
||||
parent = null
|
||||
}
|
||||
)
|
||||
*//* group("Shade") {
|
||||
y = 200
|
||||
color("red")
|
||||
coneSurface(
|
||||
bottomOuterRadius = 135,
|
||||
bottomInnerRadius = 25,
|
||||
height = 50,
|
||||
topOuterRadius = 135,
|
||||
topInnerRadius = 25,
|
||||
angle = 1.5707964
|
||||
) {
|
||||
position = Point3D(79.6, 0, -122.1)
|
||||
rotation = Point3D(-1.5707964, 0, 0)
|
||||
}
|
||||
coneSurface(
|
||||
bottomOuterRadius = 135,
|
||||
bottomInnerRadius = 25,
|
||||
height = 50,
|
||||
topOuterRadius = 135,
|
||||
topInnerRadius = 25,
|
||||
angle = 1.5707964
|
||||
) {
|
||||
position = Point3D(-79.6, 0, -122.1)
|
||||
rotation = Point3D(1.5707964, 0, -3.1415927)
|
||||
}
|
||||
coneSurface(
|
||||
bottomOuterRadius = 135,
|
||||
bottomInnerRadius = 25,
|
||||
height = 50,
|
||||
topOuterRadius = 135,
|
||||
topInnerRadius = 25,
|
||||
angle = 1.5707964
|
||||
) {
|
||||
position = Point3D(79.6, 0, 122.1)
|
||||
rotation = Point3D(1.5707964, 0, 0)
|
||||
}
|
||||
coneSurface(
|
||||
bottomOuterRadius = 135,
|
||||
bottomInnerRadius = 25,
|
||||
height = 50,
|
||||
topOuterRadius = 135,
|
||||
topInnerRadius = 25,
|
||||
angle = 1.5707964
|
||||
) {
|
||||
position = Point3D(-79.6, 0, 122.1)
|
||||
rotation = Point3D(-1.5707964, 0, -3.1415927)
|
||||
}
|
||||
}*//*
|
||||
}*/
|
||||
|
@ -7,10 +7,11 @@ val dataforgeVersion: String by rootProject.extra
|
||||
kscience{
|
||||
jvm()
|
||||
js()
|
||||
native()
|
||||
dependencies {
|
||||
api("space.kscience:dataforge-context:$dataforgeVersion")
|
||||
api(spclibs.kotlinx.html)
|
||||
api("org.jetbrains.kotlin-wrappers:kotlin-css")
|
||||
// api("org.jetbrains.kotlin-wrappers:kotlin-css")
|
||||
}
|
||||
testDependencies {
|
||||
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-test:${space.kscience.gradle.KScienceVersions.coroutinesVersion}")
|
||||
|
@ -0,0 +1,5 @@
|
||||
package space.kscience.visionforge
|
||||
|
||||
@OptIn(ExperimentalMultiplatform::class)
|
||||
@OptionalExpectation
|
||||
public expect annotation class JvmSynchronized()
|
@ -13,7 +13,6 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor
|
||||
import space.kscience.dataforge.names.Name
|
||||
import space.kscience.dataforge.names.isEmpty
|
||||
import space.kscience.dataforge.names.plus
|
||||
import kotlin.jvm.Synchronized
|
||||
import kotlin.time.Duration
|
||||
|
||||
/**
|
||||
@ -59,11 +58,11 @@ public class VisionChangeBuilder : MutableVisionContainer<Vision> {
|
||||
|
||||
public fun isEmpty(): Boolean = propertyChange.isEmpty() && propertyChange.isEmpty() && children.isEmpty()
|
||||
|
||||
@Synchronized
|
||||
@JvmSynchronized
|
||||
private fun getOrPutChild(visionName: Name): VisionChangeBuilder =
|
||||
children.getOrPut(visionName) { VisionChangeBuilder() }
|
||||
|
||||
@Synchronized
|
||||
@JvmSynchronized
|
||||
internal fun reset() {
|
||||
vision = null
|
||||
propertyChange = MutableMeta()
|
||||
|
@ -6,7 +6,6 @@ import kotlinx.coroutines.flow.*
|
||||
import kotlinx.coroutines.launch
|
||||
import space.kscience.dataforge.names.*
|
||||
import space.kscience.visionforge.VisionChildren.Companion.STATIC_TOKEN_BODY
|
||||
import kotlin.jvm.Synchronized
|
||||
|
||||
@DslMarker
|
||||
public annotation class VisionBuilder
|
||||
@ -132,7 +131,7 @@ internal abstract class VisionChildrenImpl(
|
||||
|
||||
abstract var items: MutableMap<NameToken, Vision>?
|
||||
|
||||
@Synchronized
|
||||
@JvmSynchronized
|
||||
private fun buildItems(): MutableMap<NameToken, Vision> {
|
||||
if (items == null) {
|
||||
items = LinkedHashMap()
|
||||
|
@ -11,7 +11,6 @@ import space.kscience.dataforge.meta.*
|
||||
import space.kscience.dataforge.meta.descriptors.MetaDescriptor
|
||||
import space.kscience.dataforge.meta.descriptors.get
|
||||
import space.kscience.dataforge.names.*
|
||||
import kotlin.jvm.Synchronized
|
||||
|
||||
public interface VisionProperties {
|
||||
|
||||
@ -155,7 +154,7 @@ public abstract class AbstractVisionProperties(
|
||||
|
||||
override val own: Meta? get() = properties
|
||||
|
||||
@Synchronized
|
||||
@JvmSynchronized
|
||||
protected fun getOrCreateProperties(): MutableMeta {
|
||||
if (properties == null) {
|
||||
//TODO check performance issues
|
||||
|
@ -0,0 +1,3 @@
|
||||
package space.kscience.visionforge
|
||||
|
||||
public actual typealias JvmSynchronized = Synchronized
|
@ -67,9 +67,7 @@ public fun VisionPage.makeFile(
|
||||
path: Path?,
|
||||
fileHeaders: ((Path) -> Map<String, HtmlFragment>)? = null,
|
||||
): Path {
|
||||
val actualFile = path?.let {
|
||||
Path.of(System.getProperty("user.home")).resolve(path)
|
||||
} ?: Files.createTempFile("tempPlot", ".html")
|
||||
val actualFile = path ?: Files.createTempFile("tempPlot", ".html")
|
||||
|
||||
val actualDefaultHeaders = fileHeaders?.invoke(actualFile)
|
||||
val actualHeaders = if (actualDefaultHeaders == null) pageHeaders else actualDefaultHeaders + pageHeaders
|
||||
|
@ -12,6 +12,6 @@ kscience {
|
||||
api("space.kscience:gdml:0.4.0")
|
||||
}
|
||||
dependencies(jvmTest) {
|
||||
implementation("ch.qos.logback:logback-classic:1.2.11")
|
||||
implementation(spclibs.logback.classic)
|
||||
}
|
||||
}
|
@ -2,7 +2,7 @@ plugins {
|
||||
id("space.kscience.gradle.mpp")
|
||||
}
|
||||
|
||||
val markdownVersion = "0.2.4"
|
||||
val markdownVersion = "0.4.1"
|
||||
|
||||
kscience {
|
||||
jvm()
|
||||
|
@ -5,6 +5,7 @@ plugins {
|
||||
kscience {
|
||||
jvm()
|
||||
js()
|
||||
native()
|
||||
useSerialization {
|
||||
json()
|
||||
}
|
||||
|
@ -6,7 +6,10 @@ import space.kscience.dataforge.meta.descriptors.MetaDescriptor
|
||||
import space.kscience.dataforge.names.Name
|
||||
import space.kscience.dataforge.names.NameToken
|
||||
import space.kscience.dataforge.names.parseAsName
|
||||
import space.kscience.visionforge.*
|
||||
import space.kscience.visionforge.AbstractVisionGroup
|
||||
import space.kscience.visionforge.MutableVisionContainer
|
||||
import space.kscience.visionforge.MutableVisionGroup
|
||||
import space.kscience.visionforge.VisionBuilder
|
||||
|
||||
|
||||
/**
|
||||
@ -53,7 +56,7 @@ public class SolidGroup : AbstractVisionGroup(), Solid, PrototypeHolder, Mutable
|
||||
|
||||
/**
|
||||
* Get a prototype redirecting the request to the parent if prototype is not found.
|
||||
* If prototype is a ref, then it is unfolded automatically.
|
||||
* If a prototype is a ref, then it is unfolded automatically.
|
||||
*/
|
||||
override fun getPrototype(name: Name): Solid? =
|
||||
prototypes?.get(name)?.prototype ?: (parent as? PrototypeHolder)?.getPrototype(name)
|
||||
|
@ -10,7 +10,6 @@ import kotlinx.serialization.serializer
|
||||
import space.kscience.dataforge.context.Context
|
||||
import space.kscience.dataforge.context.PluginFactory
|
||||
import space.kscience.dataforge.context.PluginTag
|
||||
import space.kscience.dataforge.context.request
|
||||
import space.kscience.dataforge.meta.Meta
|
||||
import space.kscience.dataforge.misc.DFExperimental
|
||||
import space.kscience.dataforge.names.Name
|
||||
@ -27,15 +26,9 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer<Sol
|
||||
child?.setAsRoot(visionManager)
|
||||
}
|
||||
|
||||
public companion object : PluginFactory<Solids>, MutableVisionContainer<Solid> {
|
||||
public companion object : PluginFactory<Solids> {
|
||||
override val tag: PluginTag = PluginTag(name = "vision.solid", group = PluginTag.DATAFORGE_GROUP)
|
||||
|
||||
public val default: Solids by lazy {
|
||||
Context("@Solids") {
|
||||
plugin(Solids)
|
||||
}.request(Solids)
|
||||
}
|
||||
|
||||
override fun build(context: Context, meta: Meta): Solids = Solids(meta)
|
||||
|
||||
private fun PolymorphicModuleBuilder<Solid>.solids() {
|
||||
@ -79,9 +72,9 @@ public class Solids(meta: Meta) : VisionPlugin(meta), MutableVisionContainer<Sol
|
||||
public fun decodeFromString(str: String): Solid =
|
||||
jsonForSolids.decodeFromString(PolymorphicSerializer(Solid::class), str)
|
||||
|
||||
override fun setChild(name: Name?, child: Solid?) {
|
||||
default.setChild(name, child)
|
||||
}
|
||||
// override fun setChild(name: Name?, child: Solid?) {
|
||||
// default.setChild(name, child)
|
||||
// }
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8,7 +8,7 @@ class CompositeTest {
|
||||
@Test
|
||||
fun testCompositeBuilder(){
|
||||
lateinit var composite: Composite
|
||||
Solids.solidGroup {
|
||||
testSolids.solidGroup {
|
||||
composite = composite(CompositeType.INTERSECT) {
|
||||
y = 300
|
||||
box(100, 100, 100) {
|
||||
|
@ -11,7 +11,7 @@ class ConvexTest {
|
||||
@Suppress("UNUSED_VARIABLE")
|
||||
@Test
|
||||
fun testConvexBuilder() {
|
||||
val group = Solids.solidGroup {
|
||||
val group = testSolids.solidGroup {
|
||||
convex {
|
||||
point(50, 50, -50)
|
||||
point(50, -50, -50)
|
||||
|
@ -9,7 +9,7 @@ import kotlin.test.assertEquals
|
||||
class GroupTest {
|
||||
@Test
|
||||
fun testGroupWithComposite() {
|
||||
val group = Solids.solidGroup{
|
||||
val group = testSolids.solidGroup{
|
||||
union("union") {
|
||||
box(100, 100, 100) {
|
||||
z = 100
|
||||
|
@ -41,7 +41,7 @@ class SerializationTest {
|
||||
x = 100
|
||||
z = -100
|
||||
}
|
||||
val group = Solids.solidGroup {
|
||||
val group = testSolids.solidGroup {
|
||||
newRef("cube", cube)
|
||||
refGroup("pg", Name.parse("pg.content")) {
|
||||
sphere(50) {
|
||||
@ -57,7 +57,7 @@ class SerializationTest {
|
||||
|
||||
@Test
|
||||
fun lightSerialization(){
|
||||
val group = Solids.solidGroup {
|
||||
val group = testSolids.solidGroup {
|
||||
ambientLight {
|
||||
color.set(Colors.white)
|
||||
intensity = 100.0
|
||||
|
@ -7,8 +7,10 @@ import space.kscience.visionforge.getChild
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
|
||||
internal val testSolids = Global.request(Solids)
|
||||
|
||||
class SolidPluginTest {
|
||||
val vision = Solids.solidGroup {
|
||||
val vision = testSolids.solidGroup {
|
||||
box(100, 100, 100, name = "aBox")
|
||||
|
||||
sphere(100, name = "aSphere") {
|
||||
|
@ -62,7 +62,7 @@ class SolidPropertyTest {
|
||||
@Test
|
||||
fun testStyleProperty() {
|
||||
var box: Box? = null
|
||||
val group = Solids.solidGroup {
|
||||
val group = testSolids.solidGroup {
|
||||
styleSheet {
|
||||
update("testStyle") {
|
||||
"test" put 22
|
||||
@ -98,7 +98,7 @@ class SolidPropertyTest {
|
||||
@Test
|
||||
fun testReferenceStyleProperty() {
|
||||
var box: SolidReference? = null
|
||||
val group = Solids.solidGroup {
|
||||
val group = testSolids.solidGroup {
|
||||
styleSheet {
|
||||
update("testStyle") {
|
||||
SolidMaterial.MATERIAL_COLOR_KEY put "#555555"
|
||||
|
@ -11,7 +11,7 @@ import kotlin.test.assertEquals
|
||||
|
||||
@DFExperimental
|
||||
class SolidReferenceTest {
|
||||
val groupWithReference = Solids.solidGroup {
|
||||
val groupWithReference = testSolids.solidGroup {
|
||||
val theStyle by style {
|
||||
SolidMaterial.MATERIAL_COLOR_KEY put "red"
|
||||
}
|
||||
|
@ -17,7 +17,7 @@ internal class VisionUpdateTest {
|
||||
|
||||
@Test
|
||||
fun testVisionUpdate() {
|
||||
val targetVision = Solids.solidGroup {
|
||||
val targetVision = testSolids.solidGroup {
|
||||
box(200, 200, 200, name = "origin")
|
||||
}
|
||||
val dif = visionManager.VisionChange {
|
||||
|
@ -7,7 +7,7 @@ import three.geometries.SphereGeometry
|
||||
|
||||
public object ThreeSphereFactory : ThreeMeshFactory<Sphere>(Sphere::class) {
|
||||
override fun buildGeometry(obj: Sphere): BufferGeometry {
|
||||
return obj.detail?.let {detail ->
|
||||
return obj.detail?.let { detail ->
|
||||
SphereGeometry(
|
||||
radius = obj.radius,
|
||||
phiStart = obj.phiStart,
|
||||
@ -17,7 +17,7 @@ public object ThreeSphereFactory : ThreeMeshFactory<Sphere>(Sphere::class) {
|
||||
widthSegments = detail,
|
||||
heightSegments = detail
|
||||
)
|
||||
}?: SphereGeometry(
|
||||
} ?: SphereGeometry(
|
||||
radius = obj.radius,
|
||||
phiStart = obj.phiStart,
|
||||
phiLength = obj.phi,
|
||||
|
@ -3,8 +3,7 @@
|
||||
"OVERRIDING_FINAL_MEMBER",
|
||||
"RETURN_TYPE_MISMATCH_ON_OVERRIDE",
|
||||
"CONFLICTING_OVERLOADS",
|
||||
"EXTERNAL_DELEGATION",
|
||||
"NO_EXPLICIT_VISIBILITY_IN_API_MODE_WARNING"
|
||||
"EXTERNAL_DELEGATION"
|
||||
)
|
||||
|
||||
@file:JsModule("three-csg-ts")
|
||||
|
Loading…
Reference in New Issue
Block a user