Парочка коллбеков

This commit is contained in:
DBotThePony 2022-02-04 12:46:12 +07:00
parent de15212824
commit 10fdc34ffd
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 70 additions and 48 deletions

View File

@ -8,6 +8,7 @@ import org.lwjgl.glfw.GLFWErrorCallback
import org.lwjgl.opengl.GL46.* import org.lwjgl.opengl.GL46.*
import org.lwjgl.system.MemoryStack.stackPush import org.lwjgl.system.MemoryStack.stackPush
import org.lwjgl.system.MemoryUtil.NULL import org.lwjgl.system.MemoryUtil.NULL
import ru.dbotthepony.kstarbound.defs.TileDefinition
import ru.dbotthepony.kstarbound.gl.* import ru.dbotthepony.kstarbound.gl.*
import ru.dbotthepony.kstarbound.math.* import ru.dbotthepony.kstarbound.math.*
import ru.dbotthepony.kstarbound.render.* import ru.dbotthepony.kstarbound.render.*
@ -126,7 +127,10 @@ private fun init() {
glfwShowWindow(window) glfwShowWindow(window)
startupTextList.add("Initialized GLFW window")
Starbound.addFilePath(File("./unpacked_assets/")) Starbound.addFilePath(File("./unpacked_assets/"))
Starbound.initializeGame { finished, replaceStatus, status -> Starbound.initializeGame { finished, replaceStatus, status ->
if (replaceStatus) { if (replaceStatus) {
if (startupTextList.isEmpty()) { if (startupTextList.isEmpty()) {
@ -139,7 +143,7 @@ private fun init() {
} }
if (finished) { if (finished) {
finishStartupRendering = System.currentTimeMillis() + 2000L finishStartupRendering = System.currentTimeMillis() + 4000L
} }
} }
} }
@ -151,6 +155,7 @@ val framesPerSecond get() = 1.0 / frameRenderTime
private fun loop() { private fun loop() {
val state = GLStateTracker() val state = GLStateTracker()
startupTextList.add("Initialized OpenGL context")
camera = Camera() camera = Camera()
// Set the clear color // Set the clear color
@ -159,56 +164,52 @@ private fun loop() {
state.blend = true state.blend = true
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
/*val chunk = Starbound.world.getOrMakeChunk(Vector2i(2, 2)) var chunkRenderer: ChunkRenderer? = null
var x = 0 Starbound.onInitialize {
var y = 0 val chunk = Starbound.world.getOrMakeChunk(Vector2i(2, 2))
for (tile in Starbound.tilesAccess.values) { var x = 0
chunk.background[x, y + 1] = tile var y = 0
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
if (x >= 32) { for (tile in Starbound.tilesAccess.values) {
x = 0 chunk.background[x, y + 1] = tile
y += 2 chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
chunk.background[x++, y] = tile
chunk.background[x, y + 1] = tile
if (x >= 32) {
x = 0
y += 2
}
} }
val tile = Starbound.getTileDefinition("glass")
for (x in 0 .. 32) {
for (y in 0 .. 32) {
chunk.foreground[x, y] = tile
}
}
for (x in 4 .. 8) {
for (y in 4 .. 8) {
chunk.foreground[x, y] = null as TileDefinition?
}
}
chunkRenderer = ChunkRenderer(state, chunk, Starbound.world)
chunkRenderer!!.tesselateStatic()
chunkRenderer!!.uploadStatic()
} }
val tile = Starbound.getTileDefinition("glass")
for (x in 0 .. 32) {
for (y in 0 .. 32) {
chunk.foreground[x, y] = tile
}
}
for (x in 4 .. 8) {
for (y in 4 .. 8) {
chunk.foreground[x, y] = null as TileDefinition?
}
}*/
/*
for (x in 0 .. 24) {
for (y in 0 .. 24) {
chunk[x, y] = Starbound.getTileDefinition("sewerpipe")
}
}
*/
//val chunkRenderer = ChunkRenderer(state, chunk, Starbound.world)
//chunkRenderer.tesselateStatic()
//chunkRenderer.uploadStatic()
val runtime = Runtime.getRuntime() val runtime = Runtime.getRuntime()
// Run the rendering loop until the user has attempted to close // Run the rendering loop until the user has attempted to close
@ -221,7 +222,7 @@ private fun loop() {
camera?.translate(state.matrixStack.last) camera?.translate(state.matrixStack.last)
state.matrixStack.push().scale(x = 20f, y = 20f).translateWithScale(0f, 0f) state.matrixStack.push().scale(x = 20f, y = 20f).translateWithScale(0f, 0f)
//chunkRenderer.render() chunkRenderer?.render()
state.matrixStack.clear(viewportMatrixGUI.toMutableMatrix().translate(z = 2f)) state.matrixStack.clear(viewportMatrixGUI.toMutableMatrix().translate(z = 2f))
@ -230,7 +231,7 @@ private fun loop() {
val thisTime = System.currentTimeMillis() val thisTime = System.currentTimeMillis()
if (!startupTextList.isEmpty() && thisTime <= finishStartupRendering) { if (startupTextList.isNotEmpty() && thisTime <= finishStartupRendering) {
var alpha = 1f var alpha = 1f
if (finishStartupRendering - thisTime < 1000L) { if (finishStartupRendering - thisTime < 1000L) {
@ -258,6 +259,7 @@ private fun loop() {
// Poll for window events. The key callback above will only be // Poll for window events. The key callback above will only be
// invoked during this call. // invoked during this call.
glfwPollEvents() glfwPollEvents()
Starbound.pollCallbacks()
frameRenderTime = glfwGetTime() - measure frameRenderTime = glfwGetTime() - measure
} }
} }

View File

@ -57,6 +57,8 @@ object Starbound {
return tiles[name] return tiles[name]
} }
private val initCallbacks = ArrayList<() -> Unit>()
fun initializeGame(callback: (finished: Boolean, replaceStatus: Boolean, status: String) -> Unit) { fun initializeGame(callback: (finished: Boolean, replaceStatus: Boolean, status: String) -> Unit) {
if (initializing) { if (initializing) {
throw IllegalStateException("Already initializing!") throw IllegalStateException("Already initializing!")
@ -80,7 +82,7 @@ object Starbound {
callback(false, true, it) callback(false, true, it)
} }
callback(false, false, "Loaded materials") callback(false, true, "Loaded materials")
initializing = false initializing = false
initialized = true initialized = true
@ -88,6 +90,24 @@ object Starbound {
}.start() }.start()
} }
fun onInitialize(callback: () -> Unit) {
if (initialized) {
callback()
} else {
initCallbacks.add(callback)
}
}
fun pollCallbacks() {
if (initialized && initCallbacks.isNotEmpty()) {
for (callback in initCallbacks) {
callback()
}
initCallbacks.clear()
}
}
private fun loadTileMaterials(callback: (String) -> Unit) { private fun loadTileMaterials(callback: (String) -> Unit) {
for (sPath in _filepath) { for (sPath in _filepath) {
val newPath = File(sPath.path, "tiles/materials") val newPath = File(sPath.path, "tiles/materials")