soc-2008-mxcurioni: first version of lib3ds code. It does NOT work yet and has to...
[blender.git] / source / blender / freestyle / intern / scene_graph / Rep.h
1 //
2 //  Filename         : Rep.h
3 //  Author(s)        : Stephane Grabli
4 //  Purpose          : Base class for all shapes. Inherits from BasicObjects 
5 //                     for references counter management (addRef, release).
6 //  Date of creation : 25/01/2002
7 //
8 ///////////////////////////////////////////////////////////////////////////////
9
10
11 //
12 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
13 //   with this source distribution. 
14 //
15 //  This program is free software; you can redistribute it and/or
16 //  modify it under the terms of the GNU General Public License
17 //  as published by the Free Software Foundation; either version 2
18 //  of the License, or (at your option) any later version.
19 //
20 //  This program is distributed in the hope that it will be useful,
21 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
22 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23 //  GNU General Public License for more details.
24 //
25 //  You should have received a copy of the GNU General Public License
26 //  along with this program; if not, write to the Free Software
27 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
28 //
29 ///////////////////////////////////////////////////////////////////////////////
30
31 #ifndef  REP_H
32 # define REP_H
33
34 # include "../system/BaseObject.h"
35 # include "SceneVisitor.h"
36 # include "../geometry/BBox.h"
37 # include "../geometry/Geom.h"
38 # include "../system/Precision.h"
39 # include "FrsMaterial.h"
40 # include "../system/Id.h"
41
42 using namespace Geometry;
43
44 class LIB_SCENE_GRAPH_EXPORT Rep : public BaseObject
45 {
46 public:
47   
48   inline Rep() : BaseObject() {_Id = 0; _FrsMaterial=0;}
49   inline Rep(const Rep& iBrother)
50     : BaseObject()
51   {
52     _Id = iBrother._Id;
53     if(0 == iBrother._FrsMaterial)
54       _FrsMaterial = 0;
55     else
56       _FrsMaterial = new FrsMaterial(*(iBrother._FrsMaterial));
57
58     _BBox = iBrother.bbox();
59   }
60         inline void swap(Rep& ioOther){
61                 std::swap(_BBox,ioOther._BBox);
62                 std::swap(_Id, ioOther._Id);
63                 std::swap(_FrsMaterial,ioOther._FrsMaterial);
64         }
65         Rep& operator=(const Rep& iBrother){
66                 if(&iBrother != this){
67                         _Id = iBrother._Id;
68                         if(0 == iBrother._FrsMaterial)
69                                 _FrsMaterial = 0;
70                         else{
71                                 if(_FrsMaterial == 0){
72                                         _FrsMaterial = new FrsMaterial(*iBrother._FrsMaterial);
73                                 }else{
74                                         (*_FrsMaterial)=(*(iBrother._FrsMaterial));
75                                 }
76                                 _BBox = iBrother.bbox();
77                         }
78                 }
79                 return *this;
80         }
81   virtual ~Rep() 
82   {
83     if(0 != _FrsMaterial)
84     {
85       delete _FrsMaterial;
86       _FrsMaterial = 0;
87     }
88   }
89
90   /*! Accept the corresponding visitor
91    *  Must be overload by 
92    *  inherited classes
93    */
94   virtual void accept(SceneVisitor& v) {
95     if(_FrsMaterial)
96       v.visitFrsMaterial(*_FrsMaterial);
97     v.visitRep(*this);
98   }
99
100   /*! Computes the rep bounding box.
101    *  Each Inherited rep must compute 
102    *  its bbox depending on the way the data
103    *  are stored. So, each inherited class 
104    *  must overload this method
105    */
106   virtual void ComputeBBox() = 0;
107   
108   /*! Returns the rep bounding box */
109   virtual const BBox<Vec3r>& bbox() const {return _BBox;}
110   inline Id getId() const {return _Id;}
111   inline const FrsMaterial * frs_material() const {return _FrsMaterial;}
112
113   /*! Sets the Rep bounding box */
114   virtual void setBBox(const BBox<Vec3r>& iBox) {_BBox = iBox;}
115   inline void setId(const Id& id) {_Id = id;}
116   inline void setFrsMaterial(const FrsMaterial& iMaterial) 
117   {
118     _FrsMaterial = new FrsMaterial(iMaterial);
119   }
120
121 private:
122   BBox<Vec3r> _BBox;
123   Id _Id;
124   FrsMaterial *_FrsMaterial;
125 };
126
127 #endif // REP_H