Magic3D::XMLElement* Magic3D::Object::save(XMLElement* root) { if (root) { saveString(root, M3D_OBJECT_XML_NAME, getName()); saveString(root, M3D_OBJECT_XML_SCRIPT, getScript()); saveString(root, M3D_OBJECT_XML_PARENT, getParent() ? getParent()->getName().c_str() : M3D_XML_NULL); saveString(root, M3D_OBJECT_XML_PARENT_BONE, getParentBone() ? getParentBone()->getName().c_str() : M3D_XML_NULL); saveBool(root, M3D_OBJECT_XML_PARENT_POSITION, isParentPosition()); saveBool(root, M3D_OBJECT_XML_PARENT_ROTATION, isParentRotation()); saveBool(root, M3D_OBJECT_XML_PARENT_SCALE, isParentScale()); saveInt(root, M3D_OBJECT_XML_RENDER, getRender()); saveInt(root, M3D_OBJECT_XML_TYPE, getType()); saveInt(root, M3D_OBJECT_XML_FLAG, getFlag()); saveInt(root, M3D_OBJECT_XML_BILLBOARD, getBillboard()); saveBool(root, M3D_OBJECT_XML_ENABLED, isEnabled()); saveBool(root, M3D_OBJECT_XML_VISIBLE, isVisible()); saveBool(root, M3D_OBJECT_XML_ZORDER, isZOrder()); saveBool(root, M3D_OBJECT_XML_PICK, isPickable()); saveVector3(root, M3D_OBJECT_XML_POSITION, getPosition()); saveVector4(root, M3D_OBJECT_XML_ROTATION, Vector4(getRotation())); saveVector3(root, M3D_OBJECT_XML_SCALE, getScale()); saveBool(root, M3D_OBJECT_XML_SCRIPTED, isScripted()); std::vector<Mesh*>::const_iterator it_m = meshes.begin(); while (it_m != meshes.end()) { Mesh* mesh = *it_m++; XMLElement* meshtXML = root->GetDocument()->NewElement( M3D_MESH_XML ); meshtXML->SetAttribute("materials", (int)mesh->getMaterials()->size()); root->LinkEndChild( meshtXML ); mesh->save(meshtXML); } PhysicsObject::save(root); } return root; }
bool Magic3D::Object::update() { if (Scene::getInstance()->getUniqueUpdateFlag() != uniqueUpdate) { uniqueUpdate = Scene::getInstance()->getUniqueUpdateFlag(); bool needTransformOld = needTransform; if (isEnabled()) { if (isScripted()) { std::string function_AI("AI"); Script::getInstance()->execute(function_AI, 0, getName()); } if (AI) { AI->AI(); } updateTweens(); } if (needTransform || (getRigidBody() && Physics::getInstance()->isPlaying() && getRigidBody()->getActivationState() != ISLAND_SLEEPING) || (getParent() && getParent()->isInFrustum())) { if (needTransform && !needTransformOld) { resetPhysics(); } needTransform = false; updateMatrix(); } } return true; }
Magic3D::Object::~Object() { std::vector<Object*>::const_iterator it_o = children.begin(); while (it_o != children.end()) { (*it_o++)->setParent(NULL, false); } children.clear(); std::vector<ObjectInstance*>::const_iterator it_i = instances.begin(); while (it_i != instances.end()) { (*it_i++)->setInstance(NULL, false); } instances.clear(); if (getParent()) { setParent(NULL); } if (Script::getInstance()) { if (isScripted()) { setScripted(false); } } if (AI) { delete AI; AI = NULL; } clearMeshes(); }
void Character::touch() { // Let the script handle that if (isScripted()) { Director::getInstance()->getScriptingEngine()->executeFunction(getName() + "_touch"); } }