diff options
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r-- | src/renderer.cpp | 46 |
1 files changed, 19 insertions, 27 deletions
diff --git a/src/renderer.cpp b/src/renderer.cpp index 6e170f3..7a32807 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -31,7 +31,6 @@ unsigned int Renderer::height() const { void Renderer::clear() { std::fill(depth_buf.begin(), depth_buf.end(), 1.f); - face_ind = -1; fb->clear(); } @@ -60,8 +59,8 @@ void Renderer::_draw_cropped_triangle(o3d::TriangleVertex4 root, o3d::TriangleDe fac_b0 * sorted_vs[0]->point.z + (1.f - fac_b0) * sorted_vs[2]->point.z, 1.f / (1.f / sorted_vs[0]->point.w + fac * (1.f / sorted_vs[2]->point.w - 1.f / sorted_vs[0]->point.w)) }, - sorted_vs[0]->b0 + fac * (sorted_vs[2]->b0 - sorted_vs[0]->b0), - sorted_vs[0]->b1 + fac * (sorted_vs[2]->b1 - sorted_vs[0]->b1) + fac_b0 * sorted_vs[0]->b0 + (1.f - fac_b0) * sorted_vs[2]->b0, + fac_b0 * sorted_vs[0]->b1 + (1.f - fac_b0) * sorted_vs[2]->b1 }; if (middle_vr.point.x < middle_vl.point.x) { auto temp = middle_vr; @@ -86,22 +85,19 @@ void Renderer::_draw_cropped_triangle(o3d::TriangleVertex4 root, o3d::TriangleDe float ix = static_cast<float>(x); float t = (ix - xl) / (xr - xl); float sub_bb1 = s * (1.f - t); - float b_fac = 1.f / ( - sub_bb0 / sorted_vs[0]->point.w - + sub_bb1 / middle_vl.point.w - + (1.f - sub_bb0 - sub_bb1) / middle_vr.point.w); + float b_fac = 1.f / (sub_bb0 / sorted_vs[0]->point.w + sub_bb1 / middle_vl.point.w + (1.f - sub_bb0 - sub_bb1) / middle_vr.point.w); float sub_b0 = b_fac * sub_bb0 / sorted_vs[0]->point.w; float sub_b1 = b_fac * sub_bb1 / middle_vl.point.w; + float b0 = sub_b0 * sorted_vs[0]->b0 + sub_b1 * middle_vl.b0 + (1.f - sub_b0 - sub_b1) * middle_vr.b0; + float b1 = sub_b0 * sorted_vs[0]->b1 + sub_b1 * middle_vl.b1 + (1.f - sub_b0 - sub_b1) * middle_vr.b1; math::Vector3 loc{ - sub_b0 * sorted_vs[0]->point.x + sub_b1 * middle_vl.point.x + (1.f - sub_b0 - sub_b1) * middle_vr.point.x, - sub_b0 * sorted_vs[0]->point.y + sub_b1 * middle_vl.point.y + (1.f - sub_b0 - sub_b1) * middle_vr.point.y, - sub_b0 * sorted_vs[0]->point.z + sub_b1 * middle_vl.point.z + (1.f - sub_b0 - sub_b1) * middle_vr.point.z + b0 * root.vertex1.point.x + b1 * root.vertex2.point.x + (1.f - b0 - b1) * root.vertex3.point.x, + b0 * root.vertex1.point.y + b1 * root.vertex2.point.y + (1.f - b0 - b1) * root.vertex3.point.y, + b0 * root.vertex1.point.z + b1 * root.vertex2.point.z + (1.f - b0 - b1) * root.vertex3.point.z }; if (loc.z < depth_buf[x + y * fb->width()]) { depth_buf[x + y * fb->width()] = loc.z; - fb->draw_point(x, y, loc, o3d::VertexData::bilerp(root.vertex1.data, root.vertex2.data, root.vertex3.data, - sub_b0 * sorted_vs[0]->b0 + sub_b1 * middle_vl.b0 + (1.f - sub_b0 - sub_b1) * middle_vr.b0, - sub_b0 * sorted_vs[0]->b1 + sub_b1 * middle_vl.b1 + (1.f - sub_b0 - sub_b1) * middle_vr.b1)); + fb->draw_point(x, y, loc, o3d::VertexData::bilerp(root.vertex1.data, root.vertex2.data, root.vertex3.data, b0, b1)); } } } @@ -125,22 +121,19 @@ void Renderer::_draw_cropped_triangle(o3d::TriangleVertex4 root, o3d::TriangleDe float ix = static_cast<float>(x); float t = (ix - xl) / (xr - xl); float sub_bb1 = s * (1.f - t); - float b_fac = 1.f / ( - sub_bb0 / sorted_vs[2]->point.w - + sub_bb1 / middle_vl.point.w - + (1.f - sub_bb0 - sub_bb1) / middle_vr.point.w); + float b_fac = 1.f / (sub_bb0 / sorted_vs[2]->point.w + sub_bb1 / middle_vl.point.w + (1.f - sub_bb0 - sub_bb1) / middle_vr.point.w); float sub_b0 = b_fac * sub_bb0 / sorted_vs[2]->point.w; float sub_b1 = b_fac * sub_bb1 / middle_vl.point.w; + float b0 = sub_b0 * sorted_vs[2]->b0 + sub_b1 * middle_vl.b0 + (1.f - sub_b0 - sub_b1) * middle_vr.b0; + float b1 = sub_b0 * sorted_vs[2]->b1 + sub_b1 * middle_vl.b1 + (1.f - sub_b0 - sub_b1) * middle_vr.b1; math::Vector3 loc{ - sub_b0 * sorted_vs[2]->point.x + sub_b1 * middle_vl.point.x + (1.f - sub_b0 - sub_b1) * middle_vr.point.x, - sub_b0 * sorted_vs[2]->point.y + sub_b1 * middle_vl.point.y + (1.f - sub_b0 - sub_b1) * middle_vr.point.y, - sub_b0 * sorted_vs[2]->point.z + sub_b1 * middle_vl.point.z + (1.f - sub_b0 - sub_b1) * middle_vr.point.z + b0 * root.vertex1.point.x + b1 * root.vertex2.point.x + (1.f - b0 - b1) * root.vertex3.point.x, + b0 * root.vertex1.point.y + b1 * root.vertex2.point.y + (1.f - b0 - b1) * root.vertex3.point.y, + b0 * root.vertex1.point.z + b1 * root.vertex2.point.z + (1.f - b0 - b1) * root.vertex3.point.z }; if (loc.z < depth_buf[x + y * fb->width()]) { depth_buf[x + y * fb->width()] = loc.z; - fb->draw_point(x, y, loc, o3d::VertexData::bilerp(root.vertex1.data, root.vertex2.data, root.vertex3.data, - sub_b0 * sorted_vs[2]->b0 + sub_b1 * middle_vl.b0 + (1.f - sub_b0 - sub_b1) * middle_vr.b0, - sub_b0 * sorted_vs[2]->b1 + sub_b1 * middle_vl.b1 + (1.f - sub_b0 - sub_b1) * middle_vr.b1)); + fb->draw_point(x, y, loc, o3d::VertexData::bilerp(root.vertex1.data, root.vertex2.data, root.vertex3.data, b0, b1)); } } } @@ -149,12 +142,11 @@ void Renderer::_draw_cropped_triangle(o3d::TriangleVertex4 root, o3d::TriangleDe } void Renderer::draw_triangle(o3d::TriangleVertex4 triangle) { - face_ind++; for (auto t1 : triangle.to_derived().crop_z_out(-1.f, 1.f)) { for (auto t2 : t1.div_by_w().perspective_crop_xy_out(-1.f, 1.f, -1.f, 1.f)) { - math::Vector2 pp1 = t2.derived_vertex1.point.xy(); - math::Vector2 pp2 = t2.derived_vertex2.point.xy(); - math::Vector2 pp3 = t2.derived_vertex3.point.xy(); + auto pp1 = t2.derived_vertex1.point.xy(); + auto pp2 = t2.derived_vertex2.point.xy(); + auto pp3 = t2.derived_vertex3.point.xy(); if ((pp2 - pp1).det(pp3 - pp1) >= 0.f) continue; float fw_over_2 = static_cast<float>(fb->width()) / 2.f, fh_over_2 = static_cast<float>(fb->height()) / 2.f; t2.derived_vertex1.point.x = (t2.derived_vertex1.point.x + 1.f) * fw_over_2 - .5f; |