bool LegacyAvatarSerializer::ReadMasterModifier(MasterModifierVector& dest, const QDomElement& source) { MasterModifier master; master.name_ = source.attribute("name").toStdString(); master.category_ = source.attribute("category").toStdString(); master.value_ = ParseReal(source.attribute("position", "0").toStdString()); QDomElement target = source.firstChildElement("target_modifier"); while (!target.isNull()) { SlaveModifier targetmodifier; targetmodifier.name_ = target.attribute("name").toStdString(); std::string targettype = target.attribute("type").toStdString(); std::string targetmode = target.attribute("mode").toStdString(); if (targettype == "morph") targetmodifier.type_ = AppearanceModifier::Morph; if (targettype == "bone") targetmodifier.type_ = AppearanceModifier::Bone; if (targettype == "dynamic_animation") targetmodifier.type_ = AppearanceModifier::Bone; QDomElement mapping = target.firstChildElement("position_mapping"); while (!mapping.isNull()) { SlaveModifier::ValueMapping new_mapping; new_mapping.master_ = ParseReal(mapping.attribute("master").toStdString()); new_mapping.slave_ = ParseReal(mapping.attribute("target").toStdString()); targetmodifier.mapping_.push_back(new_mapping); mapping = mapping.nextSiblingElement("position_mapping"); } if (targetmode == "cumulative") targetmodifier.mode_ = SlaveModifier::Cumulative; else targetmodifier.mode_ = SlaveModifier::Average; master.modifiers_.push_back(targetmodifier); target = target.nextSiblingElement("target_modifier"); } dest.push_back(master); return true; }
bool LegacyAvatarSerializer::ReadMorphModifier(MorphModifierVector& dest, const QDomElement& source) { MorphModifier morph; morph.name_ = source.attribute("name").toStdString(); morph.morph_name_ = source.attribute("internal_name").toStdString(); morph.value_ = ParseReal(source.attribute("influence", "0").toStdString()); dest.push_back(morph); return true; }
bool LegacyAvatarSerializer::ReadAnimationDefinition(AnimationDefinitionMap& dest, const QDomElement& elem) { if (elem.tagName() != "animation") return false; std::string id = elem.attribute("id").toStdString(); if (id.empty()) id = elem.attribute("uuid").toStdString(); // legacy if (id.empty()) { RexLogicModule::LogError("Missing animation identifier"); return false; } std::string intname = elem.attribute("internal_name").toStdString(); if (intname.empty()) intname = elem.attribute("ogrename").toStdString(); // legacy if (intname.empty()) { RexLogicModule::LogError("Missing mesh animation name"); return false; } AnimationDefinition new_def; new_def.id_ = id; new_def.animation_name_ = intname; new_def.name_ = elem.attribute("name").toStdString(); new_def.looped_ = ParseBool(elem.attribute("looped", "true").toStdString()); new_def.exclusive_ = ParseBool(elem.attribute("exclusive", "false").toStdString()); new_def.use_velocity_ = ParseBool(elem.attribute("usevelocity", "false").toStdString()); new_def.always_restart_ = ParseBool(elem.attribute("alwaysrestart", "false").toStdString()); new_def.fadein_ = ParseReal(elem.attribute("fadein", "0").toStdString()); new_def.fadeout_ = ParseReal(elem.attribute("fadeout", "0").toStdString()); new_def.speedfactor_ = ParseReal(elem.attribute("speedfactor", "1").toStdString()); new_def.weightfactor_ = ParseReal(elem.attribute("weightfactor", "1").toStdString()); dest[RexUUID(new_def.id_)] = new_def; return true; }
void NumericEdit::__EditCompleted( Edit& sender ) { if ( busy ) return; if ( sender.IsReadOnly() ) return; busy = true; try { double newValue; bool hasChanged = false; if ( isReal ) { double tolerance = Pow10I<double>()( -int( precision + 1 ) ); newValue = ParseReal( sender.Text(), lowerBound, upperBound, tolerance ); newValue = Round( newValue, ActualPrecision( precision, newValue ) ); hasChanged = Sign( newValue ) != Sign( value ) || Abs( newValue - value ) > tolerance; } else { newValue = ParseInteger( sender.Text(), lowerBound, upperBound ); hasChanged = newValue != value; } if ( hasChanged ) { value = newValue; UpdateControls(); if ( onValueUpdated != 0 ) (onValueUpdatedReceiver->*onValueUpdated)( *this, value ); } else UpdateControls(); busy = false; return; } ERROR_HANDLER busy = false; UpdateControls(); }
bool LegacyAvatarSerializer::ReadBoneModifierParameter(BoneModifierSetVector& dest, const QDomElement& source) { // Find existing modifier from the vector std::string name = source.attribute("name").toStdString(); for (unsigned i = 0; i < dest.size(); ++i) { if (dest[i].name_ == name) { dest[i].value_ = ParseReal(source.attribute("position", "0.5").toStdString()); return true; } } return false; // Not found }