00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include "CaelumPrecompiled.h"
00022 #include "CaelumPrerequisites.h"
00023
00024 #if CAELUM_SCRIPT_SUPPORT
00025
00026 #include "CaelumScriptTranslator.h"
00027 #include "CaelumSystem.h"
00028 #include "CaelumExceptions.h"
00029
00030 using namespace Ogre;
00031
00032 namespace Caelum
00033 {
00034 PropScriptResource::PropScriptResource
00035 (
00036 Ogre::ResourceManager* creator, const Ogre::String& name, Ogre::ResourceHandle handle,
00037 const Ogre::String& group, bool isManual, Ogre::ManualResourceLoader* loader
00038 ):
00039 Ogre::Resource (creator, name, handle, group, isManual, loader)
00040 {
00041
00042
00043 }
00044
00045 PropScriptResource::~PropScriptResource() {
00046
00047
00048 }
00049
00050 PropScriptResourceManager::PropScriptResourceManager() {
00051 mLoadOrder = 1000;
00052 mResourceType = "PropertyScript";
00053 }
00054
00055 PropScriptResource* PropScriptResourceManager::createImpl(
00056 const String& name, ResourceHandle handle, const String& group,
00057 bool isManual, ManualResourceLoader* loader, const NameValuePairList* createParams)
00058 {
00059
00060
00061 return new PropScriptResource (this, name, handle, group, isManual, loader);
00062 }
00063
00064 TypeDescriptorScriptTranslator::TypeDescriptorScriptTranslator (TypeDescriptor* typeDescriptor):
00065 mTypeDescriptor(typeDescriptor)
00066 {
00067 }
00068
00069 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00070 ScriptCompiler* compiler,
00071 PropertyAbstractNode* prop,
00072 bool& value)
00073 {
00074 if (prop->values.empty ()) {
00075 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00076 return false;
00077 }
00078 if (prop->values.size () > 1) {
00079 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00080 prop->name + " must have at most 1 argument");
00081 return false;
00082 }
00083 if (!Ogre::ScriptTranslator::getBoolean(prop->values.front(), &value)) {
00084 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00085 prop->values.front()->getValue() + " is not a valid number");
00086 return false;
00087 }
00088 return true;
00089 }
00090
00091 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00092 ScriptCompiler* compiler,
00093 PropertyAbstractNode* prop,
00094 ColourValue& value)
00095 {
00096 if (prop->values.empty ()) {
00097 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00098 return false;
00099 }
00100 if (prop->values.size () > 4) {
00101 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00102 prop->name + " must have at most 4 arguments");
00103 return false;
00104 }
00105 if (prop->values.size () < 3) {
00106 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00107 prop->name + " must have at least 3 arguments");
00108 }
00109 if (!getColour(prop->values.begin(), prop->values.end(), &value)) {
00110 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00111 prop->name + " requires a colour argument");
00112 }
00113 return true;
00114 }
00115
00116 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00117 ScriptCompiler* compiler,
00118 PropertyAbstractNode* prop,
00119 float& value)
00120 {
00121 if (prop->values.empty ()) {
00122 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00123 return false;
00124 }
00125 if (prop->values.size () > 1) {
00126 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00127 prop->name + " must have at most 1 argument");
00128 return false;
00129 }
00130 if (!Ogre::ScriptTranslator::getFloat(prop->values.front(), &value)) {
00131 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00132 prop->values.front()->getValue() + " is not a valid number");
00133 return false;
00134 }
00135 return true;
00136 }
00137
00138 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00139 ScriptCompiler* compiler,
00140 PropertyAbstractNode* prop,
00141 int& value)
00142 {
00143 if (prop->values.empty ()) {
00144 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00145 return false;
00146 }
00147 if (prop->values.size () > 1) {
00148 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00149 prop->name + " must have at most 1 argument");
00150 return false;
00151 }
00152 if (!Ogre::ScriptTranslator::getInt(prop->values.front(), &value)) {
00153 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00154 prop->values.front()->getValue() + " is not a valid integer");
00155 return false;
00156 }
00157 return true;
00158 }
00159
00160 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00161 ScriptCompiler* compiler,
00162 PropertyAbstractNode* prop,
00163 double& value)
00164 {
00165 if (prop->values.empty ()) {
00166 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00167 return false;
00168 }
00169 if (prop->values.size () > 1) {
00170 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00171 prop->name + " must have at most 1 argument");
00172 return false;
00173 }
00174
00175 std::stringstream strStream (std::string(prop->values.front()->getValue()));
00176 strStream >> value;
00177 if (strStream.fail()) {
00178 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00179 prop->values.front()->getValue() + " is not a valid number");
00180 return false;
00181 }
00182 return true;
00183 }
00184
00185 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00186 ScriptCompiler* compiler,
00187 PropertyAbstractNode* prop,
00188 Ogre::Degree& value)
00189 {
00190 if (prop->values.size () == 0) {
00191 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00192 return false;
00193 }
00194 if (prop->values.size () > 3) {
00195 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00196 prop->name + " must have at most 3 arguments");
00197 return false;
00198 }
00199
00200 float degMinSec[3] = { 0, 0, 0 };
00201 int k = 0;
00202 for (AbstractNodeList::const_iterator it = prop->values.begin(), endIt = prop->values.end(); it != endIt; ++it, ++k) {
00203 if (!Ogre::ScriptTranslator::getFloat(*it, °MinSec[k])) {
00204 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00205 (*it)->getValue () + " is not a valid number");
00206 return false;
00207 }
00208 }
00209 value = Ogre::Degree(degMinSec[0] + degMinSec[1] / 60.0 + degMinSec[2] / 3600);
00210 return true;
00211 }
00212
00213 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00214 ScriptCompiler* compiler,
00215 PropertyAbstractNode* prop,
00216 Ogre::String& value)
00217 {
00218 if (prop->values.size () == 0) {
00219 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00220 return false;
00221 }
00222 if (prop->values.size () > 1) {
00223 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00224 prop->name + " must have at most 1 arguments");
00225 return false;
00226 }
00227 if (!Ogre::ScriptTranslator::getString(prop->values.front(), &value)) {
00228 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00229 prop->values.front()->getValue() + " is not a valid string");
00230 return false;
00231 }
00232 return true;
00233 }
00234
00235 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00236 ScriptCompiler* compiler,
00237 PropertyAbstractNode* prop,
00238 Ogre::Vector3& value)
00239 {
00240 if (prop->values.size () == 0) {
00241 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00242 return false;
00243 }
00244 if (prop->values.size () > 3) {
00245 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00246 prop->name + " must have at most 3 arguments");
00247 return false;
00248 }
00249 float floats[3];
00250 if (!Ogre::ScriptTranslator::getFloats(prop->values.begin(), prop->values.end(), floats, 3)) {
00251 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00252 "incorrect vector parameters.");
00253 return false;
00254 }
00255 value.x = floats[0];
00256 value.y = floats[1];
00257 value.z = floats[2];
00258 return true;
00259 }
00260
00261 bool TypeDescriptorScriptTranslator::getPropValueOrAddError (
00262 ScriptCompiler* compiler,
00263 PropertyAbstractNode* prop,
00264 Ogre::Vector2& value)
00265 {
00266 if (prop->values.size () == 0) {
00267 compiler->addError (ScriptCompiler::CE_STRINGEXPECTED, prop->file, prop->line);
00268 return false;
00269 }
00270 if (prop->values.size () > 2) {
00271 compiler->addError (ScriptCompiler::CE_FEWERPARAMETERSEXPECTED, prop->file, prop->line,
00272 prop->name + " must have at most 3 arguments");
00273 return false;
00274 }
00275 float floats[2];
00276 if (!Ogre::ScriptTranslator::getFloats(prop->values.begin(), prop->values.end(), floats, 2)) {
00277 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line,
00278 "incorrect vector parameters.");
00279 return false;
00280 }
00281 value.x = floats[0];
00282 value.y = floats[1];
00283 return true;
00284 }
00285
00286 template<class T>
00287 static bool tryHandlePropertyType (
00288 ScriptCompiler* compiler, PropertyAbstractNode* propNode,
00289 void* targetObject, const ValuePropertyDescriptor* propDesc)
00290 {
00291 if (propDesc->getValueTypeId () == typeid(T)) {
00292 T val;
00293 if (TypeDescriptorScriptTranslator::getPropValueOrAddError (compiler, propNode, val)) {
00294 propDesc->setValue (targetObject, Ogre::Any(val));
00295 }
00296 return true;
00297 }
00298 return false;
00299 }
00300
00301 void TypeDescriptorScriptTranslator::translateProperty (
00302 ScriptCompiler* compiler,
00303 PropertyAbstractNode* prop,
00304 void* targetObject,
00305 const TypeDescriptor* typeDescriptor)
00306 {
00307 const ValuePropertyDescriptor* propDesc = typeDescriptor->getPropertyDescriptor (prop->name);
00308 if (!propDesc) {
00309 compiler->addError (ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
00310 "property \"" + prop->name + "\" not recognized; missing from type descriptor.");
00311 return;
00312 }
00313 if (!propDesc->canSetValue ()) {
00314 compiler->addError (ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
00315 "property \"" + prop->name + "\" is read-only and can't be set from a script.");
00316 return;
00317 }
00318
00319
00320
00321
00322 bool handled = false
00323 || tryHandlePropertyType<int> (compiler, prop, targetObject, propDesc)
00324 || tryHandlePropertyType<float> (compiler, prop, targetObject, propDesc)
00325 || tryHandlePropertyType<double> (compiler, prop, targetObject, propDesc)
00326 || tryHandlePropertyType<bool> (compiler, prop, targetObject, propDesc)
00327 || tryHandlePropertyType<Ogre::Degree> (compiler, prop, targetObject, propDesc)
00328 || tryHandlePropertyType<Ogre::String> (compiler, prop, targetObject, propDesc)
00329 || tryHandlePropertyType<Ogre::Vector3> (compiler, prop, targetObject, propDesc)
00330 || tryHandlePropertyType<Ogre::Vector2> (compiler, prop, targetObject, propDesc)
00331 || tryHandlePropertyType<Ogre::ColourValue> (compiler, prop, targetObject, propDesc);
00332
00333 if (!handled) {
00334 compiler->addError (ScriptCompiler::CE_UNEXPECTEDTOKEN, prop->file, prop->line,
00335 "property \"" + prop->name + "\" is found in type descriptor but has "
00336 "unsupported type. Mangled typeid is '" + propDesc->getValueTypeId().name() + "'");
00337 }
00338 }
00339
00340 void TypeDescriptorScriptTranslator::translate (ScriptCompiler* compiler, const AbstractNodePtr& node)
00341 {
00342
00343
00344
00345 assert (getTypeDescriptor () && "Type descriptor must be set before we can translate.");
00346
00347
00348 ObjectAbstractNode *objNode = reinterpret_cast<ObjectAbstractNode*>(node.get());
00349 assert (!objNode->context.isEmpty ());
00350 void* targetObject = any_cast<void*> (objNode->context);
00351 assert (targetObject);
00352
00353 for (AbstractNodeList::iterator i = objNode->children.begin(); i != objNode->children.end(); ++i)
00354 {
00355 if ((*i)->type == ANT_PROPERTY)
00356 {
00357 PropertyAbstractNode *prop = reinterpret_cast<PropertyAbstractNode*>((*i).get());
00358
00359 translateProperty (compiler, prop, targetObject, getTypeDescriptor());
00360 }
00361 else if((*i)->type == ANT_OBJECT)
00362 {
00363 compiler->addError (ScriptCompiler::CE_INVALIDPARAMETERS, (*i)->file, (*i)->line);
00364 }
00365 }
00366
00367
00368 }
00369
00370 CaelumSystemScriptTranslator::CaelumSystemScriptTranslator ():
00371 mResourceManager(false),
00372 mTranslationTarget(0),
00373 mTranslationTargetFound(false),
00374 mTypeDescriptor(0)
00375 {
00376 }
00377
00378 void CaelumSystemScriptTranslator::setTranslationTarget (CaelumSystem* target, const Ogre::String& name)
00379 {
00380 assert (target != 0);
00381 this->mTranslationTarget = target;
00382 this->mTranslationTargetName = name;
00383 this->mTranslationTargetFound = false;
00384 }
00385
00386 void CaelumSystemScriptTranslator::clearTranslationTarget () {
00387 this->mTranslationTarget = 0;
00388 this->mTranslationTargetName.clear();
00389 this->mTranslationTargetFound = false;
00390 }
00391
00392 void CaelumSystemScriptTranslator::translate (ScriptCompiler* compiler, const AbstractNodePtr& node)
00393 {
00394
00395
00396 ObjectAbstractNode *objNode = reinterpret_cast<ObjectAbstractNode*>(node.get());
00397
00398 CaelumSystem* sys = 0;
00399
00400
00401 if (this->getTranslationTarget ()) {
00402 sys = this->getTranslationTarget ();
00403
00404
00405 if (this->getTranslationTargetName () != objNode->name) {
00406
00407
00408 return;
00409 }
00410
00411
00412
00413
00414
00415 sys->clear();
00416
00417
00418
00419 mTranslationTargetFound = true;
00420 } else if (this->getResourceManager ()) {
00421
00422
00423
00424 PropScriptResourceManager* mgr = this->getResourceManager ();
00425 ResourcePtr resource = mgr->create (objNode->name, compiler->getResourceGroup());
00426 resource->_notifyOrigin (objNode->file);
00427 return;
00428 }
00429
00430 objNode->context = sys;
00431
00432 for (AbstractNodeList::iterator i = objNode->children.begin(); i != objNode->children.end(); ++i)
00433 {
00434 if ((*i)->type == ANT_PROPERTY)
00435 {
00436 PropertyAbstractNode *prop = reinterpret_cast<PropertyAbstractNode*>((*i).get());
00437
00438
00439 TypeDescriptorScriptTranslator::translateProperty(
00440 compiler, prop,
00441 static_cast<void*>(sys),
00442 getTypeDescriptor ());
00443 }
00444 else if((*i)->type == ANT_OBJECT)
00445 {
00446 ObjectAbstractNode *childObjNode = reinterpret_cast<ObjectAbstractNode*>((*i).get());
00447
00448
00449
00450
00451
00452
00453
00454
00455 if (childObjNode->name.empty () == false || childObjNode->base.empty () == false) {
00456 compiler->addError (
00457 ScriptCompiler::CE_FEWERPARAMETERSEXPECTED,
00458 childObjNode->file, childObjNode->line,
00459 "caelum_sky_system components can't have names or bases");
00460 continue;
00461 }
00462 const String& className = childObjNode->cls;
00463
00464 try {
00465 if (className == "sun") {
00466 sys->setSun (new Sun (sys->getSceneMgr (), sys->getCaelumCameraNode ()));
00467 childObjNode->context = static_cast<void*> (sys->getSun ());
00468 } else if (className == "sky_dome") {
00469 sys->setSkyDome (new SkyDome (sys->getSceneMgr (), sys->getCaelumCameraNode ()));
00470 childObjNode->context = static_cast<void*>(sys->getSkyDome ());
00471 } else if (className == "moon") {
00472 sys->setMoon (new Moon (sys->getSceneMgr (), sys->getCaelumCameraNode ()));
00473 childObjNode->context = static_cast<void*>(sys->getMoon ());
00474 } else if (className == "ground_fog") {
00475 sys->setGroundFog (new GroundFog (sys->getSceneMgr (), sys->getCaelumCameraNode ()));
00476 childObjNode->context = static_cast<void*>(sys->getGroundFog ());
00477 } else if (className == "depth_composer") {
00478 sys->setDepthComposer (new DepthComposer (sys->getSceneMgr ()));
00479 childObjNode->context = static_cast<void*>(sys->getDepthComposer ());
00480 } else if (className == "point_starfield") {
00481 sys->setPointStarfield (new PointStarfield (sys->getSceneMgr (), sys->getCaelumCameraNode()));
00482 childObjNode->context = static_cast<void*>(sys->getPointStarfield ());
00483 } else if (className == "precipitation") {
00484 sys->setPrecipitationController (new PrecipitationController (sys->getSceneMgr ()));
00485 childObjNode->context = static_cast<void*>(sys->getPrecipitationController ());
00486 } else if (className == "cloud_system") {
00487 sys->setCloudSystem (new CloudSystem (sys->getSceneMgr (), sys->getCaelumGroundNode ()));
00488 childObjNode->context = static_cast<void*>(sys->getCloudSystem ());
00489 } else {
00490 LogManager::getSingleton ().logMessage ("CaelumSystemScriptTranslator::translate "
00491 "unknown child object class '" + className + "'");
00492 }
00493 } catch (Caelum::UnsupportedException& ex) {
00494
00495
00496
00497
00498 compiler->addError (
00499 ScriptCompiler::CE_UNSUPPORTEDBYRENDERSYSTEM,
00500 childObjNode->file, childObjNode->line,
00501 "Failed to create component \"" + className + "\": " + ex.getFullDescription ());
00502 continue;
00503 }
00504 processNode (compiler, *i);
00505 }
00506 }
00507
00508
00509 }
00510
00511 void CloudSystemScriptTranslator::translate (ScriptCompiler* compiler, const AbstractNodePtr& node)
00512 {
00513
00514
00515 ObjectAbstractNode *objNode = reinterpret_cast<ObjectAbstractNode*>(node.get());
00516 assert (!objNode->context.isEmpty ());
00517 void* rawTargetObject = any_cast<void*> (objNode->context);
00518 assert (rawTargetObject);
00519
00520 CloudSystem* target = static_cast<CloudSystem*>(rawTargetObject);
00521
00522 for (AbstractNodeList::iterator i = objNode->children.begin(); i != objNode->children.end(); ++i)
00523 {
00524 if ((*i)->type == ANT_PROPERTY)
00525 {
00526 compiler->addError (
00527 ScriptCompiler::CE_INVALIDPARAMETERS,
00528 objNode->file, objNode->line,
00529 "cloud_system doesn't have any properties");
00530 }
00531 else if((*i)->type == ANT_OBJECT)
00532 {
00533 ObjectAbstractNode *childObjNode = reinterpret_cast<ObjectAbstractNode*>((*i).get());
00534
00535
00536
00537
00538
00539
00540
00541
00542
00543 const Ogre::String& className = childObjNode->cls;
00544
00545 if (className == "cloud_layer") {
00546
00547 if (childObjNode->base.empty () == false) {
00548 compiler->addError (
00549 ScriptCompiler::CE_FEWERPARAMETERSEXPECTED,
00550 childObjNode->file, childObjNode->line,
00551 "cloud_layer can't have a base");
00552 continue;
00553 }
00554
00555 target->createLayerAtHeight (0);
00556 FlatCloudLayer* layer = target->getLayer (target->getLayerCount () - 1);
00557
00558
00559
00560 childObjNode->context = static_cast<void*>(layer);
00561 } else {
00562 LogManager::getSingleton ().logMessage ("CloudSystemScriptTranslator::translate "
00563 "unknown child object class '" + className + "'");
00564 }
00565 processNode (compiler, *i);
00566 }
00567 }
00568
00569
00570 }
00571
00572 CaelumScriptTranslatorManager::CaelumScriptTranslatorManager
00573 (
00574 CaelumDefaultTypeDescriptorData* typeData
00575 ):
00576 mCaelumSystemTranslator(),
00577 mCloudSystemTranslator(),
00578 mFlatCloudLayerTranslator(typeData->FlatCloudLayerTypeDescriptor),
00579 mSunTranslator(typeData->BaseSkyLightTypeDescriptor),
00580 mMoonTranslator(typeData->BaseSkyLightTypeDescriptor),
00581 mPointStarfieldTranslator(typeData->PointStarfieldTypeDescriptor),
00582 mGroundFogTranslator(typeData->GroundFogTypeDescriptor),
00583 mDepthComposerTranslator(typeData->DepthComposerTypeDescriptor),
00584 mPrecipitationTranslator(typeData->PrecipitationTypeDescriptor),
00585 mSkyDomeTranslator(typeData->SkyDomeTypeDescriptor)
00586 {
00587 mCaelumSystemTranslator.setTypeDescriptor(typeData->CaelumSystemTypeDescriptor);
00588
00589
00590 mTranslatorMap.insert (std::make_pair ("caelum_sky_system", &mCaelumSystemTranslator));
00591 mTranslatorMap.insert (std::make_pair ("cloud_system", &mCloudSystemTranslator));
00592 mTranslatorMap.insert (std::make_pair ("cloud_layer", &mFlatCloudLayerTranslator));
00593 mTranslatorMap.insert (std::make_pair ("sun", &mSunTranslator));
00594 mTranslatorMap.insert (std::make_pair ("moon", &mMoonTranslator));
00595 mTranslatorMap.insert (std::make_pair ("point_starfield", &mPointStarfieldTranslator));
00596 mTranslatorMap.insert (std::make_pair ("ground_fog", &mGroundFogTranslator));
00597 mTranslatorMap.insert (std::make_pair ("depth_composer", &mDepthComposerTranslator));
00598 mTranslatorMap.insert (std::make_pair ("precipitation", &mPrecipitationTranslator));
00599 mTranslatorMap.insert (std::make_pair ("sky_dome", &mSkyDomeTranslator));
00600 }
00601
00602 size_t CaelumScriptTranslatorManager::getNumTranslators () const {
00603
00604 assert(0 && "This method should be removed from Ogre::ScriptTranslatorManager");
00605 return mTranslatorMap.size ();
00606 }
00607
00608 void CaelumScriptTranslatorManager::_setPropScriptResourceManager (PropScriptResourceManager* mgr)
00609 {
00610 mCaelumSystemTranslator.setResourceManager (mgr);
00611 }
00612
00613 ScriptTranslator* CaelumScriptTranslatorManager::getTranslator (const AbstractNodePtr& node)
00614 {
00615
00616 if (node->type == ANT_ATOM) {
00617
00618
00619 } else if (node->type == ANT_OBJECT) {
00620 ObjectAbstractNode* objNode = reinterpret_cast<ObjectAbstractNode*>(node.get());
00621
00622
00623
00624 ScriptTranslatorMap::const_iterator it = mTranslatorMap.find(objNode->cls);
00625 if (it != mTranslatorMap.end()) {
00626 return it->second;
00627 }
00628 }
00629
00630
00631 return 0;
00632 }
00633 }
00634
00635 #endif // CAELUM_SCRIPT_SUPPORT