From 63dd5e1bf60154c4830aa41f88ce886e5f7b96f4 Mon Sep 17 00:00:00 2001 From: Regalis11 Date: Mon, 21 Dec 2015 12:12:31 +0200 Subject: [PATCH] Added HhyperDescriptor, sorting backgroundsprites according to texture --- .vs/Subsurface_Solution/v14/.suo | Bin 748544 -> 748544 bytes .../ChainingPropertyDescriptor.cs | 146 ++++++++++ .../Hyper.ComponentModel.csproj | 55 ++++ .../HyperTypeDescriptionProvider.cs | 126 +++++++++ Hyper.ComponentModel/HyperTypeDescriptor.cs | 265 ++++++++++++++++++ .../Properties/AssemblyInfo.cs | 36 +++ Subsurface/Barotrauma.csproj | 4 + Subsurface/Barotrauma.csproj.user | 2 +- .../BackgroundSpriteManager.cs | 15 +- Subsurface/Source/GameMain.cs | 3 + Subsurface_Solution.sln | 60 +++- 11 files changed, 708 insertions(+), 4 deletions(-) create mode 100644 Hyper.ComponentModel/ChainingPropertyDescriptor.cs create mode 100644 Hyper.ComponentModel/Hyper.ComponentModel.csproj create mode 100644 Hyper.ComponentModel/HyperTypeDescriptionProvider.cs create mode 100644 Hyper.ComponentModel/HyperTypeDescriptor.cs create mode 100644 Hyper.ComponentModel/Properties/AssemblyInfo.cs diff --git a/.vs/Subsurface_Solution/v14/.suo b/.vs/Subsurface_Solution/v14/.suo index 1f2cb3603db87abefe501f52f1c284fc286b193f..26232258cb68a09c611923fb6d8bbb1da57657f8 100644 GIT binary patch delta 13102 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 MLv-J1JGANl0KgiW0RR91 delta 26574 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 diff --git a/Hyper.ComponentModel/ChainingPropertyDescriptor.cs b/Hyper.ComponentModel/ChainingPropertyDescriptor.cs new file mode 100644 index 000000000..46155df9b --- /dev/null +++ b/Hyper.ComponentModel/ChainingPropertyDescriptor.cs @@ -0,0 +1,146 @@ +namespace Hyper.ComponentModel +{ + using System; + using System.ComponentModel; + + public abstract class ChainingPropertyDescriptor : PropertyDescriptor + { + private readonly PropertyDescriptor _root; + + protected PropertyDescriptor Root + { + get { return _root; } + } + + protected ChainingPropertyDescriptor(PropertyDescriptor root) + : base(root) + { + _root = root; + } + + public override void AddValueChanged(object component, EventHandler handler) + { + Root.AddValueChanged(component, handler); + } + + public override AttributeCollection Attributes + { + get { return Root.Attributes; } + } + + public override bool CanResetValue(object component) + { + return Root.CanResetValue(component); + } + + public override string Category + { + get { return Root.Category; } + } + + public override Type ComponentType + { + get { return Root.ComponentType; } + } + + public override TypeConverter Converter + { + get { return Root.Converter; } + } + + public override string Description + { + get { return Root.Description; } + } + + public override bool DesignTimeOnly + { + get { return Root.DesignTimeOnly; } + } + + public override string DisplayName + { + get { return Root.DisplayName; } + } + + public override bool Equals(object obj) + { + return Root.Equals(obj); + } + + public override PropertyDescriptorCollection GetChildProperties(object instance, Attribute[] filter) + { + return Root.GetChildProperties(instance, filter); + } + + public override object GetEditor(Type editorBaseType) + { + return Root.GetEditor(editorBaseType); + } + + public override int GetHashCode() + { + return Root.GetHashCode(); + } + + public override object GetValue(object component) + { + return Root.GetValue(component); + } + + public override bool IsBrowsable + { + get { return Root.IsBrowsable; } + } + + public override bool IsLocalizable + { + get { return Root.IsLocalizable; } + } + + public override bool IsReadOnly + { + get { return Root.IsReadOnly; } + } + + public override string Name + { + get { return Root.Name; } + } + + public override Type PropertyType + { + get { return Root.PropertyType; } + } + + public override void RemoveValueChanged(object component, EventHandler handler) + { + Root.RemoveValueChanged(component, handler); + } + + public override void ResetValue(object component) + { + Root.ResetValue(component); + } + + public override void SetValue(object component, object value) + { + Root.SetValue(component, value); + } + + public override bool ShouldSerializeValue(object component) + { + return Root.ShouldSerializeValue(component); + } + + public override bool SupportsChangeEvents + { + get { return Root.SupportsChangeEvents; } + } + + public override string ToString() + { + return Root.ToString(); + } + } +} \ No newline at end of file diff --git a/Hyper.ComponentModel/Hyper.ComponentModel.csproj b/Hyper.ComponentModel/Hyper.ComponentModel.csproj new file mode 100644 index 000000000..40cc4e68e --- /dev/null +++ b/Hyper.ComponentModel/Hyper.ComponentModel.csproj @@ -0,0 +1,55 @@ + + + + + Debug + AnyCPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50} + Library + Properties + Hyper.ComponentModel + Hyper.ComponentModel + v3.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + bin\Release\Hyper.ComponentModel.XML + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Hyper.ComponentModel/HyperTypeDescriptionProvider.cs b/Hyper.ComponentModel/HyperTypeDescriptionProvider.cs new file mode 100644 index 000000000..aadf376be --- /dev/null +++ b/Hyper.ComponentModel/HyperTypeDescriptionProvider.cs @@ -0,0 +1,126 @@ +namespace Hyper.ComponentModel +{ + using System; + using System.Collections.Generic; + using System.ComponentModel; + using System.Security; + using System.Security.Permissions; + + public sealed class HyperTypeDescriptionProvider : TypeDescriptionProvider + { + private static readonly Dictionary descriptors = new Dictionary(); + private static readonly Dictionary providers = new Dictionary(); + + public static void Add(Type type) + { + lock (descriptors) + { + if (!providers.ContainsKey(type)) + { + // determine if the base type was already added + // if so, remove it before adding sub-type + // (if a sub-type is added after its base type, infinite recursion occurs in GetTypeDescriptor()) + var baseFound = false; + if (type.BaseType != null && providers.ContainsKey(type.BaseType)) + { + baseFound = true; + Remove(type.BaseType); + } + + // add the provider for the type + var provider = new HyperTypeDescriptionProvider(TypeDescriptor.GetProvider(type)); + + TypeDescriptor.AddProvider(provider, type); + providers.Add(type, provider); + + // initialize descriptor + provider.GetTypeDescriptor(type); + + // if base type was removed, we can now add it back after building the sub-type descriptor + if (baseFound) + Add(type.BaseType); + } + } + } + + public static void Remove(Type type) + { + lock (descriptors) + { + TypeDescriptor.RemoveProvider(providers[type], type); + providers.Remove(type); + descriptors.Remove(type); + } + } + + public static void Clear() + { + lock (descriptors) + { + foreach (var provider in providers) + TypeDescriptor.RemoveProvider(provider.Value, provider.Key); + providers.Clear(); + descriptors.Clear(); + } + } + + + private HyperTypeDescriptionProvider() + : this(typeof(object)) + { } + + private HyperTypeDescriptionProvider(Type type) + : this(TypeDescriptor.GetProvider(type)) + { } + + private HyperTypeDescriptionProvider(TypeDescriptionProvider parent) + : base(parent) + { } + + public override ICustomTypeDescriptor GetTypeDescriptor(Type objectType, object instance) + { + lock (descriptors) + { + ICustomTypeDescriptor descriptor; + if (!descriptors.TryGetValue(objectType, out descriptor)) + { + try + { + descriptor = BuildDescriptor(objectType); + } + catch + { + return base.GetTypeDescriptor(objectType, instance); + } + } + return descriptor; + } + } + + [SecuritySafeCritical] + [ReflectionPermission(SecurityAction.Assert, Unrestricted = true)] + private ICustomTypeDescriptor BuildDescriptor(Type objectType) + { + // NOTE: "descriptors" already locked here + + // get the parent descriptor and add to the dictionary so that + // building the new descriptor will use the base rather than recursing + var descriptor = base.GetTypeDescriptor(objectType, null); + descriptors.Add(objectType, descriptor); + try + { + // build a new descriptor from this, and replace the lookup + descriptor = new HyperTypeDescriptor(descriptor); + descriptors[objectType] = descriptor; + return descriptor; + } + catch + { // rollback and throw + // (perhaps because the specific caller lacked permissions; + // another caller may be successful) + descriptors.Remove(objectType); + throw; + } + } + } +} \ No newline at end of file diff --git a/Hyper.ComponentModel/HyperTypeDescriptor.cs b/Hyper.ComponentModel/HyperTypeDescriptor.cs new file mode 100644 index 000000000..f381098fe --- /dev/null +++ b/Hyper.ComponentModel/HyperTypeDescriptor.cs @@ -0,0 +1,265 @@ +namespace Hyper.ComponentModel +{ + using System; + using System.Collections.Generic; + using System.ComponentModel; + using System.Reflection; + using System.Reflection.Emit; + using System.Threading; + + public sealed class HyperTypeDescriptor : CustomTypeDescriptor + { + private readonly PropertyDescriptorCollection propertyCollections; + + private static readonly Dictionary properties = + new Dictionary(); + + internal HyperTypeDescriptor(ICustomTypeDescriptor parent) + : base(parent) + { + propertyCollections = WrapProperties(parent.GetProperties()); + } + + public override sealed PropertyDescriptorCollection GetProperties(Attribute[] attributes) + { + return propertyCollections; + } + + public override sealed PropertyDescriptorCollection GetProperties() + { + return propertyCollections; + } + + private static PropertyDescriptorCollection WrapProperties(PropertyDescriptorCollection oldProps) + { + PropertyDescriptor[] newProps = new PropertyDescriptor[oldProps.Count]; + int index = 0; + bool changed = false; + // HACK: how to identify reflection, given that the class is internal... + Type wrapMe = + Assembly.GetAssembly(typeof (PropertyDescriptor)) + .GetType("System.ComponentModel.ReflectPropertyDescriptor"); + foreach (PropertyDescriptor oldProp in oldProps) + { + PropertyDescriptor pd = oldProp; + // if it looks like reflection, try to create a bespoke descriptor + if (ReferenceEquals(wrapMe, pd.GetType()) && TryCreatePropertyDescriptor(ref pd)) + { + changed = true; + } + newProps[index++] = pd; + } + + return changed ? new PropertyDescriptorCollection(newProps, true) : oldProps; + } + + private static readonly ModuleBuilder moduleBuilder; + private static int counter; + + static HyperTypeDescriptor() + { + AssemblyName an = new AssemblyName("Hyper.ComponentModel.dynamic"); + AssemblyBuilder ab = AppDomain.CurrentDomain.DefineDynamicAssembly(an, AssemblyBuilderAccess.Run); + moduleBuilder = ab.DefineDynamicModule("Hyper.ComponentModel.dynamic.dll"); + + } + + private static bool TryCreatePropertyDescriptor(ref PropertyDescriptor descriptor) + { + try + { + PropertyInfo property = descriptor.ComponentType.GetProperty(descriptor.Name); + if (property == null) return false; + + lock (properties) + { + PropertyDescriptor foundBuiltAlready; + if (properties.TryGetValue(property, out foundBuiltAlready)) + { + descriptor = foundBuiltAlready; + return true; + } + + string name = "_c" + Interlocked.Increment(ref counter).ToString(); + TypeBuilder tb = moduleBuilder.DefineType(name, + TypeAttributes.Sealed | TypeAttributes.NotPublic | TypeAttributes.Class | + TypeAttributes.BeforeFieldInit | TypeAttributes.AutoClass | TypeAttributes.Public, + typeof (ChainingPropertyDescriptor)); + + // ctor calls base + ConstructorBuilder cb = + tb.DefineConstructor( + MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.SpecialName | + MethodAttributes.RTSpecialName, CallingConventions.Standard, + new Type[] {typeof (PropertyDescriptor)}); + ILGenerator il = cb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_0); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Call, + typeof (ChainingPropertyDescriptor).GetConstructor( + BindingFlags.NonPublic | BindingFlags.Instance, null, + new Type[] {typeof (PropertyDescriptor)}, null)); + il.Emit(OpCodes.Ret); + + MethodBuilder mb; + MethodInfo baseMethod; + if (property.CanRead) + { + // obtain the implementation that we want to override + baseMethod = typeof (ChainingPropertyDescriptor).GetMethod("GetValue"); + // create a new method that accepts an object and returns an object (as per the base) + mb = tb.DefineMethod(baseMethod.Name, + MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | + MethodAttributes.Final, + baseMethod.CallingConvention, baseMethod.ReturnType, new Type[] {typeof (object)}); + // start writing IL into the method + il = mb.GetILGenerator(); + if (property.DeclaringType.IsValueType) + { + // upbox the object argument into our known (instance) struct type + LocalBuilder lb = il.DeclareLocal(property.DeclaringType); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Unbox_Any, property.DeclaringType); + il.Emit(OpCodes.Stloc_0); + il.Emit(OpCodes.Ldloca_S, lb); + } + else + { + // cast the object argument into our known class type + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Castclass, property.DeclaringType); + } + // call the "get" method + il.Emit(OpCodes.Callvirt, property.GetGetMethod()); + + if (property.PropertyType.IsValueType) + { + // box it from the known (value) struct type + il.Emit(OpCodes.Box, property.PropertyType); + } + // return the value + il.Emit(OpCodes.Ret); + // signal that this method should override the base + tb.DefineMethodOverride(mb, baseMethod); + } + + bool supportsChangeEvents = descriptor.SupportsChangeEvents, isReadOnly = descriptor.IsReadOnly; + + // override SupportsChangeEvents + baseMethod = typeof (ChainingPropertyDescriptor).GetProperty("SupportsChangeEvents").GetGetMethod(); + mb = tb.DefineMethod(baseMethod.Name, + MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | + MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, + baseMethod.ReturnType, Type.EmptyTypes); + il = mb.GetILGenerator(); + if (supportsChangeEvents) + { + il.Emit(OpCodes.Ldc_I4_1); + } + else + { + il.Emit(OpCodes.Ldc_I4_0); + } + il.Emit(OpCodes.Ret); + tb.DefineMethodOverride(mb, baseMethod); + + // override IsReadOnly + baseMethod = typeof (ChainingPropertyDescriptor).GetProperty("IsReadOnly").GetGetMethod(); + mb = tb.DefineMethod(baseMethod.Name, + MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | + MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, + baseMethod.ReturnType, Type.EmptyTypes); + il = mb.GetILGenerator(); + if (isReadOnly) + { + il.Emit(OpCodes.Ldc_I4_1); + } + else + { + il.Emit(OpCodes.Ldc_I4_0); + } + il.Emit(OpCodes.Ret); + tb.DefineMethodOverride(mb, baseMethod); + + // for classes, implement write (would be lost in unbox for structs) + if (!property.DeclaringType.IsValueType) + { + if (!isReadOnly && property.CanWrite) + { + // override set method + baseMethod = typeof (ChainingPropertyDescriptor).GetMethod("SetValue"); + mb = tb.DefineMethod(baseMethod.Name, + MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | + MethodAttributes.Final, baseMethod.CallingConvention, baseMethod.ReturnType, + new Type[] {typeof (object), typeof (object)}); + il = mb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Castclass, property.DeclaringType); + il.Emit(OpCodes.Ldarg_2); + if (property.PropertyType.IsValueType) + { + il.Emit(OpCodes.Unbox_Any, property.PropertyType); + } + else + { + il.Emit(OpCodes.Castclass, property.PropertyType); + } + il.Emit(OpCodes.Callvirt, property.GetSetMethod()); + il.Emit(OpCodes.Ret); + tb.DefineMethodOverride(mb, baseMethod); + } + + if (supportsChangeEvents) + { + EventInfo ei = property.DeclaringType.GetEvent(property.Name + "Changed"); + if (ei != null) + { + baseMethod = typeof (ChainingPropertyDescriptor).GetMethod("AddValueChanged"); + mb = tb.DefineMethod(baseMethod.Name, + MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | + MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, + baseMethod.ReturnType, new Type[] {typeof (object), typeof (EventHandler)}); + il = mb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Castclass, property.DeclaringType); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Callvirt, ei.GetAddMethod()); + il.Emit(OpCodes.Ret); + tb.DefineMethodOverride(mb, baseMethod); + + baseMethod = typeof (ChainingPropertyDescriptor).GetMethod("RemoveValueChanged"); + mb = tb.DefineMethod(baseMethod.Name, + MethodAttributes.HideBySig | MethodAttributes.Public | MethodAttributes.Virtual | + MethodAttributes.Final | MethodAttributes.SpecialName, baseMethod.CallingConvention, + baseMethod.ReturnType, new Type[] {typeof (object), typeof (EventHandler)}); + il = mb.GetILGenerator(); + il.Emit(OpCodes.Ldarg_1); + il.Emit(OpCodes.Castclass, property.DeclaringType); + il.Emit(OpCodes.Ldarg_2); + il.Emit(OpCodes.Callvirt, ei.GetRemoveMethod()); + il.Emit(OpCodes.Ret); + tb.DefineMethodOverride(mb, baseMethod); + } + } + + } + PropertyDescriptor newDesc = + tb.CreateType() + .GetConstructor(new Type[] {typeof (PropertyDescriptor)}) + .Invoke(new object[] {descriptor}) as PropertyDescriptor; + if (newDesc == null) + { + return false; + } + descriptor = newDesc; + properties.Add(property, descriptor); + return true; + } + } + catch + { + return false; + } + } + } +} \ No newline at end of file diff --git a/Hyper.ComponentModel/Properties/AssemblyInfo.cs b/Hyper.ComponentModel/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..55bd6bd6a --- /dev/null +++ b/Hyper.ComponentModel/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Hyper.ComponentModel")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Hyper.ComponentModel")] +[assembly: AssemblyCopyright("Copyright © 2014")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("aa867666-4c7a-489b-98ac-ce79048bddfa")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Subsurface/Barotrauma.csproj b/Subsurface/Barotrauma.csproj index 6e0167f44..b86e05d78 100644 --- a/Subsurface/Barotrauma.csproj +++ b/Subsurface/Barotrauma.csproj @@ -1155,6 +1155,10 @@ {0aad36e3-51a5-4a07-ab60-5c8a66bd38b7} Farseer Physics MonoGame + + {3b8f9edb-6e5e-450c-abc2-ec49075d0b50} + Hyper.ComponentModel + {49ba1c69-6104-41ac-a5d8-b54fa9f696e8} Lidgren.Network diff --git a/Subsurface/Barotrauma.csproj.user b/Subsurface/Barotrauma.csproj.user index 1782abafa..df35fcf91 100644 --- a/Subsurface/Barotrauma.csproj.user +++ b/Subsurface/Barotrauma.csproj.user @@ -9,7 +9,7 @@ en-US false - ShowAllFiles + ProjectFiles diff --git a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs index dde3c3ece..82294cbd4 100644 --- a/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs +++ b/Subsurface/Source/Characters/BackgroundSprite/BackgroundSpriteManager.cs @@ -49,7 +49,20 @@ namespace Barotrauma BackgroundSpritePrefab prefab = GetRandomPrefab(); Vector2 pos = FindSpritePosition(level, prefab); - sprites.Add(new BackgroundSprite(prefab, pos)); + var newSprite = new BackgroundSprite(prefab, pos); + + int n = 0; + + while (n < sprites.Count) + { + n++; + + Sprite existingSprite = sprites[n - 1].Prefab.Sprite; + if (existingSprite == null) continue; + if (existingSprite.Texture == newSprite.Prefab.Sprite.Texture) break; + } + + sprites.Insert(i, newSprite); } } diff --git a/Subsurface/Source/GameMain.cs b/Subsurface/Source/GameMain.cs index 5ace60661..709d35ec8 100644 --- a/Subsurface/Source/GameMain.cs +++ b/Subsurface/Source/GameMain.cs @@ -150,6 +150,9 @@ namespace Barotrauma CurrGraphicsDevice = GraphicsDevice; + Hyper.ComponentModel.HyperTypeDescriptionProvider.Add(typeof(Character)); + Hyper.ComponentModel.HyperTypeDescriptionProvider.Add(typeof(Item)); + //Event.Init("Content/randomevents.xml"); } diff --git a/Subsurface_Solution.sln b/Subsurface_Solution.sln index 8253339a9..9f1d2096f 100644 --- a/Subsurface_Solution.sln +++ b/Subsurface_Solution.sln @@ -1,7 +1,7 @@  Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 2013 -VisualStudioVersion = 12.0.21005.1 +# Visual Studio 14 +VisualStudioVersion = 14.0.23107.0 MinimumVisualStudioVersion = 10.0.40219.1 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Barotrauma", "Subsurface\Barotrauma.csproj", "{008C0F83-E914-4966-9135-EA885059EDD8}" EndProject @@ -19,6 +19,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CrashReporter", "CrashRepor EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{D32A29D8-AC7B-4189-B734-8ED9EB4120D0}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Hyper.ComponentModel", "Hyper.ComponentModel\Hyper.ComponentModel.csproj", "{3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Android|Any CPU = Android|Any CPU @@ -347,6 +349,60 @@ Global {6BE950CD-9A34-49C9-939A-786AC89C287E}.Windows8|Mixed Platforms.Build.0 = Release|x86 {6BE950CD-9A34-49C9-939A-786AC89C287E}.Windows8|x86.ActiveCfg = Release|x86 {6BE950CD-9A34-49C9-939A-786AC89C287E}.Windows8|x86.Build.0 = Release|x86 + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Android|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Android|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Android|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Android|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Android|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Android|x86.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x86.ActiveCfg = Debug|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Debug|x86.Build.0 = Debug|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.iOS|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.iOS|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.iOS|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.iOS|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.iOS|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.iOS|x86.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Linux|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Linux|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Linux|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Linux|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Linux|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Linux|x86.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.OSX|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.OSX|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.OSX|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.OSX|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.OSX|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.OSX|x86.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.PSM|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.PSM|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.PSM|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.PSM|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.PSM|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.PSM|x86.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Release|x86.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows|x86.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows8|Any CPU.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows8|Any CPU.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows8|Mixed Platforms.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows8|Mixed Platforms.Build.0 = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows8|x86.ActiveCfg = Release|Any CPU + {3B8F9EDB-6E5E-450C-ABC2-EC49075D0B50}.Windows8|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE