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;
}
Example #2
0
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();
}