public void FromString(string str)
{
switch (this.type)
{
case DataType.DT_None:
// This is a null type, cannot have a value
break;
case DataType.DT_Byte:
value = Convert.ToByte(str);
break;
case DataType.DT_Short:
value = Convert.ToInt16(str);
break;
case DataType.DT_UShort:
value = Convert.ToUInt16(str);
break;
case DataType.DT_Int:
value = Convert.ToInt32(str);
break;
case DataType.DT_UInt:
value = Convert.ToUInt32(str);
break;
case DataType.DT_Float:
value = Convert.ToSingle(str);
break;
case DataType.DT_Double:
value = Convert.ToDouble(str);
break;
case DataType.DT_IVec2:
case DataType.DT_IVec3:
case DataType.DT_IVec4:
{
string[] nums = str.Split(' ');
int length = GetColumns();
if (length != nums.Length)
throw new FormatException(String.Format("A vector of length {0} was expected, got {1}", length, nums.Length));
int[] vec = new int[length];
for (int i = 0; i < length; i++)
vec[i] = int.Parse(nums[i]);
value = vec;
break;
}
case DataType.DT_Vec2:
case DataType.DT_Vec3:
case DataType.DT_Vec4:
{
string[] nums = str.Split(' ');
int length = GetColumns();
if (length != nums.Length)
throw new FormatException(String.Format("A vector of length {0} was expected, got {1}", length, nums.Length));
float[] vec = new float[length];
for (int i = 0; i < length; i++)
vec[i] = float.Parse(nums[i]);
value = vec;
break;
}
case DataType.DT_Mat2:
case DataType.DT_Mat3:
case DataType.DT_Mat3x4:
case DataType.DT_Mat4x3:
case DataType.DT_Mat4:
var mat = Matrix.Parse(str);
if (mat.cols != GetColumns() || mat.rows != GetRows())
throw new FormatException("Invalid column/row count for matrix");
value = mat;
break;
case DataType.DT_Bool:
if (str == "0") value = false;
else if (str == "1") value = true;
else value = Convert.ToBoolean(str);
break;
case DataType.DT_String:
case DataType.DT_Path:
case DataType.DT_FixedString:
case DataType.DT_LSString:
case DataType.DT_WString:
case DataType.DT_LSWString:
value = str;
break;
case DataType.DT_TranslatedString:
// We'll only set the value part of the translated string, not the TranslatedStringKey / Handle part
// That can be changed separately via attribute.Value.Handle
if (value == null)
value = new TranslatedString();
((TranslatedString)value).Value = str;
break;
case DataType.DT_ULongLong:
value = Convert.ToUInt64(str);
break;
case DataType.DT_ScratchBuffer:
value = Convert.FromBase64String(str);
break;
case DataType.DT_Long:
value = Convert.ToInt64(str);
break;
case DataType.DT_Int8:
value = Convert.ToSByte(str);
break;
default:
// This should not happen!
throw new NotImplementedException(String.Format("FromString() not implemented for type {0}", this.type));
}
}
}