CValue* CVectorValue::CalcFinal(VALUE_DATA_TYPE dtype, VALUE_OPERATOR op, CValue *val) /* pre: the type of val is dtype ret: a new object containing the result of applying operator op to val and this object */ { CValue *ret = NULL; switch(op) { case VALUE_ADD_OPERATOR: { switch (dtype) { case VALUE_EMPTY_TYPE: case VALUE_VECTOR_TYPE: { ret = new CVectorValue( val->GetVector3()[KX_X] + GetVector3()[KX_X], val->GetVector3()[KX_Y] + GetVector3()[KX_Y], val->GetVector3()[KX_Z] + GetVector3()[KX_Z], CValue::HEAPVALUE); ret->SetName(GetName()); break; } default: ret = new CErrorValue(val->GetText() + op2str(op) + GetText()); } break; } case VALUE_MUL_OPERATOR: { switch (dtype) { case VALUE_EMPTY_TYPE: case VALUE_VECTOR_TYPE: { //MT_Vector3 supports 'scaling' by another vector, instead of using general transform, Gino? //ret = new CVectorValue(val->GetVector3().Scaled(GetVector3()),GetName()); break; } case VALUE_FLOAT_TYPE: { ret = new CVectorValue( val->GetVector3()[KX_X] * GetVector3()[KX_X], val->GetVector3()[KX_Y] * GetVector3()[KX_Y], val->GetVector3()[KX_Z] * GetVector3()[KX_Z], CValue::HEAPVALUE); ret->SetName(GetName()); break; } default: ret = new CErrorValue(val->GetText() + op2str(op) + GetText()); } break; } default: ret = new CErrorValue(val->GetText() + op2str(op) + GetText()); } return ret; }