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