// -*- mode: C++; tab-width: 4; indent-tabs-mode: t; -*- vim:ts=4:sw=4 // // Copyright (C) 2004 Chong Kai Xiong (descender) // // This file is part of The Plains of Usata. // // The Plains of Usata is licensed under the GNU General Public // License (GPL) version 2. For details, please see the COPYING file // included in the software distribution, or visit // http://www.fsf.org/licenses/gpl.html. // // $Id: mesh.cpp,v 1.1 2005/01/09 18:47:01 Descender Exp $ #include #include #include "mesh.hpp" using namespace usata; namespace { math::Vector4f compute_plane(const math::Vector4f& v0, const math::Vector4f& v1, const math::Vector4f& v2) { math::Vector4f plane = (v1 - v0).cross(v2 - v0).unit(); plane[3] = -plane.dot(v0); return plane; } } namespace usata { namespace gfx { TriangleMesh::TriangleMesh() {} TriangleMesh::~TriangleMesh() {} void TriangleMesh::clear() { m_vertices.clear(); m_triangles.clear(); m_edges.clear(); } void TriangleMesh::draw() { // FIXME: write this } void TriangleMesh::load(const std::string& filename) { clear(); } void TriangleMesh::add_vertex(const Vertex& vertex) { m_vertices.push_back(vertex); } void TriangleMesh::add_triangle(int v0, int v1, int v2) { Triangle t; t.vertices[0] = v0; t.vertices[1] = v1; t.vertices[2] = v2; t.plane = compute_plane(m_vertices[v0].pos, m_vertices[v1].pos, m_vertices[v2].pos); m_triangles.push_back(t); // FIXME: only recalculate affected edges compute_edge_table(); } void TriangleMesh::compute_edge_table() { m_edges.clear(); // First pass for (unsigned int t = 0; t < m_triangles.size(); t++) { for (int i = 0; i < 3; i++) { int j = (i+1) % 3; if (m_triangles[t].vertices[i] < m_triangles[t].vertices[j]) { m_edges[EdgePair(i, j)] = TrianglePair(t, -1); } } } // Second pass for (unsigned int t = 0; t < m_triangles.size(); t++) { for (int i = 0; i < 3; i++) { int j = (i+1) % 3; if (m_triangles[t].vertices[i] > m_triangles[t].vertices[j]) { const EdgePair edges(i, j); if (m_edges.find(edges) == m_edges.end()) { m_edges[edges] = TrianglePair(0, t); } else { m_edges[edges].get<1>() = t; } } } } } } // namespace gfx } // namespace usata