skunkworks/com/danitheskunk/skunkworks/backends/gl/RenderContext.java

133 lines
4.2 KiB
Java

package com.danitheskunk.skunkworks.backends.gl;
import com.danitheskunk.skunkworks.*;
import com.danitheskunk.skunkworks.gfx.*;
import static org.lwjgl.opengl.GL46.*;
class RenderContext extends BaseRenderContext implements IRenderContext {
private final TextureAtlas atlas;
private final int texCoordIndex;
private final int texOffsetIndex;
private final int texSizeIndex;
public RenderContext(TextureAtlas atlas, int texCoordIndex, int texOffsetIndex, int texSizeIndex) {
this.atlas = atlas;
this.texCoordIndex = texCoordIndex;
this.texOffsetIndex = texOffsetIndex;
this.texSizeIndex = texSizeIndex;
}
@Override
public void drawNineSlice(NineSlice slice, Recti rect) {
var centerWidth = Math.min(0, rect.getWidth() - slice.getLeft().getSize().getX() - slice.getRight().getSize().getX());
var centerHeight = Math.min(0, rect.getHeight() - slice.getTop().getSize().getY() - slice.getBottom().getSize().getY());
var pos = rect.getPos();
var size = rect.getSize();
drawTexture(pos, slice.getTopLeft());
}
@Override
public void drawRectangle(Recti rect, Color color) {
var tl = rect.getTopLeft();
var tr = rect.getTopRight();
var bl = rect.getBottomLeft();
var br = rect.getBottomRight();
//todo: make work with enabled textures
glColor4f(
color.getR() / 255.0f,
color.getG() / 255.0f,
color.getB() / 255.0f,
color.getA() / 255.0f
);
//counterclockwise triangles
glVertex2i(bl.getX(), bl.getY());
glVertex2i(tr.getX(), tr.getY());
glVertex2i(tl.getX(), tl.getY());
glVertex2i(tr.getX(), tr.getY());
glVertex2i(bl.getX(), bl.getY());
glVertex2i(br.getX(), bl.getY());
}
@Override
public void drawTexture(Vec2i pos, ITexture texture) {
drawTextureRectangle(new Recti(pos, texture.getSize()), texture, true);
}
@Override
public void drawTexture(Vec2i pos, ITexture texture, Color color) {
drawTextureRectangle(new Recti(pos, texture.getSize()), texture, color, true);
}
@Override
public void drawTextureRectangle(Recti rect, ITexture texture, boolean repeat) {
drawTextureRectangle(rect, texture, Color.WHITE, repeat);
}
@Override
public void drawTextureRectangle(Recti rect, ITexture texture, Color color, boolean repeat) {
var tex = (Texture)texture;
var tl = rect.getTopLeft();
var tr = rect.getTopRight();
var bl = rect.getBottomLeft();
var br = rect.getBottomRight();
/*
var ttl = Vec2i.divf(tex.getTexArea().getTopLeft(), atlas.getSize());
var ttr = Vec2i.divf(tex.getTexArea().getTopRight(), atlas.getSize());
var tbl = Vec2i.divf(tex.getTexArea().getBottomLeft(), atlas.getSize());
var tbr = Vec2i.divf(tex.getTexArea().getBottomRight(), atlas.getSize());
*/
var topleft = tex.getTexArea().getTopLeft();
var size = repeat ? tex.getSize() : rect.getSize();
/*var ttl = Vec2i.ZERO;
var ttr = Vec2i.sub(tex.getTexArea().getTopRight(), topleft);
var tbl = Vec2i.sub(tex.getTexArea().getBottomLeft(), topleft);
var tbr = Vec2i.sub(tex.getTexArea().getBottomRight(), topleft);
*/
var ttl = Vec2i.ZERO;
var ttr = new Vec2i(rect.getWidth(), 0);
var tbl = new Vec2i(0, rect.getHeight());
var tbr = new Vec2i(rect.getWidth(), rect.getHeight());
if(!repeat) {
ttr = Vec2i.sub(tex.getTexArea().getTopRight(), topleft);
tbl = Vec2i.sub(tex.getTexArea().getBottomLeft(), topleft);
tbr = Vec2i.sub(tex.getTexArea().getBottomRight(), topleft);
}
glColor4f(
color.getR() / 255.0f,
color.getG() / 255.0f,
color.getB() / 255.0f,
color.getA() / 255.0f
);
glUniform2i(texOffsetIndex, topleft.getX(), topleft.getY());
glUniform2i(texSizeIndex, size.getX(), size.getY());
glBegin(GL_TRIANGLES);
//counterclockwise triangles
glVertexAttribI2i(texCoordIndex, tbl.getX(), tbl.getY());
glVertex2i(bl.getX(), bl.getY());
glVertexAttribI2i(texCoordIndex, ttr.getX(), ttr.getY());
glVertex2i(tr.getX(), tr.getY());
glVertexAttribI2i(texCoordIndex, ttl.getX(), ttl.getY());
glVertex2i(tl.getX(), tl.getY());
glVertexAttribI2i(texCoordIndex, ttr.getX(), ttr.getY());
glVertex2i(tr.getX(), tr.getY());
glVertexAttribI2i(texCoordIndex, tbl.getX(), tbl.getY());
glVertex2i(bl.getX(), bl.getY());
glVertexAttribI2i(texCoordIndex, tbr.getX(), tbr.getY());
glVertex2i(br.getX(), bl.getY());
glEnd();
}
}