cherish
Canvas.h
1 #ifndef CANVAS
2 #define CANVAS
3 
4 #include "Settings.h"
5 #include "ShaderedEntity2D.h"
6 #include "Stroke.h"
7 #include "Polygon.h"
8 #include "LineSegment.h"
9 #include "Photo.h"
10 #include "ToolGlobal.h"
11 #include "SelectedGroup.h"
12 #include "ProtectedGroup.h"
13 #include "libSGControls/ProgramStroke.h"
14 #include "libSGControls/ProgramPolygon.h"
15 #include "libSGControls/ProgramLineSegment.h"
16 
17 #include <osg/ref_ptr>
18 #include <osg/Geode>
19 #include <osg/Group>
20 #include <osg/BoundingBox>
21 #include <osg/Geometry>
22 #include <osg/MatrixTransform>
23 #include <osg/Switch>
24 #include <osgDB/ObjectWrapper>
25 #include <osg/AutoTransform>
26 
27 namespace entity {
31 class Canvas : public osg::ProtectedGroup {
32 public:
33  Canvas();
34 
35 #ifndef DOXYGEN_SHOULD_SKIP_THIS
36  Canvas(const Canvas& cnv, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY);
37 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
38 
39 public:
41  virtual void initializeTools();
42 
44  virtual void initializeSG();
45 
47  virtual void initializeStateMachine();
48 
50  virtual void initializeMasks();
51 
53  osg::Matrix getMatrixInverse() const;
54 
56  osg::Matrix getMatrix() const;
57 
59  osg::Vec3f getCenter3D() const;
60 
61  ProgramStroke* getProgramStroke() const;
62  ProgramPolygon* getProgramPolygon() const;
63  ProgramLineSegment* getProgramLineSegment() const;
64 
65 #ifndef DOXYGEN_SHOULD_SKIP_THIS
66 public:
67  META_Node(entity, Canvas)
68 
69  /* setters and getters for serialization only! */
70  void setMatrixRotation(const osg::Matrix& R);
71  const osg::Matrix& getMatrixRotation() const;
72 
73  void setMatrixTranslation(const osg::Matrix& T);
74  const osg::Matrix& getMatrixTranslation() const;
75 
76  void setTransform(osg::MatrixTransform* t);
77  const osg::MatrixTransform* getTransform() const;
78  osg::MatrixTransform* getTransform();
79 
80  void setSwitch(osg::Switch* sw);
81  const osg::Switch* getSwitch() const;
82 
83  void setGroupData(osg::Group* group);
84  const osg::Group* getGroupData() const;
85 
86  void setGeodeStrokes(osg::Geode* geode);
87  const osg::Geode* getGeodeStrokes() const;
88 
89  void setGeodePhotos(osg::Geode* geode);
90  const osg::Geode* getGeodePhotos() const;
91 
92  void setGeodePolygons(osg::Geode* geode);
93  const osg::Geode* getGeodePolygons() const;
94 
95  void setGeodeLineSegments(osg::Geode* geode);
96  const osg::Geode* getGeodeLineSegments() const;
97 
98  void setCenter(const osg::Vec3f& center);
99 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
100 
101  const osg::Vec3f& getCenter() const;
102 
103 #ifndef DOXYGEN_SHOULD_SKIP_THIS
104  void setNormal(const osg::Vec3f& normal);
105  const osg::Vec3f& getNormal() const;
106 
107 #endif /* DOXYGEN_SHOULD_SKIP_THIS */
108 
110  void setColor(const osg::Vec4f& color, const osg::Vec4f& colorIntersection = cher::CANVAS_CLR_PREVIOUS);
112  const osg::Vec4f& getColor() const;
113 
114 protected:
115 #ifndef DOXYGEN_SHOULD_SKIP_THIS
116  void setVisibilityFrame(bool vis);
117  bool getVisibilityFrame() const;
118 #endif // DOXYGEN_SHOULD_SKIP_THIS
119 public:
121  void setVisibilityFrameInternal(bool vis);
122 
124  bool getVisibilityFrameInternal() const;
125 
127  bool getVisibilityAll() const;
128 
130  void setVisibilityAll(bool vis);
131 
132 protected:
133 #ifndef DOXYGEN_SHOULD_SKIP_THIS
134  bool getVisibilityData() const;
135  void setVisibilityData(bool vis);
136 #endif // DOXYGEN_SHOULD_SKIP_THIS
137 
138 public:
148  osg::Vec3f getGlobalAxisU() const;
149 
159  osg::Vec3f getGlobalAxisV() const;
160 
162  const osg::Geometry* getGeometryPickable() const;
163 
165  void translate(const osg::Matrix& mt);
166 
168  void rotate(const osg::Matrix& mr, const osg::Vec3f& c3d_new);
169 
171  void unselectAll();
172 
174  void unselectEntities();
175 
177  void selectAllEntities();
178 
180  void setStrokeCurrent(entity::Stroke* stroke);
181 
183  void setStrokeCurrent(bool current);
184 
187 
190 
192  void setPolygonCurrent(bool current);
193 
196 
197  void setEntityCurrent(entity::ShaderedEntity2D* entity);
198  void setEntityCurrent(bool current);
199 
200  template <typename EntityType>
201  // imlementation is in header so that to avoid template definition
202  EntityType* getEntityCurrent() const{
203  return dynamic_cast<EntityType*>(m_entityCurrent.get());
204  }
205 
207  void addEntitySelected(entity::Entity2D* entity);
208 
211 
213  const std::vector<Entity2D *> &getEntitiesSelected() const;
214 
216  int getEntitiesSelectedSize() const;
217 
219  bool isEntitiesSelected() const;
220 
222  osg::Vec3f getEntitiesSelectedCenter3D() const;
223 
225  osg::Vec3f getEntitiesSelectedCenter2D() const;
226 
228  osg::Vec3f getCenter2D() const;
229 
231  osg::Vec3f getBoundingBoxCenter3D() const;
232 
234  osg::Vec3f getBoundingBoxCenter2D() const;
235 
237  osg::BoundingBox getBoundingBox() const;
238 
239 
241  void moveEntities(std::vector<Entity2D *> &entities, double du, double dv);
242 
244  void moveEntitiesSelected(double du, double dv);
245 
251  void scaleEntities(std::vector<Entity2D *> &entities, double sx, double sy, osg::Vec3f center);
252 
254  void scaleEntitiesSelected(double sx, double sy);
255 
260  void rotateEntities(std::vector<entity::Entity2D*> entities, double theta, osg::Vec3f center);
261 
263  void rotateEntitiesSelected(double theta);
264 
267  void updateFrame(entity::Canvas *against = 0);
268 
270  const osg::Vec3Array* getFrameVertices() const;
271 
275  bool detachFrame();
276 
280  bool attachFrame();
281 
285  osg::Group* attachMeshGroup();
286 
290  bool disattachMeshGroup(osg::Group* group);
291 
297  bool addToMeshGroup(osg::Group* group, osg::Node* mesh);
298 
302  void setModeEdit(bool on);
303 
307  void setFrameEditable(bool on);
308 
310  bool getModeEdit() const;
311 
313  osg::Plane getPlane() const;
314 
316  entity::Canvas* clone() const;
317 
320 
322  const entity::FrameTool* getToolFrame() const;
323 
325  unsigned int getNumEntities() const;
326 
328  unsigned int getNumPhotos() const;
329 
331  unsigned int getNumStrokes() const;
332 
334  unsigned int getNumPolygons() const;
335 
336  unsigned int getNumLineSegments() const;
337 
339  entity::Photo* getPhoto(int row) const;
340 
342  entity::Stroke* getStroke(int i) const;
343 
345  entity::Polygon* getPolygon(int i) const;
346 
347  entity::LineSegment* getLineSegment(int i) const;
348 
352  entity::Entity2D* getEntity(unsigned int i) const;
353 
355  bool addEntity(entity::Entity2D* entity);
356 
358  bool removeEntity(entity::Entity2D* entity);
359 
361  bool containsEntity(entity::Entity2D* entity) const;
362 
363 protected:
364  void updateTransforms();
365  void resetTransforms();
366  void setVertices(const osg::Vec3f& center, float szX, float szY, float szCr, float szAx);
367  void setVerticesDefault(const osg::Vec3f& center);
368  void setIntersection(entity::Canvas* against = 0);
369 
370 public:
371  void initializeProgramStroke();
372  void initializeProgramPolygon();
373  void initializeProgramLineSegment();
374 
375 private:
376  osg::Matrix m_mR; /* part of m_transform */
377  osg::Matrix m_mT; /* part of m_transform */
378  osg::ref_ptr<osg::MatrixTransform> m_transform; /* matrix transform in 3D space */
379  osg::ref_ptr<osg::Switch> m_switch; /* inisible or not, the whole canvas content */
380  osg::ref_ptr<osg::Group> m_groupData; /* keeps user canvas 2d entities such as strokes and photos */
381  osg::ref_ptr<osg::Geode> m_geodeStrokes; // contains all the strokes as children
382  osg::ref_ptr<osg::Geode> m_geodePhotos; // contains all the photos as children
383  osg::ref_ptr<osg::Geode> m_geodePolygons; // contains all the polygons as children
384  osg::ref_ptr<osg::Geode> m_geodeLineSegments;
385  osg::ref_ptr<ProgramStroke> m_programStroke;
386  osg::ref_ptr<ProgramPolygon> m_programPolygon;
387  osg::ref_ptr<ProgramLineSegment> m_programLineSegment;
389  /* construction geodes */
390  osg::ref_ptr<entity::FrameTool> m_toolFrame;
391 
392  osg::observer_ptr<entity::Stroke> m_strokeCurrent; /* for stroke drawing */
393  osg::observer_ptr<entity::Polygon> m_polygonCurrent; /* for polygon drawing, see UserScene::addPolygon */
394  osg::observer_ptr<entity::ShaderedEntity2D> m_entityCurrent;
395  entity::SelectedGroup m_selectedGroup;
396  osg::Vec3f m_center; /* 3D global - virtual plane parameter */
397  osg::Vec3f m_normal; /* 3D global - virtual plane parameter*/
398 
399  bool m_edit;
400 
401 };
402 }
403 
404 #endif // CANVAS
405 
const osg::Vec3f & getCenter() const
Definition: Canvas.cpp:334
unsigned int getNumStrokes() const
Definition: Canvas.cpp:1066
void setVisibilityFrameInternal(bool vis)
Definition: Canvas.cpp:372
entity::Entity2D * getEntity(unsigned int i) const
Definition: Canvas.cpp:1105
bool isEntitiesSelected() const
Definition: Canvas.cpp:608
osg::Group * attachMeshGroup()
Definition: Canvas.cpp:782
osg::Plane getPlane() const
Definition: Canvas.cpp:822
bool disattachMeshGroup(osg::Group *group)
Definition: Canvas.cpp:792
int getEntitiesSelectedSize() const
Definition: Canvas.cpp:603
Definition: ProgramPolygon.h:12
void scaleEntitiesSelected(double sx, double sy)
Definition: Canvas.cpp:696
void rotateEntities(std::vector< entity::Entity2D *> entities, double theta, osg::Vec3f center)
Definition: Canvas.cpp:701
void setPolygonCurrent(entity::Polygon *poly)
Definition: Canvas.cpp:529
Definition: Canvas.h:31
unsigned int getNumPolygons() const
Definition: Canvas.cpp:1071
void setModeEdit(bool on)
Definition: Canvas.cpp:807
virtual void initializeStateMachine()
Definition: Canvas.cpp:127
void addEntitySelected(entity::Entity2D *entity)
Definition: Canvas.cpp:569
bool addEntity(entity::Entity2D *entity)
Definition: Canvas.cpp:1133
virtual void initializeSG()
Definition: Canvas.cpp:96
Geometry class that represents a line segment in 3D space.
Definition: LineSegment.h:17
void setFrameEditable(bool on)
Definition: Canvas.cpp:812
bool containsEntity(entity::Entity2D *entity) const
Definition: Canvas.cpp:1184
osg::Vec3f getGlobalAxisV() const
Definition: Canvas.cpp:415
virtual void initializeTools()
Definition: Canvas.cpp:81
Scene graph entities.
Definition: AddEntityCommand.h:17
const osg::Vec4f & getColor() const
Definition: Canvas.cpp:356
osg::BoundingBox getBoundingBox() const
Definition: Canvas.cpp:659
bool attachFrame()
Definition: Canvas.cpp:776
Geometry class that defined strokes entered by a user. The creation and usage of this class must be f...
Definition: Stroke.h:62
void unselectEntities()
Definition: Canvas.cpp:493
osg::Vec3f getCenter3D() const
Definition: Canvas.cpp:207
osg::Vec3f getCenter2D() const
Definition: Canvas.cpp:623
An interface class that deals with entity::Stroke shader&#39;s state.
Definition: ProgramStroke.h:19
const std::vector< Entity2D * > & getEntitiesSelected() const
Definition: Canvas.cpp:598
unsigned int getNumPhotos() const
Definition: Canvas.cpp:1061
Geometry class that defines opacity polygons drawn by a user. The creation and usage of this class mu...
Definition: Polygon.h:47
osg::Vec3f getEntitiesSelectedCenter3D() const
Definition: Canvas.cpp:613
Definition: ProgramLineSegment.h:12
osg::Vec3f getBoundingBoxCenter3D() const
Definition: Canvas.cpp:632
Definition: Entity2D.h:13
void setVisibilityAll(bool vis)
Definition: Canvas.cpp:388
osg::Matrix getMatrixInverse() const
Definition: Canvas.cpp:192
entity::Photo * getPhoto(int row) const
Definition: Canvas.cpp:1081
osg::Vec3f getBoundingBoxCenter2D() const
Definition: Canvas.cpp:649
void scaleEntities(std::vector< Entity2D *> &entities, double sx, double sy, osg::Vec3f center)
Definition: Canvas.cpp:691
bool removeEntity(entity::Entity2D *entity)
Definition: Canvas.cpp:1158
void rotateEntitiesSelected(double theta)
Definition: Canvas.cpp:706
void rotate(const osg::Matrix &mr, const osg::Vec3f &c3d_new)
Definition: Canvas.cpp:440
entity::Polygon * getPolygon(int i) const
Definition: Canvas.cpp:1093
Settings is a configuration variables file for Cherish: enums, consts, defaults. Contains settings su...
void setColor(const osg::Vec4f &color, const osg::Vec4f &colorIntersection=cher::CANVAS_CLR_PREVIOUS)
Definition: Canvas.cpp:351
entity::Stroke * getStrokeCurrent() const
Definition: Canvas.cpp:523
virtual void initializeMasks()
Definition: Canvas.cpp:182
A tool to depict canvas bounding box in both its non-editable and editable states.
Definition: ToolGlobal.h:244
void unselectAll()
Definition: Canvas.cpp:486
void setStrokeCurrent(entity::Stroke *stroke)
Definition: Canvas.cpp:508
Quad that uses texture to represent a 2D photo in 3D space.
Definition: Photo.h:22
A convinience class that inherits full functionality of osg::Group except the methods that allow dire...
Definition: ProtectedGroup.h:17
void selectAllEntities()
Definition: Canvas.cpp:498
osg::Vec3f getEntitiesSelectedCenter2D() const
Definition: Canvas.cpp:618
entity::Canvas * clone() const
Definition: Canvas.cpp:828
const osg::Geometry * getGeometryPickable() const
Definition: Canvas.cpp:424
bool getVisibilityAll() const
Definition: Canvas.cpp:382
void translate(const osg::Matrix &mt)
Definition: Canvas.cpp:430
entity::Polygon * getPolygonCurrent() const
Definition: Canvas.cpp:544
osg::Vec3f getGlobalAxisU() const
Definition: Canvas.cpp:406
void moveEntities(std::vector< Entity2D *> &entities, double du, double dv)
Definition: Canvas.cpp:681
bool detachFrame()
Definition: Canvas.cpp:771
osg::Matrix getMatrix() const
Definition: Canvas.cpp:202
const osg::Vec3Array * getFrameVertices() const
Definition: Canvas.cpp:766
Abstract class for all the shaderized entities, i.e., strokes, polygons and line segments.
Definition: ShaderedEntity2D.h:18
void removeEntitySelected(entity::Entity2D *entity)
Definition: Canvas.cpp:593
entity::Canvas * separate()
Definition: Canvas.cpp:894
unsigned int getNumEntities() const
Definition: Canvas.cpp:1052
entity::Stroke * getStroke(int i) const
Definition: Canvas.cpp:1087
bool getModeEdit() const
Definition: Canvas.cpp:817
bool getVisibilityFrameInternal() const
Definition: Canvas.cpp:377
bool addToMeshGroup(osg::Group *group, osg::Node *mesh)
Definition: Canvas.cpp:797
void moveEntitiesSelected(double du, double dv)
Definition: Canvas.cpp:686
const entity::FrameTool * getToolFrame() const
Definition: Canvas.cpp:1047
Definition: SelectedGroup.h:14
void updateFrame(entity::Canvas *against=0)
Definition: Canvas.cpp:723