// // Created by trotfunky on 30/09/2019. // #include "Model3D.h" Model3D::Model3D() : vertex_count(0), face_count(0), texture_count(0), is_textured(false) {} Model3D::Model3D(const std::string& file_name) : Model3D() { load_ascii_off_file(file_name); } Model3D::~Model3D() { if (vertex_count > 0) { delete(vertices); } if (face_count > 0) { delete(faces); } if (is_textured && texture_count > 0) { delete(texture_coordinates); delete(face_textures); delete(normals); } } void Model3D::draw_model() { if (is_textured) { glEnable(GL_ALPHA_TEST); glPolygonMode(GL_FRONT_AND_BACK,GL_FILL); glBindTexture(GL_TEXTURE_2D,texture->opengl_id[0]); glColor4f(1.0f, 1.0f, 1.0f,1.00); } glPushMatrix(); glScalef(scaling.x,scaling.y,scaling.z); glRotatef(rotation_angle,rotation_axis.x,rotation_axis.y,rotation_axis.z); glBegin(GL_TRIANGLES); for (uint32_t i = 0;i> vertex_count >> face_count >> edge_count; vertices = new Vec3f[vertex_count]; faces = new Vec3i[face_count]; for (uint32_t i = 0;i> vertices[i]; } for (uint32_t i = 0;i> edge_count; if (edge_count != 3) { std::cerr << "Models must only have triangles !" << std::endl; file_stream.close(); return false; } file_stream >> faces[i]; } if (!file_stream) { std::cerr << "Unexpected EOF while reading model data in " << file_name << std::endl; file_stream.close(); return false; } while(std::getline(file_stream,temp) && temp.find("EXT")); file_stream >> texture_count; if (texture_count > 0) { is_textured = true; texture_coordinates = new Vec2f[texture_count]; face_textures = new Vec3i[face_count]; normals = new Vec3f[face_count]; // Parse U,V coordinates for (uint32_t i = 0;i> texture_coordinates[i]; } // Assign U,V coordinates to vertices for (uint32_t i = 0;i> face_textures[i]; } for (uint32_t i=0;i> normals[i]; } if (!file_stream) { std::cerr << "Error while parsing texture data in " << file_name << std::endl; file_stream.close(); return false; } } return true; } bool Model3D::assign_texture(Texture& new_texture) { if (is_textured) { texture = &new_texture; return true; } else { return false; } } void Model3D::set_scaling(float x_scale, float y_scale, float z_scale) { scaling.x = x_scale; scaling.y = y_scale; scaling.z = z_scale; } void Model3D::set_rotation(float angle, float x, float y, float z) { rotation_axis.x = x; rotation_axis.y = y; rotation_axis.z = z; rotation_angle = angle; }