void ParticleScriptCompiler::compileEmitter(const ScriptNodePtr &node) { if(node->children.empty() || node->children.front()->type != SNT_WORD) return; // Create the emitter based on the first child ParticleEmitter *emitter = 0; String type = node->children.front()->token; try{ emitter = mSystem->addEmitter(type); }catch(...){ addError(CE_OBJECTALLOCATIONERROR, node->children.front()->file, node->children.front()->line, node->children.front()->column); return; } // Jump ahead now to the '{' as the emitter does not support other parameters in the header ScriptNodeList::iterator i = findNode(node->children.begin(), node->children.end(), SNT_LBRACE); if(i == node->children.end()) return; ScriptNodeList::iterator j = (*i)->children.begin(); while(j != (*i)->children.end()) { if(!processNode(j, (*i)->children.end())) { String name = (*j)->token, value = getParameterValue((*j)->children.begin(), (*j)->children.end()); if(!emitter->setParameter(name, value)) addError(CE_INVALIDPROPERTY, (*j)->file, (*j)->line, (*j)->column); ++j; } } }
//------------------------------------------------------------------------------ void ParticleEmitterTranslator::translate(Ogre::ScriptCompiler *compiler, const Ogre::AbstractNodePtr &node) { Ogre::ObjectAbstractNode *obj = reinterpret_cast<Ogre::ObjectAbstractNode*>(node.get()); // name can't be empty because we get renderer type from it if(obj->name.empty()) { compiler->addError(Ogre::ScriptCompiler::CE_OBJECTNAMEEXPECTED, obj->file, obj->line); return; } ParticleTechnique* tech = Ogre::any_cast<ParticleTechnique*>(obj->parent->context); ParticleEmitter* emitter = tech->CreateEmitter(obj->name); if (emitter == NULL) { compiler->addError(Ogre::ScriptCompiler::CE_OBJECTALLOCATIONERROR, obj->file, obj->line); return; } Ogre::LogManager::getSingletonPtr()->logMessage("ParticleEmitterTranslator: create emitter."); for (Ogre::AbstractNodeList::iterator i = obj->children.begin(); i != obj->children.end(); ++i) { if ((*i)->type == Ogre::ANT_PROPERTY) { Ogre::PropertyAbstractNode *prop = reinterpret_cast<Ogre::PropertyAbstractNode*>((*i).get()); Ogre::String value = prop->getValue(); /* // Glob the values together for (Ogre::AbstractNodeList::iterator i = prop->values.begin(); i != prop->values.end(); ++i) { if((*i)->type == Ogre::ANT_ATOM) { if (value.empty()) { value = ((Ogre::AtomAbstractNode*)(*i).get())->value; } else { value = value + " " + ((Ogre::AtomAbstractNode*)(*i).get())->value; } } else { compiler->addError(Ogre::ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line); break; } } */ Ogre::LogManager::getSingletonPtr()->logMessage("ParticleEmitterTranslator: Set param '" + prop->name + "' to '" + value + "'."); if (!emitter->setParameter(prop->name, value)) { compiler->addError(Ogre::ScriptCompiler::CE_INVALIDPARAMETERS, prop->file, prop->line); } } } }