void init() { GLfloat skyboxVertices[] = { // Positions -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, 1.0f, -1.0f, 1.0f }; planet = tetrahedron(5); object = ObjLoadModel("include/obj/torus.obj"); vec3 tangent[planet.vertexNumber]; vec3 bitangent[planet.vertexNumber]; *tangent = *generateTangents(planet.vertexNumber, planet.points, tangent, bitangent); vec3 vna[planet.vertexNumber]; *vna = *generateSmoothNormals(planet.vertexNumber, vna, planet.points, planet.normals); createShader(&skyboxShader, "src/shaders/skybox.vert", "src/shaders/skybox.frag"); createShader(&sunShader, "src/shaders/sun.vert", "src/shaders/sun.frag"); createShader(&planetShader, "src/shaders/planet.vert", "src/shaders/planet.frag"); createShader(&atmosphereShader, "src/shaders/atmosphere.vert", "src/shaders/atmosphere.frag"); glGenFramebuffers(1, &hdrFBO); glGenTextures(1, &colorBuffer); glBindTexture(GL_TEXTURE_2D, colorBuffer); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB16F, WIDTH, HEIGHT, 0, GL_RGB, GL_FLOAT, NULL); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glGenRenderbuffers(1, &rboDepth); glBindRenderbuffer(GL_RENDERBUFFER, rboDepth); glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, WIDTH, HEIGHT); glBindFramebuffer(GL_FRAMEBUFFER, hdrFBO); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorBuffer, 0); glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, rboDepth); if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) printf("Framebuffer not complete!\n"); glBindFramebuffer(GL_FRAMEBUFFER, 0); glGenVertexArrays(1, &planetVAO); glBindVertexArray(planetVAO); glGenBuffers(1, &planetVBO); glBindBuffer(GL_ARRAY_BUFFER, planetVBO); glBufferData(GL_ARRAY_BUFFER, planet.size + planet.nsize, NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, planet.size, planet.points); glBufferSubData(GL_ARRAY_BUFFER, planet.size, planet.nsize, vna); glBufferSubData(GL_ARRAY_BUFFER, planet.size+planet.nsize, sizeof(tangent), tangent); glBufferSubData(GL_ARRAY_BUFFER, planet.size+planet.nsize+sizeof(tangent), sizeof(tangent), tangent); vPosition = glGetAttribLocation(planetShader, "vPosition"); glEnableVertexAttribArray(vPosition); glVertexAttribPointer(vPosition, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(0)); vNormal = glGetAttribLocation(planetShader, "vNormal"); glEnableVertexAttribArray(vNormal); glVertexAttribPointer(vNormal, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(planet.size)); vTangent = glGetAttribLocation(planetShader, "vTangent"); glEnableVertexAttribArray(vTangent); glVertexAttribPointer(vTangent, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(planet.size+planet.nsize)); vBitangent = glGetAttribLocation(planetShader, "vBitangent"); glEnableVertexAttribArray(vBitangent); glVertexAttribPointer(vBitangent, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(planet.size+planet.nsize+sizeof(tangent))); glBindVertexArray(0); glGenVertexArrays(1, &skyboxVAO); glBindVertexArray(skyboxVAO); glGenBuffers(1, &skyboxVBO); glBindBuffer(GL_ARRAY_BUFFER, skyboxVBO); glBufferData(GL_ARRAY_BUFFER, sizeof(skyboxVertices), skyboxVertices, GL_STATIC_DRAW); vPosition = glGetAttribLocation(skyboxShader, "vPosition"); glEnableVertexAttribArray(vPosition); glVertexAttribPointer(vPosition, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(GLfloat), (GLvoid*)0); glBindVertexArray(0); glGenVertexArrays(1, &objectVAO); glBindVertexArray(objectVAO); glGenBuffers(1, &objectVBO); glBindBuffer(GL_ARRAY_BUFFER, objectVBO); glBufferData(GL_ARRAY_BUFFER, object.size + object.nsize, NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, object.size, object.points); glBufferSubData(GL_ARRAY_BUFFER, object.size, object.nsize, object.normals); vPosition = glGetAttribLocation(sunShader, "vPosition"); glEnableVertexAttribArray(vPosition); glVertexAttribPointer(vPosition, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(0)); vNormal = glGetAttribLocation(sunShader, "vNormal"); glEnableVertexAttribArray(vNormal); glVertexAttribPointer(vNormal, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(object.size)); glBindVertexArray(0); glGenVertexArrays(1, &atmosphereVAO); glBindVertexArray(atmosphereVAO); glGenBuffers(1, &atmosphereVBO); glBindBuffer(GL_ARRAY_BUFFER, atmosphereVBO); glBufferData(GL_ARRAY_BUFFER, planet.size + planet.nsize, NULL, GL_STATIC_DRAW); glBufferSubData(GL_ARRAY_BUFFER, 0, planet.size, planet.points); glBufferSubData(GL_ARRAY_BUFFER, planet.size, planet.nsize, planet.normals); vPosition = glGetAttribLocation(atmosphereShader, "vPosition"); glEnableVertexAttribArray(vPosition); glVertexAttribPointer(vPosition, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(0)); vNormal = glGetAttribLocation(atmosphereShader, "vNormal"); glEnableVertexAttribArray(vNormal); glVertexAttribPointer(vNormal, 3, GL_FLOAT, GL_FALSE, 3*sizeof(GLfloat), BUFFER_OFFSET(planet.size)); glBindVertexArray(0); glEnable(GL_DEPTH_TEST); }
void load_model() { char* memory = NULL; //char* model_file = (char*) MEDIA_PATH "mesh/mob4.obj"; //char* model_file = (char*) MEDIA_PATH "mesh/drone1.obj"; char* model_file = (char*) MEDIA_PATH "mesh/cube_test.obj"; size_t bytes = ObjLoadFile(model_file, &memory); if (memory == NULL) { printf("ERROR: %s -- failed to load file %s\n", __FUNCTION__, model_file); return; } ObjModel* model = ObjLoadModel(memory, bytes); m_model = model; printf("Object Model: nTriangle= %d \n", model->nTriangle); printf("Object Model: nVertex= %d \n", model->nVertex); printf("Object Model: nTexCoord= %d \n", model->nTexCoord); printf("Object Model: nNormal= %d \n", model->nNormal); v_num = model->nTriangle*3; v_array = new Vertex[v_num]; memset(v_array, 0, v_num*sizeof(Vertex)); for (int i=0; i<model->nTriangle; i++) { for (int j=0; j<3; j++) { struct Vertex v; int iv = model->TriangleArray[i].Vertex[j] -1; int itx = model->TriangleArray[i].TexCoord[j] -1; int in = model->TriangleArray[i].Normal[j] -1; if (iv >= model->nVertex) { printf("ERROR: iv= %i nVertex= %i \n", iv, model->nVertex); } if (itx >= model->nTexCoord) { printf("ERROR: itx= %i nTexCoord= %i \n", itx, model->nTexCoord); } if (in >= model->nNormal) { printf("ERROR: in= %i nNormal= %i \n", in, model->nNormal); } //printf("triangle: %i, iv= %i itx= %i \n", i, iv, itx); v.x = model->VertexArray[iv].x; v.y = model->VertexArray[iv].y; v.z = model->VertexArray[iv].z; v.u = model->TexCoordArray[itx].u; v.v = 1.0f - model->TexCoordArray[itx].v; v.n[0] = model->NormalArray[in].x; v.n[1] = model->NormalArray[in].y; v.n[2] = model->NormalArray[in].z; //printf("len= %f \n", v.n[0]*v.n[0] + v.n[1]*v.n[1] + v.n[2]*v.n[2]); //printf("normal= %f %f %f \n", v.n[0],v.n[1],v.n[2]); v_array[3*i+j] = v; } } free(memory); }