Skip to content

Commit

Permalink
Add a scene overview
Browse files Browse the repository at this point in the history
  • Loading branch information
ultraq committed Mar 5, 2024
1 parent 1e5d276 commit 47d0596
Show file tree
Hide file tree
Showing 20 changed files with 315 additions and 216 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,9 @@ import nz.net.ultraq.redhorizon.engine.graphics.GraphicsConfiguration
import nz.net.ultraq.redhorizon.engine.graphics.GraphicsSystem
import nz.net.ultraq.redhorizon.engine.graphics.WindowCreatedEvent
import nz.net.ultraq.redhorizon.engine.graphics.WindowMaximizedEvent
import nz.net.ultraq.redhorizon.engine.graphics.imgui.DebugOverlayRenderPass
import nz.net.ultraq.redhorizon.engine.graphics.imgui.DebugOverlay
import nz.net.ultraq.redhorizon.engine.graphics.imgui.GuiEvent
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.OverlayRenderPass
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.ImGuiElement
import nz.net.ultraq.redhorizon.engine.input.InputEventStream
import nz.net.ultraq.redhorizon.engine.input.KeyEvent
import nz.net.ultraq.redhorizon.engine.scenegraph.Scene
Expand Down Expand Up @@ -89,22 +89,22 @@ class Application implements EventTarget {
* input into the application.
*/
Application addGraphicsSystem(GraphicsConfiguration config = new GraphicsConfiguration(),
OverlayRenderPass... overlayRenderPasses) {
ImGuiElement... overlayRenderPasses) {

var graphicsSystem = new GraphicsSystem(windowTitle, inputEventStream, config)
graphicsSystem.on(WindowCreatedEvent) { event ->
inputEventStream.addInputSource(event.window)
}
graphicsSystem.on(SystemReadyEvent) { event ->
var audioSystem = engine.systems.find { it instanceof AudioSystem } as AudioSystem
graphicsSystem.renderPipeline.addOverlayPass(
new DebugOverlayRenderPass(config.debug)
graphicsSystem.renderPipeline.addImGuiElement(
new DebugOverlay(config.debug)
.addAudioRenderer(audioSystem.renderer)
.addGraphicsRenderer(graphicsSystem.renderer)
.toggleWith(inputEventStream, GLFW_KEY_D)
)
overlayRenderPasses.each { overlayRenderPass ->
graphicsSystem.renderPipeline.addOverlayPass(overlayRenderPass)
graphicsSystem.renderPipeline.addImGuiElement(overlayRenderPass)
}
}
graphicsSystem.relay(WindowMaximizedEvent, this)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,8 @@ import nz.net.ultraq.redhorizon.engine.audio.SourceDeletedEvent

import org.joml.Vector3f
import org.lwjgl.openal.AL
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import static org.lwjgl.openal.AL10.*
import static org.lwjgl.system.MemoryStack.stackPush

Expand All @@ -41,6 +43,8 @@ import java.nio.ByteBuffer
*/
class OpenALRenderer implements AudioRenderer {

private static Logger logger = LoggerFactory.getLogger(OpenALRenderer)

private final AudioConfiguration config

/**
Expand All @@ -67,7 +71,7 @@ class OpenALRenderer implements AudioRenderer {
var errorCode = AL.getFields().find { field ->
return Modifier.isStatic(field.modifiers) && field.name.startsWith("AL_") && field.getInt(null) == error
}
throw new Exception("OpenAL error: ${errorCode}")
logger.error("OpenAL error: ${errorCode}")
}
return result
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@

package nz.net.ultraq.redhorizon.engine.graphics

import nz.net.ultraq.redhorizon.engine.graphics.pipeline.ImGuiElement
import nz.net.ultraq.redhorizon.filetypes.ColourFormat

import org.joml.Vector2f
Expand Down Expand Up @@ -59,6 +60,11 @@ interface GraphicsRequests {
static record SpriteSheetRequest(int width, int height, ColourFormat format, ByteBuffer[] data) implements Request<SpriteSheet> {
}

/**
* Add an ImGui element to the render pipeline.
*/
void addImGuiElement(ImGuiElement overlayRenderPass)

/**
* Request the creation or retrieval of the given resource type from the
* graphics system, which will eventually be resolved in the returned
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import nz.net.ultraq.redhorizon.engine.graphics.opengl.OpenGLCamera
import nz.net.ultraq.redhorizon.engine.graphics.opengl.OpenGLContext
import nz.net.ultraq.redhorizon.engine.graphics.opengl.OpenGLRenderer
import nz.net.ultraq.redhorizon.engine.graphics.opengl.OpenGLWindow
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.ImGuiElement
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.RenderPipeline
import nz.net.ultraq.redhorizon.engine.input.InputEventStream
import nz.net.ultraq.redhorizon.engine.input.KeyEvent
Expand Down Expand Up @@ -74,6 +75,12 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests {
this.config = config
}

@Override
void addImGuiElement(ImGuiElement overlayRenderPass) {

renderPipeline.addImGuiElement(overlayRenderPass)
}

/**
* Implementation of double-click being used to toggle between windowed and
* full screen modes. This isn't natively supported in GLFW given platform
Expand All @@ -98,7 +105,7 @@ class GraphicsSystem extends EngineSystem implements GraphicsRequests {
scene.graphicsRequestHandler = this
scene.window = window
scene.camera = camera
scene.gameMenu = imGuiLayer.gameMenu
scene.gameMenu = imGuiLayer.mainMenu
renderPipeline.scene = scene
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,9 @@ package nz.net.ultraq.redhorizon.engine.graphics
*
* @author Emanuel Rabina
*/
abstract class GameMenu {
interface MainMenu {

final List<MenuItem> additionalOptionsItems = []

/**
* Add a menu item that'll appear in the Options menu.
*/
void addOptionsItem(MenuItem menuItem) {

additionalOptionsItems << menuItem
}
final List<MenuItem> optionsMenu = []

/**
* An additional menu item and the behaviour behind it.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,13 +16,21 @@

package nz.net.ultraq.redhorizon.engine.graphics

import nz.net.ultraq.redhorizon.engine.input.InputEventStream
import nz.net.ultraq.redhorizon.engine.input.KeyEvent

import static org.lwjgl.glfw.GLFW.GLFW_PRESS

import groovy.transform.stc.ClosureParams
import groovy.transform.stc.SimpleType

/**
* The trait for something being in an enabled/disabled state, with operations
* to flip between the 2.
*
* @author Emanuel Rabina
*/
trait Switch {
trait Switch<T extends Switch> {

boolean enabled

Expand All @@ -33,4 +41,22 @@ trait Switch {

enabled = !enabled
}

/**
* Toggle the state of this render pass with the given key.
*/
T toggleWith(InputEventStream inputEventStream, int key,
@ClosureParams(value = SimpleType, options = 'nz.net.ultraq.redhorizon.engine.graphics.pipeline.RenderPass') Closure closure = null) {

inputEventStream.on(KeyEvent) { event ->
if (event.action == GLFW_PRESS && event.key == key) {
toggle()
if (closure) {
closure(this)
}
}
}

return (T)this
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,7 @@
package nz.net.ultraq.redhorizon.engine.graphics.imgui

import nz.net.ultraq.redhorizon.engine.graphics.Framebuffer
import nz.net.ultraq.redhorizon.engine.graphics.GraphicsRenderer
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.OverlayRenderPass
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.ImGuiElement
import nz.net.ultraq.redhorizon.engine.input.ControlAddedEvent
import nz.net.ultraq.redhorizon.engine.input.ControlRemovedEvent
import nz.net.ultraq.redhorizon.engine.input.InputEventStream
Expand All @@ -34,13 +33,13 @@ import java.util.concurrent.CopyOnWriteArrayList
*
* @author Emanuel Rabina
*/
class ControlsOverlayRenderPass implements OverlayRenderPass {
class ControlsOverlay implements ImGuiElement<ControlsOverlay> {

private List<String> controls = new CopyOnWriteArrayList<>()
private int controlsWindowSizeX = 350
private int controlsWindowSizeY = 200

ControlsOverlayRenderPass(InputEventStream inputEventStream) {
ControlsOverlay(InputEventStream inputEventStream) {

enabled = true

Expand All @@ -53,7 +52,7 @@ class ControlsOverlayRenderPass implements OverlayRenderPass {
}

@Override
void render(GraphicsRenderer renderer, Framebuffer sceneFramebufferResult) {
void render(int dockspaceId, Framebuffer sceneFramebufferResult) {

if (!controls) {
return
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ import nz.net.ultraq.redhorizon.engine.graphics.MeshCreatedEvent
import nz.net.ultraq.redhorizon.engine.graphics.MeshDeletedEvent
import nz.net.ultraq.redhorizon.engine.graphics.TextureCreatedEvent
import nz.net.ultraq.redhorizon.engine.graphics.TextureDeletedEvent
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.OverlayRenderPass
import nz.net.ultraq.redhorizon.engine.graphics.pipeline.ImGuiElement

import imgui.ImGui
import imgui.type.ImBoolean
Expand All @@ -47,7 +47,7 @@ import java.util.concurrent.atomic.AtomicInteger
*
* @author Emanuel Rabina
*/
class DebugOverlayRenderPass implements OverlayRenderPass {
class DebugOverlay implements ImGuiElement<DebugOverlay> {

private static final int MAX_DEBUG_LINES = 10

Expand All @@ -68,7 +68,7 @@ class DebugOverlayRenderPass implements OverlayRenderPass {
* adding the renderers via the {@code add*} methods to get stats on their
* use.
*/
DebugOverlayRenderPass(boolean enabled) {
DebugOverlay(boolean enabled) {

ImGuiLoggingAppender.instance.on(ImGuiLogEvent) { event ->
if (event.persistentKey) {
Expand All @@ -87,7 +87,7 @@ class DebugOverlayRenderPass implements OverlayRenderPass {
/**
* Add the audio renderer to get stats on audio sources, buffers, etc.
*/
DebugOverlayRenderPass addAudioRenderer(AudioRenderer audioRenderer) {
DebugOverlay addAudioRenderer(AudioRenderer audioRenderer) {

audioRenderer.on(AudioRendererEvent) { event ->
switch (event) {
Expand All @@ -103,7 +103,7 @@ class DebugOverlayRenderPass implements OverlayRenderPass {
/**
* Add the graphics renderer to get status on draws, textures, etc.
*/
DebugOverlayRenderPass addGraphicsRenderer(GraphicsRenderer graphicsRenderer) {
DebugOverlay addGraphicsRenderer(GraphicsRenderer graphicsRenderer) {

graphicsRenderer.on(GraphicsRendererEvent) { event ->
switch (event) {
Expand All @@ -120,9 +120,9 @@ class DebugOverlayRenderPass implements OverlayRenderPass {
}

@Override
void render(GraphicsRenderer renderer, Framebuffer sceneFramebufferResult) {
void render(int dockspaceId, Framebuffer sceneFramebufferResult) {

def viewport = ImGui.getMainViewport()
var viewport = ImGui.getMainViewport()
ImGui.setNextWindowBgAlpha(0.4f)
ImGui.setNextWindowPos(viewport.sizeX - debugWindowSizeX - 10 as float, viewport.workPosY + 10 as float)

Expand Down
Loading

0 comments on commit 47d0596

Please sign in to comment.