summaryrefslogtreecommitdiff
path: root/main.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'main.cpp')
-rw-r--r--main.cpp307
1 files changed, 4 insertions, 303 deletions
diff --git a/main.cpp b/main.cpp
index b068cd5..65d94de 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,52 +1,8 @@
#include "video.h"
#include "scene.h"
-#include "vector.h"
-#include "quadtree.h"
-#include "shader.h"
-
-#include <SDL_image.h>
-#include <FTGL/ftgl.h>
-#include <boost/format.hpp>
-#include <boost/shared_ptr.hpp>
#include "gl.h"
-#include <iostream>
-#include <cmath>
-#include <list>
-#include <vector>
-#include <map>
-#include <queue>
-
-FTFont *font;
-
-GLuint load_texture(const std::string filename) {
- GLuint texture;
- SDL_Surface *surface = IMG_Load(filename.c_str());
- SDL_Surface *image = SDL_CreateRGBSurface(SDL_SWSURFACE, surface->w, surface->h, 32,
- 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000);
- SDL_Rect area;
- area.x = area.y = 0;
- area.w = surface->w;
- area.h = surface->h;
- SDL_BlitSurface(surface, &area, image, &area);
- glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
- glGenTextures(1, &texture);
- glBindTexture(GL_TEXTURE_2D, texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- if(image->format->Amask) {
- gluBuild2DMipmaps(GL_TEXTURE_2D, 4, image->w, image->h, GL_RGBA, GL_UNSIGNED_BYTE, image->pixels);
- } else {
- gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->w, image->h, GL_RGB, GL_UNSIGNED_BYTE, image->pixels);
- }
- SDL_FreeSurface(surface);
- SDL_FreeSurface(image);
-
- return texture;
-}
-
-
int main(int argc, char **argv) {
video::width = 1280;
video::height = 720;
@@ -54,269 +10,14 @@ int main(int argc, char **argv) {
Scene scene;
- GLShaderProgram program;
- GLVertexShader terrain_vertex("shaders/terrain_vertex.glsl");
- GLFragmentShader terrain_fragment("shaders/terrain_fragment.glsl");
- program.attach(terrain_vertex);
- program.attach(terrain_fragment);
- program.link();
-
- {
- program.use();
- GLint tex1loc = glGetUniformLocation(program.get_program(), "tex[1]");
- glUniform1i(tex1loc, 1);
- GLint tex2loc = glGetUniformLocation(program.get_program(), "tex[2]");
- glUniform1i(tex2loc, 2);
- glUseProgram(0);
- }
-
- font = new FTTextureFont("font.ttf");
- font->FaceSize(10);
-
- GLuint grass_texture = load_texture("textures/Grass0073_3_S.jpg");
- GLuint rock_texture = load_texture("textures/RockJagged0010_2_S.jpg");
- GLuint soil_texture = load_texture("textures/SoilSand0168_9_S.jpg");
-
//SDL_WM_GrabInput(SDL_GRAB_ON);
- SDL_Event event;
- bool running = true;
- bool grid = false;
- bool terrain = true;
- bool gravity = true;
SDL_WarpMouse(video::width/2, video::height/2);
- unsigned int last_time = SDL_GetTicks();
- Vector3 selected;
- Quadtree::QuadNode *node;
- Quadtree::QuadNode *last_node = NULL;
+ scene.last_time = SDL_GetTicks();
scene.update();
- while(running) {
- unsigned int time = SDL_GetTicks();
- unsigned int steps = time - last_time + 1;
- last_time = time;
- bool do_select = 0;
- int sx, sy;
- while(SDL_PollEvent(&event)) {
- switch(event.type) {
- case SDL_QUIT:
- running = false;
- break;
- case SDL_KEYDOWN:
- switch(event.key.keysym.sym) {
- case SDLK_ESCAPE:
- running = false;
- break;
- case SDLK_g:
- grid = !grid;
- break;
- case SDLK_t:
- terrain = !terrain;
- break;
- case SDLK_SPACE:
- scene.yvel = .05;
- break;
- case SDLK_h:
- gravity = !gravity;
- break;
- case SDLK_u:
- scene.update();
- break;
- default:
- break;
- }
- break;
- case SDL_MOUSEBUTTONUP:
- switch(event.button.button) {
- case SDL_BUTTON_LEFT:
- sx = event.button.x;
- sy = event.button.y;
- do_select = true;
- // TODO: reimplement selection
- break;
- case SDL_BUTTON_WHEELUP:
- case SDL_BUTTON_WHEELDOWN:
- // TODO: reimplement?
- break;
- }
- case SDL_MOUSEMOTION:
- if(event.motion.x == video::width/2 && event.motion.y == video::height/2)
- break;
- scene.yaw += (float)event.motion.xrel / 500;
- scene.pitch += (float)event.motion.yrel / 500;
- if(scene.yaw > 2*M_PI)
- scene.yaw -= 2*M_PI;
- else if(scene.yaw < 0)
- scene.yaw += 2*M_PI;
- if(scene.pitch > M_PI)
- scene.pitch = M_PI;
- else if(scene.pitch < 0)
- scene.pitch = 0;
- SDL_WarpMouse(video::width/2, video::height/2);
- break;
- }
- }
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glLoadIdentity();
- video::persp();
-
- unsigned char *keystate = SDL_GetKeyState(NULL);
- float forward = 0;
- float right = 0;
- bool moved = false;
- if(keystate[SDLK_w]) {
- moved = true;
- forward++;
- }
- if(keystate[SDLK_s]) {
- moved = true;
- forward--;
- }
- if(keystate[SDLK_a]) {
- moved = true;
- right--;
- }
- if(keystate[SDLK_d]) {
- moved = true;
- right++;
- }
- if(keystate[SDLK_q])
- scene.pos.y -= 0.002*steps*(keystate[SDLK_LSHIFT]?10:1);
- if(keystate[SDLK_e])
- scene.pos.y += 0.002*steps*(keystate[SDLK_LSHIFT]?10:1);
- if(moved && (forward || right)) {
- scene.move(forward, right, steps*(keystate[SDLK_LSHIFT]?10:1));
- }
-
- std::string move_str;
- Quadtree::QuadNode *node = scene.qt->find(scene.pos.x, scene.pos.z);
- if(node) {
- if(gravity) {
- float y = node->get_height(scene.pos.x, scene.pos.z);
- if(scene.pos.y > y && !keystate[SDLK_e])
- scene.yvel -= 9.81 * steps / 85000;
- if(scene.yvel < -.5)
- scene.yvel = -.5;
- scene.pos.y += scene.yvel * steps;
- if(scene.pos.y < y) {
- scene.pos.y = y;
- scene.yvel = 0;
- }
- }
- move_str = (boost::format("%s %.2f,%.2f %.2fx%.2f") % scene.pos.str() % node->x % node->y % node->width % node->height).str();
-
- if(last_node != node) {
- last_node = node;
- scene.update();
- }
- }
-
- scene.lookat();
-
- //glEnable(GL_LIGHTING);
- const float light_pos[4] = {50, 100, 50, 1};
- //const float light_pos[4] = {0, 1, 0, 0};
- //glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
-
- unsigned int chunks_rendered = 0;
- if(terrain) {
- program.use();
- glEnable(GL_TEXTURE_2D);
-
- glActiveTexture(GL_TEXTURE0);
- glBindTexture(GL_TEXTURE_2D, grass_texture);
-
- glActiveTexture(GL_TEXTURE1);
- glBindTexture(GL_TEXTURE_2D, rock_texture);
-
- glActiveTexture(GL_TEXTURE2);
- glBindTexture(GL_TEXTURE_2D, soil_texture);
-
- std::queue<Quadtree::QuadChunk*> q;
- q.push(scene.qt->root);
- while(!q.empty()) {
- Quadtree::QuadChunk *chunk = q.front();
- q.pop();
- if(!chunk->nodes) {
- for(int i = 0; i < 4; i++)
- q.push(chunk->children[i]);
- continue;
- } else if(!chunk->vbo_object)
- continue;
- chunks_rendered++;
- glBindBuffer(GL_ARRAY_BUFFER, chunk->vbo_object);
- glVertexPointer(3, GL_FLOAT, 0, NULL);
- glNormalPointer(GL_FLOAT, 0, (GLvoid*)(chunk->vertices*3*sizeof(float)));
- glTexCoordPointer(2, GL_FLOAT, 0, (GLvoid*)(chunk->vertices*3*sizeof(float)*2));
- glEnableClientState(GL_VERTEX_ARRAY);
- glEnableClientState(GL_NORMAL_ARRAY);
- glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- glDrawArrays(GL_TRIANGLES, 0, chunk->vertices);
- glDisableClientState(GL_VERTEX_ARRAY);
- glDisableClientState(GL_NORMAL_ARRAY);
- glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- }
- glDisable(GL_TEXTURE_2D);
- // set active to texture0 to avoid breaking the texture font
- glActiveTexture(GL_TEXTURE0);
- glUseProgram(0);
- }
- if(grid) {
- if(terrain)
- glColor3f(0, 0, 0);
- else
- glColor3f(1, 1, 1);
- std::queue<Quadtree::QuadChunk*> q;
- q.push(scene.qt->root);
- while(!q.empty()) {
- Quadtree::QuadChunk *chunk = q.front();
- q.pop();
- if(!chunk->nodes) {
- for(int i = 0; i < 4; i++)
- q.push(chunk->children[i]);
- continue;
- } else if(chunk->vbo_object) {
- for(unsigned int i = 0; i < chunk->node_count; i++)
- chunk->nodes[i]->draw_grid();
- }
- }
- }
-
- //glDisable(GL_LIGHTING);
-
- float px, py, pz;
- if(do_select && scene.select(sx, sy, px, py, pz)) {
- selected = Vector3(px, py, pz);
- }
- glColor3f(1, 0, 0);
- glBegin(GL_TRIANGLE_FAN);
- glVertex3f(selected.x, selected.y, selected.z);
- glVertex3f(selected.x+.5, selected.y+1, selected.z-.5);
- glVertex3f(selected.x+.5, selected.y+1, selected.z+.5);
- glVertex3f(selected.x-.5, selected.y+1, selected.z+.5);
- glVertex3f(selected.x-.5, selected.y+1, selected.z-.5);
- glVertex3f(selected.x+.5, selected.y+1, selected.z-.5);
- glEnd();
-
- video::ortho();
- float height = font->LineHeight();
- glColor3f(1, 1, 1);
- glTranslatef(0, video::height-height, 0);
- font->Render((boost::format("%dx%d chunks: %d steps: %d")
- % scene.qt->width % scene.qt->height % chunks_rendered % steps).str().c_str());
- //font->Render((boost::format("%dx%d %d levels %d nodes tree creation time: %f steps: %d update: %d")
- // % scene.qt->width % scene.qt->height % scene.qt->levels % scene.qt->nodes % scene.qt->init_time % steps % scene.qt->thread_running).str().c_str());
- //glTranslatef(0, height, 0);
- //font->Render((boost::format("selected: %x") % selected).str().c_str());
- glTranslatef(0, -height, 0);
- font->Render(move_str.c_str());
- /*if(selected) {
- glTranslatef(0, height, 0);
- //font->Render((boost::format("(%s %s %s %s)") % selected->a->str() % selected->b->str() % selected->c->str() % selected->d->str()).str().c_str());
- font->Render(selected->str().c_str());
- }*/
-
- SDL_GL_SwapBuffers();
+ while(scene.running) {
+ scene.events();
+ scene.render();
SDL_Delay(1);
}