void Primitive::setupTangentFrame(const IntersectionTemporary &data, const IntersectionInfo &info, TangentFrame &dst) const { const Texture *bump = info.bsdf ? info.bsdf->bump().get() : nullptr; if ((!bump || bump->isConstant()) && !info.bsdf->lobes().isAnisotropic()) { dst = TangentFrame(info.Ns); return; } Vec3f T, B, N(info.Ns); if (!tangentSpace(data, info, T, B)) { dst = TangentFrame(info.Ns); return; } if (bump && !bump->isConstant()) { Vec2f dudv; bump->derivatives(info.uv, dudv); T += info.Ns*(dudv.x() - info.Ns.dot(T)); B += info.Ns*(dudv.y() - info.Ns.dot(B)); N = T.cross(B); if (N == 0.0f) { dst = TangentFrame(info.Ns); return; } if (N.dot(info.Ns) < 0.0f) N = -N; N.normalize(); } T = (T - N.dot(T)*N); if (T == 0.0f) { dst = TangentFrame(info.Ns); return; } T.normalize(); B = N.cross(T); dst = TangentFrame(N, T, B); }
int main(void) { GLFWwindow* window; camera = new Camera(); fov = 67; con = 0.0; int width, height; glfwSetErrorCallback(error_callback); if (!glfwInit()) exit(EXIT_FAILURE); window = glfwCreateWindow(1600, 900, "Simple example", glfwGetPrimaryMonitor(), NULL); if (!window) { glfwTerminate(); exit(EXIT_FAILURE); } glfwMakeContextCurrent(window); glfwSwapInterval(1); glewInit(); glfwSetKeyCallback(window, key_callback); glfwGetFramebufferSize(window, &width, &height); glViewport(0, 0, width, height); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LEQUAL); glDisable(GL_CULL_FACE); Quad* quad = new Quad; Shader * geom = new Shader("geometry.vert", "geometry.frag"); geom->setAttribute(0, "point"); geom->linkProgram(); geom->bind(); geom->unbind(); float deltaTime = float(0.005); while (!glfwWindowShouldClose(window)) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDepthMask(GL_TRUE); camera->Update(); geom->bind(); geom->passUniform(camera->position, "position"); geom->passUniform(camera->direction, "direction"); geom->passUniform(camera->upVector, "upVector"); geom->passUniform(camera->viewMatrix, "viewMatrix"); geom->passUniform(camera->projectionMatrix, "projectionMatrix"); geom->passUniform(con, "con"); quad->Render(); geom->unbind(); glDepthMask(GL_TRUE); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); for (int i = 0; i < wave.size(); ++i) { mat3 tangentSpace(wave[i].bitangent, wave[i].normal, wave[i].tangent); float previousDistance = wave[i].distance; wave[i].position += tangentSpace * wave[i].direction * deltaTime; wave[i].distance = sdTorus(wave[i].position); wave[i].position += wave[i].normal * wave[i].distance; wave[i].normal = getNormal(wave[i].position); vec3 tangent, bitangent, normal; vec3 position = wave[i].position; normal = wave[i].normal; mat4 rotation = glm::rotate(0.05f, vec3(0, 1.0, 0)); vec3 delta = vec3( rotation*vec4(position, 1.0) ); tangent = delta - wave[i].position; tangent = normalize(tangent); bitangent = cross(tangent, normal); wave[i].bitangent = bitangent; wave[i].tangent = tangent; } glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(67.3801, (GLfloat)1600.0 / (GLfloat)900.0, 0.5, 50.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt( camera->position.x, camera->position.y, camera->position.z, camera->position.x + camera->direction.x, camera->position.y + camera->direction.y, camera->position.z + camera->direction.z, camera->upVector.x, camera->upVector.y, camera->upVector.z); if (wave.size() > 0) { vec3 arr[800]; glBegin(GL_LINE_LOOP); for (int i = 0; i < 800; ++i){ arr[i] = wave[i].position; glColor3f(1.0, 1.0, 1.0); glVertex3f(arr[i].x, arr[i].y, arr[i].z); /* glBegin(GL_LINE_LOOP); glColor3f(1.0, 0.0, 0.0); arr[i] = wave[i].position; vec3 nrm = wave[i].normal * float(0.1); glVertex3f(arr[i].x, arr[i].y, arr[i].z); glVertex3f(arr[i].x+nrm.x, arr[i].y +nrm.y, arr[i].z+nrm.z); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(0.0, 1.0, 0.0); arr[i] = wave[i].position; nrm = wave[i].tangent * float(0.1); glVertex3f(arr[i].x, arr[i].y, arr[i].z); glVertex3f(arr[i].x + nrm.x, arr[i].y + nrm.y, arr[i].z + nrm.z); glEnd(); glBegin(GL_LINE_LOOP); glColor3f(0.0, 0.0, 1.0); arr[i] = wave[i].position; nrm = wave[i].bitangent * float(0.1); glVertex3f(arr[i].x, arr[i].y, arr[i].z); glVertex3f(arr[i].x + nrm.x, arr[i].y + nrm.y, arr[i].z + nrm.z); glEnd(); */ } glEnd(); } glfwSwapBuffers(window); glfwPollEvents(); } glfwDestroyWindow(window); glfwTerminate(); exit(EXIT_SUCCESS); }