int main() { glfwInit(); ////our window //GLFWwindow* window; //window = glfwCreateWindow(800, 600, "ParticleSystemXML", NULL, NULL); //glfwMakeContextCurrent(window); // ////CAM //cam.setKeySpeed(4.0); //iH.setAllInputMaps(cam); //glfwSetKeyCallback(window, key_callback); //cam.setFOV(50); //cam.setNearFar(1, 100); Window testWindow(500, 50, 800, 600, "ParticleSystem"); glfwMakeContextCurrent(testWindow.getWindow()); // Callback glfwSetKeyCallback(testWindow.getWindow(), key_callback); cam.setKeySpeed(4.0); cam.setNearFar(0.1, 100); cam.setPosition(glm::vec4(0, 0, 8, 0)); glewInit(); //our renderer OpenGL3Context context; Renderer *renderer; renderer = new Renderer(context); //////////////////////Textures////////////////////// Texture* fireTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/Fire2_M.png"); Texture* fireTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fire1_M.png"); Texture* fireTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fire3_M.png"); Texture* fireTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/flame02_L.png"); //Texture* fireFlickering1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fire_flickering_1.png"); //Texture* fireFlickering2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fire_flickering_2.png"); //Texture* fireFlickering3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fire_flickering_3.png"); //Texture* fireFlickering4 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fire_flickering_4.png"); Texture* fireSparkleTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fireSparkle1_S.png"); Texture* fireSparkleTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/fireSparkle2.png"); Texture* texFireworkBlue = new Texture((char*)RESOURCES_PATH "/ParticleSystem/firework/firework_blue.png"); Texture* texFireworkRed = new Texture((char*)RESOURCES_PATH "/ParticleSystem/firework/firework_red.png"); Texture* texFireworkGreen = new Texture((char*)RESOURCES_PATH "/ParticleSystem/firework/firework_green.png"); Texture* texFireworkGold = new Texture((char*)RESOURCES_PATH "/ParticleSystem/firework/firework_gold.png"); Texture* texFireworkTail = new Texture((char*)RESOURCES_PATH "/ParticleSystem/firework/firework_tail.png"); Texture* smokeWhiteTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeWhite/smokeWhite01.png"); Texture* smokeWhiteTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeWhite/smokeWhite02.png"); Texture* smokeBlack1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeBlack/smokeBlack01.png"); Texture* smokeBlack2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeBlack/smokeBlack02.png"); //////////////////////Emitter////////////////////// //Emitter explosion sparkle Emitter* explosionSparkle = new Emitter(0, glm::vec3(0.0, 0.0, 0.0), 0.25, 0.01, 80, 1.25, true); explosionSparkle->setVelocity(5); //explosionSparkle->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, 0.3), 3.0f); explosionSparkle->usePhysicPointGravity(glm::vec3(0.0, 0.0, 0.0), 0.6, 10.0, 2, 4.0f, true); explosionSparkle->addTexture(fireSparkleTex1, 1.0); explosionSparkle->defineLook(true, 0.01, 0.0, 0.1); //Emitter explosion fire //TODO //Emitter fire smoke Emitter* fire = new Emitter(0, glm::vec3(0.0, 0.0, 0.0), 0.0, 0.2, 2, 5.0, true); fire->setVelocity(5); fire->usePhysicDirectionGravity(glm::vec4(0.0, 1.0, 0.0, 5.0), 0.5f); fire->addTexture(fireTex1, 1.0); fire->addTexture(fireTex2, 0.7); fire->addTexture(smokeBlack2, 0.1); //fire->addTexture(smokeBlack2, 0.1); //fire->addTexture(smokeWhiteTex2, 0.25); std::vector<float> sizeF{ 0.05f, 0.5f, 0.75f, 1.0f }; std::vector<float> timeF{ 0.0f, 0.4f, 0.75f, 1.0f }; fire->defineLook(true, sizeF, timeF, 0.5, 4.0, 3.0, true, 0.3); fire->switchToGeometryShader(); //Emitter fire flickering Emitter* fireFlickering = new Emitter(0, glm::vec3(0.0, 0.1, 0.0), 0.0, 0.2, 1, 2.0, true); fireFlickering->setVelocity(5); fireFlickering->usePhysicDirectionGravity(glm::vec4(0.0, 1.0, 0.0, 0.5), 0.3f); /*fireFlickering->addTexture(fireFlickering1, 1.0); fireFlickering->addTexture(fireFlickering2, 0.7); fireFlickering->addTexture(fireFlickering3, 0.5); fireFlickering->addTexture(fireFlickering4, 0.3);*/ fireFlickering->defineLook(true, 0.1, 0.5, 1.0, 0.5, true, 0.3); fireFlickering->switchToGeometryShader(); Emitter* fireSparkle = new Emitter(0, glm::vec3(0.0, 0.1, 0.0), 0.0, 0.05, 3, 2.5, true); fireSparkle->setVelocity(5); fireSparkle->usePhysicDirectionGravity(glm::vec4(0.0, 1.0, 0.0, 0.8), 0.5f); fireSparkle->addTexture(fireSparkleTex1, 1.0); fireSparkle->defineLook(true, 0.05, 0.5, 0.5); //Emitter firework explosion Emitter* fireworkExplosion = new Emitter(0, glm::vec3(0.0, 0.0, 0.0), 0.1, 0.01, 80, 2.0, true); fireworkExplosion->setVelocity(6); //fireworkExplosion->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, 0.6), 3.0f); fireworkExplosion->usePhysicPointGravity(glm::vec3(0.0, -2.0, 0.0), 0.9, 5.0, 2, 2.0f, true); fireworkExplosion->addTexture(texFireworkRed, 1.0); fireworkExplosion->defineLook(true, 0.04, 0.0, 0.5); fireworkExplosion->setStartTime(2.0); //Emitter firework tail Emitter* fireworkTail = new Emitter(0, glm::vec3(0.0, 0.0, 0.0), 2.0, 0.01, 20, 0.5, true); fireworkTail->setVelocity(5); //fireworkTail->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, 2.9), 0.2f); fireworkTail->usePhysicPointGravity(glm::vec3(0.0, -4.0, 0.0), 30.6, 10.0, 2, 0.2f, true); fireworkTail->addTexture(texFireworkTail, 1.0); fireworkTail->defineLook(true, 0.001, 0.0, 0.1); //FINAL EMITTER WHITE SMOKE Emitter* smokeWhite = new Emitter(0, glm::vec3(0.0, 0.0, 0.0), 0.0, 0.4, 1, 8.0, true); smokeWhite->setVelocity(2); smokeWhite->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -0.8), 0.3f); smokeWhite->addTexture(smokeWhiteTex1, 1.0); smokeWhite->addTexture(smokeWhiteTex2, 0.25); std::vector<float> smokeWhiteSize{ 0.05f, 0.5f, 0.75f, 1.0f }; std::vector<float> smokeWhiteTime{ 0.0f, 0.4f, 0.75f, 1.0f }; smokeWhite->defineLook(true, smokeWhiteSize, smokeWhiteTime, 1.0, 2.0, 1.0, false, 0.3); smokeWhite->switchToGeometryShader(); //////////////////////Effect////////////////////// Effect* efExplosion = new Effect(); efExplosion->addEmitter(explosionSparkle); Effect* efFire = new Effect(); efFire->addEmitter(fire); //efFire->addEmitter(fireFlickering); efFire->addEmitter(fireSparkle); efFire->saveEffect(RESOURCES_PATH "/XML/Effect_Fire.xml"); Effect* efFirework = new Effect(); efFirework->addEmitter(fireworkTail); efFirework->addEmitter(fireworkExplosion); //efFirework->saveEffect(RESOURCES_PATH "/XML/Effect_Firework.xml"); Effect* efFireworkTail = new Effect(); efFireworkTail->addEmitter(fireworkTail); Effect* efFireworkExplosion = new Effect(); efFireworkExplosion->addEmitter(fireworkExplosion); Effect* efSmWhi = new Effect(); efSmWhi->addEmitter(smokeWhite); efSmWhi->saveEffect(RESOURCES_PATH "/XML/Effect_SmokeWhite.xml"); //////////////////////ParticleSystem////////////////////// //ParticleSystem* psExplosion = new ParticleSystem(glm::vec3(0, -1, 0), efExplosion); //ParticleSystem* psFire = new ParticleSystem(glm::vec3(-2, 0, 3), efFire); ParticleSystem* psFire = new ParticleSystem(glm::vec3(-2, 0, 3), RESOURCES_PATH "/XML/Effect_Fire.xml"); ParticleSystem* psFirework = new ParticleSystem(glm::vec3(0, 0, 5), efFirework); ParticleSystem* psFireworkTail = new ParticleSystem(glm::vec3(0, 0, 5), efFireworkTail); ParticleSystem* psFireworkExplosion = new ParticleSystem(glm::vec3(0, 2, 5), efFireworkExplosion); ParticleSystem* psSmokeWhite = new ParticleSystem(glm::vec3(2, 0, 3), efSmWhi); //ParticleSystem* psSmokeWhite = new ParticleSystem(glm::vec3(2, 0, 3), RESOURCES_PATH "/XML/Effect_SmokeWhite.xml"); ParticleSystem* psFireworkRed = new ParticleSystem(glm::vec3(-6, -1, -3), RESOURCES_PATH "/XML/Effect_FireworkRed.xml"); ParticleSystem* psFireworkBlue = new ParticleSystem(glm::vec3(-2, -1, -3), RESOURCES_PATH "/XML/Effect_FireworkBlue.xml"); ParticleSystem* psFireworkGreen = new ParticleSystem(glm::vec3(2, -1, -3), RESOURCES_PATH "/XML/Effect_FireworkGreen.xml"); ParticleSystem* psFireworkGold = new ParticleSystem(glm::vec3(6, -1, -3), RESOURCES_PATH "/XML/Effect_FireworkGold.xml"); ParticleSystem* psComicCloud = new ParticleSystem(glm::vec3(0, -1, 3), RESOURCES_PATH "/XML/Effect_ComicCloud.xml"); //////////////////////Node////////////////////// //Node nodeExplosion("nodeExplosion"); //nodeExplosion.setCamera(&cam); //nodeExplosion.addParticleSystem(psExplosion); //nodeExplosion.setParticleActive(true); // //Node fireNode("fireNode"); //fireNode.setCamera(&cam); //fireNode.addParticleSystem(psFire); //fireNode.setParticleActive(true); // //Node nodeFirework("fireworkNode"); //nodeFirework.setCamera(&cam); //nodeFirework.addParticleSystem(psFirework); //nodeFirework.setParticleActive(true); // //Node whiteSmokeNode("whiteSmokeNode"); //whiteSmokeNode.setCamera(&cam); //whiteSmokeNode.addParticleSystem(psSmokeWhite); //whiteSmokeNode.setParticleActive(true); ////Firework //Node nodeFireworkRed("fireworkRedNode"); //nodeFireworkRed.setCamera(&cam); //nodeFireworkRed.addParticleSystem(psFireworkRed); //nodeFireworkRed.setParticleActive(true); //Node nodeFireworkBlue("fireworBlueNode"); //nodeFireworkBlue.setCamera(&cam); //nodeFireworkBlue.addParticleSystem(psFireworkBlue); //nodeFireworkBlue.setParticleActive(true); //Node nodeFireworkGreen("fireworkGreenNode"); //nodeFireworkGreen.setCamera(&cam); //nodeFireworkGreen.addParticleSystem(psFireworkGreen); //nodeFireworkGreen.setParticleActive(true); //Node nodeFireworkGold("fireworkGoldNode"); //nodeFireworkGold.setCamera(&cam); //nodeFireworkGold.addParticleSystem(psFireworkGold); //nodeFireworkGold.setParticleActive(true); // Shader VertexShader vs(loadShaderSource(SHADERS_PATH + std::string("/ColorShader3D/ColorShader3D.vert"))); FragmentShader fs(loadShaderSource(SHADERS_PATH + std::string("/ColorShader3D/ColorShader3D.frag"))); ShaderProgram shader(vs, fs); //need scene here mainly because of input Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); //Add Camera to Scene testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->setActiveCamera("Pilotview"); //Set Input-Maps and activate one iH.setAllInputMaps(*(testScene.getScenegraph()->getActiveCamera())); iH.changeActiveInputMap(MapType::CAMPILOTVIEW); iH.getActiveInputMap()->update(cam); //Object Cube cube; Texture bricks((char*)RESOURCES_PATH "/Wall/bricks_diffuse.png"); Node cube1("cube"); cube1.addGeometry(&cube); cube1.addTexture(&bricks); cube1.setModelMatrix(glm::translate(cube1.getModelMatrix(), glm::vec3(0.0, 0.0, 0.0))); //cube1.setModelMatrix(glm::scale(cube1.getModelMatrix(), glm::vec3(0.5, 0.5, 0.5))); testScene.getScenegraph()->getRootNode()->addChildrenNode(&cube1); //add nodes to the scenegraph //testScene.getScenegraph()->getRootNode()->addChildrenNode(&nodeExplosion); //testScene.getScenegraph()->getRootNode()->addChildrenNode(&fireNode); //testScene.getScenegraph()->getRootNode()->addChildrenNode(&whiteSmokeNode); //testScene.getScenegraph()->getRootNode()->addChildrenNode(&nodeFirework); /*testScene.getScenegraph()->getRootNode()->addChildrenNode(&nodeFireworkRed); testScene.getScenegraph()->getRootNode()->addChildrenNode(&nodeFireworkBlue); testScene.getScenegraph()->getRootNode()->addChildrenNode(&nodeFireworkGreen); testScene.getScenegraph()->getRootNode()->addChildrenNode(&nodeFireworkGold);*/ //using this, the ParticleSystems get rendered in order of their distance to the camera testScene.getScenegraph()->addParticleSystem(psFire); testScene.getScenegraph()->addParticleSystem(psSmokeWhite); testScene.getScenegraph()->addParticleSystem(psFireworkBlue); testScene.getScenegraph()->addParticleSystem(psFireworkRed); testScene.getScenegraph()->addParticleSystem(psFireworkGreen); testScene.getScenegraph()->addParticleSystem(psFireworkGold); //testScene.getScenegraph()->addParticleSystem(psComicCloud); ////TEST //Emitter* etest = new Emitter(0, glm::vec3(0, 0, 0), 0, 1, 1000000, 1, true); //etest->setVelocity(6); //etest->usePhysicPointGravity(glm::vec3(0, 0, 0), 0.5, 20, 1, -2.5, true); //etest->defineLook(false, 0.005); //Effect* eftest = new Effect(); //eftest->addEmitter(etest); //ParticleSystem* pstest = new ParticleSystem(glm::vec3(0, 2, 0), eftest); //testScene.getScenegraph()->addParticleSystem(pstest); //pstest->start(); //start the ParticleSystems psFire->start(); psSmokeWhite->start(); //psExplosion->start(); //psFirework->start(); psFireworkRed->start(); psFireworkBlue->start(); psFireworkGreen->start(); psFireworkGold->start(); //psComicCloud->start(); double startTime = glfwGetTime(); double lastTime = glfwGetTime(); int nbFrames = 0; while (!glfwWindowShouldClose(testWindow.getWindow())) { // Measure speed double currentTime = glfwGetTime(); nbFrames++; if (currentTime - lastTime >= 1.0) { // If last prinf() was more than 1 sec ago // printf and reset timer //printf("%f ms/frame\n", 1000.0 / double(nbFrames)); nbFrames = 0; lastTime += 1.0; } double dt = glfwGetTime() - startTime; cam.setSensitivity(dt); startTime = glfwGetTime(); /*glEnable(GL_DEPTH); glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glClearColor(0.5, 0.5, 0.5, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shader.bind(); shader.sendMat4("viewMatrix", cam.getViewMatrix()); shader.sendMat4("projectionMatrix", cam.getProjectionMatrix()); testScene.render(shader); testScene.renderParticleSystems(); shader.unbind();*/ //renderer->useBloom(true); renderer->renderScene(testScene, testWindow); //update Positions of firework ParticleSystems glm::vec3 pos = psFireworkRed->getPosition(); psFireworkRed->setPosition(glm::vec3(pos.x, pos.y + (2 * dt), pos.z)); pos = psFireworkBlue->getPosition(); psFireworkBlue->setPosition(glm::vec3(pos.x, pos.y + (2 * dt), pos.z)); pos = psFireworkGreen->getPosition(); psFireworkGreen->setPosition(glm::vec3(pos.x, pos.y + (2 * dt), pos.z)); pos = psFireworkGold->getPosition(); psFireworkGold->setPosition(glm::vec3(pos.x, pos.y + (2 * dt), pos.z)); /*glfwSwapBuffers(testWindow.getWindow()); glfwPollEvents();*/ } glfwDestroyWindow(testWindow.getWindow()); glfwTerminate(); return 0; }
/** @SYMTestCaseID GRAPHICS-WSERV-0462 @SYMDEF PDEF114190 @SYMTestCaseDesc Test sprite list cleanup when a window is deleted in low memory conditions @SYMTestPriority High @SYMTestStatus Implemented @SYMTestActions Have a loop which increases the number of allocations in the server thread before failure; Within the loop: 1) Create a parent window and a child window of the parent; 2) Create a sprite on the child window; 3) Delete the parent window only, but not the child window; 4) Create a testWindow and do redraw on this window; 5) Do redraw on the testWindow. This testWindow's redraw will force checking the sprite list. This would panic the client thread due to this defect because the sprite on the orphaned window (which is the previous child window) is still in the sprite list; 6) Delete all the windows involved. @SYMTestExpectedResults The sprite should be disabled when a window is deleted; The client thread should not be panic'd. The test should pass. */ void CTTSprite::SpriteOnWindowOrphanedTestsL() { TInt handles = 344; TInt loop = 0; TInt allocFailRate = 0; TInt err = KErrNone; CFbsBitmap* bitmap = new(ELeave) CFbsBitmap; CleanupStack::PushL(bitmap); User::LeaveIfError(bitmap->Create(TSize(500, 500), EColor16MU)); TSpriteMember spritemember; spritemember.iBitmap = bitmap; spritemember.iMaskBitmap = NULL; RWindowGroup group(TheClient->iWs); RWindow parent1(TheClient->iWs); RWindow child1(TheClient->iWs); RWindow testWindow(TheClient->iWs); RWsSprite sprite(TheClient->iWs); while (loop < 5) { TRect mainRect(TPoint(0,0), TSize(500,500)); err = group.Construct(++handles, EFalse); if (err == KErrNone) { TheClient->iWs.HeapSetFail(RHeap::EDeterministic, allocFailRate); //Create parent 1 err = parent1.Construct(group,++handles); if (err == KErrNone) { parent1.SetExtent(mainRect.iTl, mainRect.Size()); parent1.EnableRedrawStore(ETrue); parent1.Activate(); } } //Create child 1 if (err == KErrNone) { TRect childRect(TPoint (10, 10), TSize (200, 150)); err = child1.Construct(parent1,++handles); if (err == KErrNone) { child1.SetExtent(childRect.iTl, childRect.Size()); child1.SetBackgroundColor(TRgb(128,100,255,20)); child1.Activate(); } } //Add sprite to child 1 if (err == KErrNone) { err = sprite.Construct(child1,TPoint(10,10), 0); if (err == KErrNone) { err = sprite.AppendMember(spritemember); if (err == KErrNone) err = sprite.Activate(); } } //Only delete parent 1, but not child 1 parent1.Close(); if (err == KErrNone) { TRect testRect(TPoint(10, 30), TSize(200, 150)); //Create testWindow err = testWindow.Construct(group,++handles); if (err == KErrNone) { testWindow.SetExtent(testRect.iTl, testRect.Size()); testWindow.SetBackgroundColor(TRgb(128,100,255,20)); testWindow.EnableRedrawStore(ETrue); testWindow.Activate(); testWindow.BeginRedraw(); testWindow.EndRedraw(); TheClient->Flush(); } } TheClient->iWs.HeapSetFail(RAllocator::ENone, 0); sprite.Close(); child1.Close(); testWindow.Close(); group.Close(); ++allocFailRate; loop = (err == KErrNone) ? loop + 1 : 0; } CleanupStack::PopAndDestroy(bitmap); }
int main() { glfwInit(); Window testWindow(50, 50, WINDOW_WIDTH, WINDOW_HEIGHT, "Deferred Shading"); glfwMakeContextCurrent(testWindow.getWindow()); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); // You have to set a camera name cam.setName("PilotviewCam"); cam.setPosition(glm::vec4(0.0, 0.5, 3.0, 1.0)); cam.setNearFar(0.01f, 100.0f); iH.setAllInputMaps(cam); iH.changeActiveInputMap("Pilotview"); //Callback glfwSetKeyCallback(testWindow.getWindow(), key_callback); glewInit(); //our shader VertexShader vsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.vert"))); FragmentShader fsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.frag"))); ShaderProgram shaderGBuffer(vsGBuffer, fsGBuffer); //load shader here VertexShader vsDsLighting(loadShaderSource(SHADERS_PATH + std::string("/DeferredShading/dsLighting.vert"))); FragmentShader fsDsLighting(loadShaderSource(SHADERS_PATH + std::string("/DeferredShading/dsLighting.frag"))); ShaderProgram shaderDsLightingShader(vsDsLighting, fsDsLighting); VertexShader vsDsCompositing(loadShaderSource(SHADERS_PATH + std::string("/DeferredShading/dsFinalCompositing.vert"))); FragmentShader fsDsCompositing(loadShaderSource(SHADERS_PATH + std::string("/DeferredShading/dsFinalCompositing.frag"))); ShaderProgram shaderDsCompositingShader(vsDsCompositing, fsDsCompositing); VertexShader vsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.vert"))); FragmentShader fsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.frag"))); ShaderProgram shaderSFQ(vsSfq, fsSfq); //our renderer OpenGL3Context context; Renderer renderer(context); FBO fboGBuffer(WINDOW_WIDTH, WINDOW_HEIGHT, 3, true, false); FBO fboDeferredShading(WINDOW_WIDTH, WINDOW_HEIGHT, 3, true, false); FBO fboCompositing(WINDOW_WIDTH, WINDOW_HEIGHT, 3, false, false); //our object Cube cube; Teapot teapot; Rect plane; Rect screenFillingQuad; screenFillingQuad.loadBufferData(); //our textures Texture bricks((char*)RESOURCES_PATH "/bricks_diffuse.png"); Texture bricks_normal((char*)RESOURCES_PATH "/bricks_normal.png"); Texture bricks_height((char*)RESOURCES_PATH "/bricks_height.png"); Texture chrome((char*)RESOURCES_PATH "/chrome.jpg"); Texture cvLogo((char*)RESOURCES_PATH "/cv_logo.bmp"); //Scene creation Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); //Add Camera to scenegraph testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->getCamera("PilotviewCam"); testScene.getScenegraph()->setActiveCamera("PilotviewCam"); Rect rect; Node cube1("cube1"); cube1.addGeometry(&cube); cube1.addTexture(&bricks); cube1.addNormalMap(&bricks_normal); cube1.addHeightMap(&bricks_height); cube1.setModelMatrix(glm::translate(cube1.getModelMatrix(), glm::vec3(-1.0, 0.5, -0.5))); cube1.setModelMatrix(glm::scale(cube1.getModelMatrix(), glm::vec3(0.7, 0.7, 0.7))); Node cube2("cube2"); cube2.addGeometry(&cube); cube2.addTexture(&bricks); cube2.addNormalMap(&bricks_normal); cube2.setModelMatrix(glm::translate(cube2.getModelMatrix(), glm::vec3(-1, 0.5, 0.5))); cube2.setModelMatrix(glm::scale(cube2.getModelMatrix(), glm::vec3(0.7, 0.7, 0.7))); Node cube3("cube3"); cube3.addGeometry(&cube); cube3.addTexture(&bricks); cube3.setModelMatrix(glm::translate(cube3.getModelMatrix(), glm::vec3(0, 0.5, -0.5))); cube3.setModelMatrix(glm::scale(cube3.getModelMatrix(), glm::vec3(0.7, 0.7, 0.7))); Node cube4("cube4"); cube4.addGeometry(&cube); cube4.addTexture(&bricks); cube4.addNormalMap(&bricks_normal); cube4.addHeightMap(&bricks_height,0.07,0.1,true); cube4.setModelMatrix(glm::translate(cube4.getModelMatrix(), glm::vec3(0, 0.5, 0.5))); cube4.setModelMatrix(glm::scale(cube4.getModelMatrix(), glm::vec3(0.7, 0.7, 0.7))); Node wallNode1("wall1"); wallNode1.addGeometry(&plane); wallNode1.addTexture(&cvLogo); wallNode1.setModelMatrix(glm::translate(wallNode1.getModelMatrix(), glm::vec3(0.0, 0.1, 0.2))); wallNode1.setModelMatrix(glm::rotate(wallNode1.getModelMatrix(), 90.0f, glm::vec3(1.0, 0.0, 0.0))); wallNode1.setModelMatrix(glm::scale(wallNode1.getModelMatrix(), glm::vec3(10.5, 10.5, 10.5))); Node teaNode("teaNode"); teaNode.addGeometry(&teapot); teaNode.addTexture(&chrome); teaNode.setModelMatrix(glm::translate(teaNode.getModelMatrix(), glm::vec3(0.2, 0.4, 0.7))); teaNode.setModelMatrix(glm::scale(teaNode.getModelMatrix(), glm::vec3(0.5, 0.5, 0.5))); //Creating a scenegraph testScene.getScenegraph()->getRootNode()->addChildrenNode(&wallNode1); testScene.getScenegraph()->getRootNode()->addChildrenNode(&cube1); testScene.getScenegraph()->getRootNode()->addChildrenNode(&cube2); testScene.getScenegraph()->getRootNode()->addChildrenNode(&cube3); testScene.getScenegraph()->getRootNode()->addChildrenNode(&cube4); //testScene.getScenegraph()->getRootNode()->addChildrenNode(&teaNode); double startTime = glfwGetTime(); //Renderloop //create Light spheres for DS Node lights = Node("Root"); Sphere lightSphere = Sphere(); for (int i = -4; i < 4; i++) for (int j = -4; j < 4; j++) { Node *newLight = new Node(std::string("Node_"+std::to_string(i)+std::to_string(j))); newLight->addGeometry(&lightSphere); newLight->setModelMatrix(glm::translate(glm::mat4(1.0f), glm::vec3(i*1.5, 1.0f, j*1.5))); //newLight.setModelMatrix(glm::translate(glm::mat4(1.0f), glm::vec3(0, 1, 1.0f))); newLight->setModelMatrix(glm::scale(newLight->getModelMatrix(), glm::vec3(2.0, 2.0, 2.0))); lights.addChildrenNode(newLight); } int outputFPS = 0; while (!glfwWindowShouldClose(testWindow.getWindow())) { // You have to compute the delta time float deltaTime = glfwGetTime() - startTime; cam.setSensitivity(deltaTime); //if (!(outputFPS % 20)) //std::cout << "FPS: " << static_cast<int>(1 / (glfwGetTime() - startTime)) << std::endl; std::cout << "FPS: " << static_cast<double>(glfwGetTime() - startTime) * 100 << std::endl; outputFPS++; startTime = glfwGetTime(); //update Model Matrix lights.setModelMatrix(glm::rotate(lights.getModelMatrix(), 10.0f * deltaTime, glm::vec3(0.0, 1.0, 0.0))); fboGBuffer.bind(); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderGBuffer.bind(); shaderGBuffer.sendMat4("viewMatrix", cam.getViewMatrix()); shaderGBuffer.sendMat4("projectionMatrix", cam.getProjectionMatrix()); testScene.render(shaderGBuffer); shaderGBuffer.unbind(); fboGBuffer.unbind(); //DEFERRED SHADING TEIL============================ fboDeferredShading.bind(); glCullFace(GL_FRONT); glEnable(GL_CULL_FACE); glDisable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_ONE, GL_ONE); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderDsLightingShader.bind(); shaderDsLightingShader.sendMat4("viewMatrix", cam.getViewMatrix()); shaderDsLightingShader.sendMat4("projectionMatrix", cam.getProjectionMatrix()); shaderDsLightingShader.sendSampler2D("positionMap", fboGBuffer.getColorTexture(0),0); shaderDsLightingShader.sendSampler2D("normalMap", fboGBuffer.getColorTexture(1),1); shaderDsLightingShader.sendInt("windowWidth", testWindow.getWidth()); shaderDsLightingShader.sendInt("windowHeight", testWindow.getHeight()); shaderDsLightingShader.sendVec3("lightColor", glm::fvec3(0.7f,0.7f,0.4f)); lights.render(shaderDsLightingShader); glDisable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); glClearColor(1.0, 1.0, 1.0, 0.0); shaderDsLightingShader.unbind(); fboDeferredShading.unbind(); //COMPOSITING TEIL =============================== fboCompositing.bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderDsCompositingShader.bind(); shaderDsCompositingShader.sendSampler2D("colorMap", fboGBuffer.getColorTexture(2),0); shaderDsCompositingShader.sendSampler2D("lightMap", fboDeferredShading.getColorTexture(2),1); screenFillingQuad.renderGeometry(); shaderDsCompositingShader.unbind(); fboCompositing.unbind(); //================================================ //ScreenFillingQuad Render Pass shaderSFQ.bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if (glfwGetKey(testWindow.getWindow(), GLFW_KEY_F1)) shaderSFQ.sendSampler2D("fboTexture", fboDeferredShading.getColorTexture(2)); else shaderSFQ.sendSampler2D("fboTexture", fboCompositing.getColorTexture(2)); screenFillingQuad.renderGeometry(); shaderSFQ.unbind(); glfwSwapBuffers(testWindow.getWindow()); glfwPollEvents(); } glfwDestroyWindow(testWindow.getWindow()); glfwTerminate(); return 0; }
//===================================================================// //==================Main Method=====================================// //==================================================================// int main() { //===================================================================// //==================Things you need to start with====================// //==================================================================// glfwInit(); Window testWindow(500, 50, 800, 600, "testWindow"); glfwMakeContextCurrent(testWindow.getWindow()); // Callback glfwSetKeyCallback(testWindow.getWindow(), key_callback); cam.setKeySpeed(2.0); cam.setNearFar(0.01, 100); glewInit(); OpenGL3Context context; //renderer = new Renderer(context); Renderer renderer(context); //===================================================================// //==================Shaders for your program========================// //==================================================================// VertexShader vs(loadShaderSource(SHADERS_PATH + std::string("/Vertex-Shaders/TextureShader3D.vert"))); FragmentShader fs(loadShaderSource(SHADERS_PATH + std::string("/Fragment-Shaders/TextureShader3D.frag"))); ShaderProgram shader(vs, fs); VertexShader vsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.vert"))); FragmentShader fsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.frag"))); ShaderProgram shaderGBuffer(vsGBuffer, fsGBuffer); VertexShader vsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.vert"))); FragmentShader fsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.frag"))); ShaderProgram shaderSFQ(vsSfq, fsSfq); FBO fboGBuffer(WINDOW_WIDTH, WINDOW_HEIGHT, 3, true, false); ParticleSystem* particle = new ParticleSystem(glm::vec3(0, 0, 0), (char*)RESOURCES_PATH "/XML/ComicCloudEffect.xml"); particle->m_type = ParticleType::FIGHT; ParticleSystem* particle2 = new ParticleSystem(glm::vec3(0, 0, 0), (char*)RESOURCES_PATH "/XML/SwarmOfFliesEffect.xml"); particle2->m_type = ParticleType::SWARMOFFLIES; ParticleSystem* particleFire = new ParticleSystem(glm::vec3(0, 0, 0), (char*)RESOURCES_PATH "/XML/Fire.xml"); particleFire->m_type = ParticleType::FIRE; Node particleNode("ParticleNode"); particleNode.addParticleSystem(particle2); particleNode.setCamera(&cam); particleNode.setParticleActive(true); Node particleNodeFire("ParticleNodeFire"); particleNodeFire.addParticleSystem(particleFire); particleNodeFire.setCamera(&cam); particleNodeFire.setParticleActive(true); //===================================================================// //==================A Graph for the AI-Unit=========================// //==================================================================// glm::vec3 posFood(10.0, 0.0, -5.0); glm::vec3 posSpawn(3.0, 0.0, 3.0); Graph<AStarNode, AStarAlgorithm> testGraph; //===================================================================// //==================A Decision-Tree for the AI-Unit==================// //==================================================================// DecisionTree defaultTree; defaultTree.setAntTreeAggressiv(); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: AI==============================// Teapot teaAnt; Texture texPlayer((char*)RESOURCES_PATH "/Mesh/Snake.jpg"); SoundFileHandler sfh = SoundFileHandler(1000); AStarNode defaultASNode(); Ant ant_Flick; ant_Flick.setAntAfraid(); AntMesh ant; Node aiNode("Flick"); aiNode.addGeometry(&ant); aiNode.addTexture(&texPlayer); aiNode.addTranslation(ant_Flick.getPosition().x, ant_Flick.getPosition().y, ant_Flick.getPosition().z); aiNode.setObject(&ant_Flick); ant_Flick.setSoundHandler(&sfh); ant_Flick.setSourceName(MOVESOUND_AI, "AIFootsteps", RESOURCES_PATH "/Sound/Footsteps.wav"); sfh.disableLooping("AIFootsteps"); ant_Flick.setSourceName(DEATHSOUND_AI, "AIDeath", RESOURCES_PATH "/Sound/death.wav"); sfh.disableLooping("AIDeath"); ant_Flick.setSourceName(EATSOUND_AI, "AIEssen", RESOURCES_PATH "/Sound/Munching.wav"); sfh.disableLooping("AIEssen"); ant_Flick.setSourceName(DEATHSOUND_FLIES_AI, "Flies", RESOURCES_PATH "/Sound/Fliege_kurz.wav"); sfh.setGain("Flies", 7.0); Rect screenFillingQuad; screenFillingQuad.loadBufferData(); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Player===========================// Teapot teaPlayer; Texture texCV((char*)RESOURCES_PATH "/cv_logo.bmp"); GekoMesh gekoMesh; geko.setExp(0.0); geko.setLevelThreshold(100.0); geko.setLevel(0); Node playerNode("Player"); playerNode.addGeometry(&gekoMesh); playerNode.setObject(&geko); playerNode.addTexture(&texCV); sfh.generateSource(posFood, RESOURCES_PATH "/Sound/Rascheln.wav"); geko.setSoundHandler(&sfh); geko.setSourceName(MOVESOUND, "SpielerFootsteps", RESOURCES_PATH "/Sound/Rascheln.wav"); //geko.setSourceName(BACKGROUNDMUSIC, "Hintergrund", RESOURCES_PATH "/Sound/jingle2.wav"); geko.setSourceName(FIGHTSOUND, "Kampfsound", RESOURCES_PATH "/Sound/punch.wav"); geko.setSourceName(EATSOUND, "Essen", RESOURCES_PATH "/Sound/Munching.wav"); geko.setSourceName(QUESTSOUND, "Quest", RESOURCES_PATH "/Sound/jingle.wav"); geko.setSourceName(ITEMSOUND, "Item", RESOURCES_PATH "/Sound/itempickup.wav"); geko.setSourceName(FIRESOUND, "Fire", RESOURCES_PATH "/Sound/Feuer_kurz.wav"); sfh.disableLooping("Essen"); sfh.disableLooping("Quest"); sfh.disableLooping("Item"); //sfh.generateSource("Feuer",posFood, RESOURCES_PATH "/Sound/Feuer kurz.wav"); playerNode.setCamera(&cam); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Tree===========================// StaticObject treeStatic; treeStatic.setTree(); TreeMesh tree; Node treeNode("Tree"); treeNode.addGeometry(&tree); treeNode.setObject(&treeStatic); treeNode.addTranslation(posFood); treeNode.getBoundingSphere()->radius = 3.0; //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Plane===========================// StaticObject terrainObject; terrainObject.setClassType(ClassType::TERRAIN); Plane terrain; Texture terrainTex((char*)RESOURCES_PATH "/Grass.jpg"); Node terrainNode("Plane"); terrainNode.addGeometry(&terrain); terrainNode.addTexture(&terrainTex); terrainNode.setObject(&terrainObject); terrainNode.addTranslation(0.0, -0.75, 0.0); terrainNode.addRotation(90.0f, glm::vec3(1.0, 0.0, 0.0)); terrainNode.addScale(20.0, 20.0, 20.0); //===================================================================// //==================Setting up the Level and Scene==================// //==================================================================// Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); testLevel.getFightSystem()->setParticle(particle); //==================Add Camera to Scene============================// testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->setActiveCamera("PlayerViewCam"); //==================Set Input-Maps and activate one================// iH.setAllInputMaps(*(testScene.getScenegraph()->getActiveCamera())); iH.changeActiveInputMap(MapType::OBJECT); iH.getActiveInputMap()->update(geko); //==================Add Objects to the Scene=======================// //==================Update the Bounding-Sphere 1st time============// testScene.getScenegraph()->getRootNode()->addChildrenNode(&aiNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&playerNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&terrainNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&treeNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&particleNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&particleNodeFire); testScene.getScenegraph()->addParticleSystem(particle); testScene.getScenegraph()->addParticleSystem(particle2); testScene.getScenegraph()->addParticleSystem(particleFire); // ============================================================== // == Questsystem ==================================================== // ============================================================== //QuestHandler questhandler; /*Quest questCollect(1); questCollect.setActive(true); Goal_Collect goalCollect(1); Goal_Collect goalCollect3(3); questCollect.addGoal(&goalCollect); questCollect.addGoal(&goalCollect3); ExpReward expReward(1); expReward.setExp(100); questCollect.addReward(&expReward); Item cookie2(100); cookie2.setName("Cookie100"); cookie2.setTypeId(ItemType::COOKIE); ItemReward itemReward(2); itemReward.addItem(&cookie2); questCollect.addReward(&itemReward); Quest questCollect2(2); questCollect2.setActive(true); Goal_Collect goalCollect2(2); questCollect2.addGoal(&goalCollect2); questCollect2.addReward(&expReward); questCollect2.addReward(&itemReward); goalCollect.setGoalCount(50); goalCollect2.setGoalCount(50); goalCollect3.setGoalCount(50); goalCollect.setItemType(ItemType::BRANCH); goalCollect2.setItemType(ItemType::BRANCH); goalCollect3.setItemType(ItemType::COOKIE); testLevel.getQuestHandler()->addQuest(&questCollect); testLevel.getQuestHandler()->addQuest(&questCollect2);*/ Quest questKillAnt(1); Quest questEatAnt(2); Quest questCollectCookie(3); Quest questCollectBranch(4); Goal_Kill killAnt(1); Goal_Eaten eatAnt(2); Goal_Collect collectCookie(3); Goal_Collect collectBranch(4); questKillAnt.addGoal(&killAnt); questEatAnt.addGoal(&eatAnt); questCollectCookie.addGoal(&collectCookie); questCollectBranch.addGoal(&collectBranch); killAnt.setGoalCount(1); eatAnt.setGoalCount(1); collectCookie.setGoalCount(1); collectBranch.setGoalCount(1); collectBranch.setItemType(ItemType::BRANCH); collectCookie.setItemType(ItemType::COOKIE); ExpReward expReward(1); expReward.setExp(100); questKillAnt.addReward(&expReward); questEatAnt.addReward(&expReward); questCollectCookie.addReward(&expReward); questCollectBranch.addReward(&expReward); QuestGraph questGraph; QuestGraphNode nodeStart; nodeStart.setQuest(&questKillAnt); questGraph.addNode(&nodeStart); questKillAnt.setActive(true); QuestGraphNode nodeSecond; nodeSecond.setQuest(&questEatAnt); nodeSecond.setParent(&nodeStart); questGraph.addNode(&nodeSecond); QuestGraphNode nodeThird; nodeThird.setQuest(&questCollectCookie); nodeThird.setParent(&nodeSecond); questGraph.addNode(&nodeThird); QuestGraphNode nodeFourth; nodeFourth.setQuest(&questCollectBranch); nodeFourth.setParent(&nodeThird); questGraph.addNode(&nodeFourth); testLevel.getQuestHandler()->addQuest(&questKillAnt); testLevel.getQuestHandler()->addQuest(&questEatAnt); testLevel.getQuestHandler()->addQuest(&questCollectBranch); testLevel.getQuestHandler()->addQuest(&questCollectCookie); testLevel.getQuestHandler()->setGraph(&questGraph); //===================================================================// //==================Setting up the Collision=========================// //==================================================================// CollisionTest collision; collision.collectNodes(testScene.getScenegraph()->getRootNode()); //===================================================================// //==================Setting up the Observers========================// //==================================================================// ObjectObserver aiObserver(&testLevel); SoundObserver soundAIObserver(&testLevel); ant_Flick.addObserver(&aiObserver); ant_Flick.addObserver(&soundAIObserver); ObjectObserver playerObserver(&testLevel); SoundObserver soundPlayerObserver(&testLevel); geko.addObserver(&playerObserver); geko.addObserver(&soundPlayerObserver); CollisionObserver colObserver(&testLevel); collision.addObserver(&colObserver); collision.addObserver(&soundPlayerObserver); GravityObserver gravityObserver(&testLevel); collision.addObserver(&gravityObserver); QuestObserver questObserver(&testLevel); /*questCollect.addObserver(&questObserver); questCollect2.addObserver(&questObserver); questCollect.addObserver(&soundPlayerObserver); questCollect2.addObserver(&soundPlayerObserver); goalCollect.addObserver(&questObserver); goalCollect2.addObserver(&questObserver); goalCollect3.addObserver(&questObserver);*/ questKillAnt.addObserver(&questObserver); questEatAnt.addObserver(&questObserver); questCollectCookie.addObserver(&questObserver); questCollectBranch.addObserver(&questObserver); killAnt.addObserver(&questObserver); eatAnt.addObserver(&questObserver); collectCookie.addObserver(&questObserver); collectBranch.addObserver(&questObserver); testLevel.getFightSystem()->addObserver(&questObserver); //===================================================================// //==================Setting up the Gravity===========================// //==================================================================// Gravity gravity; playerNode.addGravity(&gravity); aiNode.addGravity(&gravity); //===================================================================// //==================The Render-Loop==================================// //==================================================================// float lastTime = glfwGetTime(); sfh.playSource("Feuer"); sfh.playSource("Hintergrund"); sfh.setGain("Hintergrund", 0.5f); //===================================================================// //==================The Particle-System==============================// //==================================================================// //Effect* smBla = new Effect(); //smBla->loadEffect((char*)RESOURCES_PATH "/XML/ComicCloudEffect.xml"); //ParticleSystem* particle = new ParticleSystem(glm::vec3(0, 0, -10), smBla); // ParticleSystem* particle = new ParticleSystem(glm::vec3(0, 0, 0), (char*)RESOURCES_PATH "/XML/ComicCloudEffect.xml"); //===================================================================// //==================The GUI=========================================// //==================================================================// //======================================================================================================== //SETUP GUI //Texture bricks((char*)RESOURCES_PATH "/bricks_diffuse.png"); //hud = new GUI("testGUI", HUD_WIDTH, HUD_HEIGHT); //hud->setPosition((WINDOW_WIDTH / 2) - (HUD_WIDTH / 2), WINDOW_HEIGHT - HUD_HEIGHT); //hud->setCollapsable(false); //hud->setTitleBarVisible(false); //hud->setBackgroundAlpha(0.5f); //hud->setResizable(false); //hud->setUseScrollbar(false); //hud->setMoveable(false); //int hp = playerNode.getPlayer()->getHealth(); //int hpMax = 10; //int exp = playerNode.getPlayer()->getExp(); //int expMax = playerNode.getPlayer()->getLevelThreshold(); //GuiElement::ProgressBar *hpBar = new GuiElement::ProgressBar(&hp, hpMax, 300, glm::fvec4(1.0f, 0.0f, 0.0f, 1.0f)); //hud->addElement(hpBar); //hud->addElement(new GuiElement::SameLine()); //hud->addElement(new GuiElement::Text("HP")); //GuiElement::ProgressBar *expBar = new GuiElement::ProgressBar(&exp, expMax, 300, glm::fvec4(1.0f, 0.9960784f, 0.9529411f, 1.0f)); //hud->addElement(expBar); //hud->addElement(new GuiElement::SameLine()); //hud->addElement(new GuiElement::Text("EXP")); //hud->addElement(new GuiElement::Spacing()); //hud->addElement(new GuiElement::Separator()); //hud->addElement(new GuiElement::Spacing()); //hud->addElement(new GuiElement::Text("LVL")); //int level = playerNode.getPlayer()->getLvl(); //hud->addElement(new GuiElement::SameLine()); //GuiElement::IntBox *lvlBox = new GuiElement::IntBox(&level, glm::fvec4(1.0f, 1.0f, 1.0f, 1.0f), glm::fvec4(0.7f, 0.7f, 0.7f, 1.0f)); //hud->addElement(lvlBox); //hud->addElement(new GuiElement::SameLine()); //GuiElement::PushButton *inventoryButton = new GuiElement::PushButton("Inventory"); //hud->addElement(inventoryButton); //hud->addElement(new GuiElement::SameLine()); //GuiElement::PushButton *questButton = new GuiElement::PushButton("Quests"); //hud->addElement(questButton); //questWindow = new GuiElement::NestedWindow(); //questWindow->hide(); //GuiElement::Header *quest1 = new GuiElement::Header("Test the Quest"); //quest1->addElement(new GuiElement::Text("Quest description here bla bla bla")); //GuiElement::Header *quest2 = new GuiElement::Header("Testwindow Questwindow"); //quest2->addElement(new GuiElement::Text("Quest description here too bla bla bla")); //questWindow->addElement(quest1); //questWindow->addElement(quest2); //questWindow->setName("Quests"); //questWindow->setCollapsable(false); //questWindow->setPosition(WINDOW_WIDTH - QUEST_WIDTH, (WINDOW_HEIGHT / 2) - (QUEST_HEIGHT / 2)); //questWindow->setSize(QUEST_WIDTH, QUEST_HEIGHT); //hud->addNestedWindow(questWindow); //inventoryWindow = new GuiElement::NestedWindow(); //inventoryWindow->hide(); //inventoryWindow->setName("Inventory"); //inventoryWindow->setCollapsable(false); //inventoryWindow->setResizable(false); //inventoryWindow->setPosition(WINDOW_WIDTH - QUEST_WIDTH, (WINDOW_HEIGHT / 2) - (QUEST_HEIGHT / 2)); //inventoryWindow->setSize(QUEST_WIDTH, QUEST_HEIGHT); //hud->addNestedWindow(inventoryWindow); //std::map<std::string, Texture*> *inventoryItems = new std::map<std::string, Texture*>(); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem1"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem2"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem3"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem4"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem5"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem6"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem7"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem8"), &bricks)); //inventoryItems->insert(std::pair<std::string, Texture*>(std::string("bricksItem9"), &bricks)); //GuiElement::Inventory *inventory = new GuiElement::Inventory(inventoryItems, 6); //inventoryWindow->addElement(inventory); // PlayerGUI playerGUI(HUD_WIDTH, HUD_HEIGHT, WINDOW_HEIGHT, WINDOW_WIDTH, QUEST_HEIGHT, QUEST_WIDTH, playerNode.getPlayer()); float testFloat = float(0.0f); float testFloat2 = float(0.0f); /*testLevel.addGUI(hud); testLevel.getGUI("testGUI")->m_windowName;*/ while (!glfwWindowShouldClose(testWindow.getWindow())) { //glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float currentTime = glfwGetTime(); float deltaTime = currentTime - lastTime; lastTime = currentTime; fboGBuffer.bind(); glClearColor(0.5, 0.5, 0.5, 1.0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderGBuffer.bind(); shaderGBuffer.sendMat4("viewMatrix", cam.getViewMatrix()); shaderGBuffer.sendMat4("projectionMatrix", cam.getProjectionMatrix()); testScene.render(shaderGBuffer); ant_Flick.update(); geko.update(); geko.deleteKeyInput(); geko.setDeltaTime(currentTime); collision.update(); //TEST //particle->update(cam); //particle->render(cam); shaderGBuffer.unbind(); fboGBuffer.unbind(); //ScreenFillingQuad Render Pass shaderSFQ.bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderSFQ.sendSampler2D("fboTexture", fboGBuffer.getColorTexture(2)); screenFillingQuad.renderGeometry(); shaderSFQ.unbind(); glfwSwapBuffers(testWindow.getWindow()); glfwPollEvents(); } glfwDestroyWindow(testWindow.getWindow()); glfwTerminate(); return 0; }
//===================================================================// //==================Main Method=====================================// //==================================================================// int main() { //===================================================================// //==================Things you need to start with====================// //==================================================================// glfwInit(); Window testWindow(500, 50, 800, 600, "Demo"); glfwMakeContextCurrent(testWindow.getWindow()); // Callback glfwSetKeyCallback(testWindow.getWindow(), key_callback); cam.setKeySpeed(2.0); cam.setNearFar(0.01, 100); glewInit(); OpenGL3Context context; //renderer = new Renderer(context); Renderer renderer(context); //===================================================================// //==================Shaders for your program========================// //==================================================================// VertexShader vs(loadShaderSource(SHADERS_PATH + std::string("/Vertex-Shaders/TextureShader3D.vert"))); FragmentShader fs(loadShaderSource(SHADERS_PATH + std::string("/Fragment-Shaders/TextureShader3D.frag"))); ShaderProgram shader(vs, fs); VertexShader vsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.vert"))); FragmentShader fsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.frag"))); ShaderProgram shaderGBuffer(vsGBuffer, fsGBuffer); VertexShader vsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.vert"))); FragmentShader fsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.frag"))); ShaderProgram shaderSFQ(vsSfq, fsSfq); VertexShader vsSkybox(loadShaderSource(SHADERS_PATH + std::string("/SkyboxShader/SkyboxShader.vert"))); FragmentShader fsSkybox(loadShaderSource(SHADERS_PATH + std::string("/SkyboxShader/SkyboxShader.frag"))); ShaderProgram shaderSkybox(vsSkybox, fsSkybox); FBO fboGBuffer(WINDOW_WIDTH, WINDOW_HEIGHT, 3, true, false); SoundFileHandler sfh = SoundFileHandler(1000); Rect screenFillingQuad; screenFillingQuad.loadBufferData(); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Terrain===========================// StaticObject terrainObject; terrainObject.setClassType(ClassType::TERRAIN); Texture terrainTex((char*)RESOURCES_PATH "/Grass2.jpg"); Terrain terrain2((char*)RESOURCES_PATH "/heightmap.jpg", 0.0f, 0.0f); Node terrainNode2("Terrain"); terrainNode2.addGeometry(&terrain2); terrainNode2.addTexture(&terrainTex); terrainNode2.setObject(&terrainObject); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Player===========================// Texture texCV((char*)RESOURCES_PATH "/cv_logo.bmp"); GekoMesh gekoMesh; geko.setExp(0.0); geko.setLevelThreshold(100.0); geko.setLevel(0); Node playerNode("Player"); playerNode.addGeometry(&gekoMesh); playerNode.setObject(&geko); playerNode.addTexture(&texCV); sfh.generateSource(glm::vec3(geko.getPosition()), RESOURCES_PATH "/Sound/Rascheln.wav"); geko.setSoundHandler(&sfh); geko.setSourceName(MOVESOUND, "SpielerFootsteps", RESOURCES_PATH "/Sound/Rascheln.wav"); //geko.setSourceName(BACKGROUNDMUSIC, "Hintergrund", RESOURCES_PATH "/Sound/jingle2.wav"); geko.setSourceName(FIGHTSOUND, "Kampfsound", RESOURCES_PATH "/Sound/punch.wav"); geko.setSourceName(EATSOUND, "Essen", RESOURCES_PATH "/Sound/Munching.wav"); geko.setSourceName(QUESTSOUND, "Quest", RESOURCES_PATH "/Sound/jingle.wav"); geko.setSourceName(ITEMSOUND, "Item", RESOURCES_PATH "/Sound/itempickup.wav"); geko.setSourceName(FIRESOUND, "Fire", RESOURCES_PATH "/Sound/Feuer_kurz.wav"); sfh.disableLooping("Essen"); sfh.disableLooping("Quest"); sfh.disableLooping("Item"); geko.setPosition(glm::vec4(terrain2.getResolutionX() / 2.0f, 10.0f, terrain2.getResolutionY() / 2.0f, 1.0)); //sfh.generateSource("Feuer",posFood, RESOURCES_PATH "/Sound/Feuer kurz.wav"); playerNode.setCamera(&cam); //===================================================================// //==================Setting up the Level and Scene==================// //==================================================================// Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); testLevel.setTerrain(&terrain2); //==================Add Camera to Scene============================// testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->setActiveCamera("PlayerViewCam"); //==================Set Input-Maps and activate one================// iH.setAllInputMaps(*(testScene.getScenegraph()->getActiveCamera())); iH.changeActiveInputMap(MapType::OBJECT); iH.getActiveInputMap()->update(geko); //==================Add Objects to the Scene=======================// //==================Update the Bounding-Sphere 1st time============// /*Node translateNode("Translate"); translateNode.addTranslation(glm::vec3(terrain2.getResolutionX() / 2.0f, 0.0, terrain2.getResolutionY() / 2.0f));*/ testScene.getScenegraph()->getRootNode()->addChildrenNode(&terrainNode2); testScene.getScenegraph()->getRootNode()->addChildrenNode(&playerNode); //testScene.getScenegraph()->getRootNode()->addChildrenNode(&translateNode); //testScene.getScenegraph()->getRootNode()->getChildrenNode("Translate")->addChildrenNode(&playerNode); //===================================================================// //==================Setting up the Observers========================// //==================================================================// ObjectObserver playerObserver(&testLevel); SoundObserver soundPlayerObserver(&testLevel); geko.addObserver(&playerObserver); geko.addObserver(&soundPlayerObserver); // ============================================================== // == Object (Forest) ========================================== // ============================================================== TreeMesh tree; glm::vec3 tmp; std::stringstream name; for (int i = 0; i<TreeData::forest1.size(); i++) { name << "Forest1Tree" << i; std::string stringname = name.str(); StaticObject *treeStatic = new StaticObject(); treeStatic->setTree(50 / TreeData::forest1.size()); Node *treeNode = new Node(stringname); treeNode->addGeometry(&tree); treeNode->setObject(treeStatic); tmp.x = TreeData::forest1[i].x; tmp.z = TreeData::forest1[i].z; tmp.y = terrain2.getHeight(glm::vec2(tmp.x, tmp.z)); treeNode->addTranslation(tmp); treeNode->getBoundingSphere()->radius = 2.5; testScene.getScenegraph()->getRootNode()->addChildrenNode(treeNode); name.str(""); } for (int i = 0; i<TreeData::forest2.size(); i++) { name << "Forest2Tree" << i; std::string stringname = name.str(); StaticObject *treeStatic = new StaticObject(); treeStatic->setTree(50 / TreeData::forest2.size()); Node *treeNode = new Node(stringname); treeNode->addGeometry(&tree); treeNode->setObject(treeStatic); tmp.x = TreeData::forest2[i].x; tmp.z = TreeData::forest2[i].z; tmp.y = terrain2.getHeight(glm::vec2(tmp.x, tmp.z)); treeNode->addTranslation(tmp); treeNode->getBoundingSphere()->radius = 2.5; testScene.getScenegraph()->getRootNode()->addChildrenNode(treeNode); name.str(""); } // ============================================================== // == Object (Anthome) ========================================== // ============================================================== glm::vec3 posFood(10.0, 0.0, -5.0); glm::vec3 posFood2((terrain2.getResolutionX() / 2.0f) + 10.0, 0.0, (terrain2.getResolutionY() / 2.0f) - 5.0); glm::vec3 posSpawn(terrain2.getResolutionX() / 2.0f, 10.0, terrain2.getResolutionY() / 2.0f); glm::vec3 posDefaultPlayer(0.0, 0.0, 0.0); AntMesh antMesh; DecisionTree *aggressivedecisionTree = new DecisionTree(); aggressivedecisionTree->setAntTreeAggressiv(); DecisionTree *afraidDecisionTree = new DecisionTree(); afraidDecisionTree->setAntTreeAfraid(); Graph<AStarNode, AStarAlgorithm>* antAggressiveGraph = new Graph<AStarNode, AStarAlgorithm>(); antAggressiveGraph->setExampleAntAggressiv(posSpawn, posFood2, posDefaultPlayer); Graph<AStarNode, AStarAlgorithm>* antAfraidGraph = new Graph<AStarNode, AStarAlgorithm>(); antAfraidGraph->setExampleAntAfraid2(posSpawn, posDefaultPlayer); AntHome antHome(posSpawn, antMesh, &playerObserver, &texCV, &texCV, aggressivedecisionTree, antAggressiveGraph, afraidDecisionTree, antAfraidGraph); //antHome.generateGuards(5, &aiObserver, testScene.getScenegraph()->getRootNode()); antHome.generateWorkers(5, testScene.getScenegraph()->getRootNode()); /*antHome.addAntsToSceneGraph(testScene.getScenegraph()->getRootNode());*/ //===================================================================// //==================Setting up the Collision=========================// //==================================================================// CollisionTest collision; collision.collectNodes(testScene.getScenegraph()->getRootNode()); CollisionObserver colObserver(&testLevel); collision.addObserver(&colObserver); collision.addObserver(&soundPlayerObserver); GravityObserver gravityObserver(&testLevel); collision.addObserver(&gravityObserver); //===================================================================// //==================Setting up the Gravity===========================// //==================================================================// Gravity gravity; playerNode.addGravity(&gravity); //===================================================================// //==================Setting up the Gravity===========================// //==================================================================// PlayerGUI playerGUI(HUD_WIDTH, HUD_HEIGHT, WINDOW_HEIGHT, WINDOW_WIDTH, QUEST_HEIGHT, QUEST_WIDTH, playerNode.getPlayer()); //===================================================================// //==================The Render-Loop==================================// //==================================================================// float lastTime = glfwGetTime(); sfh.playSource("Hintergrund"); sfh.setGain("Hintergrund", 0.5f); //TODO adjust the Rotation,to match the Terrain glm::vec4 tmpPos; glm::vec3 normalFromTerrain; glm::vec3 rotateAxis; glm::vec4 viewDirFromPlayer; glm::vec3 up(0.0, 1.0, 0.0); float lengthFromNormal; float lengthFromUp; float phi; while (!glfwWindowShouldClose(testWindow.getWindow())) { float currentTime = glfwGetTime(); float deltaTime = currentTime - lastTime; lastTime = currentTime; //===================================================================// //==================Update your Objects per Frame here =============// //==================================================================// collision.update(); //===================================================================// //==================Input and update for the Player==================// //==================================================================// geko.update(); geko.setDeltaTime(currentTime); tmpPos = testScene.getScenegraph()->searchNode("Player")->getPlayer()->getPosition(); viewDirFromPlayer = testScene.getScenegraph()->searchNode("Player")->getPlayer()->getViewDirection(); //ToDo calculate Normal funktioniert evtl falsch normalFromTerrain = terrain2.calculateNormal(tmpPos.x, tmpPos.z); rotateAxis = glm::cross(glm::vec3(viewDirFromPlayer), normalFromTerrain ); // lengthFromNormal = glm::length(normalFromTerrain); // lengthFromUp = glm::length(up); normalFromTerrain = glm::normalize(normalFromTerrain); up = glm::normalize(up); phi = glm::dot(up, normalFromTerrain); phi = glm::atan(phi) * (180 / glm::pi<float>()); // phi = glm::acos(glm::dot(normalFromTerrain, up) / (lengthFromNormal * lengthFromUp)); //ToDo Rotation überschreibt die frühere Rotation testScene.getScenegraph()->searchNode("Player")->addRotation(phi, rotateAxis); antHome.updateAnts(); //===================================================================// //==================Render your Objects==============================// //==================================================================// //renderer.renderScene(testScene, testWindow); fboGBuffer.bind(); glClearColor(0.5, 0.5, 0.5, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderGBuffer.bind(); shaderGBuffer.sendMat4("viewMatrix", cam.getViewMatrix()); shaderGBuffer.sendMat4("projectionMatrix", cam.getProjectionMatrix()); testScene.render(shaderGBuffer); shaderGBuffer.unbind(); fboGBuffer.unbind(); //ScreenFillingQuad Render Pass shaderSFQ.bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderSFQ.sendSampler2D("fboTexture", fboGBuffer.getColorTexture(2)); screenFillingQuad.renderGeometry(); shaderSFQ.unbind(); renderer.renderGUI(*playerGUI.getHUD(), testWindow); glfwSwapBuffers(testWindow.getWindow()); glfwPollEvents(); } glfwDestroyWindow(testWindow.getWindow()); glfwTerminate(); return 0; }
int main() { glfwInit(); Window testWindow(50, 50, WINDOW_WIDTH, WINDOW_HEIGHT, "Reflections"); glfwMakeContextCurrent(testWindow.getWindow()); glClearColor(0.0f, 0.0f, 0.0f, 1.0f); cam.setRadius(2.0); cam.setPosition(glm::vec4(0.0, 1.0, 1.0, 1.0)); cam.setName("TrackballCam"); cam.setNearFar(0.1f, 50.0f); cam.moveDown(); iH.setAllInputMaps(cam); iH.changeActiveInputMap("Trackball"); //Callback glfwSetKeyCallback(testWindow.getWindow(), key_callback); glewInit(); //our shader VertexShader vsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.vert"))); FragmentShader fsGBuffer(loadShaderSource(SHADERS_PATH + std::string("/GBuffer/GBuffer.frag"))); ShaderProgram shaderGBuffer(vsGBuffer, fsGBuffer); VertexShader vsRLR(loadShaderSource(SHADERS_PATH + std::string("/RealtimeLocalReflections/RealtimeLocalReflections.vert"))); FragmentShader fsRLR(loadShaderSource(SHADERS_PATH + std::string("/RealtimeLocalReflections/RealtimeLocalReflections.frag"))); ShaderProgram shaderRLR(vsRLR, fsRLR); VertexShader vsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.vert"))); FragmentShader fsSfq(loadShaderSource(SHADERS_PATH + std::string("/ScreenFillingQuad/ScreenFillingQuad.frag"))); ShaderProgram shaderSFQ(vsSfq, fsSfq); //our renderer OpenGL3Context context; Renderer renderer(context); FBO fboGBuffer(WINDOW_WIDTH, WINDOW_HEIGHT, 3, true, false); FBO fboSSR(WINDOW_WIDTH, WINDOW_HEIGHT, 3, false, false); //our object Cube cube; Teapot teapot; teapot.loadBufferData(); Rect plane; Rect screenFillingQuad; screenFillingQuad.loadBufferData(); //our textures Texture bricks((char*)RESOURCES_PATH "/brick.bmp"); Texture marble((char*)RESOURCES_PATH "/seamless_marble.jpg"); Texture chrome((char*)RESOURCES_PATH "/chrome.jpg"); //Scene creation Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); //Add Camera to scenegraph testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->getCamera("TrackballCam"); testScene.getScenegraph()->setActiveCamera("TrackballCam"); Node cube1("cube1"); cube1.addGeometry(&cube); cube1.addTexture(&bricks); cube1.setModelMatrix(glm::translate(cube1.getModelMatrix(), glm::vec3(-0.3, 0.25, 0.2))); cube1.setModelMatrix(glm::scale(cube1.getModelMatrix(), glm::vec3(0.3, 0.3, 0.3))); Node cube2("cube2"); cube2.addGeometry(&cube); cube2.addTexture(&bricks); cube2.setModelMatrix(glm::translate(cube2.getModelMatrix(), glm::vec3(0.7, 0.25, 0.3))); cube2.setModelMatrix(glm::scale(cube2.getModelMatrix(), glm::vec3(0.3, 0.3, 0.3))); Node wallNode1("wall1"); wallNode1.addGeometry(&plane); wallNode1.addTexture(&marble); wallNode1.setModelMatrix(glm::translate(wallNode1.getModelMatrix(), glm::vec3(0.0, 0.1, 0.2))); wallNode1.setModelMatrix(glm::rotate(wallNode1.getModelMatrix(), 90.0f, glm::vec3(1.0, 0.0, 0.0))); wallNode1.setModelMatrix(glm::scale(wallNode1.getModelMatrix(), glm::vec3(1.5, 1.5, 1.5))); Node wallNode2("wall2"); wallNode2.addGeometry(&plane); wallNode2.addTexture(&marble); wallNode2.setModelMatrix(glm::translate(wallNode2.getModelMatrix(), glm::vec3(0.0, 1.0, -0.2))); wallNode2.setModelMatrix(glm::scale(wallNode2.getModelMatrix(), glm::vec3(1.5, 1.5, 1.5))); Node teaNode("teaNode"); teaNode.addGeometry(&teapot); teaNode.addTexture(&chrome); teaNode.setModelMatrix(glm::translate(teaNode.getModelMatrix(), glm::vec3(0.2, 0.3, 0.7))); teaNode.setModelMatrix(glm::scale(teaNode.getModelMatrix(), glm::vec3(0.3, 0.3, 0.3))); //Creating a scenegraph testScene.getScenegraph()->getRootNode()->addChildrenNode(&wallNode1); testScene.getScenegraph()->getRootNode()->addChildrenNode(&wallNode2); testScene.getScenegraph()->getRootNode()->addChildrenNode(&cube1); testScene.getScenegraph()->getRootNode()->addChildrenNode(&cube2); testScene.getScenegraph()->getRootNode()->addChildrenNode(&teaNode); double startTime = glfwGetTime(); //Renderloop while (!glfwWindowShouldClose(testWindow.getWindow())) { // You have to compute the delta time cam.setSensitivity(glfwGetTime() - startTime); startTime = glfwGetTime(); fboGBuffer.bind(); glClearColor(0, 0, 0, 0); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderGBuffer.bind(); shaderGBuffer.sendMat4("viewMatrix", cam.getViewMatrix()); shaderGBuffer.sendMat4("projectionMatrix", cam.getProjectionMatrix()); shaderGBuffer.sendInt("useTexture", 1); testScene.render(shaderGBuffer); shaderGBuffer.unbind(); fboGBuffer.unbind(); fboSSR.bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderRLR.bind(); shaderRLR.sendSampler2D("positionTexture", fboGBuffer.getColorTexture(0), 0); shaderRLR.sendSampler2D("normalTexture", fboGBuffer.getColorTexture(1), 1); shaderRLR.sendSampler2D("colorTexture", fboGBuffer.getColorTexture(2), 2); shaderRLR.sendSampler2D("depthBuffer", fboGBuffer.getDepthTexture(), 3); shaderRLR.sendMat4("projectionMatrix", cam.getProjectionMatrix()); shaderRLR.sendInt("screenWidth", WINDOW_WIDTH); shaderRLR.sendInt("screenHeight", WINDOW_HEIGHT); shaderRLR.sendFloat("zNear", cam.getNear()); shaderRLR.sendFloat("zFar", cam.getFar()); shaderRLR.sendFloat("reflectivity", 0.2f); screenFillingQuad.renderGeometry(); shaderRLR.unbind(); fboSSR.unbind(); //ScreenFillingQuad Render Pass shaderSFQ.bind(); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderSFQ.sendSampler2D("fboTexture", fboSSR.getColorTexture(2)); screenFillingQuad.renderGeometry(); shaderSFQ.unbind(); glfwSwapBuffers(testWindow.getWindow()); glfwPollEvents(); } glfwDestroyWindow(testWindow.getWindow()); glfwTerminate(); return 0; }
//===================================================================// //==================Main Method=====================================// //==================================================================// int main() { //===================================================================// //==================Things you need to start with====================// //==================================================================// glfwInit(); Window testWindow(500, 50, 800, 600, "testWindow"); glfwMakeContextCurrent(testWindow.getWindow()); cam.setCenter(glm::vec4(0.0, 10.0, 20.0, 1.0)); cam.setName("StrategyCam"); cam.setKeySpeed(2.0); cam.setNearFar(0.0001, 100); glfwSetKeyCallback(testWindow.getWindow(), key_callback); glfwSetScrollCallback(testWindow.getWindow(), mouseScroll_callback); glewInit(); OpenGL3Context context; Renderer renderer(context); //===================================================================// //==================Shaders for your program========================// //==================================================================// VertexShader vs(loadShaderSource(SHADERS_PATH + std::string("/TextureShader3D/TextureShader3D.vert"))); FragmentShader fs(loadShaderSource(SHADERS_PATH + std::string("/TextureShader3D/TextureShader3D.frag"))); ShaderProgram shader(vs, fs); //===================================================================// //==================A Graph for the AI-Unit=========================// //==================================================================// glm::vec3 posFood(10.0, 0.0, -5.0); glm::vec3 posSpawn(10.0, 0.0, 60.0); Graph<AStarNode, AStarAlgorithm> testGraph; // testGraph.setExampleGraph2(posSpawn, posFood, geko.getPosition()); //===================================================================// //==================A Decision-Tree for the AI-Unit==================// //==================================================================// DecisionTree defaultTree; defaultTree.setAntTreeAggressiv(); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: AI==============================// Teapot teaAnt; Texture texPlayer((char*)RESOURCES_PATH "/Snake.jpg"); SoundFileHandler sfh = SoundFileHandler(1000); //AStarNode defaultASNode("Default"); //AI ant_Flick(&defaultTree, &defaultASNode, &aiNode); AI ant_Flick; //ant_Flick.setAntAfraid(); /*ant_Flick.setGraph(&testGraph); ant_Flick.setPosition(posSpawn); ant_Flick.setPosHome(testGraph.searchNode("Spawn"));*/ //ant_Flick.addFoodNodes(testGraph.searchNode("Food")); AntMesh ant; Node aiNode("Flick"); aiNode.addGeometry(&ant); aiNode.addTexture(&texPlayer); // aiNode.addScale(0.3, 0.3, 0.3); //aiNode.addTranslation(ant_Flick.getPosition().x, ant_Flick.getPosition().y, ant_Flick.getPosition().z); aiNode.setObject(&ant_Flick); //aiNode.setSoundHandler(&sfh); // aiNode.setSourceName("Ameise1", RESOURCES_PATH "/Sound/Footsteps.wav"); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Player===========================// Teapot teaPlayer; Texture texCV((char*)RESOURCES_PATH "/cv_logo.bmp"); GekoMesh gekoMesh; geko.setExp(0.0); geko.setLevelThreshold(100.0); geko.setLevel(0); Node playerNode("Player"); playerNode.addGeometry(&gekoMesh); playerNode.setObject(&geko); playerNode.addTexture(&texCV); // playerNode.addScale(0.5, 0.5, 0.5); // playerNode.addTranslation(20.0, 0.0, 20.0); geko.setSoundHandler(&sfh); geko.setSourceName(MOVESOUND, "SpielerFootsteps", RESOURCES_PATH "/Sound/rascheln.wav"); geko.setSourceName(BACKGROUNDMUSIC, "Hintergrund", RESOURCES_PATH "/Sound/jingle2.wav"); geko.setSourceName(FIGHTSOUND, "Kampfsound", RESOURCES_PATH "/Sound/Cookies kurz.wav"); geko.setSourceName(EATSOUND, "Essen", RESOURCES_PATH "/Sound/Munching.wav"); geko.setSourceName(QUESTSOUND, "Quest", RESOURCES_PATH "/Sound/jingle.wav"); geko.setSourceName(ITEMSOUND, "Item", RESOURCES_PATH "/Sound/itempickup.wav"); sfh.disableLooping("Essen"); sfh.disableLooping("Kampfsound"); sfh.disableLooping("Quest"); sfh.disableLooping("Item"); sfh.generateSource("Feuer",posFood, RESOURCES_PATH "/Sound/Feuer kurz.wav"); playerNode.setCamera(&cam); // ============================================================== // == Items ===================================================== // ============================================================== /*Item cookie(1); cookie.setName("Cookie"); cookie.setTypeId(ItemType::COOKIE); Item cookie2(2); cookie.setName("Cookie"); cookie.setTypeId(ItemType::COOKIE); Item branch(3); branch.setName("Branch"); branch.setTypeId(ItemType::BRANCH); */ //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Tree===========================// TreeMesh tree; glm::vec3 trees[5] = { glm::vec3(16.0, 0.0, 76.0), glm::vec3(23.0, 0.0, 74.0), glm::vec3(21.5, 0.0, 78.5), glm::vec3(15.0, 0.0, 81.5), glm::vec3(27.5, 0.0, 88.5), }; StaticObject treeStatic; treeStatic.setTree(); // treeStatic.setObjectType(ObjectType::TREE); Node treeNode("Tree"); treeNode.addGeometry(&tree); treeNode.setObject(&treeStatic); //treeNode.addScale(10.0, 10.0, 10.0); treeNode.addTranslation(trees[0]); treeNode.getBoundingSphere()->radius = 3.0; StaticObject treeStatic2; treeStatic2.setTree(); Node treeNode2("Tree2"); treeNode2.addGeometry(&tree); treeNode2.setObject(&treeStatic2); treeNode2.addTranslation(trees[1]); treeNode2.getBoundingSphere()->radius = 3.0; StaticObject treeStatic3; treeStatic3.setTree(); Node treeNode3("Tree3"); treeNode3.addGeometry(&tree); treeNode3.setObject(&treeStatic3); treeNode3.addTranslation(trees[2]); treeNode3.getBoundingSphere()->radius = 3.0; StaticObject treeStatic4; treeStatic4.setTree(); Node treeNode4("Tree4"); treeNode4.addGeometry(&tree); treeNode4.setObject(&treeStatic4); treeNode4.addTranslation(trees[3]); treeNode4.getBoundingSphere()->radius = 3.0; StaticObject treeStatic5; treeStatic5.setTree(); Node treeNode5("Tree5"); treeNode5.addGeometry(&tree); treeNode5.setObject(&treeStatic5); treeNode5.addTranslation(trees[4]); treeNode5.getBoundingSphere()->radius = 3.0; //treeStatic.getInventory()->addItem(&cookie, 25); //treeStatic.getInventory()->addItem(&branch, 10); //===================================================================// //==================Object declarations - Geometry, Texture, Node=== // //==========================Object: Plane===========================// Plane terrain; Texture terrainTex((char*)RESOURCES_PATH "/Grass.jpg"); Node terrainNode("Plane"); terrainNode.addGeometry(&terrain); terrainNode.addTexture(&terrainTex); terrainNode.addTranslation(0.0, -0.75, 0.0); terrainNode.addRotation(90.0f, glm::vec3(1.0, 0.0, 0.0)); terrainNode.addScale(100.0, 100.0, 100.0); //===================================================================// //==================Setting up the Level and Scene==================// //==================================================================// Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); //==================Add Camera to Scene============================// testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->setActiveCamera("StrategyCam"); //==================Set Input-Maps and activate one================// iH.setAllInputMaps(*(testScene.getScenegraph()->getActiveCamera())); iH.changeActiveInputMap("Strategy"); //==================Add Objects to the Scene=======================// //==================Update the Bounding-Sphere 1st time============// testScene.getScenegraph()->getRootNode()->addChildrenNode(&aiNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&playerNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&terrainNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&treeNode); testScene.getScenegraph()->getRootNode()->addChildrenNode(&treeNode2); testScene.getScenegraph()->getRootNode()->addChildrenNode(&treeNode3); testScene.getScenegraph()->getRootNode()->addChildrenNode(&treeNode4); testScene.getScenegraph()->getRootNode()->addChildrenNode(&treeNode5); // ============================================================== // == Questsystem ==================================================== // ============================================================== //QuestHandler questhandler; //testLevel.getQuestHandler()->getGraph()->setExampleGraph(); Quest questCollect(1); questCollect.setActive(true); Goal_Collect goalCollect(1); Goal_Collect goalCollect3(3); questCollect.addGoal(&goalCollect); questCollect.addGoal(&goalCollect3); ExpReward expReward(1); expReward.setExp(100); questCollect.addReward(&expReward); Quest questCollect2(2); questCollect2.setActive(true); Goal_Collect goalCollect2(2); questCollect2.addGoal(&goalCollect2); questCollect2.addReward(&expReward); goalCollect.setGoalCount(50); goalCollect2.setGoalCount(50); goalCollect3.setGoalCount(50); goalCollect.setItemType(ItemType::BRANCH); goalCollect2.setItemType(ItemType::BRANCH); goalCollect3.setItemType(ItemType::COOKIE); testLevel.getQuestHandler()->addQuest(&questCollect); testLevel.getQuestHandler()->addQuest(&questCollect2); //===================================================================// //==================Setting up the Collision=========================// //==================================================================// CollisionTest collision; collision.collectNodes(testScene.getScenegraph()->getRootNode()); //===================================================================// //==================Setting up the Observers========================// //==================================================================// ObjectObserver aiObserver(&testLevel); SoundObserver soundAIObserver(&testLevel); ant_Flick.addObserver(&aiObserver); ant_Flick.addObserver(&soundAIObserver); ObjectObserver playerObserver(&testLevel); SoundObserver soundPlayerObserver(&testLevel); geko.addObserver(&playerObserver); geko.addObserver(&soundPlayerObserver); CollisionObserver colObserver(&testLevel); collision.addObserver(&colObserver); collision.addObserver(&soundPlayerObserver); GravityObserver gravityObserver(&testLevel); collision.addObserver(&gravityObserver); QuestObserver questObserver(&testLevel); questCollect.addObserver(&questObserver); questCollect2.addObserver(&questObserver); questCollect.addObserver(&soundPlayerObserver); questCollect2.addObserver(&soundPlayerObserver); goalCollect.addObserver(&questObserver); goalCollect2.addObserver(&questObserver); goalCollect3.addObserver(&questObserver); testLevel.getFightSystem()->addObserver(&questObserver); //===================================================================// //==================Setting up the Gravity===========================// //==================================================================// Gravity gravity; playerNode.addGravity(&gravity); aiNode.addGravity(&gravity); //===================================================================// //==================The Render-Loop==================================// //==================================================================// float lastTime = glfwGetTime(); Node* tmp = testLevel.getActiveScene()->getScenegraph()->searchNode("Plane"); tmp->getNodeName(); sfh.updateListenerPosition(glm::vec3(10.0, 3.0, -5.0)); sfh.playSource("Feuer"); sfh.playSource("Hintergrund"); sfh.setGain("Hintergrund", 0.5f); while (!glfwWindowShouldClose(testWindow.getWindow())) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float currentTime = glfwGetTime(); float deltaTime = currentTime - lastTime; lastTime = currentTime; mouse_callback(testWindow.getWindow()); //===================================================================// //==================Update your Objects per Frame here =============// //==================================================================// collision.update(); //ant_Flick.updateState(); ant_Flick.update(); //===================================================================// //==================Input and update for the Player==================// //==================================================================// playKey_callback(testWindow.getWindow()); //geko.update(deltaTime); //===================================================================// //==================Render your Objects==============================// //==================================================================// glEnable(GL_DEPTH_TEST); shader.bind(); shader.sendMat4("viewMatrix", cam.getViewMatrix()); shader.sendMat4("projectionMatrix", cam.getProjectionMatrix()); testScene.render(shader); shader.unbind(); glfwSwapBuffers(testWindow.getWindow()); glfwPollEvents(); } glfwDestroyWindow(testWindow.getWindow()); glfwTerminate(); return 0; }
int main() { Player geko("Geko", glm::vec3(10.0, 10.0, 10.0)); // Start Konifguration - Window, Context, Camera and Callbacks // glfwInit(); Window testWindow(500, 50, 800, 600, "testWindow"); glfwMakeContextCurrent(testWindow.getWindow()); cam.setKeySpeed(2.0); cam.setNearFar(0.01, 100); //Callback for Camera and Player glfwSetKeyCallback(testWindow.getWindow(), key_callback); glewInit(); // Shader and Renderer Initialization // //Shader for Objects VertexShader vs(loadShaderSource(SHADERS_PATH + std::string("/Vertex-Shaders/TextureShader3D.vert"))); FragmentShader fs(loadShaderSource(SHADERS_PATH + std::string("/Fragment-Shaders/TextureShader3D.frag"))); ShaderProgram shader(vs, fs); //Shader for a Skybox VertexShader vsSkybox(loadShaderSource(SHADERS_PATH + std::string("/SkyboxShader/SkyboxShader.vert"))); FragmentShader fsSkybox(loadShaderSource(SHADERS_PATH + std::string("/SkyboxShader/SkyboxShader.frag"))); ShaderProgram shaderSkybox(vsSkybox, fsSkybox); //Renderer with context OpenGL3Context context; Renderer renderer(context); //Level and Scene Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); //Add Camera to scenegraph testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->getCamera("PlayerViewCam"); testScene.getScenegraph()->setActiveCamera("PlayerViewCam"); //Set all InputMaps and set one InputMap active iH.setAllInputMaps(*(testScene.getScenegraph()->getActiveCamera())); iH.changeActiveInputMap("Object"); iH.getActiveInputMap()->update(geko); // ============================================================== // == Object (ant, afraid) ====================================== // ============================================================== Teapot teaAnt; Texture texCV((char*)RESOURCES_PATH "/cv_logo.bmp"); //AntMesh antMesh; //Node aiNodeFlick("Flick"); //aiNodeFlick.addGeometry(&teaAnt); //aiNodeFlick.addTexture(&texCV); //testScene.getScenegraph()->getRootNode()->addChildrenNode(&aiNodeFlick); //AI ant_Flick; //ant_Flick.setAntAfraid(); //aiNodeFlick.ssetObject(&ant_Flick); // ============================================================== // == Object (ant, aggressiv) =================================== // ============================================================== AntMesh antMesh; //Node aiNodeFlack("Flack"); //aiNodeFlack.addGeometry(&teaAnt); //aiNodeFlack.addGeometry(&antMesh); //aiNodeFlack.addTexture(&texCV); //testScene.getScenegraph()->getRootNode()->addChildrenNode(&aiNodeFlack); //AI ant_Flack; //ant_Flack.setAntAggressiv(); //aiNodeFlack.setObject(&ant_Flack); // ============================================================== // == Object (Tree) ============================================= // ============================================================== Texture texBrick((char*)RESOURCES_PATH "/brick.bmp"); //TreeMesh treeMesh; Teapot teaTree; TreeMesh treeMesh; Node treeNode("CookieTree"); StaticObject tree; tree.setTree(); treeNode.setObject(&tree); treeNode.addTexture(&texCV); treeNode.addGeometry(&treeMesh); glm::vec3 posFood(10.0, 0.0, -5.0); treeNode.addTranslation(posFood); treeNode.getBoundingSphere()->radius = 2.0; testScene.getScenegraph()->getRootNode()->addChildrenNode(&treeNode); // ============================================================== // == Player ==================================================== // ============================================================== Teapot teaPlayer; GekoMesh gekomesh; // Texture texBrick((char*)RESOURCES_PATH "/brick.bmp"); Node playerNode("Player"); playerNode.addTexture(&texBrick); playerNode.setObject(&geko); //playerNode.addGeometry(&teaPlayer); playerNode.addGeometry(&gekomesh); playerNode.setCamera(&cam); geko.setPosition(glm::vec3(10.0, 0.0, 10.0)); //Add the node to the Scene testScene.getScenegraph()->getRootNode()->addChildrenNode(&playerNode); // ============================================================== // == Questsystem ==================================================== // ============================================================== //QuestHandler questhandler; Quest questCollect(1); questCollect.setActive(true); Goal_Collect goalCollect(1); Goal_Collect goalCollect3(3); questCollect.addGoal(&goalCollect); questCollect.addGoal(&goalCollect3); Quest questCollect2(2); questCollect2.setActive(true); Goal_Collect goalCollect2(2); questCollect2.addGoal(&goalCollect2); goalCollect.setGoalCount(50); goalCollect2.setGoalCount(50); goalCollect3.setGoalCount(50); goalCollect.setItemType(ItemType::BRANCH); goalCollect2.setItemType(ItemType::BRANCH); goalCollect3.setItemType(ItemType::COOKIE); testLevel.getQuestHandler()->addQuest(&questCollect); testLevel.getQuestHandler()->addQuest(&questCollect2); /*questhandler.addQuest(&questCollect); questhandler.addQuest(&questCollect2);*/ //std::cout << "GRÖßE DES QUESTHANDLERS : " << questhandler.getQuests().size() << std::endl; // ============================================================== // == Collision, FightSystem===================================== // ============================================================== // Bounding Box creation for the objects and collision test // CollisionTest collision; FightSystem fight; //===================================================================// //==================Setting up the Observers========================// //==================================================================// ObjectObserver aiObserver(&testLevel); //ant_Flick.addObserver(&aiObserver); //ant_Flack.addObserver(&aiObserver); ObjectObserver playerObserver(&testLevel); geko.addObserver(&playerObserver); CollisionObserver colObserver(&testLevel); collision.addObserver(&colObserver); GravityObserver gravityObserver(&testLevel); collision.addObserver(&gravityObserver); SoundObserver soundObserver(&testLevel); // ============================================================== // == Object (Anthome) ========================================== // ============================================================== //TreeMesh treeMesh; AntHomeMesh homeMesh; Node homeNode("AntHome"); StaticObject home; //home.setTree(); homeNode.setObject(&home); homeNode.addTexture(&texBrick); homeNode.addGeometry(&homeMesh); glm::vec3 posHome(1.0, 0.0, 1.0); homeNode.addTranslation(posHome); homeNode.getBoundingSphere()->radius = 0.5; testScene.getScenegraph()->getRootNode()->addChildrenNode(&homeNode); glm::vec3 posFood2(10.0, 0.0, -5.0); glm::vec3 posSpawn(3.0, 0.0, 3.0); glm::vec3 posDefaultPlayer(0.0, 0.0, 0.0); DecisionTree *aggressivedecisionTree = new DecisionTree(); aggressivedecisionTree->setAntTreeAggressiv(); DecisionTree *afraidDecisionTree = new DecisionTree(); afraidDecisionTree->setAntTreeAfraid(); Graph<AStarNode, AStarAlgorithm>* antAggressiveGraph = new Graph<AStarNode, AStarAlgorithm>(); antAggressiveGraph->setExampleAntAfraid(posSpawn, posFood2, posDefaultPlayer); Graph<AStarNode, AStarAlgorithm>* antAfraidGraph = new Graph<AStarNode, AStarAlgorithm>(); antAfraidGraph->setExampleAntAfraid(posSpawn, posFood, posDefaultPlayer); //AntHome antHome(posSpawn, antMesh, &texCV, &texCV, aggressivedecisionTree, antAggressiveGraph, afraidDecisionTree, antAfraidGraph); ////antHome.generateGuards(5, &aiObserver); //antHome.generateWorkers(1, &aiObserver); SoundFileHandler sfh(1000); AntHome antHome(posSpawn, &sfh, antMesh, &soundObserver, &playerObserver, &texCV, &texCV, aggressivedecisionTree, antAggressiveGraph, afraidDecisionTree, antAfraidGraph); antHome.generateWorkers(5, testScene.getScenegraph()->getRootNode()); antHome.addAntsToSceneGraph(testScene.getScenegraph()->getRootNode()); collision.collectNodes(testScene.getScenegraph()->getRootNode()); float lastTime = glfwGetTime(); int i = 0; while (!glfwWindowShouldClose(testWindow.getWindow())) { i++; if (i == 30){ i++; } glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); float currentTime = glfwGetTime(); float deltaTime = currentTime - lastTime; lastTime = currentTime; collision.update(); antHome.updateAnts(); antHome.printPosWorkers(); /* ant_Flick.update(); ant_Flack.update();*/ geko.update(); geko.setDeltaTime(currentTime); renderer.renderScene(testScene, testWindow); } glfwDestroyWindow(testWindow.getWindow()); glfwTerminate(); return 0; }