Compare commits

..

No commits in common. "master" and "frustum-culling" have entirely different histories.

13 changed files with 63 additions and 265 deletions

View file

@ -39,7 +39,6 @@ static void tick(void){
}
GSPhysicsObject obj[128];
GSModel mdl;
static void render(GSEngine self){
GSGL gl = GSClientGetGL(GSEngineGetClient(self));
@ -47,23 +46,25 @@ static void render(GSEngine self){
GSVector4 col1 = {1, 0, 0, 1};
GSVector4 col2 = {1, 1, 1, 1};
GSVector3 v[] = {
{-40, 0, 40},
{-40, 0, -40},
{40, 0, -40},
{40, 0, 40}
{-20, 0, 20},
{-20, 0, -20},
{20, 0, -20},
{20, 0, 20}
};
GSVector3 n = {0, 1, 0};
for(i = 0; i < sizeof(obj) / sizeof(obj[0]); i++){
GSVector3 rv;
GSRotation rot;
rot.use_matrix = GSTrue;
GSMatrix3x3 rm;
GSPhysicsGetPosition(obj[i], rv);
GSPhysicsGetRotation(obj[i], rot.u.matrix);
GSPhysicsGetRotation(obj[i], rm);
GSModelDraw(mdl, rv, &rot);
GSGLPushMatrix(gl);
GSGLSetPosition(gl, rv);
GSGLSetRotation3x3(gl, rm);
GSGLTetrakis(gl, 0.5, col1, col2);
GSGLPopMatrix(gl);
}
GSGLSetColor(gl, col2);
@ -103,9 +104,6 @@ int main(int argc, char** argv){
int i;
GSVector3 pos = {0, 1, 0};
GSVector3 sz = {1, 1, 1};
mdl = GSModelOpen(engine, "game:/mdl/crate.gsm");
for(i = 0; i < sizeof(obj) / sizeof(obj[0]); i++){
obj[i] = GSPhysicsCreateSphere(GSServerGetPhysics(GSEngineGetServer(engine)), 1, 0.5);
@ -118,7 +116,6 @@ int main(int argc, char** argv){
GSClientSetSkybox(GSEngineGetClient(engine), GSTrue);
GSEngineLoop(engine);
GSModelClose(mdl);
GSEngineDestroy(engine);
}
}

Binary file not shown.

View file

@ -13,8 +13,6 @@ uniform sampler2D shadow_map2;
uniform sampler2D current_texture;
uniform float enable_lighting;
uniform float enable_texture;
uniform float enable_shadow;
uniform vec3 camera;
vec4 PhongShading(void)
{
@ -70,11 +68,7 @@ float SampleShadow(sampler2D shadowMap, vec4 shadowCoord) {
}
float ShadowCoef(void){
float dist = length(normalize(camera + gl_LightSource[0].position.xyz) - vPos.xyz);
if(gl_LightSource[0].position.w > 0.5){
if(dist >= 10.0) return 1.0;
}
float dist = -vPos.z;
if(dist < 10.0) return SampleShadow(shadow_map0, vShadowCoord0);
if(dist < 40.0) return SampleShadow(shadow_map1, vShadowCoord1);
@ -84,11 +78,7 @@ float ShadowCoef(void){
void main(void){
vec4 c = PhongShading();
vec4 ambient = gl_LightSource[0].ambient;
float shadow_coef = 1.0;
if(enable_shadow >= 0.5){
shadow_coef = ShadowCoef();
}
float shadow_coef = ShadowCoef();
if(enable_texture >= 0.5){
c = c * texture2D(current_texture, gl_TexCoord[0].st);
@ -96,4 +86,4 @@ void main(void){
gl_FragColor = ambient * shadow_coef * c + (1.0 - ambient) * c;
gl_FragColor.a = vColor.a;
}
}

View file

@ -45,8 +45,6 @@ GSDECL void GSGLShadowEnd(GSGL gl);
GSDECL void GSGLShadowDeinit(GSGL gl);
GSDECL void GSGLShadowDisable(GSGL gl);
GSDECL void GSGLShadowEnable(GSGL gl);
GSDECL int GSGLShadowCascadeSteps(GSGL gl);
GSDECL void GSGLShadowRender(GSGL gl, int toggle);
/* gl.c */
GSDECL GSGL GSGLCreate(GSClient client);
@ -60,7 +58,8 @@ GSDECL void GSGLPolygon2D(GSGL gl, int pairs, GSVector2* vert, GSVector2* tex)
GSDECL void GSGLBegin2D(GSGL gl);
GSDECL void GSGLEnd2D(GSGL gl);
GSDECL void GSGLSetPosition(GSGL gl, GSVector3 pos);
GSDECL void GSGLSetRotation(GSGL gl, GSRotation* rot);
GSDECL void GSGLSetRotation(GSGL gl, GSVector3 rot);
GSDECL void GSGLSetRotation3x3(GSGL gl, GSMatrix3x3 rot);
GSDECL void GSGLPushMatrix(GSGL gl);
GSDECL void GSGLPopMatrix(GSGL gl);
GSDECL GLuint GSGLBeginList(GSGL gl);
@ -71,12 +70,10 @@ GSDECL void GSGLClearDepth(GSGL gl);
GSDECL void GSGLInitialTranslation(GSGL gl);
/* gl_camera.c */
GSDECL void GSGLCameraPerspective(GSGL gl, GSNumber width, GSNumber height);
GSDECL void GSGLCameraSet(GSGL gl);
GSDECL void GSGLCameraLookAt(GSGL gl, GSVector3 camera, GSVector3 look_at);
GSDECL void GSGLCameraSetup(GSGL gl);
GSDECL void GSGLCameraFrustum(GSGL gl);
GSDECL GSBool GSGLCameraFrustumContain(GSGL gl, GSVector3 a, GSVector3 b);
GSDECL void GSGLCameraPerspective(GSGL gl, GSNumber width, GSNumber height);
GSDECL void GSGLCameraSet(GSGL gl);
GSDECL void GSGLCameraLookAt(GSGL gl, GSVector3 camera, GSVector3 look_at);
GSDECL void GSGLCameraSetup(GSGL gl);
#ifdef __cplusplus
}

View file

@ -9,7 +9,7 @@ extern "C" {
#endif
GSDECL GSModel GSModelOpen(GSEngine engine, const char* path);
GSDECL void GSModelDraw(GSModel model, GSVector3 pos, GSRotation* rot);
GSDECL void GSModelDraw(GSModel model);
GSDECL void GSModelClose(GSModel model);
#ifdef __cplusplus

View file

@ -51,8 +51,6 @@ typedef struct _GSNetAddress GSNetAddress;
typedef struct _GSBinary GSBinary;
typedef struct _GSNetState GSNetState;
typedef struct _GSNetKV GSNetKV;
typedef union _GSRotationUnion GSRotationUnion;
typedef struct _GSRotation GSRotation;
#ifdef _GEARSRC
typedef struct _GSClient* GSClient;
typedef struct _GSServer* GSServer;
@ -178,16 +176,6 @@ struct _GSNetKV {
GSNetState value;
};
union _GSRotationUnion {
GSVector3 vector;
GSMatrix3x3 matrix;
};
struct _GSRotation {
GSBool use_matrix;
GSRotationUnion u;
};
#ifdef _GEARSRC
#include <GearSrc/GL/GL.h>
#include <miniaudio.h>
@ -206,13 +194,7 @@ struct _GSGL {
GLdouble shadow_old_projection[16];
GLdouble shadow_old_modelview[16];
GLdouble frustum_projection[16];
GLdouble frustum_modelview[16];
GSNumber frustum_planes[6][16];
GSNumber frustum_clip[16];
GSBool bold;
GSBool shadow;
};
struct _GSSkyBox {
@ -259,8 +241,6 @@ struct _GSModel {
float* vertex;
float* texcoord;
GSModelFace* face;
GSVector3 bbox[2];
};
struct _GSSound {

View file

@ -132,27 +132,21 @@ void GSClientStep(GSClient client) {
GSGLTextBold(client->gl, 0);
#ifdef SHADOW
if(GSGLShadowBegin(client->gl)) {
int c;
for(c = 0; c < GSGLShadowCascadeSteps(client->gl); c++) {
for(c = 0; c < GSGL_SHADOW_CASCADES; c++) {
GSGLShadowCascade(client->gl, c);
scene(client);
GSGLShadowCopy(client->gl, c);
}
GSGLShadowApply(client->gl);
}
#else
GSGLShadowRender(client->gl, 0);
#endif
if(client->skybox_enabled) {
if(client->skybox != NULL) GSSkyBoxDraw(client->skybox);
}
scene(client);
#ifdef SHADOW
GSGLShadowEnd(client->gl);
#endif
GSVersionGet(&ver);

View file

@ -16,7 +16,7 @@
#include <stb_ds.h>
#ifdef _WIN32
static void init_winsock(void) {
static void init_winsock(void){
WSADATA wsa;
WSAStartup(MAKEWORD(1, 1), &wsa);

View file

@ -121,21 +121,21 @@ void GSGLSetPosition(GSGL gl, GSVector3 pos) {
glTranslatef(pos[0], pos[1], -pos[2]);
}
void GSGLSetRotation(GSGL gl, GSRotation* rot) {
if(rot->use_matrix) {
GSMatrix4x4 out, out2;
GLdouble mat[16];
int i;
void GSGLSetRotation(GSGL gl, GSVector3 rot) {
glRotatef(rot[0], 1, 0, 0);
glRotatef(rot[1], 0, 1, 0);
glRotatef(rot[2], 0, 0, 1);
}
GSMath3x3To4x4(out, rot->u.matrix);
GSMathRowToColumn4x4(out2, out);
for(i = 0; i < 16; i++) mat[i] = out2[i];
glMultMatrixd(mat);
} else {
glRotatef(rot->u.vector[0], 1, 0, 0);
glRotatef(rot->u.vector[1], 0, 1, 0);
glRotatef(rot->u.vector[2], 0, 0, 1);
}
void GSGLSetRotation3x3(GSGL gl, GSMatrix3x3 rot) {
GSMatrix4x4 out, out2;
GLdouble mat[16];
int i;
GSMath3x3To4x4(out, rot);
GSMathRowToColumn4x4(out2, out);
for(i = 0; i < 16; i++) mat[i] = out2[i];
glMultMatrixd(mat);
}
void GSGLPushMatrix(GSGL gl) {

View file

@ -63,12 +63,6 @@ void GSGLCameraLookAt(GSGL gl, GSVector3 camera, GSVector3 look_at) {
glMultMatrixd(matrix);
glTranslated(-camera[0], -camera[1], camera[2]);
if(gl->shadow_use_shader) {
glUseProgram(gl->shadow_shader);
glUniform3f(glGetUniformLocation(gl->shadow_shader, "camera"), camera[0], camera[1], camera[2]);
glUseProgram(0);
}
}
void GSGLCameraSetup(GSGL gl) {
@ -79,93 +73,4 @@ void GSGLCameraSetup(GSGL gl) {
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
GSGLCameraSet(gl);
GSGLCameraFrustum(gl);
}
static void frustum_normalize(GSGL gl, int plane) {
GSVector3 v;
GSNumber l;
int i;
v[0] = gl->frustum_planes[plane][0];
v[1] = gl->frustum_planes[plane][1];
v[2] = gl->frustum_planes[plane][2];
l = GSMathLength3(v);
for(i = 0; i < 4; i++) {
gl->frustum_planes[plane][i] /= l;
}
}
void GSGLCameraFrustum(GSGL gl) {
glGetDoublev(GL_PROJECTION_MATRIX, gl->frustum_projection);
glGetDoublev(GL_MODELVIEW_MATRIX, gl->frustum_modelview);
gl->frustum_clip[0x0] = gl->frustum_modelview[0x0] * gl->frustum_projection[0x0] + gl->frustum_modelview[0x1] * gl->frustum_projection[0x4] + gl->frustum_modelview[0x2] * gl->frustum_projection[0x8] + gl->frustum_modelview[0x3] * gl->frustum_projection[0xc];
gl->frustum_clip[0x1] = gl->frustum_modelview[0x0] * gl->frustum_projection[0x1] + gl->frustum_modelview[0x1] * gl->frustum_projection[0x5] + gl->frustum_modelview[0x2] * gl->frustum_projection[0x9] + gl->frustum_modelview[0x3] * gl->frustum_projection[0xd];
gl->frustum_clip[0x2] = gl->frustum_modelview[0x0] * gl->frustum_projection[0x2] + gl->frustum_modelview[0x1] * gl->frustum_projection[0x6] + gl->frustum_modelview[0x2] * gl->frustum_projection[0xa] + gl->frustum_modelview[0x3] * gl->frustum_projection[0xe];
gl->frustum_clip[0x3] = gl->frustum_modelview[0x0] * gl->frustum_projection[0x3] + gl->frustum_modelview[0x1] * gl->frustum_projection[0x7] + gl->frustum_modelview[0x2] * gl->frustum_projection[0xb] + gl->frustum_modelview[0x3] * gl->frustum_projection[0xf];
gl->frustum_clip[0x4] = gl->frustum_modelview[0x4] * gl->frustum_projection[0x0] + gl->frustum_modelview[0x5] * gl->frustum_projection[0x4] + gl->frustum_modelview[0x6] * gl->frustum_projection[0x8] + gl->frustum_modelview[0x7] * gl->frustum_projection[0xc];
gl->frustum_clip[0x5] = gl->frustum_modelview[0x4] * gl->frustum_projection[0x1] + gl->frustum_modelview[0x5] * gl->frustum_projection[0x5] + gl->frustum_modelview[0x6] * gl->frustum_projection[0x9] + gl->frustum_modelview[0x7] * gl->frustum_projection[0xd];
gl->frustum_clip[0x6] = gl->frustum_modelview[0x4] * gl->frustum_projection[0x2] + gl->frustum_modelview[0x5] * gl->frustum_projection[0x6] + gl->frustum_modelview[0x6] * gl->frustum_projection[0xa] + gl->frustum_modelview[0x7] * gl->frustum_projection[0xe];
gl->frustum_clip[0x7] = gl->frustum_modelview[0x4] * gl->frustum_projection[0x3] + gl->frustum_modelview[0x5] * gl->frustum_projection[0x7] + gl->frustum_modelview[0x6] * gl->frustum_projection[0xb] + gl->frustum_modelview[0x7] * gl->frustum_projection[0xf];
gl->frustum_clip[0x8] = gl->frustum_modelview[0x8] * gl->frustum_projection[0x0] + gl->frustum_modelview[0x9] * gl->frustum_projection[0x4] + gl->frustum_modelview[0xa] * gl->frustum_projection[0x8] + gl->frustum_modelview[0xb] * gl->frustum_projection[0xc];
gl->frustum_clip[0x9] = gl->frustum_modelview[0x8] * gl->frustum_projection[0x1] + gl->frustum_modelview[0x9] * gl->frustum_projection[0x5] + gl->frustum_modelview[0xa] * gl->frustum_projection[0x9] + gl->frustum_modelview[0xb] * gl->frustum_projection[0xd];
gl->frustum_clip[0xa] = gl->frustum_modelview[0x8] * gl->frustum_projection[0x2] + gl->frustum_modelview[0x9] * gl->frustum_projection[0x6] + gl->frustum_modelview[0xa] * gl->frustum_projection[0xa] + gl->frustum_modelview[0xb] * gl->frustum_projection[0xe];
gl->frustum_clip[0xb] = gl->frustum_modelview[0x8] * gl->frustum_projection[0x3] + gl->frustum_modelview[0x9] * gl->frustum_projection[0x7] + gl->frustum_modelview[0xa] * gl->frustum_projection[0xb] + gl->frustum_modelview[0xb] * gl->frustum_projection[0xf];
gl->frustum_clip[0xc] = gl->frustum_modelview[0xc] * gl->frustum_projection[0x0] + gl->frustum_modelview[0xd] * gl->frustum_projection[0x4] + gl->frustum_modelview[0xe] * gl->frustum_projection[0x8] + gl->frustum_modelview[0xf] * gl->frustum_projection[0xc];
gl->frustum_clip[0xd] = gl->frustum_modelview[0xc] * gl->frustum_projection[0x1] + gl->frustum_modelview[0xd] * gl->frustum_projection[0x5] + gl->frustum_modelview[0xe] * gl->frustum_projection[0x9] + gl->frustum_modelview[0xf] * gl->frustum_projection[0xd];
gl->frustum_clip[0xe] = gl->frustum_modelview[0xc] * gl->frustum_projection[0x2] + gl->frustum_modelview[0xd] * gl->frustum_projection[0x6] + gl->frustum_modelview[0xe] * gl->frustum_projection[0xa] + gl->frustum_modelview[0xf] * gl->frustum_projection[0xe];
gl->frustum_clip[0xf] = gl->frustum_modelview[0xc] * gl->frustum_projection[0x3] + gl->frustum_modelview[0xd] * gl->frustum_projection[0x7] + gl->frustum_modelview[0xe] * gl->frustum_projection[0xb] + gl->frustum_modelview[0xf] * gl->frustum_projection[0xf];
gl->frustum_planes[0][0] = gl->frustum_clip[0x3] - gl->frustum_clip[0x0];
gl->frustum_planes[0][1] = gl->frustum_clip[0x7] - gl->frustum_clip[0x4];
gl->frustum_planes[0][2] = gl->frustum_clip[0xb] - gl->frustum_clip[0x8];
gl->frustum_planes[0][3] = gl->frustum_clip[0xf] - gl->frustum_clip[0xc];
frustum_normalize(gl, 0);
gl->frustum_planes[1][0] = gl->frustum_clip[0x3] + gl->frustum_clip[0x0];
gl->frustum_planes[1][1] = gl->frustum_clip[0x7] + gl->frustum_clip[0x4];
gl->frustum_planes[1][2] = gl->frustum_clip[0xb] + gl->frustum_clip[0x8];
gl->frustum_planes[1][3] = gl->frustum_clip[0xf] + gl->frustum_clip[0xc];
frustum_normalize(gl, 1);
gl->frustum_planes[2][0] = gl->frustum_clip[0x3] - gl->frustum_clip[0x1];
gl->frustum_planes[2][1] = gl->frustum_clip[0x7] - gl->frustum_clip[0x5];
gl->frustum_planes[2][2] = gl->frustum_clip[0xb] - gl->frustum_clip[0x9];
gl->frustum_planes[2][3] = gl->frustum_clip[0xf] - gl->frustum_clip[0xd];
frustum_normalize(gl, 2);
gl->frustum_planes[3][0] = gl->frustum_clip[0x3] + gl->frustum_clip[0x1];
gl->frustum_planes[3][1] = gl->frustum_clip[0x7] + gl->frustum_clip[0x5];
gl->frustum_planes[3][2] = gl->frustum_clip[0xb] + gl->frustum_clip[0x9];
gl->frustum_planes[3][3] = gl->frustum_clip[0xf] + gl->frustum_clip[0xd];
frustum_normalize(gl, 3);
gl->frustum_planes[4][0] = gl->frustum_clip[0x3] - gl->frustum_clip[0x2];
gl->frustum_planes[4][1] = gl->frustum_clip[0x7] - gl->frustum_clip[0x6];
gl->frustum_planes[4][2] = gl->frustum_clip[0xb] - gl->frustum_clip[0xa];
gl->frustum_planes[4][3] = gl->frustum_clip[0xf] - gl->frustum_clip[0xe];
frustum_normalize(gl, 4);
gl->frustum_planes[5][0] = gl->frustum_clip[0x3] + gl->frustum_clip[0x2];
gl->frustum_planes[5][1] = gl->frustum_clip[0x7] + gl->frustum_clip[0x6];
gl->frustum_planes[5][2] = gl->frustum_clip[0xb] + gl->frustum_clip[0xa];
gl->frustum_planes[5][3] = gl->frustum_clip[0xf] + gl->frustum_clip[0xe];
frustum_normalize(gl, 5);
}
GSBool GSGLCameraFrustumContain(GSGL gl, GSVector3 a, GSVector3 b) {
int i;
for(i = 0; i < 6; i++) {
GSBool bv = GSTrue;
bv = bv && gl->frustum_planes[i][0] * a[0] + gl->frustum_planes[i][1] * a[1] + gl->frustum_planes[i][2] * a[2] + gl->frustum_planes[i][3] <= 0.0;
bv = bv && gl->frustum_planes[i][0] * b[0] + gl->frustum_planes[i][1] * a[1] + gl->frustum_planes[i][2] * a[2] + gl->frustum_planes[i][3] <= 0.0;
bv = bv && gl->frustum_planes[i][0] * a[0] + gl->frustum_planes[i][1] * b[1] + gl->frustum_planes[i][2] * a[2] + gl->frustum_planes[i][3] <= 0.0;
bv = bv && gl->frustum_planes[i][0] * b[0] + gl->frustum_planes[i][1] * b[1] + gl->frustum_planes[i][2] * a[2] + gl->frustum_planes[i][3] <= 0.0;
bv = bv && gl->frustum_planes[i][0] * a[0] + gl->frustum_planes[i][1] * a[1] + gl->frustum_planes[i][2] * b[2] + gl->frustum_planes[i][3] <= 0.0;
bv = bv && gl->frustum_planes[i][0] * b[0] + gl->frustum_planes[i][1] * a[1] + gl->frustum_planes[i][2] * b[2] + gl->frustum_planes[i][3] <= 0.0;
bv = bv && gl->frustum_planes[i][0] * a[0] + gl->frustum_planes[i][1] * b[1] + gl->frustum_planes[i][2] * b[2] + gl->frustum_planes[i][3] <= 0.0;
bv = bv && gl->frustum_planes[i][0] * b[0] + gl->frustum_planes[i][1] * b[1] + gl->frustum_planes[i][2] * b[2] + gl->frustum_planes[i][3] <= 0.0;
if(bv) return GSFalse;
}
return GSTrue;
}

View file

@ -179,11 +179,11 @@ void GSGLTetrakis(GSGL gl, GSNumber scale, GSVector4 col1, GSVector4 col2) {
{0, 1, 0},
{-0.75, 0.75, -0.75},
{0.75, 0.75, -0.75}};
GSVector3 n;
GSRotation rot2 = {0, {0, 90, 0}};
GSRotation rot3 = {0, {0, 0, 90}};
GSRotation rot4 = {0, {90, 0, 0}};
int i, j, k = 0;
GSVector3 n;
GSVector3 rot2 = {0, 90, 0};
GSVector3 rot3 = {0, 0, 90};
GSVector3 rot4 = {90, 0, 0};
int i, j, k = 0;
for(i = 0; i < 3; i++) {
for(j = 0; j < 3; j++) v[i][j] *= scale;
@ -197,17 +197,17 @@ void GSGLTetrakis(GSGL gl, GSNumber scale, GSVector4 col1, GSVector4 col2) {
GSGLSetColor(gl, ((k + j) % 2) ? col2 : col1);
GSGLPolygon(gl, 3, v, NULL, n);
GSGLSetRotation(gl, &rot2);
GSGLSetRotation(gl, rot2);
}
if(i == 3) {
GSGLSetRotation(gl, &rot4);
GSGLSetRotation(gl, rot4);
k++;
} else if(i == 4) {
GSGLSetRotation(gl, &rot4);
GSGLSetRotation(gl, &rot4);
GSGLSetRotation(gl, rot4);
GSGLSetRotation(gl, rot4);
} else {
GSGLSetRotation(gl, &rot3);
GSGLSetRotation(gl, rot3);
k++;
}
}

View file

@ -40,7 +40,6 @@ void GSGLShadowInit(GSGL gl) {
glUniform1i(glGetUniformLocation(gl->shadow_shader, "current_texture"), 0);
glUniform1f(glGetUniformLocation(gl->shadow_shader, "enable_lighting"), 1);
glUniform1f(glGetUniformLocation(gl->shadow_shader, "enable_texture"), 0);
glUniform1f(glGetUniformLocation(gl->shadow_shader, "enable_shadow"), 1);
glUseProgram(0);
gl->shadow_use_shader = 1;
@ -49,8 +48,6 @@ void GSGLShadowInit(GSGL gl) {
gl->shadow_use_shader = 0;
}
gl->shadow = GSFalse;
}
GSBool GSGLShadowBegin(GSGL gl) {
@ -77,12 +74,6 @@ GSBool GSGLShadowBegin(GSGL gl) {
return GSTrue;
}
int GSGLShadowCascadeSteps(GSGL gl) {
if(gl->engine->client->light0[3]) return 1;
return GSGL_SHADOW_CASCADES;
}
void GSGLShadowCascade(GSGL gl, int cascade) {
GSVector3 zero = {0, 0, 0};
GSNumber size;
@ -95,10 +86,8 @@ void GSGLShadowCascade(GSGL gl, int cascade) {
// Simple cascade sizing
if(cascade == 0) size = 10;
else if(cascade == 1)
size = 40;
else
size = 100; // Covers max distance roughly
else if(cascade == 1) size = 40;
else size = 100; // Covers max distance roughly
// If light is directional (light0[3] == 0)
// Current existing code logic:
@ -210,8 +199,6 @@ void GSGLShadowDisable(GSGL gl) {
}
glActiveTexture(GL_TEXTURE0);
}
gl->shadow = GSFalse;
}
void GSGLShadowEnable(GSGL gl) {
@ -227,26 +214,15 @@ void GSGLShadowEnable(GSGL gl) {
}
glActiveTexture(GL_TEXTURE0);
}
gl->shadow = GSTrue;
}
void GSGLShadowRender(GSGL gl, int toggle){
if(gl->shadow_use_shader){
if(!gl->shadow) glUseProgram(gl->shadow_shader);
glUniform1f(glGetUniformLocation(gl->shadow_shader, "enable_shadow"), toggle);
if(!gl->shadow) glUseProgram(0);
}
}
void GSGLShadowEnd(GSGL gl) {
int i;
if(!gl->shadow_use_shader) return;
GSGLShadowDisable(gl);
// Reset texture matrices
for(i = 0; i < GSGL_SHADOW_CASCADES; i++) {
for(int i = 0; i < GSGL_SHADOW_CASCADES; i++) {
glActiveTexture(GL_TEXTURE5 + i);
glMatrixMode(GL_TEXTURE);
glLoadIdentity();
@ -260,4 +236,4 @@ void GSGLShadowDeinit(GSGL gl) {
glDeleteTextures(GSGL_SHADOW_CASCADES, gl->shadow_texture);
glDeleteProgram(gl->shadow_shader);
}
}
}

View file

@ -10,17 +10,13 @@
#include <stb_ds.h>
static void parse_obj(GSModel model, char* txt) {
char* f = txt;
float lm = 0; /* leftmost */
float rm = 0; /* rightmost */
float um = 0; /* upmost */
float dm = 0; /* downmost */
float fm = 0; /* frontmost */
float bm = 0; /* backmost */
float l = 0;
float blr = fabs(lm - rm);
float bud = fabs(um - dm);
float bbf = fabs(fm - bm);
char* f = txt;
float lm = 0; /* leftmost */
float rm = 0; /* rightmost */
float um = 0; /* upmost */
float dm = 0; /* downmost */
float fm = 0; /* frontmost */
float bm = 0; /* backmost */
while(1) {
char* s = strchr(f, '\n');
@ -162,22 +158,6 @@ static void parse_obj(GSModel model, char* txt) {
if(s == NULL) break;
f = s + 1;
}
blr = fabs(lm - rm);
bud = fabs(um - dm);
bbf = fabs(fm - bm);
if(l < blr) l = blr;
if(l < bud) l = bud;
if(l < bbf) l = bbf;
model->bbox[0][0] = -l * 2;
model->bbox[0][1] = -l * 2;
model->bbox[0][2] = -l * 2;
model->bbox[1][0] = -model->bbox[0][0];
model->bbox[1][1] = -model->bbox[0][1];
model->bbox[1][2] = -model->bbox[0][2];
}
static void parse_mtl(GSModel model, char* txt) {
@ -294,16 +274,8 @@ GSModel GSModelOpen(GSEngine engine, const char* path) {
/* TODO: check for animation */
if(gl != NULL) {
GLuint list = GSGLBeginList(gl);
GSVector3 pos = {0, 0, 0};
GSRotation rot;
rot.use_matrix = GSFalse;
rot.u.vector[0] = 0;
rot.u.vector[1] = 0;
rot.u.vector[2] = 0;
GSModelDraw(model, pos, &rot);
GLuint list = GSGLBeginList(gl);
GSModelDraw(model);
GSGLEndList(gl);
model->call_list = list;
@ -312,13 +284,10 @@ GSModel GSModelOpen(GSEngine engine, const char* path) {
return model;
}
void GSModelDraw(GSModel model, GSVector3 pos, GSRotation* rot) {
void GSModelDraw(GSModel model) {
GSGL gl = model->engine->client->gl;
int i;
GSGLPushMatrix(gl);
GSGLSetPosition(gl, pos);
GSGLSetRotation(gl, rot);
if(model->call_list == 0) {
char* k = "default";
@ -336,18 +305,8 @@ void GSModelDraw(GSModel model, GSVector3 pos, GSRotation* rot) {
GSGLTextureSet(gl, 0);
} else {
GSVector3 a, b;
for(i = 0; i < 3; i++) {
a[i] = b[i] = pos[i];
a[i] += model->bbox[0][i];
b[i] += model->bbox[1][i];
}
if(GSGLCameraFrustumContain(gl, a, b)) GSGLCallList(gl, model->call_list);
GSGLCallList(gl, model->call_list);
}
GSGLPopMatrix(gl);
}
void GSModelClose(GSModel model) {