diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableFieldTypes.cs b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableFieldTypes.cs index dbe5d8ec..d220c22b 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableFieldTypes.cs +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableFieldTypes.cs @@ -24,6 +24,9 @@ public enum ForgeAcceptableFieldTypes QUATERNION = 15, COLOR = 16, //OBJECT_ARRAY = 17, //Unsupported - //BYTE_ARRAY = 18 + //BYTE_ARRAY = 18, + FLOAT2 = 19, + FLOAT3 = 20, + FLOAT4 = 21, } -} \ No newline at end of file +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableRPCTypes.cs b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableRPCTypes.cs index 16bc1f04..9aec7abf 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableRPCTypes.cs +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeAcceptableRPCTypes.cs @@ -24,6 +24,9 @@ public enum ForgeAcceptableRPCTypes QUATERNION = 15, COLOR = 16, //OBJECT_ARRAY = 17, - BYTE_ARRAY = 18 + BYTE_ARRAY = 18, + FLOAT2 = 19, + FLOAT3 = 20, + FLOAT4 = 21, } -} \ No newline at end of file +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldRPCValue.cs b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldRPCValue.cs index 73bf2ac4..057f1bff 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldRPCValue.cs +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldRPCValue.cs @@ -85,6 +85,12 @@ public static ForgeClassFieldRPCValue GetClassField(FieldInfo field, Type t, boo type = ForgeAcceptableRPCTypes.VECTOR3; else if (fieldType == typeof(Vector4)) type = ForgeAcceptableRPCTypes.VECTOR4; + else if (fieldType == typeof(Float2)) + type = ForgeAcceptableRPCTypes.FLOAT2; + else if (fieldType == typeof(Float3)) + type = ForgeAcceptableRPCTypes.FLOAT3; + else if (fieldType == typeof(Float4)) + type = ForgeAcceptableRPCTypes.FLOAT4; else if (fieldType == typeof(string)) type = ForgeAcceptableRPCTypes.STRING; //else if (fieldType == typeof(object[])) @@ -133,6 +139,12 @@ public static Type GetTypeFromAcceptable(ForgeAcceptableRPCTypes type) return typeof(Vector3); case ForgeAcceptableRPCTypes.VECTOR4: return typeof(Vector4); + case ForgeAcceptableRPCTypes.FLOAT2: + return typeof(Float2); + case ForgeAcceptableRPCTypes.FLOAT3: + return typeof(Float3); + case ForgeAcceptableRPCTypes.FLOAT4: + return typeof(Float4); case ForgeAcceptableRPCTypes.STRING: return typeof(string); //case ForgeAcceptableRPCTypes.OBJECT_ARRAY: @@ -180,6 +192,12 @@ public static ForgeAcceptableRPCTypes GetTypeFromAcceptable(string val) return ForgeAcceptableRPCTypes.VECTOR3; case "vector4": return ForgeAcceptableRPCTypes.VECTOR4; + case "float2": + return ForgeAcceptableRPCTypes.FLOAT2; + case "float3": + return ForgeAcceptableRPCTypes.FLOAT3; + case "float4": + return ForgeAcceptableRPCTypes.FLOAT4; case "string": return ForgeAcceptableRPCTypes.STRING; //case "object[]": @@ -196,4 +214,4 @@ public override string ToString() return string.Format("[ Name: {0}, Value: {1}, Type: {2}, IsNetObj: {3}]", FieldRPCName, FieldRPCValue, FieldType, IsNetworkedObject); } } -} \ No newline at end of file +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldValue.cs b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldValue.cs index a79a7e36..b5230f0e 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldValue.cs +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassFieldValue.cs @@ -78,6 +78,12 @@ public static ForgeClassFieldValue GetClassField(FieldInfo field, Type t, bool i type = ForgeAcceptableFieldTypes.VECTOR3; else if (fieldType == typeof(Vector4)) type = ForgeAcceptableFieldTypes.VECTOR4; + else if (fieldType == typeof(Float2)) + type = ForgeAcceptableFieldTypes.FLOAT2; + else if (fieldType == typeof(Float3)) + type = ForgeAcceptableFieldTypes.FLOAT3; + else if (fieldType == typeof(Float4)) + type = ForgeAcceptableFieldTypes.FLOAT4; //else if (fieldType == typeof(string)) // type = ForgeAcceptableFieldTypes.STRING; //Unsupported //else if (fieldType == typeof(object[])) @@ -126,6 +132,12 @@ public static Type GetTypeFromAcceptable(ForgeAcceptableFieldTypes type) return typeof(Vector3); case ForgeAcceptableFieldTypes.VECTOR4: return typeof(Vector4); + case ForgeAcceptableFieldTypes.FLOAT2: + return typeof(Float2); + case ForgeAcceptableFieldTypes.FLOAT3: + return typeof(Float3); + case ForgeAcceptableFieldTypes.FLOAT4: + return typeof(Float4); //case ForgeAcceptableFieldTypes.STRING: //Unsupported // return typeof(string); //case ForgeAcceptableFieldTypes.OBJECT_ARRAY: //Unsupported @@ -220,6 +232,12 @@ public static ForgeAcceptableFieldTypes GetTypeFromAcceptable(string val) return ForgeAcceptableFieldTypes.VECTOR3; case "vector4": return ForgeAcceptableFieldTypes.VECTOR4; + case "float2": + return ForgeAcceptableFieldTypes.FLOAT2; + case "float3": + return ForgeAcceptableFieldTypes.FLOAT3; + case "float4": + return ForgeAcceptableFieldTypes.FLOAT4; //case "string": // return ForgeAcceptableFieldTypes.STRING; //Unsupported //case "object[]": @@ -237,4 +255,4 @@ public override string ToString() return string.Format("[ Name: {0}, Value: {1}, Type: {2}, IsNetObj: {3}]", FieldName, FieldValue, FieldType, IsNetworkedObject); } } -} \ No newline at end of file +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRPCValue.cs b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRPCValue.cs index 5da35c59..e7b02a82 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRPCValue.cs +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRPCValue.cs @@ -81,6 +81,12 @@ public static ForgeAcceptableRPCTypes GetATypeFromPInfo(ParameterInfo pInfo) type = ForgeAcceptableRPCTypes.VECTOR3; else if (fieldType == typeof(Vector4)) type = ForgeAcceptableRPCTypes.VECTOR4; + else if (fieldType == typeof(Float2)) + type = ForgeAcceptableRPCTypes.FLOAT2; + else if (fieldType == typeof(Float3)) + type = ForgeAcceptableRPCTypes.FLOAT3; + else if (fieldType == typeof(Float4)) + type = ForgeAcceptableRPCTypes.FLOAT4; else if (fieldType == typeof(string)) type = ForgeAcceptableRPCTypes.STRING; //else if (fieldType == typeof(object[])) @@ -93,4 +99,4 @@ public static ForgeAcceptableRPCTypes GetATypeFromPInfo(ParameterInfo pInfo) return type; } } -} \ No newline at end of file +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRewindValue.cs b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRewindValue.cs index ef893687..f009113d 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRewindValue.cs +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeClassRewindValue.cs @@ -67,6 +67,12 @@ public static ForgeAcceptableRPCTypes GetATypeFromPInfo(ParameterInfo pInfo) type = ForgeAcceptableRPCTypes.VECTOR3; else if (fieldType == typeof(Vector4)) type = ForgeAcceptableRPCTypes.VECTOR4; + else if (fieldType == typeof(Float2)) + type = ForgeAcceptableRPCTypes.FLOAT2; + else if (fieldType == typeof(Float3)) + type = ForgeAcceptableRPCTypes.FLOAT3; + else if (fieldType == typeof(Float4)) + type = ForgeAcceptableRPCTypes.FLOAT4; else if (fieldType == typeof(string)) type = ForgeAcceptableRPCTypes.STRING; //else if (fieldType == typeof(object[])) @@ -79,4 +85,4 @@ public static ForgeAcceptableRPCTypes GetATypeFromPInfo(ParameterInfo pInfo) return type; } } -} \ No newline at end of file +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeNetworkingEditor.cs b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeNetworkingEditor.cs index 90c5fe1f..b8ff6633 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeNetworkingEditor.cs +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/ForgeNetworkingEditor.cs @@ -200,6 +200,9 @@ public void Initialize() _referenceVariables.Add(typeof(Vector4).Name, "Vector4"); _referenceVariables.Add(typeof(Quaternion).Name, "Quaternion"); _referenceVariables.Add(typeof(Color).Name, "Color"); + _referenceVariables.Add(typeof(Float2).Name, "Float2"); + _referenceVariables.Add(typeof(Float3).Name, "Float3"); + _referenceVariables.Add(typeof(Float4).Name, "Float4"); _referenceVariables.Add(typeof(object).Name, "object"); _referenceVariables.Add(typeof(object[]).Name, "object[]"); _referenceVariables.Add(typeof(byte[]).Name, "byte[]"); @@ -710,7 +713,14 @@ public void MakeForgeFactory() /// The generated string to save to a file public string SourceCodeNetworkObject(ForgeClassObject cObj, ForgeEditorButton btn, int identity) { - TextAsset asset = Resources.Load(EDITOR_RESOURCES_DIR + "/NetworkObjectTemplate"); + string networkObjectPath = string.Empty; + + if (btn.BaseType == ForgeBaseClassType.NetworkBehavior) + networkObjectPath = EDITOR_RESOURCES_DIR + "/StandAloneNetworkObjectTemplate"; + else + networkObjectPath = EDITOR_RESOURCES_DIR + "/NetworkObjectTemplate"; + + TextAsset asset = Resources.Load(networkObjectPath); TemplateSystem template = new TemplateSystem(asset.text); template.AddVariable("className", btn.StrippedSearchName + "NetworkObject"); @@ -892,6 +902,32 @@ public string SourceCodeFactory() return template.Parse(); } + /// + /// Generates the code factory for all our custom network objects for standalone use + /// + /// The string for the save file + public string SourceCodeStandAloneFactory() + { + TextAsset asset = Resources.Load(EDITOR_RESOURCES_DIR + "/StandAloneNetworkObjectFactoryTemplate"); + TemplateSystem template = new TemplateSystem(asset.text); + + List networkObjects = new List(); + for (int i = 0; i < _editorButtons.Count; ++i) + { + if (!_editorButtons[i].IsNetworkObject) + continue; + + string name = _editorButtons[i].StrippedSearchName + "NetworkObject"; + if (networkObjects.Contains(name)) + continue; + + networkObjects.Add(name); + } + + template.AddVariable("networkObjects", networkObjects.ToArray()); + return template.Parse(); + } + /// /// Generates the network manager that will allow the instantiation of these new network objects /// @@ -1045,6 +1081,15 @@ public void Compile() sw.Write(networkManagerData); } + if(ActiveButton.BaseType == ForgeBaseClassType.NetworkBehavior) + { + string standAloneFactoryData = SourceCodeStandAloneFactory(); + using (StreamWriter sw = File.CreateText(Path.Combine(_storingPath, "StandAloneNetworkObjectFactory.cs"))) + { + sw.Write(standAloneFactoryData); + } + } + //IFormatter previousSavedState = new BinaryFormatter(); //using (Stream s = new FileStream(Path.Combine(Application.persistentDataPath, FN_WIZARD_DATA), FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) //{ diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkBehaviorTemplate.txt b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkBehaviorTemplate.txt index 3ebfc6ec..dec9eb07 100644 --- a/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkBehaviorTemplate.txt +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkBehaviorTemplate.txt @@ -1,6 +1,6 @@ using BeardedManStudios.Forge.Networking; using BeardedManStudios.Forge.Networking.Unity; -using UnityEngine; +using BeardedManStudios.Forge.Networking.StandAlone; namespace BeardedManStudios.Forge.Networking.Generated { diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkObjectTemplate.txt b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkObjectTemplate.txt new file mode 100644 index 00000000..4765f9f2 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkObjectTemplate.txt @@ -0,0 +1,161 @@ +using BeardedManStudios.Forge.Networking.Frame; +using BeardedManStudios.Forge.Networking.Unity; +using BeardedManStudios.Forge.Networking.StandAlone; +using System; + +namespace BeardedManStudios.Forge.Networking.Generated +{ + [GeneratedInterpol("{\"inter\":[>:interpolateValues:<]")] + public partial class >:className:< : NetworkObject + { + public const int IDENTITY = >:identity:<; + + private byte[] _dirtyFields = new byte[>:bitwiseSize:<]; + + #pragma warning disable 0067 + public event FieldChangedEvent fieldAltered; + #pragma warning restore 0067 + >:FOREVERY variables:< + [ForgeGeneratedField] + private >:[0]:< _>:[1]:<; + public event FieldEvent<>:[0]:<> >:[1]::[3]:< >:[1]::[3]:<() { LerpT = >:[4]:<, Enabled = >:[2]:< }; + public >:[0]:< >:[1]:< + { + get { return _>:[1]:<; } + set + { + // Don't do anything if the value is the same + if (_>:[1]:< == value) + return; + + // Mark the field as dirty for the network to transmit + _dirtyFields[>:[6]:<] |= >:[5]:<; + _>:[1]:< = value; + hasDirtyFields = true; + } + } + + public void Set>:[1]::[6]:<] |= >:[5]:<; + hasDirtyFields = true; + } + + private void RunChange_>:[1]:<(ulong timestep) + { + if (>:[1]::[1]::[1]:<, timestep); + if (fieldAltered != null) fieldAltered(">:[1]:<", _>:[1]:<, timestep); + } + >:ENDFOREVERY:< + >:FOREVERY rewinds:< + public Rewind<>:[0]:<> rewind>:[1]:< = new Rewind<>:[0]:<>() { rewindTime = >:[2]:< }; + >:ENDFOREVERY:< + + protected override void OwnershipChanged() + { + base.OwnershipChanged(); + SnapInterpolations(); + } + + public void SnapInterpolations() + { + >:FOREVERY variables:< + >:[1]::[1]::ENDFOREVERY:< + } + + public override int UniqueIdentity { get { return IDENTITY; } } + + protected override BMSByte WritePayload(BMSByte data) + { + >:FOREVERY variables:< + StandAloneObjectMapper.Instance.MapBytes(data, _>:[1]:<); + >:ENDFOREVERY:< + + return data; + } + + protected override void ReadPayload(BMSByte payload, ulong timestep) + { + >:FOREVERY variables:< + _>:[1]:< = StandAloneObjectMapper.Instance.Map<>:[0]:<>(payload); + >:[1]::[1]:<; + >:[1]::[1]:<; + RunChange_>:[1]:<(timestep); + >:ENDFOREVERY:< + } + + protected override BMSByte SerializeDirtyFields() + { + dirtyFieldsData.Clear(); + dirtyFieldsData.Append(_dirtyFields); + + >:FOREVERY variables:< + if ((>:[5]:< & _dirtyFields[>:[6]:<]) != 0) + StandAloneObjectMapper.Instance.MapBytes(dirtyFieldsData, _>:[1]:<); + >:ENDFOREVERY:< + + // Reset all the dirty fields + for (int i = 0; i < _dirtyFields.Length; i++) + _dirtyFields[i] = 0; + + return dirtyFieldsData; + } + + protected override void ReadDirtyFields(BMSByte data, ulong timestep) + { + if (readDirtyFlags == null) + Initialize(); + + Buffer.BlockCopy(data.byteArr, data.StartIndex(), readDirtyFlags, 0, readDirtyFlags.Length); + data.MoveStartIndex(readDirtyFlags.Length); + + >:FOREVERY variables:< + if ((>:[5]:< & readDirtyFlags[>:[6]:<]) != 0) + { + if (>:[1]::[1]::[0]:<>(data); + >:[1]::[1]:< = StandAloneObjectMapper.Instance.Map<>:[0]:<>(data); + RunChange_>:[1]:<(timestep); + } + } + >:ENDFOREVERY:< + } + + public override void InterpolateUpdate() + { + if (IsOwner) + return; + + >:FOREVERY variables:< + if (>:[1]::[1]::[1]::[1]:< = (>:[0]:<)>:[1]::[1]:<(>:[1]::ENDFOREVERY:< + } + + private void Initialize() + { + if (readDirtyFlags == null) + readDirtyFlags = new byte[>:bitwiseSize:<]; + + >:FOREVERY rewinds:< + rewind>:[1]:<.Time = NetWorker.Time; + >:ENDFOREVERY:< + } + + public >:className:<() : base() { Initialize(); } + public >:className:<(NetWorker networker, INetworkBehavior networkBehavior = null, int createCode = 0, byte[] metadata = null) : base(networker, networkBehavior, createCode, metadata) { Initialize(); } + public >:className:<(NetWorker networker, uint serverId, FrameStream frame) : base(networker, serverId, frame) { Initialize(); } + + // DO NOT TOUCH, THIS GETS GENERATED PLEASE EXTEND THIS CLASS IF YOU WISH TO HAVE CUSTOM CODE ADDITIONS + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkObjectTemplate.txt.meta b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkObjectTemplate.txt.meta new file mode 100644 index 00000000..47447f10 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandAloneNetworkObjectTemplate.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bae1a8a18cd5303429ac2ce07ca31984 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandaloneNetworkObjectFactoryTemplate.txt b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandaloneNetworkObjectFactoryTemplate.txt new file mode 100644 index 00000000..d1ecb880 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandaloneNetworkObjectFactoryTemplate.txt @@ -0,0 +1,42 @@ +using BeardedManStudios.Forge.Networking.Frame; +using System; + +namespace BeardedManStudios.Forge.Networking.Generated +{ + public partial class StandAloneNetworkObjectFactory : INetworkObjectFactory + { + public virtual void NetworkCreateObject(NetWorker networker, int identity, uint id, FrameStream frame, Action callback) + { + if (frame.Sender != null && frame.Sender != networker.Me) + { + if (!ValidateCreateRequest(networker, identity, id, frame)) + return; + } + + bool availableCallback = false; + + NetworkObject obj = null; + + switch (identity) + { + >:FOREACH networkObjects:< + case >:[i]:<.IDENTITY: + availableCallback = true; + obj = new >:[i]:<(networker, id, frame); + break; + >:ENDFOREACH:< + } + + if (!availableCallback && callback != null) + callback(obj); + } + + protected virtual bool ValidateCreateRequest(NetWorker networker, int identity, uint id, FrameStream frame) + { + return true; + } + + // DO NOT TOUCH, THIS GETS GENERATED PLEASE EXTEND THIS CLASS IF YOU WISH TO HAVE CUSTOM CODE ADDITIONS + // WARNING: THIS IS ONLY FOR USE WITH THE STANDALONE SERVER! + } +} \ No newline at end of file diff --git a/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandaloneNetworkObjectFactoryTemplate.txt.meta b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandaloneNetworkObjectFactoryTemplate.txt.meta new file mode 100644 index 00000000..349c941a --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Editor/Resources/BMS_Forge_Editor/StandaloneNetworkObjectFactoryTemplate.txt.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 698ca1e2b870ec14b846161dd33957a7 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone.meta new file mode 100644 index 00000000..ce59cfff --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cf81dd69d72c15642a8849fdc9933aac +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects.meta new file mode 100644 index 00000000..a0565f08 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 1657e1b2d258ecb428269241077d74de +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float2.cs b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float2.cs new file mode 100644 index 00000000..36ca8c28 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float2.cs @@ -0,0 +1,37 @@ +namespace BeardedManStudios +{ + public partial struct Float2 + { + public float x, y; + + public Float2(float x, float y) + { + this.x = x; + this.y = y; + } + + public static bool operator ==(Float2 a, Float2 b) + { + return a.x == b.x && a.y == b.y; + } + + public static bool operator !=(Float2 a, Float2 b) + { + return !(a == b); + } + + public override bool Equals(object obj) + { + if (!(obj is Float2)) + return false; + + Float2 other = (Float2)obj; + return x == other.x && y == other.y; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float2.cs.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float2.cs.meta new file mode 100644 index 00000000..29bbded4 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float2.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e36b1da3b61ee5e478cf619739944e03 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float3.cs b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float3.cs new file mode 100644 index 00000000..315f7b6e --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float3.cs @@ -0,0 +1,38 @@ +namespace BeardedManStudios +{ + public partial struct Float3 + { + public float x, y, z; + + public Float3(float x, float y, float z) + { + this.x = x; + this.y = y; + this.z = z; + } + + public static bool operator ==(Float3 a, Float3 b) + { + return a.x == b.x && a.y == b.y && a.z == b.z; + } + + public static bool operator !=(Float3 a, Float3 b) + { + return !(a == b); + } + + public override bool Equals(object obj) + { + if (!(obj is Float3)) + return false; + + Float3 other = (Float3)obj; + return x == other.x && y == other.y && z == other.z; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float3.cs.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float3.cs.meta new file mode 100644 index 00000000..f8c88507 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float3.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 7f7f93a267c4acf4f9835ee273639fae +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float4.cs b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float4.cs new file mode 100644 index 00000000..2fe927e2 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float4.cs @@ -0,0 +1,39 @@ +namespace BeardedManStudios +{ + public partial struct Float4 + { + public float x, y, z, w; + + public Float4(float x, float y, float z, float w) + { + this.x = x; + this.y = y; + this.z = z; + this.w = w; + } + + public static bool operator ==(Float4 a, Float4 b) + { + return a.x == b.x && a.y == b.y && a.z == b.z && a.w == b.w; + } + + public static bool operator !=(Float4 a, Float4 b) + { + return !(a == b); + } + + public override bool Equals(object obj) + { + if (!(obj is Float4)) + return false; + + Float4 other = (Float4)obj; + return x == other.x && y == other.y && z == other.z && w == other.w; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float4.cs.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float4.cs.meta new file mode 100644 index 00000000..8a5b1d63 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/Objects/Float4.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 95598cf2ce4885c4ab3132743d8b954e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/StandAloneObjectMapper.cs b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/StandAloneObjectMapper.cs new file mode 100644 index 00000000..05bc4018 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/StandAloneObjectMapper.cs @@ -0,0 +1,173 @@ +using System; + +namespace BeardedManStudios.Forge.Networking.StandAlone +{ + public class StandAloneObjectMapper : ObjectMapper + { + private float x, y, z, w; + + private new static StandAloneObjectMapper instance = null; + public static new StandAloneObjectMapper Instance + { + get + { + if (instance != null) + return instance; + + instance = new StandAloneObjectMapper(); + return instance; + } + } + + protected StandAloneObjectMapper() { } + + /// + /// Map a type of object from a FrameStream to a object + /// + /// Type of object to map + /// FrameStream to be used + /// Returns the mapped object + public override object Map(Type type, BMSByte stream) + { + object obj = null; + + if (type == typeof(Float2)) + obj = MapFloat2(stream); + else if (type == typeof(Float3)) + obj = MapFloat3(stream); + else if (type == typeof(Float4)) + obj = MapFloat4(stream); + else + obj = base.Map(type, stream); + + return obj; + } + + /// + /// Get a mapped value out of the FrameStream + /// + /// Value to get out of it + /// FrameStream to be used + /// Returns a mapped value from the FrameStream + public override T Map(BMSByte stream) + { + object obj = null; + var genericType = typeof(T); + + if (genericType == typeof(Float2)) + obj = MapFloat2(stream); + else if (genericType == typeof(Float3)) + obj = MapFloat3(stream); + else if (genericType == typeof(Float4)) + obj = MapFloat4(stream); + else + obj = base.Map(stream); + + return (T)obj; + } + + /// + /// Gets the bytes for the Instance of an Object and appends them to a BMSByte. + /// + /// The Instance of the Object. + /// The Type of the Object. + /// BMSByte to which the bytes should be added. + protected override void GetBytes(object o, Type type, ref BMSByte bytes) + { + if (type == typeof(Float2)) + { + bytes.Append(BitConverter.GetBytes(((Float2)o).x)); + bytes.Append(BitConverter.GetBytes(((Float2)o).y)); + } + else if (type == typeof(Float3)) + { + bytes.Append(BitConverter.GetBytes(((Float3)o).x)); + bytes.Append(BitConverter.GetBytes(((Float3)o).y)); + bytes.Append(BitConverter.GetBytes(((Float3)o).z)); + } + else if (type == typeof(Float4)) + { + bytes.Append(BitConverter.GetBytes(((Float4)o).x)); + bytes.Append(BitConverter.GetBytes(((Float4)o).y)); + bytes.Append(BitConverter.GetBytes(((Float4)o).z)); + bytes.Append(BitConverter.GetBytes(((Float4)o).w)); + } + else + base.GetBytes(o, type, ref bytes); + } + + protected override byte[] GetBytesArray(object o, Type type) + { + byte[] data; + if (type == typeof(Float2)) + { + data = new byte[sizeof(float) * 2]; + Buffer.BlockCopy(BitConverter.GetBytes(((Float2)o).x), 0, data, 0, sizeof(float)); + Buffer.BlockCopy(BitConverter.GetBytes(((Float2)o).y), 0, data, sizeof(float), sizeof(float)); + return data; + } + else if (type == typeof(Float3)) + { + data = new byte[sizeof(float) * 3]; + Buffer.BlockCopy(BitConverter.GetBytes(((Float3)o).x), 0, data, 0, sizeof(float)); + Buffer.BlockCopy(BitConverter.GetBytes(((Float3)o).y), 0, data, sizeof(float), sizeof(float)); + Buffer.BlockCopy(BitConverter.GetBytes(((Float3)o).z), 0, data, sizeof(float) * 2, sizeof(float)); + return data; + } + else if (type == typeof(Float4)) + { + data = new byte[sizeof(float) * 4]; + Buffer.BlockCopy(BitConverter.GetBytes(((Float4)o).x), 0, data, 0, sizeof(float)); + Buffer.BlockCopy(BitConverter.GetBytes(((Float4)o).y), 0, data, sizeof(float), sizeof(float)); + Buffer.BlockCopy(BitConverter.GetBytes(((Float4)o).z), 0, data, sizeof(float) * 2, sizeof(float)); + Buffer.BlockCopy(BitConverter.GetBytes(((Float4)o).w), 0, data, sizeof(float) * 3, sizeof(float)); + return data; + } + else + return base.GetBytesArray(o, type); + } + + /// + /// Get a Vector2 out of a FrameStream + /// + /// FrameStream to be used + /// A Vector2 out of the FrameStream + public object MapFloat2(BMSByte stream) + { + return new Float2( + stream.GetBasicType(), + stream.GetBasicType() + ); + } + + /// + /// Get a Vector3 out of a FrameStream + /// + /// FrameStream to be used + /// A Vector3 out of the FrameStream + public object MapFloat3(BMSByte stream) + { + return new Float3( + stream.GetBasicType(), + stream.GetBasicType(), + stream.GetBasicType() + ); + } + + /// + /// Get a Vector4 out of a FrameStream + /// + /// Type of object to be mapped + /// FrameStream to be used + /// A type of Vector4 (Vector4/Color/Quaternion) out of the FrameStream + public object MapFloat4(BMSByte stream) + { + x = stream.GetBasicType(); + y = stream.GetBasicType(); + z = stream.GetBasicType(); + w = stream.GetBasicType(); + + return new Float4(x, y, z, w); + } + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/StandAloneObjectMapper.cs.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/StandAloneObjectMapper.cs.meta new file mode 100644 index 00000000..61a60e90 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/StandAloneObjectMapper.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 4284964d06d3f2f4a8946c37be2e437b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects.meta new file mode 100644 index 00000000..ea827788 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 0a230994537385040a7c245ac5802c13 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float2Unity.cs b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float2Unity.cs new file mode 100644 index 00000000..899b4ec3 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float2Unity.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace BeardedManStudios +{ + public partial struct Float2 + { + public static implicit operator Float2(Vector2 v) + { + return new Vector2(v.x, v.y); + } + + public static implicit operator Vector2(Float2 f) + { + return new Vector2(f.x, f.y); + } + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float2Unity.cs.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float2Unity.cs.meta new file mode 100644 index 00000000..2a86ad39 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float2Unity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 152a4431fd306374ba8d73d514a0dc39 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float3Unity.cs b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float3Unity.cs new file mode 100644 index 00000000..c2a1d998 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float3Unity.cs @@ -0,0 +1,17 @@ +using UnityEngine; + +namespace BeardedManStudios +{ + public partial struct Float3 + { + public static implicit operator Float3(Vector3 v) + { + return new Float3(v.x, v.y, v.z); + } + + public static implicit operator Vector3(Float3 f) + { + return new Vector3(f.x, f.y, f.z); + } + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float3Unity.cs.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float3Unity.cs.meta new file mode 100644 index 00000000..b89df1b3 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float3Unity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2bff69700abd24a4193e65d889857705 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float4Unity.cs b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float4Unity.cs new file mode 100644 index 00000000..eb736c5c --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float4Unity.cs @@ -0,0 +1,37 @@ +using UnityEngine; + +namespace BeardedManStudios +{ + public partial struct Float4 + { + public static implicit operator Float4(Vector4 v) + { + return new Float4(v.x, v.y, v.z, v.w); + } + + public static implicit operator Vector4(Float4 f) + { + return new Vector4(f.x, f.y, f.z, f.w); + } + + public static implicit operator Float4(Quaternion q) + { + return new Float4(q.x, q.y, q.z, q.w); + } + + public static implicit operator Quaternion(Float4 f) + { + return new Quaternion(f.x, f.y, f.z, f.w); + } + + public static implicit operator Float4(Color c) + { + return new Float4(c.r, c.g, c.b, c.a); + } + + public static implicit operator Color(Float4 f) + { + return new Color(f.x, f.y, f.z, f.w); + } + } +} diff --git a/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float4Unity.cs.meta b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float4Unity.cs.meta new file mode 100644 index 00000000..0d5dbca1 --- /dev/null +++ b/ForgeUnity/Assets/BeardedManStudios/Scripts/StandAlone/UnityObjects/Float4Unity.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: d1bb89f299ea92f4cb814d04e05e47dc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: