Files
create/src/Mod/Mesh/App/WildMagic4/Wm4UniqueVerticesTriangles.h
2025-11-02 15:49:56 -06:00

94 lines
3.9 KiB
C++

// SPDX-License-Identifier: LGPL-2.1-or-later
// Wild Magic Source Code
// David Eberly
// http://www.geometrictools.com
// Copyright (c) 1998-2007
//
// This library is free software; you can redistribute it and/or modify it
// under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation; either version 2.1 of the License, or (at
// your option) any later version. The license is available for reading at
// either of the locations:
// http://www.gnu.org/copyleft/lgpl.html
// http://www.geometrictools.com/License/WildMagicLicense.pdf
// The license applies to versions 0 through 4 of Wild Magic.
//
// Version: 4.0.0 (2006/06/28)
#ifndef WM4UNIQUEVERTICESTRIANGLES_H
#define WM4UNIQUEVERTICESTRIANGLES_H
#include "Wm4FoundationLIB.h"
#include "Wm4System.h"
namespace Wm4
{
template <int N, class Real>
class UniqueVerticesTriangles
{
public:
// Construction and destruction. A vertex is an N-tuple of Real values,
// usually starting with position and optionally followed by attributes
// such as normal vector, colors, and texture coordinates.
//
// TO DO: Allow the user to specify an epsilon e > 0 so that vertices V0
// and V1 are considered to be the same when |V1-V0| <= e. The current
// code uses e = 0.
// Triangle soup. The input vertex array consists of triples of vertices,
// each triple representing a triangle. The array akInVertex must have
// 3*iTQuantity tuples. The caller is responsible for deleting the input
// vertex array if it was dynamically allocated. An array rakOutVertex of
// riOutVQuantity unique vertices and an array aiOutIndex of
// riOutTQuantity unique index triples are computed; raiOutIndex has
// 3*iTQuantity elements. The indices are relative to the array of unique
// vertices and each index triple represents a triangle. The output
// arrays are dynamically allocated. The caller is responsible for
// deleting them.
UniqueVerticesTriangles (int iTQuantity,
const TTuple<N,Real>* akInVertex, int& riOutVQuantity,
TTuple<N,Real>*& rakOutVertex, int*& raiOutIndex);
// Indexed triangles. The input vertex array consists of all vertices
// referenced by the input index array. The array akInVertex must have
// iInVQuantity tuples. The array aiInIndex must have 3*iTQuantity
// elements. The caller is responsible for deleting the input arrays if
// they were dynamically allocated. An array rakOutVertex of
// riOutVQuantity unique vertices and an array aiOutIndex of iTQuantity
// unique index triples are computed; raiOutIndex has 3*iTQuantity
// elements. The indices are relative to the array of unique
// vertices and each index triple represents a triangle. The output
// arrays are dynamically allocated. The caller is responsible for
// deleting them.
UniqueVerticesTriangles (int iInVQuantity,
const TTuple<N,Real>* akInVertex, int iTQuantity,
const int* aiInIndex, int& riOutVQuantity,
TTuple<N,Real>*& rakOutVertex, int*& raiOutIndex);
~UniqueVerticesTriangles ();
// The input vertices have indices 0 <= i < VINum. The output vertices
// have indices 0 <= j < VONum. The construction leads to a mapping of
// input indices i to output indices j. Duplicate vertices have different
// input indices but the same output index. The following function gives
// you access to the mapping. If the input index is invalid (i < 0 or
// i >= VINum), the return value is -1.
int GetOutputIndexFor (int iInputIndex) const;
private:
void ConstructUniqueVertices (int iInVQuantity,
const TTuple<N,Real>* akInVertex, int& raiOutVQuantity,
TTuple<N,Real>*& rakOutVertex);
int m_iInVQuantity, m_iOutVQuantity;
int* m_aiInToOutMapping;
};
}
#include "Wm4UniqueVerticesTriangles.inl"
#endif