Create working GUI scaffolding
This commit is contained in:
@@ -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.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.game.entity.Entity;
|
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.image.Image;
|
||||||
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
||||||
|
|
||||||
@@ -15,4 +16,6 @@ public interface Context {
|
|||||||
Entity createEntity(String entitySetUid);
|
Entity createEntity(String entitySetUid);
|
||||||
|
|
||||||
Image getImage(String imageUid);
|
Image getImage(String imageUid);
|
||||||
|
|
||||||
|
GUI newGUI();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -1,7 +1,16 @@
|
|||||||
package com.bartlomiejpluta.base.api.game.gui;
|
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;
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
@@ -23,4 +23,6 @@ public interface Screen {
|
|||||||
void update();
|
void update();
|
||||||
|
|
||||||
void clear(float r, float g, float b, float alpha);
|
void clear(float r, float g, float b, float alpha);
|
||||||
|
|
||||||
|
void restoreState();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -48,6 +48,8 @@ public class DefaultRenderer implements Renderer {
|
|||||||
renderable.render(screen, camera, shaderManager);
|
renderable.render(screen, camera, shaderManager);
|
||||||
|
|
||||||
shaderManager.detachCurrentShader();
|
shaderManager.detachCurrentShader();
|
||||||
|
|
||||||
|
screen.restoreState();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void clear() {
|
private void clear() {
|
||||||
|
|||||||
@@ -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 com.bartlomiejpluta.base.engine.common.asset.Asset;
|
||||||
import lombok.NonNull;
|
import lombok.NonNull;
|
||||||
@@ -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 com.bartlomiejpluta.base.engine.world.tileset.asset.TileSetAsset;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -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.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> {
|
public interface FontManager extends AssetManager<FontAsset, Integer> {
|
||||||
}
|
}
|
||||||
@@ -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();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.bartlomiejpluta.base.engine.project.loader;
|
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.config.ProjectConfiguration;
|
||||||
import com.bartlomiejpluta.base.engine.project.model.Project;
|
import com.bartlomiejpluta.base.engine.project.model.Project;
|
||||||
import com.bartlomiejpluta.base.engine.project.serial.ProjectDeserializer;
|
import com.bartlomiejpluta.base.engine.project.serial.ProjectDeserializer;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.bartlomiejpluta.base.engine.project.model;
|
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.entity.asset.EntitySetAsset;
|
||||||
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
|
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
|
||||||
import com.bartlomiejpluta.base.engine.world.map.asset.GameMapAsset;
|
import com.bartlomiejpluta.base.engine.world.map.asset.GameMapAsset;
|
||||||
|
|||||||
@@ -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.camera.Camera;
|
||||||
import com.bartlomiejpluta.base.api.game.context.Context;
|
import com.bartlomiejpluta.base.api.game.context.Context;
|
||||||
import com.bartlomiejpluta.base.api.game.entity.Entity;
|
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.image.Image;
|
||||||
import com.bartlomiejpluta.base.api.game.map.handler.MapHandler;
|
import com.bartlomiejpluta.base.api.game.map.handler.MapHandler;
|
||||||
import com.bartlomiejpluta.base.api.game.screen.Screen;
|
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.logic.Updatable;
|
||||||
import com.bartlomiejpluta.base.api.internal.render.Renderable;
|
import com.bartlomiejpluta.base.api.internal.render.Renderable;
|
||||||
import com.bartlomiejpluta.base.api.internal.render.ShaderManager;
|
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.project.loader.ClassLoader;
|
||||||
import com.bartlomiejpluta.base.engine.world.entity.manager.EntityManager;
|
import com.bartlomiejpluta.base.engine.world.entity.manager.EntityManager;
|
||||||
import com.bartlomiejpluta.base.engine.world.image.manager.ImageManager;
|
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.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
@RequiredArgsConstructor(onConstructor = @__(@Autowired))
|
||||||
public class RenderableContext implements Context, Updatable, Renderable {
|
public class RenderableContext implements Context, Updatable, Renderable, Cleanable {
|
||||||
private final EntityManager entityManager;
|
private final EntityManager entityManager;
|
||||||
private final ImageManager imageManager;
|
private final ImageManager imageManager;
|
||||||
private final MapManager mapManager;
|
private final MapManager mapManager;
|
||||||
@@ -33,6 +39,8 @@ public class RenderableContext implements Context, Updatable, Renderable {
|
|||||||
private DefaultGameMap map;
|
private DefaultGameMap map;
|
||||||
private MapHandler mapHandler;
|
private MapHandler mapHandler;
|
||||||
|
|
||||||
|
private final List<GUI> guis = new LinkedList<>();
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
private Camera camera;
|
private Camera camera;
|
||||||
|
|
||||||
@@ -60,6 +68,14 @@ public class RenderableContext implements Context, Updatable, Renderable {
|
|||||||
return imageManager.loadObject(imageUid);
|
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) {
|
public void input(Screen screen) {
|
||||||
if (mapHandler != null) {
|
if (mapHandler != null) {
|
||||||
mapHandler.input(screen);
|
mapHandler.input(screen);
|
||||||
@@ -83,8 +99,17 @@ public class RenderableContext implements Context, Updatable, Renderable {
|
|||||||
map.render(screen, camera, shaderManager);
|
map.render(screen, camera, shaderManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (var gui : guis) {
|
||||||
|
gui.render(screen, camera, shaderManager);
|
||||||
|
}
|
||||||
|
|
||||||
if (mapHandler != null) {
|
if (mapHandler != null) {
|
||||||
mapHandler.postRender(screen);
|
mapHandler.postRender(screen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void cleanUp() {
|
||||||
|
guis.forEach(GUI::dispose);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.bartlomiejpluta.base.engine.project.serial;
|
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.project.model.Project;
|
||||||
import com.bartlomiejpluta.base.engine.world.entity.asset.EntitySetAsset;
|
import com.bartlomiejpluta.base.engine.world.entity.asset.EntitySetAsset;
|
||||||
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
|
import com.bartlomiejpluta.base.engine.world.image.asset.ImageAsset;
|
||||||
|
|||||||
@@ -135,6 +135,13 @@ public class GLFWScreen implements Screen {
|
|||||||
glClearColor(r, g, b, alpha);
|
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
|
@Override
|
||||||
public boolean shouldClose() {
|
public boolean shouldClose() {
|
||||||
return glfwWindowShouldClose(windowHandle);
|
return glfwWindowShouldClose(windowHandle);
|
||||||
|
|||||||
Reference in New Issue
Block a user