98 lines
2.8 KiB
Java
98 lines
2.8 KiB
Java
package com.danitheskunk.skunkworks.backends.gl;
|
|
|
|
import com.danitheskunk.skunkworks.Vec2f;
|
|
import com.danitheskunk.skunkworks.Vec3f;
|
|
import com.danitheskunk.skunkworks.gfx.threedee.BaseRenderContext3D;
|
|
import com.danitheskunk.skunkworks.gfx.threedee.Mesh;
|
|
|
|
import static org.lwjgl.opengl.GL46.*;
|
|
|
|
public class RenderContext3D extends BaseRenderContext3D {
|
|
private final int texCoordIndex;
|
|
private TextureAtlas textureAtlas;
|
|
|
|
public RenderContext3D(int texCoordIndex) {
|
|
this.texCoordIndex = texCoordIndex;
|
|
}
|
|
|
|
|
|
@Override
|
|
public void renderMesh(Mesh mesh) {
|
|
var tex = (Texture) mesh.getTexture();
|
|
|
|
var texArea = tex.getTexArea();
|
|
var texOff = Vec2f.div(texArea.getPos(), textureAtlas.getSize());
|
|
var texMult = Vec2f.div(texArea.getSize(), textureAtlas.getSize());
|
|
|
|
|
|
glBegin(GL_TRIANGLES);
|
|
for(int i = 0; i < mesh.getTriangleCount(); ++i) {
|
|
var tri = mesh.getTriangle(i);
|
|
var p1 = mesh.getVertex(tri.getX());
|
|
var p2 = mesh.getVertex(tri.getY());
|
|
var p3 = mesh.getVertex(tri.getZ());
|
|
var t1 = mesh.getUV(tri.getX());
|
|
var t2 = mesh.getUV(tri.getY());
|
|
var t3 = mesh.getUV(tri.getZ());
|
|
|
|
assert (t1.getX() >= 0.0 && t1.getX() <= 1.0);
|
|
assert (t1.getY() >= 0.0 && t1.getY() <= 1.0);
|
|
assert (t2.getX() >= 0.0 && t2.getX() <= 1.0);
|
|
assert (t2.getY() >= 0.0 && t2.getY() <= 1.0);
|
|
assert (t3.getX() >= 0.0 && t3.getX() <= 1.0);
|
|
assert (t3.getY() >= 0.0 && t3.getY() <= 1.0);
|
|
|
|
/*
|
|
t1 = new Vec2f(t1.getX() * 0.8 + 0.1,
|
|
t1.getY() * 0.8 + 0.1
|
|
);
|
|
t2 = new Vec2f(t2.getX() * 0.8 + 0.1,
|
|
t2.getY() * 0.8 + 0.1
|
|
);
|
|
t3 = new Vec2f(t3.getX() * 0.8 + 0.1,
|
|
t3.getY() * 0.8 + 0.1
|
|
);
|
|
*/
|
|
|
|
//t1 = new Vec2f(t1.getX(), 1.0 - t1.getY());
|
|
//t2 = new Vec2f(t2.getX(), 1.0 - t2.getY());
|
|
//t3 = new Vec2f(t3.getX(), 1.0 - t3.getY());
|
|
t1 = Vec2f.add(texOff, Vec2f.mul(texMult, t1));
|
|
t2 = Vec2f.add(texOff, Vec2f.mul(texMult, t2));
|
|
t3 = Vec2f.add(texOff, Vec2f.mul(texMult, t3));
|
|
|
|
|
|
|
|
|
|
glVertexAttrib2d(texCoordIndex, t1.getX(), t1.getY());
|
|
glVertex3d(p1.getX(), p1.getY() - 0.5, p1.getZ() + 0.5);
|
|
glVertexAttrib2d(texCoordIndex, t2.getX(), t2.getY());
|
|
glVertex3d(p2.getX(), p2.getY() - 0.5, p2.getZ() + 0.5);
|
|
glVertexAttrib2d(texCoordIndex, t3.getX(), t3.getY());
|
|
glVertex3d(p3.getX(), p3.getY() - 0.5, p3.getZ() + 0.5);
|
|
}
|
|
glEnd();
|
|
}
|
|
|
|
@Override
|
|
public void renderTriangle(Vec3f p1, Vec3f p2, Vec3f p3) {
|
|
glBegin(GL_TRIANGLES);
|
|
|
|
glVertex3d(p1.getX(), p1.getY(), p1.getZ());
|
|
glVertex3d(p2.getX(), p2.getY(), p2.getZ());
|
|
glVertex3d(p3.getX(), p3.getY(), p3.getZ());
|
|
|
|
/*
|
|
glVertex3f((float) p1.getX(), (float) p1.getY(), (float) p1.getZ());
|
|
glVertex3f((float) p2.getX(), (float) p2.getY(), (float) p2.getZ());
|
|
glVertex3f((float) p3.getX(), (float) p3.getY(), (float) p3.getZ());
|
|
*/
|
|
|
|
glEnd();
|
|
}
|
|
|
|
public void setTextureAtlas(TextureAtlas textureAtlas) {
|
|
this.textureAtlas = textureAtlas;
|
|
}
|
|
}
|