00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015 #ifndef EGGMESHERSTRIP_H
00016 #define EGGMESHERSTRIP_H
00017
00018 #include "pandabase.h"
00019 #include "eggVertexPool.h"
00020 #include "eggPrimitive.h"
00021 #include "eggMesherEdge.h"
00022 #include "plist.h"
00023
00024 class EggMesherEdge;
00025
00026
00027
00028
00029
00030
00031
00032
00033 class EggMesherStrip {
00034 public:
00035 enum PrimType {
00036 PT_poly,
00037 PT_point,
00038 PT_line,
00039 PT_tri,
00040 PT_tristrip,
00041 PT_trifan,
00042 PT_quad,
00043 PT_quadstrip,
00044 PT_linestrip,
00045 };
00046
00047 enum MesherOrigin {
00048 MO_unknown,
00049 MO_user,
00050 MO_firstquad,
00051 MO_fanpoly,
00052 MO_mate
00053 };
00054
00055 EggMesherStrip(PrimType prim_type, MesherOrigin origin);
00056 EggMesherStrip(const EggPrimitive *prim, int index, const EggVertexPool *vertex_pool,
00057 bool flat_shaded);
00058 INLINE EggMesherStrip(const EggMesherStrip ©);
00059
00060 PT(EggPrimitive) make_prim(const EggVertexPool *vertex_pool);
00061
00062 void measure_sheet(const EggMesherEdge *edge, int new_row,
00063 int &num_prims, int &num_rows,
00064 int first_row_id, int this_row_id,
00065 int this_row_distance);
00066 void cut_sheet(int first_row_id, int do_mate,
00067 const EggVertexPool *vertex_pool);
00068
00069 bool mate(const EggVertexPool *vertex_pool);
00070 bool find_ideal_mate(EggMesherStrip *&mate, EggMesherEdge *&common_edge,
00071 const EggVertexPool *vertex_pool);
00072 static bool mate_pieces(EggMesherEdge *common_edge, EggMesherStrip &front,
00073 EggMesherStrip &back, const EggVertexPool *vertex_pool);
00074 static bool mate_strips(EggMesherEdge *common_edge, EggMesherStrip &front,
00075 EggMesherStrip &back, PrimType type);
00076 static bool must_invert(const EggMesherStrip &front, const EggMesherStrip &back,
00077 bool will_reverse_back, PrimType type);
00078 static bool convex_quad(EggMesherEdge *common_edge, EggMesherStrip &front,
00079 EggMesherStrip &back, const EggVertexPool *vertex_pool);
00080
00081 int count_neighbors() const;
00082 void output_neighbors(ostream &out) const;
00083
00084 INLINE bool is_coplanar_with(const EggMesherStrip &other, PN_stdfloat threshold) const;
00085 INLINE PN_stdfloat coplanarity(const EggMesherStrip &other) const;
00086 INLINE int type_category() const;
00087
00088 int find_uncommon_vertex(const EggMesherEdge *edge) const;
00089 const EggMesherEdge *find_opposite_edge(int vi) const;
00090 const EggMesherEdge *find_opposite_edge(const EggMesherEdge *edge) const;
00091 const EggMesherEdge *find_adjacent_edge(const EggMesherEdge *edge) const;
00092
00093 INLINE void rotate_forward();
00094 INLINE void rotate_back();
00095 void rotate_to_front(const EggMesherEdge *edge);
00096 void rotate_to_back(const EggMesherEdge *edge);
00097 bool can_invert() const;
00098 bool invert();
00099
00100 INLINE EggMesherEdge get_head_edge() const;
00101 INLINE EggMesherEdge get_tail_edge() const;
00102
00103 bool is_odd() const;
00104 bool would_reverse_tail(PrimType want_type) const;
00105 void convert_to_type(PrimType want_type);
00106
00107 void combine_edges(EggMesherStrip &other, int remove_sides);
00108 void remove_all_edges();
00109
00110
00111 INLINE bool operator == (const EggMesherStrip &other) const;
00112 INLINE bool operator != (const EggMesherStrip &other) const;
00113
00114 bool pick_mate(const EggMesherStrip &a_strip, const EggMesherStrip &b_strip,
00115 const EggMesherEdge &a_edge, const EggMesherEdge &b_edge,
00116 const EggVertexPool *vertex_pool) const;
00117
00118 bool pick_sheet_mate(const EggMesherStrip &a_strip,
00119 const EggMesherStrip &b_strip) const;
00120
00121 void output(ostream &out) const;
00122
00123 typedef plist<CPT(EggPrimitive) > Prims;
00124 typedef plist<EggMesherEdge *> Edges;
00125 typedef plist<int> Verts;
00126
00127 Prims _prims;
00128 Edges _edges;
00129 Verts _verts;
00130
00131 enum MesherStatus {
00132 MS_alive,
00133 MS_dead,
00134 MS_done,
00135 MS_paired
00136 };
00137
00138 PrimType _type;
00139 int _index;
00140 MesherStatus _status;
00141
00142 bool _planar;
00143 LNormald _plane_normal;
00144 PN_stdfloat _plane_offset;
00145 int _row_id, _row_distance;
00146 MesherOrigin _origin;
00147 bool _flat_shaded;
00148 };
00149
00150 INLINE ostream &
00151 operator << (ostream &out, const EggMesherStrip &strip) {
00152 strip.output(out);
00153 return out;
00154 }
00155
00156 #include "eggMesherStrip.I"
00157
00158 #endif