Added movement controls
This commit is contained in:
parent
d9f44af7ae
commit
a407f8b9ed
5 changed files with 62 additions and 32 deletions
|
@ -2,7 +2,6 @@ uniform sampler2D tex;
|
|||
|
||||
varying vec4 diffuse, ambientGlobal, ambient;
|
||||
varying vec3 normal, pos;
|
||||
/*varying vec3 normal, lightVector, reflectVector, eyeVector;*/
|
||||
|
||||
|
||||
void main() {
|
||||
|
|
|
@ -1,22 +1,14 @@
|
|||
varying vec4 diffuse, ambientGlobal, ambient;
|
||||
varying vec3 normal, pos;
|
||||
/*varying vec3 normal, lightVector, reflectVector, eyeVector;*/
|
||||
|
||||
|
||||
void main() {
|
||||
normal = normalize(gl_NormalMatrix * gl_Normal);
|
||||
|
||||
pos = vec3(gl_ModelViewMatrix * gl_Vertex);
|
||||
/*lightVector = vec3(gl_LightSource[0].position - ecPos);
|
||||
|
||||
reflectVector = normalize(reflect(-lightVector, normal));
|
||||
eyeVector = vec3(-ecPos);*/
|
||||
|
||||
/* Compute the diffuse, ambient and globalAmbient terms */
|
||||
diffuse = gl_FrontMaterial.diffuse * gl_LightSource[0].diffuse;
|
||||
|
||||
/* The ambient terms have been separated since one of them */
|
||||
/* suffers attenuation */
|
||||
ambient = gl_FrontMaterial.ambient * gl_LightSource[0].ambient;
|
||||
ambientGlobal = gl_LightModel.ambient * gl_FrontMaterial.ambient;
|
||||
|
||||
|
|
44
src/Game.cpp
44
src/Game.cpp
|
@ -27,7 +27,8 @@
|
|||
|
||||
namespace Zoom {
|
||||
|
||||
Game::Game(bool multisample) : angle(0), lightPos(0) {
|
||||
Game::Game(bool multisample) : playerPos(vmml::vec3f::ZERO), playerRot(vmml::mat4f::IDENTITY),
|
||||
input(NONE), lightPos(0) {
|
||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||
glClearDepth(1.0);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
@ -41,14 +42,12 @@ Game::Game(bool multisample) : angle(0), lightPos(0) {
|
|||
glEnable(GL_MULTISAMPLE_ARB);
|
||||
#endif
|
||||
|
||||
glShadeModel(GL_SMOOTH);
|
||||
|
||||
glEnable(GL_LIGHTING);
|
||||
glLightfv(GL_LIGHT0, GL_AMBIENT, vmml::vec4f::ZERO.array);
|
||||
glLightfv(GL_LIGHT0, GL_DIFFUSE, vmml::vec4f::ONE.array);
|
||||
glLightfv(GL_LIGHT0, GL_SPECULAR, vmml::vec4f::ONE.array);
|
||||
glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0);
|
||||
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.3);
|
||||
glLightf(GL_LIGHT0, GL_QUADRATIC_ATTENUATION, 0.2);
|
||||
glEnable(GL_LIGHT0);
|
||||
|
||||
glEnable(GL_COLOR_MATERIAL);
|
||||
|
@ -62,6 +61,8 @@ Game::Game(bool multisample) : angle(0), lightPos(0) {
|
|||
|
||||
Shader::loadProgram("default.vert", "default.frag");
|
||||
|
||||
playerRot.rotate_y(M_PI/6);
|
||||
|
||||
loadLevel("level.xml");
|
||||
triangles.insert(triangles.end(), level->getRooms().front().walls.begin(), level->getRooms().front().walls.end());
|
||||
std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter());
|
||||
|
@ -74,13 +75,21 @@ bool Game::loadLevel(const std::string &name) {
|
|||
}
|
||||
|
||||
void Game::run(int delta) {
|
||||
angle += delta*0.01;
|
||||
|
||||
if(angle >= 360)
|
||||
angle -= 360;
|
||||
|
||||
lightPos += delta;
|
||||
lightPos %= 24000;
|
||||
|
||||
if(input & FORWARD) {
|
||||
playerPos -= playerRot*vmml::vec3f::UNIT_Z*0.01*delta;
|
||||
}
|
||||
if(input & BACKWARD) {
|
||||
playerPos += playerRot*vmml::vec3f::UNIT_Z*0.01*delta;
|
||||
}
|
||||
if(input & LEFT) {
|
||||
playerPos -= playerRot*vmml::vec3f::UNIT_X*0.01*delta;
|
||||
}
|
||||
if(input & RIGHT) {
|
||||
playerPos += playerRot*vmml::vec3f::UNIT_X*0.01*delta;
|
||||
}
|
||||
}
|
||||
|
||||
void Game::render() {
|
||||
|
@ -107,23 +116,16 @@ void Game::render() {
|
|||
light[2] = -8.0;
|
||||
}
|
||||
|
||||
/*std::vector<BSPTree::TriangleRecord> triangles(level->getRooms().front().walls.begin(),
|
||||
level->getRooms().front().walls.end());
|
||||
std::sort(triangles.begin(), triangles.end(), Renderer::TextureSorter());*/
|
||||
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
glPushMatrix();
|
||||
glRotatef(15, 1, 2, 1);
|
||||
/*glRotatef(5*angle, 0, -1, 2);
|
||||
glRotatef(7*angle, 2, -1, 0);
|
||||
glRotatef(11*angle, 2, -1, 2);*/
|
||||
vmml::mat4f transform(playerRot), inverse;
|
||||
transform.set_translation(playerPos);
|
||||
transform.inverse(inverse);
|
||||
|
||||
glLoadMatrixf(inverse.array);
|
||||
|
||||
glLightfv(GL_LIGHT0, GL_POSITION, light);
|
||||
//renderer.render(std::list<BSPTree::TriangleRecord>(triangles.begin(), triangles.end()));
|
||||
renderer.render(triangles);
|
||||
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
18
src/Game.h
18
src/Game.h
|
@ -31,10 +31,22 @@ class Triangle;
|
|||
|
||||
class Game {
|
||||
public:
|
||||
enum Input {
|
||||
NONE = 0,
|
||||
FORWARD = (1 << 0),
|
||||
BACKWARD = (1 << 1),
|
||||
LEFT = (1 << 2),
|
||||
RIGHT = (1 << 3)
|
||||
};
|
||||
|
||||
Game(bool multisample);
|
||||
|
||||
bool loadLevel(const std::string &name);
|
||||
|
||||
void setInput(unsigned input) {
|
||||
this->input = static_cast<Input>(input);
|
||||
}
|
||||
|
||||
void run(int delta);
|
||||
void render();
|
||||
|
||||
|
@ -44,7 +56,11 @@ class Game {
|
|||
boost::shared_ptr<Level> level;
|
||||
std::vector<BSPTree::TriangleRecord> triangles;
|
||||
|
||||
float angle;
|
||||
vmml::vec3f playerPos;
|
||||
vmml::mat4f playerRot;
|
||||
|
||||
Input input;
|
||||
|
||||
int lightPos;
|
||||
};
|
||||
|
||||
|
|
23
src/zoom.cpp
23
src/zoom.cpp
|
@ -272,7 +272,7 @@ bool GLXinit(Display *disp, Atom windele, Window *wnd, GLXContext *gc, bool *mul
|
|||
XSetWindowAttributes swa;
|
||||
swa.colormap = cmap;
|
||||
swa.border_pixel = 0;
|
||||
swa.event_mask = StructureNotifyMask/* | PointerMotionMask | KeyPressMask | KeyReleaseMask | ButtonPressMask | ButtonReleaseMask*/;
|
||||
swa.event_mask = StructureNotifyMask | KeyPressMask | KeyReleaseMask/* | PointerMotionMask | ButtonPressMask | ButtonReleaseMask*/;
|
||||
|
||||
*wnd = XCreateWindow(disp, RootWindow(disp, vi->screen), 0, 0, DEFAULT_WIDTH, DEFAULT_HEIGHT, 0, vi->depth, InputOutput,
|
||||
vi->visual, CWBorderPixel|CWColormap|CWEventMask, &swa);
|
||||
|
@ -336,6 +336,7 @@ int main() {
|
|||
|
||||
unsigned long delta = 0;
|
||||
unsigned long frames = 0, tocks = 0;
|
||||
unsigned input = 0;
|
||||
|
||||
struct timeval tv;
|
||||
gettimeofday(&tv, NULL);
|
||||
|
@ -353,11 +354,31 @@ int main() {
|
|||
case ClientMessage:
|
||||
if(static_cast<Atom>(event.xclient.data.l[0]) == windele)
|
||||
running = false;
|
||||
break;
|
||||
|
||||
case KeyPress:
|
||||
switch(XKeycodeToKeysym(disp, event.xkey.keycode, 0)) {
|
||||
case XK_Up: case XK_w: input |= Zoom::Game::FORWARD; break;
|
||||
case XK_Down: case XK_s: input |= Zoom::Game::BACKWARD; break;
|
||||
case XK_Left: case XK_a: input |= Zoom::Game::LEFT; break;
|
||||
case XK_Right: case XK_d: input |= Zoom::Game::RIGHT; break;
|
||||
case XK_Escape: running = false; break;
|
||||
}
|
||||
break;
|
||||
|
||||
case KeyRelease:
|
||||
switch(XKeycodeToKeysym(disp, event.xkey.keycode, 0)) {
|
||||
case XK_Up: case XK_w: input &= ~Zoom::Game::FORWARD; break;
|
||||
case XK_Down: case XK_s: input &= ~Zoom::Game::BACKWARD; break;
|
||||
case XK_Left: case XK_a: input &= ~Zoom::Game::LEFT; break;
|
||||
case XK_Right: case XK_d: input &= ~Zoom::Game::RIGHT; break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(!running) break;
|
||||
|
||||
game.setInput(input);
|
||||
game.run(delta);
|
||||
|
||||
game.render();
|
||||
|
|
Reference in a new issue