Point image_position(const CanvasGeo& g, const wxWindow& w){ const IntPoint viewPos = view_position(w); const IntPoint scroll = g.pos; const IntPoint border = point_from_size(g.border); const coord zoom = g.zoom.GetScaleFactor(); return (viewPos + scroll - border) / zoom; }
void raytracer_app::render(double currentTime) { printf("render\n"); static const GLfloat zeros[] = { 0.0f, 0.0f, 0.0f, 0.0f }; static const GLfloat gray[] = { 0.1f, 0.1f, 0.1f, 0.0f }; static const GLfloat ones[] = { 1.0f }; static double last_time = 0.0; static double total_time = 0.0; if (!paused) total_time += (currentTime - last_time); last_time = currentTime; float f = (float)total_time; // matricies math::vec3 view_position( sinf(f * 0.3234f) * 28.0f, cosf(f * 0.4234f) * 28.0f, cosf(f * 0.1234f) * 28.0f); // sinf(f * 0.2341f) * 20.0f - 8.0f); math::vec3 lookat_point(sinf(f * 0.214f) * 8.0f, cosf(f * 0.153f) * 8.0f, sinf(f * 0.734f) * 8.0f); math::mat44 view_matrix = math::lookat(view_position, lookat_point, math::vec3(0.0f, 1.0f, 0.0f)); glBindBufferBase(GL_UNIFORM_BUFFER, 0, uniforms_buffer); uniforms_block * block = (uniforms_block *)glMapBufferRange(GL_UNIFORM_BUFFER, 0, sizeof(uniforms_block), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); math::mat44 model_matrix; model_matrix.SetScale(math::vec3(7.0f,7.0f,7.0f)); // f = 0.0f; block->mv_matrix = view_matrix * model_matrix; block->view_matrix = view_matrix; block->proj_matrix.SetPerspective(50.0f, (float)info.windowWidth / (float)info.windowHeight, 0.1f, 1000.0f); glUnmapBuffer(GL_UNIFORM_BUFFER); // sphere glBindBufferBase(GL_UNIFORM_BUFFER, 1, sphere_buffer); sphere * s = (sphere *)glMapBufferRange(GL_UNIFORM_BUFFER, 0, 128 * sizeof(sphere), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); int i; for (i = 0; i < 128; i++) { // float f = 0.0f; float fi = (float)i / 128.0f; s[i].center = math::vec3( sinf(fi * 123.0f + f) * 15.75f, cosf(fi * 456.0f + f) * 15.75f, (sinf(fi * 300.0f + f) * cosf(fi * 200.0f + f)) * 20.0f); s[i].radius = fi * 2.3f + 3.5f; float r = fi * 61.0f; float g = r + 0.25f; float b = g + 0.25f; r = (r - floorf(r)) * 0.8f + 0.2f; g = (g - floorf(g)) * 0.8f + 0.2f; b = (b - floorf(b)) * 0.8f + 0.2f; s[i].color = math::vec4(r, g, b, 1.0f); } glUnmapBuffer(GL_UNIFORM_BUFFER); // plane glBindBufferBase(GL_UNIFORM_BUFFER, 2, plane_buffer); plane * p = (plane *)glMapBufferRange(GL_UNIFORM_BUFFER, 0, 128 * sizeof(plane), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); //for (i = 0; i < 1; i++) { p[0].normal = math::vec3(0.0f, 0.0f, -1.0f); p[0].d = 30.0f; p[1].normal = math::vec3(0.0f, 0.0f, 1.0f); p[1].d = 30.0f; p[2].normal = math::vec3(-1.0f, 0.0f, 0.0f); p[2].d = 30.0f; p[3].normal = math::vec3(1.0f, 0.0f, 0.0f); p[3].d = 30.0f; p[4].normal = math::vec3(0.0f, -1.0f, 0.0f); p[4].d = 30.0f; p[5].normal = math::vec3(0.0f, 1.0f, 0.0f); p[5].d = 30.0f; } glUnmapBuffer(GL_UNIFORM_BUFFER); // lights if(pnt) printf("lights\n"); glBindBufferBase(GL_UNIFORM_BUFFER, 3, light_buffer); light * l = (light *)glMapBufferRange(GL_UNIFORM_BUFFER, 0, 128 * sizeof(light), GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_BUFFER_BIT); f *= 1.0f; for (i = 0; i < 128; i++) { float fi = 3.33f - (float)i; // / 35.0f; l[i].position = math::vec3(sinf(fi * 2.0f - f) * 15.75f, cosf(fi * 5.0f - f) * 5.75f, (sinf(fi * 3.0f - f) * cosf(fi * 2.5f - f)) * 19.4f); } glUnmapBuffer(GL_UNIFORM_BUFFER); // prepare if(pnt) printf("prepare\n"); glBindVertexArray(vao); glViewport(0, 0, info.windowWidth, info.windowHeight); glUseProgram(prepare_program); glUniformMatrix4fv(uniforms.ray_lookat, 1, GL_FALSE, view_matrix); glUniform3fv(uniforms.ray_origin, 1, view_position); glUniform1f(uniforms.aspect, (float)info.windowHeight / (float)info.windowWidth); glBindFramebuffer(GL_FRAMEBUFFER, ray_fbo[0]); glDrawBuffers(6, draw_buffers); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); // trace if(pnt) printf("trace\n"); glUseProgram(trace_program); recurse(0); // blit if(pnt) printf("blit\n"); glUseProgram(blit_program); glBindFramebuffer(GL_FRAMEBUFFER, 0); glDrawBuffer(GL_BACK); glActiveTexture(GL_TEXTURE0); switch (debug_mode) { case DEBUG_NONE: glBindTexture(GL_TEXTURE_2D, tex_composite); break; case DEBUG_REFLECTED: glBindTexture(GL_TEXTURE_2D, tex_reflected[debug_depth]); break; case DEBUG_REFRACTED: glBindTexture(GL_TEXTURE_2D, tex_refracted[debug_depth]); break; case DEBUG_REFLECTED_COLOR: glBindTexture(GL_TEXTURE_2D, tex_reflection_intensity[debug_depth]); break; case DEBUG_REFRACTED_COLOR: glBindTexture(GL_TEXTURE_2D, tex_refraction_intensity[debug_depth]); break; } glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); /* glClearBufferfv(GL_COLOR, 0, gray); glClearBufferfv(GL_DEPTH, 0, ones); glBindVertexArray(vao); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); */ glutSwapBuffers(); }