// The MAIN function, from here we start the application and run the // game loop int main() { std::cout << "Starting GLFW context, OpenGL 3.3" << std::endl; // Init GLFW glfwInit(); // Set all the required options for GLFW glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); // OS X requests 3.3 differently. #ifdef __APPLEOS__ glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); #endif glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); // Create a GLFWwindow object that we can use for GLFW's functions GLFWwindow* window = glfwCreateWindow(WIDTH, HEIGHT, "LearnOpenGL", nullptr, nullptr); if (window == nullptr) { std::cout << "Failed to create GLFW window" << std::endl; glfwTerminate(); return -1; } glfwMakeContextCurrent(window); // Set the required callback functions glfwSetKeyCallback(window, key_callback); // Set this to true so GLEW knows to use a modern approach to retrieving // function pointers and extensions // More hacking for my autocomplete. #ifndef CLANG_COMPLETE_ONLY glewExperimental = GL_TRUE; // Initialize GLEW to setup the OpenGL Function pointers if (glewInit() != GLEW_OK) { std::cout << "Failed to initialize GLEW" << std::endl; return -1; } #endif // Define the viewport dimensions // Corrected from the tutorial, should request framebuffer size instead. // Technically should also write a callback when the window is resized // with framebuffer_size_callback. See GLFW docs. This will do for now. int fbwidth, fbheight; glfwGetFramebufferSize(window, &fbwidth, &fbheight); // Options glViewport(0, 0, WIDTH, HEIGHT); glEnable(GL_DEPTH_TEST); // ---------- BEGIN OPENGL ----------- // // Shader creation Shader edgeShader("vertex_shader_unsliced.glsl", "fragment_shader_unsliced.glsl"); // Data GLfloat vertices[] = { // Positions 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, -0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, 0.6f, 0.6f, 0.6f, -0.6f, 0.6f, 0.6f, -0.6f, -0.6f, 0.6f, -0.6f, -0.6f, -0.6f, 0.6f, -0.6f, 0.6f, -0.6f, 0.6f, 0.8f, 0.8f, 0.8f, -0.8f, 0.8f, -0.8f, 0.8f, -0.8f, -0.8f, -0.8f, 0.8f, -0.8f, -0.8f, 0.8f, 0.8f, -0.8f, 0.8f, 0.8f, -0.8f, -0.8f, 0.8f, -0.8f, -0.8f, -0.8f, -0.8f, -0.8f, -0.8f, -0.8f, -0.8f, 0.8f, -0.8f, -0.8f, }; GLuint indices[] = { // Near Cube 0, 2, 1, 0, 3, 2, 7, 5, 6, 7, 4, 5, 3, 4, 7, 3, 0, 4, 6, 1, 2, 6, 5, 1, 6, 3, 7, 6, 2, 3, 1, 4, 0, 1, 5, 4, // Far Cube 8, 10, 9, 8, 11, 10, 15, 13, 14, 15, 12, 13, 11, 12, 15, 11, 8, 12, 14, 9, 10, 14, 13, 9, 14, 11, 15, 14, 10, 11, 9, 12, 8, 9, 13, 12, // Front Cube 0, 2, 1, 0, 3, 2, 11, 9, 10, 11, 8, 9, 3, 0, 8, 3, 8, 11, 10, 1, 2, 10, 9, 1, 10, 3, 11, 10, 2, 3, 1, 8, 0, 1, 9, 8, // Back Cube 5, 7, 4, 5, 6, 7, 14, 12, 15, 14, 13, 12, 6, 5, 13, 6, 13, 14, 15, 4, 7, 15, 12, 4, 15, 6, 14, 15, 7, 6, 4, 13, 5, 4, 12, 13, // Top Cube 4, 7, 3, 4, 3, 0, 15, 8, 11, 15, 12, 8, 7, 12, 15, 7, 4, 12, 0, 11, 8, 0, 3, 11, 3, 7, 15, 3, 15, 11, 4, 0, 8, 4, 8, 12, // Bottom Cube 1, 2, 6, 1, 6, 5, 10, 13, 14, 10, 9, 13, 2, 9, 10, 2, 1, 9, 5, 14, 13, 5, 6, 14, 6, 2, 10, 6, 10, 14, 1, 5, 13, 1, 13, 9, // Left Cube 3, 7, 6, 3, 6, 2, 15, 11, 10, 15, 10, 14, 11, 15, 7, 11, 7, 3, 14, 2, 6, 14, 10, 2, 7, 15, 14, 7, 14, 6, 11, 3, 2, 11, 2, 10, // Right Cube 1, 5, 4, 1, 4, 0, 13, 9, 8, 13, 8, 12, 9, 13, 5, 9, 5, 1, 12, 0, 4, 12, 8, 0, 5, 13, 12, 5, 12, 4, 9, 1, 0, 9, 0, 8, }; // Textures // Set up buffer stuff GLuint VAO, VBO, EBO; glGenVertexArrays(1, &VAO); glGenBuffers(1, &VBO); glGenBuffers(1, &EBO); // Game loop while (!glfwWindowShouldClose(window)) { // Check if any events have been activated (key pressed, mouse moved // etc.) and call corresponding response functions glfwPollEvents(); // Setup stuff glClearColor(0.2f, 0.3f, 0.3f, 1.0f); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_BLEND); glLineWidth(3); // 4D-3D Transformations glm::mat4 model4D(1.0f), view4D; GLfloat theta = glm::radians((GLfloat)glfwGetTime() * 50.0f); GLfloat cs = cos(theta), sn = sin(theta); model4D[0][0] = cs; model4D[0][3] = -sn; model4D[3][0] = sn; model4D[3][3] = cs; glm::mat4x3 projection4D; glm::vec4 from(0.0f, 0.0f, 0.0f, 4.0f), to(0.0f, 0.0f, 0.0f, 0.0f); glm::vec4 up(0.0f, 1.0f, 0.0f, 0.0f), over(0.0f, 0.0f, 1.0f, 0.0f); view4D = lookAt4D(from, to, up, over); std::cout << "View Mat: " << std::endl; printMat(view4D, 4, 4); projection4D = proj4D(); GLfloat *projVert = new GLfloat[16*7]; std::cout << "--------------------------------" << std::endl; for(int i = 0; i != 16; i++) { // Project each vertex to the 3D space glm::vec4 vert4(vertices[i*4], vertices[i*4+1], vertices[i*4+2], vertices[i*4+3]); glm::vec4 viewVert = view4D * (model4D * vert4 - from); glm::vec3 vert3 = projection4D * view4D * (model4D * vert4 - from); printVec(viewVert, 4); projVert[i*7] = vert3.x; projVert[i*7+1] = vert3.y; projVert[i*7+2] = vert3.z; if (i < 8) { projVert[i*7+3] = 1.0f; projVert[i*7+4] = 0.0f; projVert[i*7+5] = 0.0f; } else { projVert[i*7+3] = 0.0f; projVert[i*7+4] = 0.0f; projVert[i*7+5] = 1.0f; } projVert[i*7+6] = (viewVert.w + 5.0f)/2.0f; } // 3D-2D Transformations glm::mat4 view3D = glm::lookAt(glm::vec3(3.0f, 1.2f, 2.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f)); glm::mat4 proj3D = glm::perspective(glm::radians(45.0f), (float)WIDTH/(float)HEIGHT, 0.1f, 100.0f); // Shader Uniforms edgeShader.Use(); GLint viewLoc = glGetUniformLocation(edgeShader.Program, "view3D"); GLint projectionLoc = glGetUniformLocation(edgeShader.Program, "projection3D"); glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view3D)); glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(proj3D)); // Load Vertices glBindVertexArray(VAO); glBindBuffer(GL_ARRAY_BUFFER, VBO); glBufferData(GL_ARRAY_BUFFER, 16*7*sizeof(GL_FLOAT), projVert, GL_DYNAMIC_DRAW); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_DYNAMIC_DRAW); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 7*sizeof(GL_FLOAT), (GLvoid*)0); glEnableVertexAttribArray(0); glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, 7*sizeof(GL_FLOAT), (GLvoid*)(3*sizeof(GL_FLOAT))); glEnableVertexAttribArray(1); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); glDrawElements(GL_TRIANGLES, 8*12*3, GL_UNSIGNED_INT, 0); glBindVertexArray(0); // Swap the screen buffers glfwSwapBuffers(window); delete[] projVert; } // Terminate GLFW, clearing any resources allocated by GLFW. glfwTerminate(); glDeleteVertexArrays(1, &VAO); glDeleteBuffers(1, &VBO); glDeleteBuffers(1, &EBO); return 0; }
int main(int argc,char** argv) { setCameraDistance(30.f); #define TRISIZE 10.f #ifdef DEBUG_MESH SimdVector3 vert0(-TRISIZE ,0,TRISIZE ); SimdVector3 vert1(TRISIZE ,10,TRISIZE ); SimdVector3 vert2(TRISIZE ,0,-TRISIZE ); meshData.AddTriangle(vert0,vert1,vert2); SimdVector3 vert3(-TRISIZE ,0,TRISIZE ); SimdVector3 vert4(TRISIZE ,0,-TRISIZE ); SimdVector3 vert5(-TRISIZE ,0,-TRISIZE ); meshData.AddTriangle(vert3,vert4,vert5); #else #ifdef ODE_MESH SimdVector3 Size = SimdVector3(15.f,15.f,12.5f); gVertices[0][0] = -Size[0]; gVertices[0][1] = Size[2]; gVertices[0][2] = -Size[1]; gVertices[1][0] = Size[0]; gVertices[1][1] = Size[2]; gVertices[1][2] = -Size[1]; gVertices[2][0] = Size[0]; gVertices[2][1] = Size[2]; gVertices[2][2] = Size[1]; gVertices[3][0] = -Size[0]; gVertices[3][1] = Size[2]; gVertices[3][2] = Size[1]; gVertices[4][0] = 0; gVertices[4][1] = 0; gVertices[4][2] = 0; gIndices[0] = 0; gIndices[1] = 1; gIndices[2] = 4; gIndices[3] = 1; gIndices[4] = 2; gIndices[5] = 4; gIndices[6] = 2; gIndices[7] = 3; gIndices[8] = 4; gIndices[9] = 3; gIndices[10] = 0; gIndices[11] = 4; int vertStride = sizeof(SimdVector3); int indexStride = 3*sizeof(int); TriangleIndexVertexArray* indexVertexArrays = new TriangleIndexVertexArray(NUM_TRIANGLES, gIndices, indexStride, NUM_VERTICES,(float*) &gVertices[0].x(),vertStride); //shapePtr[4] = new TriangleMeshShape(indexVertexArrays); shapePtr[4] = new BvhTriangleMeshShape(indexVertexArrays); #else int vertStride = sizeof(SimdVector3); int indexStride = 3*sizeof(int); const int NUM_VERTS_X = 50; const int NUM_VERTS_Y = 50; const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); SimdVector3* gVertices = new SimdVector3[totalVerts]; int* gIndices = new int[totalTriangles*3]; int i; for ( i=0;i<NUM_VERTS_X;i++) { for (int j=0;j<NUM_VERTS_Y;j++) { gVertices[i+j*NUM_VERTS_X].setValue((i-NUM_VERTS_X*0.5f)*10.f,2.f*sinf((float)i)*cosf((float)j),(j-NUM_VERTS_Y*0.5f)*10.f); } } int index=0; for ( i=0;i<NUM_VERTS_X-1;i++) { for (int j=0;j<NUM_VERTS_Y-1;j++) { gIndices[index++] = j*NUM_VERTS_X+i; gIndices[index++] = j*NUM_VERTS_X+i+1; gIndices[index++] = (j+1)*NUM_VERTS_X+i+1; gIndices[index++] = j*NUM_VERTS_X+i; gIndices[index++] = (j+1)*NUM_VERTS_X+i+1; gIndices[index++] = (j+1)*NUM_VERTS_X+i; } } TriangleIndexVertexArray* indexVertexArrays = new TriangleIndexVertexArray(totalTriangles, gIndices, indexStride, totalVerts,(float*) &gVertices[0].x(),vertStride); //shapePtr[4] = new TriangleMeshShape(indexVertexArrays); shapePtr[4] = new BvhTriangleMeshShape(indexVertexArrays); #endif #endif//DEBUG_MESH // GLDebugDrawer debugDrawer; //ConstraintSolver* solver = new SimpleConstraintSolver; ConstraintSolver* solver = new OdeConstraintSolver; CollisionDispatcher* dispatcher = new CollisionDispatcher(); BroadphaseInterface* broadphase = new SimpleBroadphase(); physicsEnvironmentPtr = new CcdPhysicsEnvironment(dispatcher,broadphase); physicsEnvironmentPtr->setGravity(-1,-10,1); PHY_ShapeProps shapeProps; shapeProps.m_do_anisotropic = false; shapeProps.m_do_fh = false; shapeProps.m_do_rot_fh = false; shapeProps.m_friction_scaling[0] = 1.; shapeProps.m_friction_scaling[1] = 1.; shapeProps.m_friction_scaling[2] = 1.; shapeProps.m_inertia = 1.f; shapeProps.m_lin_drag = 0.95999998f; shapeProps.m_ang_drag = 0.89999998f; shapeProps.m_mass = 1.0f; PHY_MaterialProps materialProps; materialProps.m_friction = 0.f;// 50.5f; materialProps.m_restitution = 0.1f; CcdConstructionInfo ccdObjectCi; ccdObjectCi.m_friction = 0.f;//50.5f; ccdObjectCi.m_linearDamping = shapeProps.m_lin_drag; ccdObjectCi.m_angularDamping = shapeProps.m_ang_drag; SimdTransform tr; tr.setIdentity(); for (i=0;i<numObjects;i++) { if (i>0) shapeIndex[i] = 1;//2 = tetrahedron else shapeIndex[i] = 4; } for (i=0;i<numObjects;i++) { shapeProps.m_shape = shapePtr[shapeIndex[i]]; bool isDyna = i>0; if (!i) { //SimdQuaternion orn(0,0,0.1*SIMD_HALF_PI); //ms[i].setWorldOrientation(orn.x(),orn.y(),orn.z(),orn[3]); //ms[i].setWorldPosition(0,-10,0); } else { ms[i].setWorldPosition(10,i*15-10,0); } //either create a few stacks, to show several islands, or create 1 large stack, showing stability //ms[i].setWorldPosition((i*5) % 30,i*15-10,0); ccdObjectCi.m_MotionState = &ms[i]; ccdObjectCi.m_gravity = SimdVector3(0,0,0); ccdObjectCi.m_localInertiaTensor =SimdVector3(0,0,0); if (!isDyna) { shapeProps.m_mass = 0.f; ccdObjectCi.m_mass = shapeProps.m_mass; } else { shapeProps.m_mass = 1.f; ccdObjectCi.m_mass = shapeProps.m_mass; } SimdVector3 localInertia; if (shapeProps.m_mass>0.f) { shapePtr[shapeIndex[i]]->CalculateLocalInertia(shapeProps.m_mass,localInertia); } else { localInertia.setValue(0.f,0.f,0.f); } ccdObjectCi.m_localInertiaTensor = localInertia; ccdObjectCi.m_collisionShape = shapePtr[shapeIndex[i]]; physObjects[i]= new CcdPhysicsController( ccdObjectCi); physicsEnvironmentPtr->addCcdPhysicsController( physObjects[i]); /* if (i==0) { physObjects[i]->SetAngularVelocity(0,0,-2,true); physObjects[i]->GetRigidBody()->setDamping(0,0); } */ //for the line that represents the AABB extents // physicsEnvironmentPtr->setDebugDrawer(&debugDrawer); } return glutmain(argc, argv,640,480,"Static Concave Mesh Demo"); }