65 iFaces{ aOther.iFaces },
66 iBegin{ iFaces->begin() + (aBegin - iFaces->cbegin()) },
67 iEnd{ iFaces->begin() + (aEnd - iFaces->cbegin()) }
73 return iFaces ==
nullptr || iFaces->empty();
77 if (iFaces ==
nullptr)
79 return iBegin != boost::none ? *iBegin : iFaces->cbegin();
87 if (iFaces ==
nullptr)
89 return iBegin != boost::none ? *iBegin : iFaces->begin();
91 const_iterator
cend()
const 93 if (iFaces ==
nullptr)
95 return iEnd != boost::none ? *iEnd : iFaces->cend();
97 const_iterator
end()
const 103 if (iFaces ==
nullptr)
105 return iEnd != boost::none ? *iEnd : iFaces->end();
109 if (iFaces ==
nullptr)
110 iFaces = std::make_shared<container>();
115 if (iFaces ==
nullptr)
116 iFaces = std::make_shared<container>();
117 iBegin = boost::none;
122 mutable container_pointer iFaces;
123 boost::optional<iterator> iBegin;
124 boost::optional<iterator> iEnd;
127 inline void add_faces(vertex_list_pointer aVertices,
face_list& aFaces,
const std::vector<vec3>& aShapeVertices)
129 const std::size_t existingVertexCount = aVertices->size();
130 for (
const auto& v : aShapeVertices)
133 aFaces.
faces().push_back(
neogfx::face{ { existingVertexCount + 0, existingVertexCount + vi, existingVertexCount + vi + 1 } });
138 const std::size_t existingVertexCount = aVertices->size();
142 const double zero = (!aUpsideDown ? 0.0 : 1.0);
143 const double one = (!aUpsideDown ? 1.0 : 0.0);
159 virtual vertex_list_pointer vertices()
const = 0;
162 virtual face_list active_faces()
const = 0;
163 virtual void activate_faces(
face_list aActiveFaces)
const = 0;
164 virtual mat44 transformation_matrix()
const = 0;
165 virtual const vertex_list& transformed_vertices()
const = 0;
167 virtual void set_vertices(vertex_list_pointer aVertices) = 0;
169 virtual void set_faces(
face_list aFaces) = 0;
176 iMesh{ aMesh }, iPreviouslyActiveFaces{ aMesh.
active_faces() }
182 iMesh.activate_faces(iPreviouslyActiveFaces);
191 if (aVertices.empty())
193 point topLeft{ aVertices[0].coordinates.
x, aVertices[0].coordinates.y };
194 point bottomRight = topLeft;
195 for (
auto const& v : aVertices)
197 topLeft.
x = std::min<coordinate>(topLeft.x, v.coordinates.x);
198 topLeft.y = std::min<coordinate>(topLeft.y, v.coordinates.y);
199 bottomRight.
x = std::max<coordinate>(bottomRight.
x, v.coordinates.x);
200 bottomRight.
y = std::max<coordinate>(bottomRight.
y, v.coordinates.y);
202 return rect{ topLeft, bottomRight };
std::shared_ptr< vertex_list > vertex_list_pointer
face_list(container_pointer aFaces)
const_iterator begin() const
std::shared_ptr< container > container_pointer
const container & faces() const
std::vector< face > container
boost::optional< rect > optional_rect
const_iterator cbegin() const
boost::optional< vertex_list > optional_vertex_list
std::array< vertex_index, 3 > triangle
const_iterator cend() const
virtual face_list active_faces() const =0
const_iterator end() const
void add_faces(vertex_list_pointer aVertices, face_list &aFaces, const std::vector< vec3 > &aShapeVertices)
container::const_iterator const_iterator
texture_list::size_type texture_index
std::vector< vertex > vertex_list
vertex_list::size_type vertex_index
std::shared_ptr< texture_list > texture_list_pointer
scoped_faces(const i_mesh &aMesh, face_list::const_iterator aBegin, face_list::const_iterator aEnd)
rect bounding_rect(const vertex_list &aVertices)
container::iterator iterator
void calc_rect_vertices(temp_vec3_buffer< VertexCount > &aResult, const rect &aRect, dimension aPixelAdjust, rect_type aType)
face_list(const face_list &aOther, const_iterator aBegin, const_iterator aEnd)
std::pair< texture_pointer, optional_rect > texture_source
texture_pointer to_texture_pointer(const i_texture &aTexture)