138 lines
5.1 KiB
Plaintext
138 lines
5.1 KiB
Plaintext
// Filename: eggMesherEdge.I
|
|
// Created by: drose (13Mar05)
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
//
|
|
// PANDA 3D SOFTWARE
|
|
// Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
//
|
|
// All use of this software is subject to the terms of the revised BSD
|
|
// license. You should have received a copy of this license along
|
|
// with this source code in a file named "LICENSE."
|
|
//
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::Constructor
|
|
// Access: Public
|
|
// Description: Defines an edge as a pair of vertices. The _opposite
|
|
// pointer should be filled in explicitly by the caller.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggMesherEdge::
|
|
EggMesherEdge(int vi_a, int vi_b) : _vi_a(vi_a), _vi_b(vi_b) {
|
|
_opposite = NULL;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::Copy Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggMesherEdge::
|
|
EggMesherEdge(const EggMesherEdge ©) :
|
|
_vi_a(copy._vi_a),
|
|
_vi_b(copy._vi_b),
|
|
_strips(copy._strips),
|
|
_opposite(copy._opposite)
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::contains_vertex
|
|
// Access: Public
|
|
// Description: Returns true if the edge contains the indicated
|
|
// vertex index, false otherwise.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherEdge::
|
|
contains_vertex(int vi) const {
|
|
return (_vi_a == vi || _vi_b == vi);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::matches
|
|
// Access: Public
|
|
// Description: Returns true if this edge represents the same line
|
|
// segment as the other edge, in either direction.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherEdge::
|
|
matches(const EggMesherEdge &other) const {
|
|
return ((_vi_a == other._vi_a && _vi_b == other._vi_b) ||
|
|
(_vi_b == other._vi_a && _vi_a == other._vi_b));
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::common_ptr
|
|
// Access: Public
|
|
// Description: Returns an arbitrary pointer that is used to
|
|
// represent both this edge and its opposite.
|
|
// this->common_ptr() is guaranteed to be the same as
|
|
// this->_opposite->common_ptr().
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggMesherEdge *EggMesherEdge::
|
|
common_ptr() {
|
|
return min(this, _opposite);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::operator ==
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherEdge::
|
|
operator == (const EggMesherEdge &other) const {
|
|
return _vi_a == other._vi_a && _vi_b == other._vi_b;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::operator !=
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherEdge::
|
|
operator != (const EggMesherEdge &other) const {
|
|
return !operator == (other);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::operator <
|
|
// Access: Public
|
|
// Description: Defines an arbitrary ordering for edges, used for
|
|
// putting edges in a sorted container.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherEdge::
|
|
operator < (const EggMesherEdge &other) const {
|
|
if (_vi_a != other._vi_a) {
|
|
return _vi_a < other._vi_a;
|
|
}
|
|
return _vi_b < other._vi_b;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::compute_length
|
|
// Access: Public
|
|
// Description: Returns the length of the edge in model units.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE double EggMesherEdge::
|
|
compute_length(const EggVertexPool *vertex_pool) const {
|
|
LPoint3d a = vertex_pool->get_vertex(_vi_a)->get_pos3();
|
|
LPoint3d b = vertex_pool->get_vertex(_vi_b)->get_pos3();
|
|
return (a - b).length();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherEdge::compute_box
|
|
// Access: Public
|
|
// Description: Returns a 3-component vector that represents the
|
|
// lengths of the sides of the smalled axis-aligned box
|
|
// that contains the edge. That is, the projection the
|
|
// edge onto each axis.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE LVecBase3d EggMesherEdge::
|
|
compute_box(const EggVertexPool *vertex_pool) const {
|
|
LPoint3d a = vertex_pool->get_vertex(_vi_a)->get_pos3();
|
|
LPoint3d b = vertex_pool->get_vertex(_vi_b)->get_pos3();
|
|
LVector3d v = (a - b);
|
|
return LVecBase3d(fabs(v[0]), fabs(v[1]), fabs(v[2]));
|
|
}
|