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.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();
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
@@ -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 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);
|
||||
|
||||
shaderManager.detachCurrentShader();
|
||||
|
||||
screen.restoreState();
|
||||
}
|
||||
|
||||
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 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 lombok.extern.slf4j.Slf4j;
|
||||
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.gui.font.asset.FontAsset;
|
||||
import com.bartlomiejpluta.base.engine.gui.asset.FontAsset;
|
||||
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user