170 lines
5.8 KiB
Plaintext
170 lines
5.8 KiB
Plaintext
// Filename: eggMesherStrip.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: EggMesherStrip::Copy Constructor
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggMesherStrip::
|
|
EggMesherStrip(const EggMesherStrip ©) :
|
|
_prims(copy._prims),
|
|
_edges(copy._edges),
|
|
_verts(copy._verts),
|
|
_type(copy._type),
|
|
_index(copy._index),
|
|
_status(copy._status),
|
|
_planar(copy._planar),
|
|
_plane_normal(copy._plane_normal),
|
|
_plane_offset(copy._plane_offset),
|
|
_row_id(copy._row_id),
|
|
_flat_shaded(copy._flat_shaded)
|
|
{
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::is_coplanar_with
|
|
// Access: Public
|
|
// Description: Returns true if the strip and the other strip are
|
|
// coplanar, within the indicated threshold. See
|
|
// coplanarity().
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherStrip::
|
|
is_coplanar_with(const EggMesherStrip &other, float threshold) const {
|
|
return (coplanarity(other) <= threshold);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::coplanarity
|
|
// Access: Public
|
|
// Description: Returns the degree to which the two strips are
|
|
// coplanar. 0.0 is exactly coplanar; numbers somewhat
|
|
// larger than zero indicate less coplanar. 1.0 is
|
|
// at right angles; 2.0 is exactly backfacing. If
|
|
// either strip is not itself planar, 3.0 is returned.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE float EggMesherStrip::
|
|
coplanarity(const EggMesherStrip &other) const {
|
|
if (_planar && other._planar) {
|
|
return 1.0 - dot(_plane_normal, other._plane_normal);
|
|
}
|
|
return 3.0;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::type_category
|
|
// Access: Public
|
|
// Description: Returns an integer which gives a heuristic about the
|
|
// similarity of different strip types. In general,
|
|
// closer numbers are more similar.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE int EggMesherStrip::
|
|
type_category() const {
|
|
switch (_type) {
|
|
case PT_tri:
|
|
return 1;
|
|
|
|
case PT_tristrip:
|
|
return 2;
|
|
|
|
case PT_quad:
|
|
case PT_quadstrip:
|
|
return 5;
|
|
|
|
default:
|
|
return 10;
|
|
}
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::rotate_forward
|
|
// Access: Public
|
|
// Description: Rotates a triangle or quad by bringing its first
|
|
// vertex to the back.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void EggMesherStrip::
|
|
rotate_forward() {
|
|
_verts.push_back(_verts.front());
|
|
_verts.pop_front();
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::rotate_back
|
|
// Access: Public
|
|
// Description: Rotates a triangle or quad by bringing its last
|
|
// vertex to the front.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE void EggMesherStrip::
|
|
rotate_back() {
|
|
_verts.push_front(_verts.back());
|
|
_verts.pop_back();
|
|
}
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::get_head_edge
|
|
// Access: Public
|
|
// Description: Returns an EggMesherEdge which represents the leading
|
|
// edge in the quadstrip or tristrip. This
|
|
// EggMesherEdge will not have pointer equality with any
|
|
// shared EggMesherEdge.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggMesherEdge EggMesherStrip::
|
|
get_head_edge() const {
|
|
Verts::const_iterator vi = _verts.begin();
|
|
nassertr(vi != _verts.end(), EggMesherEdge(0, 0));
|
|
++vi;
|
|
return EggMesherEdge(_verts.front(), *vi);
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::get_tail_edge
|
|
// Access: Public
|
|
// Description: Returns an EggMesherEdge which represents the
|
|
// trailing edge in the quadstrip or tristrip. This
|
|
// EggMesherEdge will not have pointer equality with any
|
|
// shared EggMesherEdge.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE EggMesherEdge EggMesherStrip::
|
|
get_tail_edge() const {
|
|
Verts::const_reverse_iterator vi = _verts.rbegin();
|
|
nassertr(vi != _verts.rend(), EggMesherEdge(0, 0));
|
|
++vi;
|
|
return EggMesherEdge(*vi, _verts.back());
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::operator ==
|
|
// Access: Public
|
|
// Description: Defines equality for strips. This actually tests
|
|
// only pointer equality; it's used only when removing a
|
|
// strip from the list.
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherStrip::
|
|
operator == (const EggMesherStrip &other) const {
|
|
return this == &other;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
// Function: EggMesherStrip::operator !=
|
|
// Access: Public
|
|
// Description:
|
|
////////////////////////////////////////////////////////////////////
|
|
INLINE bool EggMesherStrip::
|
|
operator != (const EggMesherStrip &other) const {
|
|
return !operator == (other);
|
|
}
|