summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--dev/a6-harold/README.md2
-rw-r--r--dev/a6-harold/ground.cc40
-rw-r--r--dev/a6-harold/sky.cc28
3 files changed, 44 insertions, 26 deletions
diff --git a/dev/a6-harold/README.md b/dev/a6-harold/README.md
index e69de29..4fb595a 100644
--- a/dev/a6-harold/README.md
+++ b/dev/a6-harold/README.md
@@ -0,0 +1,2 @@
+# A6
+The only major bug that I found is a crash when the user tries to make a drawing of size 0 in the sky. This can be reproduce by just clicking in the sky. Otherwise everything works as it should. \ No newline at end of file
diff --git a/dev/a6-harold/ground.cc b/dev/a6-harold/ground.cc
index 51d4d92..969e2d0 100644
--- a/dev/a6-harold/ground.cc
+++ b/dev/a6-harold/ground.cc
@@ -164,18 +164,27 @@ void Ground::ReshapeGround(const Matrix4 &view_matrix, const Matrix4 &proj_matri
// should pass through these two points on the ground. The plane should also
// have a normal vector that points toward the camera and is parallel to the
// ground plane.
+ int first_point = 0;
+ int last_point = stroke2d.size()-1;
+ Point3 start, end;
+ ScreenPtHitsGround(view_matrix, proj_matrix, stroke2d[first_point], &start);
+ ScreenPtHitsGround(view_matrix, proj_matrix, stroke2d[last_point], &end);
+ Vector3 plane_x = Vector3::Normalize(start - end);
+ Vector3 plane_y = Vector3(0, 1, 0);
+ Vector3 plane_normal = Vector3::Normalize(-look);
-
-
-
-
// 2. Project the 2D stroke into 3D so that it lies on the "projection plane"
// defined in step 1.
-
-
-
-
-
+ std::vector<Point3> stroke3d;
+ for (int i = 0; i < last_point; i++) {
+ Point3 pt3d;
+ Point3 mouseIn3d = GfxMath::ScreenToNearPlane(view_matrix, proj_matrix, stroke2d[i]);
+ Ray eyeThroughMouse = Ray(eye, (mouseIn3d - eye).ToUnit());
+ float time;
+ eyeThroughMouse.IntersectPlane(start, plane_normal, &time, &pt3d);
+ stroke3d.push_back(pt3d);
+ }
+
// 3. Loop through all of the vertices of the ground mesh, and adjust the
// height of each based on the equations in section 4.5 of the paper, also
// repeated in the assignment handout. The equations rely upon a function
@@ -186,11 +195,14 @@ void Ground::ReshapeGround(const Matrix4 &view_matrix, const Matrix4 &proj_matri
Point3 P = ground_mesh_.read_vertex_data(i); // original vertex
// adjust P according to equations...
-
-
-
-
-
+ float h = hfunc(plane_normal, stroke3d, P);
+ float wd = 0;
+ float d = P.DistanceToPlane(start, plane_normal);
+ if (1 - pow(d / 5, 2) > 0)
+ wd = 1 - pow(d / 5, 2);
+ if (h != 0)
+ P = Point3(P[0], (1 - wd) * P[1] + wd * h, P[2]);
+
new_verts.push_back(P);
}
ground_mesh_.SetVertices(new_verts);
diff --git a/dev/a6-harold/sky.cc b/dev/a6-harold/sky.cc
index bc08ca0..8b04a69 100644
--- a/dev/a6-harold/sky.cc
+++ b/dev/a6-harold/sky.cc
@@ -34,12 +34,12 @@ bool Sky::ScreenPtHitsSky(const Matrix4 &view_matrix, const Matrix4 &proj_matrix
Point3 eye = camera_matrix.ColumnToPoint3(3);
// TODO: Stitch together your worksheet implementation of this method
- return true;
+ Point3 mouseIn3d = GfxMath::ScreenToNearPlane(view_matrix, proj_matrix, normalized_screen_pt);
+ Ray eyeThroughMouse = Ray(eye, (mouseIn3d - eye).ToUnit());
+ float t;
+ return eyeThroughMouse.IntersectSphere(Point3::Origin(), 1500, &t, sky_point);
}
-
-
-
/// Creates a new sky stroke mesh by projecting each vertex of the 2D mesh
/// onto the sky dome and saving the result as a new 3D mesh.
void Sky::AddSkyStroke(const Matrix4 &view_matrix, const Matrix4 &proj_matrix,
@@ -47,15 +47,19 @@ void Sky::AddSkyStroke(const Matrix4 &view_matrix, const Matrix4 &proj_matrix,
{
// TODO: Create a new SkyStroke and add it to the strokes_ array.
+ Mesh sky = stroke2d_mesh;
+ std::vector<Point3> sky_points;
+ for (int i = 0; i < sky.num_vertices(); i++) {
+ Point3 sky_point;
+ ScreenPtHitsSky(view_matrix, proj_matrix, Point2(sky.read_vertex_data(i)[0], sky.read_vertex_data(i)[1]), &sky_point);
+ sky_points.push_back(sky_point);
+ }
+ sky.SetVertices(sky_points);
-
-
-
-
-
-
-
-
+ SkyStroke sky_stroke;
+ sky_stroke.mesh = sky;
+ sky_stroke.color = stroke_color;
+ strokes_.push_back(sky_stroke);
}