void CDemo::switchToNextScene() { currentScene++; if (currentScene > 3) currentScene = 1; scene::ISceneManager* sm = device->getSceneManager(); scene::ISceneNodeAnimator* sa = 0; scene::ICameraSceneNode* camera = 0; camera = sm->getActiveCamera(); if (camera) { sm->setActiveCamera(0); camera->remove(); camera = 0; } switch(currentScene) { case -1: // loading screen timeForThisScene = 0; createLoadingScreen(); break; case 0: // load scene timeForThisScene = 0; loadSceneData(); break; case 1: // panorama camera { currentScene += 1; //camera = sm->addCameraSceneNode(0, core::vector3df(0,0,0), core::vector3df(-586,708,52)); //camera->setTarget(core::vector3df(0,400,0)); core::array<core::vector3df> points; points.push_back(core::vector3df(-931.473755f, 138.300003f, 987.279114f)); // -49873 points.push_back(core::vector3df(-847.902222f, 136.757553f, 915.792725f)); // -50559 points.push_back(core::vector3df(-748.680420f, 152.254501f, 826.418945f)); // -51964 points.push_back(core::vector3df(-708.428406f, 213.569580f, 784.466675f)); // -53251 points.push_back(core::vector3df(-686.217651f, 288.141174f, 762.965576f)); // -54015 points.push_back(core::vector3df(-679.685059f, 365.095612f, 756.551453f)); // -54733 points.push_back(core::vector3df(-671.317871f, 447.360107f, 749.394592f)); // -55588 points.push_back(core::vector3df(-669.468445f, 583.335632f, 747.711853f)); // -56178 points.push_back(core::vector3df(-667.611267f, 727.313232f, 746.018250f)); // -56757 points.push_back(core::vector3df(-665.853210f, 862.791931f, 744.436096f)); // -57859 points.push_back(core::vector3df(-642.649597f, 1026.047607f, 724.259827f)); // -59705 points.push_back(core::vector3df(-517.793884f, 838.396790f, 490.326050f)); // -60983 points.push_back(core::vector3df(-474.387299f, 715.691467f, 344.639984f)); // -61629 points.push_back(core::vector3df(-444.600250f, 601.155701f, 180.938095f)); // -62319 points.push_back(core::vector3df(-414.808899f, 479.691406f, 4.866660f)); // -63048 points.push_back(core::vector3df(-410.418945f, 429.642242f, -134.332687f)); // -63757 points.push_back(core::vector3df(-399.837585f, 411.498383f, -349.350983f)); // -64418 points.push_back(core::vector3df(-390.756653f, 403.970093f, -524.454407f)); // -65005 points.push_back(core::vector3df(-334.864227f, 350.065491f, -732.397400f)); // -65701 points.push_back(core::vector3df(-195.253387f, 349.577209f, -812.475891f)); // -66335 points.push_back(core::vector3df(16.255573f, 363.743134f, -833.800415f)); // -67170 points.push_back(core::vector3df(234.940964f, 352.957825f, -820.150696f)); // -67939 points.push_back(core::vector3df(436.797668f, 349.236450f, -816.914185f)); // -68596 points.push_back(core::vector3df(575.236206f, 356.244812f, -719.788513f)); // -69166 points.push_back(core::vector3df(594.131042f, 387.173828f, -609.675598f)); // -69744 points.push_back(core::vector3df(617.615234f, 412.002899f, -326.174072f)); // -70640 points.push_back(core::vector3df(606.456848f, 403.221954f, -104.179291f)); // -71390 points.push_back(core::vector3df(610.958252f, 407.037750f, 117.209778f)); // -72085 points.push_back(core::vector3df(597.956909f, 395.167877f, 345.942200f)); // -72817 points.push_back(core::vector3df(587.383118f, 391.444519f, 566.098633f)); // -73477 points.push_back(core::vector3df(559.572449f, 371.991333f, 777.689453f)); // -74124 points.push_back(core::vector3df(423.753204f, 329.990051f, 925.859741f)); // -74941 points.push_back(core::vector3df(247.520050f, 252.818954f, 935.311829f)); // -75651 points.push_back(core::vector3df(114.756012f, 199.799759f, 805.014160f)); points.push_back(core::vector3df(96.783348f, 181.639481f, 648.188110f)); points.push_back(core::vector3df(97.865623f, 138.905975f, 484.812561f)); points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); timeForThisScene = (points.size()-3)* 1000; camera = sm->addCameraSceneNode(0, points[0], core::vector3df(0 ,400,0)); //camera->setTarget(core::vector3df(0,400,0)); sa = sm->createFollowSplineAnimator(device->getTimer()->getTime(), points); camera->addAnimator(sa); sa->drop(); model1->setVisible(false); model2->setVisible(false); campFire->setVisible(false); inOutFader->fadeIn(7000); } break; case 2: // down fly anim camera camera = sm->addCameraSceneNode(0, core::vector3df(100,40,-80), core::vector3df(844,670,-885)); sa = sm->createFlyStraightAnimator(core::vector3df(94, 1002, 127), core::vector3df(108, 15, -60), 10000, true); camera->addAnimator(sa); timeForThisScene = 9900; model1->setVisible(true); model2->setVisible(false); campFire->setVisible(false); sa->drop(); break; case 3: // interactive, go around { model1->setVisible(true); model2->setVisible(true); campFire->setVisible(true); timeForThisScene = -1; SKeyMap keyMap[9]; keyMap[0].Action = EKA_MOVE_FORWARD; keyMap[0].KeyCode = KEY_UP; keyMap[1].Action = EKA_MOVE_FORWARD; keyMap[1].KeyCode = KEY_KEY_W; keyMap[2].Action = EKA_MOVE_BACKWARD; keyMap[2].KeyCode = KEY_DOWN; keyMap[3].Action = EKA_MOVE_BACKWARD; keyMap[3].KeyCode = KEY_KEY_S; keyMap[4].Action = EKA_STRAFE_LEFT; keyMap[4].KeyCode = KEY_LEFT; keyMap[5].Action = EKA_STRAFE_LEFT; keyMap[5].KeyCode = KEY_KEY_A; keyMap[6].Action = EKA_STRAFE_RIGHT; keyMap[6].KeyCode = KEY_RIGHT; keyMap[7].Action = EKA_STRAFE_RIGHT; keyMap[7].KeyCode = KEY_KEY_D; keyMap[8].Action = EKA_JUMP_UP; keyMap[8].KeyCode = KEY_KEY_J; camera = sm->addCameraSceneNodeFPS(0, 100.0f, .4f, -1, keyMap, 9, false, 3.f); camera->setPosition(core::vector3df(108,140,-140)); camera->setFarValue(5000.0f); scene::ISceneNodeAnimatorCollisionResponse* collider = sm->createCollisionResponseAnimator( metaSelector, camera, core::vector3df(25,50,25), core::vector3df(0, quakeLevelMesh ? -10.f : 0.0f,0), core::vector3df(0,45,0), 0.005f); camera->addAnimator(collider); collider->drop(); } break; } sceneStartTime = device->getTimer()->getTime(); }
int main() { srand(time(NULL)); // Initialize GLFW if (!glfwInit()) { std::cerr << "Failed to initialize GLFW!" << std::endl; return EXIT_FAILURE; } // Setup OpenGL context glfwWindowHint(GLFW_SAMPLES, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); // Try to create a window GLFWwindow *window = glfwCreateWindow(SCREEN_WIDTH, SCREEN_HEIGHT, "Pokemon 3D", glfwGetPrimaryMonitor(), NULL); if (window == NULL) { std::cerr << "Failed to open GLFW window, your graphics card is probably only capable of OpenGL 2.1" << std::endl; glfwTerminate(); return EXIT_FAILURE; } // get size of maximazed window glfwGetWindowSize(window, &SCREEN_WIDTH, &SCREEN_HEIGHT); // Finalize window setup glfwMakeContextCurrent(window); // Initialize GLEW glewExperimental = GL_TRUE; glewInit(); if (!glewIsSupported("GL_VERSION_3_3")) { std::cerr << "Failed to initialize GLEW with OpenGL 3.3!" << std::endl; glfwTerminate(); return EXIT_FAILURE; } inputManager = new InputManager(SCREEN_WIDTH, SCREEN_HEIGHT); createLoadingScreen("models/textures/LoadingScreen.tga", window); sceneManager = new SceneManager(window, inputManager); // Add keyboard and mouse handlers glfwSetKeyCallback(window, OnKeyPress); glfwSetCursorPosCallback(window, OnMouseMove); glfwSetScrollCallback(window, OnMouseScroll); glfwSetMouseButtonCallback(window, OnMouseButtonClick); glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); // Hide mouse cursor while (!glfwWindowShouldClose(window)) { glfwPollEvents(); sceneManager->animate(delta); sceneManager->render(); // Display result glfwSwapBuffers(window); float currentFrameTime = getCurrentTime(); delta = (currentFrameTime - lastFrameTime) / 1000.0f; lastFrameTime = currentFrameTime; } // Clean up sceneManager->clean(); glfwTerminate(); return EXIT_SUCCESS; }