LightWrap++
AC++wrapperfortheLightWave3DSDK
item.h
Go to the documentation of this file.
1 #ifndef LWPP_ITEM_H
2 #define LWPP_ITEM_H
3 #include <lwpp/storeable.h>
4 #include <lwpp/wrapper.h>
5 #include <lwpp/matrix4x4.h>
6 #include <lwpp/vparm.h>
7 #include <lwpp/interface.h>
8 #include <vector>
9 #include "utility.h"
10 #ifdef _DEBUG
11 #include "lwpp/debug.h"
12 #endif
13 
14 namespace lwpp
15 {
16  class LWItem; // forward declaration
17 
20  class ItemInfo : protected GlobalBase<LWItemInfo>
21  {
22  public:
23  ItemInfo(void)
24  {
25  ;
26  }
27  bool isValid() const {return available();}
28  LWItemID first(LWItemType t, LWItemID i)
29  {
30  return globPtr->first(t, i);
31  }
32  LWItemID next(LWItemID i)
33  {
34  return globPtr->next(i);
35  }
36  LWItemID firstChild(LWItemID parent)
37  {
38  return globPtr->firstChild(parent);
39  }
40  LWItemID nextChild(LWItemID parent, LWItemID prevChild)
41  {
42  return globPtr->nextChild(parent, prevChild);
43  }
44  LWItemID parent(LWItemID i)
45  {
46  return globPtr->parent(i);
47  }
48  LWItemID target(LWItemID i)
49  {
50  return globPtr->target(i);
51  }
52  LWItemID goal(LWItemID i)
53  {
54  return globPtr->goal(i);
55  }
56  LWItemType type(LWItemID i)
57  {
58  return globPtr->type(i);
59  }
60  const char *name(LWItemID i)
61  {
62  return globPtr->name(i);
63  }
64  void param(LWItemID i, LWItemParam p, LWTime t, LWDVector v)
65  {
66  globPtr->param(i, p, t, v);
67  }
68  unsigned int limits(LWItemID i, LWItemParam p, LWDVector min, LWDVector max)
69  {
70  return globPtr->limits(i, p, min, max);
71  }
72  const char *getTag(LWItemID i, int t)
73  {
74  return globPtr->getTag(i, t);
75  }
76  void setTag(LWItemID i, int t, const char *tag)
77  {
78  globPtr->setTag(i, t, tag);
79  }
80  LWChanGroupID chanGroup(LWItemID i)
81  {
82  return globPtr->chanGroup(i);
83  }
84  const char *server(LWItemID i, const char *s, int d)
85  {
86  return globPtr->server(i, s, d);
87  }
88  unsigned int serverFlags(const char *s, int d, LWItemID i = 0)
89  {
90  return globPtr->serverFlags(i, s, d);
91  }
92  void controller(LWItemID i, LWItemParam p, int type[3])
93  {
94  globPtr->controller(i, p, type);
95  }
96  unsigned int flags(LWItemID i)
97  {
98  return globPtr->flags(i);
99  }
100  LWTime lookAhead(LWItemID i)
101  {
102  return globPtr->lookAhead(i);
103  }
104 #if (LW_SDK >= 95)
105  double goalStrength(LWItemID i, LWTime t)
106  {
107  return globPtr->goalStrength(i, t);
108  }
109 #else
110  double goalStrength(LWItemID i)
111  {
112  return globPtr->goalStrength(i);
113  }
114 #endif
115  void stiffness(LWItemID i, LWItemParam p, LWDVector v)
116  {
117  globPtr->stiffness(i, p, v);
118  }
119  unsigned int axisLocks(LWItemID i, LWItemParam p)
120  {
121  return globPtr->axisLocks(i, p);
122  }
123  // additional functionality
125  LWItem *FindItem(const std::string &itemName, LWItemType type);
127  LWItemID FindItemID(const std::string &itemName, LWItemType type);
129  int FindIndex(LWItemID, LWItemType type);
131  int CountItems(LWItemType type);
133  LWItem *GetItemN(LWItemType type, int n);
135  int findServer(const char *type, const char *name, LWItemID id = 0);
136  };
137 
139  class LWItem : public Storeable
140  {
141  protected:
143  LWItemID mId;
144  LWItemType mType;
145  std::string m_itemName;
146  public:
147  explicit LWItem( LWItemID id = LWITEM_NULL, LWItemType t = LWI_OBJECT) : mId(id), mType(t)
148  {
149  ;
150  }
151 
152  LWItem (const LWItem &item)
153  {
154  mId = item.mId;
155  mType = item.mType;
156  }
157 
158  LWItem (const LWItemType t)
159  : mId(LWITEM_NULL), mType(t)
160  {
161  First(t);
162  }
163 
165  bool exists () const {return mId != LWITEM_NULL;}
166 
168  bool isValid() const {return mItemInfo.isValid();}
169 
170  void SetID (LWItemID _id)
171  {
172  mId = _id;
173  mType = Type();
174  }
175  LWItemID GetID() const {return mId;}
176  // Standard wraps
177  LWItem &First(LWItemType t)
178  {
179  if (mItemInfo.isValid())
180  {
181  mId = mItemInfo.first(t, mId);
182  }
183  return *this;
184  }
185  LWItem &Next(void)
186  {
187  mId = mItemInfo.next(mId);
188  return *this;
189  }
190 
191  LWItemID getFirstChild(void)
192  {
193  return mItemInfo.firstChild(mId);
194  }
195 
197  {
198  mId = getFirstChild();
199  return *this;
200  }
201 
203  {
204  mId = mItemInfo.nextChild(parent.mId, mId);
205  return *this;
206  }
207 
209  {
210  return LWItem(mItemInfo.parent(mId));
211  }
213  {
214  mId = mItemInfo.parent(mId);
215  return *this;
216  }
217 
218  LWItem &Target(void)
219  {
220  mId = mItemInfo.target(mId);
221  return *this;
222  }
223 
224  LWItem &Goal(void)
225  {
226  mId = mItemInfo.goal(mId);
227  return *this;
228  }
229 
230  LWItemType Type(void)
231  {
232  return mItemInfo.type(mId);
233  }
234 
235  const char *getName(void)
236  {
237  if (mId != LWITEM_NULL) return mItemInfo.name(mId);
238  return "(none)";
239  }
240 
241  void Param (LWItemParam p, LWTime t, LWDVector v)
242  {
243  mItemInfo.param(mId, p, t, v);
244  }
245 
246  void Param (LWItemParam p, LWTime t, Vector3d &v)
247  {
248  mItemInfo.param(mId, p, t, v.asLWVector());
249  }
250 
251  void Param (LWItemParam p, LWTime t, Point3d &v)
252  {
253  mItemInfo.param(mId, p, t, v.asLWVector());
254  }
255 
256  unsigned int Limits (LWItemParam p, LWDVector min, LWDVector max)
257  {
258  return mItemInfo.limits(mId, p, min, max);
259  }
260 
261  const char *GetTag (int t)
262  {
263  return mItemInfo.getTag(mId, t);
264  }
265 
266  void SetTag(int t, const char *tag)
267  {
268  mItemInfo.setTag(mId, t, tag);
269  }
270 
271  LWChanGroupID ChanGroup (void)
272  {
273  return mItemInfo.chanGroup(mId);
274  }
275 
277  {
278  return ChannelGroup(ChanGroup());
279  }
280 
281  const char *Server(const char *s , int d)
282  {
283  return mItemInfo.server(mId, s, d);
284  }
285 
286  unsigned int ServerFlags (const char *s, int d)
287  {
288  return mItemInfo.serverFlags(s, d, mId);
289  }
290 
291  void Controller(LWItemParam p, int type[3])
292  {
293  mItemInfo.controller(mId, p, type);
294  }
295 
296  unsigned int Flags (void)
297  {
298  return mItemInfo.flags(mId);
299  }
300 
301  LWTime LookAhead (void)
302  {
303  return mItemInfo.lookAhead(mId);
304  }
305 
306 #if (LW_SDK >= 95)
307  double GoalStrength(LWTime t)
308  {
309  return mItemInfo.goalStrength(mId, t);
310  }
311 #else
312  double GoalStrength(void)
313  {
314  return mItemInfo.goalStrength(mId);
315  }
316 #endif
317  void Stiffness (LWItemParam p , LWDVector v)
318  {
319  mItemInfo.stiffness(mId, p, v);
320  }
321 
322  unsigned int AxisLocks (LWItemParam p)
323  {
324  return mItemInfo.axisLocks(mId,p);
325  }
327  bool operator!()
328  {
329  return mId == LWITEM_NULL;
330  }
331 
333  void changeID (const LWItemID *id_array)
334  {
335  int i = 0;
336  while (id_array[i] != LWITEM_NULL)
337  {
338  if (id_array[i] == mId) mId = id_array[i+1];
339  i += 2;
340  }
341  }
342  Matrix4x4d getObjectToWorld(LWTime time);
343  Matrix4x4d getWorldTransform(LWTime time);
344  void transformToWorld(Point3d &pt, LWTime time);
345  int getExtension();
347  virtual LWError Load(const LoadState &ls );
349  virtual LWError Save(const SaveState &ls );
350  };
351 
353 
358  class LWItemCallback : public PopUpCallback, public LWItem
359  {
360  protected:
361  bool showNone;
362  const char *noneName;
363 
364  protected:
366  virtual size_t popCount (void)
367  {
368  return mItemInfo.CountItems(mType) + (showNone ? 1 : 0); // add one for the (none) case
369  }
371  virtual const char *popName (int idx)
372  {
373  if (lwpp::LightWave::isModeler()) return ("(none)"); // No items in Modeler
374  if (showNone)
375  {
376  if (idx == 0) return noneName;
377  --idx;
378  }
379  LWItem *item = mItemInfo.GetItemN(mType, idx);
380  const char *n = item->LWItem::getName();
381  delete item;
382  return n;
383  }
384  public:
386  LWItemCallback(LWItemType t = LWI_OBJECT, LWItemID id = LWITEM_NULL, bool _showNone = true, const char *_noneName ="(none)")
387  : LWItem(id, t),
388  showNone(_showNone),
389  noneName(_noneName)
390  {
391  if (id != LWITEM_NULL)
392  {
394  }
395  }
397  LWItemID GetIndexID (int idx)
398  {
399  if (showNone)
400  {
401  if (idx == 0)
402  {
403  mId = LWITEM_NULL;
404  return mId;
405  }
406  --idx;
407  }
408  LWItem *item = mItemInfo.GetItemN(mType, idx);
409  mId = item->GetID();
410  delete item;
411 
412  return mId;
413  }
415  int GetIndex ()
416  {
417  index = mItemInfo.FindIndex(mId, mType) + (showNone ? 1 : 0);
418  return index;
419  }
421  int *DataGet ()
422  {
423  if (lwpp::LightWave::isModeler()) return 0;
424  index = mItemInfo.FindIndex(mId, mType) + (showNone ? 1 : 0);
425  return &index;
426  }
428  void DataSet(void *value)
429  {
430  index = *((int *)value);
431  GetIndexID(index);
432  }
433  };
434 
436 
442  {
443  private:
444  InterfaceInfo iInfo;
445  class itemEntry
446  {
447  public:
448  std::string name;
449  LWItemID id;
450  itemEntry(LWItemID _id, std::string _name)
451  : id (_id), name(_name)
452  {;}
453  };
454  std::vector<itemEntry> itemList;
455  void addChildren (LWItem &parent, int indent, LWItemType t);
456  void buildItemList();
457  protected:
459  virtual size_t popCount (void)
460  {
461  buildItemList();
462  return itemList.size() + (showNone ? 1 : 0); // add one for the (none) case
463  }
465  virtual const char *popName (int idx)
466  {
467  if (lwpp::LightWave::isModeler()) return ("(none)"); // No items in Modeler
468  if (showNone)
469  {
470  if (idx == 0) return "(none)";
471  --idx;
472  }
473  return itemList[idx].name.c_str();
474  }
475  public:
477  StyledItemCallback(LWItemType t = LWI_OBJECT, LWItemID id = LWITEM_NULL, bool _showNone = true)
478  : LWItemCallback(t, id, _showNone)
479  {
480  if (id != LWITEM_NULL)
481  {
483  }
484  }
486  };
487 
489 
509  {
510  private:
511  std::vector<LWItem *> mTrackedItems;
512  LWItemID *mTrackedIDs;
513  public:
514  LWItemTracker (void) : mTrackedIDs(0) {;}
515 
516  ~LWItemTracker (void);
518  void refresh();
520  void trackItem (LWItem *item);
521 
522  void trackItem (LWItem &item);
523 
524  void unTrackItem (LWItem &item);
525  void unTrackItem (LWItem *item);
526 
528 
529  const LWItemID *useItems();
530 
532  void changeID(const LWItemID *idlist);
533  };
534 } // end of namespace lwpp
535 
536 #endif // LWPP_ITEM_H