diff --git a/build.gradle.kts b/build.gradle.kts index 8e05f055b..99ee8dd48 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -1,7 +1,9 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar import org.gradle.kotlin.dsl.api import org.jetbrains.kotlin.gradle.tasks.KotlinCompile import scenery.* -import java.net.URL +import java.io.IOException +import java.net.URI plugins { // kotlin and dokka versions are now managed in settings.gradle.kts and gradle.properties @@ -12,16 +14,13 @@ plugins { scenery.base scenery.publish scenery.sign -// id("com.github.elect86.sciJava") version "0.0.4" jacoco - id("com.github.johnrengelman.shadow") apply false + id("io.github.goooler.shadow") } repositories { mavenCentral() maven("https://maven.scijava.org/content/groups/public") -// maven("https://jitpack.io") -// mavenLocal() } val lwjglArtifacts = listOf( @@ -48,7 +47,7 @@ dependencies { implementation(platform("org.scijava:pom-scijava:$scijavaParentPomVersion")) annotationProcessor("org.scijava:scijava-common:2.98.0") - implementation(kotlin("reflect")) + api(kotlin("reflect")) implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0") implementation("org.slf4j:slf4j-api:1.7.36") @@ -141,8 +140,11 @@ dependencies { testImplementation(kotlin("test-junit")) // implementation("com.github.kotlin-graphics:assimp:25c68811") -// testImplementation(misc.junit4) - testImplementation("org.slf4j:slf4j-simple:1.7.36") + if(properties["buildAsApplication"] != null) { + runtimeOnly("org.slf4j:slf4j-simple:1.7.36") + } else { + testRuntimeOnly("org.slf4j:slf4j-simple:1.7.36") + } testImplementation("net.imagej:imagej") testImplementation("net.imagej:ij") testImplementation("net.imglib2:imglib2-ij") @@ -387,7 +389,7 @@ tasks { dokkaSourceSets.configureEach { sourceLink { localDirectory = file("src/main/kotlin") - remoteUrl = URL("https://github.com/scenerygraphics/scenery/tree/main/src/main/kotlin") + remoteUrl = URI("https://github.com/scenerygraphics/scenery/tree/main/src/main/kotlin").toURL() remoteLineSuffix = "#L" } } @@ -397,11 +399,106 @@ tasks { enabled = isRelease } - if(project.properties["buildFatJAR"] == true) { - apply(plugin = "com.github.johnrengelman.shadow") - jar { - isZip64 = true + "shadowJar"(ShadowJar::class) { + enabled = false + isZip64 = true + } + + if(project.properties["buildFatJar"] != null) { + apply(plugin = "io.github.goooler.shadow") + } + + + val shadowJar = register("fullShadowJar") { + archiveClassifier.set("everything") + from(sourceSets.test.get().output, sourceSets.main.get().output) + configurations.add(project.configurations.runtimeClasspath.get()) + isZip64 = true + + // we need to exclude JRuby here, because native-image will + // pick up the RubyFileTypeDetector otherwise on startup, and fail. + val excluded = listOf("org.jruby:jruby-core", + "org.jruby:joni", + "org.jruby:jcodings", + "org.jruby:*") + + dependencies { + excluded.forEach { exclude(it) } + } + + minimize { + dependencies { + exclude("*.DSA") + exclude("*.RSA") + exclude("*.SF") + exclude("META-INF/*.DSA") + exclude("META-INF/*.RSA") + exclude("META-INF/*.SF") + } + } + } + + register("nativeImage") { + val mainClass = "graphics.scenery.SceneryBase" + + val outputBinary = project.projectDir.resolve("./scenery-native") + val shadowJarArtifact = shadowJar.get().archiveFile.get().asFile.absolutePath + + outputs.file(outputBinary) + inputs.file(shadowJarArtifact) + mustRunAfter("fullShadowJar") + doLast { + val nativeImageCmd = listOf("native-image --no-fallback -cp $shadowJarArtifact", + "-H:Name=${outputBinary.absolutePath} -H:Class=$mainClass", + "-H:+ReportUnsupportedElementsAtRuntime", + "-H:ReflectionConfigurationFiles=src/main/resources/META-INF/native-image/reflect-config.json", + "-H:Log=registerResource:3", + "-H:ResourceConfigurationFiles=src/main/resources/META-INF/native-image/resource-config.json", + "--initialize-at-run-time=org.lwjgl", + "--native-image-info", + "--initialize-at-build-time=org.slf4j.simple.SimpleLogger,org.slf4j.LoggerFactory,org.jruby.util.RubyFileTypeDetector", + "-H:IncludeResources=\".*.frag|.*.vert|.*.geom|.*.comp|.*.spv|.*.conf\"" + ) + val result = nativeImageCmd.joinToString(" ").runCommand(projectDir, showCommand = true, useStdOut = true) + + if(result != null) { + logger.lifecycle("Native image written to ${outputBinary.absolutePath}") + } else { + throw GradleException("Failed to create native image") + } + } + } +} + +private fun String.runCommand(workingDir: File, useStdOut: Boolean = false, showCommand: Boolean = false): String? { + try { + val parts = this.split("\\s".toRegex()) + if(showCommand) { + logger.lifecycle("Running $this ...") + } + + val pb = ProcessBuilder(*parts.toTypedArray()) + pb.directory(workingDir) + if(useStdOut) { + pb.inheritIO() + } else { + pb + .redirectErrorStream(true) + .redirectOutput(ProcessBuilder.Redirect.PIPE) + } + val proc = pb.start() + + proc.waitFor(60, TimeUnit.MINUTES) + val result = proc.inputStream.bufferedReader().readText() + if(proc.exitValue() != 0) { + logger.error("Non-zero exit code from process, output:") + logger.error(result) + return null } + return result + } catch(e: IOException) { + logger.error(e.stackTrace.toString()) + return null } } diff --git a/settings.gradle.kts b/settings.gradle.kts index 63cc89124..b786149f6 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -7,7 +7,7 @@ pluginManagement { kotlin("kapt") version kotlinVersion id("org.jetbrains.dokka") version dokkaVersion - id("com.github.johnrengelman.shadow") version "8.1.1" + id("io.github.goooler.shadow") version "8.1.7" } repositories { diff --git a/src/main/kotlin/graphics/scenery/Scene.kt b/src/main/kotlin/graphics/scenery/Scene.kt index 2a62fc0f2..f59bbeb63 100644 --- a/src/main/kotlin/graphics/scenery/Scene.kt +++ b/src/main/kotlin/graphics/scenery/Scene.kt @@ -9,8 +9,6 @@ import graphics.scenery.attribute.material.HasMaterial import graphics.scenery.attribute.renderable.HasRenderable import graphics.scenery.attribute.spatial.HasSpatial import graphics.scenery.net.Networkable -import graphics.scenery.net.NodePublisher -import graphics.scenery.net.NodeSubscriber import graphics.scenery.serialization.* import graphics.scenery.utils.MaybeIntersects import graphics.scenery.utils.extensions.plus diff --git a/src/main/kotlin/graphics/scenery/SceneryBase.kt b/src/main/kotlin/graphics/scenery/SceneryBase.kt index e8a173bac..8f10c734f 100644 --- a/src/main/kotlin/graphics/scenery/SceneryBase.kt +++ b/src/main/kotlin/graphics/scenery/SceneryBase.kt @@ -305,6 +305,10 @@ open class SceneryBase @JvmOverloads constructor(var applicationName: String, * @param[keybinding] The key to trigger the switching. */ fun setupCameraModeSwitching(keybinding: String = "C") { + if(System.getProperty("scenery.Headless").toBoolean() == true && SceneryBase.isNative()) { + return + } + val windowWidth = renderer?.window?.width ?: 512 val windowHeight = renderer?.window?.height ?: 512 @@ -369,6 +373,11 @@ open class SceneryBase @JvmOverloads constructor(var applicationName: String, * @param[renderer] A [Renderer] instance or null. */ fun loadInputHandler(renderer: Renderer?) { + // TODO: Restore input handling when running as native image + if(isNative()) { + return + } + renderer?.let { inputHandler = InputHandler(scene, it, hub) inputHandler?.useDefaultBindings(System.getProperty("user.home") + "/.$applicationName.bindings") @@ -606,5 +615,46 @@ open class SceneryBase @JvmOverloads constructor(var applicationName: String, } } } + + @JvmStatic fun main(args: Array) { + class MinimalScene : SceneryBase("Minimal Scene", wantREPL = false) { + override fun init() { + renderer = hub.add( + SceneryElement.Renderer, + Renderer.createRenderer(hub, applicationName, scene, windowWidth, windowHeight) + ) + + val box = Box(Vector3f(1.0f, 1.0f, 1.0f)) + box.name = "le box du win" + box.material { + metallic = 0.3f + roughness = 0.9f + } + scene.addChild(box) + + val light = PointLight(radius = 15.0f) + light.spatial().position = Vector3f(0.0f, 0.0f, 2.0f) + light.intensity = 5.0f + light.emissionColor = Vector3f(1.0f, 1.0f, 1.0f) + scene.addChild(light) + + val cam: Camera = DetachedHeadCamera() + with(cam) { + spatial { + position = Vector3f(0.0f, 0.0f, 5.0f) + } + perspectiveCamera(50.0f, 512, 512) + + scene.addChild(this) + } + } + } + + val empty = MinimalScene() + empty.main() + } + + /** Returns true if running from a GraalVM native image. */ + @JvmStatic fun isNative(): Boolean = System.getProperty("org.graalvm.home") != null } } diff --git a/src/main/kotlin/graphics/scenery/backends/RenderConfigReader.kt b/src/main/kotlin/graphics/scenery/backends/RenderConfigReader.kt index 06de2c9c4..3b4bde88c 100644 --- a/src/main/kotlin/graphics/scenery/backends/RenderConfigReader.kt +++ b/src/main/kotlin/graphics/scenery/backends/RenderConfigReader.kt @@ -5,7 +5,6 @@ import com.fasterxml.jackson.databind.annotation.JsonDeserialize import com.fasterxml.jackson.dataformat.yaml.YAMLFactory import com.fasterxml.jackson.module.kotlin.KotlinFeature import com.fasterxml.jackson.module.kotlin.KotlinModule -import com.fasterxml.jackson.module.kotlin.SingletonSupport import graphics.scenery.Blending import graphics.scenery.utils.JsonDeserialisers import graphics.scenery.utils.lazyLogger @@ -20,7 +19,7 @@ import kotlin.collections.LinkedHashMap * Returns the output name of the pass with [passname] if it exists, otherwise null. */ @Suppress("unused") -fun RenderConfigReader.RenderConfig.getOutputOfPass(passname: String): String? { +fun RenderConfig.getOutputOfPass(passname: String): String? { return renderpasses[passname]?.output?.name } @@ -28,7 +27,7 @@ fun RenderConfigReader.RenderConfig.getOutputOfPass(passname: String): String? { * Returns all inputs of [targetName], which may be an empty set. */ @Suppress("unused") -fun RenderConfigReader.RenderConfig.getInputsOfTarget(targetName: String): Set { +fun RenderConfig.getInputsOfTarget(targetName: String): Set { return rendertargets.filter { it.key == renderpasses.filter { p -> p.value.output.name == targetName }.keys.first() }.keys @@ -38,7 +37,7 @@ fun RenderConfigReader.RenderConfig.getInputsOfTarget(targetName: String): Set { +fun RenderConfig.createRenderpassFlow(): List { val logger by lazyLogger() val passes = renderpasses val dag = ArrayList() @@ -46,11 +45,11 @@ fun RenderConfigReader.RenderConfig.createRenderpassFlow(): List { // find first val start = passes.filter { it.value.output.name == "Viewport" }.entries.first() - if(start.value.type == RenderConfigReader.RenderpassType.compute) { + if(start.value.type == RenderpassType.compute) { logger.warn("A compute pass is used as a viewport pass. Due to format feature restrictions, this is not recommended and might fail.") } - var inputs: List? = start.value.inputs + var inputs: List? = start.value.inputs dag.add(start.key) while(inputs != null) { @@ -69,111 +68,107 @@ fun RenderConfigReader.RenderConfig.createRenderpassFlow(): List { } +data class RenderConfig( + var name: String, + var sRGB: Boolean = false, + var description: String?, + var stereoEnabled: Boolean = false, + var rendertargets: Map = emptyMap(), + var renderpasses: LinkedHashMap, + var qualitySettings: Map> = emptyMap()) /** - * Class to ingest rendering configuration files. - * - * @author Ulrik Guenther + * Configuration for a single render target, defining its [size] and [attachments]. */ -class RenderConfigReader { +data class RendertargetConfig( + @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) var size: Pair = Pair(1.0f, 1.0f), + val attachments: Map = emptyMap() +) - /** - * Render configuration top-level class, containing information about [rendertargets] - * and [renderpasses], as well as [qualitySettings]. - */ - data class RenderConfig( - var name: String, - var sRGB: Boolean = false, - var description: String?, - var stereoEnabled: Boolean = false, - var rendertargets: Map = emptyMap(), - var renderpasses: LinkedHashMap, - var qualitySettings: Map> = emptyMap()) +data class RendertargetBinding( + val name: String, + val shaderInput: String +) - /** - * Configuration for a single render target, defining its [size] and [attachments]. - */ - data class RendertargetConfig( - @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) var size: Pair = Pair(1.0f, 1.0f), - val attachments: LinkedHashMap = LinkedHashMap() - ) +/** + * Configuration for a single render pass + */ +data class RenderpassConfig( + var type: RenderpassType = RenderpassType.geometry, + var blitInputs: Boolean = false, + var renderTransparent: Boolean = false, + var depthTestEnabled: Boolean = true, + var depthWriteEnabled: Boolean = true, + var order: RenderOrder = RenderOrder.BackToFront, + var renderOpaque: Boolean = true, + var colorBlendOp: Blending.BlendOp = Blending.BlendOp.add, + var alphaBlendOp: Blending.BlendOp = Blending.BlendOp.add, + var srcColorBlendFactor: Blending.BlendFactor = Blending.BlendFactor.SrcAlpha, + var dstColorBlendFactor: Blending.BlendFactor = Blending.BlendFactor.OneMinusSrcAlpha, + var srcAlphaBlendFactor: Blending.BlendFactor = Blending.BlendFactor.SrcAlpha, + var dstAlphaBlendFactor: Blending.BlendFactor = Blending.BlendFactor.OneMinusSrcAlpha, + var shaders: List = listOf(), + + @JsonDeserialize(contentUsing = JsonDeserialisers.BindingDeserializer::class) + var inputs: List? = null, + + @JsonDeserialize(using = JsonDeserialisers.BindingDeserializer::class) + var output: RendertargetBinding = RendertargetBinding("Viewport", "FragColor"), + + var parameters: MutableMap = hashMapOf(), + + @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) + var viewportSize: Pair = Pair(1.0f, 1.0f), + + @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) + var viewportOffset: Pair = Pair(0.0f, 0.0f), + + @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) + var scissor: Pair = Pair(1.0f, 1.0f), + + @JsonDeserialize(using = JsonDeserialisers.VectorDeserializer::class) + var clearColor: Vector4f = Vector4f(0.0f, 0.0f, 0.0f, 0.0f), + + var depthClearValue: Float = 1.0f, + + + @JsonDeserialize(using = JsonDeserialisers.VREyeDeserializer::class) + var eye: Int = -1 +) + +/** Rendering quality enums */ +enum class RenderingQuality { Low, Medium, High, Ultra } + +/** Renderpass types */ +enum class RenderpassType { geometry, quad, lights, compute } + +/** Render ordering */ +enum class RenderOrder { DontCare, BackToFront, FrontToBack } + +/** Rendertarget formats */ +enum class TargetFormat { + RGBA_Float32, + RGBA_Float16, + RGB_Float32, + RGB_Float16, + RG_Float32, + RG_Float16, + R_Float16, + Depth24, + Depth32, + RGBA_UInt8, + RGBA_UInt16, + R_UInt16, + R_UInt8 +} - data class RendertargetBinding( - val name: String, - val shaderInput: String - ) - /** - * Configuration for a single render pass - */ - data class RenderpassConfig( - var type: RenderpassType = RenderpassType.geometry, - var blitInputs: Boolean = false, - var renderTransparent: Boolean = false, - var depthTestEnabled: Boolean = true, - var depthWriteEnabled: Boolean = true, - var order: RenderOrder = RenderOrder.BackToFront, - var renderOpaque: Boolean = true, - var colorBlendOp: Blending.BlendOp = Blending.BlendOp.add, - var alphaBlendOp: Blending.BlendOp = Blending.BlendOp.add, - var srcColorBlendFactor: Blending.BlendFactor = Blending.BlendFactor.SrcAlpha, - var dstColorBlendFactor: Blending.BlendFactor = Blending.BlendFactor.OneMinusSrcAlpha, - var srcAlphaBlendFactor: Blending.BlendFactor = Blending.BlendFactor.SrcAlpha, - var dstAlphaBlendFactor: Blending.BlendFactor = Blending.BlendFactor.OneMinusSrcAlpha, - var shaders: List = listOf(), - - @JsonDeserialize(contentUsing = JsonDeserialisers.BindingDeserializer::class) - var inputs: List? = null, - - @JsonDeserialize(using = JsonDeserialisers.BindingDeserializer::class) - var output: RendertargetBinding = RendertargetBinding("Viewport", "FragColor"), - - var parameters: MutableMap = hashMapOf(), - - @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) - var viewportSize: Pair = Pair(1.0f, 1.0f), - - @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) - var viewportOffset: Pair = Pair(0.0f, 0.0f), - - @JsonDeserialize(using = JsonDeserialisers.FloatPairDeserializer::class) - var scissor: Pair = Pair(1.0f, 1.0f), - - @JsonDeserialize(using = JsonDeserialisers.VectorDeserializer::class) - var clearColor: Vector4f = Vector4f(0.0f, 0.0f, 0.0f, 0.0f), - - var depthClearValue: Float = 1.0f, - - - @JsonDeserialize(using = JsonDeserialisers.VREyeDeserializer::class) - var eye: Int = 0 - ) - - /** Rendering quality enums */ - enum class RenderingQuality { Low, Medium, High, Ultra } - - /** Renderpass types */ - enum class RenderpassType { geometry, quad, lights, compute } - - /** Render ordering */ - enum class RenderOrder { DontCare, BackToFront, FrontToBack } - - /** Rendertarget formats */ - enum class TargetFormat { - RGBA_Float32, - RGBA_Float16, - RGB_Float32, - RGB_Float16, - RG_Float32, - RG_Float16, - R_Float16, - Depth24, - Depth32, - RGBA_UInt8, - RGBA_UInt16, - R_UInt16, - R_UInt8 - } +/** + * Class to ingest rendering configuration files. + * + * @author Ulrik Guenther + */ +class RenderConfigReader { /** * Loads a [RenderConfig] from a file given by [path]. diff --git a/src/main/kotlin/graphics/scenery/backends/Renderer.kt b/src/main/kotlin/graphics/scenery/backends/Renderer.kt index 6b22e22f8..1f6f5ba3a 100644 --- a/src/main/kotlin/graphics/scenery/backends/Renderer.kt +++ b/src/main/kotlin/graphics/scenery/backends/Renderer.kt @@ -99,7 +99,7 @@ abstract class Renderer : Hubable { * * @param[quality] The [RenderConfigReader.RenderingQuality] to be set. */ - abstract fun setRenderingQuality(quality: RenderConfigReader.RenderingQuality) + abstract fun setRenderingQuality(quality: RenderingQuality) /** * Activate or deactivate push-based rendering mode (render only on scene changes diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/HeadlessSwapchain.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/HeadlessSwapchain.kt index 11de7408e..9d47d4e0e 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/HeadlessSwapchain.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/HeadlessSwapchain.kt @@ -1,7 +1,7 @@ package graphics.scenery.backends.vulkan import graphics.scenery.Hub -import graphics.scenery.backends.RenderConfigReader +import graphics.scenery.backends.RenderConfig import graphics.scenery.backends.Renderer import graphics.scenery.backends.ResizeHandler import graphics.scenery.backends.SceneryWindow @@ -22,7 +22,7 @@ import java.nio.LongBuffer open class HeadlessSwapchain(device: VulkanDevice, queue: VulkanDevice.QueueWithMutex, commandPools: VulkanRenderer.CommandPools, - renderConfig: RenderConfigReader.RenderConfig, + renderConfig: RenderConfig, useSRGB: Boolean = true, @Suppress("unused") val useFramelock: Boolean = false, @Suppress("unused") val bufferCount: Int = 2) : VulkanSwapchain(device, queue, commandPools, renderConfig, useSRGB) { diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/OpenGLSwapchain.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/OpenGLSwapchain.kt index 76d06a1a0..853ced4dd 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/OpenGLSwapchain.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/OpenGLSwapchain.kt @@ -4,6 +4,7 @@ import com.sun.jna.Pointer import com.sun.jna.platform.win32.User32 import com.sun.jna.platform.win32.WinDef import graphics.scenery.Hub +import graphics.scenery.backends.RenderConfig import graphics.scenery.backends.RenderConfigReader import graphics.scenery.backends.SceneryWindow import graphics.scenery.utils.SceneryPanel @@ -39,7 +40,7 @@ import java.nio.LongBuffer class OpenGLSwapchain(device: VulkanDevice, queue: VulkanDevice.QueueWithMutex, commandPools: VulkanRenderer.CommandPools, - renderConfig: RenderConfigReader.RenderConfig, + renderConfig: RenderConfig, useSRGB: Boolean = true, val useFramelock: Boolean = System.getProperty("scenery.Renderer.Framelock", "false")?.toBoolean() ?: false, val bufferCount: Int = 2, diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/SwingSwapchain.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/SwingSwapchain.kt index ddad2168f..2d6cf64a3 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/SwingSwapchain.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/SwingSwapchain.kt @@ -1,6 +1,7 @@ package graphics.scenery.backends.vulkan import graphics.scenery.Hub +import graphics.scenery.backends.RenderConfig import graphics.scenery.backends.RenderConfigReader import graphics.scenery.backends.Renderer import graphics.scenery.backends.SceneryWindow @@ -35,7 +36,7 @@ import javax.swing.SwingUtilities open class SwingSwapchain(override val device: VulkanDevice, override val queue: VulkanDevice.QueueWithMutex, override val commandPools: VulkanRenderer.CommandPools, - override val renderConfig: RenderConfigReader.RenderConfig, + override val renderConfig: RenderConfig, override val useSRGB: Boolean = true, override val vsync: Boolean = true, override val undecorated: Boolean = false) : VulkanSwapchain(device, queue, commandPools, renderConfig, useSRGB, vsync, undecorated) { diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanNodeHelpers.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanNodeHelpers.kt index 531e24d29..ed91f1299 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanNodeHelpers.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanNodeHelpers.kt @@ -8,6 +8,7 @@ import graphics.scenery.backends.vulkan.VulkanTexture.Companion.toVulkanFormat import graphics.scenery.textures.Texture import graphics.scenery.textures.UpdatableTexture import graphics.scenery.utils.lazyLogger +import org.lwjgl.system.MemoryUtil import org.lwjgl.system.jemalloc.JEmalloc import org.lwjgl.vulkan.VK10 import org.lwjgl.vulkan.VkBufferCopy @@ -55,7 +56,7 @@ object VulkanNodeHelpers { } if (texcoords.remaining() == 0 && node is InstancedNode) { - val buffer = JEmalloc.je_calloc(1, 4L * vertices.remaining() / geometry.vertexSize * geometry.texcoordSize) + val buffer = MemoryUtil.memCalloc(4 * vertices.remaining() / geometry.vertexSize * geometry.texcoordSize) if(buffer == null) { logger.error("Could not allocate texcoords buffer with ${4L * vertices.remaining() / geometry.vertexSize * geometry.texcoordSize} bytes for ${node.name}") @@ -66,11 +67,11 @@ object VulkanNodeHelpers { } } - val vertexAllocationBytes: Long = 4L * (vertices.remaining() + normals.remaining() + texcoords.remaining()) - val indexAllocationBytes: Long = 4L * indices.remaining() - val fullAllocationBytes: Long = vertexAllocationBytes + indexAllocationBytes + val vertexAllocationBytes: Int = 4 * (vertices.remaining() + normals.remaining() + texcoords.remaining()) + val indexAllocationBytes: Int = 4 * indices.remaining() + val fullAllocationBytes: Int = vertexAllocationBytes + indexAllocationBytes - val stridedBuffer = JEmalloc.je_malloc(fullAllocationBytes) + val stridedBuffer = MemoryUtil.memCalloc(fullAllocationBytes) if(stridedBuffer == null) { logger.error("Allocation failed, skipping vertex buffer creation for ${node.name}.") @@ -148,7 +149,7 @@ object VulkanNodeHelpers { state.indexOffset = vertexBuffer.bufferOffset + vertexAllocationBytes state.indexCount = geometry.indices.remaining() - JEmalloc.je_free(stridedBuffer) + MemoryUtil.memFree(stridedBuffer) stagingBuffer.close() return state @@ -366,7 +367,7 @@ object VulkanNodeHelpers { if(!(material.blending.transparent || material is ShaderMaterial || material.cullingMode != Material.CullingMode.Back || material.wireframe)) { logger.debug("Using default renderpass material for ${node.name}") renderpasses - .filter { it.value.passConfig.type == RenderConfigReader.RenderpassType.geometry || it.value.passConfig.type == RenderConfigReader.RenderpassType.lights } + .filter { it.value.passConfig.type == RenderpassType.geometry || it.value.passConfig.type == RenderpassType.lights } .forEach { it.value.removePipeline(renderable) } @@ -380,7 +381,7 @@ object VulkanNodeHelpers { } renderable.rendererMetadata()?.let { s -> - renderpasses.filter { it.value.passConfig.type == RenderConfigReader.RenderpassType.geometry || it.value.passConfig.type == RenderConfigReader.RenderpassType.lights } + renderpasses.filter { it.value.passConfig.type == RenderpassType.geometry || it.value.passConfig.type == RenderpassType.lights } .map { (passName, pass) -> val shaders = when (material) { is ShaderMaterial -> { @@ -424,7 +425,7 @@ object VulkanNodeHelpers { if (renderable.needsShaderPropertyUBO()) { renderpasses.filter { - (it.value.passConfig.type == RenderConfigReader.RenderpassType.geometry || it.value.passConfig.type == RenderConfigReader.RenderpassType.lights) && + (it.value.passConfig.type == RenderpassType.geometry || it.value.passConfig.type == RenderpassType.lights) && it.value.passConfig.renderTransparent == material.blending.transparent }.forEach { pass -> val dsl = pass.value.initializeShaderPropertyDescriptorSetLayout() @@ -462,7 +463,7 @@ object VulkanNodeHelpers { if(reloaded) { renderable.rendererMetadata()?.texturesToDescriptorSets(device, - renderpasses.filter { pass -> pass.value.passConfig.type != RenderConfigReader.RenderpassType.quad }, + renderpasses.filter { pass -> pass.value.passConfig.type != RenderpassType.quad }, renderable) } } @@ -481,9 +482,7 @@ object VulkanNodeHelpers { .parent .javaClass .kotlin - .memberProperties - .filter { it.findAnnotation() != null } - .count() > 0 + .memberProperties.any { it.findAnnotation() != null } /** * Returns true if the current VulkanTexture can be reused to store the information in the [Texture] diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderer.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderer.kt index d33752365..5a8c88454 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderer.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderer.kt @@ -8,6 +8,7 @@ import graphics.scenery.attribute.renderable.Renderable import graphics.scenery.backends.* import graphics.scenery.textures.Texture import graphics.scenery.utils.* +import graphics.scenery.utils.SystemHelpers.Companion.dumpToFile import graphics.scenery.utils.extensions.applyVulkanCoordinateSystem import kotlinx.coroutines.* import org.joml.* @@ -388,7 +389,7 @@ open class VulkanRenderer(hub: Hub, protected var heartbeatTimer = Timer() protected var gpuStats: GPUStats? = null - private var renderConfig: RenderConfigReader.RenderConfig + private var renderConfig: RenderConfig private var flow: List = listOf() final override var renderConfigFile: String = "" @@ -490,9 +491,10 @@ open class VulkanRenderer(hub: Hub, } val headlessRequested = System.getProperty(Renderer.HEADLESS_PROPERTY_NAME)?.toBoolean() ?: false + val disableSwing = System.getProperty("scenery.Renderer.DisableSwing")?.toBoolean() ?: false // GLFW works kinda shaky on macOS, we create a JFrame here for a nicer experience then. // That is of course unless [embedIn] is already set. - if(Platform.get() == Platform.MACOSX && embedIn == null && !headlessRequested) { + if(Platform.get() == Platform.MACOSX && embedIn == null && !headlessRequested && !disableSwing) { embedIn = SwingSwapchain.createApplicationFrame( applicationName, windowWidth, @@ -944,7 +946,7 @@ open class VulkanRenderer(hub: Hub, ) if(descriptorUpdated) { s.texturesToDescriptorSets(device, - renderpasses.filter { it.value.passConfig.type != RenderConfigReader.RenderpassType.quad }, + renderpasses.filter { it.value.passConfig.type != RenderpassType.quad }, renderable) } @@ -1242,8 +1244,13 @@ open class VulkanRenderer(hub: Hub, } protected fun prepareDefaultTextures(device: VulkanDevice) { - val t = VulkanTexture.loadFromFile(device, commandPools, queue, transferQueue, - Renderer::class.java.getResourceAsStream("DefaultTexture.png"), "png", true, true) + // TODO: Implement better way for loading default textures on GraalVM + val t = if(SceneryBase.isNative()) { + VulkanTexture.fromEmpty(0x7F0000FF, device, commandPools, queue, queue) + } else { + VulkanTexture.loadFromFile(device, commandPools, queue, queue, + Renderer::class.java.getResourceAsStream("DefaultTexture.png"), "png", true, true) + } // TODO: Do an asset manager or sth here? defaultTextures["DefaultTexture"] = t @@ -1518,18 +1525,23 @@ open class VulkanRenderer(hub: Hub, shifted[i + 3] = imageArray[i + 2] } - val image = BufferedImage(window.width, window.height, BufferedImage.TYPE_4BYTE_ABGR) - val imgData = (image.raster.dataBuffer as DataBufferByte).data - System.arraycopy(shifted, 0, imgData, 0, shifted.size) - if(request != null && request is RenderedImage.RenderedRGBAImage) { request.width = window.width request.height = window.height - request.data = imgData + request.data = shifted } if(writeToFile) { - ImageIO.write(image, "png", file) + if(!SceneryBase.isNative()) { + val image = BufferedImage(window.width, window.height, BufferedImage.TYPE_4BYTE_ABGR) + val imgData = (image.raster.dataBuffer as DataBufferByte).data + System.arraycopy(shifted, 0, imgData, 0, shifted.size) + + ImageIO.write(image, "png", file) + } else { + val imgBuf = ByteBuffer.wrap(shifted) + dumpToFile(imgBuf, file.absolutePath.replace(".png", ".raw")) + } logger.info("Screenshot saved to ${file.absolutePath}") } } catch (e: Exception) { @@ -1649,7 +1661,7 @@ open class VulkanRenderer(hub: Hub, // here we discover the objects in the scene that could be relevant for the scene var texturesUpdated: Boolean by StickyBoolean(false) - if (renderpasses.filter { it.value.passConfig.type != RenderConfigReader.RenderpassType.quad }.any()) { + if (renderpasses.filter { it.value.passConfig.type != RenderpassType.quad }.any()) { sceneNodes.forEach { node -> val renderable = node.renderableOrNull() ?: return@forEach val material = node.materialOrNull() ?: return@forEach @@ -1710,7 +1722,7 @@ open class VulkanRenderer(hub: Hub, ) if(descriptorUpdated) { metadata.texturesToDescriptorSets(device, - renderpasses.filter { it.value.passConfig.type != RenderConfigReader.RenderpassType.quad }, + renderpasses.filter { it.value.passConfig.type != RenderpassType.quad }, renderable) logger.trace("Force command buffer re-recording, as reloading textures for ${node.name}") @@ -1733,7 +1745,7 @@ open class VulkanRenderer(hub: Hub, // if we reloaded the node's shaders, we might need to recreate its texture descriptor sets if(reloaded) { renderable.rendererMetadata()?.texturesToDescriptorSets(device, - renderpasses.filter { pass -> pass.value.passConfig.type != RenderConfigReader.RenderpassType.quad }, + renderpasses.filter { pass -> pass.value.passConfig.type != RenderpassType.quad }, renderable) } @@ -1820,10 +1832,10 @@ open class VulkanRenderer(hub: Hub, val start = System.nanoTime() when (target.passConfig.type) { - RenderConfigReader.RenderpassType.geometry -> VulkanScenePass.record(hub!!, target, commandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it !is Light }, forceRerecording) - RenderConfigReader.RenderpassType.lights -> VulkanScenePass.record(hub!!, target, commandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it is Light }, forceRerecording) - RenderConfigReader.RenderpassType.quad -> VulkanPostprocessPass.record(target, commandBuffer, commandPools, sceneUBOs, descriptorSets) - RenderConfigReader.RenderpassType.compute -> VulkanComputePass.record(target, commandBuffer, commandPools, sceneUBOs, descriptorSets) + RenderpassType.geometry -> VulkanScenePass.record(hub!!, target, commandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it !is Light }, forceRerecording) + RenderpassType.lights -> VulkanScenePass.record(hub!!, target, commandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it is Light }, forceRerecording) + RenderpassType.quad -> VulkanPostprocessPass.record(target, commandBuffer, commandPools, sceneUBOs, descriptorSets) + RenderpassType.compute -> VulkanComputePass.record(target, commandBuffer, commandPools, sceneUBOs, descriptorSets) } @@ -1882,10 +1894,10 @@ open class VulkanRenderer(hub: Hub, }*/ when (viewportPass.passConfig.type) { - RenderConfigReader.RenderpassType.geometry -> VulkanScenePass.record(hub!!, viewportPass, viewportCommandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it !is Light }, forceRerecording) - RenderConfigReader.RenderpassType.lights -> VulkanScenePass.record(hub!!, viewportPass, viewportCommandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it is Light }, forceRerecording) - RenderConfigReader.RenderpassType.quad -> VulkanPostprocessPass.record(viewportPass, viewportCommandBuffer, commandPools, sceneUBOs, descriptorSets) - RenderConfigReader.RenderpassType.compute -> VulkanComputePass.record(viewportPass, viewportCommandBuffer, commandPools, sceneUBOs, descriptorSets) + RenderpassType.geometry -> VulkanScenePass.record(hub!!, viewportPass, viewportCommandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it !is Light }, forceRerecording) + RenderpassType.lights -> VulkanScenePass.record(hub!!, viewportPass, viewportCommandBuffer, commandPools, descriptorSets, renderConfig, renderpasses, sceneNodes, { it is Light }, forceRerecording) + RenderpassType.quad -> VulkanPostprocessPass.record(viewportPass, viewportCommandBuffer, commandPools, sceneUBOs, descriptorSets) + RenderpassType.compute -> VulkanComputePass.record(viewportPass, viewportCommandBuffer, commandPools, sceneUBOs, descriptorSets) } stats?.add("VulkanRenderer.${viewportPass.name}.recordCmdBuffer", System.nanoTime() - start) @@ -2440,7 +2452,7 @@ open class VulkanRenderer(hub: Hub, * * @param[quality] The [RenderConfigReader.RenderingQuality] to be set. */ - override fun setRenderingQuality(quality: RenderConfigReader.RenderingQuality) { + override fun setRenderingQuality(quality: RenderingQuality) { fun setConfigSetting(key: String, value: Any) { val setting = "Renderer.$key" diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRendererMetadata.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRendererMetadata.kt index 579f2b038..aa2f155f8 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRendererMetadata.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRendererMetadata.kt @@ -7,6 +7,7 @@ import org.lwjgl.vulkan.* import graphics.scenery.backends.RenderConfigReader import graphics.scenery.backends.RendererFlags import graphics.scenery.attribute.renderable.Renderable +import graphics.scenery.backends.RenderpassType import graphics.scenery.utils.lazyLogger import java.util.* import java.util.concurrent.ConcurrentHashMap @@ -110,7 +111,7 @@ open class VulkanRendererMetadata { // we warn only if the associated renderable is used in graphics mode, not in compute mode. // compute mode nodes are not automatically assumed to have ObjectTextures available. val renderableForCompute = (renderable.parent.materialOrNull() as? ShaderMaterial)?.isCompute() ?: false - if (pass.passConfig.type == RenderConfigReader.RenderpassType.geometry && !renderableForCompute) { + if (pass.passConfig.type == RenderpassType.geometry && !renderableForCompute) { logger.warn("$this: DSL for ObjectTextures not found for pass $passName") } else { logger.debug("{}: DSL for ObjectTextures not found for pass {}", this, passName) diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderpass.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderpass.kt index 4553f5e5c..78eb2e9ea 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderpass.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanRenderpass.kt @@ -28,7 +28,7 @@ import kotlin.collections.LinkedHashMap * * @author Ulrik Günther */ -open class VulkanRenderpass(val name: String, var config: RenderConfigReader.RenderConfig, +open class VulkanRenderpass(val name: String, var config: RenderConfig, val device: VulkanDevice, val pipelineCache: Long, val vertexDescriptors: ConcurrentHashMap, @@ -101,7 +101,7 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren ) /** This renderpasses' [RenderConfigReader.RenderpassConfig]. */ - var passConfig: RenderConfigReader.RenderpassConfig = config.renderpasses.getValue(name) + var passConfig: RenderpassConfig = config.renderpasses.getValue(name) protected set /** Whether this renderpass will render to the viewport or to a [VulkanFramebuffer] */ @@ -171,7 +171,7 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren fun initializeInputAttachmentDescriptorSetLayouts(shaderModules: List) { var input = 0 logger.debug("Renderpass $name has inputs ${inputs.keys.joinToString(", ")}") - val relevantFramebuffers = if(passConfig.type == RenderConfigReader.RenderpassType.compute) { + val relevantFramebuffers = if(passConfig.type == RenderpassType.compute) { inputs.entries + output.entries } else { inputs.entries @@ -196,13 +196,13 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren attachment.descriptorSet when(passConfig.type) { - RenderConfigReader.RenderpassType.geometry, - RenderConfigReader.RenderpassType.quad, - RenderConfigReader.RenderpassType.lights -> attachment.descriptorSetLayout to attachment.descriptorSet - RenderConfigReader.RenderpassType.compute -> attachment.loadStoreDescriptorSetLayout!! to attachment.loadStoreDescriptorSet!! + RenderpassType.geometry, + RenderpassType.quad, + RenderpassType.lights -> attachment.descriptorSetLayout to attachment.descriptorSet + RenderpassType.compute -> attachment.loadStoreDescriptorSetLayout!! to attachment.loadStoreDescriptorSet!! } } else { - if(passConfig.type == RenderConfigReader.RenderpassType.compute) { + if(passConfig.type == RenderpassType.compute) { inputFramebuffer.value.imageLoadStoreDescriptorSetLayout to inputFramebuffer.value.imageLoadStoreDescriptorSet } else { inputFramebuffer.value.outputDescriptorSetLayout to inputFramebuffer.value.outputDescriptorSet @@ -579,7 +579,7 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren logger.debug("Required DSLs: ${reqDescriptorLayouts.joinToString { it.toHexString() }}") when { - (passConfig.type == RenderConfigReader.RenderpassType.quad && vertexDescription != null) + (passConfig.type == RenderpassType.quad && vertexDescription != null) && shaderModules.first().type != ShaderType.ComputeShader -> { p.rasterizationState.cullMode(VK_CULL_MODE_FRONT_BIT) p.rasterizationState.frontFace(VK_FRONT_FACE_COUNTER_CLOCKWISE) @@ -591,8 +591,8 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren ) } - (passConfig.type == RenderConfigReader.RenderpassType.geometry - || passConfig.type == RenderConfigReader.RenderpassType.lights) + (passConfig.type == RenderpassType.geometry + || passConfig.type == RenderpassType.lights) && shaderModules.first().type != ShaderType.ComputeShader && vertexDescription != null -> { p.createPipelines( vi = vertexDescription.state, @@ -600,7 +600,7 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren ) } - passConfig.type == RenderConfigReader.RenderpassType.compute + passConfig.type == RenderpassType.compute || shaderModules.first().type == ShaderType.ComputeShader -> { p.createPipelines( descriptorSetLayouts = reqDescriptorLayouts, @@ -676,7 +676,7 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren logger.debug("Required DSLs: ${reqDescriptorLayouts.joinToString { it.toHexString() } }") when { - (passConfig.type == RenderConfigReader.RenderpassType.quad && vertexInputType != null) + (passConfig.type == RenderpassType.quad && vertexInputType != null) && shaders.first().type != ShaderType.ComputeShader -> { p.rasterizationState.cullMode(VK_CULL_MODE_FRONT_BIT) p.rasterizationState.frontFace(VK_FRONT_FACE_COUNTER_CLOCKWISE) @@ -687,15 +687,15 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren onlyForTopology = GeometryType.TRIANGLES) } - (passConfig.type == RenderConfigReader.RenderpassType.geometry - || passConfig.type == RenderConfigReader.RenderpassType.lights) + (passConfig.type == RenderpassType.geometry + || passConfig.type == RenderpassType.lights) && shaders.first().type != ShaderType.ComputeShader && vertexInputType != null -> { p.createPipelines( vi = vertexInputType.state, descriptorSetLayouts = reqDescriptorLayouts) } - passConfig.type == RenderConfigReader.RenderpassType.compute + passConfig.type == RenderpassType.compute || shaders.first().type == ShaderType.ComputeShader -> { p.createPipelines( descriptorSetLayouts = reqDescriptorLayouts, @@ -908,7 +908,7 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren } fun prepareRenderpassesFromConfig( - config: RenderConfigReader.RenderConfig, + config: RenderConfig, device: VulkanDevice, commandPools: VulkanRenderer.CommandPools, queue: VulkanDevice.QueueWithMutex, @@ -958,23 +958,23 @@ open class VulkanRenderpass(val name: String, var config: RenderConfigReader.Ren logger.info(" + attachment ${att.key}, ${att.value.name}") when (att.value) { - RenderConfigReader.TargetFormat.RGBA_Float32 -> framebuffer.addFloatRGBABuffer(att.key, 32) - RenderConfigReader.TargetFormat.RGBA_Float16 -> framebuffer.addFloatRGBABuffer(att.key, 16) + TargetFormat.RGBA_Float32 -> framebuffer.addFloatRGBABuffer(att.key, 32) + TargetFormat.RGBA_Float16 -> framebuffer.addFloatRGBABuffer(att.key, 16) - RenderConfigReader.TargetFormat.RGB_Float32 -> framebuffer.addFloatRGBBuffer(att.key, 32) - RenderConfigReader.TargetFormat.RGB_Float16 -> framebuffer.addFloatRGBBuffer(att.key, 16) + TargetFormat.RGB_Float32 -> framebuffer.addFloatRGBBuffer(att.key, 32) + TargetFormat.RGB_Float16 -> framebuffer.addFloatRGBBuffer(att.key, 16) - RenderConfigReader.TargetFormat.RG_Float32 -> framebuffer.addFloatRGBuffer(att.key, 32) - RenderConfigReader.TargetFormat.RG_Float16 -> framebuffer.addFloatRGBuffer(att.key, 16) + TargetFormat.RG_Float32 -> framebuffer.addFloatRGBuffer(att.key, 32) + TargetFormat.RG_Float16 -> framebuffer.addFloatRGBuffer(att.key, 16) - RenderConfigReader.TargetFormat.RGBA_UInt16 -> framebuffer.addUnsignedByteRGBABuffer(att.key, 16) - RenderConfigReader.TargetFormat.RGBA_UInt8 -> framebuffer.addUnsignedByteRGBABuffer(att.key, 8) - RenderConfigReader.TargetFormat.R_UInt16 -> framebuffer.addUnsignedByteRBuffer(att.key, 16) - RenderConfigReader.TargetFormat.R_UInt8 -> framebuffer.addUnsignedByteRBuffer(att.key, 8) + TargetFormat.RGBA_UInt16 -> framebuffer.addUnsignedByteRGBABuffer(att.key, 16) + TargetFormat.RGBA_UInt8 -> framebuffer.addUnsignedByteRGBABuffer(att.key, 8) + TargetFormat.R_UInt16 -> framebuffer.addUnsignedByteRBuffer(att.key, 16) + TargetFormat.R_UInt8 -> framebuffer.addUnsignedByteRBuffer(att.key, 8) - RenderConfigReader.TargetFormat.Depth32 -> framebuffer.addDepthBuffer(att.key, 32) - RenderConfigReader.TargetFormat.Depth24 -> framebuffer.addDepthBuffer(att.key, 24) - RenderConfigReader.TargetFormat.R_Float16 -> framebuffer.addFloatBuffer(att.key, 16) + TargetFormat.Depth32 -> framebuffer.addDepthBuffer(att.key, 32) + TargetFormat.Depth24 -> framebuffer.addDepthBuffer(att.key, 24) + TargetFormat.R_Float16 -> framebuffer.addFloatBuffer(att.key, 16) } } diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanScenePass.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanScenePass.kt index 752dca5c5..182482f8f 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanScenePass.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanScenePass.kt @@ -10,6 +10,7 @@ import graphics.scenery.geometry.GeometryType import graphics.scenery.attribute.HasDelegationType import graphics.scenery.attribute.DelegationType import graphics.scenery.attribute.renderable.Renderable +import graphics.scenery.backends.RenderConfig import graphics.scenery.backends.ShaderIntrospection import graphics.scenery.textures.Texture import graphics.scenery.utils.lazyLogger @@ -42,7 +43,7 @@ object VulkanScenePass { commandBuffer: VulkanCommandBuffer, commandPools: VulkanRenderer.CommandPools, descriptorSets: Map, - renderConfig: RenderConfigReader.RenderConfig, + renderConfig: RenderConfig, renderpasses: Map, sceneObjects: List, customNodeFilter: ((Node) -> Boolean)? = null, diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanSwapchain.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanSwapchain.kt index 9ab6fd511..c07713941 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanSwapchain.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanSwapchain.kt @@ -1,6 +1,7 @@ package graphics.scenery.backends.vulkan import graphics.scenery.Hub +import graphics.scenery.backends.RenderConfig import graphics.scenery.backends.RenderConfigReader import graphics.scenery.backends.SceneryWindow import graphics.scenery.utils.lazyLogger @@ -32,7 +33,7 @@ import java.util.* open class VulkanSwapchain(open val device: VulkanDevice, open val queue: VulkanDevice.QueueWithMutex, open val commandPools: VulkanRenderer.CommandPools, - @Suppress("unused") open val renderConfig: RenderConfigReader.RenderConfig, + @Suppress("unused") open val renderConfig: RenderConfig, open val useSRGB: Boolean = true, open val vsync: Boolean = false, open val undecorated: Boolean = false) : Swapchain { diff --git a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanTexture.kt b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanTexture.kt index 4b480f207..0b6cb8339 100644 --- a/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanTexture.kt +++ b/src/main/kotlin/graphics/scenery/backends/vulkan/VulkanTexture.kt @@ -14,6 +14,7 @@ import net.imglib2.type.numeric.real.DoubleType import net.imglib2.type.numeric.real.FloatType import org.joml.Vector4i import org.lwjgl.system.MemoryStack.stackPush +import org.lwjgl.system.MemoryUtil import org.lwjgl.system.MemoryUtil.* import org.lwjgl.vulkan.* import org.lwjgl.vulkan.VK10.* @@ -653,6 +654,38 @@ open class VulkanTexture( return tex } + fun fromEmpty( + defaultValue: Int, + device: VulkanDevice, + commandPools: VulkanRenderer.CommandPools, + queue: VulkanDevice.QueueWithMutex, + transferQueue: VulkanDevice.QueueWithMutex + ): VulkanTexture { + val texWidth = 2 + val texHeight = 2 + + val mipmapLevels = 1 + + val tex = VulkanTexture( + device, + commandPools, queue, transferQueue, + texWidth, texHeight, 1, + VK_FORMAT_R8G8B8A8_SRGB, + mipmapLevels, + minFilterLinear = true, maxFilterLinear = true + ) + + val buffer = memCalloc(4*texWidth*texHeight) + val v = buffer.asIntBuffer() + while(v.hasRemaining()) { + v.put(defaultValue) + } + + tex.copyFrom(buffer) + + return tex + } + /** * Loads a texture from a raw file given by a [stream], and allocates the [VulkanTexture] on [device]. */ diff --git a/src/main/kotlin/graphics/scenery/controls/InputHandler.kt b/src/main/kotlin/graphics/scenery/controls/InputHandler.kt index 95957d910..c90d9ac49 100644 --- a/src/main/kotlin/graphics/scenery/controls/InputHandler.kt +++ b/src/main/kotlin/graphics/scenery/controls/InputHandler.kt @@ -3,6 +3,7 @@ package graphics.scenery.controls import graphics.scenery.* import graphics.scenery.backends.RenderConfigReader import graphics.scenery.backends.Renderer +import graphics.scenery.backends.RenderingQuality import graphics.scenery.backends.SceneryWindow import graphics.scenery.controls.behaviours.* import graphics.scenery.utils.lazyLogger @@ -176,6 +177,9 @@ class InputHandler(scene: Scene, renderer: Renderer, override var hub: Hub?, for * @param[bindingConfigFile] The filename to read the configuration from. */ fun useDefaultBindings(bindingConfigFile: String) { + if(System.getProperty("scenery.Headless").toBoolean() == true) { + return + } // Load YAML config var reader: Reader @@ -235,7 +239,7 @@ class InputHandler(scene: Scene, renderer: Renderer, override var hub: Hub?, for behaviourMap.put("toggle_debug", ToggleCommand(renderer, "toggleDebug")) behaviourMap.put("toggle_fullscreen", ToggleCommand(renderer, "toggleFullscreen")) behaviourMap.put("screenshot", ToggleCommand(renderer, "screenshot")) - behaviourMap.put("set_rendering_quality", EnumCycleCommand(RenderConfigReader.RenderingQuality::class.java, renderer, "setRenderingQuality")) + behaviourMap.put("set_rendering_quality", EnumCycleCommand(RenderingQuality::class.java, renderer, "setRenderingQuality")) behaviourMap.put("record_movie", ToggleCommand(renderer, "recordMovie")) behaviourMap.put("toggle_vr", ToggleCommand(renderer, "toggleVR")) diff --git a/src/main/kotlin/graphics/scenery/utils/Image.kt b/src/main/kotlin/graphics/scenery/utils/Image.kt index 666e6886a..52049d126 100644 --- a/src/main/kotlin/graphics/scenery/utils/Image.kt +++ b/src/main/kotlin/graphics/scenery/utils/Image.kt @@ -1,6 +1,7 @@ package graphics.scenery.utils -import graphics.scenery.volumes.Colormap +import io.scif.SCIFIO +import net.imglib2.img.Img import net.imglib2.type.numeric.NumericType import net.imglib2.type.numeric.integer.UnsignedByteType import net.imglib2.type.numeric.real.FloatType @@ -12,6 +13,9 @@ import org.lwjgl.util.tinyexr.EXRImage import org.lwjgl.util.tinyexr.EXRVersion import org.lwjgl.util.tinyexr.TinyEXR import org.lwjgl.util.tinyexr.TinyEXR.FreeEXRImage +import org.scijava.Context +import org.scijava.io.handle.DataHandleService +import org.scijava.io.location.BytesLocation import java.awt.Color import java.awt.color.ColorSpace import java.awt.geom.AffineTransform @@ -22,7 +26,9 @@ import java.io.InputStream import java.nio.ByteBuffer import java.nio.ByteOrder import java.util.* -import javax.imageio.ImageIO +import kotlin.system.measureNanoTime +import kotlin.time.Duration +import kotlin.time.Duration.Companion.nanoseconds /** * Utility class for reading RGBA images via [BufferedImage]. @@ -34,6 +40,7 @@ open class Image(val contents: ByteBuffer, val width: Int, val height: Int, val companion object { protected val logger by lazyLogger() + protected val scifio = SCIFIO() private val StandardAlphaColorModel = ComponentColorModel( ColorSpace.getInstance(ColorSpace.CS_sRGB), @@ -71,6 +78,8 @@ open class Image(val contents: ByteBuffer, val width: Int, val height: Int, val val imageData: ByteBuffer val pixels: IntArray val buffer: ByteArray + var width: Int + var height: Int when { extension.lowercase().endsWith("exr") -> { @@ -180,32 +189,51 @@ open class Image(val contents: ByteBuffer, val width: Int, val height: Int, val else -> { if(extension.lowercase().endsWith("tga")) { - try { + imageData = try { val reader = BufferedInputStream(stream) buffer = ByteArray(stream.available()) reader.read(buffer) reader.close() - pixels = TGAReader.read(buffer, TGAReader.ARGB) - val width = TGAReader.getWidth(buffer) - val height = TGAReader.getHeight(buffer) - bi = BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB) - bi.setRGB(0, 0, width, height, pixels, 0, width) + pixels = TGAReader.read(buffer, TGAReader.RGBA) + width = TGAReader.getWidth(buffer) + height = TGAReader.getHeight(buffer) + val b = ByteBuffer.allocateDirect(width * height * 4) + b.asIntBuffer().put(pixels) + b } catch (e: IOException) { - Colormap.logger.error("Could not read image from TGA. ${e.message}") - bi = BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB) - bi.setRGB(0, 0, 1, 1, intArrayOf(255, 0, 0), 0, 1) + logger.error("Could not read image from TGA. ${e.message}") + width = 1 + height = 1 + ByteBuffer.wrap(byteArrayOf(127,127,127,0)) } } else { - try { - val reader = BufferedInputStream(stream) - bi = ImageIO.read(stream) + imageData = try { + // TODO: Improve this code here + val ctx = Context()//PluginService::class.java, SCIFIOService::class.java, DataHandleService::class.java) + val ds = ctx.getService(DataHandleService::class.java) + val h = ds.create(BytesLocation(stream.readAllBytes())) + val opener = scifio.io().getOpener(h.get()) + logger.info("Opener: $opener") + val img = opener.open(h.get()) as? Img + logger.info("opened $img!") + val reader = scifio.initializer().initializeReader(h.get()) + logger.info("Got reader") + val plane = reader.openPlane(0, 0) + logger.info("Opened plane with ${plane.bytes.size}b!") + val b = ByteBuffer.allocateDirect(plane.bytes.size) + b.put(plane.bytes) + b.flip() + width = plane.lengths[0].toInt() + height = plane.lengths[1].toInt() reader.close() + b } catch (e: IOException) { - Colormap.logger.error("Could not read image: ${e.message}") - bi = BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB) - bi.setRGB(0, 0, 1, 1, intArrayOf(255, 0, 0), 0, 1) + logger.error("Could not read image: ${e.message}") + width = 1 + height = 1 + ByteBuffer.wrap(byteArrayOf(127,127,127,0)) } } @@ -213,17 +241,36 @@ open class Image(val contents: ByteBuffer, val width: Int, val height: Int, val if(flip) { // convert to OpenGL UV space - flippedImage = createFlipped(bi) - imageData = bufferedImageToRGBABuffer(flippedImage) - } else { - imageData = bufferedImageToRGBABuffer(bi) + flipInPlace(imageData, width, height) } - return Image(imageData, bi.width, bi.height) + return Image(imageData, width, height) } } } + private fun flipInPlace(imageData: ByteBuffer, width: Int, height: Int) { + val view = imageData.duplicate().order(ByteOrder.LITTLE_ENDIAN) + (0..height / 2).forEach { index -> + val sourceIndex = index * width * 4 + val destIndex = width * height * 4 - (index + 1) * width * 4 + + val source = ByteArray(width * 4) + view.position(sourceIndex) + view.get(source) + + val dest = ByteArray(width * 4) + view.position(destIndex) + view.get(dest) + + view.position(sourceIndex) + view.put(dest) + + view.position(destIndex) + view.put(source) + } + } + /** * Creates an Image from a resource given in [path], with [baseClass] as basis for the search path. * [path] is expected to end in an extension (e.g., ".png"), such that the file type can be determined. diff --git a/src/main/kotlin/graphics/scenery/utils/JsonDeserialisers.kt b/src/main/kotlin/graphics/scenery/utils/JsonDeserialisers.kt index 6f9fd20ad..362b7984b 100644 --- a/src/main/kotlin/graphics/scenery/utils/JsonDeserialisers.kt +++ b/src/main/kotlin/graphics/scenery/utils/JsonDeserialisers.kt @@ -6,6 +6,7 @@ import com.fasterxml.jackson.core.JsonToken import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.JsonDeserializer import graphics.scenery.backends.RenderConfigReader +import graphics.scenery.backends.RendertargetBinding import org.joml.Vector2f import org.joml.Vector4f @@ -73,12 +74,12 @@ class JsonDeserialisers { /** * Deserializer for input/output bindings */ - class BindingDeserializer : JsonDeserializer() { - override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): RenderConfigReader.RendertargetBinding { + class BindingDeserializer : JsonDeserializer() { + override fun deserialize(p: JsonParser, ctxt: DeserializationContext?): RendertargetBinding { val tokens = p.text.split(" as ").map { it.trim() } return when(tokens.size) { - 1 -> RenderConfigReader.RendertargetBinding(tokens[0], tokens[0]) - 2 -> RenderConfigReader.RendertargetBinding(tokens[0], tokens[1]) + 1 -> RendertargetBinding(tokens[0], tokens[0]) + 2 -> RendertargetBinding(tokens[0], tokens[1]) else -> throw IllegalStateException("Could not parse ${p.text} into rendertarget binding. Format required: 'renderTargetName as nameInShader'") } } diff --git a/src/main/kotlin/graphics/scenery/utils/TGAReader.kt b/src/main/kotlin/graphics/scenery/utils/TGAReader.kt index 4eb38ef5e..4173cbfdc 100644 --- a/src/main/kotlin/graphics/scenery/utils/TGAReader.kt +++ b/src/main/kotlin/graphics/scenery/utils/TGAReader.kt @@ -4,6 +4,7 @@ import java.io.IOException object TGAReader { val ARGB = Order(16, 8, 0, 24) + val RGBA = Order(24, 16, 8, 0) val ABGR = Order(0, 8, 16, 24) fun getWidth(buffer: ByteArray): Int { return buffer[12].toInt() and 0xFF or (buffer[13].toInt() and 0xFF shl 8) diff --git a/src/main/resources/META-INF/native-image/jni-config.json b/src/main/resources/META-INF/native-image/jni-config.json new file mode 100644 index 000000000..082b7963c --- /dev/null +++ b/src/main/resources/META-INF/native-image/jni-config.json @@ -0,0 +1,20 @@ +[ +{ + "name":"java.lang.Boolean", + "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }] +}, +{ + "name":"java.lang.ClassLoader", + "methods":[ + {"name":"getPlatformClassLoader","parameterTypes":[] }, + {"name":"loadClass","parameterTypes":["java.lang.String"] } + ] +}, +{ + "name":"jdk.internal.loader.ClassLoaders$PlatformClassLoader" +}, +{ + "name":"org.lwjgl.system.CallbackI", + "methods":[{"name":"callback","parameterTypes":["long","long"] }] +} +] diff --git a/src/main/resources/META-INF/native-image/predefined-classes-config.json b/src/main/resources/META-INF/native-image/predefined-classes-config.json new file mode 100644 index 000000000..0e79b2c5d --- /dev/null +++ b/src/main/resources/META-INF/native-image/predefined-classes-config.json @@ -0,0 +1,8 @@ +[ + { + "type":"agent-extracted", + "classes":[ + ] + } +] + diff --git a/src/main/resources/META-INF/native-image/proxy-config.json b/src/main/resources/META-INF/native-image/proxy-config.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/src/main/resources/META-INF/native-image/proxy-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/src/main/resources/META-INF/native-image/reflect-config.json b/src/main/resources/META-INF/native-image/reflect-config.json new file mode 100644 index 000000000..9d886584c --- /dev/null +++ b/src/main/resources/META-INF/native-image/reflect-config.json @@ -0,0 +1,2409 @@ +[ +{ + "name":"java.nio.file.Files", + "allDeclaredFields":true +}, +{ + "name":"java.nio.file.Files$FileTypeDetectors", + "allDeclaredFields":true +}, +{ + "name":"java.nio.Buffer", + "allDeclaredFields":true +}, +{ + "name":"java.nio.ByteBuffer", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectByteBuffer", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectCharBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectDoubleBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectFloatBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectIntBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectLongBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectShortBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.MappedByteBuffer", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.PointerBuffer", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name":"org.lwjgl.glfw.GLFW", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.glfw.GLFWVidMode", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name":"org.lwjgl.system.CallbackI", + "queriedMethods":[{"name":"callback","parameterTypes":["long","long"] }] +}, +{ + "name":"org.lwjgl.system.CustomBuffer", + "fields":[ + {"name":"capacity"}, + {"name":"container"}, + {"name":"limit"}, + {"name":"mark"}, + {"name":"position"} + ] +}, +{ + "name":"org.lwjgl.system.Pointer$Default", + "fields":[{"name":"address"}] +}, +{ + "name":"org.lwjgl.system.Struct", + "fields":[{"name":"container"}] +}, +{ + "name":"org.lwjgl.system.libffi.FFICIF", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name":"org.lwjgl.system.libffi.FFIClosure", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name":"org.lwjgl.system.libffi.FFIType", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name":"sun.misc.Unsafe", + "allDeclaredFields":true +}, +{ + "name":"org.lwjgl.util.spvc.SpvcBufferRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.util.spvc.SpvcBufferRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.util.spvc.SpvcReflectedResource", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.util.spvc.SpvcReflectedResource$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset2D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset2D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent2D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent2D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearDepthStencilValue", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearDepthStencilValue$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearColorValue", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearColorValue$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueryPoolCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPresentInfoKHR", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceCapabilitiesKHR", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSwapchainCreateInfoKHR", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceFormatKHR", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkApplicationInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkInstanceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCreateInfoEXT", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugReportCallbackCreateInfoEXT", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSamplerCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFramebufferCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFormatProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassBeginInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineCacheCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineInputAssemblyStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineRasterizationStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineViewportStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDynamicStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDepthStencilStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineMultisampleStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPushConstantRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineLayoutCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkGraphicsPipelineCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkComputePipelineCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFeatures", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandPoolCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsObjectNameInfoEXT", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFormatProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkShaderModuleCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferBeginInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSamplerCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueryPoolCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPresentInfoKHR$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceCapabilitiesKHR$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSwapchainCreateInfoKHR$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSurfaceFormatKHR$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkApplicationInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkInstanceCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsMessengerCreateInfoEXT$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugReportCallbackCreateInfoEXT$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSamplerCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFramebufferCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFormatProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassBeginInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineCacheCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineInputAssemblyStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineRasterizationStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendAttachmentState$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineColorBlendStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineViewportStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDynamicStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineDepthStencilStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineMultisampleStateCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPushConstantRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineLayoutCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkGraphicsPipelineCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkComputePipelineCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFeatures$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandPoolCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDebugUtilsObjectNameInfoEXT$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFormatProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkShaderModuleCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineShaderStageCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferBeginInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSamplerCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryBarrier$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkClearValue$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFramebufferCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFramebufferCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDependency$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubpassDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentReference$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorImageInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkAttachmentDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassBeginInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRenderPassBeginInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkViewport$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkRect2D$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueryPoolCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueryPoolCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineCacheCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineCacheCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSemaphoreCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFenceCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name": "kotlin.reflect.jvm.internal.ReflectionFactoryImpl", + "allDeclaredConstructors":true +}, +{ + "name": "kotlin.KotlinVersion", + "allPublicMethods": true, + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true +}, +{ + "name": "kotlin.KotlinVersion[]" +}, +{ + "name": "kotlin.KotlinVersion$Companion" +}, +{ + "name": "kotlin.KotlinVersion$Companion[]" +}, +{ + "name": "graphics.scenery.backends.vulkan.HeadlessSwapchain", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.backends.vulkan.SwingSwapchain", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.backends.RenderConfig", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.backends.RendertargetConfig", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.backends.RenderpassConfig", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.backends.RendertargetBinding", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.utils.JsonDeserialisers$FloatPairDeserializer", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.utils.JsonDeserialisers$VREyeDeserializer", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.utils.JsonDeserialisers$VectorDeserializer", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name": "graphics.scenery.utils.JsonDeserialisers$BindingDeserializer", + "allDeclaredFields":true, + "allDeclaredMethods":true, + "allDeclaredConstructors":true, + "allDeclaredClasses":true +}, +{ + "name":"[F" +}, +{ + "name":"[Lcom.fasterxml.jackson.databind.deser.Deserializers;" +}, +{ + "name":"[Lcom.fasterxml.jackson.databind.deser.KeyDeserializers;" +}, +{ + "name":"[Lcom.fasterxml.jackson.databind.deser.ValueInstantiators;" +}, +{ + "name":"[Lcom.fasterxml.jackson.databind.ser.Serializers;" +}, +{ + "name":"com.apple.laf.AquaKeyBindings", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.apple.laf.AquaLookAndFeel", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.apple.laf.AquaMnemonicHandler$AltProcessor", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.apple.laf.AquaPanelUI", + "methods":[ + {"name":"","parameterTypes":[] }, + {"name":"createUI","parameterTypes":["javax.swing.JComponent"] } + ] +}, +{ + "name":"com.apple.laf.AquaRootPaneUI", + "methods":[ + {"name":"","parameterTypes":[] }, + {"name":"createUI","parameterTypes":["javax.swing.JComponent"] } + ] +}, +{ + "name":"com.fasterxml.jackson.databind.ext.Java7HandlersImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"com.fasterxml.jackson.databind.ext.Java7SupportImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"graphics.scenery.Blending" +}, +{ + "name":"graphics.scenery.tests.examples.basic.TexturedCubeExample" +}, + { + "name":"graphics.scenery.PointLight" +}, +{ + "name":"graphics.scenery.Blending$BlendFactor", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"graphics.scenery.Blending$BlendOp", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"graphics.scenery.Hub" +}, +{ + "name":"graphics.scenery.backends.RenderConfig", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["java.lang.String","boolean","java.lang.String","boolean","java.util.Map","java.util.LinkedHashMap","java.util.Map","int","kotlin.jvm.internal.DefaultConstructorMarker"] }] +}, +{ + "name":"graphics.scenery.backends.RenderOrder", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"graphics.scenery.backends.RenderingQuality", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"graphics.scenery.backends.RenderpassConfig", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[{"name":"","parameterTypes":["graphics.scenery.backends.RenderpassType","boolean","boolean","boolean","boolean","graphics.scenery.backends.RenderOrder","boolean","graphics.scenery.Blending$BlendOp","graphics.scenery.Blending$BlendOp","graphics.scenery.Blending$BlendFactor","graphics.scenery.Blending$BlendFactor","graphics.scenery.Blending$BlendFactor","graphics.scenery.Blending$BlendFactor","java.util.List","java.util.List","graphics.scenery.backends.RendertargetBinding","java.util.Map","kotlin.Pair","kotlin.Pair","kotlin.Pair","org.joml.Vector4f","float","int","int","kotlin.jvm.internal.DefaultConstructorMarker"] }] +}, +{ + "name":"graphics.scenery.backends.RenderpassType", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"graphics.scenery.backends.RendertargetBinding" +}, +{ + "name":"graphics.scenery.backends.RendertargetConfig", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true, + "queryAllDeclaredConstructors":true, + "methods":[ + {"name":"","parameterTypes":["kotlin.Pair","java.util.Map"] }, + {"name":"","parameterTypes":["kotlin.Pair","java.util.Map","int","kotlin.jvm.internal.DefaultConstructorMarker"] } + ] +}, +{ + "name":"graphics.scenery.backends.SceneryWindow" +}, +{ + "name":"graphics.scenery.backends.TargetFormat", + "allDeclaredFields":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"graphics.scenery.backends.vulkan.Swapchain" +}, +{ + "name":"graphics.scenery.backends.vulkan.SwingSwapchain", + "fields":[{"name":"Companion"}], + "methods":[{"name":"","parameterTypes":["graphics.scenery.backends.vulkan.VulkanDevice","org.lwjgl.vulkan.VkQueue","graphics.scenery.backends.vulkan.VulkanRenderer$CommandPools","graphics.scenery.backends.RenderConfig","boolean","boolean","boolean","int","kotlin.jvm.internal.DefaultConstructorMarker"] }], + "queriedMethods":[{"name":"","parameterTypes":["graphics.scenery.backends.vulkan.VulkanDevice","org.lwjgl.vulkan.VkQueue","graphics.scenery.backends.vulkan.VulkanRenderer$CommandPools","graphics.scenery.backends.RenderConfig","boolean","boolean","boolean"] }] +}, +{ + "name":"graphics.scenery.backends.vulkan.SwingSwapchain$Companion" +}, +{ + "name":"graphics.scenery.backends.vulkan.VulkanDevice" +}, +{ + "name":"graphics.scenery.backends.vulkan.VulkanRenderer" +}, +{ + "name":"graphics.scenery.backends.vulkan.VulkanRenderer$CommandPools" +}, +{ + "name":"graphics.scenery.backends.vulkan.VulkanRenderer$SwapchainRecreator" +}, +{ + "name":"graphics.scenery.backends.vulkan.VulkanSwapchain" +}, +{ + "name":"graphics.scenery.backends.vulkan.VulkanSwapchain$ColorFormatAndSpace" +}, +{ + "name":"graphics.scenery.utils.JsonDeserialisers$BindingDeserializer", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"graphics.scenery.utils.JsonDeserialisers$FloatPairDeserializer", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"graphics.scenery.utils.JsonDeserialisers$VREyeDeserializer", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"graphics.scenery.utils.JsonDeserialisers$VectorDeserializer", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"graphics.scenery.utils.SceneryPanel" +}, +{ + "name":"java.awt.SequencedEvent" +}, +{ + "name":"java.awt.SystemColor", + "fields":[ + {"name":"activeCaption"}, + {"name":"activeCaptionBorder"}, + {"name":"activeCaptionText"}, + {"name":"control"}, + {"name":"controlDkShadow"}, + {"name":"controlHighlight"}, + {"name":"controlLtHighlight"}, + {"name":"controlShadow"}, + {"name":"controlText"}, + {"name":"desktop"}, + {"name":"inactiveCaption"}, + {"name":"inactiveCaptionBorder"}, + {"name":"inactiveCaptionText"}, + {"name":"info"}, + {"name":"infoText"}, + {"name":"menu"}, + {"name":"menuText"}, + {"name":"scrollbar"}, + {"name":"text"}, + {"name":"textHighlight"}, + {"name":"textHighlightText"}, + {"name":"textInactiveText"}, + {"name":"textText"}, + {"name":"window"}, + {"name":"windowBorder"}, + {"name":"windowText"} + ] +}, +{ + "name":"java.awt.Toolkit", + "fields":[{"name":"eventListener"}] +}, +{ + "name":"java.awt.event.KeyEvent", + "fields":[ + {"name":"VK_CONTEXT_MENU"}, + {"name":"VK_F10"} + ] +}, +{ + "name":"java.io.ObjectInputStream" +}, +{ + "name":"java.io.Serializable", + "allDeclaredFields":true, + "allDeclaredClasses":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"java.lang.AutoCloseable", + "allDeclaredFields":true, + "allDeclaredClasses":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"java.lang.Class" +}, +{ + "name":"java.lang.ClassValue" +}, +{ + "name":"java.lang.Comparable", + "allDeclaredFields":true, + "allDeclaredClasses":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"java.lang.Enum", + "allDeclaredFields":true, + "allDeclaredClasses":true, + "queryAllDeclaredMethods":true +}, +{ + "name":"java.lang.Object" +}, +{ + "name":"java.lang.String" +}, +{ + "name":"java.lang.reflect.Executable", + "methods":[{"name":"getParameters","parameterTypes":[] }] +}, +{ + "name":"java.lang.reflect.Method" +}, +{ + "name":"java.lang.reflect.Parameter", + "methods":[{"name":"getName","parameterTypes":[] }] +}, +{ + "name":"java.nio.Buffer", + "allDeclaredFields":true +}, +{ + "name":"java.nio.ByteBuffer", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectByteBuffer", + "allDeclaredFields":true, + "unsafeAllocated":true +}, +{ + "name":"java.nio.DirectCharBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectDoubleBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.DirectFloatBufferU", + "allDeclaredFields":true, + "unsafeAllocated":true +}, +{ + "name":"java.nio.DirectIntBufferU", + "allDeclaredFields":true, + "unsafeAllocated":true +}, +{ + "name":"java.nio.DirectLongBufferU", + "allDeclaredFields":true, + "unsafeAllocated":true +}, +{ + "name":"java.nio.DirectShortBufferU", + "allDeclaredFields":true +}, +{ + "name":"java.nio.IntBuffer" +}, +{ + "name":"java.nio.LongBuffer" +}, +{ + "name":"java.nio.MappedByteBuffer", + "allDeclaredFields":true +}, +{ + "name":"java.security.MessageDigestSpi" +}, +{ + "name":"java.security.SecureRandomParameters" +}, +{ + "name":"java.sql.Date" +}, +{ + "name":"java.sql.Timestamp" +}, +{ + "name":"java.util.ArrayList" +}, +{ + "name":"java.util.LinkedHashMap" +}, +{ + "name":"java.util.List" +}, +{ + "name":"java.util.Map" +}, +{ + "name":"java.util.Queue" +}, +{ + "name":"java.util.concurrent.ScheduledThreadPoolExecutor", + "queriedMethods":[{"name":"setRemoveOnCancelPolicy","parameterTypes":["boolean"] }] +}, +{ + "name":"javax.imageio.spi.ImageReaderSpi" +}, +{ + "name":"javax.imageio.spi.ImageReaderWriterSpi", + "queriedMethods":[ + {"name":"getFileSuffixes","parameterTypes":[] }, + {"name":"getFormatNames","parameterTypes":[] }, + {"name":"getMIMETypes","parameterTypes":[] } + ] +}, +{ + "name":"javax.imageio.spi.ImageWriterSpi" +}, +{ + "name":"javax.swing.JFrame" +}, +{ + "name":"kotlin.Metadata", + "queryAllDeclaredMethods":true, + "methods":[ + {"name":"bv","parameterTypes":[] }, + {"name":"d1","parameterTypes":[] }, + {"name":"d2","parameterTypes":[] }, + {"name":"k","parameterTypes":[] }, + {"name":"mv","parameterTypes":[] }, + {"name":"pn","parameterTypes":[] }, + {"name":"xi","parameterTypes":[] }, + {"name":"xs","parameterTypes":[] } + ] +}, +{ + "name":"kotlin.Pair" +}, +{ + "name":"kotlin.Unit" +}, +{ + "name":"kotlin.enums.EnumEntries" +}, +{ + "name":"kotlin.jvm.internal.DefaultConstructorMarker" +}, +{ + "name":"kotlin.reflect.jvm.internal.ReflectionFactoryImpl", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"kotlin.reflect.jvm.internal.impl.resolve.scopes.DescriptorKindFilter", + "allPublicFields":true +}, +{ + "name":"org.joml.Matrix2f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m10"}, + {"name":"m11"} + ] +}, +{ + "name":"org.joml.Matrix3d", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"} + ] +}, +{ + "name":"org.joml.Matrix3f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"} + ] +}, +{ + "name":"org.joml.Matrix3x2f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m20"}, + {"name":"m21"} + ] +}, +{ + "name":"org.joml.Matrix4d", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m03"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m13"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m23"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"}, + {"name":"m33"} + ] +}, +{ + "name":"org.joml.Matrix4f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m03"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m13"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m23"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"}, + {"name":"m33"} + ] +}, +{ + "name":"org.joml.Matrix4x3f", + "fields":[ + {"name":"m00"}, + {"name":"m01"}, + {"name":"m02"}, + {"name":"m10"}, + {"name":"m11"}, + {"name":"m12"}, + {"name":"m20"}, + {"name":"m21"}, + {"name":"m22"}, + {"name":"m30"}, + {"name":"m31"}, + {"name":"m32"} + ] +}, +{ + "name":"org.joml.Quaternionf", + "fields":[ + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector2f", + "fields":[ + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.joml.Vector2i", + "fields":[ + {"name":"x"}, + {"name":"y"} + ] +}, +{ + "name":"org.joml.Vector3f", + "fields":[ + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector3i", + "fields":[ + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector4f", + "fields":[ + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.joml.Vector4i", + "fields":[ + {"name":"w"}, + {"name":"x"}, + {"name":"y"}, + {"name":"z"} + ] +}, +{ + "name":"org.lwjgl.PointerBuffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.glfw.GLFWWindowSizeCallback" +}, +{ + "name":"org.lwjgl.system.CallbackI", + "queriedMethods":[{"name":"callback","parameterTypes":["long","long"] }] +}, +{ + "name":"org.lwjgl.system.CustomBuffer", + "fields":[ + {"name":"capacity"}, + {"name":"container"}, + {"name":"limit"}, + {"name":"mark"}, + {"name":"position"} + ] +}, +{ + "name":"org.lwjgl.system.Pointer$Default", + "fields":[{"name":"address"}] +}, +{ + "name":"org.lwjgl.system.Struct", + "fields":[{"name":"container"}] +}, +{ + "name":"org.lwjgl.system.jawt.JAWT", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.system.jawt.JAWTDrawingSurface", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.system.jawt.JAWTDrawingSurfaceInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.system.jawt.JAWTRectangle", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.system.jemalloc.JEmallocAllocator", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"org.lwjgl.system.libffi.FFICIF", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.system.libffi.FFIClosure", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.system.libffi.FFIType", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkApplicationInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkBufferImageCopy$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandBufferBeginInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkCommandPoolCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorBufferInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorPoolSize$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutBinding$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDescriptorSetLayoutCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkDeviceQueueCreateInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtensionProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkExtent3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkFormatProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageBlit$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageMemoryBarrier$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceLayers", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageSubresourceRange", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkImageViewCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkInstanceCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryAllocateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryRequirements", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMemoryType", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkMetalSurfaceCreateInfoEXT", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkOffset3D", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceFeatures", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceMemoryProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPhysicalDeviceProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPipelineVertexInputStateCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkPresentInfoKHR", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueue" +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkQueueFamilyProperties$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSamplerCreateInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkSubmitInfo$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputAttributeDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkVertexInputBindingDescription$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet", + "unsafeAllocated":true +}, +{ + "name":"org.lwjgl.vulkan.VkWriteDescriptorSet$Buffer", + "unsafeAllocated":true +}, +{ + "name":"org.slf4j.Logger" +}, +{ + "name":"sun.awt.CGraphicsEnvironment", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.OpaqueCopyAnyToArgb", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.OpaqueCopyArgbToAny", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.SetDrawLineANY", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.SetDrawPathANY", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.SetDrawPolygonsANY", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.SetDrawRectANY", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.SetFillPathANY", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.SetFillRectANY", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.loops.SetFillSpansANY", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.java2d.marlin.DMarlinRenderingEngine", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.lwawt.macosx.LWCToolkit", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.misc.Unsafe", + "allDeclaredFields":true, + "queriedMethods":[ + {"name":"getLong","parameterTypes":["java.lang.Object","long"] }, + {"name":"putLong","parameterTypes":["java.lang.Object","long","long"] } + ] +}, +{ + "name":"sun.security.provider.NativePRNG", + "methods":[{"name":"","parameterTypes":[] }] +}, +{ + "name":"sun.security.provider.SHA", + "methods":[{"name":"","parameterTypes":[] }] +} +] diff --git a/src/main/resources/META-INF/native-image/resource-config.json b/src/main/resources/META-INF/native-image/resource-config.json new file mode 100644 index 000000000..74a508bd8 --- /dev/null +++ b/src/main/resources/META-INF/native-image/resource-config.json @@ -0,0 +1,51 @@ +{ + "resources":{ + "includes":[ + { + "pattern":".*\\.yml$" + }, + { + "pattern":".*\\.spv$" + }, + { + "pattern":".*\\.frag$" + }, + { + "pattern":".*\\.vert$" + }, + { + "pattern":".*\\.comp$" + }, + { + "pattern":".*\\.geom$" + }, + { + "pattern":"\\Qgraphics/scenery/backends/shaders/HBAO.frag\\E" + }, + { + "pattern":"\\Qkotlin/kotlin.kotlin_builtins\\E" + }, + { + "pattern":"\\Qkotlin/collections/collections.kotlin_builtins\\E" + }, + { + "pattern":"\\Qkotlin/ranges/ranges.kotlin_builtins\\E" + }, + { + "pattern":"\\Qkotlin/annotation/annotation.kotlin_builtins\\E" + }, + { + "pattern":"\\Qkotlin/reflect/reflect.kotlin_builtins\\E" + }, + { + "pattern":"\\Qkotlin/internal/internal.kotlin_builtins\\E" + }, + { + "pattern":"\\Qkotlin/coroutines/coroutines.kotlin_builtins\\E" + }, + {"pattern":"META-INF/.*.kotlin_module$"}, + {"pattern":"META-INF/services/.*"}, + {"pattern":".*.kotlin_builtins"} + ]}, + "bundles":[] +} diff --git a/src/main/resources/META-INF/native-image/serialization-config.json b/src/main/resources/META-INF/native-image/serialization-config.json new file mode 100644 index 000000000..0d4f101c7 --- /dev/null +++ b/src/main/resources/META-INF/native-image/serialization-config.json @@ -0,0 +1,2 @@ +[ +] diff --git a/src/test/java/graphics/scenery/tests/examples/basic/TexturedCubeJavaExample.java b/src/test/java/graphics/scenery/tests/examples/basic/TexturedCubeJavaExample.java index 68723f2d5..d9fd89ed2 100644 --- a/src/test/java/graphics/scenery/tests/examples/basic/TexturedCubeJavaExample.java +++ b/src/test/java/graphics/scenery/tests/examples/basic/TexturedCubeJavaExample.java @@ -11,10 +11,10 @@ * Created by kharrington on 7/6/16. */ class TexturedCubeJavaExample extends SceneryBase { - public static void main(String[] args) { - final SceneryBase app = new TexturedCubeJavaExample(); - app.main(); - } +// public static void main(String[] args) { +// final SceneryBase app = new TexturedCubeJavaExample(); +// app.main(); +// } public TexturedCubeJavaExample() { super("TexturedCubeJavaExample", 512, 512, true); diff --git a/src/test/kotlin/graphics/scenery/tests/examples/advanced/CycleRenderQualityExample.kt b/src/test/kotlin/graphics/scenery/tests/examples/advanced/CycleRenderQualityExample.kt index df02d9850..14b2f722c 100644 --- a/src/test/kotlin/graphics/scenery/tests/examples/advanced/CycleRenderQualityExample.kt +++ b/src/test/kotlin/graphics/scenery/tests/examples/advanced/CycleRenderQualityExample.kt @@ -6,6 +6,7 @@ import graphics.scenery.backends.RenderConfigReader import graphics.scenery.backends.Renderer import graphics.scenery.numerics.Random import graphics.scenery.attribute.material.Material +import graphics.scenery.backends.RenderingQuality import graphics.scenery.utils.extensions.minus import kotlin.concurrent.thread import kotlin.math.floor @@ -100,8 +101,8 @@ class CycleRenderQualityExample: SceneryBase("CycleRenderQualityExample", window waitForSceneInitialisation() while(running) { - renderer?.setRenderingQuality(RenderConfigReader.RenderingQuality.values().get(quality)) - quality = (quality + 1) % RenderConfigReader.RenderingQuality.values().size + renderer?.setRenderingQuality(RenderingQuality.values().get(quality)) + quality = (quality + 1) % RenderingQuality.values().size Thread.sleep(2500) } } diff --git a/src/test/kotlin/graphics/scenery/tests/unit/backends/FauxRenderer.kt b/src/test/kotlin/graphics/scenery/tests/unit/backends/FauxRenderer.kt index 0c6d1cc16..133f463de 100644 --- a/src/test/kotlin/graphics/scenery/tests/unit/backends/FauxRenderer.kt +++ b/src/test/kotlin/graphics/scenery/tests/unit/backends/FauxRenderer.kt @@ -3,6 +3,7 @@ package graphics.scenery.tests.unit.backends import graphics.scenery.* import graphics.scenery.backends.RenderConfigReader import graphics.scenery.backends.Renderer +import graphics.scenery.backends.RenderingQuality import graphics.scenery.backends.SceneryWindow import graphics.scenery.utils.SceneryPanel @@ -65,9 +66,9 @@ class FauxRenderer(override var hub: Hub?, var scene: Scene, preparedWindow: Sce /** * Sets the rendering quality, if the loaded renderer config file supports it. * - * @param[quality] The [RenderConfigReader.RenderingQuality] to be set. + * @param[quality] The [RenderingQuality] to be set. */ - override fun setRenderingQuality(quality: RenderConfigReader.RenderingQuality) { + override fun setRenderingQuality(quality: RenderingQuality) { logger.info("Set rendering quality to $quality") } @@ -83,7 +84,7 @@ class FauxRenderer(override var hub: Hub?, var scene: Scene, preparedWindow: Sce override val managesRenderLoop: Boolean = false /** Total time taken for the last frame (in milliseconds). */ override var lastFrameTime: Float = 1.0f - /** The file to read the [RenderConfigReader.RenderConfig] from. */ + /** The file to read the [RenderConfig] from. */ override var renderConfigFile: String = "" private var recordMovie = false