- Implemented all math type converters
This commit is contained in:
parent
a36695b15b
commit
f5367ebfbc
@ -130,6 +130,21 @@
|
||||
<Compile Include="CurveKeyCollection.cs" />
|
||||
<Compile Include="CurveLoopType.cs" />
|
||||
<Compile Include="CurveTangent.cs" />
|
||||
<Compile Include="Design\ANXFieldDescriptor.cs" />
|
||||
<Compile Include="Design\ANXPropertyDescriptor.cs" />
|
||||
<Compile Include="Design\BoundingBox.cs" />
|
||||
<Compile Include="Design\BoundingSphereConverter.cs" />
|
||||
<Compile Include="Design\ColorConverter.cs" />
|
||||
<Compile Include="Design\MathTypeConverter.cs" />
|
||||
<Compile Include="Design\MatrixConverter.cs" />
|
||||
<Compile Include="Design\PlaneConverter.cs" />
|
||||
<Compile Include="Design\PointConverter.cs" />
|
||||
<Compile Include="Design\QuaternionConverter.cs" />
|
||||
<Compile Include="Design\RayConverter.cs" />
|
||||
<Compile Include="Design\RectangleConverter.cs" />
|
||||
<Compile Include="Design\Vector2Converter.cs" />
|
||||
<Compile Include="Design\Vector3Converter.cs" />
|
||||
<Compile Include="Design\Vector4Converter.cs" />
|
||||
<Compile Include="DisplayOrientation.cs" />
|
||||
<Compile Include="DrawableGameComponent.cs" />
|
||||
<Compile Include="Game.cs" />
|
||||
@ -358,7 +373,6 @@
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Content\MediaTypeReaders\" />
|
||||
<Folder Include="Design\" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
|
||||
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
|
||||
|
66
ANX.Framework/Design/ANXFieldDescriptor.cs
Normal file
66
ANX.Framework/Design/ANXFieldDescriptor.cs
Normal file
@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class ANXFieldDescriptor : PropertyDescriptor
|
||||
{
|
||||
private FieldInfo field;
|
||||
|
||||
public ANXFieldDescriptor(FieldInfo field)
|
||||
: base(field.Name, (Attribute[])field.GetCustomAttributes(typeof(Attribute), true))
|
||||
{
|
||||
if (field == null)
|
||||
{
|
||||
throw new ArgumentNullException("field");
|
||||
}
|
||||
this.field = field;
|
||||
}
|
||||
|
||||
public override bool CanResetValue(object component)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override Type ComponentType
|
||||
{
|
||||
get { return field.DeclaringType; }
|
||||
}
|
||||
|
||||
public override object GetValue(object component)
|
||||
{
|
||||
return field.GetValue(component);
|
||||
}
|
||||
|
||||
public override bool IsReadOnly
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
public override Type PropertyType
|
||||
{
|
||||
get { return field.FieldType; }
|
||||
}
|
||||
|
||||
public override void ResetValue(object component)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void SetValue(object component, object value)
|
||||
{
|
||||
this.field.SetValue(component, value);
|
||||
this.OnValueChanged(component, EventArgs.Empty);
|
||||
}
|
||||
|
||||
public override bool ShouldSerializeValue(object component)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
66
ANX.Framework/Design/ANXPropertyDescriptor.cs
Normal file
66
ANX.Framework/Design/ANXPropertyDescriptor.cs
Normal file
@ -0,0 +1,66 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class ANXPropertyDescriptor : PropertyDescriptor
|
||||
{
|
||||
private PropertyInfo property;
|
||||
|
||||
public ANXPropertyDescriptor(PropertyInfo property)
|
||||
: base(property.Name, (Attribute[])property.GetCustomAttributes(typeof(Attribute), true))
|
||||
{
|
||||
if (property == null)
|
||||
{
|
||||
throw new ArgumentNullException("property");
|
||||
}
|
||||
this.property = property;
|
||||
}
|
||||
|
||||
public override bool CanResetValue(object component)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override Type ComponentType
|
||||
{
|
||||
get { return property.DeclaringType; }
|
||||
}
|
||||
|
||||
public override object GetValue(object component)
|
||||
{
|
||||
return property.GetValue(component, null);
|
||||
}
|
||||
|
||||
public override bool IsReadOnly
|
||||
{
|
||||
get { return false; }
|
||||
}
|
||||
|
||||
public override Type PropertyType
|
||||
{
|
||||
get { return property.PropertyType; }
|
||||
}
|
||||
|
||||
public override void ResetValue(object component)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public override void SetValue(object component, object value)
|
||||
{
|
||||
this.property.SetValue(component, value, null);
|
||||
this.OnValueChanged(component, EventArgs.Empty);
|
||||
}
|
||||
|
||||
public override bool ShouldSerializeValue(object component)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
53
ANX.Framework/Design/BoundingBoxConverter.cs
Normal file
53
ANX.Framework/Design/BoundingBoxConverter.cs
Normal file
@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class BoundingBoxConverter : MathTypeConverter
|
||||
{
|
||||
public BoundingBoxConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<BoundingBox>("Min", "Max");
|
||||
supportStringConvert = false;
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is BoundingBox)
|
||||
{
|
||||
BoundingBox instance = (BoundingBox)value;
|
||||
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(BoundingBox).GetConstructor(new Type[] { typeof(Vector3), typeof(Vector3) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.Min, instance.Max });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new BoundingBox((Vector3)propertyValues["Min"], (Vector3)propertyValues["Max"]);
|
||||
}
|
||||
}
|
||||
}
|
53
ANX.Framework/Design/BoundingSphereConverter.cs
Normal file
53
ANX.Framework/Design/BoundingSphereConverter.cs
Normal file
@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class BoundingSphereConverter : MathTypeConverter
|
||||
{
|
||||
public BoundingSphereConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<BoundingSphere>("Center", "Radius");
|
||||
supportStringConvert = false;
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is BoundingSphere)
|
||||
{
|
||||
BoundingSphere instance = (BoundingSphere)value;
|
||||
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(BoundingSphere).GetConstructor(new Type[] { typeof(Vector3), typeof(float) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.Center, instance.Radius });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new BoundingSphere((Vector3)propertyValues["Center"], (float)propertyValues["Radius"]);
|
||||
}
|
||||
}
|
||||
}
|
61
ANX.Framework/Design/ColorConverter.cs
Normal file
61
ANX.Framework/Design/ColorConverter.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class ColorConverter : MathTypeConverter
|
||||
{
|
||||
public ColorConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Color>("R", "G", "B", "A");
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
byte[] values = MathTypeConverter.ConvertFromString<byte>(context, culture, value as String);
|
||||
if (values != null && values.Length == 4)
|
||||
{
|
||||
return new Color(values[0], values[1], values[2], values[3]);
|
||||
}
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Color)
|
||||
{
|
||||
Color instance = (Color)value;
|
||||
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
return MathTypeConverter.ConvertToString<float>(context, culture, new float[] { instance.R, instance.G, instance.B, instance.A });
|
||||
}
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Color).GetConstructor(new Type[] { typeof(float), typeof(float), typeof(float), typeof(float) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.R, instance.G, instance.B, instance.A });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Color((float)propertyValues["R"], (float)propertyValues["G"], (float)propertyValues["B"], (float)propertyValues["A"]);
|
||||
}
|
||||
}
|
||||
}
|
106
ANX.Framework/Design/MathTypeConverter.cs
Normal file
106
ANX.Framework/Design/MathTypeConverter.cs
Normal file
@ -0,0 +1,106 @@
|
||||
using System;
|
||||
using System.Text;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class MathTypeConverter : ExpandableObjectConverter
|
||||
{
|
||||
protected PropertyDescriptorCollection propertyDescriptions;
|
||||
|
||||
protected bool supportStringConvert = true;
|
||||
|
||||
public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
|
||||
{
|
||||
if (this.supportStringConvert && sourceType == typeof(String))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return base.CanConvertFrom(context, sourceType);
|
||||
}
|
||||
|
||||
public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
|
||||
{
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return base.CanConvertTo(context, destinationType);
|
||||
}
|
||||
|
||||
public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool GetPropertiesSupported(ITypeDescriptorContext context)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
|
||||
{
|
||||
return propertyDescriptions;
|
||||
}
|
||||
|
||||
protected static PropertyDescriptorCollection CreateFieldDescriptor<T>(params string[] fields)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
PropertyDescriptor[] descriptor = new PropertyDescriptor[fields.Length];
|
||||
for (int i = 0; i < fields.Length; i++)
|
||||
{
|
||||
descriptor[i] = new ANXFieldDescriptor(type.GetField(fields[i]));
|
||||
}
|
||||
return new PropertyDescriptorCollection(descriptor);
|
||||
}
|
||||
|
||||
protected static PropertyDescriptorCollection CreatePropertyDescriptor<T>(params string[] fields)
|
||||
{
|
||||
Type type = typeof(T);
|
||||
PropertyDescriptor[] descriptor = new PropertyDescriptor[fields.Length];
|
||||
for (int i = 0; i < fields.Length; i++)
|
||||
{
|
||||
descriptor[i] = new ANXPropertyDescriptor(type.GetProperty(fields[i]));
|
||||
}
|
||||
return new PropertyDescriptorCollection(descriptor);
|
||||
}
|
||||
|
||||
protected static string ConvertToString<T>(ITypeDescriptorContext context, CultureInfo culture, T[] values)
|
||||
{
|
||||
string separator = "; ";
|
||||
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
|
||||
StringBuilder builder = new StringBuilder();
|
||||
foreach (var item in values)
|
||||
{
|
||||
builder.Append(converter.ConvertToString(context, culture, item));
|
||||
builder.Append(separator);
|
||||
}
|
||||
return builder.ToString();
|
||||
}
|
||||
|
||||
protected static T[] ConvertFromString<T>(ITypeDescriptorContext context, CultureInfo culture, string value)
|
||||
{
|
||||
if (value == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
if (culture == null)
|
||||
{
|
||||
throw new ArgumentNullException("culture");
|
||||
}
|
||||
value = value.Trim();
|
||||
|
||||
string[] values = value.Split(';');
|
||||
T[] result = new T[values.Length];
|
||||
TypeConverter converter = TypeDescriptor.GetConverter(typeof(T));
|
||||
for (int i = 0; i < values.Length; i++)
|
||||
{
|
||||
result[i] = (T)converter.ConvertFromString(context, culture, values[i]);
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
71
ANX.Framework/Design/MatrixConverter.cs
Normal file
71
ANX.Framework/Design/MatrixConverter.cs
Normal file
@ -0,0 +1,71 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class MatrixConverter : MathTypeConverter
|
||||
{
|
||||
public MatrixConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Matrix>(
|
||||
"M11", "M12", "M13", "M14",
|
||||
"M21", "M22", "M23", "M24",
|
||||
"M31", "M32", "M33", "M34",
|
||||
"M41", "M42", "M43", "M44");
|
||||
supportStringConvert = false;
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Matrix)
|
||||
{
|
||||
Matrix instance = (Matrix)value;
|
||||
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Matrix).GetConstructor(new Type[] {
|
||||
typeof(float), typeof(float), typeof(float), typeof(float),
|
||||
typeof(float), typeof(float), typeof(float), typeof(float),
|
||||
typeof(float), typeof(float), typeof(float), typeof(float),
|
||||
typeof(float), typeof(float), typeof(float), typeof(float)
|
||||
});
|
||||
return new InstanceDescriptor(constructor, new object[] {
|
||||
instance.M11, instance.M12, instance.M13, instance.M14,
|
||||
instance.M21, instance.M22, instance.M23, instance.M24,
|
||||
instance.M31, instance.M32, instance.M33, instance.M34,
|
||||
instance.M41, instance.M42, instance.M43, instance.M44
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Matrix(
|
||||
(float)propertyValues["M11"], (float)propertyValues["M12"], (float)propertyValues["M13"], (float)propertyValues["M14"],
|
||||
(float)propertyValues["M21"], (float)propertyValues["M22"], (float)propertyValues["M23"], (float)propertyValues["M24"],
|
||||
(float)propertyValues["M31"], (float)propertyValues["M32"], (float)propertyValues["M33"], (float)propertyValues["M34"],
|
||||
(float)propertyValues["M41"], (float)propertyValues["M42"], (float)propertyValues["M43"], (float)propertyValues["M44"]);
|
||||
}
|
||||
}
|
||||
}
|
48
ANX.Framework/Design/PlaneConverter.cs
Normal file
48
ANX.Framework/Design/PlaneConverter.cs
Normal file
@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class PlaneConverter : MathTypeConverter
|
||||
{
|
||||
public PlaneConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Plane>("Normal", "D");
|
||||
supportStringConvert = false;
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Plane)
|
||||
{
|
||||
Plane instance = (Plane)value;
|
||||
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Plane).GetConstructor(new Type[] { typeof(Vector3), typeof(float) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.Normal, instance.D });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Vector4((Vector3)propertyValues["Normal"], (float)propertyValues["D"]);
|
||||
}
|
||||
}
|
||||
}
|
61
ANX.Framework/Design/PointConverter.cs
Normal file
61
ANX.Framework/Design/PointConverter.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class PointConverter : MathTypeConverter
|
||||
{
|
||||
public PointConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Point>("X", "Y");
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
int[] values = MathTypeConverter.ConvertFromString<int>(context, culture, value as String);
|
||||
if (values != null && values.Length == 2)
|
||||
{
|
||||
return new Point(values[0], values[1]);
|
||||
}
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Point)
|
||||
{
|
||||
Point instance = (Point)value;
|
||||
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
return MathTypeConverter.ConvertToString<int>(context, culture, new int[] { instance.X, instance.Y });
|
||||
}
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Point).GetConstructor(new Type[] { typeof(int), typeof(int) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.X, instance.Y });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Point((int)propertyValues["X"], (int)propertyValues["Y"]);
|
||||
}
|
||||
}
|
||||
}
|
61
ANX.Framework/Design/QuaternionConverter.cs
Normal file
61
ANX.Framework/Design/QuaternionConverter.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class QuaternionConverter : MathTypeConverter
|
||||
{
|
||||
public QuaternionConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Quaternion>("X", "Y", "Z", "W");
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
float[] values = MathTypeConverter.ConvertFromString<float>(context, culture, value as String);
|
||||
if (values != null && values.Length == 4)
|
||||
{
|
||||
return new Quaternion(values[0], values[1], values[2], values[3]);
|
||||
}
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Quaternion)
|
||||
{
|
||||
Quaternion instance = (Quaternion)value;
|
||||
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
return MathTypeConverter.ConvertToString<float>(context, culture, new float[] { instance.X, instance.Y, instance.Z, instance.W });
|
||||
}
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Quaternion).GetConstructor(new Type[] { typeof(float), typeof(float), typeof(float), typeof(float) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.X, instance.Y, instance.Z, instance.W });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Quaternion((float)propertyValues["X"], (float)propertyValues["Y"], (float)propertyValues["Z"], (float)propertyValues["W"]);
|
||||
}
|
||||
}
|
||||
}
|
53
ANX.Framework/Design/RayConverter.cs
Normal file
53
ANX.Framework/Design/RayConverter.cs
Normal file
@ -0,0 +1,53 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class RayConverter : MathTypeConverter
|
||||
{
|
||||
public RayConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Ray>("Position", "Direction");
|
||||
supportStringConvert = false;
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Ray)
|
||||
{
|
||||
Ray instance = (Ray)value;
|
||||
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Ray).GetConstructor(new Type[] { typeof(Vector3), typeof(Vector3) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.Position, instance.Direction });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Ray((Vector3)propertyValues["Position"], (Vector3)propertyValues["Direction"]);
|
||||
}
|
||||
}
|
||||
}
|
61
ANX.Framework/Design/RectangleConverter.cs
Normal file
61
ANX.Framework/Design/RectangleConverter.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class RectangleConverter : MathTypeConverter
|
||||
{
|
||||
public RectangleConverter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Rectangle>("X", "Y", "Width", "Height");
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
int[] values = MathTypeConverter.ConvertFromString<int>(context, culture, value as String);
|
||||
if (values != null && values.Length == 4)
|
||||
{
|
||||
return new Rectangle(values[0], values[1], values[2], values[3]);
|
||||
}
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Rectangle)
|
||||
{
|
||||
Rectangle instance = (Rectangle)value;
|
||||
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
return MathTypeConverter.ConvertToString<int>(context, culture, new int[] { instance.X, instance.Y, instance.Width, instance.Height });
|
||||
}
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Rectangle).GetConstructor(new Type[] { typeof(int), typeof(int), typeof(int), typeof(int) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.X, instance.Y, instance.Width, instance.Height });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Rectangle((int)propertyValues["X"], (int)propertyValues["Y"], (int)propertyValues["Width"], (int)propertyValues["Height"]);
|
||||
}
|
||||
}
|
||||
}
|
61
ANX.Framework/Design/Vector2Converter.cs
Normal file
61
ANX.Framework/Design/Vector2Converter.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class Vector2Converter : MathTypeConverter
|
||||
{
|
||||
public Vector2Converter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Vector2>("X", "Y");
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
float[] values = MathTypeConverter.ConvertFromString<float>(context, culture, value as String);
|
||||
if (values != null && values.Length == 2)
|
||||
{
|
||||
return new Vector2(values[0], values[1]);
|
||||
}
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Vector2)
|
||||
{
|
||||
Vector2 vecValue = (Vector2)value;
|
||||
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
return MathTypeConverter.ConvertToString<float>(context, culture, new float[] { vecValue.X, vecValue.Y });
|
||||
}
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Vector2).GetConstructor(new Type[] { typeof(float), typeof(float) });
|
||||
return new InstanceDescriptor(constructor, new object[] { vecValue.X, vecValue.Y });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Vector2((float)propertyValues["X"], (float)propertyValues["Y"]);
|
||||
}
|
||||
}
|
||||
}
|
61
ANX.Framework/Design/Vector3Converter.cs
Normal file
61
ANX.Framework/Design/Vector3Converter.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class Vector3Converter : MathTypeConverter
|
||||
{
|
||||
public Vector3Converter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Vector3>("X", "Y", "Z");
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
float[] values = MathTypeConverter.ConvertFromString<float>(context, culture, value as String);
|
||||
if (values != null && values.Length == 3)
|
||||
{
|
||||
return new Vector3(values[0], values[1], values[2]);
|
||||
}
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Vector3)
|
||||
{
|
||||
Vector3 vecValue = (Vector3)value;
|
||||
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
return MathTypeConverter.ConvertToString<float>(context, culture, new float[] { vecValue.X, vecValue.Y, vecValue.Z });
|
||||
}
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Vector3).GetConstructor(new Type[] { typeof(float), typeof(float), typeof(float) });
|
||||
return new InstanceDescriptor(constructor, new object[] { vecValue.X, vecValue.Y, vecValue.Z });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Vector3((float)propertyValues["X"], (float)propertyValues["Y"], (float)propertyValues["Z"]);
|
||||
}
|
||||
}
|
||||
}
|
61
ANX.Framework/Design/Vector4Converter.cs
Normal file
61
ANX.Framework/Design/Vector4Converter.cs
Normal file
@ -0,0 +1,61 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.ComponentModel;
|
||||
using System.ComponentModel.Design.Serialization;
|
||||
using System.Diagnostics.CodeAnalysis;
|
||||
using System.Globalization;
|
||||
using System.Reflection;
|
||||
|
||||
namespace ANX.Framework.Design
|
||||
{
|
||||
public class Vector4Converter : MathTypeConverter
|
||||
{
|
||||
public Vector4Converter()
|
||||
{
|
||||
base.propertyDescriptions = MathTypeConverter.CreateFieldDescriptor<Vector4>("X", "Y", "Z", "W");
|
||||
}
|
||||
|
||||
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
|
||||
{
|
||||
float[] values = MathTypeConverter.ConvertFromString<float>(context, culture, value as String);
|
||||
if (values != null && values.Length == 4)
|
||||
{
|
||||
return new Vector4(values[0], values[1], values[2], values[3]);
|
||||
}
|
||||
return base.ConvertFrom(context, culture, value);
|
||||
}
|
||||
|
||||
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
|
||||
{
|
||||
if (destinationType == null)
|
||||
{
|
||||
throw new ArgumentNullException("destinationType");
|
||||
}
|
||||
if (value is Vector4)
|
||||
{
|
||||
Vector4 instance = (Vector4)value;
|
||||
|
||||
if (destinationType == typeof(string))
|
||||
{
|
||||
return MathTypeConverter.ConvertToString<float>(context, culture, new float[] { instance.X, instance.Y, instance.Z, instance.W });
|
||||
}
|
||||
if (destinationType == typeof(InstanceDescriptor))
|
||||
{
|
||||
var constructor = typeof(Vector4).GetConstructor(new Type[] { typeof(float), typeof(float), typeof(float), typeof(float) });
|
||||
return new InstanceDescriptor(constructor, new object[] { instance.X, instance.Y, instance.Z, instance.W });
|
||||
}
|
||||
}
|
||||
|
||||
return base.ConvertTo(context, culture, value, destinationType);
|
||||
}
|
||||
|
||||
public override object CreateInstance(ITypeDescriptorContext context, IDictionary propertyValues)
|
||||
{
|
||||
if (propertyValues == null)
|
||||
{
|
||||
throw new ArgumentNullException("propertyValues");
|
||||
}
|
||||
return new Vector4((float)propertyValues["X"], (float)propertyValues["Y"], (float)propertyValues["Z"], (float)propertyValues["W"]);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user