mirror of
https://github.com/4jcraft/4jcraft.git
synced 2026-04-23 23:47:58 +00:00
172 lines
5.6 KiB
C++
172 lines
5.6 KiB
C++
#ifdef __linux__
|
|
|
|
#include <cstring>
|
|
|
|
#include "4J.Render/4J_Render.h"
|
|
#include "Minecraft.Client/include/stubs.h"
|
|
#include "java/ByteBuffer.h"
|
|
#include "java/FloatBuffer.h"
|
|
#include "java/IntBuffer.h"
|
|
|
|
extern C4JRender RenderManager;
|
|
|
|
#ifdef GLES
|
|
extern "C" {
|
|
extern void glClearDepthf(float depth);
|
|
void glClearDepth(double depth) { glClearDepthf((float)depth); }
|
|
void glTexGeni(unsigned int, unsigned int, int) {}
|
|
void glTexGenfv(unsigned int, unsigned int, const float*) {}
|
|
void glTexCoordPointer(int, unsigned int, int, const void*) {}
|
|
void glNormalPointer(unsigned int, int, const void*) {}
|
|
void glColorPointer(int, unsigned int, int, const void*) {}
|
|
void glVertexPointer(int, unsigned int, int, const void*) {}
|
|
void glEndList(void) {}
|
|
void glCallLists(int, unsigned int, const void*) {}
|
|
}
|
|
#endif
|
|
|
|
inline int* getIntPtr(IntBuffer* buf) {
|
|
return buf ? (int*)buf->getBuffer() + buf->position() : nullptr;
|
|
}
|
|
inline void* getBytePtr(ByteBuffer* buf) {
|
|
return buf ? (char*)buf->getBuffer() + buf->position() : nullptr;
|
|
}
|
|
|
|
void glGenTextures_4J(IntBuffer* buf) {
|
|
if (!buf) return;
|
|
int n = buf->limit() - buf->position();
|
|
int* dst = getIntPtr(buf);
|
|
for (int i = 0; i < n; i++) dst[i] = RenderManager.TextureCreate();
|
|
}
|
|
|
|
void glDeleteTextures_4J(IntBuffer* buf) {
|
|
if (!buf) return;
|
|
int n = buf->limit() - buf->position();
|
|
int* src = getIntPtr(buf);
|
|
for (int i = 0; i < n; i++) RenderManager.TextureFree(src[i]);
|
|
}
|
|
|
|
void glTexImage2D_4J(int target, int level, int internalformat, int width,
|
|
int height, int border, int format, int type,
|
|
ByteBuffer* pixels) {
|
|
(void)target;
|
|
(void)internalformat;
|
|
(void)border;
|
|
(void)format;
|
|
(void)type;
|
|
RenderManager.TextureData(width, height, getBytePtr(pixels), level,
|
|
C4JRender::TEXTURE_FORMAT_RxGyBzAw);
|
|
}
|
|
|
|
void glLight_4J(int light, int pname, FloatBuffer* params) {
|
|
const float* p = params->_getDataPointer();
|
|
int idx = (light == 0x4001) ? 1 : 0;
|
|
if (pname == 0x1203)
|
|
RenderManager.StateSetLightDirection(idx, p[0], p[1], p[2]);
|
|
else if (pname == 0x1201)
|
|
RenderManager.StateSetLightColour(idx, p[0], p[1], p[2]);
|
|
else if (pname == 0x1200)
|
|
RenderManager.StateSetLightAmbientColour(p[0], p[1], p[2]);
|
|
}
|
|
|
|
void glLightModel_4J(int pname, FloatBuffer* params) {
|
|
if (pname == 0x0B53) {
|
|
const float* p = params->_getDataPointer();
|
|
RenderManager.StateSetLightAmbientColour(p[0], p[1], p[2]);
|
|
}
|
|
}
|
|
|
|
void glFog_4J(int pname, FloatBuffer* params) {
|
|
const float* p = params->_getDataPointer();
|
|
if (pname == 0x0B66) RenderManager.StateSetFogColour(p[0], p[1], p[2]);
|
|
}
|
|
|
|
void glGetFloat_4J(int pname, FloatBuffer* params) {
|
|
const float* m = RenderManager.MatrixGet(pname);
|
|
if (m) memcpy(params->_getDataPointer(), m, 16 * sizeof(float));
|
|
}
|
|
|
|
void glCallLists_4J(IntBuffer* lists) {
|
|
if (!lists) return;
|
|
int count = lists->limit() - lists->position();
|
|
int* ids = getIntPtr(lists);
|
|
for (int i = 0; i < count; i++) RenderManager.CBuffCall(ids[i], false);
|
|
}
|
|
|
|
void glReadPixels_4J(int x, int y, int w, int h, int f, int t, ByteBuffer* p) {
|
|
(void)f;
|
|
(void)t;
|
|
RenderManager.ReadPixels(x, y, w, h, getBytePtr(p));
|
|
}
|
|
|
|
// dead stubs
|
|
void glTexCoordPointer_4J(int, int, FloatBuffer*) {}
|
|
void glNormalPointer_4J(int, ByteBuffer*) {}
|
|
void glColorPointer_4J(int, bool, int, ByteBuffer*) {}
|
|
void glVertexPointer_4J(int, int, FloatBuffer*) {}
|
|
void glEndList_4J(int) {}
|
|
void glTexGen_4J(int, int, FloatBuffer*) {}
|
|
|
|
// query objects
|
|
#include <GL/gl.h>
|
|
#include <GL/glext.h>
|
|
#include <dlfcn.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
static PFNGLGENQUERIESARBPROC _glGenQueriesARB = nullptr;
|
|
static PFNGLBEGINQUERYARBPROC _glBeginQueryARB = nullptr;
|
|
static PFNGLENDQUERYARBPROC _glEndQueryARB = nullptr;
|
|
static PFNGLGETQUERYOBJECTUIVARBPROC _glGetQueryObjectuivARB = nullptr;
|
|
static bool _queriesInitialized = false;
|
|
|
|
static void initQueryFuncs() {
|
|
if (_queriesInitialized) return;
|
|
_queriesInitialized = true;
|
|
_glGenQueriesARB =
|
|
(PFNGLGENQUERIESARBPROC)dlsym(RTLD_DEFAULT, "glGenQueriesARB");
|
|
_glBeginQueryARB =
|
|
(PFNGLBEGINQUERYARBPROC)dlsym(RTLD_DEFAULT, "glBeginQueryARB");
|
|
_glEndQueryARB = (PFNGLENDQUERYARBPROC)dlsym(RTLD_DEFAULT, "glEndQueryARB");
|
|
_glGetQueryObjectuivARB = (PFNGLGETQUERYOBJECTUIVARBPROC)dlsym(
|
|
RTLD_DEFAULT, "glGetQueryObjectuivARB");
|
|
}
|
|
|
|
void glGenQueriesARB_4J(IntBuffer* buf) {
|
|
initQueryFuncs();
|
|
if (_glGenQueriesARB && buf) {
|
|
int n = buf->limit() - buf->position();
|
|
if (n > 0) _glGenQueriesARB(n, (GLuint*)getIntPtr(buf));
|
|
}
|
|
}
|
|
|
|
void glBeginQueryARB_4J(int target, int id) {
|
|
initQueryFuncs();
|
|
if (_glBeginQueryARB) _glBeginQueryARB((GLenum)target, (GLuint)id);
|
|
}
|
|
|
|
void glEndQueryARB_4J(int target) {
|
|
initQueryFuncs();
|
|
if (_glEndQueryARB) _glEndQueryARB((GLenum)target);
|
|
}
|
|
|
|
void glGetQueryObjectuARB_4J(int id, int pname, IntBuffer* params) {
|
|
initQueryFuncs();
|
|
if (_glGetQueryObjectuivARB && params)
|
|
// LWJGL does not change limits/positions during these calls, it
|
|
// reads/writes exactly at pointer!!
|
|
_glGetQueryObjectuivARB((GLuint)id, (GLenum)pname,
|
|
(GLuint*)getIntPtr(params));
|
|
}
|
|
void glGetFloat(int pname, FloatBuffer* params) {
|
|
glGetFloat_4J(pname, params);
|
|
}
|
|
void LinuxGLLogLightmapState(const char* stage, int textureId,
|
|
bool scaleLight) {
|
|
static int logCount = 0;
|
|
if (logCount >= 16) return;
|
|
++logCount;
|
|
fprintf(stderr, "[linux-lightmap] %s tex=%d scale=%d\n", stage, textureId,
|
|
scaleLight ? 1 : 0);
|
|
}
|
|
#endif |