💿🐜 Antkeeper source code https://antkeeper.com
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
2.7 KiB

/*
* Copyright (C) 2023 Christopher J. Howard
*
* This file is part of Antkeeper source code.
*
* Antkeeper source code is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Antkeeper source code is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Antkeeper source code. If not, see <http://www.gnu.org/licenses/>.
*/
#include <engine/geom/brep/brep-vertex.hpp>
#include <engine/geom/brep/brep-mesh.hpp>
namespace geom {
void brep_vertex_edge_list::push_back(brep_edge* edge)
{
// Determine index of vertex in new edge vertex array
const std::size_t i = (edge->m_vertices[1] == m_vertex);
if (empty())
{
// List empty, initialize
m_head = edge;
edge->m_vertex_next[i] = edge;
edge->m_vertex_previous[i] = edge;
}
else
{
// Determine index of vertex in head edge vertex array
const std::size_t j = (m_head->m_vertices[1] == m_vertex);
// Append edge
edge->m_vertex_next[i] = m_head;
edge->m_vertex_previous[i] = m_head->m_vertex_previous[j];
edge->m_vertex_previous[i]->m_vertex_next[edge->m_vertex_previous[i]->m_vertices[1] == m_vertex] = edge;
m_head->m_vertex_previous[j] = edge;
}
++m_size;
}
void brep_vertex_edge_list::remove(brep_edge* edge)
{
// Determine index of vertex in edge vertex array
const std::size_t i = (edge->m_vertices[1] == m_vertex);
// Get pointers to the next and previous edges
brep_edge* next = edge->m_vertex_next[i];
brep_edge* previous = edge->m_vertex_previous[i];
// Directly link next and previous edges
next->m_vertex_previous[next->m_vertices[1] == m_vertex] = previous;
previous->m_vertex_next[previous->m_vertices[1] == m_vertex] = next;
// If edge was the list head, update head
if (m_head == edge)
{
m_head = next;
}
--m_size;
}
brep_vertex* brep_vertex_container::emplace_back()
{
brep_vertex* vertex = brep_element_container<brep_vertex>::emplace_back();
vertex->m_index = size() - 1;
vertex->m_edges.m_vertex = vertex;
return vertex;
};
void brep_vertex_container::erase(brep_vertex* vertex)
{
// Erase all edges bounded by this vertex
while (!vertex->edges().empty())
{
m_mesh->edges().erase(vertex->edges().back());
}
// Erase vertex
brep_element_container<brep_vertex>::erase(vertex);
}
void brep_vertex_container::clear() noexcept
{
while (!empty())
{
erase(back());
}
}
} // namespace geom