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); } } }
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; }
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)); }