+ case SGPropertyNode::INT: {
+ int value;
+ if (hasStep)
+ value = prop->getIntValue() + step->getIntValue();
+ else
+ value = prop->getIntValue() + int(amount);
+ if (min && (value < min->getIntValue())) {
+ if (wrap && max)
+ value = max->getIntValue();
+ else
+ value = min->getIntValue();
+ }
+ if (max && value > max->getIntValue()) {
+ if (wrap && min)
+ value = min->getIntValue();
+ else
+ value = max->getIntValue();
+ }
+ return prop->setIntValue(value);
+ }
+ case SGPropertyNode::LONG: {
+ long value;
+ if (hasStep)
+ value = prop->getLongValue() + step->getLongValue();
+ else
+ value = prop->getLongValue() + long(amount);
+ if (min && (value < min->getLongValue())) {
+ if (wrap && max)
+ value = max->getLongValue();
+ else
+ value = min->getLongValue();
+ }
+ if (max && value > max->getLongValue()) {
+ if (wrap && min)
+ value = min->getLongValue();
+ else
+ value = max->getLongValue();
+ }
+ return prop->setLongValue(value);
+ }
+ case SGPropertyNode::FLOAT: {
+ float value;
+ if (hasStep)
+ value = prop->getFloatValue() + step->getFloatValue();
+ else
+ value = prop->getFloatValue() + float(amount);
+ if (min && (value < min->getFloatValue())) {
+ if (wrap && max)
+ value = max->getFloatValue();
+ else
+ value = min->getFloatValue();
+ }
+ if (max && value > max->getFloatValue()) {
+ if (wrap && min)
+ value = min->getFloatValue();
+ else
+ value = max->getFloatValue();
+ }
+ return prop->setFloatValue(value);
+ }
+ case SGPropertyNode::DOUBLE:
+ case SGPropertyNode::UNSPECIFIED:
+ case SGPropertyNode::NONE: {
+ double value;
+ if (hasStep)
+ value = prop->getDoubleValue() + step->getDoubleValue();
+ else
+ value = prop->getDoubleValue() + amount;
+ if (min && (value < min->getDoubleValue())) {
+ if (wrap && max)
+ value = max->getDoubleValue();
+ else
+ value = min->getDoubleValue();
+ }
+ if (max && value > max->getDoubleValue()) {
+ if (wrap && min)
+ value = min->getDoubleValue();
+ else
+ value = max->getDoubleValue();
+ }
+ return prop->setDoubleValue(value);
+ }
+ case SGPropertyNode::STRING: // doesn't make sense with strings
+ SG_LOG(SG_INPUT, SG_ALERT, "Cannot adjust a string value");
+ return false;
+ default:
+ SG_LOG(SG_INPUT, SG_ALERT, "Unknown value type");
+ return false;
+ }
+}
+
+
+/**
+ * Built-in command: multiply a property value.
+ *
+ * property: the name of the property to multiply.
+ * factor: the amount by which to multiply.
+ */
+static bool
+do_property_multiply (const SGPropertyNode * arg, SGCommandState ** state)
+{
+ if (*state == 0)
+ *state = new PropertyCommandState(arg);
+ SGPropertyNode * prop = ((PropertyCommandState *)(*state))->getProp();
+ const SGPropertyNode * factor =
+ ((PropertyCommandState *)(*state))->getFactor();
+
+ switch (prop->getType()) {
+ case SGPropertyNode::BOOL:
+ return prop->setBoolValue(prop->getBoolValue() &&
+ factor->getBoolValue());
+ case SGPropertyNode::INT:
+ return prop->setIntValue(int(prop->getIntValue()
+ * factor->getDoubleValue()));
+ case SGPropertyNode::LONG:
+ return prop->setLongValue(long(prop->getLongValue()
+ * factor->getDoubleValue()));
+ case SGPropertyNode::FLOAT:
+ return prop->setFloatValue(float(prop->getFloatValue()
+ * factor->getDoubleValue()));
+ case SGPropertyNode::DOUBLE:
+ case SGPropertyNode::UNSPECIFIED:
+ case SGPropertyNode::NONE:
+ return prop->setDoubleValue(prop->getDoubleValue()
+ * factor->getDoubleValue());