00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef __GB_VertexGroup_h__
00026 #define __GB_VertexGroup_h__
00027
00028 #include "GB_API.h"
00029 #include <UT/UT_LinkList.h>
00030 #include <UT/UT_HashTable.h>
00031 #include <UT/UT_RefArray.h>
00032
00033 #include "GB_Detail.h"
00034 #include "GB_VertexData.h"
00035 #include "GB_BaseGroup.h"
00036
00037 typedef UT_RefArray<GB_VertexData> GB_VertexOrderedList;
00038
00039 class GB_VGPrimNode;
00040 class GB_VertexGroup;
00041
00042 class GB_API GB_VertexGroupIterator
00043 {
00044 public:
00045 GB_VertexGroupIterator(const GB_VertexGroup *grp);
00046 GB_VertexGroupIterator();
00047
00048 void setGroup(const GB_VertexGroup *grp);
00049
00050 int head(GB_VertexData &data);
00051 int tail(GB_VertexData &data);
00052
00053 int next(GB_VertexData &data);
00054 int prev(GB_VertexData &data);
00055
00056 private:
00057 const GB_VertexGroup *myGroup;
00058 GB_VGPrimNode *myCurrentPrimNode;
00059 unsigned myCurrentIndex;
00060 };
00061
00062 class GB_API GB_VertexGroup : public GB_BaseGroup
00063 {
00064 public:
00065 GB_VertexGroup(const GB_Detail &gdp, const char *name, int hidden = 1,
00066 unsigned short type = GBVERTEXGROUP);
00067 ~GB_VertexGroup();
00068
00069 int contains(const GB_VertexData &it) const;
00070 int contains(const GB_Primitive *prim, int linear_index) const;
00071 int containsAny(const GB_Primitive *prim) const;
00072
00073
00074
00075 unsigned getCount(const GB_Primitive *prim) const;
00076
00077
00078 int add(const GB_VertexData &it, int ordered = 0);
00079
00080 int add(GB_Primitive *prim, int linear_index,
00081 int ordered = 0);
00082
00083
00084
00085
00086
00087 int toggle(const GB_VertexData &it);
00088
00089 int toggle(GB_Primitive *prim, int linear_index);
00090
00091 int remove(const GB_VertexData &it);
00092
00093 int remove(GB_Primitive *prim, int linear_index);
00094
00095
00096
00097 int addAll(GB_Primitive *prim, int ordered = 0);
00098
00099
00100
00101 int removeAll(GB_Primitive *prim);
00102
00103
00104 virtual unsigned entries() const { return myEntries; }
00105 virtual int isEmpty() const { return (myEntries == 0); }
00106 virtual void clearEntries(void);
00107
00108 virtual int save(ostream &os, int binary) const;
00109 virtual bool load(UT_IStream &is);
00110
00111 GB_VertexOrderedList *getOrderedList()
00112 { return myOrderedList; }
00113 void setOrdered(int yesno);
00114
00115 protected:
00116 UT_LinkList &list() { return myPrimList; }
00117 const UT_LinkList &list() const { return myPrimList; }
00118
00119 private:
00120 GB_VGPrimNode *findPrimNode(
00121 const GB_Primitive *prim) const;
00122
00123 int find(const GB_VertexData &it,
00124 GB_VGPrimNode **node) const;
00125 int find(const GB_Primitive *prim, int linear_index,
00126 GB_VGPrimNode **node) const;
00127
00128 GB_VGPrimNode *addPrimNode(GB_Primitive *prim);
00129 void deletePrimNode(GB_VGPrimNode *node);
00130
00131
00132
00133 private:
00134 UT_LinkList myPrimList;
00135 UT_HashTable myPrimTable;
00136
00137
00138 GB_VertexOrderedList *myOrderedList;
00139 int myOrderedListDirty;
00140
00141 unsigned myEntries;
00142
00143 const GB_Detail &myGdp;
00144
00145 friend class GB_VertexGroupIterator;
00146 };
00147 #endif