SceneGraphObject.cc

Go to the documentation of this file.
00001 #include <esg/SceneGraphObject.h>
00002 
00003 using namespace esg;
00004 
00005 bool SceneGraphObject::_have_private_geometry(void) const
00006 {
00007     return (_pGeometry && !_pAutoGeometry);
00008 }
00009 
00010 bool SceneGraphObject::_have_shared_geometry(void) const
00011 {
00012     return (_pGeometry && _pAutoGeometry);
00013 }
00014 
00015 bool SceneGraphObject::_have_geometry(void) const
00016 {
00017     return (_pGeometry || _pAutoGeometry);
00018 }
00019 
00020 bool SceneGraphObject::_have_private_emittance(void) const
00021 {
00022     return (_pEmittance && !_pAutoEmittance);
00023 }
00024 
00025 bool SceneGraphObject::_have_shared_emittance(void) const
00026 {
00027     return (_pEmittance && _pAutoEmittance);
00028 }
00029 
00030 bool SceneGraphObject::_have_emittance(void) const
00031 {
00032     return (_pEmittance || _pAutoEmittance);
00033 }
00034 
00035 bool SceneGraphObject::_have_private_diff_brdf(void) const
00036 {
00037     return (_pDiffuseBRDF && !_pAutoDiffuseBRDF);
00038 }
00039 
00040 bool SceneGraphObject::_have_shared_diff_brdf(void) const
00041 {
00042     return (_pDiffuseBRDF && _pAutoDiffuseBRDF);
00043 }
00044 
00045 bool SceneGraphObject::_have_private_spec_brdf(void) const
00046 {
00047     return (_pSpecularBRDF && !_pAutoSpecularBRDF);
00048 }
00049 
00050 bool SceneGraphObject::_have_shared_spec_brdf(void) const
00051 {
00052     return (_pSpecularBRDF && _pAutoSpecularBRDF);
00053 }
00054 
00055 bool SceneGraphObject::_have_diff_brdf(void) const
00056 {
00057     return (_pDiffuseBRDF || _pAutoDiffuseBRDF);
00058 }
00059 
00060 bool SceneGraphObject::_have_spec_brdf(void) const
00061 {
00062     return (_pSpecularBRDF || _pAutoSpecularBRDF);
00063 }
00064 
00065 bool SceneGraphObject::_have_private_transformation(void) const
00066 {
00067     return (_pTransformation && !_pAutoTransformation);
00068 }
00069 
00070 bool SceneGraphObject::_have_shared_transformation(void) const
00071 {
00072     return (_pTransformation && _pAutoTransformation);
00073 }
00074 
00075 bool SceneGraphObject::_have_transformation(void) const
00076 {
00077     return (_pTransformation || _pAutoTransformation);
00078 }
00079 
00080 bool SceneGraphObject::_have_private_texture(void) const
00081 {
00082     return (_pTexture && !_pAutoTexture);
00083 }
00084 
00085 bool SceneGraphObject::_have_shared_texture(void) const
00086 {
00087     return (_pTexture && _pAutoTexture);
00088 }
00089 
00090 bool SceneGraphObject::_have_texture(void) const
00091 {
00092     return (_pTexture || _pAutoTexture);
00093 }
00094 
00095 
00096 
00097 
00098 SceneGraphObject::SceneGraphObject(OID oid, const char * name)
00099     : _oid(oid),
00100       _tangible(false),
00101       _pAutoGeometry(NULL),
00102       _pGeometry(NULL),
00103       _pAutoEmittance(NULL),
00104       _pEmittance(NULL),
00105       _pAutoDiffuseBRDF(NULL),
00106       _pDiffuseBRDF(NULL),
00107       _pAutoSpecularBRDF(NULL),
00108       _pSpecularBRDF(NULL),
00109       _pAutoTransformation(NULL),
00110       _pTransformation(NULL),
00111       _pAutoTexture(NULL),
00112       _pTexture(NULL)
00113 
00114 {
00115     if (name) {
00116         _name = new char [strlen(name) + 1];
00117         strcpy(_name, name);
00118     } else
00119         _name = NULL;
00120 }
00121 
00122 SceneGraphObject::~SceneGraphObject()
00123 {
00124     if (_have_shared_geometry())
00125         AutoPtr<Geometry>::destroy(_pAutoGeometry, this);
00126     else
00127         if (_have_private_geometry())
00128             delete _pGeometry;
00129 
00130     if (_have_shared_emittance())
00131         AutoPtr<Emittance>::destroy(_pAutoEmittance, this);
00132     else
00133         if (_have_private_emittance())
00134             delete _pEmittance;
00135 
00136     if (_have_shared_diff_brdf())
00137         AutoPtr<DiffuseBRDF>::destroy(_pAutoDiffuseBRDF, this);
00138     else
00139         if (_have_private_diff_brdf())
00140             delete _pDiffuseBRDF;
00141 
00142     if (_have_shared_spec_brdf())
00143         AutoPtr<SpecularBRDF>::destroy(_pAutoSpecularBRDF, this);
00144     else
00145         if (_have_private_spec_brdf())
00146             delete _pSpecularBRDF;
00147 
00148     if (_have_shared_transformation())
00149         AutoPtr<Transform>::destroy(_pAutoTransformation, this);
00150     else
00151         if (_have_private_transformation())
00152             delete _pTransformation;
00153 
00154     if (_have_shared_texture())
00155         AutoPtr<Texture>::destroy(_pAutoTexture, this);
00156     else
00157         if (_have_private_texture())
00158             delete _pTexture;
00159 
00160     for (Material * a = _privateMaterials.firstItem();
00161          a;
00162          a = _privateMaterials.nextItem()) delete a;
00163 
00164     for (AutoPtr<Material> * a = _sharedMaterials.firstItem();
00165          a;
00166          a = _sharedMaterials.nextItem()) AutoPtr<Material>::destroy(a, this);
00167 
00168     for (SGAttribute * a = _privateAttributes.firstItem();
00169          a;
00170          a = _privateAttributes.nextItem()) delete a;
00171 
00172     for (AutoPtr<SGAttribute> * a = _sharedAttributes.firstItem();
00173          a;
00174          a = _sharedAttributes.nextItem())
00175         AutoPtr<SGAttribute>::destroy(a, this);
00176 
00177     if (_name) delete [] _name;
00178 }
00179 
00180 void SceneGraphObject::setSharedGeometry(AutoPtr<Geometry>* pO)
00181 {
00182     if (_have_private_geometry())
00183         delete _pGeometry;
00184     else
00185         if (_have_shared_geometry())
00186             AutoPtr<Geometry>::destroy(_pAutoGeometry, this);
00187 
00188     _pAutoGeometry = pO;
00189     _pGeometry     = NULL;
00190     
00191     if (_pAutoGeometry) {
00192         _pAutoGeometry->registerReferer(this);
00193         _pGeometry = _pAutoGeometry->origObject();
00194     }
00195 
00196     if (_pGeometry) _tangible = true;
00197 }
00198 
00199 void SceneGraphObject::setPrivateGeometry(Geometry* pO)
00200 {
00201     if (_have_private_geometry())
00202         delete _pGeometry;
00203     else
00204         if (_have_shared_geometry())
00205             AutoPtr<Geometry>::destroy(_pAutoGeometry, this);
00206     
00207     _pAutoGeometry = NULL;
00208     _pGeometry     = pO;
00209 
00210     if (_pGeometry) _tangible = true;
00211 }
00212 
00213 void SceneGraphObject::setSharedEmittance(AutoPtr<Emittance>* pO)
00214 {
00215     if (_have_private_emittance())
00216         delete _pEmittance;
00217     else
00218         if (_have_shared_emittance())
00219             AutoPtr<Emittance>::destroy(_pAutoEmittance, this);
00220 
00221     _pAutoEmittance = pO;
00222     _pEmittance     = NULL;
00223     
00224     if (_pAutoEmittance) {
00225         _pAutoEmittance->registerReferer(this);
00226         _pEmittance = _pAutoEmittance->origObject();
00227     }
00228 }
00229 
00230 void SceneGraphObject::setPrivateEmittance(Emittance* pO)
00231 {
00232     if (_have_private_emittance())
00233         delete _pEmittance;
00234     else
00235         if (_have_shared_emittance())
00236             AutoPtr<Emittance>::destroy(_pAutoEmittance, this);
00237     
00238     _pAutoEmittance = NULL;
00239     _pEmittance     = pO;
00240 }
00241 
00242 void SceneGraphObject::setSharedDiffuseBRDF(AutoPtr<DiffuseBRDF>* pO)
00243 {
00244     if (_have_private_diff_brdf())
00245         delete _pDiffuseBRDF;
00246     else
00247         if (_have_shared_diff_brdf())
00248             AutoPtr<DiffuseBRDF>::destroy(_pAutoDiffuseBRDF, this);
00249 
00250     _pAutoDiffuseBRDF = pO;
00251     _pDiffuseBRDF     = NULL;
00252     
00253     if (_pAutoDiffuseBRDF) {
00254         _pAutoDiffuseBRDF->registerReferer(this);
00255         _pDiffuseBRDF = _pAutoDiffuseBRDF->origObject();
00256     }
00257 }
00258 
00259 void SceneGraphObject::setPrivateDiffuseBRDF(DiffuseBRDF* pO)
00260 {
00261     if (_have_private_diff_brdf()) delete _pDiffuseBRDF;
00262     else if (_have_shared_diff_brdf())
00263         AutoPtr<DiffuseBRDF>::destroy(_pAutoDiffuseBRDF, this);
00264     
00265     _pAutoDiffuseBRDF = NULL;
00266     _pDiffuseBRDF     = pO;
00267 }
00268 
00269 void SceneGraphObject::setSharedSpecularBRDF(AutoPtr<SpecularBRDF>* pO)
00270 {
00271     if (_have_private_spec_brdf())
00272         delete _pSpecularBRDF;
00273     else
00274         if (_have_shared_spec_brdf())
00275             AutoPtr<SpecularBRDF>::destroy(_pAutoSpecularBRDF, this);
00276 
00277     _pAutoSpecularBRDF = pO;
00278     _pSpecularBRDF     = NULL;
00279     
00280     if (_pAutoSpecularBRDF) {
00281         _pAutoSpecularBRDF->registerReferer(this);
00282         _pSpecularBRDF = _pAutoSpecularBRDF->origObject();
00283     }
00284 }
00285 
00286 void SceneGraphObject::setPrivateSpecularBRDF(SpecularBRDF* pO)
00287 {
00288     if (_have_private_spec_brdf()) delete _pSpecularBRDF;
00289     else if (_have_shared_spec_brdf())
00290         AutoPtr<SpecularBRDF>::destroy(_pAutoSpecularBRDF, this);
00291     
00292     _pAutoSpecularBRDF = NULL;
00293     _pSpecularBRDF     = pO;
00294 }
00295 
00296 void SceneGraphObject::setSharedTransformation(AutoPtr<Transform>* pO)
00297 {
00298     if (_have_private_transformation())
00299         delete _pTransformation;
00300     else
00301         if (_have_shared_transformation())
00302             AutoPtr<Transform>::destroy(_pAutoTransformation, this);
00303 
00304     _pAutoTransformation = pO;
00305     _pTransformation     = NULL;
00306     
00307     if (_pAutoTransformation) {
00308         _pAutoTransformation->registerReferer(this);
00309         _pTransformation = _pAutoTransformation->origObject();
00310     }
00311 }
00312 
00313 void SceneGraphObject::setPrivateTransformation(Transform* pO)
00314 {
00315     if (_have_private_transformation())
00316         delete _pTransformation;
00317     else
00318         if (_have_shared_transformation())
00319             AutoPtr<Transform>::destroy(_pAutoTransformation, this);
00320     
00321     _pAutoTransformation = NULL;
00322     _pTransformation     = pO;
00323 }
00324 
00325 void SceneGraphObject::setSharedTexture(AutoPtr<Texture>* pO)
00326 {
00327     if (_have_private_texture())
00328         delete _pTexture;
00329     else
00330         if (_have_shared_texture())
00331             AutoPtr<Texture>::destroy(_pAutoTexture, this);
00332 
00333     _pAutoTexture = pO;
00334     _pTexture     = NULL;
00335     
00336     if (_pAutoTexture) {
00337         _pAutoTexture->registerReferer(this);
00338         _pTexture = _pAutoTexture->origObject();
00339     }
00340 }
00341 
00342 void SceneGraphObject::setPrivateTexture(Texture* pO)
00343 {
00344     if (_have_private_texture())
00345         delete _pTexture;
00346     else
00347         if (_have_shared_texture())
00348             AutoPtr<Texture>::destroy(_pAutoTexture, this);
00349     
00350     _pAutoTexture = NULL;
00351     _pTexture     = pO;
00352 }
00353 
00354 void SceneGraphObject::appendSharedMaterial(AutoPtr<Material>* a)
00355 {
00356     if (!a) return;
00357     a->registerReferer(this);
00358     _sharedMaterials.append(a);
00359 }
00360 
00361 void  SceneGraphObject::appendPrivateMaterial(Material * a)
00362 {
00363     _privateMaterials.append(a);
00364 }
00365 
00366 void SceneGraphObject::appendSharedAttribute(AutoPtr<SGAttribute>* a)
00367 {
00368     if (!a) return;
00369     a->registerReferer(this);
00370     _sharedAttributes.append(a);
00371 }
00372 
00373 void  SceneGraphObject::appendPrivateAttribute(SGAttribute * a)
00374 {
00375     _privateAttributes.append(a);
00376 }
00377 
00378 void SceneGraphObject::inspectMaterials(Visitor& v)
00379 {
00380     for (Material * a = _privateMaterials.firstItem();
00381          a;
00382          a = _privateMaterials.nextItem()) a->acceptVisitor(v);
00383 
00384     for (AutoPtr<Material> * a = _sharedMaterials.firstItem();
00385          a;
00386          a = _sharedMaterials.nextItem()) a->origObject()->acceptVisitor(v);
00387 }
00388 
00389 void SceneGraphObject::inspectAttributes(Visitor& v)
00390 {
00391     for (SGAttribute * a = _privateAttributes.firstItem();
00392          a;
00393          a = _privateAttributes.nextItem()) a->acceptVisitor(v);
00394 
00395     for (AutoPtr<SGAttribute> * a = _sharedAttributes.firstItem();
00396          a;
00397          a = _sharedAttributes.nextItem()) a->origObject()->acceptVisitor(v);
00398 }
00399 

Generated on Wed Jun 28 12:24:32 2006 for esg by  doxygen 1.4.6