diff --git a/Unity/Assets/JCMG/Curves/Docs.meta b/Unity/Assets/JCMG/Curves/Docs.meta
new file mode 100644
index 0000000..61d8a47
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Docs.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 7ccf5c90fc7a2eb4f9e29da46ada2e3b
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Unity/Assets/JCMG/Curves/Docs/Images.meta b/Unity/Assets/JCMG/Curves/Docs/Images.meta
new file mode 100644
index 0000000..0853bb8
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Docs/Images.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 35d496f281fbc5144ab85257279fad35
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Unity/Assets/JCMG/Curves/Docs/Images/portrait.png b/Unity/Assets/JCMG/Curves/Docs/Images/portrait.png
new file mode 100644
index 0000000..63a5e99
Binary files /dev/null and b/Unity/Assets/JCMG/Curves/Docs/Images/portrait.png differ
diff --git a/Unity/Assets/JCMG/Curves/Docs/Images/portrait.png.meta b/Unity/Assets/JCMG/Curves/Docs/Images/portrait.png.meta
new file mode 100644
index 0000000..bc2a92a
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Docs/Images/portrait.png.meta
@@ -0,0 +1,91 @@
+fileFormatVersion: 2
+guid: 46743cf676633b94bb8e103447c732cf
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 10
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Unity/Assets/JCMG/Curves/Docs/Images/social_share_image.png b/Unity/Assets/JCMG/Curves/Docs/Images/social_share_image.png
new file mode 100644
index 0000000..beea823
Binary files /dev/null and b/Unity/Assets/JCMG/Curves/Docs/Images/social_share_image.png differ
diff --git a/Unity/Assets/JCMG/Curves/Docs/Images/social_share_image.png.meta b/Unity/Assets/JCMG/Curves/Docs/Images/social_share_image.png.meta
new file mode 100644
index 0000000..0bf429e
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Docs/Images/social_share_image.png.meta
@@ -0,0 +1,91 @@
+fileFormatVersion: 2
+guid: 682980204b2aea846bee4e8fd6ac2483
+TextureImporter:
+ internalIDToNameTable: []
+ externalObjects: {}
+ serializedVersion: 10
+ mipmaps:
+ mipMapMode: 0
+ enableMipMap: 1
+ sRGBTexture: 1
+ linearTexture: 0
+ fadeOut: 0
+ borderMipMap: 0
+ mipMapsPreserveCoverage: 0
+ alphaTestReferenceValue: 0.5
+ mipMapFadeDistanceStart: 1
+ mipMapFadeDistanceEnd: 3
+ bumpmap:
+ convertToNormalMap: 0
+ externalNormalMap: 0
+ heightScale: 0.25
+ normalMapFilter: 0
+ isReadable: 0
+ streamingMipmaps: 0
+ streamingMipmapsPriority: 0
+ grayScaleToAlpha: 0
+ generateCubemap: 6
+ cubemapConvolution: 0
+ seamlessCubemap: 0
+ textureFormat: 1
+ maxTextureSize: 2048
+ textureSettings:
+ serializedVersion: 2
+ filterMode: -1
+ aniso: -1
+ mipBias: -100
+ wrapU: -1
+ wrapV: -1
+ wrapW: -1
+ nPOTScale: 1
+ lightmap: 0
+ compressionQuality: 50
+ spriteMode: 0
+ spriteExtrude: 1
+ spriteMeshType: 1
+ alignment: 0
+ spritePivot: {x: 0.5, y: 0.5}
+ spritePixelsToUnits: 100
+ spriteBorder: {x: 0, y: 0, z: 0, w: 0}
+ spriteGenerateFallbackPhysicsShape: 1
+ alphaUsage: 1
+ alphaIsTransparency: 0
+ spriteTessellationDetail: -1
+ textureType: 0
+ textureShape: 1
+ singleChannelComponent: 0
+ maxTextureSizeSet: 0
+ compressionQualitySet: 0
+ textureFormatSet: 0
+ platformSettings:
+ - serializedVersion: 3
+ buildTarget: DefaultTexturePlatform
+ maxTextureSize: 2048
+ resizeAlgorithm: 0
+ textureFormat: -1
+ textureCompression: 1
+ compressionQuality: 50
+ crunchedCompression: 0
+ allowsAlphaSplitting: 0
+ overridden: 0
+ androidETC2FallbackOverride: 0
+ forceMaximumCompressionQuality_BC6H_BC7: 0
+ spriteSheet:
+ serializedVersion: 2
+ sprites: []
+ outline: []
+ physicsShape: []
+ bones: []
+ spriteID:
+ internalID: 0
+ vertices: []
+ indices:
+ edges: []
+ weights: []
+ secondaryTextures: []
+ spritePackingTag:
+ pSDRemoveMatte: 0
+ pSDShowRemoveMatteOption: 0
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Unity/Assets/JCMG/Curves/Scripts/Editor/MenuItems.cs b/Unity/Assets/JCMG/Curves/Scripts/Editor/MenuItems.cs
index c57eaa7..c8a60b8 100644
--- a/Unity/Assets/JCMG/Curves/Scripts/Editor/MenuItems.cs
+++ b/Unity/Assets/JCMG/Curves/Scripts/Editor/MenuItems.cs
@@ -20,5 +20,27 @@ internal static void CreateBezierSpline()
EditorGUIUtility.PingObject(obj.gameObject);
}
+
+ [MenuItem("Tools/JCMG/Curves/Submit bug or feature request")]
+ internal static void OpenURLToGitHubIssuesSection()
+ {
+ const string GITHUB_ISSUES_URL = "https://github.com/jeffcampbellmakesgames/unity-curves/issues";
+
+ Application.OpenURL(GITHUB_ISSUES_URL);
+ }
+
+ [MenuItem("Tools/JCMG/Curves/Donate to support development")]
+ internal static void OpenURLToKoFi()
+ {
+ const string KOFI_URL = "https://ko-fi.com/stampyturtle";
+
+ Application.OpenURL(KOFI_URL);
+ }
+
+ [MenuItem("Tools/JCMG/Curves/About")]
+ internal static void OpenAboutModalDialog()
+ {
+ AboutWindow.View();
+ }
}
}
diff --git a/Unity/Assets/JCMG/Curves/Scripts/Editor/VersionConstants.cs b/Unity/Assets/JCMG/Curves/Scripts/Editor/VersionConstants.cs
new file mode 100644
index 0000000..3dcb36f
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Scripts/Editor/VersionConstants.cs
@@ -0,0 +1,11 @@
+namespace JCMG.Curves.Editor
+{
+ ///
+ /// Version info for this library.
+ ///
+ internal static class VersionConstants
+ {
+ // Version
+ public const string VERSION = "1.1.1";
+ }
+}
diff --git a/Unity/Assets/JCMG/Curves/Scripts/Editor/VersionConstants.cs.meta b/Unity/Assets/JCMG/Curves/Scripts/Editor/VersionConstants.cs.meta
new file mode 100644
index 0000000..084a79c
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Scripts/Editor/VersionConstants.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 7bed5e8f28933a74fb4ccf1cc036bfaf
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences: []
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Unity/Assets/JCMG/Curves/Scripts/Editor/Window.meta b/Unity/Assets/JCMG/Curves/Scripts/Editor/Window.meta
new file mode 100644
index 0000000..49877a9
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Scripts/Editor/Window.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 4ee1d68d1abb9c64aa63225f6ed4b098
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Unity/Assets/JCMG/Curves/Scripts/Editor/Window/AboutWindow.cs b/Unity/Assets/JCMG/Curves/Scripts/Editor/Window/AboutWindow.cs
new file mode 100644
index 0000000..334792f
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Scripts/Editor/Window/AboutWindow.cs
@@ -0,0 +1,126 @@
+using UnityEditor;
+using UnityEngine;
+
+namespace JCMG.Curves.Editor
+{
+ ///
+ /// A window that shows information about the library and its contributors.
+ ///
+ internal sealed class AboutWindow : EditorWindow
+ {
+ #pragma warning disable 0649
+
+ [SerializeField]
+ private Texture2D _socialShareImage;
+
+ [SerializeField]
+ private Texture2D _portraitImage;
+
+ #pragma warning restore 0649
+
+ private const string WINDOW_TITLE = "JCMG Curves";
+ private const string VERSION_LABEL = "Version:";
+ private const string GITHUB_LABEL = "GitHub:";
+ private const string KOFI_LABEL = "KOFI:";
+ private const string TWITTER_LABEL = "Twitter:";
+
+ private const string GITHUB_URL = "https://github.com/jeffcampbellmakesgames";
+ private const string KOFI_URL = "https://ko-fi.com/stampyturtle";
+ private const string TWITTER_URL = "https://twitter.com/StampyTurtle";
+
+ private const string SHARE_MESSAGE = "Hi there! My name is Jeff Campbell and I make open source tools for game " +
+ "developers.\n\nIf you enjoy using this tool and want to support its development " +
+ "and other high-quality, free open-source tools, follow me on Twitter, " +
+ "GitHub, and consider buying me a coffee on Ko-Fi.";
+
+ public static void View()
+ {
+ var window = CreateInstance();
+ window.minSize = new Vector2(512f, 490f);
+ window.maxSize = window.minSize;
+ window.titleContent = new GUIContent(WINDOW_TITLE);
+ window.position = new Rect(
+ Screen.currentResolution.width / 2f,
+ Screen.currentResolution.height / 2f,
+ 0f,
+ 0f);
+ window.ShowUtility();
+ }
+
+ private void OnGUI()
+ {
+ // JCMG Share Image
+ if (_socialShareImage != null)
+ {
+ GUILayout.Label(_socialShareImage);
+
+ DrawSeparator();
+ }
+
+ // COC Version
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ EditorGUILayout.LabelField(VERSION_LABEL, EditorStyles.boldLabel, GUILayout.Width(75f));
+ EditorGUILayout.LabelField(VersionConstants.VERSION);
+ }
+
+ DrawSeparator();
+
+ // Share message and portrait
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ if (_portraitImage != null)
+ {
+ GUILayout.Label(_portraitImage, GUILayout.Width(96f), GUILayout.Height(96f));
+ }
+ EditorGUILayout.SelectableLabel(SHARE_MESSAGE, EditorStyles.textArea, GUILayout.Height(96f));
+ }
+
+ // Links for Github, KoFi, and Twitter
+ var originalColor = GUI.contentColor;
+
+ // Twitter
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ EditorGUILayout.LabelField(TWITTER_LABEL, EditorStyles.boldLabel, GUILayout.Width(75f));
+ GUI.contentColor = Color.cyan;
+ if (GUILayout.Button(TWITTER_URL, GUI.skin.label))
+ {
+ Application.OpenURL(TWITTER_URL);
+ }
+
+ GUI.contentColor = originalColor;
+ }
+
+ // Github
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ EditorGUILayout.LabelField(GITHUB_LABEL, EditorStyles.boldLabel, GUILayout.Width(75f));
+ GUI.contentColor = Color.cyan;
+ if (GUILayout.Button(GITHUB_URL, GUI.skin.label))
+ {
+ Application.OpenURL(GITHUB_URL);
+ }
+ GUI.contentColor = originalColor;
+ }
+
+ // KOFI
+ using (new EditorGUILayout.HorizontalScope())
+ {
+ EditorGUILayout.LabelField(KOFI_LABEL, EditorStyles.boldLabel, GUILayout.Width(75f));
+ GUI.contentColor = Color.cyan;
+ if (GUILayout.Button(KOFI_URL, GUI.skin.label))
+ {
+ Application.OpenURL(KOFI_URL);
+ }
+
+ GUI.contentColor = originalColor;
+ }
+ }
+
+ private void DrawSeparator()
+ {
+ GUILayout.Box(string.Empty, GUILayout.ExpandWidth(true), GUILayout.Height(1));
+ }
+ }
+}
diff --git a/Unity/Assets/JCMG/Curves/Scripts/Editor/Window/AboutWindow.cs.meta b/Unity/Assets/JCMG/Curves/Scripts/Editor/Window/AboutWindow.cs.meta
new file mode 100644
index 0000000..d3780e6
--- /dev/null
+++ b/Unity/Assets/JCMG/Curves/Scripts/Editor/Window/AboutWindow.cs.meta
@@ -0,0 +1,14 @@
+fileFormatVersion: 2
+guid: 9b1786740535b4e498488c9a45423efe
+MonoImporter:
+ externalObjects: {}
+ serializedVersion: 2
+ defaultReferences:
+ - m_ViewDataDictionary: {instanceID: 0}
+ - _socialShareImage: {fileID: 2800000, guid: 682980204b2aea846bee4e8fd6ac2483, type: 3}
+ - _portraitImage: {fileID: 2800000, guid: 46743cf676633b94bb8e103447c732cf, type: 3}
+ executionOrder: 0
+ icon: {instanceID: 0}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Unity/JCMG.Curves.Editor.csproj.DotSettings b/Unity/JCMG.Curves.Editor.csproj.DotSettings
index 9b48646..9e42951 100644
--- a/Unity/JCMG.Curves.Editor.csproj.DotSettings
+++ b/Unity/JCMG.Curves.Editor.csproj.DotSettings
@@ -1,5 +1,7 @@
+ True
True
True
True
- True
\ No newline at end of file
+ True
+ True
\ No newline at end of file
diff --git a/Unity/JCMG.Curves.csproj.DotSettings b/Unity/JCMG.Curves.csproj.DotSettings
index 2ca4911..98fdc90 100644
--- a/Unity/JCMG.Curves.csproj.DotSettings
+++ b/Unity/JCMG.Curves.csproj.DotSettings
@@ -1,4 +1,5 @@
+ True
True
True
True