aboutsummaryrefslogtreecommitdiff
path: root/src/renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/renderer.cpp')
-rw-r--r--src/renderer.cpp46
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;