/** CSci-4611 Assignment 3: Earthquake */ #include "earth.h" #include "config.h" #include // for M_PI constant #define _USE_MATH_DEFINES #include Earth::Earth() { } Earth::~Earth() { } void Earth::Init(const std::vector &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 indices; std::vector 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 indices = earth_mesh_.read_triangle_indices_data(t); std::vector 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); } }