/* orxonox - the future of 3D-vertical-scrollers Copyright (C) 2004 orx This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. ### File Specific: main-programmer: Benjamin Grauer co-programmer: ... */ #include "framework.h" #include "physics_engine.h" #include "particle_engine.h" #include "p_node.h" #include "null_parent.h" #include "state.h" #include "debug.h" #include "graphics_engine.h" #include "light.h" #include "resource_manager.h" #include "camera.h" int verbose; void Framework::initModule() { // Creating a Test Particle System ParticleSystem* system = new ParticleSystem(100000, PARTICLE_SPRITE); system->setLifeSpan(5); system->setConserve(.999); system->setRadius(4, 3, 1, 2); system->setColor(.5,0,0,.5, 1,1,0,1, 0,0,0,0); // Creating a Test Particle Emitter ParticleEmitter* emitter = new ParticleEmitter(Vector(0 , 1, 0), M_PI_4, 20, .1); emitter->setType(EMITTER_DOT ); emitter->setSize(0); emitter->setRelCoor(Vector(0,0,0)); // Add the Flow from the Emitter into the System ParticleEngine::getInstance()->addConnection(emitter, system); } bool Framework::mainLoop() { while(true) { // keyhandler returns false if sdl gets quit by some event if (!this->keyHandler()) return false; // tick the scene float dt = this->tick(); // Draw the scene this->draw(dt); } } bool Framework::draw(float dt) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); glLoadIdentity(); // Reset the view ParticleEngine::getInstance()->draw(dt); camera->apply(); SDL_GL_SwapBuffers(); // Swap the buffers } float Framework::tick() { currFrame = SDL_GetTicks(); float dt = (float)(currFrame - lastFrame) / 1000.0; lastFrame = currFrame; ParticleEngine::getInstance()->tick(dt); NullParent::getInstance()->update(dt); return dt; } bool Framework::keyHandler() { // This is the main loop for the entire program and it will run until done==TRUE { // And poll for events SDL_Event event; while(SDL_PollEvent(&event)) { switch (event.type) { case SDL_MOUSEMOTION: { Vector view = camera->getTarget()->getAbsCoor() - camera->getAbsCoor(); Vector up = Vector(0, 1, 0); up = camera->getAbsDir().apply(up); Vector h = up.cross(view); Vector v = h.cross(view); h.normalize(); v.normalize(); if (mouseDown[1]) camera->setRelCoor(camera->getRelCoor()+ h * event.motion.xrel *.05 - v * event.motion.yrel * .05); if (mouseDown[3]) camera->getTarget()->setRelCoor(camera->getTarget()->getRelCoor()+ h * event.motion.xrel *.05 - v * event.motion.yrel * .05); } break; case SDL_MOUSEBUTTONDOWN: switch (event.button.button) { case 4: PRINTF(4)("MouseWheel up\n"); camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1); break; case 5: PRINTF(4)("MouseWheel down\n"); camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1); break; case 1: case 2: case 3: mouseDown[event.button.button] = true; break; } break; case SDL_MOUSEBUTTONUP: switch (event.button.button) { case 1: case 2: case 3: mouseDown[event.button.button] = false; break; } break; case SDL_VIDEORESIZE: GraphicsEngine::getInstance()->resolutionChanged(&event.resize); break; case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_x: break; case SDLK_c: break; case SDLK_i: ParticleEngine::getInstance()->debug(); break; case SDLK_a: camera->setRelCoor(camera->getRelCoor() + (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1); break; case SDLK_z: camera->setRelCoor(camera->getRelCoor() - (camera->getTarget()->getAbsCoor() - camera->getAbsCoor())*.1); break; case SDLK_h: this->printHelp(); break; case SDLK_1: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setEmissionRate(tmpEmit->getEmissionRate() +1.0); PRINT(3)("emissionRate set to %f\n", tmpEmit->getEmissionRate()); } } break; case SDLK_2: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setEmissionRate(tmpEmit->getEmissionRate() -1.0); PRINT(3)("emissionRate set to %f\n", tmpEmit->getEmissionRate()); } } break; case SDLK_3: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setEmissionVelocity(tmpEmit->getEmissionVelocity() -.01); PRINT(3)("emissionVelocity set to %f\n", tmpEmit->getEmissionVelocity()); } } break; case SDLK_4: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setEmissionVelocity(tmpEmit->getEmissionVelocity() + .01); PRINT(3)("emissionVelocity set to %f\n", tmpEmit->getEmissionVelocity()); } } break; case SDLK_5: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setSpread(tmpEmit->getSpread() +.1); PRINT(3)("emissionSpreadAngle set to %f\n", tmpEmit->getSpread()); } } break; case SDLK_6: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setSpread(tmpEmit->getSpread() -.1); PRINT(3)("emissionSpreadAngle set to %f\n", tmpEmit->getSpread()); } } break; case SDLK_7: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setSize(tmpEmit->getSize() - 1.0); PRINT(3)("EmitterSize set to %f\n", tmpEmit->getSize()); } } break; case SDLK_8: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { tmpEmit->setSize(tmpEmit->getSize() +1.0); PRINT(3)("EmitterSize set to %f\n", tmpEmit->getSize()); } } break; case SDLK_9: { ParticleEmitter* tmpEmit = ParticleEngine::getInstance()->getEmitterByNumber(1); if (tmpEmit) { if (tmpEmit->getType() == EMITTER_DOT) tmpEmit->setType(EMITTER_PLANE); else if (tmpEmit->getType() == EMITTER_PLANE) tmpEmit->setType(EMITTER_CUBE); else if (tmpEmit->getType() == EMITTER_CUBE) tmpEmit->setType(EMITTER_DOT); PRINT(3)("EmitterType set to %d\n", tmpEmit->getType()); } } break; } break; // If a quit event was recieved case SDL_QUIT: // then we're done and we'll end this program return false; break; default: break; } } // Get the state of the keyboard keys keys = SDL_GetKeyState(NULL); // and check if ESCAPE has been pressed. If so then quit if(keys[SDLK_ESCAPE]) return false; } return true; } Framework::Framework() { this->lastFrame = 0; // Create a new OpenGL window with the title "Cone3D Basecode" at // 640x480x32, fullscreen and check for errors along the way GraphicsEngine::getInstance(); LightManager::getInstance(); glEnable(GL_TEXTURE_2D); // Build the font from a TGA image font.tga in the data directory // Hide the mouse cursor SDL_ShowCursor(2); for (int i = 0; i setDataDir(DATA_DIRECTORY); initModule(); camera = new Camera(); State::getInstance()->setCamera(camera, camera->getTarget()); camera->setAbsCoor(Vector(10, 10, 0)); } Framework::~Framework() { delete GraphicsEngine::getInstance(); } void Framework::printHelp(void) const { PRINT(0)(" Help for the frameWork\n"); PRINT(0)("========================\n"); PRINT(0)("h - print thisHelp\n"); PRINT(0)("i - state Information\n\n"); PRINT(0)("Emitter Properties\n"); PRINT(0)("1,2 - increase/decrease emissionRate\n"); PRINT(0)("3,4 - increase/decrease emission velocity\n"); PRINT(0)("5,6 - increase/decrease spread angle\n"); PRINT(0)("7,8 - increase-decrease emitter-size\n"); PRINT(0)("9 - swap emitterType\n"); PRINT(0)("\n"); } int main(int argc, char *argv[]) { verbose = 3; Framework* framework = new Framework(); framework->mainLoop(); delete framework; // Kill the GL & SDL screens // And quit return 0; }