Пример #1
0
void		rotateImage(t_bunny_pixelarray *s,
			    t_bunny_pixelarray *d, double r)
{
  t_mat3	m;
  t_ivec2	incr;
  t_color	color;
  t_ivec2	v[3];
  t_vec3	tmp;

  v[0] = ivec2(d->clipable.clip_width / 2, d->clipable.clip_height / 2);
  v[2] = subiVec2(v[0], ivec2(s->clipable.clip_width / 2.0,
			      s->clipable.clip_height / 2.0));
  m = mat3();
  translate3(&m, to_vec2(v[0]));
  rotate3D(&m, vec3(0, 0, -r));
  translate3(&m, vec2(-v[0].x, -v[0].y));
  incr.y = -1;
  while (++incr.y < d->clipable.clip_height)
    {
      incr.x = -1;
      while (++incr.x < d->clipable.clip_width)
	{
	  tmp = multMatVec3(&m, vec3(incr.x, incr.y, 1));
	  v[1] = to_ivec2(vec2(tmp.x, tmp.y));
	  color.full = getPixel(s, subiVec2(v[1], v[2]));
	  tekpixel(d, &incr, &color);
	}
    }
}
Пример #2
0
bool raycast(game* g, vec2 from, vec2 to) {
	ivec2 cur(fast_floor(from.x), fast_floor(from.y));
	ivec2 end(fast_floor(to.x), fast_floor(to.y));
	ivec2 sign(sign(to.x - from.x), sign(to.y - from.y));
	vec2 abs_delta(abs(to.x - from.x), abs(to.y - from.y));
	vec2 delta_t(vec2(1.0f) / abs_delta);
	vec2 lb(to_vec2(cur));
	vec2 ub(lb + vec2(1.0f));
	vec2 t(vec2((from.x > to.x) ? (from.x - lb.x) : (ub.x - from.x), (from.y > to.y) ? (from.y - lb.y) : (ub.y - from.y)) / abs_delta);

	for(;;) {
		if (g->is_raycast_solid(cur.x, cur.y))
			return true;

		if (t.x <= t.y) {
			if (cur.x == end.x) break;
			t.x += delta_t.x;
			cur.x += sign.x;
		}
		else {
			if (cur.y == end.y) break;
			t.y += delta_t.y;
			cur.y += sign.y;
		}
	}

	return false;
}
Пример #3
0
void RenderGame()
{
	if (void* data = gpu::Map(gRectVb))
	{
		memcpy(data, gRectVerts, gRectVertCount * sizeof(Vertex));
		gpu::Unmap(gRectVb);
	}

	if (void* data = gpu::Map(gFontVb))
	{
		memcpy(data, gFontVerts, gFontVertCount * sizeof(Vertex));
		gpu::Unmap(gFontVb);
	}

	if (void* data = gpu::Map(gTriVb))
	{
		memcpy(data, gTriVerts, gTriVertCount * sizeof(Vertex));
		gpu::Unmap(gTriVb);
	}

	// draw
	gpu::SetRenderTarget(g_draw_target);
	gpu::SetDepthTarget(g_depth_target);

	gpu::SetViewport(ivec2(0, 0), g_WinSize, vec2(0.0f, 1.0f));
	gpu::Clear(0x00000000);

	gpu::SetDepthMode(true);
	gpu::SetVsConst(0, gProj * gCam3d);
	gpu::Draw(gSolidDecl, gTriVb, gTriVertCount, true, false);
	gpu::SetDepthMode(false);

	gpu::SetVsConst(0, gCam);
	gpu::SetTexture(0, g_sheet);
	gpu::SetSampler(0, true, false);
	gpu::Draw(gTexDecl, gRectVb, gRectVertCount, true, false);

	gpu::SetTexture(0, g_font);
	gpu::SetSampler(0, true, false);
	gpu::Draw(gTexDecl, gFontVb, gFontVertCount, true, false);

	gpu::SetDepthTarget(0);

	for(int i = 0; i < MAX_BLOOM_LEVELS; i++) {
		bloom_level* bl = g_bloom_levels + i;

		// reduce
		gpu::SetRenderTarget(bl->reduce);
		gpu::SetViewport(ivec2(), bl->size, vec2(0.0f, 1.0f));
		gpu::SetTexture(0, (i == 0) ? g_draw_target : g_bloom_levels[i - 1].blur_y);
		gpu::SetSampler(0, true, true);
		gpu::SetPsConst(0, vec4(1.0f / to_vec2(bl->size), 0.0f, 0.0f));
		do_fullscreen_quad(gReduceDecl, to_vec2(bl->size));

		// blur x
		gpu::SetRenderTarget(bl->blur_x);
		gpu::SetViewport(ivec2(), bl->size, vec2(0.0f, 1.0f));
		gpu::SetTexture(0, bl->reduce);
		gpu::SetSampler(0, true, true);
		gpu::SetPsConst(0, vec4(1.0f / to_vec2(bl->size), 0.0f, 0.0f));
		do_fullscreen_quad(gBlurXDecl, to_vec2(bl->size));

		// blur y
		gpu::SetRenderTarget(bl->blur_y);
		gpu::SetViewport(ivec2(), bl->size, vec2(0.0f, 1.0f));
		gpu::SetTexture(0, bl->blur_x);
		gpu::SetSampler(0, true, true);
		gpu::SetPsConst(0, vec4(1.0f / to_vec2(bl->size), 0.0f, 0.0f));
		do_fullscreen_quad(gBlurYDecl, to_vec2(bl->size));
	}

	// combine
	gpu::SetDefaultRenderTarget();
	gpu::SetViewport(ivec2(0, 0), g_WinSize, vec2(0.0f, 1.0f));
	gpu::SetPsConst(0, g_render_rand.v4rand(vec4(500.0f), vec4(1500.0f)));
	gpu::SetTexture(0, g_draw_target);
	gpu::SetSampler(0, true, false);
	for(int i = 0; i < MAX_BLOOM_LEVELS; i++) {
		gpu::SetTexture(1 + i, g_bloom_levels[i].blur_y);
		gpu::SetSampler(1 + i, true, true);
	}
	do_fullscreen_quad(gCombineDecl, to_vec2(g_WinSize));
}