summaryrefslogtreecommitdiffstats
path: root/dev/a3-earthquake/earth.cc
diff options
context:
space:
mode:
Diffstat (limited to 'dev/a3-earthquake/earth.cc')
-rw-r--r--dev/a3-earthquake/earth.cc114
1 files changed, 114 insertions, 0 deletions
diff --git a/dev/a3-earthquake/earth.cc b/dev/a3-earthquake/earth.cc
new file mode 100644
index 0000000..db43b10
--- /dev/null
+++ b/dev/a3-earthquake/earth.cc
@@ -0,0 +1,114 @@
+/** CSci-4611 Assignment 3: Earthquake
+ */
+
+#include "earth.h"
+#include "config.h"
+
+#include <vector>
+
+// for M_PI constant
+#define _USE_MATH_DEFINES
+#include <math.h>
+
+
+Earth::Earth() {
+}
+
+Earth::~Earth() {
+}
+
+void Earth::Init(const std::vector<std::string> &search_path) {
+ // init shader program
+ shader_.Init();
+
+ // init texture: you can change to a lower-res texture here if needed
+ earth_tex_.InitFromFile(Platform::FindFile("earth-2k.png", search_path));
+
+ // init geometry
+ const int nslices = 10;
+ const int nstacks = 10;
+
+ // TODO: This is where you need to set the vertices and indiceds for earth_mesh_.
+
+ // As a demo, we'll add a square with 2 triangles.
+ std::vector<unsigned int> indices;
+ std::vector<Point3> vertices;
+
+ // four vertices
+ vertices.push_back(Point3(0,0,0));
+ vertices.push_back(Point3(1,0,0));
+ vertices.push_back(Point3(1,1,0));
+ vertices.push_back(Point3(0,1,0));
+
+ // indices into the arrays above for the first triangle
+ indices.push_back(0);
+ indices.push_back(1);
+ indices.push_back(2);
+
+ // indices for the second triangle, note some are reused
+ indices.push_back(0);
+ indices.push_back(2);
+ indices.push_back(3);
+
+ earth_mesh_.SetVertices(vertices);
+ earth_mesh_.SetIndices(indices);
+ earth_mesh_.UpdateGPUMemory();
+}
+
+
+
+void Earth::Draw(const Matrix4 &model_matrix, const Matrix4 &view_matrix, const Matrix4 &proj_matrix) {
+ // Define a really bright white light. Lighting is a property of the "shader"
+ DefaultShader::LightProperties light;
+ light.position = Point3(10,10,10);
+ light.ambient_intensity = Color(1,1,1);
+ light.diffuse_intensity = Color(1,1,1);
+ light.specular_intensity = Color(1,1,1);
+ shader_.SetLight(0, light);
+
+ // Adust the material properties, material is a property of the thing
+ // (e.g., a mesh) that we draw with the shader. The reflectance properties
+ // affect the lighting. The surface texture is the key for getting the
+ // image of the earth to show up.
+ DefaultShader::MaterialProperties mat;
+ mat.ambient_reflectance = Color(0.5, 0.5, 0.5);
+ mat.diffuse_reflectance = Color(0.75, 0.75, 0.75);
+ mat.specular_reflectance = Color(0.75, 0.75, 0.75);
+ mat.surface_texture = earth_tex_;
+
+ // Draw the earth mesh using these settings
+ if (earth_mesh_.num_triangles() > 0) {
+ shader_.Draw(model_matrix, view_matrix, proj_matrix, &earth_mesh_, mat);
+ }
+}
+
+
+Point3 Earth::LatLongToSphere(double latitude, double longitude) const {
+ // TODO: We recommend filling in this function to put all your
+ // lat,long --> sphere calculations in one place.
+ return Point3(0,0,0);
+}
+
+Point3 Earth::LatLongToPlane(double latitude, double longitude) const {
+ // TODO: We recommend filling in this function to put all your
+ // lat,long --> plane calculations in one place.
+ return Point3(0,0,0);
+}
+
+
+
+void Earth::DrawDebugInfo(const Matrix4 &model_matrix, const Matrix4 &view_matrix, const Matrix4 &proj_matrix) {
+ // This draws a cylinder for each line segment on each edge of each triangle in your mesh.
+ // So it will be very slow if you have a large mesh, but it's quite useful when you are
+ // debugging your mesh code, especially if you start with a small mesh.
+ for (int t=0; t<earth_mesh_.num_triangles(); t++) {
+ std::vector<unsigned int> indices = earth_mesh_.read_triangle_indices_data(t);
+ std::vector<Point3> loop;
+ loop.push_back(earth_mesh_.read_vertex_data(indices[0]));
+ loop.push_back(earth_mesh_.read_vertex_data(indices[1]));
+ loop.push_back(earth_mesh_.read_vertex_data(indices[2]));
+ quick_shapes_.DrawLines(model_matrix, view_matrix, proj_matrix,
+ Color(1,1,0), loop, QuickShapes::LinesType::LINE_LOOP, 0.005f);
+ }
+}
+