1
/*=========================================================================
3
Program: Ionization FRont Interactive Tool (IFRIT)
7
Copyright (c) 2002-2006 Nick Gnedin
10
This file may be distributed and/or modified under the terms of the
11
GNU General Public License version 2 as published by the Free Software
12
Foundation and appearing in the file LICENSE.GPL included in the
13
packaging of this file.
15
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
16
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR
19
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
21
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
22
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
23
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
=========================================================================*/
29
// A small Set of common functionality for all IFrIT viewization objects
32
#ifndef IVIEWSUBJECT_H
33
#define IVIEWSUBJECT_H
37
#include "idataconsumer.h"
38
#include "ireplicated.h"
39
#include "ideletable.h"
43
#include "iposition.h"
50
class iViewSubjectObserver;
51
class iViewSubjectPipeline;
52
class iViewSubjectReplicator;
56
// Useful macro to declare all keys that have to be present in children too
58
#define IVIEWSUBJECT_DECLARE_INHERITED_KEYS \
59
static const iObjectKey& KeyDataType(); \
60
static const iObjectKey& KeyClipPlane(); \
61
static const iObjectKey& KeyShading(); \
62
static const iObjectKey& KeyAmbient(); \
63
static const iObjectKey& KeyDiffuse(); \
64
static const iObjectKey& KeySpecular(); \
65
static const iObjectKey& KeySpecularPower(); \
66
static const iObjectKey& KeyNumReplicas(); \
67
static const iObjectKey& KeyVisible(); \
68
static const iObjectKey& KeyDataPresent(); \
69
static const iObjectKey& KeyReady()
72
class iViewSubject : public iObject, public iDataConsumer, public iReplicated, public iDeletable
75
friend class iControlModule;
76
friend class iViewObject;
80
IOBJECT_DECLARE_SELF(iViewSubject,iObject);
82
virtual void Delete();
83
static const iObjectType& Type();
85
IVIEWSUBJECT_DECLARE_INHERITED_KEYS;
87
inline bool GetClipPlane() const { return mClipPlaneOn; }
89
void SetShading(bool);
90
inline bool GetShading() const { return mShading; }
92
void SetAmbient(float v);
93
inline float GetAmbient() const { return mAmbient; }
95
void SetDiffuse(float v);
96
inline float GetDiffuse() const { return mDiffuse; }
98
void SetSpecular(float v);
99
inline float GetSpecular() const { return mSpecular; }
101
void SetSpecularPower(float v);
102
inline float GetSpecularPower() const { return mSpecularPower; }
104
virtual void UpdateMaterialProperties() = 0;
106
virtual void ShowClipPlane(bool s) = 0;
107
virtual void ShowColorBars(bool s) = 0;
109
virtual bool IsInitialized() const { return mIsInitialized; }
110
virtual bool IsVisible() const = 0;
111
virtual const iObjectType& RealType();
112
bool IsReady() const;
115
virtual void Reset() = 0;
117
virtual float GetMemorySize() const;
119
inline int GetObjectType() const { return mObjectType; }
120
inline const iString& GetObjectName() const { return mObjectName; }
122
inline const iPosition& GetPosition() const { return mPosition; }
123
inline iViewSubjectReplicator* GetReplicator() const { return mReplicator; }
125
virtual void UpdateAfterMarkerMove(){}
126
virtual void UpdateAfterMarkerAdd(iMarker *){}
127
virtual void UpdateAfterMarkerDelete(iMarker *);
129
virtual bool CanBeShown() const = 0;
131
iDataLimits* GetLimits() const;
134
// Pipeline operation
136
inline bool IsCreatingMainPipeline() const { return mCreatingMainPipeline; }
137
virtual iViewSubjectPipeline* CreatePipeline(int id);
139
void RemoveInternalData();
144
iViewSubject(iViewModule *vm, const iDataType &type, const iString &name, unsigned int flags);
145
virtual ~iViewSubject();
146
virtual void ConfigureBody() = 0; // Create and attach pipelines here. This will be called automatically by the factory.
147
virtual void ConfigureMainPipeline(iViewSubjectPipeline *p, int id);
149
void AddMainPipeline(int numInputs);
150
virtual iViewSubjectPipeline* CreateMainPipeline(int numInputs, int id); // can be overwritten to create custom pipelines
151
inline iViewSubjectPipeline* Pipeline(int n = 0) const { return mPipelines[n]; } // will automatically return zero if out-of-bounds
152
virtual void RemoveInternalDataForExtraComponents();
154
virtual void ViewSubjectPackStateBody(iString &s) const = 0;
155
virtual void ViewSubjectUnPackStateBody(const iString &s) = 0;
157
virtual void FinishInitialization(){}
158
virtual void SyncWithDataBody(const iDataSyncRequest &r);
159
virtual void ViewSubjectSyncWithData(const iDataSyncRequest &r) = 0;
160
virtual void UpdateReplicas();
162
virtual void ShowBody(bool s) = 0;
164
virtual float GetExtraMemorySize() const;
169
bool mCreatingMainPipeline;
171
iViewSubjectObserver *mObjectObserver;
172
iViewSubjectReplicator *mReplicator;
174
int mObjectType, mAttachedMarkerIndex;
177
bool mIsInitialized, mIsConfigured;
179
const bool mAlwaysShaded, mNoReplicating;
181
iMarker *mAttachedMarker;
184
// Material properties
190
float mSpecularPower;
192
iColor mDefaultColor;
197
// make it private so that it can only be created by AddMainPipeline calls
199
iArray<iViewSubjectPipeline*> mPipelines;
201
virtual void PackStateBody(iString &s) const;
202
virtual void UnPackStateBody(const iString &s);
207
// Useful macros to declare all members that have to be overwritten in children
209
#define IVIEWSUBJECT_DEFINE_TYPE(_type_,_fname_,_sname_) \
210
IOBJECT_DEFINE_TYPE(_type_,_fname_,_sname_,iObjectType::_Visual); \
211
const iObjectType& _type_::RealType(){ return _type_::Type(); }
213
#define IVIEWSUBJECT_DECLARE_INHERITED_MEMBERS \
214
virtual void UpdateMaterialProperties(); \
215
virtual void Reset(); \
216
virtual void ShowClipPlane(bool s); \
217
virtual void ShowColorBars(bool s); \
218
virtual float GetMemorySize() const; \
219
virtual bool IsVisible() const; \
220
virtual bool CanBeShown() const; \
222
virtual void ViewSubjectPackStateBody(iString &s) const; \
223
virtual void ViewSubjectUnPackStateBody(const iString &s); \
224
virtual void ViewSubjectSyncWithData(const iDataSyncRequest &r); \
225
virtual void ShowBody(bool s); \
227
virtual const iObjectType& RealType()
229
#define IVIEWSUBJECT_DEFINE_INHERITED_KEYS_COMMON(_type_) \
230
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,DataType,dt,Int,1); \
231
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,ClipPlane,cp,Bool,1); \
232
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,Ambient,ma,Float,1); \
233
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,Diffuse,md,Float,1); \
234
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,Specular,ms,Float,1); \
235
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,SpecularPower,mp,Float,1); \
236
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,Visible,vis,Bool,1); \
237
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,DataPresent,dp,Bool,1); \
238
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,Ready,r,Bool,1)
240
#define IVIEWSUBJECT_DEFINE_INHERITED_KEYS_SHADING(_type_) \
241
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,Shading,mh,Bool,1)
243
#define IVIEWSUBJECT_DEFINE_INHERITED_KEYS_REPLICATING(_type_) \
244
IOBJECT_DEFINE_INHERITED_KEY(iViewSubject,_type_,NumReplicas,nr,Int,6)
246
#endif // IVIEWSUBJECT_H