Create working GUI scaffolding

This commit is contained in:
2021-03-10 20:18:03 +01:00
parent 454c8278f3
commit 153e3d30fb
16 changed files with 239 additions and 11 deletions

View File

@@ -2,6 +2,7 @@ package com.bartlomiejpluta.base.api.game.context;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.entity.Entity;
import com.bartlomiejpluta.base.api.game.gui.GUI;
import com.bartlomiejpluta.base.api.game.image.Image;
import com.bartlomiejpluta.base.api.game.screen.Screen;
@@ -15,4 +16,6 @@ public interface Context {
Entity createEntity(String entitySetUid);
Image getImage(String imageUid);
GUI newGUI();
}

View File

@@ -0,0 +1,23 @@
package com.bartlomiejpluta.base.api.game.gui;
public interface Color {
float getRed();
float getGreen();
float getBlue();
float getAlpha();
void setRed(float value);
void setGreen(float value);
void setBlue(float value);
void setAlpha(float value);
void setColor(float red, float green, float blue);
void setColor(float red, float green, float blue, float alpha);
}

View File

@@ -1,7 +1,16 @@
package com.bartlomiejpluta.base.api.game.gui;
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
import com.bartlomiejpluta.base.api.internal.gc.Disposable;
import com.bartlomiejpluta.base.api.internal.render.Renderable;
public interface GUI extends Updatable, Renderable {
public interface GUI extends Renderable, Disposable {
Widget getRoot();
void setRoot(Widget root);
void drawRectangle(float x, float y, float w, float h);
void fillColor(Color color);
Color createColor(float red, float green, float blue, float alpha);
}

View File

@@ -0,0 +1,9 @@
package com.bartlomiejpluta.base.api.game.gui;
import com.bartlomiejpluta.base.api.game.screen.Screen;
public interface Widget {
Widget getParent();
void draw(Screen screen, GUI gui);
}

View File

@@ -23,4 +23,6 @@ public interface Screen {
void update();
void clear(float r, float g, float b, float alpha);
void restoreState();
}

View File

@@ -48,6 +48,8 @@ public class DefaultRenderer implements Renderer {
renderable.render(screen, camera, shaderManager);
shaderManager.detachCurrentShader();
screen.restoreState();
}
private void clear() {

View File

@@ -1,4 +1,4 @@
package com.bartlomiejpluta.base.engine.gui.font.asset;
package com.bartlomiejpluta.base.engine.gui.asset;
import com.bartlomiejpluta.base.engine.common.asset.Asset;
import lombok.NonNull;

View File

@@ -1,6 +1,6 @@
package com.bartlomiejpluta.base.engine.gui.font.manager;
package com.bartlomiejpluta.base.engine.gui.manager;
import com.bartlomiejpluta.base.engine.gui.font.asset.FontAsset;
import com.bartlomiejpluta.base.engine.gui.asset.FontAsset;
import com.bartlomiejpluta.base.engine.world.tileset.asset.TileSetAsset;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

View File

@@ -1,7 +1,7 @@
package com.bartlomiejpluta.base.engine.gui.font.manager;
package com.bartlomiejpluta.base.engine.gui.manager;
import com.bartlomiejpluta.base.engine.common.manager.AssetManager;
import com.bartlomiejpluta.base.engine.gui.font.asset.FontAsset;
import com.bartlomiejpluta.base.engine.gui.asset.FontAsset;
public interface FontManager extends AssetManager<FontAsset, Integer> {
}

View File

@@ -0,0 +1,78 @@
package com.bartlomiejpluta.base.engine.gui.render;
import com.bartlomiejpluta.base.api.game.gui.Color;
import com.bartlomiejpluta.base.api.internal.gc.Disposable;
import org.lwjgl.BufferUtils;
import org.lwjgl.nanovg.NVGColor;
public class NanoVGColorAdapter extends NVGColor implements Color, Disposable {
public NanoVGColorAdapter(float red, float green, float blue, float alpha) {
super(BufferUtils.createByteBuffer(SIZEOF));
r(red);
g(green);
b(blue);
a(alpha);
}
@Override
public float getRed() {
return r();
}
@Override
public float getGreen() {
return g();
}
@Override
public float getBlue() {
return b();
}
@Override
public float getAlpha() {
return a();
}
@Override
public void setRed(float value) {
r(value);
}
@Override
public void setGreen(float value) {
g(value);
}
@Override
public void setBlue(float value) {
b(value);
}
@Override
public void setAlpha(float value) {
a(value);
}
@Override
public void setColor(float red, float green, float blue) {
r(red);
g(green);
b(blue);
}
@Override
public void setColor(float red, float green, float blue, float alpha) {
r(red);
g(green);
b(blue);
a(alpha);
}
@Override
public void dispose() {
free();
}
}

View File

@@ -0,0 +1,70 @@
package com.bartlomiejpluta.base.engine.gui.render;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.gui.Color;
import com.bartlomiejpluta.base.api.game.gui.GUI;
import com.bartlomiejpluta.base.api.game.gui.Widget;
import com.bartlomiejpluta.base.api.game.screen.Screen;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.error.AppException;
import lombok.Getter;
import lombok.Setter;
import java.util.LinkedList;
import java.util.List;
import static org.lwjgl.nanovg.NanoVG.*;
import static org.lwjgl.nanovg.NanoVGGL3.*;
import static org.lwjgl.system.MemoryUtil.NULL;
@Getter
public class NanoVGGUI implements GUI {
private long context;
@Setter
private Widget root;
private final List<NanoVGColorAdapter> createdColors = new LinkedList<>();
public void init(Screen screen) {
context = nvgCreate(NVG_ANTIALIAS | NVG_STENCIL_STROKES);
if (context == NULL) {
throw new AppException("Could not onCreate NanoVG");
}
}
@Override
public void render(Screen screen, Camera camera, ShaderManager shaderManager) {
nvgBeginFrame(context, screen.getWidth(), screen.getHeight(), 1);
if (root != null) {
root.draw(screen, this);
}
nvgEndFrame(context);
}
@Override
public void drawRectangle(float x, float y, float w, float h) {
nvgRect(context, x, y, w, h);
}
@Override
public void fillColor(Color color) {
nvgFillColor(context, (NanoVGColorAdapter) color);
nvgFill(context);
}
@Override
public Color createColor(float red, float green, float blue, float alpha) {
var color = new NanoVGColorAdapter(red, green, blue, alpha);
createdColors.add(color);
return color;
}
@Override
public void dispose() {
createdColors.forEach(NanoVGColorAdapter::dispose);
}
}

View File

@@ -1,6 +1,6 @@
package com.bartlomiejpluta.base.engine.project.loader;
import com.bartlomiejpluta.base.engine.gui.font.manager.FontManager;
import com.bartlomiejpluta.base.engine.gui.manager.FontManager;
import com.bartlomiejpluta.base.engine.project.config.ProjectConfiguration;
import com.bartlomiejpluta.base.engine.project.model.Project;
import com.bartlomiejpluta.base.engine.project.serial.ProjectDeserializer;

View File

@@ -1,6 +1,6 @@
package com.bartlomiejpluta.base.engine.project.model;
import com.bartlomiejpluta.base.engine.gui.font.asset.FontAsset;
import com.bartlomiejpluta.base.engine.gui.asset.FontAsset;
import com.bartlomiejpluta.base.engine.world.entity.asset.EntitySetAsset;
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
import com.bartlomiejpluta.base.engine.world.map.asset.GameMapAsset;

View File

@@ -3,12 +3,15 @@ package com.bartlomiejpluta.base.engine.project.model;
import com.bartlomiejpluta.base.api.game.camera.Camera;
import com.bartlomiejpluta.base.api.game.context.Context;
import com.bartlomiejpluta.base.api.game.entity.Entity;
import com.bartlomiejpluta.base.api.game.gui.GUI;
import com.bartlomiejpluta.base.api.game.image.Image;
import com.bartlomiejpluta.base.api.game.map.handler.MapHandler;
import com.bartlomiejpluta.base.api.game.screen.Screen;
import com.bartlomiejpluta.base.api.internal.gc.Cleanable;
import com.bartlomiejpluta.base.api.internal.logic.Updatable;
import com.bartlomiejpluta.base.api.internal.render.Renderable;
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
import com.bartlomiejpluta.base.engine.gui.render.NanoVGGUI;
import com.bartlomiejpluta.base.engine.project.loader.ClassLoader;
import com.bartlomiejpluta.base.engine.world.entity.manager.EntityManager;
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
@@ -20,9 +23,12 @@ import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.LinkedList;
import java.util.List;
@Component
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
public class RenderableContext implements Context, Updatable, Renderable {
public class RenderableContext implements Context, Updatable, Renderable, Cleanable {
private final EntityManager entityManager;
private final ImageManager imageManager;
private final MapManager mapManager;
@@ -33,6 +39,8 @@ public class RenderableContext implements Context, Updatable, Renderable {
private DefaultGameMap map;
private MapHandler mapHandler;
private final List<GUI> guis = new LinkedList<>();
@Getter
private Camera camera;
@@ -60,6 +68,14 @@ public class RenderableContext implements Context, Updatable, Renderable {
return imageManager.loadObject(imageUid);
}
@Override
public GUI newGUI() {
var gui = new NanoVGGUI();
guis.add(gui);
gui.init(screen);
return gui;
}
public void input(Screen screen) {
if (mapHandler != null) {
mapHandler.input(screen);
@@ -83,8 +99,17 @@ public class RenderableContext implements Context, Updatable, Renderable {
map.render(screen, camera, shaderManager);
}
for (var gui : guis) {
gui.render(screen, camera, shaderManager);
}
if (mapHandler != null) {
mapHandler.postRender(screen);
}
}
@Override
public void cleanUp() {
guis.forEach(GUI::dispose);
}
}

View File

@@ -1,6 +1,6 @@
package com.bartlomiejpluta.base.engine.project.serial;
import com.bartlomiejpluta.base.engine.gui.font.asset.FontAsset;
import com.bartlomiejpluta.base.engine.gui.asset.FontAsset;
import com.bartlomiejpluta.base.engine.project.model.Project;
import com.bartlomiejpluta.base.engine.world.entity.asset.EntitySetAsset;
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;

View File

@@ -135,6 +135,13 @@ public class GLFWScreen implements Screen {
glClearColor(r, g, b, alpha);
}
@Override
public void restoreState() {
glEnable(GL_STENCIL_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}
@Override
public boolean shouldClose() {
return glfwWindowShouldClose(windowHandle);