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