mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-18 03:44:54 -04:00
mesh: allow creation of vertex buffer async
This introduces a new state and function for it: `FINISHED`
This commit is contained in:
parent
b8088c18b9
commit
a37d6d69a7
@ -15,7 +15,6 @@ package de.bixilon.minosoft.gui.rendering.gui.gui
|
|||||||
|
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2d
|
import de.bixilon.kotlinglm.vec2.Vec2d
|
||||||
import de.bixilon.kotlinglm.vec2.Vec2i
|
import de.bixilon.kotlinglm.vec2.Vec2i
|
||||||
import de.bixilon.kutil.time.TimeUtil
|
|
||||||
import de.bixilon.kutil.time.TimeUtil.millis
|
import de.bixilon.kutil.time.TimeUtil.millis
|
||||||
import de.bixilon.minosoft.config.key.KeyCodes
|
import de.bixilon.minosoft.config.key.KeyCodes
|
||||||
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
import de.bixilon.minosoft.gui.rendering.RenderWindow
|
||||||
@ -31,6 +30,7 @@ import de.bixilon.minosoft.gui.rendering.input.count.MouseClickCounter
|
|||||||
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
|
import de.bixilon.minosoft.gui.rendering.renderer.drawable.AsyncDrawable
|
||||||
import de.bixilon.minosoft.gui.rendering.renderer.drawable.BaseDrawable
|
import de.bixilon.minosoft.gui.rendering.renderer.drawable.BaseDrawable
|
||||||
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
|
import de.bixilon.minosoft.gui.rendering.renderer.drawable.Drawable
|
||||||
|
import de.bixilon.minosoft.gui.rendering.system.opengl.MemoryLeakException
|
||||||
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
|
import de.bixilon.minosoft.gui.rendering.system.window.KeyChangeTypes
|
||||||
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
|
import de.bixilon.minosoft.gui.rendering.util.mesh.Mesh
|
||||||
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
|
import de.bixilon.minosoft.gui.rendering.util.vec.vec2.Vec2iUtil.EMPTY
|
||||||
@ -42,6 +42,7 @@ open class GUIMeshElement<T : Element>(
|
|||||||
override val guiRenderer: GUIRenderer = element.guiRenderer
|
override val guiRenderer: GUIRenderer = element.guiRenderer
|
||||||
override val renderWindow: RenderWindow = guiRenderer.renderWindow
|
override val renderWindow: RenderWindow = guiRenderer.renderWindow
|
||||||
private val clickCounter = MouseClickCounter()
|
private val clickCounter = MouseClickCounter()
|
||||||
|
private var _mesh: GUIMesh? = null
|
||||||
var mesh: GUIMesh = GUIMesh(renderWindow, guiRenderer.matrix, FloatListUtil.direct(1000))
|
var mesh: GUIMesh = GUIMesh(renderWindow, guiRenderer.matrix, FloatListUtil.direct(1000))
|
||||||
override val skipDraw: Boolean
|
override val skipDraw: Boolean
|
||||||
get() = if (element is BaseDrawable) element.skipDraw else false
|
get() = if (element is BaseDrawable) element.skipDraw else false
|
||||||
@ -88,28 +89,35 @@ open class GUIMeshElement<T : Element>(
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected fun createNewMesh() {
|
protected fun createNewMesh() {
|
||||||
val mesh = this.mesh
|
if (this._mesh != null) throw MemoryLeakException("Mesh to unload is already set!")
|
||||||
if (mesh.state == Mesh.MeshStates.LOADED) {
|
this._mesh = this.mesh
|
||||||
mesh.unload()
|
|
||||||
}
|
|
||||||
this.mesh = GUIMesh(renderWindow, guiRenderer.matrix, mesh.data)
|
this.mesh = GUIMesh(renderWindow, guiRenderer.matrix, mesh.data)
|
||||||
|
this.mesh.finish()
|
||||||
}
|
}
|
||||||
|
|
||||||
fun prepare() = Unit
|
fun prepare() = Unit
|
||||||
|
|
||||||
fun prepareAsync(offset: Vec2i) {
|
fun prepareAsync(offset: Vec2i) {
|
||||||
element.render(offset, mesh, null)
|
element.render(offset, mesh, null)
|
||||||
}
|
|
||||||
|
|
||||||
open fun postPrepare() {
|
|
||||||
val revision = element.cache.revision
|
val revision = element.cache.revision
|
||||||
if (revision != lastRevision) {
|
if (revision != lastRevision) {
|
||||||
createNewMesh()
|
createNewMesh()
|
||||||
this.mesh.load()
|
|
||||||
this.lastRevision = revision
|
this.lastRevision = revision
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
open fun postPrepare() {
|
||||||
|
val _mesh = this._mesh ?: return
|
||||||
|
if (_mesh.state == Mesh.MeshStates.LOADED) {
|
||||||
|
_mesh.unload()
|
||||||
|
}
|
||||||
|
this._mesh = null
|
||||||
|
|
||||||
|
if (this.mesh.state == Mesh.MeshStates.FINISHED) {
|
||||||
|
mesh.load()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
open fun prepareAsync() {
|
open fun prepareAsync() {
|
||||||
prepareAsync(Vec2i.EMPTY)
|
prepareAsync(Vec2i.EMPTY)
|
||||||
}
|
}
|
||||||
|
@ -55,11 +55,21 @@ abstract class Mesh(
|
|||||||
protected set
|
protected set
|
||||||
|
|
||||||
|
|
||||||
fun load() {
|
fun finish() {
|
||||||
|
if (state != MeshStates.PREPARING) throw IllegalStateException("Mesh is not preparing: $state")
|
||||||
val data = this.data
|
val data = this.data
|
||||||
buffer = renderWindow.renderSystem.createVertexBuffer(struct, data, primitiveType)
|
buffer = renderWindow.renderSystem.createVertexBuffer(struct, data, primitiveType)
|
||||||
|
state = MeshStates.FINISHED
|
||||||
|
}
|
||||||
|
|
||||||
|
fun load() {
|
||||||
|
if (state == MeshStates.PREPARING) {
|
||||||
|
finish()
|
||||||
|
}
|
||||||
|
if (state != MeshStates.FINISHED) throw IllegalStateException("Mesh is not finished: $state")
|
||||||
buffer.init()
|
buffer.init()
|
||||||
if (clearOnLoad) {
|
if (clearOnLoad) {
|
||||||
|
val data = data
|
||||||
if (data is DirectArrayFloatList) {
|
if (data is DirectArrayFloatList) {
|
||||||
data.unload()
|
data.unload()
|
||||||
}
|
}
|
||||||
@ -126,6 +136,7 @@ abstract class Mesh(
|
|||||||
|
|
||||||
enum class MeshStates {
|
enum class MeshStates {
|
||||||
PREPARING,
|
PREPARING,
|
||||||
|
FINISHED,
|
||||||
LOADED,
|
LOADED,
|
||||||
UNLOADED,
|
UNLOADED,
|
||||||
}
|
}
|
||||||
|
@ -484,6 +484,7 @@ class WorldRenderer(
|
|||||||
if (mesh.clearEmpty() == 0) {
|
if (mesh.clearEmpty() == 0) {
|
||||||
return queueItemUnload(item)
|
return queueItemUnload(item)
|
||||||
}
|
}
|
||||||
|
mesh.finish()
|
||||||
item.mesh = mesh
|
item.mesh = mesh
|
||||||
meshesToLoadLock.lock()
|
meshesToLoadLock.lock()
|
||||||
if (meshesToLoadSet.remove(item)) {
|
if (meshesToLoadSet.remove(item)) {
|
||||||
|
@ -38,6 +38,13 @@ class WorldMesh(
|
|||||||
val minPosition = Vec3i(16)
|
val minPosition = Vec3i(16)
|
||||||
val maxPosition = Vec3i(0)
|
val maxPosition = Vec3i(0)
|
||||||
|
|
||||||
|
fun finish() {
|
||||||
|
this.opaqueMesh?.finish()
|
||||||
|
this.translucentMesh?.finish()
|
||||||
|
this.transparentMesh?.finish()
|
||||||
|
this.textMesh?.finish()
|
||||||
|
}
|
||||||
|
|
||||||
@Synchronized
|
@Synchronized
|
||||||
fun load() {
|
fun load() {
|
||||||
this.opaqueMesh?.load()
|
this.opaqueMesh?.load()
|
||||||
|
Loading…
x
Reference in New Issue
Block a user