Пример #1
0
 void testConstructor()
 {
     buildGLContext();
 
     FTGLTextureFont* textureFont = new FTGLTextureFont( FONT_FILE);            
     CPPUNIT_ASSERT( textureFont->Error() == 0);            
     CPPUNIT_ASSERT( glGetError() == GL_NO_ERROR);        
 }
Пример #2
0
        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);
    }
}
Пример #4
0
        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);        
        }
Пример #5
0
        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);        
        }
Пример #6
0
// 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;
}
Пример #7
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;
}
Пример #8
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;
}
Пример #9
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;
}
Пример #10
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;
}