diff options
Diffstat (limited to 'dev/a3-earthquake/earth.cc')
-rw-r--r-- | dev/a3-earthquake/earth.cc | 93 |
1 files changed, 65 insertions, 28 deletions
diff --git a/dev/a3-earthquake/earth.cc b/dev/a3-earthquake/earth.cc index db43b10..e2c87da 100644 --- a/dev/a3-earthquake/earth.cc +++ b/dev/a3-earthquake/earth.cc @@ -17,6 +17,10 @@ Earth::Earth() { Earth::~Earth() { } +float lerp(float x, float y, float a) { + return x + a * (y - x); +} + void Earth::Init(const std::vector<std::string> &search_path) { // init shader program shader_.Init(); @@ -25,37 +29,65 @@ void Earth::Init(const std::vector<std::string> &search_path) { earth_tex_.InitFromFile(Platform::FindFile("earth-2k.png", search_path)); // init geometry - const int nslices = 10; - const int nstacks = 10; + + std::vector<Point2> tex; // 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)); + for (int i = 0; i < nslices + 1; i++) { + for (int j = 0; j < nstacks + 1; j++) { + Point3 sphere_point = Point3(LatLongToSphere(lerp(-M_PI / 2, M_PI / 2, j * 1.0 / nstacks), lerp(-M_PI, M_PI, i * 1.0 / nslices))); + Point3 plane_point = Point3(lerp(-M_PI, M_PI, i * 1.0 / nslices), lerp(-M_PI / 2, M_PI / 2, j * 1.0 / nstacks), 0); + vertices_.push_back(plane_point); + sphVertices_.push_back(sphere_point); + normals_.push_back(Vector3(0,0,1)); + sphNormals_.push_back(sphere_point - Point3(0,0,0)); + tex_.push_back(Point2(i * 1.0 / nslices, 1 - j * 1.0 / nstacks)); + } + } + + //Lower triangles + for (int i = 0; i < nslices; i++) { + for (int j = 0; j < nstacks; j++) { + indices_.push_back(0 + j + (nstacks + 1) * i); + indices_.push_back(nstacks + 1 + j + (nstacks + 1) * i); + indices_.push_back(1 + j + (nstacks + 1) * i); + } + } + + //Upper triangles + for (int i = 0; i < nslices; i++) { + for (int j = 0; j < nstacks; j++) { + indices_.push_back(1 + j + (nstacks + 1) * i); + indices_.push_back(nstacks + 1 + j + (nstacks + 1) * i); + indices_.push_back(nstacks + 2 + j + (nstacks + 1) * i); + } + } - // 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(); + earth_mesh_.SetVertices(vertices_); + earth_mesh_.SetIndices(indices_); + earth_mesh_.SetTexCoords(0, tex_); + earth_mesh_.SetNormals(normals_); + } - +void Earth::set_globe_mode(bool globe_mode) { + if (globe_mode) { + earth_mesh_.SetVertices(sphVertices_); + earth_mesh_.SetIndices(indices_); + earth_mesh_.SetTexCoords(0, tex_); + earth_mesh_.SetNormals(sphNormals_); + } else { + earth_mesh_.SetVertices(vertices_); + earth_mesh_.SetIndices(indices_); + earth_mesh_.SetTexCoords(0, tex_); + earth_mesh_.SetNormals(normals_); + } + 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" @@ -86,13 +118,18 @@ void Earth::Draw(const Matrix4 &model_matrix, const Matrix4 &view_matrix, const 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); + float x = cos(latitude) * sin(longitude); + float y = sin(latitude); + float z = cos(latitude) * cos(longitude); + + return Point3(x, y, z); } 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); + // return Point3(latitude,longitude,0); + return Point3(GfxMath::ToRadians(longitude), GfxMath::ToRadians(latitude), 0); } @@ -102,11 +139,11 @@ void Earth::DrawDebugInfo(const Matrix4 &model_matrix, const Matrix4 &view_matri // 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<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])); + 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); } |