4jcraft/Minecraft.Client/Rendering/glWrapper.cpp
2026-03-30 02:17:54 -05:00

285 lines
8.3 KiB
C++

#include "../Platform/stdafx.h"
#if !defined(__linux__)
#include "../../Minecraft.World/IO/Streams/FloatBuffer.h"
#include "../../Minecraft.World/IO/Streams/IntBuffer.h"
#include "../../Minecraft.World/IO/Streams/ByteBuffer.h"
void glViewport(int x, int y, int w, int h) {
// We don't really need anything here because minecraft doesn't current do
// anything other than the default viewport
}
void glTranslatef(float x, float y, float z) {
RenderManager.MatrixTranslate(x, y, z);
}
void glRotatef(float angle, float x, float y, float z) {
RenderManager.MatrixRotate(angle * (PI / 180.0f), x, y, z);
}
void glPopMatrix() { RenderManager.MatrixPop(); }
void glPushMatrix() { RenderManager.MatrixPush(); }
void glScalef(float x, float y, float z) { RenderManager.MatrixScale(x, y, z); }
void glMultMatrixf(float* m) { RenderManager.MatrixMult(m); }
void glMatrixMode(int type) { RenderManager.MatrixMode(type); }
void glLoadIdentity() { RenderManager.MatrixSetIdentity(); }
void gluPerspective(float fovy, float aspect, float zNear, float zFar) {
RenderManager.MatrixPerspective(fovy, aspect, zNear, zFar);
}
void glOrtho(float left, float right, float bottom, float top, float zNear,
float zFar) {
RenderManager.MatrixOrthogonal(left, right, bottom, top, zNear, zFar);
}
void glScaled(double x, double y, double z) {
RenderManager.MatrixScale((float)x, (float)y, (float)z);
}
void glGetFloat(int type, FloatBuffer* buff) {
memcpy(buff->_getDataPointer(), RenderManager.MatrixGet(type), 64);
}
void glDeleteLists(int first, int count) {
RenderManager.CBuffDelete(first, count);
}
int glGenLists(int count) { return RenderManager.CBuffCreate(count); }
void glNewList(int index, int mode) { RenderManager.CBuffStart(index); }
void glEndList(int vertexCount) { RenderManager.CBuffEnd(); }
void glCallList(int index) { RenderManager.CBuffCall(index); }
void glCallLists(IntBuffer* ib) {
for (unsigned int i = 0; i < ib->limit(); i++) {
RenderManager.CBuffCall(ib->get(i));
}
}
void glClear(int flags) { RenderManager.Clear(flags); }
void glClearColor(float r, float g, float b, float a) {
float rgba[4] = {r, g, b, a};
RenderManager.SetClearColour(rgba);
}
void Display::update() {}
void Display::swapBuffers() {}
void glBindTexture(int target, int texture) {
RenderManager.TextureBind(texture);
}
void glTexImage2D(int target, int level, int internalformat, int width,
int height, int border, int format, int type,
ByteBuffer* data) {
RenderManager.TextureData(width, height, data->getBuffer(), level);
}
void glDeleteTextures(IntBuffer* ib) {
for (unsigned int i = 0; i < ib->limit(); i++) {
RenderManager.TextureFree(ib->get(i));
}
}
// 4J Stu - I'm pretty sure this is what it should do
void glDeleteTextures(int id) { RenderManager.TextureFree(id); }
void glGenTextures(IntBuffer* ib) {
for (unsigned int i = 0; i < ib->limit(); i++) {
ib->put(RenderManager.TextureCreate());
}
}
// 4J Stu - I'm pretty sure this is what it should do
int glGenTextures() { return RenderManager.TextureCreate(); }
void glColor3f(float r, float g, float b) {
RenderManager.StateSetColour(r, g, b, 1.0f);
}
void glColor4f(float r, float g, float b, float a) {
RenderManager.StateSetColour(r, g, b, a);
}
void glDisable(int state) {
switch (state) {
case GL_TEXTURE_2D:
RenderManager.TextureBind(-1);
break;
case GL_BLEND:
RenderManager.StateSetBlendEnable(false);
break;
case GL_CULL_FACE:
RenderManager.StateSetFaceCull(false);
break;
case GL_DEPTH_TEST:
RenderManager.StateSetDepthTestEnable(false);
break;
case GL_ALPHA_TEST:
RenderManager.StateSetAlphaTestEnable(false);
break;
case GL_FOG:
RenderManager.StateSetFogEnable(false);
break;
case GL_LIGHTING:
RenderManager.StateSetLightingEnable(false);
break;
case GL_LIGHT0:
RenderManager.StateSetLightEnable(0, false);
break;
case GL_LIGHT1:
RenderManager.StateSetLightEnable(1, false);
break;
}
}
void glEnable(int state) {
switch (state) {
case GL_BLEND:
RenderManager.StateSetBlendEnable(true);
break;
case GL_CULL_FACE:
RenderManager.StateSetFaceCull(true);
break;
case GL_DEPTH_TEST:
RenderManager.StateSetDepthTestEnable(true);
break;
case GL_ALPHA_TEST:
RenderManager.StateSetAlphaTestEnable(true);
break;
case GL_FOG:
RenderManager.StateSetFogEnable(true);
break;
case GL_LIGHTING:
RenderManager.StateSetLightingEnable(true);
break;
case GL_LIGHT0:
RenderManager.StateSetLightEnable(0, true);
break;
case GL_LIGHT1:
RenderManager.StateSetLightEnable(1, true);
break;
}
}
void glDepthMask(bool enable) { RenderManager.StateSetDepthMask(enable); }
void glBlendFunc(int src, int dst) {
RenderManager.StateSetBlendFunc(src, dst);
}
void glAlphaFunc(int func, float param) {
RenderManager.StateSetAlphaFunc(func, param);
}
void glDepthFunc(int func) { RenderManager.StateSetDepthFunc(func); }
void glTexParameteri(int target, int param, int value) {
RenderManager.TextureSetParam(param, value);
}
void glPolygonOffset(float factor, float units) {
// DirectX specifies these offsets in z buffer 0 to 1 sort of range, whereas
// opengl seems to be in a 0 -> depth buffer size sort of range. The slope
// factor is quite possibly different too. Magic factor for now anyway.
const float magicFactor = 65536.0f;
RenderManager.StateSetDepthSlopeAndBias(factor / magicFactor,
units / magicFactor);
}
void glFogi(int param, int value) {
if (param == GL_FOG_MODE) {
RenderManager.StateSetFogMode(value);
}
}
void glFogf(int param, float value) {
switch (param) {
case GL_FOG_START:
RenderManager.StateSetFogNearDistance(value);
break;
case GL_FOG_END:
RenderManager.StateSetFogFarDistance(value);
break;
case GL_FOG_DENSITY:
RenderManager.StateSetFogDensity(value);
break;
}
}
void glFog(int param, FloatBuffer* values) {
if (param == GL_FOG_COLOR) {
float* data = values->_getDataPointer();
RenderManager.StateSetFogColour(data[0], data[1], data[2]);
}
}
void glLight(int light, int mode, FloatBuffer* values) {
int idx;
if (light == GL_LIGHT0) {
idx = 0;
} else if (light == GL_LIGHT1) {
idx = 1;
} else
return;
float* data = values->_getDataPointer();
switch (mode) {
case GL_POSITION:
RenderManager.StateSetLightDirection(idx, data[0], data[1],
data[2]);
break;
case GL_DIFFUSE:
RenderManager.StateSetLightColour(idx, data[0], data[1], data[2]);
break;
case GL_AMBIENT:
break;
case GL_SPECULAR:
break;
}
}
void glLightModel(int mode, FloatBuffer* values) {
float* data = values->_getDataPointer();
if (mode == GL_LIGHT_MODEL_AMBIENT) {
RenderManager.StateSetLightAmbientColour(data[0], data[1], data[2]);
}
}
void glLineWidth(float width) { RenderManager.StateSetLineWidth(width); }
void glColorMask(bool red, bool green, bool blue, bool alpha) {
RenderManager.StateSetWriteEnable(red, green, blue, alpha);
}
void glMultiTexCoord2f(int, float u, float v) {
// Clamp these values just to be safe - the lighting code can get broken if
// we pass things to StateSetVertexTextureUV that are >= 1
if (u > 255.0f) u = 255.0f;
if (v > 255.0f) v = 255.0f;
RenderManager.StateSetVertexTextureUV(u / 256.0f, v / 256.0f);
}
void glTexGen(int coord, int mode, FloatBuffer* vec) {
float* data = vec->_getDataPointer();
RenderManager.StateSetTexGenCol(coord, data[0], data[1], data[2], data[3],
mode == GL_EYE_PLANE);
}
void glCullFace(int dir) { RenderManager.StateSetFaceCullCW(dir == GL_BACK); }
#endif