glVertex  5.5.2
glvertex_object.h
Go to the documentation of this file.
1 // (c) by Stefan Roettger, licensed under MIT license
2 
5 #ifndef GLVERTEX_OBJECT_H
6 #define GLVERTEX_OBJECT_H
7 
8 #include "glvertex.h"
9 #include "glvertex_nodes.h"
10 
11 #include <list>
12 
20 {
21 public:
22 
25  : color_(1,1,1),
26  transparency_(false),
27  partial_trnsp_(false),
28  transformation_(1),
29  position_(0,0,0),
30  scale_(1),
31  hidden_(false),
32  init_(true)
33  {}
34 
35  virtual ~lgl_Object()
36  {}
37 
38  virtual void initObject() {} // reimplement to initialize object state
39  virtual void renderObject() = 0; // reimplement to render a specific object
40  virtual void preupdateObject(double dt) {} // reimplement to pre-update the object
41  virtual void updateObject(double dt) {} // reimplement to update and change the object
42 
45  {
46  return(color_);
47  }
48 
50  void setColor(const vec4 &c)
51  {
52  color_ = c;
53  transparency_ = color_.a < 1;
54  }
55 
58  {
59  return(transparency_);
60  }
61 
63  void hasTransparency(bool flag)
64  {
65  transparency_ = flag;
66  }
67 
70  {
71  return(partial_trnsp_);
72  }
73 
75  void hasPartialTransparency(bool flag)
76  {
77  partial_trnsp_ = flag;
78  }
79 
82  {
83  return(transformation_);
84  }
85 
87  void setTransformation(const mat4 &m)
88  {
89  transformation_ = m;
90  position_ = m.getTranslation();
91  }
92 
95  {
96  return(position_);
97  }
98 
101  {
102  return(transformation_.getRotation());
103  }
104 
107  {
108  return(scale_);
109  }
110 
112  double getMaxScale()
113  {
114  double s = scale_.x;
115  if (scale_.y > s) s = scale_.y;
116  if (scale_.z > s) s = scale_.z;
117  return(s);
118  }
119 
122  {
123  return(scale_.x==scale_.y && scale_.y==scale_.z);
124  }
125 
127  virtual vec3 getCenter()
128  {
129  return(vec3(0,0,0));
130  }
131 
133  virtual vec3 getExtent()
134  {
135  return(vec3(0,0,0));
136  }
137 
139  virtual double getRadius()
140  {
141  return(0);
142  }
143 
145  virtual double getNorm()
146  {
147  return(0);
148  }
149 
151  void move(const vec3 &delta)
152  {
153  transformation_ <<= mat4::translate(delta);
154  position_ = transformation_.getTranslation();
155  }
156 
158  void rotate(const quat &q)
159  {
160  transformation_ *= mat3(q);
161  }
162 
164  void scale(double factor)
165  {
166  scale_ *= factor;
167  }
168 
170  void scale(const vec3 &factor)
171  {
172  scale_ *= factor;
173  }
174 
176  bool hidden()
177  {
178  return(hidden_);
179  }
180 
182  bool shown()
183  {
184  return(!hidden_);
185  }
186 
188  void hide(bool yes = true)
189  {
190  hidden_ = yes;
191  }
192 
194  void show(bool yes = true)
195  {
196  hidden_ = !yes;
197  }
198 
201  {
202  if (!hidden_)
203  {
204  lglPushMatrix();
205  lglMultMatrix(transformation_);
206  if (scale_ != vec3(1)) lglScale(scale_);
207  lglColor(color_);
208  renderObject();
209  lglPopMatrix();
210  }
211  }
212 
214  virtual double getDistanceToObject(const vec3 &v)
215  {
216  return(getDistanceToSphere(getPosition(), v, getRadius()));
217  }
218 
219 protected:
220 
221  vec4 color_;
222  bool transparency_;
223  bool partial_trnsp_;
224  mat4 transformation_;
225  vec3 position_;
226  vec3 scale_;
227  bool hidden_;
228  bool init_;
229 
230  bool init()
231  {
232  if (init_)
233  {
234  init_ = false;
235  return(true);
236  }
237 
238  return(false);
239  }
240 
242  static double getDistanceToSphere(const vec3 &p, const vec3 &v, double radius)
243  {
244  vec3 d = p-v;
245  double l = d.length()-radius;
246  return(l);
247  }
248 
250  static double getDistanceToBox(const vec3 &p, const vec3 &v, const vec3 &ext)
251  {
252  vec3 d = p-v;
253  if (d.x < 0) d.x = -d.x;
254  if (d.y < 0) d.y = -d.y;
255  if (d.z < 0) d.z = -d.z;
256  d -= ext/2;
257  if (d.x<0 && d.y<0 && d.z<0)
258  {
259  double l = d.x;
260  if (d.y > l) l = d.y;
261  if (d.z > l) l = d.z;
262  return(l);
263  }
264  else
265  {
266  if (d.x < 0) d.x = 0;
267  if (d.y < 0) d.y = 0;
268  if (d.z < 0) d.z = 0;
269  return(d.length());
270  }
271  }
272 
274  static double getDistanceToBox(const vec3 &p, const mat3 &rotation, const vec3 &v, const vec3 &ext)
275  {
276  return(getDistanceToBox(p, rotation.invert()*(v-p)+p, ext));
277  }
278 
280  static double getDistanceToBox(const vec3 &p, const mat3 &rotation, const vec3 &offset, const vec3 &v, const vec3 &ext)
281  {
282  return(getDistanceToBox(p+offset, rotation.invert()*(v-p)+p, ext));
283  }
284 
285  friend class lgl_Objects;
286  friend class lgl_DepthSortedObjects;
287 };
288 
292 {
293 public:
294 
297  : lgl_Object(),
298  vbo_(vbo)
299  {}
300 
301  virtual ~lgl_GeometryObject()
302  {}
303 
306  {
307  return(vbo_);
308  }
309 
311  void setVBO(lglVBO *vbo)
312  {
313  vbo_ = vbo;
314  }
315 
316  virtual vec3 getCenter()
317  {
318  if (vbo_)
319  return(vbo_->lglGetCenter()*getScale());
320 
321  return(vec3(0,0,0));
322  }
323 
324  virtual vec3 getExtent()
325  {
326  if (vbo_)
327  return(vbo_->lglGetExtent()*getScale());
328 
329  return(vec3(0,0,0));
330  }
331 
332  virtual double getRadius()
333  {
334  if (vbo_)
335  return(vbo_->lglGetRadius()*getMaxScale());
336 
337  return(0);
338  }
339 
340  virtual double getNorm()
341  {
342  if (vbo_)
343  {
344  double s = getMaxScale();
345  return(vbo_->lglGetNorm()*s*s);
346  }
347 
348  return(0);
349  }
350 
351  virtual void renderObject()
352  {
353  if (vbo_)
354  vbo_->lglRender();
355  }
356 
357  virtual double getDistanceToObject(const vec3 &v)
358  {
360  }
361 
362 protected:
363 
364  lglVBO *vbo_;
365 };
366 
371 {
372 public:
373 
376  : lgl_Object(),
377  root_(NULL)
378  {
379  setSceneGraph(root);
380  }
381 
382  virtual ~lgl_SceneGraphObject()
383  {
384  if (root_)
385  delete root_;
386  }
387 
390  {
391  return(root_);
392  }
393 
396  {
397  if (root_)
398  delete root_;
399 
400  root_ = root;
401 
402  if (root_->hasTransparency())
403  {
404  hasTransparency(true);
406  }
407  }
408 
409  virtual vec3 getCenter()
410  {
411  if (root_)
412  return(root_->getCenter()*getScale());
413 
414  return(vec3(0,0,0));
415  }
416 
417  virtual vec3 getExtent()
418  {
419  if (root_)
420  return(root_->getExtent()*getScale());
421 
422  return(vec3(0,0,0));
423  }
424 
425  virtual double getRadius()
426  {
427  if (root_)
428  return(root_->getRadius()*getMaxScale());
429 
430  return(0);
431  }
432 
433  virtual double getNorm()
434  {
435  if (root_)
436  {
437  double s = getMaxScale();
438  return(root_->getNorm()*s*s);
439  }
440 
441  return(0);
442  }
443 
444  virtual void renderObject()
445  {
446  if (root_)
447  root_->drawSceneGraph();
448  }
449 
450  virtual void preupdateObject(double dt)
451  {
452  if (root_)
453  root_->preupdateSceneGraph(dt);
454  }
455 
456  virtual void updateObject(double dt)
457  {
458  if (root_)
459  root_->updateSceneGraph(dt);
460  }
461 
462  virtual double getDistanceToObject(const vec3 &v)
463  {
465  }
466 
467 protected:
468 
469  lgl_Node *root_;
470 };
471 
475 {
476 public:
477 
481  {
482  static lglCube cube;
483  setVBO(&cube);
484  }
485 
486 };
487 
491 {
492 public:
493 
497  {
498  static lglSphere sphere;
499  setVBO(&sphere);
500  }
501 
502  virtual double getDistanceToObject(const vec3 &v)
503  {
504  return(getDistanceToSphere(getPosition(), v, getRadius()));
505  }
506 
507 protected:
508 
509  virtual double getRadius()
510  {
511  return(0.5*getMaxScale());
512  }
513 
514  virtual double getNorm()
515  {
516  double s = getMaxScale();
517  return(0.25*s*s);
518  }
519 
520 };
521 
522 // helper class that provides the 'less' compare operator for depth sorting
523 class lgl_DepthSortCompare
524 {
525 public:
526 
527  lgl_DepthSortCompare(vec3 eye)
528  : eye_(eye)
529  {}
530 
531  bool operator() (lgl_Object *a, lgl_Object *b) const
532  {
533  return((a->getPosition()-eye_).norm() >
534  (b->getPosition()-eye_).norm());
535  }
536 
537 protected:
538 
539  vec3 eye_;
540 };
541 
544 class lgl_DepthSortedObjects: public std::vector<lgl_Object*>
545 {
546 public:
547 
548  typedef std::vector<lgl_Object*>::iterator iterator;
549 
552  : std::vector<lgl_Object*>()
553  {}
554 
555  virtual ~lgl_DepthSortedObjects()
556  {}
557 
559  virtual void drawObjects(vec3 eye)
560  {
561  depthSort(eye);
562 
563  for (iterator it=begin(); it!=end(); it++)
564  {
565  if ((*it)->init())
566  (*it)->initObject();
567 
568  (*it)->renderTransformedObject();
569  }
570  }
571 
572 protected:
573 
574  void depthSort(vec3 eye)
575  {
576  lgl_DepthSortCompare customLess(eye);
577  std::sort(begin(), end(), customLess);
578  }
579 
580 };
581 
584 class lgl_Objects: protected std::list<lgl_Object*>
585 {
586 public:
587 
588  typedef std::list<lgl_Object*>::iterator iterator;
589 
592  : std::list<lgl_Object*>(),
593  selected_(end())
594  {}
595 
596  virtual ~lgl_Objects()
597  {
598  for (iterator it=begin(); it!=end(); it++)
599  delete *it;
600  }
601 
603  virtual iterator addObject(lgl_Object *obj)
604  {
605  push_back(obj);
606  return(--end());
607  }
608 
610  iterator findObject(lgl_Object *obj)
611  {
612  for (iterator it=begin(); it!=end(); it++)
613  if (*it == obj)
614  return(it);
615 
616  return(end());
617  }
618 
620  iterator findObject(vec3 center, double radius)
621  {
622  iterator result = end();
623  double distance = radius;
624 
625  for (iterator it=begin(); it!=end(); it++)
626  {
627  double d = (*it)->getDistanceToObject(center);
628 
629  if (d <= radius)
630  if (d <= distance)
631  {
632  result = it;
633  distance = d;
634  }
635  }
636 
637  return(result);
638  }
639 
641  void selectObject(iterator it)
642  {
643  selected_ = it;
644  }
645 
647  iterator getSelectedObject()
648  {
649  return(selected_);
650  }
651 
653  virtual void removeObject(iterator it)
654  {
655  if (it == selected_)
656  selected_ = end();
657 
658  delete *it;
659  erase(it);
660  }
661 
663  iterator begin()
664  {
665  return(std::list<lgl_Object*>::begin());
666  }
667 
669  iterator end()
670  {
671  return(std::list<lgl_Object*>::end());
672  }
673 
675  void renderObjects(double dt = 0)
676  {
677  preupdateObjects(dt);
678  drawObjects();
679  updateObjects(dt);
680  }
681 
683  void renderObjects(vec3 eye, double dt = 0)
684  {
685  preupdateObjects(dt);
686  drawObjects(eye);
687  updateObjects(dt);
688  }
689 
691  virtual void drawObjects()
692  {
693  for (iterator it=begin(); it!=end(); it++)
694  {
695  if ((*it)->init())
696  (*it)->initObject();
697 
698  (*it)->renderTransformedObject();
699  }
700  }
701 
703  virtual void drawObjects(vec3 eye)
704  {
706  lgl_DepthSortedObjects partial_objs;
707 
708  // opaque bin
709  for (iterator it=begin(); it!=end(); it++)
710  {
711  if ((*it)->init())
712  (*it)->initObject();
713 
714  if (!((*it)->hasTransparency()))
715  (*it)->renderTransformedObject();
716  else
717  if (!((*it)->hasPartialTransparency()))
718  objs.push_back(*it);
719  else
720  partial_objs.push_back(*it);
721  }
722 
723  // transparent bin
724  partial_objs.drawObjects(eye);
725  bool zwrite = lglGetZWrite();
726  lglZWrite(false);
727  objs.drawObjects(eye);
728  lglZWrite(zwrite);
729  }
730 
732  virtual void preupdateObjects(double dt)
733  {
734  for (iterator it=begin(); it!=end(); it++)
735  {
736  if ((*it)->init())
737  (*it)->initObject();
738 
739  (*it)->preupdateObject(dt);
740  }
741  }
742 
744  virtual void updateObjects(double dt)
745  {
746  for (iterator it=begin(); it!=end(); it++)
747  {
748  if ((*it)->init())
749  (*it)->initObject();
750 
751  (*it)->updateObject(dt);
752  }
753  }
754 
755 protected:
756 
757  iterator selected_;
758 };
759 
761 template<typename T>
763 {
764 public:
765 
768  : lgl_Object(),
769  mass_(0), restitution_(1),
770  velocity_(0,0,0),
771  data_(NULL)
772  {}
773 
774  virtual ~lgl_PhysicalObject()
775  {
776  if (data_)
777  delete data_;
778  }
779 
782  {
783  return(data_);
784  }
785 
787  void setPhysicalData(T *data)
788  {
789  if (data_)
790  delete data_;
791 
792  data_ = data;
793  }
794 
797  virtual T *createPhysicalData()
798  {
799  return(NULL);
800  }
801 
804  {
805  return(mass_);
806  }
807 
810  void setPhysicalMass(double mass)
811  {
812  mass_ = mass;
813  }
814 
817  {
818  return(restitution_);
819  }
820 
822  void setPhysicalRestitution(double restitution)
823  {
824  restitution_ = restitution;
825  }
826 
827  void setTransformation(const mat4 &m)
828  {
830 
831  if (getPhysicalData())
832  transformationChanged(transformation_);
833  }
834 
835  virtual mat4 getPhysicalTransformation() = 0; // to be implemented by physics engine
836 
837  void setPhysicalTransformation(const mat4 &m)
838  {
840  }
841 
842  void move(const vec3 &delta)
843  {
844  lgl_Object::move(delta);
845 
846  if (getPhysicalData())
847  transformationChanged(transformation_);
848  }
849 
850  void rotate(const quat &q)
851  {
853 
854  if (getPhysicalData())
855  transformationChanged(transformation_);
856  }
857 
858  void scale(double factor)
859  {
860  if (!getPhysicalData())
861  lgl_Object::scale(factor);
862  }
863 
864  void scale(vec3 factor)
865  {
866  if (!getPhysicalData())
867  lgl_Object::scale(factor);
868  }
869 
871  void setVelocity(vec3 velocity)
872  {
873  velocity_ = velocity;
874 
875  if (getPhysicalData())
876  velocityChanged(velocity_);
877  }
878 
881  {
882  return(velocity_);
883  }
884 
885  virtual vec3 getPhysicalVelocity() = 0; // to be implemented by physics engine
886 
887  void setPhysicalVelocity(vec3 velocity)
888  {
889  velocity_ = velocity;
890  }
891 
893  virtual void applyForce(vec3 force, vec3 rel_pos = vec3(0,0,0)) = 0; // to be implemented by physics engine
894 
896  virtual void applyImpulse(vec3 impulse) = 0; // to be implemented by physics engine
897 
899  virtual void applyTorque(vec3 torque) = 0; // to be implemented by physics engine
900 
901 protected:
902 
903  double mass_;
904  double restitution_;
905  vec3 velocity_;
906 
907  T *data_;
908 
909  virtual void transformationChanged(const mat4 &m) = 0; // to be implemented by physics engine
910  virtual void velocityChanged(const vec3 &v) = 0; // to be implemented by physics engine
911 };
912 
915 template<typename T>
917 {
918 public:
919 
922  : lgl_PhysicalObject<T>(),
923  vbo_(vbo)
924  {}
925 
926  virtual ~lgl_PhysicalGeometryObject()
927  {}
928 
931  {
932  return(vbo_);
933  }
934 
936  void setVBO(lglVBO *vbo)
937  {
938  vbo_ = vbo;
939  }
940 
941  virtual vec3 getCenter()
942  {
943  if (vbo_)
945 
946  return(vec3(0,0,0));
947  }
948 
949  virtual vec3 getExtent()
950  {
951  if (vbo_)
953 
954  return(vec3(0,0,0));
955  }
956 
957  virtual double getRadius()
958  {
959  if (vbo_)
961 
962  return(0);
963  }
964 
965  virtual double getNorm()
966  {
967  if (vbo_)
968  {
970  return(vbo_->lglGetNorm()*s*s);
971  }
972 
973  return(0);
974  }
975 
976  virtual void renderObject()
977  {
978  if (vbo_)
979  vbo_->lglRender();
980  }
981 
982 protected:
983 
984  lglVBO *vbo_;
985 };
986 
989 {
990 public:
991 
992  virtual mat4 getPhysicalTransformation()
993  {
994  return(getTransformation());
995  }
996 
997  virtual vec3 getPhysicalVelocity()
998  {
999  return(getVelocity());
1000  }
1001 
1002  virtual void applyForce(vec3 force, vec3 rel_pos = vec3(0,0,0)) {}
1003  virtual void applyImpulse(vec3 impulse) {}
1004  virtual void applyTorque(vec3 torque) {}
1005 
1006 protected:
1007 
1008  virtual void transformationChanged(const mat4 &m) {}
1009  virtual void velocityChanged(const vec3 &v) {}
1010 };
1011 
1014 template<typename T>
1016 {
1017 public:
1018 
1021  : lgl_PhysicalObject<T>(),
1022  root_(NULL)
1023  {
1024  setSceneGraph(root);
1025  }
1026 
1027  virtual ~lgl_PhysicalSceneGraphObject()
1028  {
1029  if (root_)
1030  delete root_;
1031  }
1032 
1035  {
1036  return(root_);
1037  }
1038 
1041  {
1042  if (root_)
1043  delete root_;
1044 
1045  root_ = root;
1046 
1047  if (root_->hasTransparency())
1048  {
1051  }
1052  }
1053 
1054  virtual vec3 getCenter()
1055  {
1056  if (root_)
1057  return(root_->getCenter()*lgl_PhysicalObject<T>::getScale());
1058 
1059  return(vec3(0,0,0));
1060  }
1061 
1062  virtual vec3 getExtent()
1063  {
1064  if (root_)
1065  return(root_->getExtent()*lgl_PhysicalObject<T>::getScale());
1066 
1067  return(vec3(0,0,0));
1068  }
1069 
1070  virtual double getRadius()
1071  {
1072  if (root_)
1073  return(root_->getRadius()*lgl_PhysicalObject<T>::getMaxScale());
1074 
1075  return(0);
1076  }
1077 
1078  virtual double getNorm()
1079  {
1080  if (root_)
1081  {
1083  return(root_->getNorm()*s*s);
1084  }
1085 
1086  return(0);
1087  }
1088 
1089  virtual void renderObject()
1090  {
1091  if (root_)
1092  root_->drawSceneGraph();
1093  }
1094 
1095  virtual void preupdateObject(double dt)
1096  {
1097  if (root_)
1098  root_->preupdateSceneGraph(dt);
1099  }
1100 
1101  virtual void updateObject(double dt)
1102  {
1103  if (root_)
1104  root_->updateSceneGraph(dt);
1105  }
1106 
1107 protected:
1108 
1109  lgl_Node *root_;
1110 };
1111 
1114 {
1115 public:
1116 
1117  virtual mat4 getPhysicalTransformation()
1118  {
1119  return(getTransformation());
1120  }
1121 
1122  virtual vec3 getPhysicalVelocity()
1123  {
1124  return(getVelocity());
1125  }
1126 
1127  virtual void applyForce(vec3 force, vec3 rel_pos = vec3(0,0,0)) {}
1128  virtual void applyImpulse(vec3 impulse) {}
1129  virtual void applyTorque(vec3 torque) {}
1130 
1131 protected:
1132 
1133  virtual void transformationChanged(const mat4 &m) {}
1134  virtual void velocityChanged(const vec3 &v) {}
1135 };
1136 
1139 template<typename T>
1141 {
1142 public:
1143 
1147  {
1148  static lglCube cube;
1150  }
1151 
1152 };
1153 
1156 {
1157 public:
1158 
1159  virtual mat4 getPhysicalTransformation()
1160  {
1161  return(getTransformation());
1162  }
1163 
1164  virtual vec3 getPhysicalVelocity()
1165  {
1166  return(getVelocity());
1167  }
1168 
1169  virtual void applyForce(vec3 force, vec3 rel_pos = vec3(0,0,0)) {}
1170  virtual void applyImpulse(vec3 impulse) {}
1171  virtual void applyTorque(vec3 torque) {}
1172 
1173 protected:
1174 
1175  virtual void transformationChanged(const mat4 &m) {}
1176  virtual void velocityChanged(const vec3 &v) {}
1177 };
1178 
1181 template<typename T>
1183 {
1184 public:
1185 
1189  {
1190  static lglSphere sphere;
1192  }
1193 
1194 protected:
1195 
1196  virtual double getRadius()
1197  {
1199  }
1200 
1201  virtual double getNorm()
1202  {
1204  return(0.25*s*s);
1205  }
1206 
1207 };
1208 
1211 {
1212 public:
1213 
1214  virtual mat4 getPhysicalTransformation()
1215  {
1216  return(getTransformation());
1217  }
1218 
1219  virtual vec3 getPhysicalVelocity()
1220  {
1221  return(getVelocity());
1222  }
1223 
1224  virtual void applyForce(vec3 force, vec3 rel_pos = vec3(0,0,0)) {}
1225  virtual void applyImpulse(vec3 impulse) {}
1226  virtual void applyTorque(vec3 torque) {}
1227 
1228 protected:
1229 
1230  virtual void transformationChanged(const mat4 &m) {}
1231  virtual void velocityChanged(const vec3 &v) {}
1232 };
1233 
1235 template<typename T>
1237 {
1238 public:
1239 
1240  typedef lgl_Objects::iterator iterator;
1241 
1244  : lgl_Objects(),
1245  ground_o(0,0,0),
1246  ground_n(0,1,0),
1247  ground_g(-9.81),
1248  ground_r(1.0)
1249  {}
1250 
1251  virtual ~lgl_PhysicalObjects()
1252  {}
1253 
1255  virtual iterator addObject(lgl_Object *obj)
1256  {
1257  if (lgl_PhysicalObject<T> *pobj=dynamic_cast<lgl_PhysicalObject<T>*>(obj))
1258  {
1259  T *data = pobj->createPhysicalData();
1260  pobj->setPhysicalData(data);
1261  objectAdded(pobj);
1262  }
1263 
1264  return(lgl_Objects::addObject(obj));
1265  }
1266 
1268  iterator findNonStaticObject(vec3 center, double radius)
1269  {
1270  iterator result = end();
1271  double distance = radius;
1272 
1273  for (iterator it=begin(); it!=end(); it++)
1274  if (lgl_PhysicalObject<T> *pobj=dynamic_cast<lgl_PhysicalObject<T>*>(*it))
1275  if (pobj->getPhysicalMass() > 0)
1276  {
1277  double d = pobj->getDistanceToObject(center);
1278 
1279  if (d <= radius)
1280  if (d <= distance)
1281  {
1282  result = it;
1283  distance = d;
1284  }
1285  }
1286 
1287  return(result);
1288  }
1289 
1291  virtual void removeObject(iterator it)
1292  {
1293  if (lgl_PhysicalObject<T> *pobj=dynamic_cast<lgl_PhysicalObject<T>*>(*it))
1294  objectRemoved(pobj);
1295 
1297  }
1298 
1300  virtual void deactivateObject(iterator it, bool yes = true)
1301  {
1302  if (lgl_PhysicalObject<T> *pobj=dynamic_cast<lgl_PhysicalObject<T>*>(*it))
1303  objectDeactivated(pobj, yes);
1304  }
1305 
1307  iterator begin()
1308  {
1309  return(lgl_Objects::begin());
1310  }
1311 
1313  iterator end()
1314  {
1315  return(lgl_Objects::end());
1316  }
1317 
1321  void setGroundPlane(vec3 o, vec3 n, double r = 1.0)
1322  {
1323  ground_o = o;
1324  ground_n = n;
1325  ground_r = r;
1326  }
1327 
1329  void setGravity(double g)
1330  {
1331  ground_g = g;
1332  }
1333 
1334 protected:
1335 
1336  vec3 ground_o;
1337  vec3 ground_n;
1338 
1339  double ground_g;
1340  double ground_r;
1341 
1342  virtual void updateObjects(double dt)
1343  {
1344  updatePhysicalObjects(dt);
1345 
1346  for (iterator it=begin(); it!=end(); it++)
1347  {
1348  if (lgl_PhysicalObject<T> *pobj=dynamic_cast<lgl_PhysicalObject<T>*>(*it))
1349  {
1350  mat4 m = pobj->getPhysicalTransformation();
1351  pobj->setPhysicalTransformation(m);
1352 
1353  vec3 v = pobj->getPhysicalVelocity();
1354  pobj->setPhysicalVelocity(v);
1355  }
1356  }
1357 
1359  }
1360 
1361  virtual void objectAdded(lgl_PhysicalObject<T> *pobj) = 0; // to be implemented by physics engine
1362  virtual void objectRemoved(lgl_PhysicalObject<T> *pobj) = 0; // to be implemented by physics engine
1363  virtual void objectDeactivated(lgl_PhysicalObject<T> *pobj, bool yes) = 0; // to be implemented by physics engine
1364  virtual void updatePhysicalObjects(double dt) = 0; // to be implemented by physics engine
1365 };
1366 
1369 {
1370 protected:
1371 
1372  virtual void objectAdded(lgl_PhysicalObject<void*> *pobj) {}
1373  virtual void objectRemoved(lgl_PhysicalObject<void*> *pobj) {}
1374  virtual void objectDeactivated(lgl_PhysicalObject<void*> *pobj, bool yes) {}
1375  virtual void updatePhysicalObjects(double dt) {}
1376 };
1377 
1378 #endif
lgl_SphereObject::getNorm
virtual double getNorm()
get object norm
Definition: glvertex_object.h:514
lgl_PhysicalObject::setPhysicalRestitution
void setPhysicalRestitution(double restitution)
set physical restitution
Definition: glvertex_object.h:822
lgl_Objects::drawObjects
virtual void drawObjects()
draw all objects without updating
Definition: glvertex_object.h:691
lgl_GeometryObject::getNorm
virtual double getNorm()
get object norm
Definition: glvertex_object.h:340
lgl_Objects::updateObjects
virtual void updateObjects(double dt)
update all objects
Definition: glvertex_object.h:744
lgl_SphereObject
sphere object
Definition: glvertex_object.h:490
lgl_PhysicalGeometryObject::getVBO
lglVBO * getVBO()
get vbo
Definition: glvertex_object.h:930
lgl_Objects::preupdateObjects
virtual void preupdateObjects(double dt)
pre-update all objects
Definition: glvertex_object.h:732
lgl_SceneGraphObject::getExtent
virtual vec3 getExtent()
get bounding box extent
Definition: glvertex_object.h:417
lgl_Node::preupdateSceneGraph
void preupdateSceneGraph(double dt)
pre-update the entire scene subgraph
Definition: glvertex_nodes.h:404
lgl_PhysicalSceneGraphObject::getCenter
virtual vec3 getCenter()
get object barycenter relative to object position
Definition: glvertex_object.h:1054
lgl_Object::rotate
void rotate(const quat &q)
rotate object by quaternion
Definition: glvertex_object.h:158
glvertex_nodes.h
lgl_PhysicalObject::applyImpulse
virtual void applyImpulse(vec3 impulse)=0
apply linear impulse to center of mass
lgl_PhysicalSphereObject::getNorm
virtual double getNorm()
get object norm
Definition: glvertex_object.h:1201
lgl_Node
scene graph node (base class)
Definition: glvertex_nodes.h:22
lgl_Object
graphical object class (base class)
Definition: glvertex_object.h:19
lgl_Objects
container class for multiple graphical objects
Definition: glvertex_object.h:584
lgl_Object::getRotation
mat3 getRotation()
get object rotation
Definition: glvertex_object.h:100
lgl_PhysicalObjects::removeObject
virtual void removeObject(iterator it)
remove physical object
Definition: glvertex_object.h:1291
lgl_PhysicalGeometryObject::getExtent
virtual vec3 getExtent()
get bounding box extent
Definition: glvertex_object.h:949
lgl_Object::getColor
vec4 getColor()
get object color
Definition: glvertex_object.h:44
lgl_PhysicalObjects::addObject
virtual iterator addObject(lgl_Object *obj)
add physical object
Definition: glvertex_object.h:1255
lgl_PhysicalSphereObject::getRadius
virtual double getRadius()
get bounding object radius
Definition: glvertex_object.h:1196
lgl_NoPhysicalSceneGraphObject::applyImpulse
virtual void applyImpulse(vec3 impulse)
apply linear impulse to center of mass
Definition: glvertex_object.h:1128
lgl_Objects::removeObject
virtual void removeObject(iterator it)
remove graphical object
Definition: glvertex_object.h:653
lgl_SceneGraphObject::getSceneGraph
lgl_Node * getSceneGraph()
get scene graph
Definition: glvertex_object.h:389
lgl_DepthSortedObjects::lgl_DepthSortedObjects
lgl_DepthSortedObjects()
ctor
Definition: glvertex_object.h:551
lgl_Object::getNorm
virtual double getNorm()
get object norm
Definition: glvertex_object.h:145
lgl_GeometryObject::lgl_GeometryObject
lgl_GeometryObject(lglVBO *vbo=NULL)
ctor
Definition: glvertex_object.h:296
lgl_Object::hasTransparency
bool hasTransparency()
get object transparency flag
Definition: glvertex_object.h:57
lgl_SceneGraphObject::getNorm
virtual double getNorm()
get object norm
Definition: glvertex_object.h:433
lgl_Object::scale
void scale(double factor)
scale object by factor
Definition: glvertex_object.h:164
lgl_SceneGraphObject::getCenter
virtual vec3 getCenter()
get object barycenter relative to object position
Definition: glvertex_object.h:409
lgl_PhysicalSceneGraphObject::getSceneGraph
lgl_Node * getSceneGraph()
get scene graph
Definition: glvertex_object.h:1034
lgl_PhysicalCubeObject
physical cube object (base template)
Definition: glvertex_object.h:1140
lgl_SceneGraphObject::lgl_SceneGraphObject
lgl_SceneGraphObject(lgl_Node *root=NULL)
ctor
Definition: glvertex_object.h:375
lgl_NoPhysicalGeometryObject::applyTorque
virtual void applyTorque(vec3 torque)
apply angular impulse to center of mass
Definition: glvertex_object.h:1004
lgl_NoPhysicalCubeObject::applyTorque
virtual void applyTorque(vec3 torque)
apply angular impulse to center of mass
Definition: glvertex_object.h:1171
lgl_Objects::addObject
virtual iterator addObject(lgl_Object *obj)
add graphical object
Definition: glvertex_object.h:603
vec4
4D double vector
Definition: glslmath.h:713
lgl::lglGetCenter
vec3 lglGetCenter() const
get the bounding box barycenter of the contained vertices in vbo
Definition: glvertex_core.h:1819
lgl_PhysicalObject::setPhysicalData
void setPhysicalData(T *data)
set physical data
Definition: glvertex_object.h:787
lgl_Node::getCenter
vec3 getCenter()
get the bounding box center of the entire subgraph
Definition: glvertex_nodes.h:483
lgl_Objects::renderObjects
void renderObjects(double dt=0)
render and update all objects
Definition: glvertex_object.h:675
lgl_Object::getScale
vec3 getScale()
get object scale
Definition: glvertex_object.h:106
lgl_Object::getPosition
vec3 getPosition()
get object position
Definition: glvertex_object.h:94
lgl_PhysicalSceneGraphObject::getRadius
virtual double getRadius()
get bounding object radius
Definition: glvertex_object.h:1070
lgl_Node::getRadius
double getRadius()
get the bounding sphere radius of the entire subgraph
Definition: glvertex_nodes.h:512
lgl_PhysicalSceneGraphObject::getNorm
virtual double getNorm()
get object norm
Definition: glvertex_object.h:1078
glvertex.h
lglPopMatrix
void lglPopMatrix()
pop matrix (as defined by OpenGL 1.2)
Definition: glvertex_api.h:78
lglColor
void lglColor(const vec4f &c)
specify vertex color attribute (as defined by OpenGL 1.2)
Definition: glvertex_api.h:30
lgl_NoPhysicalSceneGraphObject::applyForce
virtual void applyForce(vec3 force, vec3 rel_pos=vec3(0, 0, 0))
apply force to point relative to center of mass
Definition: glvertex_object.h:1127
lgl_PhysicalObject::setVelocity
void setVelocity(vec3 velocity)
set object velocity
Definition: glvertex_object.h:871
lgl_Object::getMaxScale
double getMaxScale()
get maximum object scale
Definition: glvertex_object.h:112
lgl_Objects::findObject
iterator findObject(vec3 center, double radius)
find nearest graphical object within search radius
Definition: glvertex_object.h:620
lgl_Object::hasPartialTransparency
bool hasPartialTransparency()
get partial object transparency flag
Definition: glvertex_object.h:69
lglMultMatrix
void lglMultMatrix(const mat4 &matrix)
multiply with matrix (as defined by OpenGL 1.2)
Definition: glvertex_api.h:70
lgl_Object::move
void move(const vec3 &delta)
move object by delta vector
Definition: glvertex_object.h:151
lgl_PhysicalObjects::end
iterator end()
end iterator
Definition: glvertex_object.h:1313
lgl_NoPhysicalSphereObject::applyImpulse
virtual void applyImpulse(vec3 impulse)
apply linear impulse to center of mass
Definition: glvertex_object.h:1225
lgl_DepthSortedObjects::drawObjects
virtual void drawObjects(vec3 eye)
draw all objects with depth sorting
Definition: glvertex_object.h:559
lgl_PhysicalObjects::deactivateObject
virtual void deactivateObject(iterator it, bool yes=true)
deactivate physical object
Definition: glvertex_object.h:1300
lgl_SceneGraphObject::getDistanceToObject
virtual double getDistanceToObject(const vec3 &v)
compute minimum distance to transformed object
Definition: glvertex_object.h:462
lgl_PhysicalObject
physical object (base template)
Definition: glvertex_object.h:762
lgl_NoPhysicalGeometryObject::applyForce
virtual void applyForce(vec3 force, vec3 rel_pos=vec3(0, 0, 0))
apply force to point relative to center of mass
Definition: glvertex_object.h:1002
lgl_PhysicalObjects::findNonStaticObject
iterator findNonStaticObject(vec3 center, double radius)
find nearest non-static graphical object within search radius
Definition: glvertex_object.h:1268
lgl_Object::lgl_Object
lgl_Object()
ctor
Definition: glvertex_object.h:24
lgl_Objects::findObject
iterator findObject(lgl_Object *obj)
find graphical object
Definition: glvertex_object.h:610
lgl_Objects::renderObjects
void renderObjects(vec3 eye, double dt=0)
render and update all objects
Definition: glvertex_object.h:683
vec3
3D double vector
Definition: glslmath.h:372
lgl_PhysicalObject::getPhysicalMass
double getPhysicalMass()
get physical mass
Definition: glvertex_object.h:803
lgl::lglGetNorm
double lglGetNorm() const
get the bounding sphere norm of the contained vertices in vbo
Definition: glvertex_core.h:1844
lgl_PhysicalObjects::updateObjects
virtual void updateObjects(double dt)
update all objects
Definition: glvertex_object.h:1342
lgl_Node::updateSceneGraph
void updateSceneGraph(double dt)
update the entire scene subgraph
Definition: glvertex_nodes.h:410
lgl_Object::getDistanceToSphere
static double getDistanceToSphere(const vec3 &p, const vec3 &v, double radius)
compute minimum distance to sphere
Definition: glvertex_object.h:242
lgl_Object::shown
bool shown()
is the object shown?
Definition: glvertex_object.h:182
mat4
4x4 double matrix
Definition: glslmath.h:2116
lgl_Object::hasPartialTransparency
void hasPartialTransparency(bool flag)
set partial object transparency flag
Definition: glvertex_object.h:75
mat4::getRotation
mat3 getRotation() const
get 3x3 rotation submatrix (matrix is assumed to be orthonormal)
Definition: glslmath.h:2290
lgl::lglGetRadius
double lglGetRadius() const
get the bounding sphere radius of the contained vertices in vbo
Definition: glvertex_core.h:1832
lgl_Object::setColor
void setColor(const vec4 &c)
set object color
Definition: glvertex_object.h:50
lgl_Object::getCenter
virtual vec3 getCenter()
get object barycenter relative to object position
Definition: glvertex_object.h:127
lgl_NoPhysicalGeometryObject
no physical geometry object (empty physics implementation)
Definition: glvertex_object.h:988
lgl_NoPhysicalSphereObject::applyForce
virtual void applyForce(vec3 force, vec3 rel_pos=vec3(0, 0, 0))
apply force to point relative to center of mass
Definition: glvertex_object.h:1224
lgl_GeometryObject::getCenter
virtual vec3 getCenter()
get object barycenter relative to object position
Definition: glvertex_object.h:316
lgl_PhysicalObjects::begin
iterator begin()
begin iterator
Definition: glvertex_object.h:1307
lgl_PhysicalGeometryObject::getRadius
virtual double getRadius()
get bounding object radius
Definition: glvertex_object.h:957
lgl_PhysicalGeometryObject
physical geometry object (base template)
Definition: glvertex_object.h:916
lgl_CubeObject::lgl_CubeObject
lgl_CubeObject()
ctor
Definition: glvertex_object.h:479
lgl_PhysicalSceneGraphObject::lgl_PhysicalSceneGraphObject
lgl_PhysicalSceneGraphObject(lgl_Node *root=NULL)
ctor
Definition: glvertex_object.h:1020
lgl_Object::getDistanceToObject
virtual double getDistanceToObject(const vec3 &v)
compute minimum distance to transformed object
Definition: glvertex_object.h:214
lgl_Object::show
void show(bool yes=true)
show object
Definition: glvertex_object.h:194
lgl_Objects::lgl_Objects
lgl_Objects()
ctor
Definition: glvertex_object.h:591
lgl_PhysicalSceneGraphObject::setSceneGraph
void setSceneGraph(lgl_Node *root)
set scene graph
Definition: glvertex_object.h:1040
lgl_PhysicalObject::getPhysicalData
T * getPhysicalData()
get physical data
Definition: glvertex_object.h:781
lglCube
unit cube vbo
Definition: glvertex_geometry.h:19
lgl_SceneGraphObject::getRadius
virtual double getRadius()
get bounding object radius
Definition: glvertex_object.h:425
lgl_Objects::end
iterator end()
end iterator
Definition: glvertex_object.h:669
lgl_Node::getNorm
double getNorm()
get the bounding sphere norm of the entire subgraph
Definition: glvertex_nodes.h:527
lgl_Object::getRadius
virtual double getRadius()
get bounding object radius
Definition: glvertex_object.h:139
lgl_SphereObject::getRadius
virtual double getRadius()
get bounding object radius
Definition: glvertex_object.h:509
lgl_PhysicalGeometryObject::getCenter
virtual vec3 getCenter()
get object barycenter relative to object position
Definition: glvertex_object.h:941
lglSphere
unit sphere vbo
Definition: glvertex_geometry.h:653
lgl_NoPhysicalSphereObject::applyTorque
virtual void applyTorque(vec3 torque)
apply angular impulse to center of mass
Definition: glvertex_object.h:1226
lgl_CubeObject
cube object
Definition: glvertex_object.h:474
lgl_PhysicalSphereObject::lgl_PhysicalSphereObject
lgl_PhysicalSphereObject()
ctor
Definition: glvertex_object.h:1187
lgl::lglRender
virtual void lglRender(const lgl *vbo=NULL)
render the series of vertices contained in vbo
Definition: glvertex_core.h:1079
lgl_Object::getDistanceToBox
static double getDistanceToBox(const vec3 &p, const mat3 &rotation, const vec3 &offset, const vec3 &v, const vec3 &ext)
compute minimum distance to rotated and displaced box
Definition: glvertex_object.h:280
lgl_Object::hasTransparency
void hasTransparency(bool flag)
set object transparency flag
Definition: glvertex_object.h:63
quat
quaternion
Definition: glslmath.h:2972
lgl_Objects::getSelectedObject
iterator getSelectedObject()
get selected graphical object
Definition: glvertex_object.h:647
lgl_SphereObject::getDistanceToObject
virtual double getDistanceToObject(const vec3 &v)
compute minimum distance to transformed object
Definition: glvertex_object.h:502
lgl_Objects::begin
iterator begin()
begin iterator
Definition: glvertex_object.h:663
lgl_Object::getDistanceToBox
static double getDistanceToBox(const vec3 &p, const mat3 &rotation, const vec3 &v, const vec3 &ext)
compute minimum distance to rotated box
Definition: glvertex_object.h:274
lgl_Object::hidden
bool hidden()
is the object hidden?
Definition: glvertex_object.h:176
vec3::length
double length() const
get vector length
Definition: glslmath.h:420
lgl_Object::getTransformation
mat4 getTransformation()
get object transformation
Definition: glvertex_object.h:81
lgl_SphereObject::lgl_SphereObject
lgl_SphereObject()
ctor
Definition: glvertex_object.h:495
lgl_NoPhysicalCubeObject::applyForce
virtual void applyForce(vec3 force, vec3 rel_pos=vec3(0, 0, 0))
apply force to point relative to center of mass
Definition: glvertex_object.h:1169
lgl_GeometryObject
geometry object
Definition: glvertex_object.h:291
lglVBO
LGL API: vbo class definition.
Definition: glvertex_core.h:5827
lgl_Objects::selectObject
void selectObject(iterator it)
select graphical object
Definition: glvertex_object.h:641
lgl_PhysicalObjects
container class for multiple physical objects (base template)
Definition: glvertex_object.h:1236
mat3
3x3 double matrix
Definition: glslmath.h:1544
lgl_SceneGraphObject::setSceneGraph
void setSceneGraph(lgl_Node *root)
set scene graph
Definition: glvertex_object.h:395
lgl_NoPhysicalCubeObject
no physical cube object (empty physics implementation)
Definition: glvertex_object.h:1155
lgl_GeometryObject::getVBO
lglVBO * getVBO()
get vbo
Definition: glvertex_object.h:305
lgl_PhysicalSceneGraphObject
physical scene graph object (base template)
Definition: glvertex_object.h:1015
lgl_GeometryObject::setVBO
void setVBO(lglVBO *vbo)
set vbo
Definition: glvertex_object.h:311
lgl_PhysicalObject::applyTorque
virtual void applyTorque(vec3 torque)=0
apply angular impulse to center of mass
lgl_PhysicalSphereObject
physical sphere object (base template)
Definition: glvertex_object.h:1182
lgl_Node::getExtent
vec3 getExtent()
get the bounding box extent of the entire subgraph
Definition: glvertex_nodes.h:497
lgl_PhysicalObjects::lgl_PhysicalObjects
lgl_PhysicalObjects()
ctor
Definition: glvertex_object.h:1243
lglZWrite
void lglZWrite(bool on=true)
change OpenGL state (depth write)
Definition: glvertex_api.h:380
lgl_NoPhysicalSceneGraphObject
no physical scene graph object (empty physics implementation)
Definition: glvertex_object.h:1113
lgl::lglGetExtent
vec3 lglGetExtent() const
get the bounding box extent of the contained vertices in vbo
Definition: glvertex_core.h:1825
lglPushMatrix
void lglPushMatrix()
push matrix (as defined by OpenGL 1.2)
Definition: glvertex_api.h:74
lgl_GeometryObject::getDistanceToObject
virtual double getDistanceToObject(const vec3 &v)
compute minimum distance to transformed object
Definition: glvertex_object.h:357
lgl_Node::hasTransparency
bool hasTransparency()
check the entire subgraph whether or not it contains semi-transparent geometry
Definition: glvertex_nodes.h:628
lgl_Object::getExtent
virtual vec3 getExtent()
get bounding box extent
Definition: glvertex_object.h:133
lgl_PhysicalSceneGraphObject::getExtent
virtual vec3 getExtent()
get bounding box extent
Definition: glvertex_object.h:1062
lgl_NoPhysicalSphereObject
no physical sphere object (empty physics implementation)
Definition: glvertex_object.h:1210
lgl_Object::hasUniformScale
bool hasUniformScale()
object has uniform scale?
Definition: glvertex_object.h:121
lgl_PhysicalGeometryObject::setVBO
void setVBO(lglVBO *vbo)
set vbo
Definition: glvertex_object.h:936
lgl_PhysicalObjects::setGravity
void setGravity(double g)
set gravity
Definition: glvertex_object.h:1329
lglScale
void lglScale(const vec4 &c)
multiply with scale matrix (as defined by OpenGL 1.2)
Definition: glvertex_api.h:82
lglGetZWrite
bool lglGetZWrite()
get OpenGL state (depth write)
Definition: glvertex_api.h:384
lgl_GeometryObject::getRadius
virtual double getRadius()
get bounding object radius
Definition: glvertex_object.h:332
mat4::getTranslation
vec3 getTranslation() const
get translation column vector (matrix is assumed to be affine)
Definition: glslmath.h:2294
lgl_PhysicalGeometryObject::getNorm
virtual double getNorm()
get object norm
Definition: glvertex_object.h:965
lgl_PhysicalGeometryObject::lgl_PhysicalGeometryObject
lgl_PhysicalGeometryObject(lglVBO *vbo=NULL)
ctor
Definition: glvertex_object.h:921
mat3::invert
mat3 invert() const
invert 3x3 matrix
Definition: glslmath.h:1723
lgl_PhysicalObject::setPhysicalMass
void setPhysicalMass(double mass)
set physical mass a mass of zero creates a static (immovable) object
Definition: glvertex_object.h:810
lgl_SceneGraphObject
scene graph object
Definition: glvertex_object.h:370
mat4::translate
static mat4 translate(double x, double y, double z)
create translation matrix
Definition: glslmath.h:2427
lgl_Object::renderTransformedObject
void renderTransformedObject()
render transformed object
Definition: glvertex_object.h:200
lgl_PhysicalObject::getVelocity
vec3 getVelocity()
get object velocity
Definition: glvertex_object.h:880
lgl_NoPhysicalCubeObject::applyImpulse
virtual void applyImpulse(vec3 impulse)
apply linear impulse to center of mass
Definition: glvertex_object.h:1170
lgl_Object::setTransformation
void setTransformation(const mat4 &m)
set object transformation
Definition: glvertex_object.h:87
lgl_PhysicalCubeObject::lgl_PhysicalCubeObject
lgl_PhysicalCubeObject()
ctor
Definition: glvertex_object.h:1145
lgl_Node::drawSceneGraph
void drawSceneGraph(vec4 color=vec4(1))
draw the entire scene subgraph without updating
Definition: glvertex_nodes.h:359
lgl_PhysicalObject::createPhysicalData
virtual T * createPhysicalData()
create physical data
Definition: glvertex_object.h:797
lgl_Object::getDistanceToBox
static double getDistanceToBox(const vec3 &p, const vec3 &v, const vec3 &ext)
compute minimum distance to box
Definition: glvertex_object.h:250
lgl_PhysicalObject::applyForce
virtual void applyForce(vec3 force, vec3 rel_pos=vec3(0, 0, 0))=0
apply force to point relative to center of mass
lgl_GeometryObject::getExtent
virtual vec3 getExtent()
get bounding box extent
Definition: glvertex_object.h:324
lgl_PhysicalObject::getPhysicalRestitution
double getPhysicalRestitution()
get physical restitution
Definition: glvertex_object.h:816
lgl_Objects::drawObjects
virtual void drawObjects(vec3 eye)
draw all objects with depth sorting
Definition: glvertex_object.h:703
lgl_DepthSortedObjects
container class for multiple depth-sorted graphical objects
Definition: glvertex_object.h:544
lgl_Object::hide
void hide(bool yes=true)
hide object
Definition: glvertex_object.h:188
lgl_NoPhysicalGeometryObject::applyImpulse
virtual void applyImpulse(vec3 impulse)
apply linear impulse to center of mass
Definition: glvertex_object.h:1003
lgl_PhysicalObject::lgl_PhysicalObject
lgl_PhysicalObject()
ctor
Definition: glvertex_object.h:767
lgl_PhysicalObjects::setGroundPlane
void setGroundPlane(vec3 o, vec3 n, double r=1.0)
set ground plane
Definition: glvertex_object.h:1321
lgl_NoPhysicalObjects
container class for multiple non-physical objects (empty physics implementation)
Definition: glvertex_object.h:1368
lgl_NoPhysicalSceneGraphObject::applyTorque
virtual void applyTorque(vec3 torque)
apply angular impulse to center of mass
Definition: glvertex_object.h:1129
lgl_Object::scale
void scale(const vec3 &factor)
scale object by non-uniform factor
Definition: glvertex_object.h:170