void testConstructor() { buildGLContext(); FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); CPPUNIT_ASSERT( textureFont->Error() == 0); CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); }
void testDisplayList() { buildGLContext(); FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); textureFont->FaceSize(18); int glList = glGenLists(1); glNewList( glList, GL_COMPILE); textureFont->Render(GOOD_ASCII_TEST_STRING); glEndList(); CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); }
// Load FtglTextureFont void FtglTextureFont::loadFont() { if (isLoaded()) return; // Check for required parameters if( filename() == nullptr ) { if (isMessageEnabled(MSG_ERROR)) { std::cerr << "No ttf file" << std::endl; } return; } // Generate filename const size_t FONTPATHNAME_LENGTH = 256; char fontPathname[FONTPATHNAME_LENGTH]; if (fontDirectory() != nullptr) lcStrcpy(fontPathname, FONTPATHNAME_LENGTH, fontDirectory()); else lcStrcpy(fontPathname, FONTPATHNAME_LENGTH, "./"); lcStrcat(fontPathname, FONTPATHNAME_LENGTH, filename()); FTGLTextureFont* ftglFont = new FTGLTextureFont(fontPathname); if (ftglFont != nullptr && !ftglFont->Error()) { // set the face size and return the pointer, then tell our base class that we have a loaded font ftglFont->FaceSize(getFaceSize()); ftgl(ftglFont); setFontLoaded(); } else { if (isMessageEnabled(MSG_ERROR)) { std::cerr << "FtglTextureFont::loadFont() - font did not load correctly: file: \""; std::cerr << fontPathname << "\""; std::cerr << std::endl; } std::exit(1); } }
void testResizeBug() { buildGLContext(); FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); CPPUNIT_ASSERT( textureFont->Error() == 0); textureFont->FaceSize(18); textureFont->Render("first"); textureFont->FaceSize(38); textureFont->Render("second"); CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); }
void testRender() { buildGLContext(); FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE); textureFont->Render(GOOD_ASCII_TEST_STRING); CPPUNIT_ASSERT( textureFont->Error() == 0x97); // Invalid pixels per em CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); textureFont->FaceSize(18); textureFont->Render(GOOD_ASCII_TEST_STRING); CPPUNIT_ASSERT( textureFont->Error() == 0); CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR); }
// Main function int main(int argc, char *argv[]) { SDL_Event event; // inits SDL SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetCaption("SPARK Tutorial 1",NULL); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); // vsync SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,0); SDL_SetVideoMode(0,0,32,SDL_OPENGL | SDL_FULLSCREEN); SDL_ShowCursor(0); SDL_Surface screen = *SDL_GetVideoSurface(); renderFirstFrame(); // inits openGL screenWidth = screen.w; screenHeight = screen.h; screenRatio = (float)screen.w / (float)screen.h; glClearColor(0.0f,0.0f,0.0f,1.0f); glViewport(0,0,screen.w,screen.h); // Loads texture font FTGLTextureFont font = FTGLTextureFont("res/font.ttf"); if(font.Error()) return 1; font.FaceSize(24); fontPtr = &font; // Loads particle texture GLuint textureParticle; if (!loadTexture(textureParticle,"res/flare.bmp",GL_ALPHA,GL_CLAMP,false)) return 1; // random seed SPK::randomSeed = static_cast<unsigned int>(time(NULL)); // Sets the update step SPK::System::setClampStep(true,0.1f); // clamp the step to 100 ms SPK::System::useAdaptiveStep(0.001f,0.01f); // use an adaptive step from 1ms to 10ms (1000fps to 100fps) // creates the base system BaseSystemID = createParticleSystemBase(textureParticle); bool exit = false; bool paused = false; cout << "\nSPARK FACTORY AFTER INIT :" << endl; SPK::SPKFactory::getInstance().traceAll(); SDL_Delay(3000); while (SDL_PollEvent(&event)) {} std::deque<unsigned int> frameFPS; frameFPS.push_back(SDL_GetTicks()); float spacePressed = -1.0f; while(!exit) { while (SDL_PollEvent(&event)) { // if space is pressed, a new system is added if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_SPACE)) { spacePressed = 200.0f; } if ((event.type == SDL_KEYUP)&&(event.key.keysym.sym == SDLK_SPACE)) { spacePressed = -1.0f; } // if esc is pressed, exit if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_ESCAPE)) exit = true; // if F1 is pressed, we display or not the text if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F1)) { --drawText; if (drawText < 0) drawText = 2; } // if pause is pressed, the system is paused if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_PAUSE)) paused = !paused; // Moves the camera with the mouse if (event.type == SDL_MOUSEMOTION) angleY += event.motion.xrel * 0.05f; // Zoom in and out if (event.type == SDL_MOUSEBUTTONDOWN) { if (event.button.button == SDL_BUTTON_WHEELDOWN) camPosZ = min(10.0f,camPosZ + 0.5f); if (event.button.button == SDL_BUTTON_WHEELUP) camPosZ = max(0.5f,camPosZ - 0.5f); } } if (!paused) { // if space is pressed, a new system is added if (spacePressed >= 0.0f) { spacePressed += deltaTime; if (spacePressed >= 200.0f) { SPK::Vector3D color(SPK::random(0.0f,360.0f),0.8f,1.0f); SPK::Vector3D position(SPK::random(-2.0f,2.0f),SPK::random(-2.0f,2.0f),SPK::random(-2.0f,2.0f)); particleSystems.push_back(createParticleSystem(position,convertHSV2RGB(color))); spacePressed = 0.0f; } } deque<SPK::System*>::iterator it = particleSystems.begin(); while(it != particleSystems.end()) { // Updates the particle systems if (!(*it)->update(deltaTime * 0.001f)) { // If a system is sleeping, destroys it destroyParticleSystem(*it); // And erases its entry in the container it = particleSystems.erase(it); } else ++it; } } // Renders scene render(); // Computes delta time int time = SDL_GetTicks(); deltaTime = time - frameFPS.back(); frameFPS.push_back(time); while((frameFPS.back() - frameFPS.front() > 1000)&&(frameFPS.size() > 2)) frameFPS.pop_front(); // Updates info strings unsigned int nbParticles = 0; for (deque<SPK::System*>::const_iterator it = particleSystems.begin(); it != particleSystems.end(); ++it) nbParticles += (*it)->getNbParticles(); strNbParticles = STR_NB_PARTICLES + int2Str(nbParticles); int fps = static_cast<int>(((frameFPS.size() - 1) * 1000.0f) / (frameFPS.back() - frameFPS.front())); if (drawText == 2) strFps = STR_FPS + int2Str(fps); else strFps = int2Str(fps); } cout << "\nSPARK FACTORY BEFORE DESTRUCTION :" << endl; SPK::SPKFactory::getInstance().traceAll(); SPK::SPKFactory::getInstance().destroyAll(); cout << "\nSPARK FACTORY AFTER DESTRUCTION :" << endl; SPK::SPKFactory::getInstance().traceAll(); SDL_Quit(); cout << endl; system("pause"); // Waits for the user to close the console return 0; }
// Main function int main(int argc, char *argv[]) { #if defined(DEBUG) | defined(_DEBUG) _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF ); #endif return 0; // random seed randomSeed = static_cast<unsigned int>(time(NULL)); // Sets the update step System::setClampStep(true,0.1f); // clamp the step to 100 ms System::useAdaptiveStep(0.001f,0.01f); // use an adaptive step from 1ms to 10ms (1000fps to 100fps) SDL_Event event; // inits SDL SDL_Init(SDL_INIT_VIDEO); //SDL_WM_SetCaption("SPARK Basic Demo",NULL); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); // double buffering // vsync //+SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,0); //+SDL_SetVideoMode(0,0,32, SDL_OPENGL | SDL_FULLSCREEN); SDL_ShowCursor(0); //+SDL_Surface screen = *SDL_GetVideoSurface(); screenWidth = 640; screenHeight = 480; SDL_Window* window = SDL_CreateWindow("OpenGL Window", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, screenWidth, screenHeight, SDL_WINDOW_OPENGL | SDL_WINDOW_FULLSCREEN); renderFirstFrame(); // inits openGL screenRatio = (float)screenWidth / (float)screenHeight; glClearColor(0.0f,0.0f,0.0f,1.0f); glViewport(0,0,screenWidth,screenHeight); // Loads texture font FTGLTextureFont font = FTGLTextureFont("res/font.ttf"); if(font.Error()) return 1; font.FaceSize(24); fontPtr = &font; // Loads particle texture GLuint textureParticle; if (!loadTexture(textureParticle,"res/point.bmp",GL_ALPHA,/*GL_CLAMP*/GL_CLAMP_TO_EDGE,false)) return 1; // Inits Particle Engine Vector3D gravity(0.0f,-0.8f,0.0f); // Renderers GLPointRenderer* basicRenderer = GLPointRenderer::create(); GLRenderer* particleRenderer = NULL; // We use pointSprites only if it is available and if the GL extension point parameter is available if ((GLPointRenderer::loadGLExtPointSprite())&&(GLPointRenderer::loadGLExtPointParameter())) { GLPointRenderer* pointRenderer = GLPointRenderer::create(); pointRenderer->setType(POINT_SPRITE); pointRenderer->setTexture(textureParticle); pointRenderer->setTextureBlending(GL_MODULATE); pointRenderer->enableWorldSize(true); GLPointRenderer::setPixelPerUnit(45.0f * PI / 180.f,screenHeight); pointRenderer->setSize(0.05f); particleRenderer = pointRenderer; } else // we use quads { GLQuadRenderer* quadRenderer = GLQuadRenderer::create(); quadRenderer->setTexturingMode(TEXTURE_2D); quadRenderer->setTexture(textureParticle); quadRenderer->setTextureBlending(GL_MODULATE); quadRenderer->setScale(0.05f,0.05f); particleRenderer = quadRenderer; } particleRenderer->setBlending(BLENDING_ADD); particleRenderer->enableRenderingHint(DEPTH_WRITE,false); // Model Model* particleModel = Model::create(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA); particleModel->setParam(PARAM_ALPHA,0.8f); // constant alpha particleModel->setLifeTime(8.0f,8.0f); // Emitter SphericEmitter* particleEmitter = SphericEmitter::create(Vector3D(0.0f,1.0f,0.0f),0.1f * PI,0.1f * PI); particleEmitter->setZone(Point::create(Vector3D(0.0f,0.015f,0.0f))); particleEmitter->setFlow(250); particleEmitter->setForce(1.5f,1.5f); // Obstacle Plane* groundPlane = Plane::create(); Obstacle* obstacle = Obstacle::create(groundPlane,INTERSECT_ZONE,0.6f,1.0f); // Group particleGroup = Group::create(particleModel,2100); particleGroup->addEmitter(particleEmitter); particleGroup->addModifier(obstacle); particleGroup->setRenderer(particleRenderer); particleGroup->setGravity(gravity); particleSystem = System::create(); particleSystem->addGroup(particleGroup); bool exit = false; bool paused = false; // renderValue : // 0 : normal // 1 : basic render // 2 : no render unsigned int renderValue = 0; float step = 0.0f; cout << "\nSPARK FACTORY AFTER INIT :" << endl; SPKFactory::getInstance().traceAll(); SDL_Delay(3000); while (SDL_PollEvent(&event)){} std::deque<unsigned int> frameFPS; frameFPS.push_back(SDL_GetTicks()); while(!exit) { while (SDL_PollEvent(&event)) { // if esc is pressed, exit if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_ESCAPE)) exit = true; // if del is pressed, reinit the system if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_DELETE)) particleSystem->empty(); // if F1 is pressed, we display or not the text if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F1)) { --drawText; if (drawText < 0) drawText = 2; } // if F2 is pressed, we display or not the bounding boxes if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F2)) { particleGroup->enableAABBComputing(!particleGroup->isAABBComputingEnabled()); if (paused) particleSystem->computeAABB(); } // if F4 is pressed, the renderers are changed if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F4)) { renderValue = (renderValue + 1) % 3; switch (renderValue) { case 0 : particleGroup->setRenderer(particleRenderer); break; case 1 : particleGroup->setRenderer(basicRenderer); break; case 2 : particleGroup->setRenderer(NULL); break; } } // if pause is pressed, the system is paused if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_PAUSE)) paused = !paused; // Moves the camera with the mouse if (event.type == SDL_MOUSEMOTION) { angleY += event.motion.xrel * 0.05f; angleX += event.motion.yrel * 0.05f; angleX = min(179.0f,max(1.0f,angleX)); // we cannot look under the ground } // Zoom in and out if (event.type == SDL_MOUSEBUTTONDOWN) { //if (event.button.button == SDL_BUTTON_WHEELDOWN) // camPosZ = min(10.0f,camPosZ + 0.5f); //if (event.button.button == SDL_BUTTON_WHEELUP) // camPosZ = max(0.5f,camPosZ - 0.5f); } } if (!paused) { // Changes the color of the model over time step += deltaTime * 0.0005f; particleModel->setParam(PARAM_RED,0.6f + 0.4f * sin(step)); particleModel->setParam(PARAM_GREEN,0.6f + 0.4f * sin(step + PI * 2.0f / 3.0f)); particleModel->setParam(PARAM_BLUE,0.6f + 0.4f * sin(step + PI * 4.0f / 3.0f)); // Updates particle system particleSystem->update(deltaTime * 0.001f); // 1 defined as a second } // Renders scene render(); // Computes delta time int time = SDL_GetTicks(); deltaTime = time - frameFPS.back(); frameFPS.push_back(time); while((frameFPS.back() - frameFPS.front() > 1000)&&(frameFPS.size() > 2)) frameFPS.pop_front(); // Updates info strings strNbParticles = STR_NB_PARTICLES + int2Str(particleSystem->getNbParticles()); int fps = static_cast<int>(((frameFPS.size() - 1) * 1000.0f) / (frameFPS.back() - frameFPS.front())); if (drawText == 2) strFps = STR_FPS + int2Str(fps); else strFps = int2Str(fps); } cout << "\nSPARK FACTORY BEFORE DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SPKFactory::getInstance().destroyAll(); cout << "\nSPARK FACTORY AFTER DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SPKFactory::destroyInstance(); SDL_Quit(); cout << endl; system("pause"); // Waits for the user to close the console return 0; }
// Main function int main(int argc, char *argv[]) { // random seed randomSeed = static_cast<unsigned int>(time(NULL)); // Sets the update step System::setClampStep(true,0.01f); // clamp the step to 10 ms System::useRealStep(); SDL_Event event; // inits SDL SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetCaption("SPARK Flakes Demo",NULL); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); // vsync SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,0); SDL_SetVideoMode(0,0,32,SDL_OPENGL | SDL_FULLSCREEN); SDL_ShowCursor(0); SDL_Surface screen = *SDL_GetVideoSurface(); renderFirstFrame(); // inits openGL screenWidth = screen.w; screenHeight = screen.h; screenRatio = (float)screen.w / (float)screen.h; glClearColor(0.0f,0.0f,0.0f,1.0f); glViewport(0,0,screen.w,screen.h); // Loads texture font FTGLTextureFont font = FTGLTextureFont("res/font.ttf"); if(font.Error()) return 1; font.FaceSize(24); fontPtr = &font; // Inits Particle Engine // Renderers GLPointRenderer* basicRenderer = GLPointRenderer::create(); GLPointRenderer* particleRenderer = GLPointRenderer::create(1.0f); particleRenderer->setBlending(BLENDING_ADD); particleRenderer->enableRenderingHint(DEPTH_TEST,false); // Model Model* particleModel = Model::create(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA); particleModel->setParam(PARAM_RED,1.0f); particleModel->setParam(PARAM_GREEN,0.8f); particleModel->setParam(PARAM_BLUE,0.3f); particleModel->setParam(PARAM_ALPHA,0.4f); particleModel->setImmortal(true); // Zone Sphere* sphere = Sphere::create(Vector3D(),1.0f); // Obstacle Obstacle* obstacle = Obstacle::create(sphere); obstacle->setFriction(0.9f); obstacle->setBouncingRatio(0.9f); // Group Vector3D gravity(0.0f,-0.5f,0.0f); particleGroup = Group::create(particleModel,NB_PARTICLES[NB_PARTICLES_SIZE - 1]); particleGroup->setRenderer(particleRenderer); particleGroup->setGravity(gravity); particleGroup->addModifier(obstacle); particleGroup->setFriction(0.2f); particleSystem = System::create(); particleSystem->addGroup(particleGroup); // Particles are added to the group particleGroup->addParticles(NB_PARTICLES[nbParticlesIndex],sphere,Vector3D()); particleGroup->flushAddedParticles(); bool exit = false; bool paused = false; // renderValue : // 0 : normal // 1 : basic render // 2 : no render unsigned int renderValue = 0; cout << "\nSPARK FACTORY AFTER INIT :" << endl; SPKFactory::getInstance().traceAll(); SDL_Delay(3000); while (SDL_PollEvent(&event)){} std::deque<unsigned int> frameFPS; frameFPS.push_back(SDL_GetTicks()); while(!exit) { while (SDL_PollEvent(&event)) { // if esc is pressed, exit if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_ESCAPE)) exit = true; // if del is pressed, reinit the system if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_DELETE)) particleSystem->empty(); // if F1 is pressed, we display or not the text if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F1)) { --drawText; if (drawText < 0) drawText = 2; } // if F2 is pressed, we display or not the bounding boxes if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F2)) { particleGroup->enableAABBComputing(!particleGroup->isAABBComputingEnabled()); if (paused) particleSystem->computeAABB(); } // if F4 is pressed, the renderers are changed if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F4)) { renderValue = (renderValue + 1) % 3; switch (renderValue) { case 0 : particleGroup->setRenderer(particleRenderer); break; case 1 : particleGroup->setRenderer(basicRenderer); break; case 2 : particleGroup->setRenderer(NULL); break; } } // if pause is pressed, the system is paused if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_PAUSE)) paused = !paused; if (!paused) { // if + is pressed, some particles are added if ((event.type == SDL_KEYDOWN)&&((event.key.keysym.sym == SDLK_PLUS)||(event.key.keysym.sym == SDLK_KP_PLUS))) { if (nbParticlesIndex < NB_PARTICLES_SIZE - 1) { ++nbParticlesIndex; particleGroup->addParticles(NB_PARTICLES[nbParticlesIndex] - NB_PARTICLES[nbParticlesIndex - 1],sphere,Vector3D()); } } // if - is pressed, some particles are removed if ((event.type == SDL_KEYDOWN)&&((event.key.keysym.sym == SDLK_MINUS)||(event.key.keysym.sym == SDLK_KP_MINUS))) { if (nbParticlesIndex > 0) { --nbParticlesIndex; for (unsigned int i = 0; i < NB_PARTICLES[nbParticlesIndex + 1] - NB_PARTICLES[nbParticlesIndex]; ++i) particleGroup->getParticle(i).kill(); } } } // if space is pressed if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_SPACE)) for (size_t i = 0; i < particleGroup->getNbParticles(); ++i) particleGroup->getParticle(i).velocity() = Vector3D(random(-0.5f,0.5f),random(-0.5f,0.5f),random(-0.5f,0.5f)); // Moves the camera with the mouse if (event.type == SDL_MOUSEMOTION) { angleZ += event.motion.xrel * 0.05f; angleX += event.motion.yrel * 0.05f; } } if (!paused) { // Updates particle system particleSystem->update(deltaTime * 0.001f); // 1 defined as a second // sets the gravity so that it is always down the screen float cosX = cos(angleX * PI / 180.0f); float sinX = sin(angleX * PI / 180.0f); float cosZ = cos(angleZ * PI / 180.0f); float sinZ = sin(angleZ * PI / 180.0f); particleGroup->setGravity(Vector3D(-0.5f * sinZ * cosX,-0.5f * cosZ * cosX,0.5f * sinX)); // if the particles were deleted, we refill the system if (particleSystem->getNbParticles() == 0) particleGroup->addParticles(NB_PARTICLES[nbParticlesIndex],sphere,Vector3D()); } // Renders scene render(); // Computes delta time int time = SDL_GetTicks(); deltaTime = time - frameFPS.back(); frameFPS.push_back(time); while((frameFPS.back() - frameFPS.front() > 1000)&&(frameFPS.size() > 2)) frameFPS.pop_front(); // Updates info strings strNbParticles = STR_NB_PARTICLES + int2Str(particleSystem->getNbParticles()); int fps = static_cast<int>(((frameFPS.size() - 1) * 1000.0f) / (frameFPS.back() - frameFPS.front())); if (drawText == 2) strFps = STR_FPS + int2Str(fps); else strFps = int2Str(fps); } cout << "\nSPARK FACTORY BEFORE DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SPKFactory::getInstance().destroyAll(); cout << "\nSPARK FACTORY AFTER DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SDL_Quit(); cout << endl; system("pause"); // Waits for the user to close the console return 0; }
// Main function int main(int argc, char *argv[]) { // random seed randomSeed = static_cast<unsigned int>(time(NULL)); // Sets the update step System::setClampStep(true,0.1f); // clamp the step to 100 ms System::useAdaptiveStep(0.001f,0.01f); // use an adaptive step from 1ms to 10ms (1000fps to 100fps) SDL_Event event; // inits SDL SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetCaption("SPARK Fire Demo",NULL); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); // vsync SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,0); SDL_SetVideoMode(0,0,32,SDL_OPENGL | SDL_FULLSCREEN); SDL_ShowCursor(0); SDL_Surface screen = *SDL_GetVideoSurface(); renderFirstFrame(); // inits openGL screenWidth = screen.w; screenHeight = screen.h; screenRatio = (float)screen.w / (float)screen.h; glClearColor(0.0f,0.0f,0.0f,1.0f); glViewport(0,0,screen.w,screen.h); // lighting GLfloat light_ambient[] = { 0.15f, 0.15f, 0.25f, 1.0f }; GLfloat light_diffuse[] = { 1.0f, 0.75f, 0.25f, 1.0f }; GLfloat mat_shininess[] = { 0.0f }; GLfloat mat_ambient[] = { 0.2f, 0.2f, 0.2f, 1.0f }; GLfloat mat_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f }; glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT, mat_ambient); glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE, mat_diffuse); glLightfv(GL_LIGHT0,GL_AMBIENT, light_ambient); glLightfv(GL_LIGHT0,GL_DIFFUSE, light_diffuse); glLightf(GL_LIGHT0,GL_QUADRATIC_ATTENUATION, 20.0f); glLightModelfv(GL_LIGHT_MODEL_AMBIENT,light_ambient); glLightModelf(GL_LIGHT_MODEL_LOCAL_VIEWER,1.0f); // Loads texture font FTGLTextureFont font = FTGLTextureFont("res/font.ttf"); if(font.Error()) return 1; font.FaceSize(24); fontPtr = &font; // Loads fire texture GLuint textureFire; if (!loadTexture(textureFire,"res/fire2.bmp",GL_ALPHA,GL_CLAMP,true)) return 1; // Loads smoke texture GLuint textureSmoke; if (!loadTexture(textureSmoke,"res/explosion.bmp",GL_ALPHA,GL_CLAMP,false)) return 1; scene = new Object3D(); if (!scene->load("res/SceneFireCamp.obj")) return 1; // Inits Particle Engine // Renderers GLPointRenderer* basicRenderer = GLPointRenderer::create(); GLQuadRenderer* fireRenderer = GLQuadRenderer::create(); fireRenderer->setScale(0.3f,0.3f); fireRenderer->setTexturingMode(TEXTURE_2D); fireRenderer->setTexture(textureFire); fireRenderer->setTextureBlending(GL_MODULATE); fireRenderer->setBlending(BLENDING_ADD); fireRenderer->enableRenderingHint(DEPTH_WRITE,false); fireRenderer->setAtlasDimensions(2,2); GLQuadRenderer* smokeRenderer = GLQuadRenderer::create(); smokeRenderer->setScale(0.3f,0.3f); smokeRenderer->setTexturingMode(TEXTURE_2D); smokeRenderer->setTexture(textureSmoke); smokeRenderer->setTextureBlending(GL_MODULATE); smokeRenderer->setBlending(BLENDING_ALPHA); smokeRenderer->enableRenderingHint(DEPTH_WRITE,false); smokeRenderer->setAtlasDimensions(2,2); // Models Model* fireModel = Model::create(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA | FLAG_SIZE | FLAG_ANGLE | FLAG_TEXTURE_INDEX, FLAG_RED | FLAG_GREEN | FLAG_ALPHA | FLAG_ANGLE, FLAG_RED | FLAG_GREEN | FLAG_TEXTURE_INDEX | FLAG_ANGLE, FLAG_SIZE); fireModel->setParam(PARAM_RED,0.8f,0.9f,0.8f,0.9f); fireModel->setParam(PARAM_GREEN,0.5f,0.6f,0.5f,0.6f); fireModel->setParam(PARAM_BLUE,0.3f); fireModel->setParam(PARAM_ALPHA,0.4f,0.0f); fireModel->setParam(PARAM_ANGLE,0.0f,2.0f * PI,0.0f,2.0f * PI); fireModel->setParam(PARAM_TEXTURE_INDEX,0.0f,4.0f); fireModel->setLifeTime(1.0f,1.5f); Interpolator* interpolator = fireModel->getInterpolator(PARAM_SIZE); interpolator->addEntry(0.5f,2.0f,5.0f); interpolator->addEntry(1.0f,0.0f); Model* smokeModel = Model::create(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA | FLAG_SIZE | FLAG_ANGLE | FLAG_TEXTURE_INDEX, FLAG_RED | FLAG_GREEN | FLAG_SIZE | FLAG_ANGLE, FLAG_TEXTURE_INDEX | FLAG_ANGLE, FLAG_ALPHA); smokeModel->setParam(PARAM_RED,0.3f,0.2f); smokeModel->setParam(PARAM_GREEN,0.25f,0.2f); smokeModel->setParam(PARAM_BLUE,0.2f); smokeModel->setParam(PARAM_ALPHA,0.2f,0.0f); smokeModel->setParam(PARAM_SIZE,5.0,10.0f); smokeModel->setParam(PARAM_TEXTURE_INDEX,0.0f,4.0f); smokeModel->setParam(PARAM_ANGLE,0.0f,2.0f * PI,0.0f,2.0f * PI); smokeModel->setLifeTime(5.0f,5.0f); interpolator = smokeModel->getInterpolator(PARAM_ALPHA); interpolator->addEntry(0.0f,0.0f); interpolator->addEntry(0.2f,0.2f); interpolator->addEntry(1.0f,0.0f); // Emitters // The emitters are arranged so that the fire looks realistic StraightEmitter* fireEmitter1 = StraightEmitter::create(Vector3D(0.0f,1.0f,0.0f)); fireEmitter1->setZone(Sphere::create(Vector3D(0.0f,-1.0f,0.0f),0.5f)); fireEmitter1->setFlow(40); fireEmitter1->setForce(1.0f,2.5f); StraightEmitter* fireEmitter2 = StraightEmitter::create(Vector3D(1.0f,0.6f,0.0f)); fireEmitter2->setZone(Sphere::create(Vector3D(0.15f,-1.2f,0.075f),0.1f)); fireEmitter2->setFlow(15); fireEmitter2->setForce(0.5f,1.5f); StraightEmitter* fireEmitter3 = StraightEmitter::create(Vector3D(-0.6f,0.8f,-0.8f)); fireEmitter3->setZone(Sphere::create(Vector3D(-0.375f,-1.15f,-0.375f),0.3f)); fireEmitter3->setFlow(15); fireEmitter3->setForce(0.5f,1.5f); StraightEmitter* fireEmitter4 = StraightEmitter::create(Vector3D(-0.8f,0.5f,0.2f)); fireEmitter4->setZone(Sphere::create(Vector3D(-0.255f,-1.2f,0.225f),0.2f)); fireEmitter4->setFlow(10); fireEmitter4->setForce(0.5f,1.5f); StraightEmitter* fireEmitter5 = StraightEmitter::create(Vector3D(0.1f,0.8f,-1.0f)); fireEmitter5->setZone(Sphere::create(Vector3D(-0.075f,-1.2f,-0.3f),0.2f)); fireEmitter5->setFlow(10); fireEmitter5->setForce(0.5f,1.5f); smokeEmitter = SphericEmitter::create(Vector3D(0.0f,1.0f,0.0f),0.0f,0.5f * PI); smokeEmitter->setZone(Sphere::create(Vector3D(),1.2f)); smokeEmitter->setFlow(25); smokeEmitter->setForce(0.5f,1.0f); // Groups fireGroup = Group::create(fireModel,135); fireGroup->addEmitter(fireEmitter1); fireGroup->addEmitter(fireEmitter2); fireGroup->addEmitter(fireEmitter3); fireGroup->addEmitter(fireEmitter4); fireGroup->addEmitter(fireEmitter5); fireGroup->setRenderer(fireRenderer); fireGroup->setGravity(Vector3D(0.0f,3.0f,0.0f)); smokeGroup = Group::create(smokeModel,135); smokeGroup->addEmitter(smokeEmitter); smokeGroup->setRenderer(smokeRenderer); smokeGroup->setGravity(Vector3D(0.0f,0.4f,0.0f)); // System particleSystem = System::create(); particleSystem->addGroup(smokeGroup); particleSystem->addGroup(fireGroup); bool smoke = true; bool exit = false; // renderValue : // 0 : normal // 1 : basic render // 2 : no render unsigned int renderValue = 0; cout << "\nSPARK FACTORY AFTER INIT :" << endl; SPKFactory::getInstance().traceAll(); SDL_Delay(3000); while (SDL_PollEvent(&event)){} std::deque<unsigned int> frameFPS; frameFPS.push_back(SDL_GetTicks()); while(!exit) { while (SDL_PollEvent(&event)) { // if esc is pressed, exit if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_ESCAPE)) exit = true; // if del is pressed, reinit the system if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_DELETE)) particleSystem->empty(); // if F1 is pressed, we display or not the text if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F1)) { --drawText; if (drawText < 0) drawText = 2; } // if F2 is pressed, we display or not the bounding boxes if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F2)) { fireGroup->enableAABBComputing(!fireGroup->isAABBComputingEnabled()); smokeGroup->enableAABBComputing(!smokeGroup->isAABBComputingEnabled()); if (paused) particleSystem->computeAABB(); } // if F4 is pressed, the renderers are changed if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F4)) { renderValue = (renderValue + 1) % 3; switch (renderValue) { case 0 : fireGroup->setRenderer(fireRenderer); smokeGroup->setRenderer(smokeRenderer); break; case 1 : fireGroup->setRenderer(basicRenderer); smokeGroup->setRenderer(basicRenderer); break; case 2 : fireGroup->setRenderer(NULL); smokeGroup->setRenderer(NULL); break; } } // if F5 is pressed, environment is rendered are not if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F5)) renderEnv = !renderEnv; // if pause is pressed, the system is paused if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_PAUSE)) paused = !paused; // if space is pressed, add or not smoke if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_SPACE)) { smoke = !smoke; if (smoke) { smokeGroup->getEmitter(0)->setActive(true); strSmoke = STR_SMOKE + "ON"; } else { smokeGroup->getEmitter(0)->setActive(false); strSmoke = STR_SMOKE + "OFF"; } } // Moves the camera with the mouse if (event.type == SDL_MOUSEMOTION) { angleY += event.motion.xrel * 0.05f; angleX += event.motion.yrel * 0.05f; angleX = min(45.0f,max(1.0f,angleX)); // we cannot look under the ground } // Zoom in and out if (event.type == SDL_MOUSEBUTTONDOWN) { if (event.button.button == SDL_BUTTON_WHEELDOWN) camPosZ = min(22.0f,camPosZ + 0.5f); if (event.button.button == SDL_BUTTON_WHEELUP) camPosZ = max(3.0f,camPosZ - 0.5f); } } if (!paused) { // Updates particle system particleSystem->update(deltaTime * 0.001f); // 1 defined as a second } // Renders scene render(); // Computes delta time int time = SDL_GetTicks(); deltaTime = time - frameFPS.back(); frameFPS.push_back(time); while((frameFPS.back() - frameFPS.front() > 1000)&&(frameFPS.size() > 2)) frameFPS.pop_front(); // Updates info strings strNbParticles = STR_NB_PARTICLES + int2Str(particleSystem->getNbParticles()); int fps = static_cast<int>(((frameFPS.size() - 1) * 1000.0f) / (frameFPS.back() - frameFPS.front())); if (drawText == 2) strFps = STR_FPS + int2Str(fps); else strFps = int2Str(fps); } cout << "\nSPARK FACTORY BEFORE DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SPKFactory::getInstance().destroyAll(); cout << "\nSPARK FACTORY AFTER DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SDL_Quit(); cout << endl; system("pause"); // Waits for the user to close the console return 0; }
// Main function int main(int argc, char *argv[]) { // random seed randomSeed = static_cast<unsigned int>(time(NULL)); // Sets the update step System::setClampStep(true,0.1f); // clamp the step to 100 ms System::useAdaptiveStep(0.001f,0.01f); // use an adaptive step from 1ms to 10ms (1000fps to 100fps) SDL_Event event; // inits SDL SDL_Init(SDL_INIT_VIDEO); SDL_WM_SetCaption("SPARK Writing Demo",NULL); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,1); // vsync SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL,0); SDL_SetVideoMode(0,0,32,SDL_OPENGL | SDL_FULLSCREEN); SDL_ShowCursor(0); SDL_Surface screen = *SDL_GetVideoSurface(); renderFirstFrame(); // inits openGL screenWidth = screen.w; screenHeight = screen.h; screenRatio = (float)screen.w / (float)screen.h; glClearColor(0.0f,0.0f,0.0f,1.0f); glViewport(0,0,screen.w,screen.h); // Loads texture font FTGLTextureFont font = FTGLTextureFont("res/font.ttf"); if(font.Error()) return 1; font.FaceSize(24); fontPtr = &font; // Loads particle texture GLuint textureParticle; if (!loadTexture(textureParticle,"res/point.bmp",GL_ALPHA,GL_CLAMP,false)) return 1; // Inits Particle Engine // Renderers GLPointRenderer* basicRenderer = GLPointRenderer::create(); GLQuadRenderer* particleRenderer = GLQuadRenderer::create(); particleRenderer->enableBlending(true); particleRenderer->setBlendingFunctions(GL_SRC_ALPHA,GL_ONE); particleRenderer->setTexturingMode(TEXTURE_2D); particleRenderer->setTexture(textureParticle); particleRenderer->setTextureBlending(GL_MODULATE); particleRenderer->setScale(0.05f,0.05f); particleRenderer->enableRenderingHint(DEPTH_TEST,false); // Model Model* particleModel = Model::create(FLAG_RED | FLAG_GREEN | FLAG_BLUE | FLAG_ALPHA | FLAG_SIZE,FLAG_ALPHA | FLAG_SIZE); particleModel->setParam(PARAM_ALPHA,5.0f,0.0f); // the particles will fade as they die particleModel->setParam(PARAM_SIZE,1.0f,15.0f); // the particles will enlarge over time particleModel->setLifeTime(5.0f,6.0f); // Emitter // We set up a spheric emitter that emits in all direction with a very small force in order to slightly displace the particles RandomEmitter* particleEmitter = RandomEmitter::create(); particleEmitter->setForce(0.01f,0.01f); // Group particleGroup = Group::create(particleModel,14000); particleGroup->setRenderer(particleRenderer); particleGroup->setFriction(-0.3f); // negative friction : The particles will accelerate over time // System particleSystem = System::create(); particleSystem->addGroup(particleGroup); // This computes the ratio to go from screen coordinates to universe coordinates float screenToUniverse = 2.0f * camPosZ * tan(45.0f * 0.5f * PI / 180.0f) / screenHeight; float oldX,oldY,oldZ; bool add = false; float offset = 0.0f; bool exit = false; bool paused = false; // renderValue : // 0 : normal // 1 : basic render // 2 : no render unsigned int renderValue = 0; float step = 0.0f; cout << "\nSPARK FACTORY AFTER INIT :" << endl; SPKFactory::getInstance().traceAll(); SDL_Delay(3000); while (SDL_PollEvent(&event)){} SDL_ShowCursor(1); std::deque<unsigned int> frameFPS; frameFPS.push_back(SDL_GetTicks()); while(!exit) { while (SDL_PollEvent(&event)) { // if esc is pressed, exit if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_ESCAPE)) exit = true; // if del is pressed, reinit the system if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_DELETE)) particleSystem->empty(); // if F1 is pressed, we display or not the text if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F1)) { --drawText; if (drawText < 0) drawText = 2; } // if F2 is pressed, we display or not the bounding boxes if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F2)) { particleGroup->enableAABBComputing(!particleGroup->isAABBComputingEnabled()); if (paused) particleSystem->computeAABB(); } // if F4 is pressed, the renderers are changed if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_F4)) { renderValue = (renderValue + 1) % 3; switch (renderValue) { case 0 : particleGroup->setRenderer(particleRenderer); break; case 1 : particleGroup->setRenderer(basicRenderer); break; case 2 : particleGroup->setRenderer(NULL); break; } } // if pause is pressed, the system is paused if ((event.type == SDL_KEYDOWN)&&(event.key.keysym.sym == SDLK_PAUSE)) paused = !paused; oldZ = camPosZ; if (event.type == SDL_MOUSEBUTTONDOWN) { if (event.button.button == SDL_BUTTON_LEFT) { add = true; oldX = (event.motion.x - screenWidth * 0.5f) * screenToUniverse; oldY = -(event.motion.y - screenHeight * 0.5f) * screenToUniverse; } if (event.button.button == SDL_BUTTON_WHEELDOWN) camPosZ = min(18.0f,camPosZ + 0.5f); if (event.button.button == SDL_BUTTON_WHEELUP) camPosZ = max(0.0f,camPosZ - 0.5f); } if (event.type == SDL_MOUSEBUTTONUP) if (event.button.button == SDL_BUTTON_LEFT) add = false; if ((add)&&(!paused)) { float x = (event.motion.x - screenWidth * 0.5f) * screenToUniverse; float y = -(event.motion.y - screenHeight * 0.5f) * screenToUniverse; offset = particleGroup->addParticles(Vector3D(oldX,oldY,oldZ - 5.0f),Vector3D(x,y,camPosZ - 5.0f),particleEmitter,0.025f,offset); oldX = x; oldY = y; } } if (!paused) { // Changes the color of the model over time step += deltaTime * 0.0005f; particleModel->setParam(PARAM_RED,0.6f + 0.4f * sin(step)); particleModel->setParam(PARAM_GREEN,0.6f + 0.4f * sin(step + PI * 2.0f / 3.0f)); particleModel->setParam(PARAM_BLUE,0.6f + 0.4f * sin(step + PI * 4.0f / 3.0f)); // Updates particle system particleSystem->update(deltaTime * 0.001f); // 1 being a second } // Renders scene render(); // Computes delta time int time = SDL_GetTicks(); deltaTime = time - frameFPS.back(); frameFPS.push_back(time); while((frameFPS.back() - frameFPS.front() > 1000)&&(frameFPS.size() > 2)) frameFPS.pop_front(); // Updates info strings strNbParticles = STR_NB_PARTICLES + int2Str(particleSystem->getNbParticles()); int fps = static_cast<int>(((frameFPS.size() - 1) * 1000.0f) / (frameFPS.back() - frameFPS.front())); if (drawText == 2) strFps = STR_FPS + int2Str(fps); else strFps = int2Str(fps); } cout << "\nSPARK FACTORY BEFORE DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SPKFactory::getInstance().destroyAll(); cout << "\nSPARK FACTORY AFTER DESTRUCTION :" << endl; SPKFactory::getInstance().traceAll(); SDL_Quit(); cout << endl; system("pause"); // Waits for the user to close the console return 0; }