2018-05-12 13:05:54 +00:00
|
|
|
#include "private.h"
|
|
|
|
|
|
|
|
static GLfloat SCENE_AMBIENT [] = {0.2, 0.2, 0.2, 1.0};
|
|
|
|
static GLboolean VIEWER_IN_EYE_COORDINATES = GL_TRUE;
|
|
|
|
static GLenum COLOR_CONTROL = GL_SINGLE_COLOR;
|
|
|
|
static GLboolean TWO_SIDED_LIGHTING = GL_FALSE;
|
|
|
|
|
|
|
|
static LightSource LIGHTS[MAX_LIGHTS];
|
|
|
|
static Material MATERIAL;
|
|
|
|
|
|
|
|
void initLights() {
|
|
|
|
static GLfloat ONE [] = {1.0f, 1.0f, 1.0f, 1.0f};
|
|
|
|
static GLfloat ZERO [] = {0.0f, 0.0f, 0.0f, 1.0f};
|
|
|
|
static GLfloat PARTIAL [] = {0.2f, 0.2f, 0.2f, 1.0f};
|
|
|
|
static GLfloat MOSTLY [] = {0.8f, 0.8f, 0.8f, 1.0f};
|
|
|
|
|
|
|
|
memcpy(MATERIAL.ambient, PARTIAL, sizeof(GLfloat) * 4);
|
|
|
|
memcpy(MATERIAL.diffuse, MOSTLY, sizeof(GLfloat) * 4);
|
|
|
|
memcpy(MATERIAL.specular, ZERO, sizeof(GLfloat) * 4);
|
|
|
|
memcpy(MATERIAL.emissive, ZERO, sizeof(GLfloat) * 4);
|
|
|
|
MATERIAL.exponent = 0.0f;
|
|
|
|
MATERIAL.ambient_color_index = 0.0f;
|
|
|
|
MATERIAL.diffuse_color_index = 1.0f;
|
|
|
|
MATERIAL.specular_color_index = 1.0f;
|
|
|
|
|
|
|
|
for(GLubyte i = 0; i < MAX_LIGHTS; ++i) {
|
|
|
|
memcpy(LIGHTS[i].ambient, ZERO, sizeof(GLfloat) * 4);
|
|
|
|
memcpy(LIGHTS[i].diffuse, ONE, sizeof(GLfloat) * 4);
|
|
|
|
memcpy(LIGHTS[i].specular, ONE, sizeof(GLfloat) * 4);
|
|
|
|
|
|
|
|
if(i > 0) {
|
|
|
|
memcpy(LIGHTS[i].diffuse, ZERO, sizeof(GLfloat) * 4);
|
|
|
|
memcpy(LIGHTS[i].specular, ZERO, sizeof(GLfloat) * 4);
|
|
|
|
}
|
|
|
|
|
|
|
|
LIGHTS[i].position[0] = LIGHTS[i].position[1] = LIGHTS[i].position[3] = 0.0f;
|
|
|
|
LIGHTS[i].position[2] = 1.0f;
|
|
|
|
|
|
|
|
LIGHTS[i].spot_direction[0] = LIGHTS[i].spot_direction[1] = 0.0f;
|
|
|
|
LIGHTS[i].spot_direction[2] = -1.0f;
|
|
|
|
|
|
|
|
LIGHTS[i].spot_exponent = 0.0f;
|
|
|
|
LIGHTS[i].spot_cutoff = 180.0f;
|
|
|
|
|
|
|
|
LIGHTS[i].constant_attenuation = 1.0f;
|
|
|
|
LIGHTS[i].linear_attenuation = 0.0f;
|
|
|
|
LIGHTS[i].quadratic_attenuation = 0.0f;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glLightModelf(GLenum pname, const GLfloat param) {
|
|
|
|
glLightModelfv(pname, ¶m);
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glLightModeli(GLenum pname, const GLint param) {
|
|
|
|
glLightModeliv(pname, ¶m);
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glLightModelfv(GLenum pname, const GLfloat *params) {
|
|
|
|
switch(pname) {
|
|
|
|
case GL_LIGHT_MODEL_AMBIENT:
|
|
|
|
memcpy(SCENE_AMBIENT, params, sizeof(GLfloat) * 4);
|
|
|
|
break;
|
|
|
|
case GL_LIGHT_MODEL_LOCAL_VIEWER:
|
|
|
|
VIEWER_IN_EYE_COORDINATES = (*params) ? GL_TRUE : GL_FALSE;
|
|
|
|
break;
|
|
|
|
case GL_LIGHT_MODEL_TWO_SIDE:
|
|
|
|
/* Not implemented */
|
|
|
|
default:
|
|
|
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
|
|
|
_glKosPrintError();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glLightModeliv(GLenum pname, const GLint* params) {
|
|
|
|
switch(pname) {
|
|
|
|
case GL_LIGHT_MODEL_COLOR_CONTROL:
|
|
|
|
COLOR_CONTROL = *params;
|
|
|
|
break;
|
|
|
|
case GL_LIGHT_MODEL_LOCAL_VIEWER:
|
|
|
|
VIEWER_IN_EYE_COORDINATES = (*params) ? GL_TRUE : GL_FALSE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
|
|
|
_glKosPrintError();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glLightfv(GLenum light, GLenum pname, const GLfloat *params) {
|
|
|
|
GLubyte idx = light & 0xF;
|
|
|
|
|
|
|
|
if(idx >= MAX_LIGHTS) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(pname) {
|
|
|
|
case GL_AMBIENT:
|
|
|
|
memcpy(LIGHTS[idx].ambient, params, sizeof(GLfloat) * 4);
|
|
|
|
break;
|
|
|
|
case GL_DIFFUSE:
|
|
|
|
memcpy(LIGHTS[idx].diffuse, params, sizeof(GLfloat) * 4);
|
|
|
|
break;
|
|
|
|
case GL_SPECULAR:
|
|
|
|
memcpy(LIGHTS[idx].specular, params, sizeof(GLfloat) * 4);
|
|
|
|
break;
|
|
|
|
case GL_POSITION:
|
|
|
|
memcpy(LIGHTS[idx].position, params, sizeof(GLfloat) * 4);
|
|
|
|
break;
|
2018-05-13 08:34:44 +00:00
|
|
|
case GL_CONSTANT_ATTENUATION:
|
|
|
|
case GL_LINEAR_ATTENUATION:
|
|
|
|
case GL_QUADRATIC_ATTENUATION:
|
2018-05-12 13:05:54 +00:00
|
|
|
case GL_SPOT_CUTOFF:
|
|
|
|
case GL_SPOT_DIRECTION:
|
|
|
|
case GL_SPOT_EXPONENT:
|
2018-05-13 08:34:44 +00:00
|
|
|
glLightf(light, pname, *params);
|
2018-05-12 13:05:54 +00:00
|
|
|
default:
|
|
|
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
|
|
|
_glKosPrintError();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glLightf(GLenum light, GLenum pname, GLfloat param) {
|
2018-05-13 08:34:44 +00:00
|
|
|
GLubyte idx = light & 0xF;
|
2018-05-12 13:05:54 +00:00
|
|
|
|
2018-05-13 08:34:44 +00:00
|
|
|
if(idx >= MAX_LIGHTS) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
switch(pname) {
|
|
|
|
case GL_CONSTANT_ATTENUATION:
|
|
|
|
LIGHTS[idx].constant_attenuation = param;
|
|
|
|
break;
|
|
|
|
case GL_LINEAR_ATTENUATION:
|
|
|
|
LIGHTS[idx].linear_attenuation = param;
|
|
|
|
break;
|
|
|
|
case GL_QUADRATIC_ATTENUATION:
|
|
|
|
LIGHTS[idx].quadratic_attenuation = param;
|
|
|
|
break;
|
|
|
|
case GL_SPOT_EXPONENT:
|
|
|
|
case GL_SPOT_CUTOFF:
|
|
|
|
default:
|
|
|
|
_glKosThrowError(GL_INVALID_ENUM, __func__);
|
|
|
|
_glKosPrintError();
|
|
|
|
}
|
2018-05-12 13:05:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glMateriali(GLenum face, GLenum pname, const GLint param) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glMaterialf(GLenum face, GLenum pname, const GLfloat param) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void APIENTRY glMaterialfv(GLenum face, GLenum pname, const GLfloat *params) {
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void calculateLightingContribution(const GLint light, const GLfloat* pos, const GLfloat* normal, GLfloat* colour) {
|
2018-05-12 20:01:51 +00:00
|
|
|
colour[0] = colour[3] = 0.0f;
|
|
|
|
colour[1] = colour[2] = 0.0f;
|
2018-05-12 13:05:54 +00:00
|
|
|
}
|