int gamedraw(void){ /* Calculate Timings for this Frame */ timeframe(); /* Set up a Blank Screen To Draw on */ glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glLoadIdentity(); /* Set the camera focusing on player 10 units away */ camera(player,10); /* Begin Drawing the Level */ skybox(5000,3000,5000); drawmap(&course[loadc]); /* Draw the Ship */ if(tushar==0) ship(); /* Draw The HUD Items */ drawhud(); /* Draw it to the screen */ SDL_GL_SwapBuffers(); return 1; }
void renderScene() { // Set the colour behind our skybox if (disco) { // Every 10 ticks if (lastTickCount%10==0) glClearColor((float)1000/rand(),(float)1000/rand(),(float)1000/rand(),1.0); } else { glClearColor(0.0,0.0,0.0,1.0); } glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); // Clear framebuffer & depth buffer glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Reset Modelview matrix glMatrixMode(GL_MODELVIEW); glLoadIdentity(); skybox(); drawText(); if (thirdPerson) character(); keyboardMovement(); if (intro) { drawIntro(); } else { camera(); } drawEnemies(); if (fire) fireBullets(); // Draw textured tetrahedron glEnable(GL_TEXTURE_2D); glColor3f(1.0,1.0,1.0); glBindTexture(GL_TEXTURE_2D,textureId); // Draw Dungarvan glPushMatrix(); dungarvan->draw(); glDisable(GL_TEXTURE_2D); glPopMatrix(); // Swap double buffer for flicker-free animation glutSwapBuffers(); }
std::vector< Texture* > Texture::CreateOrGetSkybox( std::string texturePaths[6] ) { std::vector< Texture* > skybox(6); for( int i = 0; i < 6; ++i ) { Texture*& result = sm_texturePool[texturePaths[i]]; if( !result ) { result = new Texture(); result->LoadSkyboxFromFile( texturePaths[i] ); } skybox[i] = result; } return skybox; }
int main(int argc, char *argv[]){ //Initialise GLFW if (!glfwInit()) { fprintf(stderr, "There was a problem initializing glfw"); exit(EXIT_FAILURE); } //glfw hints glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); glfwOpenWindowHint(GLFW_OPENGL_VERSION_MAJOR, 3); glfwOpenWindowHint(GLFW_OPENGL_VERSION_MINOR, 3); glfwOpenWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); //Open a window if (!glfwOpenWindow(WINDOW_WIDTH, WINDOW_HEIGHT, 0, 0, 0, 0, 0, 0, GLFW_WINDOW)) { fprintf(stderr, "There was a problem opening a window"); exit(EXIT_FAILURE); } //Turn on experimental features to prevent seg fault glewExperimental = GL_TRUE; //Intitialize GLEW if (glewInit() != GLEW_OK) { fprintf(stderr, "There was a problem initialising GLEW"); exit(EXIT_FAILURE); } //various glfw settings glfwEnable(GLFW_STICKY_KEYS); glfwSetKeyCallback(&key_callback); glfwSetWindowTitle(TITLE); glEnable(GL_CULL_FACE); glCullFace(GL_BACK); glEnable(GL_DEPTH_TEST); glEnable(GL_DEPTH_CLAMP); //Create text generator GLuint textShaderID = setupShaders("shaders/text/vert.gls", "shaders/text/frag.gls"); TextGenerator tg((char*)"textures/font.png", textShaderID, ' ', '~', 16, 8, WINDOW_WIDTH, WINDOW_HEIGHT); loading(&tg); //Load in and set program (Shaders) // GLuint simpleShaderID = setupShaders("shaders/simple/vert.gls", "shaders/simple/frag.gls"); // GLuint phongShaderID = setupShaders("shaders/phong/vert.gls", "shaders/phong/frag.gls"); GLuint perFragmentShaderID = setupShaders("shaders/perFragment/vert.gls", "shaders/perFragment/frag.gls"); //Load in terrain and sky box HeightMapLoader groundObj = HeightMapLoader("textures", "img2.png"); ObjLoader skyboxObj = ObjLoader("models","skybox.obj"); Object ground(&groundObj, perFragmentShaderID, viewer, GL_FILL); Skybox skybox(&skyboxObj, perFragmentShaderID, viewer, GL_FILL); loading(&tg); //Load in thunder birds ObjLoader thunderBird1Obj = ObjLoader("models", "thunderbird1.obj"); ObjLoader t2ContainerObj = ObjLoader("models","t2container.obj"); ObjLoader thunderBird2Obj = ObjLoader("models","thunderbird2.obj"); ObjLoader thunderBird3Obj = ObjLoader("models","thunderbird3.obj"); ObjLoader eggObj = ObjLoader("models", "egg.obj"); Object thunderBird1(&thunderBird1Obj, perFragmentShaderID, viewer, GL_FILL); Object thunderBird1B(&thunderBird1Obj, perFragmentShaderID, viewer, GL_FILL); Object thunderBird1C(&thunderBird1Obj, perFragmentShaderID, viewer, GL_FILL); Object t2container(&t2ContainerObj, perFragmentShaderID, viewer, GL_FILL); Object thunderBird2(&thunderBird2Obj, perFragmentShaderID, viewer, GL_FILL); Object t2containerB(&t2ContainerObj, perFragmentShaderID, viewer, GL_FILL); Object thunderBird2B(&thunderBird2Obj, perFragmentShaderID, viewer, GL_FILL); Object thunderBird3(&thunderBird3Obj, perFragmentShaderID, viewer, GL_FILL); Object thunderBird3B(&thunderBird3Obj, perFragmentShaderID, viewer, GL_FILL); Object thunderBird3C(&thunderBird3Obj, perFragmentShaderID, viewer, GL_FILL); loading(&tg); //Set up collisions viewer->addTerrain(&ground); loading(&tg); thunderBird1.setPosition(glm::vec3(-2,0.1,0)); t2container.setPosition(glm::vec3(-7.5,0.15,5)); t2container.setScale(glm::vec3(0.2,0.2,0.2)); t2container.setRotation(90, glm::vec3(0,1,0)); thunderBird2.setPosition(glm::vec3(-7.5,0.15,5)); thunderBird2.setScale(glm::vec3(0.2,0.2,0.2)); thunderBird2.setRotation(90, glm::vec3(0,1,0)); t2containerB.setPosition(glm::vec3(-13.7941, 0.0, -11.716)); t2containerB.setScale(glm::vec3(0.2,0.2,0.2)); t2containerB.setRotation(120, glm::vec3(0,1,0)); thunderBird2B.setPosition(glm::vec3(-13.7941, 0.0, -11.716)); thunderBird2B.setScale(glm::vec3(0.2,0.2,0.2)); thunderBird2B.setRotation(120, glm::vec3(0,1,0)); thunderBird3.setPosition(glm::vec3(2,2,12.5)); thunderBird3.setScale(glm::vec3(0.4,0.4,0.4)); thunderBird3.setRotation(-90, glm::vec3(1,0,0)); thunderBird3B.setPosition(glm::vec3(22.3989, 0.541667, -5.00961)); thunderBird3B.setScale(glm::vec3(0.4,0.4,0.4)); thunderBird3B.setRotation(-90, glm::vec3(1,0,0)); thunderBird3B.setPosition(glm::vec3(2,2,12.5)); thunderBird3B.setScale(glm::vec3(0.4,0.4,0.4)); thunderBird3B.setRotation(-90, glm::vec3(1,0,0)); ground.setScale(glm::vec3(0.35,0.025,0.35)); ground.setPosition(glm::vec3(-groundObj.width/2 * 0.35,0,-groundObj.height/2 * 0.35)); std::vector<glm::vec3> positions; positions.push_back(glm::vec3(-6.42059,0.25837,4.494014)); positions.push_back(glm::vec3(-3.85007,0.1,7.12377)); positions.push_back(glm::vec3(-0.601204,0.1,3.592329)); positions.push_back(glm::vec3(8.2538,0.1,2.5428)); positions.push_back(glm::vec3(10.6809,0.38337,-3.84069)); positions.push_back(glm::vec3(-5.13897,0.1,-11.4451)); positions.push_back(glm::vec3(-14.3374,0.1,-8.11471)); positions.push_back(glm::vec3(-20.2777, 0.1, 8.26625)); positions.push_back(glm::vec3(-22.3929, 1.35833,19.6362)); positions.push_back(glm::vec3(1.64004, 0.1, 33.6688)); positions.push_back(glm::vec3(30.9513, 0.683333, 18.214)); positions.push_back(glm::vec3(32.9145, 1.56667, -11.0445)); positions.push_back(glm::vec3(31.17666, 0.808333, -22.8479)); positions.push_back(glm::vec3(-29.7966, 0.35, -27.9126)); positions.push_back(glm::vec3(-33.6018, 0.433333, -25.1177)); positions.push_back(glm::vec3(-29.1175, 2.39167, -17.2737)); positions.push_back(glm::vec3(-27.6434, 2.1833, -14.5711)); positions.push_back(glm::vec3(-33.0654, 3.5, 2.62864)); positions.push_back(glm::vec3(-20.6909, 4, 3.49496)); positions.push_back(glm::vec3(-3.85007, 3.5 , 7.12377)); positions.push_back(glm::vec3(1.42417, 2.116667, 0.276567)); WayPoint w1 = WayPoint(positions[0], positions[1] - positions[0]); WayPoint w2 = WayPoint(positions[1], positions[2] - positions[1]); WayPoint w3 = WayPoint(positions[2], positions[3] - positions[2]); WayPoint w4 = WayPoint(positions[3], positions[4] - positions[3]); WayPoint w5 = WayPoint(positions[4], positions[5] - positions[4]); WayPoint w6 = WayPoint(positions[5], positions[6] - positions[5]); WayPoint w7 = WayPoint(positions[6], positions[7] - positions[6]); WayPoint w8 = WayPoint(positions[7], positions[8] - positions[7]); WayPoint w9 = WayPoint(positions[8], positions[9] - positions[8]); WayPoint w10 = WayPoint(positions[9], positions[10] - positions[9]); WayPoint w11 = WayPoint(positions[10], positions[11] - positions[10]); WayPoint w12 = WayPoint(positions[11], positions[12] - positions[11]); WayPoint w13 = WayPoint(positions[12], positions[13] - positions[12]); WayPoint w14 = WayPoint(positions[13], positions[14] - positions[13]); WayPoint w15 = WayPoint(positions[14], positions[15] - positions[14]); WayPoint w16 = WayPoint(positions[15], positions[16] - positions[15]); WayPoint w17 = WayPoint(positions[16], positions[17] - positions[16]); WayPoint w18 = WayPoint(positions[17], positions[18] - positions[17]); WayPoint w19 = WayPoint(positions[18], positions[19] - positions[18]); WayPoint w20 = WayPoint(positions[19], positions[20] - positions[19]); WayPoint w21 = WayPoint(positions[20], glm::vec3(0,0,1)); t.addWayPoint(0.0, &w1, 1); t.addWayPoint(2.0, &w2, 1); t.addWayPoint(4.0, &w3, 1); t.addWayPoint(6.0, &w4, 1); t.addWayPoint(8.0, &w5, 1); t.addWayPoint(10.0, &w6, 1); t.addWayPoint(12.0, &w7, 1); t.addWayPoint(14.0, &w8, 1); t.addWayPoint(16.0, &w9, 1); t.addWayPoint(18.0, &w10, 1); t.addWayPoint(20.0, &w11, 1); t.addWayPoint(22.0, &w12, 1); t.addWayPoint(24.0, &w13, 1); t.addWayPoint(26.0, &w14, 1); t.addWayPoint(28.0, &w15, 1); t.addWayPoint(30.0, &w16, 1); t.addWayPoint(32.0, &w17, 1); t.addWayPoint(34.0, &w18, 1); t.addWayPoint(36.0, &w19, 1); t.addWayPoint(38.0, &w20, 1); t.addWayPoint(40.0, &w21, 1); Animutator* tb1Anim = new Animutator(); KeyFrame tb1KF1 = KeyFrame(glm::vec3(0,1,1), 90, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1KF2 = KeyFrame(glm::vec3(10,1,1), 90, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1KF3 = KeyFrame(glm::vec3(10,1,1), -90, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1KF4 = KeyFrame(glm::vec3(0,1,1), -90, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); tb1Anim->addKeyFrame(0.0, &tb1KF1); tb1Anim->addKeyFrame(10.0, &tb1KF2); tb1Anim->addKeyFrame(12.5, &tb1KF3); tb1Anim->addKeyFrame(22.5, &tb1KF4); tb1Anim->addKeyFrame(25.0, &tb1KF1); thunderBird1.addAnimutator(tb1Anim); Animutator* tb1BAnim = new Animutator(); KeyFrame tb1BKF1 = KeyFrame(glm::vec3(-23.027, 1.35, 16.35409), -110.328, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF2 = KeyFrame(glm::vec3(-24.5907, 2.29167, 15.7748), -110.328, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF3 = KeyFrame(glm::vec3(-24.5907, 2.29167, 15.7748), -38.604, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF4 = KeyFrame(glm::vec3(-32.497, 1, 25.6773), -38.604, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF5 = KeyFrame(glm::vec3(-32.497, 1, 25.6773), 5.98309, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF6 = KeyFrame(glm::vec3(-31.8602, 1.55833, 31.7533), 5.98309, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF7 = KeyFrame(glm::vec3(-31.8602, 1.55833, 31.7533), 38.384, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF8 = KeyFrame(glm::vec3(-28.5349, 1, 35.9512), 38.384, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF9 = KeyFrame(glm::vec3(-28.5349, 1, 35.9512), 99.0798, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF10 = KeyFrame(glm::vec3(-13.2714, 1, 33.5119), 99.0798, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF11 = KeyFrame(glm::vec3(-13.2714, 1, 33.5119), -150.378, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1BKF12 = KeyFrame(glm::vec3(-23.027, 1.35, 16.35409), -150.378, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); tb1BAnim->addKeyFrame(0.0, &tb1BKF1); tb1BAnim->addKeyFrame(5.0, &tb1BKF2); tb1BAnim->addKeyFrame(5.5, &tb1BKF3); tb1BAnim->addKeyFrame(10.5, &tb1BKF4); tb1BAnim->addKeyFrame(11.0, &tb1BKF5); tb1BAnim->addKeyFrame(16.0, &tb1BKF6); tb1BAnim->addKeyFrame(16.5, &tb1BKF7); tb1BAnim->addKeyFrame(21.5, &tb1BKF8); tb1BAnim->addKeyFrame(22.0, &tb1BKF9); tb1BAnim->addKeyFrame(27.0, &tb1BKF10); tb1BAnim->addKeyFrame(27.5, &tb1BKF11); tb1BAnim->addKeyFrame(32.5, &tb1BKF12); tb1BAnim->addKeyFrame(33.0, &tb1BKF1); thunderBird1B.addAnimutator(tb1BAnim); Animutator* tb1CAnim = new Animutator(); KeyFrame tb1CKF1 = KeyFrame(glm::vec3(25.7527, 1.5, -29.4807), -77.7031, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1CKF2 = KeyFrame(glm::vec3(-24.549, 2.76667, -18.516), -77.7031, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1CKF3 = KeyFrame(glm::vec3(-24.549, 2.76667, -18.516), 102.297, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); KeyFrame tb1CKF4 = KeyFrame(glm::vec3(25.7527, 1.5, -29.4807), 102.297, glm::vec3(0,1,0), glm::vec3(0.5,0.5,0.5)); tb1CAnim->addKeyFrame(0.0, &tb1CKF1); tb1CAnim->addKeyFrame(7.5, &tb1CKF2); tb1CAnim->addKeyFrame(9, &tb1CKF3); tb1CAnim->addKeyFrame(16.5, &tb1CKF4); tb1CAnim->addKeyFrame(18, &tb1CKF1); thunderBird1C.addAnimutator(tb1CAnim); Animutator* tb2cAnim = new Animutator(); KeyFrame tbc2KF1 = KeyFrame(glm::vec3(-7.5, 0.15, 5), 90, glm::vec3(0,1,0), glm::vec3(0.2,0.2,0.2)); KeyFrame tbc2KF2 = KeyFrame(glm::vec3(-7.5, -0.3, 5), 90, glm::vec3(0,1,0), glm::vec3(0.2,0.2,0.2)); tb2cAnim->addKeyFrame(0.0, &tbc2KF1); tb2cAnim->addKeyFrame(5.0, &tbc2KF2); tb2cAnim->addKeyFrame(5.5, &tbc2KF2); tb2cAnim->addKeyFrame(10.0, &tbc2KF1); tb2cAnim->addKeyFrame(10.5, &tbc2KF1); t2container.addAnimutator(tb2cAnim); Animutator* tb2cBAnim = new Animutator(); KeyFrame tbc2BKF1 = KeyFrame(glm::vec3(-13.7941, 0.0, -11.716), 120, glm::vec3(0,1,0), glm::vec3(0.2,0.2,0.2)); KeyFrame tbc2BKF2 = KeyFrame(glm::vec3(-13.7941, -0.4, -11.716), 120, glm::vec3(0,1,0), glm::vec3(0.2,0.2,0.2)); tb2cBAnim->addKeyFrame(0.0, &tbc2BKF1); tb2cBAnim->addKeyFrame(5.0, &tbc2BKF2); tb2cBAnim->addKeyFrame(5.5, &tbc2BKF2); tb2cBAnim->addKeyFrame(10.0, &tbc2BKF1); tb2cBAnim->addKeyFrame(10.5, &tbc2BKF1); t2containerB.addAnimutator(tb2cBAnim); Animutator* tb3cAnim = new Animutator(); KeyFrame tb3KF1 = KeyFrame(glm::vec3(2, 1.90, 12.5), -90, glm::vec3(1,0,0), glm::vec3(0.4,0.4,0.4)); KeyFrame tb3KF2 = KeyFrame(glm::vec3(2, 4, 12.5), -90, glm::vec3(1,0,0), glm::vec3(0.4,0.4,0.4)); tb3cAnim->addKeyFrame(0.0, &tb3KF1); tb3cAnim->addKeyFrame(5.0, &tb3KF2); tb3cAnim->addKeyFrame(10.0, &tb3KF1); thunderBird3.addAnimutator(tb3cAnim); Animutator* tb3BcAnim = new Animutator(); KeyFrame tb3BKF1 = KeyFrame(glm::vec3(22.3989, 2, -5.00961), -90, glm::vec3(1,0,0), glm::vec3(0.4,0.4,0.4)); KeyFrame tb3BKF2 = KeyFrame(glm::vec3(22.3989, 4.5, -5.00961), -90, glm::vec3(1,0,0), glm::vec3(0.4,0.4,0.4)); tb3BcAnim->addKeyFrame(0.0, &tb3BKF1); tb3BcAnim->addKeyFrame(5.0, &tb3BKF2); tb3BcAnim->addKeyFrame(10.0, &tb3BKF1); thunderBird3B.addAnimutator(tb3BcAnim); Animutator* tb3CcAnim = new Animutator(); KeyFrame tb3CKF1 = KeyFrame(glm::vec3(-30.3314, 1.9, 2.7756), -90, glm::vec3(1,0,0), glm::vec3(0.4,0.4,0.4)); KeyFrame tb3CKF2 = KeyFrame(glm::vec3(-30.3314, 4.6, 2.7756), -90, glm::vec3(1,0,0), glm::vec3(0.4,0.4,0.4)); tb3CcAnim->addKeyFrame(0.0, &tb3CKF1); tb3CcAnim->addKeyFrame(5.0, &tb3CKF2); tb3CcAnim->addKeyFrame(10.0, &tb3CKF1); thunderBird3C.addAnimutator(tb3CcAnim); int frame_count = 0; int last_fps = 0; GLfloat lastTime = glfwGetTime(); loading(&tg); do { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); if(tour){ t.update(); } else { viewer->update(); } thunderBird1.draw(); thunderBird1B.draw(); thunderBird1C.draw(); thunderBird2.draw(); t2container.draw(); thunderBird2B.draw(); t2containerB.draw(); thunderBird3.draw(); thunderBird3B.draw(); thunderBird3C.draw(); ground.draw(); skybox.draw(); if(glfwGetTime() - lastTime < 1) { frame_count++; } else { lastTime = glfwGetTime(); last_fps = frame_count; frame_count = 0; } if(show_help){ showHelp(tg, last_fps); } glfwSwapBuffers(); } while ( (glfwGetKey(GLFW_KEY_ESC) != GLFW_PRESS) && (glfwGetKey('q') != GLFW_PRESS) && (glfwGetKey('Q') != GLFW_PRESS) && (glfwGetWindowParam( GLFW_OPENED )) ); glfwTerminate(); //Everything was okay, return success exit(EXIT_SUCCESS); }
/* Initializes opengl states */ void glutWidget::initOpenGL() { glewExperimental = GL_TRUE; GLenum err = glewInit(); //initialize GLEW - this enables us to use extensions if(err != GLEW_OK) { std::cout << "ERROR: Loading GLEW failed." << std::endl; exit(-1); } checkExtensions(); glClearColor(1, 1, 1, 0); //default "empty"/background color is set to white glEnable(GL_DEPTH_TEST); CBitmap skybox("skybox.bmp"); //read bitmap image glGenTextures(1, &m_texture); //allocate 1 texture glUniform1i(skybox_texture, 0); //pass texture location to vertex shader glBindTexture(GL_TEXTURE_2D, skybox_texture); //bind this texture to be active glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, skybox.GetWidth(), skybox.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, skybox.GetBits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //specify minificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //specify magnificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); //specify texture coordinate treatment glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); //specify texture coordinate treatment glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); //specify texture coordinate treatment glBindTexture(GL_TEXTURE_2D, 0); CBitmap streets("streets.bmp"); //read bitmap image glGenTextures(1, &street_texture); //allocate 1 texture glUniform1i(street_texture, 0); //pass texture location to vertex shader glBindTexture(GL_TEXTURE_2D, street_texture); //bind this texture to be active glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, streets.GetWidth(), streets.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, streets.GetBits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //specify minificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //specify magnificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //specify texture coordinate treatment glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //specify texture coordinate treatment glBindTexture(GL_TEXTURE_2D, 0); //bind default texture to be active CBitmap car("car.bmp"); //read bitmap image glGenTextures(1, &car_texture); //allocate 1 texture glUniform1i(car_texture, 0); //pass texture location to vertex shader glBindTexture(GL_TEXTURE_2D, car_texture); //bind this texture to be active glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, car.GetWidth(), car.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, car.GetBits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //specify minificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //specify magnificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //specify texture coordinate treatment glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //specify texture coordinate treatment glBindTexture(GL_TEXTURE_2D, 0); //bind default texture to be active CBitmap structure("structure.bmp"); //read bitmap image glGenTextures(1, &structure_texture); //allocate 1 texture glUniform1i(structure_texture, 0); //pass texture location to vertex shader glBindTexture(GL_TEXTURE_2D, structure_texture); //bind this texture to be active glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, structure.GetWidth(), structure.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, structure.GetBits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //specify minificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //specify magnificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //specify texture coordinate treatment glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //specify texture coordinate treatment glBindTexture(GL_TEXTURE_2D, 0); //bind default texture to be active CBitmap wall("wall.bmp"); //read bitmap image glGenTextures(1, &wall_texture); //allocate 1 texture glUniform1i(wall_texture, 0); //pass texture location to vertex shader glBindTexture(GL_TEXTURE_2D, wall_texture); //bind this texture to be active glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, wall.GetWidth(), wall.GetHeight(), 0, GL_RGBA, GL_UNSIGNED_BYTE, wall.GetBits()); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); //specify minificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); //specify magnificaton filtering glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //specify texture coordinate treatment glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //specify texture coordinate treatment glBindTexture(GL_TEXTURE_2D, 0); //bind default texture to be active makeShaders(); //load data of fragment and vertex programs/shaders - compile shaders glMatrixMode(GL_PROJECTION); glLoadIdentity(); //initializes projection matrix with identity gluPerspective(60,(float)m_width/(float)m_height,0.1,1000); //set up projection mode (field of view, aspect ratio, near and far clipping plane) glMatrixMode(GL_MODELVIEW); glLoadIdentity(); //initializes modelview matrix with identity glEnable(GL_CULL_FACE); }
int main() { //////////////////////////////////////////BASICS/////////////////////////////////////////// srand(time(NULL)); glfwInit(); //WINDOW Window window(50, 50, 800, 600, "ParticleSystem"); glfwMakeContextCurrent(window.getWindow()); //CAM cam.setPosition(glm::vec4(-15.0, 0.0, 7.0, 1.0)); cam.setNearFar(0.1f, 100.0f); cam.setLookAt(glm::vec3(cam.getPosition().x, cam.getPosition().y, cam.getPosition().z - 1.0)); cam.setKeySpeed(8.0); iH.setAllInputMaps(cam); iH.changeActiveInputMap("Pilotview"); //Callback glfwSetKeyCallback(window.getWindow(), key_callback); //More then just 60 fps, vsync off glfwSwapInterval(0); glewInit(); //SHADER VertexShader vsSkybox(loadShaderSource(SHADERS_PATH + std::string("/SkyboxShader/SkyboxShader.vert"))); FragmentShader fsSkybox(loadShaderSource(SHADERS_PATH + std::string("/SkyboxShader/SkyboxShader.frag"))); ShaderProgram shaderSkybox(vsSkybox, fsSkybox); VertexShader vsObject(loadShaderSource(SHADERS_PATH + std::string("/TextureShader3D/TextureShader3D.vert"))); FragmentShader fsObject(loadShaderSource(SHADERS_PATH + std::string("/TextureShader3D/TextureShader3D.frag"))); ShaderProgram shaderObject(vsObject, fsObject); /////////////////////////////////////////TEXTURES////////////////////////////////////////// //COMIC CLOUD Texture* comicBalloonTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/balloon01.png"); Texture* comicBalloonTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/balloon02.png"); Texture* comicBalloonTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/balloon03.png"); Texture* comicBalloonTex4 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/balloon04.png"); Texture* comicCloudTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/cloud01.png"); Texture* comicCloudTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/cloud02.png"); Texture* comicCloudTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/cloud03.png"); Texture* comicCloudTex4 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/cloud04.png"); Texture* comicExclamationMarkTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/exclamationMark01.png"); Texture* comicExclamationMarkTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/exclamationMark02.png"); Texture* comicExclamationMarkTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/exclamationMark03.png"); Texture* comicExclamationMarkTex4 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/exclamationMark04.png"); Texture* comicLightningTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/lightning01.png"); Texture* comicLightningTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/lightning02.png"); Texture* comicLightningTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/lightning03.png"); Texture* comicLightningTex4 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/lightning04.png"); Texture* comicSpiralTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/spiral01.png"); Texture* comicSpiralTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/spiral02.png"); Texture* comicSpiralTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/spiral03.png"); Texture* comicSpiralTex4 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/spiral04.png"); Texture* comicSpiralTex5 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/spiral05.png"); Texture* comicSpiralTex6 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/spiral06.png"); Texture* comicStarTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/star01.png"); Texture* comicStarTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/comicCloud/star02.png"); //FIRE Texture* fireTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/flame01_L.png"); Texture* fireTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/flame02_L.png"); Texture* fireTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/fire/flame03_L.png"); //PARTICLE Texture* particleBlackTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/virus.png"); Texture* particleWhiteTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/particle.png"); Texture* snowTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/snowflake.png"); //TODO better Resolution Texture* glowwormTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/glowworm.png"); Texture* energyTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/energy.png"); Texture* fireflyTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/firefly.png"); Texture* fireSparkTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/sparkOrange.png"); Texture* fireSparkTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/particle/sparkRed.png"); //RAIN Texture* rainTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/rain/rain.png"); //TODO darker //SMOKE Texture* drawSmokeTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeDraw/smoke01_L.png"); Texture* drawSmokeTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeDraw/smoke02_L.png"); Texture* drawSmokeTex3 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeDraw/smoke03_L.png"); Texture* drawSmokeTex4 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeDraw/smoke04_L.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* smokeBlackTex1 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeBlack/smokeBlack01.png"); Texture* smokeBlackTex2 = new Texture((char*)RESOURCES_PATH "/ParticleSystem/smoke/smokeBlack/smokeBlack02.png"); //STAR Texture* fireWorkYellowTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/star/starYellow.png"); //TODO Work? Texture* fireWorkOrangeTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/star/starPink.png"); //TODO Work? Texture* fireWorkRedTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/star/starRed.png"); //TODO Work? Texture* fireWorkBlueTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/star/starBlue.png"); //TODO Work? Texture* fireWorkGreenTex = new Texture((char*)RESOURCES_PATH "/ParticleSystem/star/starGreen.png"); //TODO Work? ///////////////////////////////////////FINAL EMITTER/////////////////////////////////////// //FINAL EMITTER SNOW Emitter* snow = new Emitter(0, glm::vec3(0.0, 5.0, 0.0), 0.0, 0.166, 100, 30.0, true); snow->setVelocity(0); snow->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, 1.0), 0.5f); snow->setAreaEmitting(false,true, 10.0, 10000); snow->addTexture(snowTex, 0.0); snow->defineLook(true, 0.04, 2.0); particleCount += (100 * 30 / 0.166); //FINAL EMITTER STRONG SNOW Emitter* snowStrong = new Emitter(0, glm::vec3(-3.5, 4.0, 0.0), 0.0, 0.166, 100, 15.0, true); snowStrong->setVelocity(2); snowStrong->usePhysicDirectionGravity(glm::vec4(0.6, -1.5, 0.0, 1.0), 2.6f); snowStrong->setAreaEmitting(false, true, 8.0, 10000); snowStrong->addTexture(snowTex, 0.0); snowStrong->defineLook(true, 0.03, 1.0, 3.0); particleCount += (100 * 15.0 / 0.166); //FINAL EMITTER WHITE SMOKE Emitter* smokeWhite = new Emitter(0, glm::vec3(3.0, -1.0, 1.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.2f }; std::vector<float> smokeWhiteTime{ 0.0f, 0.4f, 0.75f, 1.0f }; smokeWhite->defineLook(true, smokeWhiteSize, smokeWhiteTime, 1.0, 4.0, 3.0, false, 0.3); smokeWhite->switchToGeometryShader(); particleCount += (1 * 8.0 / 0.4); //FINAL EMITTER BLACK SMOKE Emitter* smokeBlack = new Emitter(0, glm::vec3(6.0, -1.0, 1.0), 0.0, 0.6, 1, 8.0, true); smokeBlack->setVelocity(2); smokeBlack->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -0.8), 0.3f); smokeBlack->addTexture(smokeBlackTex1, 1.0); smokeBlack->addTexture(smokeBlackTex2, 0.2); std::vector<float> smokeBlackSize{ 0.1f, 0.4f, 0.8f, 1.2f }; std::vector<float> smokeBlackTime{ 0.0f, 0.2f, 0.75f, 1.0f }; smokeBlack->defineLook(true, smokeBlackSize, smokeBlackTime, 1.0, 5.0, 3.0, false, 0.3); smokeBlack->switchToGeometryShader(); particleCount += (1 * 8 / 0.4); //FINAL EMITTER CLOUD SMOKE Emitter* smokeCloud = new Emitter(0, glm::vec3(15.0, -1.0, 1.0), 0.0, 0.3, 1, 10.0, true); smokeCloud->setVelocity(3); smokeCloud->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -0.1), 0.15f); smokeCloud->addTexture(smokeWhiteTex1, 1.0); smokeCloud->addTexture(smokeWhiteTex2, 0.08); std::vector<float> smokeCloudSize{ 0.1f, 0.4f, 0.8f, 1.2f }; std::vector<float> smokeCloudTime{ 0.0f, 0.2f, 0.75f, 1.0f }; smokeCloud->defineLook(true, smokeBlackSize, smokeBlackTime, 1.0, 2.0, 4.0, false, 0.3); smokeCloud->switchToGeometryShader(); particleCount += (1 * 10.0 / 0.3); //FINAL EMITTER RAIN Emitter* rain = new Emitter(0, glm::vec3(0.0, 3.0, 0.0), 0.0, 0.02, 50, 5.0, true); rain->setVelocity(0); rain->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, 1.0), 5.0f); rain->setAreaEmitting(false, true, 8.0, 10000); rain->addTexture(rainTex, 0.0); rain->defineLook(true, 0.03, 1.0, 0.0); particleCount += (50 * 5.0 / 0.02); //FINAL EMITTER FONTAINE Emitter* fontaine = new Emitter(0, glm::vec3(-15.0,-1.0, 1.0), 0.0, 0.05, 5, 2.0, true); fontaine->setVelocity(0); fontaine->usePhysicTrajectory(glm::vec4(0.0, 0.0, 0.0, 1.0), 1.0); //fontaine->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -0.0), 0.7f); fontaine->defineLook(false, 0.3, 0.0, 0.5, 0.0, true, 1.0); particleCount += (3 * 2.0 / 0.05); //FINAL EMITTER CIRCLE Emitter* circle = new Emitter(0, glm::vec3(-18.0, 0.0, 1.0), 0.0, 0.2, 50, 4.0, true); circle->setVelocity(4); circle->addTexture(fireSparkTex1, 1.0); circle->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -0.0), 0.3f); circle->addTexture(fireSparkTex2 ,0.1); circle->defineLook(true, 0.03, 0.0, 2.0, 1.0, true, 0.0); circle->switchToGeometryShader(); particleCount += (50 * 4.0 / 0.4); //FINAL EMITTER QUAD Emitter* quad = new Emitter(0, glm::vec3(-21.0, 0.0, 1.0), 0.0, 1.0, 100, 1.0, true); quad->setVelocity(0); quad->setAreaEmitting(true, true, 0.5, 1); quad->defineLook(false, 0.1, 0.0, 0.0, 0.0, false, 0.0); particleCount += (50 * 1.0 / 1.0); //FINAL EMITTER FRUITFLIES Emitter* fruitFlies = new Emitter(0, glm::vec3(11.5, 0.0, 1.0), 0.0, 0.166, 2, 10.0, true); fruitFlies->setVelocity(0); fruitFlies->usePhysicSwarmCircleMotion(true, true, true, 3.0); fruitFlies->setAreaEmitting(true, true, 0.5, 100); fruitFlies->addTexture(particleBlackTex, 0.0); fruitFlies->defineLook(true, 0.012, 3.0, 3.0, 0.0, true, 1.0); fruitFlies->switchToGeometryShader(); particleCount += (2 * 10.0 / 0.166); //FINAL SCREEN EMITTER FRUITFLIES Emitter* screenFruitFlies = new Emitter(0, glm::vec3(-0.2, 0.2, 7.0), 0.0, 0.1, 2, 10.0, true); screenFruitFlies->setVelocity(0); screenFruitFlies->usePhysicSwarmCircleMotion(true, true, true, 3.0); screenFruitFlies->setAreaEmitting(true, false, 2.5, 1000); screenFruitFlies->addTexture(particleBlackTex, 0.0); screenFruitFlies->defineLook(true, 0.02, 1.0, 3.0, 0.0, true, 1.0); screenFruitFlies->switchToGeometryShader(); particleCount += (3 * 10.0 / 0.166); //FINAL EMITTER GLOWWORM Emitter* glowworm = new Emitter(0, glm::vec3(-3.0, 0.0, 1.0), 0.0, 0.2, 1, 10.0, true); glowworm->setVelocity(0); glowworm->usePhysicSwarmCircleMotion(true, true, true, 3.0); glowworm->setAreaEmitting(true, false, 0.4, 1000); glowworm->addTexture(glowwormTex, 0.0); glowworm->defineLook(true, 0.1, 1.0, 1.5); particleCount += (1 * 10.0 / 0.2); //FINAL EMITTER ENERGYBALL Emitter* energyBall = new Emitter(0, glm::vec3(-12.0, -1.0, 1.0), 0.0, 0.01, 5, 15.0, true); energyBall->setVelocity(5); energyBall->usePhysicPointGravity(glm::vec4(-10.0, 1.0, 1.0, 3.0), 8.0, 2, 1.8); energyBall->addTexture(energyTex, 1.0); energyBall->defineLook(true, 0.04); particleCount += (5 * 15.0 / 0.01); //FINAL EMITTER COMIC CLOUD Emitter* cloud01 = new Emitter(0, glm::vec3(-6.0, 0.5, 1.0), 0.0, 1.6, 1, 10.0, true); cloud01->setVelocity(4); cloud01->usePhysicPointGravity(glm::vec4(0.0, -1.0, 0.0, -0.0), 0.0, 0, 0.72); cloud01->addTexture(comicCloudTex1, 0.0); std::vector<float> cloudSize1{ 0.8f, 1.6f }; std::vector<float> cloudTime1{ 0.0f, 1.0f }; cloud01->defineLook(true, cloudSize1, cloudTime1, 0.4, 4.0, 0.0, false, 0.3); cloud01->switchToGeometryShader(); particleCount += (1 * 1.5 / 10.0); Emitter* cloud02 = new Emitter(0, glm::vec3(-6.0, 0.5, 1.0), 0.0, 2.3, 1, 10.0, true); cloud02->setVelocity(4); cloud02->usePhysicPointGravity(glm::vec4(0.0, -1.0, 0.0, -0.0), 0.0, 0, 0.6); cloud02->addTexture(comicCloudTex3, 0.0); std::vector<float> cloudSize2{ 0.8f, 1.6f }; std::vector<float> cloudTime2{ 0.0f, 1.0f }; cloud02->defineLook(true, cloudSize2, cloudTime2, 0.4, 4.0, 0.0, false, 0.3); cloud02->switchToGeometryShader(); particleCount += (1 * 2.1 / 10.0); Emitter* cloud03 = new Emitter(0, glm::vec3(-7.0, 1.0, 1.0), 0.0, 0.0, 1, 0.0, false); cloud03->setVelocity(0); cloud03->addTexture(comicBalloonTex4, 1.0); cloud03->defineLook(true, 0.8, 2.0); cloud03->switchToGeometryShader(); particleCount += 1; Emitter* cloud04 = new Emitter(0, glm::vec3(-4.8, 2.0, 1.0), 0.0, 0.0, 1, 0.0, false); cloud04->setVelocity(0); cloud04->addTexture(comicStarTex2, 1.0); cloud04->defineLook(true, 0.3, 2.0, 0.0, 0.0, false, 0.6); cloud04->switchToGeometryShader(); particleCount += 1; Emitter* cloud05 = new Emitter(0, glm::vec3(-7.0, -1.0, 1.0), 0.0, 0.0, 1, 0.0, false); cloud05->setVelocity(0); cloud05->addTexture(comicStarTex2, 1.0); cloud05->defineLook(true, 0.5, 2.0, 0.0, 0.0, true, 0.4); cloud05->switchToGeometryShader(); particleCount += 1; Emitter* cloud06 = new Emitter(0, glm::vec3(-4.3, 0.2, 1.0), 0.0, 0.0, 1, 0.0, false); cloud06->setVelocity(0); cloud06->addTexture(comicSpiralTex5, 1.0); cloud06->defineLook(true, 0.3, 2.0); cloud06->switchToGeometryShader(); particleCount += 1; Emitter* cloud07 = new Emitter(0, glm::vec3(-8.0, 0.7, 1.0), 0.0, 0.0, 1, 0.0, false); cloud07->setVelocity(0); cloud07->addTexture(comicSpiralTex3, 1.0); cloud07->defineLook(true, 0.3, 2.0); cloud07->switchToGeometryShader(); particleCount += 1; Emitter* cloud08 = new Emitter(0, glm::vec3(-7.9, 2.1, 1.0), 0.0, 0.0, 1, 0.0, false); cloud08->setVelocity(0); cloud08->addTexture(comicLightningTex1, 1.0); cloud08->defineLook(true, 0.6, 2.0); cloud08->switchToGeometryShader(); particleCount += 1; Emitter* cloud09 = new Emitter(0, glm::vec3(-4.0, 1.4, 1.0), 0.0, 0.0, 1, 0.0, false); cloud09->setVelocity(0); cloud09->addTexture(comicLightningTex4, 1.0); cloud09->defineLook(true, 0.5, 2.0); cloud09->switchToGeometryShader(); particleCount += 1; Emitter* cloud10 = new Emitter(0, glm::vec3(-3.7, 0.8, 1.0), 0.0, 0.0, 1, 0.0, false); cloud10->setVelocity(0); cloud10->addTexture(comicExclamationMarkTex3, 1.0); cloud10->defineLook(true, 0.3, 2.0); cloud10->switchToGeometryShader(); particleCount += 1; Emitter* cloud11 = new Emitter(0, glm::vec3(-6.5, 2.4, 1.0), 0.0, 0.0, 1, 0.0, false); cloud11->setVelocity(0); cloud11->addTexture(comicExclamationMarkTex2, 1.0); cloud11->defineLook(true, 0.5, 2.0); cloud11->switchToGeometryShader(); particleCount += 1; ////////////////////////////////NOT FINAL EMITTER//////////////////////////////// //FINAL EMITTER MAXIMUM; SET POSITION Emitter* maximumParticle = new Emitter(0, glm::vec3(-21.0, -3.0, 0.0), 0.0, 0.2, 5000, 12.0, true); maximumParticle->setVelocity(3); maximumParticle->usePhysicDirectionGravity(glm::vec4(0.0, 1.0, 0.0, 0.2), 0.5); maximumParticle->defineLook(false, 0.01); int particleCountMax = 5000 * 12 / 0.2; //particleMax with Texture //!EMITTER FIRE Emitter* fireMiddle = new Emitter(0, glm::vec3(9.0, 0.0, 1.0), 0.0, 1.0, 3.0, 4.0, true); fireMiddle->setVelocity(3); fireMiddle->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -0.5), 0.2); fireMiddle->addTexture(fireTex1, 1.0); //fireMiddle->addTexture(fireTex2, 0.5); fireMiddle->addTexture(fireTex3, 0.0); fireMiddle->defineLook(true, 0.5, 1.0, 2.0); fireMiddle->switchToGeometryShader(); Emitter* fireSmoke = new Emitter(0, glm::vec3(9.0, -1.0, 1.0), 0.0, 0.4, 1, 8.0, true); fireSmoke->setVelocity(2); fireSmoke->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -0.8), 0.3f); fireSmoke->addTexture(smokeBlackTex1, 1.0); fireSmoke->addTexture(smokeBlackTex2, 0.08); std::vector<float> fireSmokeSize{ 0.1f, 0.4f, 0.8f, 1.2f }; std::vector<float> fireSmokeTime{ 0.0f, 0.2f, 0.75f, 1.0f }; fireSmoke->defineLook(true, fireSmokeSize, fireSmokeTime, 1.0, 4.0, 1.0, false, 0.3); fireSmoke->switchToGeometryShader(); Emitter* firefly = new Emitter(0, glm::vec3(9.1, -0.9, 1.0), 0.0, 1.3, 1, 9.0, true); firefly->setVelocity(3); firefly->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -1.5), 0.13f); firefly->addTexture(fireflyTex, 1.0); firefly->defineLook(true, 0.04, 2.0, 2.0, 0.0, false, 0.3); Emitter* fireSparkOrange = new Emitter(0, glm::vec3(9.1, -0.9, 1.0), 0.0, 0.1, 1, 0.8, true); fireSparkOrange->setVelocity(3); fireSparkOrange->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -1.0), 1.5f); fireSparkOrange->addTexture(fireSparkTex1, 1.0); fireSparkOrange->defineLook(true, 0.02, 0.4, 0.3, 0.0, false, 0.3); Emitter* fireSparkRed = new Emitter(0, glm::vec3(9.1, -0.9, 1.0), 0.0, 0.1, 1, 1.0, true); fireSparkRed->setVelocity(3); fireSparkRed->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, -1.5), 1.5f); fireSparkRed->addTexture(fireSparkTex2, 1.0); fireSparkRed->defineLook(true, 0.02, 0.4, 0.3, 0.0, false, 0.3); //!EMITTER FIREWORK Emitter* firework = new Emitter(0, glm::vec3(0.6, 0.6, 0.0), 0.0, 0.5, 5, 1.0, true); firework->setVelocity(4); firework->usePhysicDirectionGravity(glm::vec4(0.0,-1.0,0.0,0.1), 1.0f); //firework->addTexture(*fireWorkYellowTex, 0.0); //firework->defineLook(true, 0.8, 0.1, 0.2); Emitter* firework2 = new Emitter(0, glm::vec3(-0.6, -0.6, 0.0), 0.0, 0.5, 5, 1.0, true); firework2->setVelocity(4); firework2->usePhysicDirectionGravity(glm::vec4(0.0, -1.0, 0.0, 0.1), 1.0f); //firework2->addTexture(*fireWorkOrangeTex, 0.0); //firework2->defineLook(true, 0.8, 0.1, 0.2); //////////////////////////////////////OUR SCENE/////////////////////////////////////////////// //SKYBOX Cube cube; const char *textureNames[6] = { /*(char*)RESOURCES_PATH "/PereaBeach1/posx.jpg", (char*)RESOURCES_PATH "/PereaBeach1/negx.jpg", (char*)RESOURCES_PATH "/PereaBeach1/posy.jpg", (char*)RESOURCES_PATH "/PereaBeach1/negy.jpg", (char*)RESOURCES_PATH "/PereaBeach1/posz.jpg", (char*)RESOURCES_PATH "/PereaBeach1/negz.jpg"*/ (char*)RESOURCES_PATH "/Color/testTex.png", (char*)RESOURCES_PATH "/Color/testTex.png", (char*)RESOURCES_PATH "/Color/testTex.png", (char*)RESOURCES_PATH "/Color/testTex.png", (char*)RESOURCES_PATH "/Color/testTex.png", (char*)RESOURCES_PATH "/Color/testTex.png" }; Skybox skybox(textureNames); Node skyboxNode("skybox"); skyboxNode.addGeometry(&cube); //OBJECTS Teapot teapot; teapot.loadBufferData(); Sphere sphere; sphere.loadBufferData(); Rect plane; plane.loadBufferData(); //TEXTURES Texture chrome((char*)RESOURCES_PATH "/Metal/chrome.jpg"); Texture marble((char*)RESOURCES_PATH "/Wall/seamless_marble.png"); //TODO JPG Texture cvLogo((char*)RESOURCES_PATH "/Symbol/cv_logo.bmp"); Texture bricks((char*)RESOURCES_PATH "/Wall/brick.bmp"); //CREATING NODES Level testLevel("testLevel"); Scene testScene("testScene"); testLevel.addScene(&testScene); testLevel.changeScene("testScene"); Node cube1("cube1"); cube1.addGeometry(&cube); cube1.addTexture(&chrome); cube1.setModelMatrix(glm::translate(cube1.getModelMatrix(), glm::vec3(-0.3, 0.25, 0.4))); cube1.setModelMatrix(glm::scale(cube1.getModelMatrix(), glm::vec3(0.3, 0.3, 0.3))); Node cube2("cube2"); cube2.addGeometry(&cube); cube2.addTexture(&chrome); cube2.setModelMatrix(glm::translate(cube2.getModelMatrix(), glm::vec3(0.7, 0.25, 0.4))); 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, -1.0, 0.0))); wallNode1.setModelMatrix(glm::rotate(wallNode1.getModelMatrix(), 90.0f, glm::vec3(1.0, 0.0, 0.0))); wallNode1.setModelMatrix(glm::scale(wallNode1.getModelMatrix(), glm::vec3(25.0, 2.0, 1.0))); Node wallNode2("wall2"); wallNode2.addGeometry(&plane); wallNode2.addTexture(&bricks); wallNode2.setModelMatrix(glm::translate(wallNode2.getModelMatrix(), glm::vec3(0.0, 0.0, 0.0))); wallNode2.setModelMatrix(glm::scale(wallNode2.getModelMatrix(), glm::vec3(25.0, 2.5, 1.0))); Node teaNode("teaNode"); teaNode.addGeometry(&teapot); teaNode.addTexture(&cvLogo); teaNode.setModelMatrix(glm::translate(teaNode.getModelMatrix(), glm::vec3(0.2, 0.3, 1.0))); 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); //ADD CAMERA TO SCENEGRAPH testScene.getScenegraph()->addCamera(&cam); testScene.getScenegraph()->getCamera("Pilotview"); testScene.getScenegraph()->setActiveCamera("Pilotview"); //GUI initGUI(); double startCamTime = glfwGetTime(); int outputFrames = 0; float dTime; while (!glfwWindowShouldClose(window.getWindow())) { //CAM dTime = glfwGetTime() - startCamTime; cam.setSensitivity(dTime); startCamTime = glfwGetTime(); //Maximum Particle if (!useMaximumParticle->isActive()){ //SKYBOX glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); shaderSkybox.bind(); glDisable(GL_DEPTH_TEST); shaderSkybox.sendMat4("viewMatrix", cam.getViewMatrix()); shaderSkybox.sendMat4("projectionMatrix", cam.getProjectionMatrix()); shaderSkybox.sendSkyboxTexture("testTexture", skybox.getSkyboxTexture()); //skyboxNode.render(); shaderSkybox.unbind(); glEnable(GL_DEPTH_TEST); shaderObject.bind(); shaderObject.sendMat4("viewMatrix", cam.getViewMatrix()); shaderObject.sendMat4("projectionMatrix", cam.getProjectionMatrix()); shaderObject.sendInt("useTexture", 1); teaNode.setModelMatrix(glm::rotate(teaNode.getModelMatrix(), 3.0f, glm::vec3(0.0, 1.0, 0.0))); cube1.setModelMatrix(glm::rotate(cube1.getModelMatrix(), 3.0f, glm::vec3(0.0, 1.0, 0.0))); cube2.setModelMatrix(glm::rotate(cube2.getModelMatrix(), 3.0f, glm::vec3(0.0, 1.0, 0.0))); //testScene.render(shaderObject); shaderObject.unbind(); ///////////////////////////////////////FINAL EMITTER/////////////////////////////////////// glDisable(GL_DEPTH_TEST); //smokeWhite->update(); //smokeWhite->render(cam); //smokeBlack->update(); //smokeBlack->render(cam); fontaine->update(); fontaine->render(cam); //circle->update(); //circle->render(cam); //quad->update(); //quad->render(cam); //glowworm->update(); //glowworm->render(cam); //fruitFlies->update(); //fruitFlies->render(cam); //energyBall->update(); //energyBall->render(cam); //cloud01->update(); //cloud01->render(cam); //cloud02->update(); //cloud02->render(cam); //cloud03->update(); //cloud03->render(cam); //cloud04->update(); //cloud04->render(cam); //cloud05->update(); //cloud05->render(cam); //cloud06->update(); //cloud06->render(cam); //cloud07->update(); //cloud07->render(cam); //cloud08->update(); //cloud08->render(cam); //cloud09->update(); //cloud09->render(cam); //cloud10->update(); //cloud10->render(cam); //cloud11->update(); //cloud11->render(cam); } ////////////////////////////////FINAL SCREEN EMITTER////////////////////////////////////////////////// else{ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); maximumParticle->update(); maximumParticle->render(cam); particleCount = particleCountMax; } if (useFruitFliesButton->isActive()){ screenFruitFlies->update(); screenFruitFlies->render(screen); } else{ screenFruitFlies->startTime(); } ////////////////////////////////FINAL GUI EMITTER/////////////////////////////////////////// if (useSnowButton->isActive()){ snow->update(glm::vec3(cam.getPosition())); snow->render(cam); } else{ snow->startTime(); } if (useStrongSnowButton->isActive()){ snowStrong->update(glm::vec3(cam.getPosition())); snowStrong->render(cam); } else{ snowStrong->startTime(); } if (useRainButton->isActive()){ rain->update(glm::vec3(cam.getPosition())); rain->render(cam); }{ rain->startTime(); } ////////////////////////////////WAITING FOR TEXTURES EMITTER//////////////////////////////// //todo: flamme //fireMiddle->update(); //fireMiddle->render(cam); //fireSmoke->update(); //fireSmoke->render(cam); //firefly->update(); //firefly->render(cam); //fireSparkOrange->update(); //fireSparkOrange->render(cam); //fireSparkRed->update(); //fireSparkRed->render(cam); // todo all //firework->update(); //firework->render(cam); //smokeCloud //smokeCloud->update(); //smokeCloud->render(cam); ////////////////////////////////BASICS/////////////////////////////////////////////////////// //renderer->renderGUI(*gui, window); //WINDOW window.swapAndPoll(); //FPS if (!(outputFrames % 30)){ outputFrames = 1; //std::cout << "FPS: " << static_cast<int> (1 / dTime) << "; Up to " << particleCount << " particles"<<std::endl; } outputFrames++; } glfwDestroyWindow(window.getWindow()); glfwTerminate(); return 0; }
int main(void) { Larp::ConfigurationLoader* config = Larp::ConfigurationLoader::load_configurations("larp.cfg"); screenWidth = config->get_width(); screenHeight = config->get_height(); // Init GLFW if (!glfwInit()) { THROW_RUNTIME_ERROR("glfwInit() failed!"); } glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, config->is_resizable()); //glfwWindowHint(GLFW_SAMPLES, 4); glfwSetErrorCallback(error_callback); GLFWwindow* window = glfwCreateWindow(screenWidth, screenHeight, config->get_title().c_str(), glfwGetPrimaryMonitor(), nullptr); // Windowed if (window == nullptr) { THROW_RUNTIME_ERROR("GLFWwindow* = nullptr"); } glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); glfwSetCursorPosCallback(window, mouse_callback); glfwSetMouseButtonCallback(window, mouse_button_callback); glfwSetScrollCallback(window, scroll_callback); glfwSetCharCallback(window, char_callback); // Options glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); // Initialize GLEW to setup the OpenGL Function pointers glewExperimental = GL_TRUE; glewInit(); // Define the viewport dimensions glViewport(0, 0, screenWidth, screenHeight); // Setup some OpenGL options glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); //glEnable(GL_MULTISAMPLE); // Setting up PhysicsWorld world.reset(new PhysicsWorld()); world->init_objects(); Larp::Model* level = Larp::Model::create("assets/LEVEL/LEVEL.obj"); Larp::Entity* entity = Larp::Entity::create(level); entity->set_directional_shadows(true); Larp::DirectionalLight* dir_light = Larp::LightFactory::create_directional_light(0.5, -1.0, 1.0); dir_light->set_ambient_intensity(0.2, 0.2, 0.2); Larp::Node* node11 = graph->create_child_node(); Larp::Node* player_node = graph->create_child_node(); Larp::Node* node21 = node11->create_child(); node21->attach_entity(entity); PhysicsMeshColliderBuilder physics_level_builder = PhysicsMeshColliderBuilder("assets/LEVEL/LEVEL.obj"); physics_level_builder.set_mass(0.0); physics_level_builder.set_restitution(1.0); physics_level_builder.set_user_pointer(node21); PhysicsMeshCollider* physics_level = physics_level_builder.build(); world->get_dynamics_world()->addRigidBody(physics_level->get_rigid_body()); Larp::Model* crate_model = Larp::Model::create("assets/crate/crate.obj"); Larp::Entity* entity22 = Larp::Entity::create(crate_model); entity22->set_directional_shadows(true); Larp::Node* crate_node = graph->create_child_node(); crate_node->attach_entity(entity22); crate_node->set_scale(0.4, 0.4, 0.4); std::cout << "Scaled dimensions of crate: (" << crate_node->get_scaled_width() << ", " << crate_node->get_scaled_height() << ", " << crate_node->get_scaled_depth() << ')' << std::endl; crate_node->set_position(0.0, 6.0, 3.0); destructable_items.insert(crate_node); PhysicsObjectBuilder<btBoxShape> crate_builder; crate_builder.set_position(glm::vec3(0.0, 6.0, 3.0)); crate_builder.set_mass(0.6); crate_builder.set_restitution(0.0); crate_builder.set_user_pointer(crate_node); PhysicsBox* crate_collider = crate_builder.build(); world->get_dynamics_world()->addRigidBody(crate_collider->get_rigid_body()); Weapon* shotgun = new Weapon("assets/Shotgun/shotgun_000000.obj", "assets/Shotgun/shotgun.lub", "assets/crate/crate.obj", "shotgun", graph->get_root_node(), -90, 0, 1.2, false); shotgun->_node->set_scale(0.1, 0.1, 0.1); shotgun->_node->set_position(3.0, 1.5, 0.0); shotgun->initiate_physics(world.get()); pickupable_items.insert(shotgun); Weapon* launcher = new Weapon("assets/Rocket Launcher/launcher_000000.obj", "assets/Rocket Launcher/launcher.lub", "assets/rocket/rocket.obj", "rocket_fire", graph->get_root_node(), 0, -90, 0.5, false); launcher->_node->set_scale(0.1, 0.1, 0.1); launcher->_node->set_position(-8.5, 8.5, 8.5); launcher->initiate_physics(world.get()); pickupable_items.insert(launcher); Weapon* chaingun = new Weapon("assets/Chaingun/chaingun_000000.obj", "assets/Chaingun/chaingun.lub", "assets/crate/crate.obj", "chaingun", graph->get_root_node(), 0, 0, 0.75, true); chaingun->_node->set_scale(0.2, 0.2, 0.2); chaingun->_node->set_position(10.0, 9.0, -10.0); chaingun->initiate_physics(world.get()); pickupable_items.insert(chaingun); /******************************* * TESTING - DELETE THIS * *******************************/ player.reset(new PhysicsPlayerController(world.get(), player_node, .35, .75, .15, glm::vec3(0, 5.0, 2.0))); player->set_user_pointer(player_node); camera_node = player_node->create_child(); camera_node->translate(0.0, 0.75, 0.0); make_floor(world); // Skybox stuff std::vector<const GLchar*> skybox_files; skybox_files.push_back("assets/skybox/right.jpg"); skybox_files.push_back("assets/skybox/left.jpg"); skybox_files.push_back("assets/skybox/top.jpg"); skybox_files.push_back("assets/skybox/bottom.jpg"); skybox_files.push_back("assets/skybox/back.jpg"); skybox_files.push_back("assets/skybox/front.jpg"); Larp::SkyBox skybox(skybox_files); graph->set_skybox(&skybox); GLfloat frame_rate_limiter = 0.0f; uint64_t iteration_number = 0; // soundMan = new SoundManager(); // GUIMan = new GUIManager(graph, window); GUIrendering = false; SoundManager::sound_init(); SoundManager::play_music(); /* Loop until the user closes the window */ while (!glfwWindowShouldClose(window)) { // GUIrendering = GUIMan->get_rendering_state(); // Set frame time Larp::Time::update_time(); // Update animation system Larp::AnimationHandler::update_animations(); frame_rate_limiter += Larp::Time::delta_time(); if (frame_rate_limiter > 1.0 / FRAME_RATE) { frame_rate_limiter -= 1.0 / FRAME_RATE; ++iteration_number; } else continue; // Check and call events glfwPollEvents(); do_movement(); player->update_movement(world.get()); world->get_dynamics_world()->stepSimulation(1.0f / FRAME_RATE, 10); player->step(world.get(), 1.0f / FRAME_RATE); Larp::Node* player_node = player->get_user_pointer(); glm::vec3 pos = player->get_position(); glm::quat quat = player->get_orientation(); player_node->set_position(pos); player_node->set_orientation(quat); camera._position = glm::vec3(pos.x, pos.y + player->get_height(), pos.z); camera._yaw = player->get_yaw(); glm::quat item_quat; //item_quat = glm::rotate(item_quat, 90.0f, glm::vec3(0, 1, 0)); item_quat = glm::rotate(item_quat, -camera._pitch, glm::vec3(1, 0, 0)); camera_node->set_orientation(item_quat); for (size_t i = 0; i < world->get_collision_object_count(); ++i) { btCollisionObject* obj = world->get_dynamics_world()->getCollisionObjectArray()[i]; btRigidBody* body = btRigidBody::upcast(obj); if (body && body->getMotionState() && obj->getCollisionFlags() != btCollisionObject::CF_CHARACTER_OBJECT) { btTransform trans; trans.setIdentity(); body->getMotionState()->getWorldTransform(trans); void* user_pointer = body->getUserPointer(); if (user_pointer != nullptr) { btQuaternion orientation = trans.getRotation(); Larp::Node* user_node = static_cast<Larp::Node*>(user_pointer); user_node->set_position(trans.getOrigin().getX(), trans.getOrigin().getY(), trans.getOrigin().getZ()); user_node->set_orientation(glm::quat(orientation.getW(), orientation.getX(), orientation.getY(), orientation.getZ())); } } } // Check and call events glfwPollEvents(); if(!GUIrendering) { do_movement(); if(firing && player_held_item != nullptr && player_held_item->_auto) { attempt_to_spawn_bullet(); } } // Clear the colorbuffer glClearColor(0.1f, 0.8f, 0.1f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // node11->yaw(Larp::Time::delta_time() * 32.0); // node11->pitch(Larp::Time::delta_time() * 23.0); // node11->roll(Larp::Time::delta_time() * 17.0); glm::mat4 projection = glm::perspective(camera._zoom, (float)screenWidth/(float)screenHeight, 0.1f, 100.0f); glm::mat4 view = camera.get_view_matrix(); glm::vec3 view_pos = camera._position; graph->draw(view, projection, view_pos); if(GUIrendering) { glDisable(GL_DEPTH_TEST); // CEGUI::System::getSingleton().renderAllGUIContexts(); glEnable(GL_DEPTH_TEST); } // Swap the buffers glfwSwapBuffers(window); } glfwTerminate(); SoundManager::sound_quit(); return 0; }