/** * Defines a mesh, ready to be OpenGL-rendered **/ #pragma once #include #include #include // size_t #include "common_structures.hpp" class Mesh { public: Mesh(); /// Adds a fresh vertice at `pt`, and returns its ID for further use size_t add_vertice(const Point& pt); size_t add_vertice(const Point& pt, const Point& normal); /// Creates a new face out of the three given point IDs void add_face(const Face& face); void add_face(size_t f1, size_t f2, size_t f3); /// Center manipulation const Point& get_center() const; void set_center(const Point& pt); void translate(const Point& tr); ///< Translate by the vector `tr` /** Translates the vertices to make (0, 0, 0) the mesh's barycenter. * If `keep_position == true`, this also sets the center to the * previous barycenter. */ void normalize_center(bool keep_position=false); /// Get the normal vector for vertice `vert_id` const Point& get_normal(size_t vert_id); /// Gets the various vertices const std::vector& get_vertices() const; /// Gets the various faces const std::vector& get_faces() const; const Color& get_color() const { return color; } void set_color(const Color& _color) { color = _color; } private: //struct struct NormalVect { NormalVect(const Point& vect, bool manual=false) : vect(vect), dirty(false), manual(manual) {} NormalVect() : vect(Point(0., 0., 0.)), dirty(true), manual(false) {} Point vect; bool dirty; bool manual; }; private: //meth size_t inner_add_vertice(const Point& pt, const NormalVect& normal); void compute_normal(size_t vert); private: std::vector vertices; std::vector normals; std::vector faces; std::vector > faces_with_vert; Point center; Color color; };