Michaël Lemaire
bf1f9192e5
* Added body rotation using hit button * Added rotating decapitation camera * Added slow motion on death * Improved camera tracking * Added motion blur * Fixed several bugs
193 lines
4.6 KiB
C++
193 lines
4.6 KiB
C++
#include "main.h"
|
|
|
|
#include "light.h"
|
|
#include "camera.h"
|
|
#include "vector.h"
|
|
#include "glapi.h"
|
|
|
|
static int glnextlightnum = 0;
|
|
|
|
static Light *lights[GL_MAX_LIGHTS];
|
|
|
|
Light::Light(void) {
|
|
setPosition(0, 0, 0);
|
|
setColor(1, 1, 1);
|
|
setSpecular(0, 0, 0);
|
|
setAttenuation(1, 0, 0);
|
|
setEnabled(false);
|
|
glnum = GL_LIGHT0 + glnextlightnum;
|
|
lights[glnextlightnum] = this;
|
|
glnextlightnum++;
|
|
}
|
|
|
|
void Light::setPosition(float x, float y, float z) {
|
|
position[0] = x;
|
|
position[1] = y;
|
|
position[2] = z;
|
|
position[3] = 1;
|
|
}
|
|
|
|
void Light::setDirection(float x, float y, float z) {
|
|
position[0] = -x;
|
|
position[1] = -y;
|
|
position[2] = -z;
|
|
position[3] = 0;
|
|
}
|
|
|
|
void Light::setColor(float red, float green, float blue) {
|
|
diffuse[0] = red;
|
|
diffuse[1] = green;
|
|
diffuse[2] = blue;
|
|
diffuse[3] = 1;
|
|
glLightfv(glnum, GL_DIFFUSE, diffuse);
|
|
}
|
|
|
|
void Light::setSpecular(float red, float green, float blue) {
|
|
specular[0] = red;
|
|
specular[1] = green;
|
|
specular[2] = blue;
|
|
specular[3] = 1;
|
|
glLightfv(glnum, GL_SPECULAR, specular);
|
|
}
|
|
|
|
void Light::setAttenuation(float constant, float linear, float quadratic) {
|
|
attenuation[0] = constant;
|
|
attenuation[1] = linear;
|
|
attenuation[2] = quadratic;
|
|
glLightf(glnum, GL_CONSTANT_ATTENUATION, attenuation[0]);
|
|
glLightf(glnum, GL_LINEAR_ATTENUATION, attenuation[1]);
|
|
glLightf(glnum, GL_QUADRATIC_ATTENUATION, attenuation[2]);
|
|
}
|
|
|
|
void Light::setEnabled(bool enabled) {
|
|
this->enabled = enabled;
|
|
if (enabled)
|
|
glEnable(glnum);
|
|
else
|
|
glDisable(glnum);
|
|
}
|
|
|
|
void Light::glUpdate(void) { glLightfv(glnum, GL_POSITION, position); }
|
|
|
|
// extern Camera camera;
|
|
|
|
void Light::createFlare(Camera *camera) {
|
|
glPushMatrix();
|
|
|
|
GLint viewport[4];
|
|
glGetIntegerv(GL_VIEWPORT, viewport);
|
|
|
|
int width = viewport[2];
|
|
int height = viewport[3];
|
|
|
|
glTranslatef(position[0], position[1], position[2]);
|
|
|
|
GLboolean lightingenabled = glIsEnabled(GL_LIGHTING);
|
|
glDisable(GL_LIGHTING);
|
|
|
|
/*float cx=cameratarget.x-cameraposition.x;
|
|
float cy=cameratarget.y-cameraposition.y;
|
|
float cz=cameratarget.z-cameraposition.z;
|
|
float len=sqrt(cx*cx+cy*cy+cz*cz);
|
|
cx/=len;
|
|
cy/=len;
|
|
cz/=len;*/
|
|
float dir[3];
|
|
float cameratarget[3], cameraposition[3];
|
|
camera->getTarget(cameratarget);
|
|
camera->getPosition(cameraposition);
|
|
vectorSub(dir, cameratarget, cameraposition);
|
|
vectorNormalize(dir);
|
|
|
|
float dir2[3];
|
|
vectorSub(dir2, position, cameraposition);
|
|
float distance = vectorDot(dir2, dir);
|
|
|
|
/*float xd=(staticlightpositions[lightnumber].x-cameraposition.x)*cx;
|
|
float yd=(staticlightpositions[lightnumber].y-cameraposition.y)*cy;
|
|
float zd=(staticlightpositions[lightnumber].z-cameraposition.z)*cz;
|
|
float distance=xd+yd+zd;*/
|
|
|
|
float screencoords[3];
|
|
/*GLint viewport[4];
|
|
glGetIntegerv(GL_VIEWPORT, viewport);
|
|
|
|
int width=viewport[2];
|
|
int height=viewport[3];*/
|
|
|
|
GLdouble modelviewm[16], projectionm[16];
|
|
glGetDoublev(GL_MODELVIEW_MATRIX, modelviewm);
|
|
glGetDoublev(GL_PROJECTION_MATRIX, projectionm);
|
|
|
|
GLdouble wx, wy, wz;
|
|
if (gluProject(0, 0, 0, modelviewm, projectionm, viewport, &wx, &wy, &wz) ==
|
|
GL_FALSE) {
|
|
printf("Failure\n");
|
|
}
|
|
|
|
screencoords[0] = (float)(2 * wx - width) / width;
|
|
screencoords[1] = (float)(2 * wy - height) / height;
|
|
screencoords[2] = wz;
|
|
|
|
// getPointCoordinates(screencoords);
|
|
// point3d screencoords = getPointCoordinates(0, 0, 0);
|
|
|
|
glLoadIdentity();
|
|
glTranslatef(screencoords[0], screencoords[1], 0);
|
|
glDisable(GL_DEPTH_TEST);
|
|
glEnable(GL_CULL_FACE);
|
|
glEnable(GL_BLEND);
|
|
|
|
glBlendFunc(GL_ONE, GL_ONE);
|
|
// glEnable(GL_TEXTURE_2D);
|
|
// glBindTexture(GL_TEXTURE_2D, flaretexture->getId());
|
|
|
|
glMatrixMode(GL_PROJECTION);
|
|
glPushMatrix();
|
|
glLoadIdentity();
|
|
float sizey =
|
|
6.0 / distance * 1.0; // staticlightflarebrightnesses[lightnumber];
|
|
float sizex = sizey * height / width;
|
|
|
|
if (distance > 0.5) {
|
|
glBegin(GL_QUADS);
|
|
// glColor3f(staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber],staticlightflarebrightnesses[lightnumber]);
|
|
glColor3fv(diffuse);
|
|
|
|
glTexCoord2f(0.0, 0.0);
|
|
glVertex2f(-sizex, sizey);
|
|
|
|
glTexCoord2f(0.0, 1.0);
|
|
glVertex2f(-sizex, -sizey);
|
|
|
|
glTexCoord2f(1.0, 1.0);
|
|
glVertex2f(sizex, -sizey);
|
|
|
|
glTexCoord2f(1.0, 0.0);
|
|
glVertex2f(sizex, sizey);
|
|
glEnd();
|
|
}
|
|
|
|
// glDisable(GL_TEXTURE_2D);
|
|
|
|
glDisable(GL_BLEND);
|
|
|
|
glPopMatrix();
|
|
glMatrixMode(GL_MODELVIEW);
|
|
glLoadIdentity();
|
|
|
|
if (lightingenabled)
|
|
glEnable(GL_LIGHTING);
|
|
glEnable(GL_DEPTH_TEST);
|
|
|
|
glPopMatrix();
|
|
}
|
|
|
|
void updateLights(void) {
|
|
int i;
|
|
for (i = 0; i < glnextlightnum; i++) {
|
|
Light *light = lights[i];
|
|
light->glUpdate();
|
|
}
|
|
}
|