From 07ced1f4307692ae5f816c943a6f7c0289a55d52 Mon Sep 17 00:00:00 2001 From: DaniTheSkunk Date: Tue, 20 Sep 2022 06:58:36 +0200 Subject: [PATCH] basic font rendering implemented, and alpha blending --- EGA8x14.png | Bin 0 -> 4214 bytes Test.java | 5 +++- .../skunkworks/BaseRenderContext.java | 24 ++++++++++++++++++ .../skunkworks/GLRenderContext.java | 2 +- com/danitheskunk/skunkworks/GLWindow.java | 2 ++ .../skunkworks/IRenderContext.java | 1 + 6 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 EGA8x14.png create mode 100644 com/danitheskunk/skunkworks/BaseRenderContext.java diff --git a/EGA8x14.png b/EGA8x14.png new file mode 100644 index 0000000000000000000000000000000000000000..5da0d32b1ce87d4ceb87a9ca50201bbdf04e4fff GIT binary patch literal 4214 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 M07*qoM6N<$f(^zqUH||9 literal 0 HcmV?d00001 diff --git a/Test.java b/Test.java index ec78b78..e269725 100644 --- a/Test.java +++ b/Test.java @@ -7,9 +7,10 @@ public class Test { var img = engine.loadImage("C:\\Users\\dani\\Videos\\Screenshot 2022-06-25 17-00-59.png"); var tex2 = window.loadTexture("C:\\art\\pixel stuff.png"); var tileset = window.loadTextureArray("C:\\stream\\coding\\rlc\\tilemap.png", new Vec2i(16, 16)); + var font = window.loadFontTileset("EGA8x14.png"); //img.drawImage(img2, Vec2i.ZERO); var tex = window.loadTexture(img); - window.setDebug(true); + window.setDebug(false); while(!window.shouldClose()) { window.tick(); @@ -27,6 +28,8 @@ public class Test { new Recti(new Vec2i(400, 400), new Vec2i(16, 16)), tileset.get(0x30) ); + + renderContext.drawString(new Vec2i(100, 100), "hello world mew", font); window.renderFinish(renderContext); } } diff --git a/com/danitheskunk/skunkworks/BaseRenderContext.java b/com/danitheskunk/skunkworks/BaseRenderContext.java new file mode 100644 index 0000000..aff9d46 --- /dev/null +++ b/com/danitheskunk/skunkworks/BaseRenderContext.java @@ -0,0 +1,24 @@ +package com.danitheskunk.skunkworks; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.IntBuffer; + +abstract class BaseRenderContext implements IRenderContext { + public void drawString(Vec2i pos, String string, IFont font) { + int x = pos.getX(); + int y = pos.getY(); + IntBuffer buf; + try { + buf = ByteBuffer.wrap(string.getBytes("UTF-32")).asIntBuffer(); + } catch(UnsupportedEncodingException e) { + throw new RuntimeException(e); + } + for(int i = 0; i < string.length(); ++i) { + int ch = buf.get(i); + var tex = font.getTexture(ch); + drawTextureRectangle(new Recti(new Vec2i(x, y), tex.getSize()), tex); + x += font.getCharWidth(ch); + } + } +} diff --git a/com/danitheskunk/skunkworks/GLRenderContext.java b/com/danitheskunk/skunkworks/GLRenderContext.java index 88269ee..f3e5d30 100644 --- a/com/danitheskunk/skunkworks/GLRenderContext.java +++ b/com/danitheskunk/skunkworks/GLRenderContext.java @@ -2,7 +2,7 @@ package com.danitheskunk.skunkworks; import static org.lwjgl.opengl.GL11.*; -class GLRenderContext implements IRenderContext{ +class GLRenderContext extends BaseRenderContext implements IRenderContext{ private final GLTextureAtlas atlas; public GLRenderContext(GLTextureAtlas atlas) { diff --git a/com/danitheskunk/skunkworks/GLWindow.java b/com/danitheskunk/skunkworks/GLWindow.java index 1228bd4..5bdc803 100644 --- a/com/danitheskunk/skunkworks/GLWindow.java +++ b/com/danitheskunk/skunkworks/GLWindow.java @@ -41,6 +41,8 @@ class GLWindow extends BaseWindow { glOrtho(0.0f, size.getX(), size.getY(), 0.0f, 0.0f, 1.0f); glEnable(GL_COLOR); glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_BLEND); textureAtlas = new GLTextureAtlas(); renderContext = new GLRenderContext(textureAtlas); diff --git a/com/danitheskunk/skunkworks/IRenderContext.java b/com/danitheskunk/skunkworks/IRenderContext.java index 3aede41..93a7286 100644 --- a/com/danitheskunk/skunkworks/IRenderContext.java +++ b/com/danitheskunk/skunkworks/IRenderContext.java @@ -2,6 +2,7 @@ package com.danitheskunk.skunkworks; public interface IRenderContext { void drawRectangle(Recti rect, Color color); + void drawString(Vec2i pos, String string, IFont font); void drawTextureRectangle(Recti rect, ITexture texture); void drawTextureRectangle(Recti rect, ITexture texture, Color color); }