From 2d50c6c6875682e28af34efdc62671f197b489cb Mon Sep 17 00:00:00 2001 From: Robin Sharma Date: Fri, 23 Sep 2022 15:49:41 +0200 Subject: [PATCH] Add graphy UI in scene --- Assets/Graphy - Ultimate Stats Monitor.meta | 8 + .../Changelog.txt | 161 ++ .../Changelog.txt.meta | 13 + .../Editor.meta | 8 + .../Editor/GraphyDebuggerEditor.cs | 577 +++++++ .../Editor/GraphyDebuggerEditor.cs.meta | 12 + .../Editor/GraphyEditorStyle.cs | 118 ++ .../Editor/GraphyEditorStyle.cs.meta | 11 + .../Editor/GraphyManagerEditor.cs | 839 +++++++++ .../Editor/GraphyManagerEditor.cs.meta | 11 + .../Editor/GraphyMenuItem.cs | 61 + .../Editor/GraphyMenuItem.cs.meta | 11 + .../Editor/Tayx.Graphy.Editor.asmdef | 23 + .../Editor/Tayx.Graphy.Editor.asmdef.meta | 7 + .../Graphy - Ultimate Stats Monitor/Font.meta | 9 + .../Font/Northwest-Bold.meta | 9 + .../ERIC-TIRADO-NORTHWEST-LICENSE.txt | 18 + .../ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta | 10 + .../Font/Northwest-Bold/NORTHWEST-B.otf | Bin 0 -> 6040 bytes .../Font/Northwest-Bold/NORTHWEST-B.otf.meta | 22 + .../Font/Roboto.meta | 9 + .../Font/Roboto/LICENSE.txt | 202 +++ .../Font/Roboto/LICENSE.txt.meta | 10 + .../Font/Roboto/Roboto-Bold.ttf | Bin 0 -> 170760 bytes .../Font/Roboto/Roboto-Bold.ttf.meta | 23 + .../Font/Roboto/Roboto-Regular.ttf | Bin 0 -> 171676 bytes .../Font/Roboto/Roboto-Regular.ttf.meta | 23 + .../Graphy - Ultimate Stats Monitor/GUI.meta | 9 + .../GUI/GraphyGUISkin.guiskin | 1494 +++++++++++++++++ .../GUI/GraphyGUISkin.guiskin.meta | 10 + ...raphy_CustomizationScene.unitypackage.meta | 7 + .../Graphy - Ultimate Stats Monitor/LICENSE | 21 + .../LICENSE.meta | 7 + .../Materials.meta | 9 + .../Materials/Audio_Spectrum_Graph.mat | 90 + .../Materials/Audio_Spectrum_Graph.mat.meta | 15 + .../Audio_Spectrum_Highest_Values_Graph.mat | 90 + ...dio_Spectrum_Highest_Values_Graph.mat.meta | 15 + .../Materials/FPS_Graph.mat | 90 + .../Materials/FPS_Graph.mat.meta | 16 + .../Materials/RAM_Allocated_Graph.mat | 90 + .../Materials/RAM_Allocated_Graph.mat.meta | 16 + .../Materials/RAM_Mono_Graph.mat | 90 + .../Materials/RAM_Mono_Graph.mat.meta | 16 + .../Materials/RAM_Reserved_Graph.mat | 90 + .../Materials/RAM_Reserved_Graph.mat.meta | 16 + .../Prefab.meta | 9 + .../Prefab/Internal.meta | 8 + .../Prefab/Internal/ADVANCED - Module.prefab | 887 ++++++++++ .../Internal/ADVANCED - Module.prefab.meta | 7 + .../Prefab/Internal/AUDIO - Module.prefab | 662 ++++++++ .../Internal/AUDIO - Module.prefab.meta | 7 + .../Prefab/Internal/FPS - Module.prefab | 1426 ++++++++++++++++ .../Prefab/Internal/FPS - Module.prefab.meta | 7 + .../Prefab/Internal/RAM - Module.prefab | 1396 +++++++++++++++ .../Prefab/Internal/RAM - Module.prefab.meta | 7 + .../Prefab/[Graphy].prefab | 668 ++++++++ .../Prefab/[Graphy].prefab.meta | 22 + .../Graphy - Ultimate Stats Monitor/README.md | 112 ++ .../README.md.meta | 7 + .../Readme! - Graphy - Documentation.pdf | Bin 0 -> 2512948 bytes .../Readme! - Graphy - Documentation.pdf.meta | 14 + .../Runtime.meta | 8 + .../Runtime/Advanced.meta | 9 + .../Runtime/Advanced/G_AdvancedData.cs | 363 ++++ .../Runtime/Advanced/G_AdvancedData.cs.meta | 12 + .../Runtime/Audio.meta | 9 + .../Runtime/Audio/G_AudioGraph.cs | 290 ++++ .../Runtime/Audio/G_AudioGraph.cs.meta | 12 + .../Runtime/Audio/G_AudioManager.cs | 235 +++ .../Runtime/Audio/G_AudioManager.cs.meta | 12 + .../Runtime/Audio/G_AudioMonitor.cs | 210 +++ .../Runtime/Audio/G_AudioMonitor.cs.meta | 12 + .../Runtime/Audio/G_AudioText.cs | 90 + .../Runtime/Audio/G_AudioText.cs.meta | 12 + .../Runtime/Fps.meta | 9 + .../Runtime/Fps/G_FpsGraph.cs | 197 +++ .../Runtime/Fps/G_FpsGraph.cs.meta | 12 + .../Runtime/Fps/G_FpsManager.cs | 249 +++ .../Runtime/Fps/G_FpsManager.cs.meta | 12 + .../Runtime/Fps/G_FpsMonitor.cs | 145 ++ .../Runtime/Fps/G_FpsMonitor.cs.meta | 12 + .../Runtime/Fps/G_FpsText.cs | 154 ++ .../Runtime/Fps/G_FpsText.cs.meta | 12 + .../Runtime/Graph.meta | 9 + .../Runtime/Graph/G_Graph.cs | 35 + .../Runtime/Graph/G_Graph.cs.meta | 12 + .../Runtime/GraphyDebugger.cs | 570 +++++++ .../Runtime/GraphyDebugger.cs.meta | 12 + .../Runtime/GraphyManager.cs | 848 ++++++++++ .../Runtime/GraphyManager.cs.meta | 12 + .../Runtime/Ram.meta | 9 + .../Runtime/Ram/G_RamGraph.cs | 271 +++ .../Runtime/Ram/G_RamGraph.cs.meta | 12 + .../Runtime/Ram/G_RamManager.cs | 237 +++ .../Runtime/Ram/G_RamManager.cs.meta | 12 + .../Runtime/Ram/G_RamMonitor.cs | 43 + .../Runtime/Ram/G_RamMonitor.cs.meta | 12 + .../Runtime/Ram/G_RamText.cs | 96 ++ .../Runtime/Ram/G_RamText.cs.meta | 12 + .../Runtime/Shader.meta | 9 + .../Runtime/Shader/G_GraphShader.cs | 137 ++ .../Runtime/Shader/G_GraphShader.cs.meta | 12 + .../Runtime/Tayx.Graphy.asmdef | 21 + .../Runtime/Tayx.Graphy.asmdef.meta | 7 + .../Runtime/UI.meta | 9 + .../Runtime/UI/IModifiableState.cs | 26 + .../Runtime/UI/IModifiableState.cs.meta | 12 + .../Runtime/UI/IMovable.cs | 26 + .../Runtime/UI/IMovable.cs.meta | 12 + .../Runtime/Util.meta | 9 + .../Runtime/Util/G_ExtensionMethods.cs | 65 + .../Runtime/Util/G_ExtensionMethods.cs.meta | 12 + .../Runtime/Util/G_FloatString.cs | 196 +++ .../Runtime/Util/G_FloatString.cs.meta | 12 + .../Runtime/Util/G_Intstring.cs | 117 ++ .../Runtime/Util/G_Intstring.cs.meta | 12 + .../Runtime/Util/G_Singleton.cs | 84 + .../Runtime/Util/G_Singleton.cs.meta | 12 + .../Shaders.meta | 9 + .../Shaders/GraphMobile.shader | 182 ++ .../Shaders/GraphMobile.shader.meta | 9 + .../Shaders/GraphStandard.shader | 190 +++ .../Shaders/GraphStandard.shader.meta | 9 + .../Textures.meta | 9 + .../Textures/2x2_Texture.png | Bin 0 -> 17251 bytes .../Textures/2x2_Texture.png.meta | 105 ++ .../Textures/Debugger_Logo_Dark.png | Bin 0 -> 2158 bytes .../Textures/Debugger_Logo_Dark.png.meta | 94 ++ .../Textures/Debugger_Logo_White.png | Bin 0 -> 2315 bytes .../Textures/Debugger_Logo_White.png.meta | 94 ++ .../Textures/Manager_Logo_Dark.png | Bin 0 -> 2153 bytes .../Textures/Manager_Logo_Dark.png.meta | 94 ++ .../Textures/Manager_Logo_White.png | Bin 0 -> 2297 bytes .../Textures/Manager_Logo_White.png.meta | 94 ++ .../Textures/Rounded_Rect_10px.png | Bin 0 -> 1766 bytes .../Textures/Rounded_Rect_10px.png.meta | 103 ++ .../package.json | 20 + .../package.json.meta | 7 + Assets/Scenes/Loadtest Scene.unity | 186 +- 140 files changed, 15897 insertions(+), 1 deletion(-) create mode 100644 Assets/Graphy - Ultimate Stats Monitor.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Changelog.txt create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Changelog.txt.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Roboto.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Bold.ttf create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Bold.ttf.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Regular.ttf create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Regular.ttf.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/GUI.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/GUI/GraphyGUISkin.guiskin create mode 100644 Assets/Graphy - Ultimate Stats Monitor/GUI/GraphyGUISkin.guiskin.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Graphy_CustomizationScene.unitypackage.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/LICENSE create mode 100644 Assets/Graphy - Ultimate Stats Monitor/LICENSE.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Graph.mat create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Graph.mat.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Highest_Values_Graph.mat create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/Audio_Spectrum_Highest_Values_Graph.mat.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/FPS_Graph.mat create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/FPS_Graph.mat.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/RAM_Allocated_Graph.mat create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/RAM_Allocated_Graph.mat.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/RAM_Mono_Graph.mat create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/RAM_Mono_Graph.mat.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/RAM_Reserved_Graph.mat create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Materials/RAM_Reserved_Graph.mat.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/ADVANCED - Module.prefab create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/ADVANCED - Module.prefab.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/AUDIO - Module.prefab create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/AUDIO - Module.prefab.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/FPS - Module.prefab create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/FPS - Module.prefab.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/RAM - Module.prefab create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/Internal/RAM - Module.prefab.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/[Graphy].prefab create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Prefab/[Graphy].prefab.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/README.md create mode 100644 Assets/Graphy - Ultimate Stats Monitor/README.md.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Readme! - Graphy - Documentation.pdf create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Readme! - Graphy - Documentation.pdf.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Advanced.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Advanced/G_AdvancedData.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Advanced/G_AdvancedData.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioGraph.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioManager.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioMonitor.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Audio/G_AudioText.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsGraph.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsManager.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsMonitor.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsText.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Fps/G_FpsText.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Graph.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Graph/G_Graph.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Graph/G_Graph.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/GraphyDebugger.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/GraphyDebugger.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/GraphyManager.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/GraphyManager.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamGraph.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamGraph.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamManager.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamManager.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamMonitor.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamMonitor.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamText.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Ram/G_RamText.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Shader.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Shader/G_GraphShader.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Shader/G_GraphShader.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Tayx.Graphy.asmdef create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Tayx.Graphy.asmdef.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/UI.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/UI/IModifiableState.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/UI/IModifiableState.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/UI/IMovable.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/UI/IMovable.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_ExtensionMethods.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_ExtensionMethods.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_FloatString.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_FloatString.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Intstring.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Intstring.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Singleton.cs create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Runtime/Util/G_Singleton.cs.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Shaders.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Shaders/GraphMobile.shader create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Shaders/GraphMobile.shader.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Shaders/GraphStandard.shader create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Shaders/GraphStandard.shader.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/2x2_Texture.png create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/2x2_Texture.png.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Debugger_Logo_Dark.png create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Debugger_Logo_Dark.png.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Debugger_Logo_White.png create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Debugger_Logo_White.png.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Manager_Logo_Dark.png create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Manager_Logo_Dark.png.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Manager_Logo_White.png create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Manager_Logo_White.png.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Rounded_Rect_10px.png create mode 100644 Assets/Graphy - Ultimate Stats Monitor/Textures/Rounded_Rect_10px.png.meta create mode 100644 Assets/Graphy - Ultimate Stats Monitor/package.json create mode 100644 Assets/Graphy - Ultimate Stats Monitor/package.json.meta diff --git a/Assets/Graphy - Ultimate Stats Monitor.meta b/Assets/Graphy - Ultimate Stats Monitor.meta new file mode 100644 index 0000000..918a58e --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 214220f6c1db2ce40a39909263333d04 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Changelog.txt b/Assets/Graphy - Ultimate Stats Monitor/Changelog.txt new file mode 100644 index 0000000..3f11ad3 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Changelog.txt @@ -0,0 +1,161 @@ +----------------------------- +v2.1.3 + +- Added null check for Keyboard.current. + +----------------------------- +v2.1.2 + +- Fixed NullRef in AudioMonitor if no main camera is in the scene. + +----------------------------- +v2.1.1 + +- Small hotfix for a index of out bounds error. +- Simplified Singleton class to allow Graphy to be Destroyed. +- Deallocating cached strings on Destroy to free up memory. + +----------------------------- +v2.1.0 + +- Pretty big refactor. +- Lots of optimization. +- Removed min/max fps for 1% and 0.1% lows, which is the industry standard now. +- Improved UI. Added rounded corners and a better default color palette. + +----------------------------- +v2.0.1 + +- Updated package.json to 2.0.1. + +----------------------------- +v2.0.0 + +- Now supports UPM (Unity Package Manager). +- Minimum official supported version is now Unity 2019.3.0. If you want a version that supports 5.4+, go to Github to download it. +- Lots of minor tweaks, optimizations and bugfixes. + +----------------------------- +v1.6.0 + +This is the last release that will officially support Unity 5.4+. Next releases will be targeted towards 2019.3+. + +- Minor tweaks, optimizations and bugfixes. +- Added support for VR single pass instanced rendering. + +----------------------------- +v1.5.2 + +- Removed asmdefs to avoid missing reference issues in new Unity alpha versions. +- Improvements avgFps calculation, changed list to array (thanks @Kaladrius2trip). + +----------------------------- +v1.5.1 + +- Hide Graphy in Game view when it's be disabled on startup. +- Fixed error if no camera is present in the scene. +- Added SceneManager namespace so to avoid possible conflicts. +- Added support for asmdefs (thanks @QSFW). + +----------------------------- +v1.5 + +- Fixed a number alignment in the audio module (thanks @SuperPenguin). +- Refactored some code to avoid warnings with the new NET framework 4.0. +- Shader sorting fix for Screen Space - Camera. +- Fixed a possible Null Reference Error in the debugger (thanks @strawlink). +- Fixed import settings in 2 textures (thanks @strawlink). +- Renamed all Action into System.Action to avoid possible namespace conflicts. +- Fixed the int rounding to prevent 59.99999FPS from turning into 59FPS (thanks @Rockylars). + +----------------------------- +v1.4.3 + +- Renamed all the classes with the "G_" prefix to avoid namespace issues with external code (thanks @Rockylars). +- Refactored some code and added explanations and regions in the G_ShaderGraph class. +- Assigned all the variables in their declaration to avoid a new NET framework warning. + +----------------------------- +v1.4.2 + +- Added the option to disable hotkeys. +- Disabled hotkey check when Editor is not focused (thanks @Rockylars). +- Refatored and cleaned up code (thanks @Rockylars). +- Fixed a bug where if the app was defocused and focused back, it would reset Graphy's module active values (thanks @Rockylars). + +----------------------------- +v1.4.1 + +- Introduced plenty of safety checks to avoid some null reference errors. +- Possibly fixed the graphs bug when the Editor is defocused and focused back. +- Code cleanup and refactoring. + +----------------------------- +v1.4 + +- Updated the header comments in all scripts. +- Added option to toggle active on start up (thanks @DarkMio). +- Removed a leftover raycast script in the Graphy UI.Canvas (thanks @DarkMio). +- Updated the shaders to use UnityObjectToClipPos() (thanks @DarkMio). +- Bug-Fix: NullRef for EditorStyles.boldlabel (thanks @Flavelius) + +----------------------------- +v1.3 + +- Added a second graph to the Audio module that shows the highest spectrum value. +- Added option to Toggle Active and Mode, as well as setting a specific Preset from the API. +- Fixed a bug that occured when Time.timeScale = 0 (thanks @xDavidLeon!). + +----------------------------- +v1.2.2 + +- Improved the dB calculations, now the values are much more precise. + +----------------------------- +v1.2.1 + +- Modified the default UI text values to more generic placeholders to increase clarity. +- Small fixes in the audio module. + +----------------------------- +v1.2 + +- MASSIVE reduction in garbage generation. From 8-10 KB every 2-3 seconds to just 200-300 bytes. Garbage generation right now is negligible. +- Some code optimizations. + +----------------------------- +v1.1 + +- New Feature: Added a modifiable MODE. If set to LIGHT it will reduce some features or maximum values (like graph resolution) but it will improve compatibility with older hardware. +- Small performance optimizations. +- Code refactoring. +- Improved the vetical alpha fade-off effect in the graph to make it more visible for lower values. +- Updated the "Customize Graphy" scene to account for these new changes. + +----------------------------- +v1.0 + +- First major update! +- Removed some leftover raycast targets from the Graphy UI to avoid interfering with users UI. +- Added a Customization Scene that allows changing all the parameters in runtime to improve the user experience when testing new values. +- Added a feature to rescale the background overlay of the Advanced Data module to the text with the highest width. +- Made ALL parameters modifiable from code using the API. +- Fixed a bug where sometimes the Graphy Manager would fail trying to retrieve the Audio Module. +- Improved stabilty. + +----------------------------- +v0.6 + +- Added a feature to choose if you want to apply a background overlay to Graphy, improving readability in cluttered scenes. +- Optimized the access to Shader parameters when updating them, improving performance. + +----------------------------- +v0.5.1 + +- Added a feature to choose if you want to keep Graphy alive through scene changes. Careful, if you activate it but Graphy is the child of another object, the root GameObject will also survive scene changes. +- Fixed a bug where setting Graphy as a child of another object would break the graphs. + +----------------------------- +v0.5 + +- Initial release! diff --git a/Assets/Graphy - Ultimate Stats Monitor/Changelog.txt.meta b/Assets/Graphy - Ultimate Stats Monitor/Changelog.txt.meta new file mode 100644 index 0000000..0ff1461 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Changelog.txt.meta @@ -0,0 +1,13 @@ +fileFormatVersion: 2 +guid: 425066d07b7c1204887be96c53348ac6 +labels: +- counter +- fps +- graphy +- tayx +timeCreated: 1515072754 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor.meta b/Assets/Graphy - Ultimate Stats Monitor/Editor.meta new file mode 100644 index 0000000..6de3ace --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 74026f7916b08a343916493b0a1752cc +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs new file mode 100644 index 0000000..3c85daf --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs @@ -0,0 +1,577 @@ +/* --------------------------------------- + * Author: Martin Pane (martintayx@gmail.com) (@tayx94) + * Contributors: https://github.com/Tayx94/graphy/graphs/contributors + * Project: Graphy - Ultimate Stats Monitor + * Date: 02-Jan-18 + * Studio: Tayx + * + * Git repo: https://github.com/Tayx94/graphy + * + * This project is released under the MIT license. + * Attribution is not required, but it is always welcomed! + * -------------------------------------*/ + +using System; +using UnityEngine; +using System.Collections.Generic; +using System.IO; +using UnityEditor; + +namespace Tayx.Graphy +{ + [CustomEditor(typeof(GraphyDebugger))] + internal class GraphyDebuggerEditor : Editor + { + /* ----- TODO: ---------------------------- + * Add summaries to the variables. + * Add summaries to the functions. + * Finish spacing on "OnInspectorGUI". + * Add sections to "OnInspectorGUI". + * Fix the use of Space to be consistent with "GraphyManagerEditor". + * --------------------------------------*/ + + #region Variables -> Private + + private GraphyDebugger m_target; + + private int m_newDebugPacketListSize = 0; + + private int m_previouslySelectedDebugPacketIndex = 0; + private int m_currentlySelectedDebugPacketIndex = 0; + + private int m_selectedDebugPacketCondition = 0; + + #endregion + + #region Methods -> Unity Callbacks + + private void OnEnable() + { + m_target = (GraphyDebugger) target; + } + + #endregion + + #region Methods -> Public Override + + public override void OnInspectorGUI() + { + if (m_target == null && target == null) + { + base.OnInspectorGUI(); + + return; + } + + float defaultLabelWidth = EditorGUIUtility.labelWidth; + float defaultFieldWidth = EditorGUIUtility.fieldWidth; + + //===== CONTENT REGION ======================================================================== + + GUILayout.Space(20); + + #region Section -> Logo + + if (GraphyEditorStyle.DebuggerLogoTexture != null) + { + GUILayout.Label + ( + image: GraphyEditorStyle.DebuggerLogoTexture, + style: new GUIStyle(GUI.skin.GetStyle("Label")) + { + alignment = TextAnchor.UpperCenter + } + ); + + GUILayout.Space(10); + } + else + { + EditorGUILayout.LabelField + ( + label: "[ GRAPHY - DEBUGGER ]", + style: GraphyEditorStyle.HeaderStyle1 + ); + } + + #endregion + + GUILayout.Space(5); //Extra pixels added when the logo is used. + + #region Section -> Settings + + SerializedObject serObj = serializedObject; + + SerializedProperty debugPacketList = serObj.FindProperty("m_debugPackets"); // Find the List in our script and create a refrence of it + + //Update our list + serObj.Update(); + + EditorGUILayout.LabelField("Current [Debug Packets] list size: " + debugPacketList.arraySize); + + EditorGUIUtility.fieldWidth = 32; + EditorGUILayout.BeginHorizontal(); + + + + m_newDebugPacketListSize = EditorGUILayout.IntField + ( + label: "Define a new list size", + value: m_newDebugPacketListSize + ); + + if (GUILayout.Button("Resize List")) + { + if (EditorUtility.DisplayDialog + ( + title: + "Resize List", + + message: + "Are you sure you want to resize the entire List?\n\n" + + "Current List Size -> " + + debugPacketList.arraySize + + "\n" + + "New List Size -> " + + m_newDebugPacketListSize + + "\n" + + "This will add default entries if the value is greater than the list size, or erase the bottom values until the new size specified.", + + ok: + "Resize", + + cancel: + "Cancel") + ) + { + m_currentlySelectedDebugPacketIndex = 0; + + if (m_newDebugPacketListSize != debugPacketList.arraySize) + { + while (m_newDebugPacketListSize > debugPacketList.arraySize) + { + debugPacketList.InsertArrayElementAtIndex(debugPacketList.arraySize); + SetDefaultDebugPacketValues(debugPacketList); + } + while (m_newDebugPacketListSize < debugPacketList.arraySize) + { + debugPacketList.DeleteArrayElementAtIndex(debugPacketList.arraySize - 1); + } + } + } + } + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.LabelField("NOT RECOMMENDED (Only use for first initialization)", EditorStyles.centeredGreyMiniLabel); + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + if (debugPacketList.arraySize < 1) + { + m_previouslySelectedDebugPacketIndex = 0; + m_currentlySelectedDebugPacketIndex = 0; + m_selectedDebugPacketCondition = 0; + + serializedObject.ApplyModifiedProperties(); + return; + } + + GraphyEditorStyle.HeaderStyle2.contentOffset = Vector2.down * 3f; + + EditorGUILayout.LabelField("Selected debug packet:"); + + EditorGUILayout.BeginHorizontal(); + + List debugPacketNames = new List(); + for (int i = 0; i < debugPacketList.arraySize; i++) + { + SerializedProperty listItem = debugPacketList.GetArrayElementAtIndex(i); + // NOTE: If the Popup detects two equal strings, it just paints 1, that's why I always add the "i" + char checkMark = listItem.FindPropertyRelative("Active").boolValue ? '\u2714' : '\u2718'; + debugPacketNames.Add + ( + (i + 1) + + " (" + + checkMark + + ") " + + " - ID: " + + listItem.FindPropertyRelative("Id").intValue + + " (Conditions: " + + listItem.FindPropertyRelative("DebugConditions").arraySize + + ")" + ); + } + + m_currentlySelectedDebugPacketIndex = EditorGUILayout.Popup(m_currentlySelectedDebugPacketIndex, debugPacketNames.ToArray()); + + if (m_currentlySelectedDebugPacketIndex != m_previouslySelectedDebugPacketIndex) + { + m_selectedDebugPacketCondition = 0; + + m_previouslySelectedDebugPacketIndex = m_currentlySelectedDebugPacketIndex; + } + + Color defaultGUIColor = GUI.color; + + GUI.color = new Color(0.7f, 1f, 0.0f, 1f); + + //Or add a new item to the List<> with a button + + if (GUILayout.Button("Add", GUILayout.Width(60))) + { + debugPacketList.InsertArrayElementAtIndex(debugPacketList.arraySize); + SetDefaultDebugPacketValues(debugPacketList); + } + + GUI.color = new Color(1f, 0.7f, 0.0f, 1f); + + //Remove this index from the List + + if (GUILayout.Button("Remove", GUILayout.Width(60))) + { + debugPacketList.DeleteArrayElementAtIndex(m_currentlySelectedDebugPacketIndex); + if (m_currentlySelectedDebugPacketIndex > 0) + { + m_currentlySelectedDebugPacketIndex--; + } + + if (debugPacketList.arraySize < 1) + { + serializedObject.ApplyModifiedProperties(); + return; + } + } + + GUI.color = defaultGUIColor; + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + //Display our list to the inspector window + + SerializedProperty listItemSelected = debugPacketList.GetArrayElementAtIndex(m_currentlySelectedDebugPacketIndex); + + SerializedProperty Active = listItemSelected.FindPropertyRelative("Active"); + SerializedProperty Id = listItemSelected.FindPropertyRelative("Id"); + SerializedProperty ExecuteOnce = listItemSelected.FindPropertyRelative("ExecuteOnce"); + SerializedProperty InitSleepTime = listItemSelected.FindPropertyRelative("InitSleepTime"); + SerializedProperty ExecuteSleepTime = listItemSelected.FindPropertyRelative("ExecuteSleepTime"); + SerializedProperty ConditionEvaluation = listItemSelected.FindPropertyRelative("ConditionEvaluation"); + SerializedProperty DebugConditions = listItemSelected.FindPropertyRelative("DebugConditions"); + SerializedProperty MessageType = listItemSelected.FindPropertyRelative("MessageType"); + SerializedProperty Message = listItemSelected.FindPropertyRelative("Message"); + SerializedProperty TakeScreenshot = listItemSelected.FindPropertyRelative("TakeScreenshot"); + SerializedProperty ScreenshotFileName = listItemSelected.FindPropertyRelative("ScreenshotFileName"); + SerializedProperty DebugBreak = listItemSelected.FindPropertyRelative("DebugBreak"); + SerializedProperty UnityEvents = listItemSelected.FindPropertyRelative("UnityEvents"); + + #endregion + + EditorGUILayout.LabelField + ( + label: + "[ PACKET ] - ID: " + + Id.intValue + + " (Conditions: " + + DebugConditions.arraySize + + ")", + + style: GraphyEditorStyle.HeaderStyle2 + ); + + EditorGUIUtility.labelWidth = 150; + EditorGUIUtility.fieldWidth = 35; + + Active.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Active", + tooltip: "If false, it will not be checked" + ), + value: Active.boolValue + ); + + Id.intValue = EditorGUILayout.IntField + ( + new GUIContent + ( + text: "ID", + tooltip: "Optional Id. It's used to get or remove DebugPackets in runtime" + ), + value: Id.intValue + ); + + ExecuteOnce.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Execute once", + tooltip: "If true, once the actions are executed, this DebugPacket will delete itself" + ), + value: ExecuteOnce.boolValue + ); + + InitSleepTime.floatValue = EditorGUILayout.FloatField + ( + new GUIContent + ( + text: "Init sleep time", + tooltip: "Time to wait before checking if conditions are met (use this to avoid low fps drops triggering the conditions when loading the game)" + ), + value: InitSleepTime.floatValue + ); + + ExecuteSleepTime.floatValue = EditorGUILayout.FloatField + ( + new GUIContent + ( + text: "Sleep time after execute", + tooltip: "Time to wait before checking if conditions are met again (once they have already been met and if ExecuteOnce is false)" + ), + value: ExecuteSleepTime.floatValue + ); + + + + EditorGUIUtility.labelWidth = defaultLabelWidth; + EditorGUIUtility.fieldWidth = defaultFieldWidth; + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + EditorGUILayout.LabelField("[ CONDITIONS ] (" + DebugConditions.arraySize + ")", GraphyEditorStyle.HeaderStyle2); + + EditorGUILayout.PropertyField + ( + ConditionEvaluation, + new GUIContent("Condition evaluation") + ); + + EditorGUILayout.Space(); + + if (DebugConditions.arraySize < 1) + { + DebugConditions.InsertArrayElementAtIndex(DebugConditions.arraySize); + m_selectedDebugPacketCondition = 0; + } + + EditorGUILayout.BeginHorizontal(); + + List debugPacketConditionNames = new List(); + for (int i = 0; i < DebugConditions.arraySize; i++) + { + SerializedProperty listItem = DebugConditions.GetArrayElementAtIndex(i); + // NOTE: If the Popup detects two equal strings, it just paints 1, that's why I always add the "i" + + string conditionName = (i + 1).ToString() + " - "; + conditionName += GetComparerStringFromDebugVariable((GraphyDebugger.DebugVariable)listItem.FindPropertyRelative("Variable").intValue) + " "; + conditionName += GetComparerStringFromDebugComparer((GraphyDebugger.DebugComparer)listItem.FindPropertyRelative("Comparer").intValue) + " "; + conditionName += listItem.FindPropertyRelative("Value").floatValue.ToString(); + + debugPacketConditionNames.Add(conditionName); + } + + m_selectedDebugPacketCondition = EditorGUILayout.Popup(m_selectedDebugPacketCondition, debugPacketConditionNames.ToArray()); + + GUI.color = new Color(0.7f, 1f, 0.0f, 1f); + + if (GUILayout.Button("Add", GUILayout.Width(60))) + { + DebugConditions.InsertArrayElementAtIndex(DebugConditions.arraySize); + } + + if (DebugConditions.arraySize > 1) + { + GUI.color = new Color(1f, 0.7f, 0.0f, 1f); + } + else + { + GUI.color = new Color(1f, 0.7f, 0.0f, 0.5f); + } + + //Remove this index from the List + if (GUILayout.Button("Remove", GUILayout.Width(60))) + { + if (DebugConditions.arraySize > 1) + { + DebugConditions.DeleteArrayElementAtIndex(m_selectedDebugPacketCondition); + if (m_selectedDebugPacketCondition > 0) + { + m_selectedDebugPacketCondition--; + } + } + } + + GUI.color = defaultGUIColor; + + EditorGUILayout.EndHorizontal(); + + SerializedProperty conditionListItemSelected = DebugConditions.GetArrayElementAtIndex(m_selectedDebugPacketCondition); + + SerializedProperty Variable = conditionListItemSelected.FindPropertyRelative("Variable"); + SerializedProperty Comparer = conditionListItemSelected.FindPropertyRelative("Comparer"); + SerializedProperty Value = conditionListItemSelected.FindPropertyRelative("Value"); + + EditorGUILayout.PropertyField + ( + Variable, + new GUIContent("Variable") + ); + + EditorGUILayout.PropertyField + ( + Comparer, + new GUIContent("Comparer") + ); + + EditorGUILayout.PropertyField + ( + Value, + new GUIContent("Value") + ); + + EditorGUILayout.Space(); + EditorGUILayout.Space(); + + EditorGUILayout.LabelField("[ ACTIONS ]", GraphyEditorStyle.HeaderStyle2); + + EditorGUIUtility.labelWidth = 140; + EditorGUIUtility.fieldWidth = 35; + + EditorGUILayout.PropertyField + ( + MessageType, + new GUIContent("Message type") + ); + + EditorGUILayout.PropertyField(Message); + + TakeScreenshot.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Take screenshot", + tooltip: "If true, it takes a screenshot and stores it. The location where the image is written to can include a directory/folder list. With no directory/folder list the image will be written into the Project folder. On mobile platforms the filename is appended to the persistent data path." + ), + value: TakeScreenshot.boolValue + ); + + if (TakeScreenshot.boolValue) + { + EditorGUILayout.PropertyField + ( + ScreenshotFileName, + new GUIContent + ( + text: "Screenshot file name", + tooltip: "Avoid this characters: * . \" / \\ [ ] : ; | = , \n\nIt will have the date appended at the end to avoid overwriting." + ) + ); + } + + DebugBreak.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Debug Break", + tooltip: "If true, it pauses the editor" + ), + DebugBreak.boolValue + ); + + EditorGUILayout.PropertyField(UnityEvents); + + EditorGUIUtility.labelWidth = defaultLabelWidth; + EditorGUIUtility.fieldWidth = defaultFieldWidth; + + serializedObject.ApplyModifiedProperties(); + + } + + #endregion + + #region Methods -> Private + + private void SetDefaultDebugPacketValues(SerializedProperty debugPacketSerializedProperty) + { + GraphyDebugger.DebugPacket debugPacket = new GraphyDebugger.DebugPacket(); + + debugPacketSerializedProperty.GetArrayElementAtIndex(debugPacketSerializedProperty.arraySize - 1) + .FindPropertyRelative("Active") + .boolValue = debugPacket.Active; + + debugPacketSerializedProperty.GetArrayElementAtIndex(debugPacketSerializedProperty.arraySize - 1) + .FindPropertyRelative("Id") + .intValue = debugPacketSerializedProperty.arraySize; + + debugPacketSerializedProperty.GetArrayElementAtIndex(debugPacketSerializedProperty.arraySize - 1) + .FindPropertyRelative("ExecuteOnce") + .boolValue = debugPacket.ExecuteOnce; + + debugPacketSerializedProperty.GetArrayElementAtIndex(debugPacketSerializedProperty.arraySize - 1) + .FindPropertyRelative("InitSleepTime") + .floatValue = debugPacket.InitSleepTime; + + debugPacketSerializedProperty.GetArrayElementAtIndex(debugPacketSerializedProperty.arraySize - 1) + .FindPropertyRelative("ExecuteSleepTime") + .floatValue = debugPacket.ExecuteSleepTime; + } + + private string GetComparerStringFromDebugVariable(GraphyDebugger.DebugVariable debugVariable) + { + switch (debugVariable) + { + case GraphyDebugger.DebugVariable.Fps: + return "FPS Current"; + case GraphyDebugger.DebugVariable.Fps_Min: + return "FPS Min"; + case GraphyDebugger.DebugVariable.Fps_Max: + return "FPS Max"; + case GraphyDebugger.DebugVariable.Fps_Avg: + return "FPS Avg"; + + case GraphyDebugger.DebugVariable.Ram_Allocated: + return "Ram Allocated"; + case GraphyDebugger.DebugVariable.Ram_Reserved: + return "Ram Reserved"; + case GraphyDebugger.DebugVariable.Ram_Mono: + return "Ram Mono"; + + case GraphyDebugger.DebugVariable.Audio_DB: + return "Audio DB"; + + default: + return null; + + } + } + + private string GetComparerStringFromDebugComparer(GraphyDebugger.DebugComparer debugComparer) + { + switch (debugComparer) + { + case GraphyDebugger.DebugComparer.Less_than: + return "<"; + case GraphyDebugger.DebugComparer.Equals_or_less_than: + return "<="; + case GraphyDebugger.DebugComparer.Equals: + return "=="; + case GraphyDebugger.DebugComparer.Equals_or_greater_than: + return ">="; + case GraphyDebugger.DebugComparer.Greater_than: + return ">"; + + default: + return null; + } + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs.meta b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs.meta new file mode 100644 index 0000000..576169a --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyDebuggerEditor.cs.meta @@ -0,0 +1,12 @@ +fileFormatVersion: 2 +guid: 4a96825e094d61441b5247d0c32652b3 +timeCreated: 1514907656 +licenseType: Store +MonoImporter: + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs new file mode 100644 index 0000000..61d9295 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs @@ -0,0 +1,118 @@ +/* --------------------------------------- + * Author: Martin Pane (martintayx@gmail.com) (@tayx94) + * Contributors: https://github.com/Tayx94/graphy/graphs/contributors + * Project: Graphy - Ultimate Stats Monitor + * Date: 02-Jan-18 + * Studio: Tayx + * + * Git repo: https://github.com/Tayx94/graphy + * + * This project is released under the MIT license. + * Attribution is not required, but it is always welcomed! + * -------------------------------------*/ + +using System; +using System.IO; +using UnityEditor; +using UnityEngine; + +namespace Tayx.Graphy +{ + internal static class GraphyEditorStyle + { + #region Variables -> Private + + private static Texture2D _managerLogoTexture = null; + private static Texture2D _debuggerLogoTexture = null; + private static GUISkin m_skin = null; + private static GUIStyle m_headerStyle1 = null; + private static GUIStyle m_headerStyle2 = null; + private static GUIStyle m_foldoutStyle = null; + private static string path; + + #endregion + + #region Properties -> Public + + public static Texture2D ManagerLogoTexture => _managerLogoTexture; + public static Texture2D DebuggerLogoTexture => _debuggerLogoTexture; + public static GUISkin Skin => m_skin; + public static GUIStyle HeaderStyle1 => m_headerStyle1; + public static GUIStyle HeaderStyle2 => m_headerStyle2; + public static GUIStyle FoldoutStyle => m_foldoutStyle; + + #endregion + + #region Static Constructor + + static GraphyEditorStyle() + { + string managerLogoGuid = AssetDatabase.FindAssets( $"Manager_Logo_{(EditorGUIUtility.isProSkin ? "White" : "Dark")}" )[0]; + string debuggerLogoGuid = AssetDatabase.FindAssets( $"Debugger_Logo_{(EditorGUIUtility.isProSkin ? "White" : "Dark")}" )[0]; + string guiSkinGuid = AssetDatabase.FindAssets( "GraphyGUISkin" )[ 0 ]; + + _managerLogoTexture = AssetDatabase.LoadAssetAtPath + ( + AssetDatabase.GUIDToAssetPath( managerLogoGuid ) + ); + + _debuggerLogoTexture = AssetDatabase.LoadAssetAtPath + ( + AssetDatabase.GUIDToAssetPath( debuggerLogoGuid ) + ); + + m_skin = AssetDatabase.LoadAssetAtPath + ( + AssetDatabase.GUIDToAssetPath( guiSkinGuid ) + ); + + if (m_skin != null) + { + m_headerStyle1 = m_skin.GetStyle("Header1"); + m_headerStyle2 = m_skin.GetStyle("Header2"); + + SetGuiStyleFontColor + ( + guiStyle: m_headerStyle2, + color: EditorGUIUtility.isProSkin ? Color.white : Color.black + ); + } + else + { + m_headerStyle1 = EditorStyles.boldLabel; + m_headerStyle2 = EditorStyles.boldLabel; + } + + m_foldoutStyle = new GUIStyle(EditorStyles.foldout) + { + font = m_headerStyle2.font, + fontStyle = m_headerStyle2.fontStyle, + contentOffset = Vector2.down * 3f + }; + + SetGuiStyleFontColor + ( + guiStyle: m_foldoutStyle, + color: EditorGUIUtility.isProSkin ? Color.white : Color.black + ); + } + + #endregion + + #region Methods -> Private + + private static void SetGuiStyleFontColor(GUIStyle guiStyle, Color color) + { + guiStyle.normal.textColor = color; + guiStyle.hover.textColor = color; + guiStyle.active.textColor = color; + guiStyle.focused.textColor = color; + guiStyle.onNormal.textColor = color; + guiStyle.onHover.textColor = color; + guiStyle.onActive.textColor = color; + guiStyle.onFocused.textColor = color; + } + + #endregion + } +} \ No newline at end of file diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs.meta b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs.meta new file mode 100644 index 0000000..b2cd77c --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyEditorStyle.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1bb06e7c222a60f47a476e2648224330 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs new file mode 100644 index 0000000..e4c9122 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs @@ -0,0 +1,839 @@ +/* --------------------------------------- + * Author: Martin Pane (martintayx@gmail.com) (@tayx94) + * Contributors: https://github.com/Tayx94/graphy/graphs/contributors + * Project: Graphy - Ultimate Stats Monitor + * Date: 20-Dec-17 + * Studio: Tayx + * + * Git repo: https://github.com/Tayx94/graphy + * + * This project is released under the MIT license. + * Attribution is not required, but it is always welcomed! + * -------------------------------------*/ + +using System; +using UnityEngine; +using System.IO; +using UnityEditor; + +namespace Tayx.Graphy +{ + [CustomEditor(typeof(GraphyManager))] + internal class GraphyManagerEditor : Editor + { + /* ----- TODO: ---------------------------- + * Add summaries to the variables. + * Add summaries to the functions. + * --------------------------------------*/ + + #region Variables -> Private + + private GraphyManager m_target; + + private int[] m_spectrumSizeValues = + { + 128, + 256, + 512, + 1024, + 2048, + 4096, + 8192 + }; + + #region Section -> Settings + + private SerializedProperty m_graphyMode; + + private SerializedProperty m_enableOnStartup; + + private SerializedProperty m_keepAlive; + + private SerializedProperty m_background; + private SerializedProperty m_backgroundColor; + + private SerializedProperty m_enableHotkeys; + + private SerializedProperty m_toggleModeKeyCode; + private SerializedProperty m_toggleModeCtrl; + private SerializedProperty m_toggleModeAlt; + + private SerializedProperty m_toggleActiveKeyCode; + private SerializedProperty m_toggleActiveCtrl; + private SerializedProperty m_toggleActiveAlt; + + + private SerializedProperty m_graphModulePosition; + + #endregion + + #region Section -> FPS + + private bool m_fpsModuleInspectorToggle = true; + + private SerializedProperty m_fpsModuleState; + + private SerializedProperty m_goodFpsColor; + private SerializedProperty m_goodFpsThreshold; + + private SerializedProperty m_cautionFpsColor; + private SerializedProperty m_cautionFpsThreshold; + + private SerializedProperty m_criticalFpsColor; + + private SerializedProperty m_fpsGraphResolution; + + private SerializedProperty m_fpsTextUpdateRate; + + #endregion + + #region Section -> RAM + + private bool m_ramModuleInspectorToggle = true; + + private SerializedProperty m_ramModuleState; + + private SerializedProperty m_allocatedRamColor; + private SerializedProperty m_reservedRamColor; + private SerializedProperty m_monoRamColor; + + private SerializedProperty m_ramGraphResolution; + + private SerializedProperty m_ramTextUpdateRate; + + #endregion + + #region Section -> Audio + + private bool m_audioModuleInspectorToggle = true; + + private SerializedProperty m_findAudioListenerInCameraIfNull; + + private SerializedProperty m_audioListener; + + private SerializedProperty m_audioModuleState; + + private SerializedProperty m_audioGraphColor; + + private SerializedProperty m_audioGraphResolution; + + private SerializedProperty m_audioTextUpdateRate; + + private SerializedProperty m_FFTWindow; + + private SerializedProperty m_spectrumSize; + + #endregion + + #region Section -> Advanced Settings + + private bool m_advancedModuleInspectorToggle = true; + + private SerializedProperty m_advancedModulePosition; + + private SerializedProperty m_advancedModuleState; + + #endregion + + #endregion + + #region Methods -> Unity Callbacks + + private void OnEnable() + { + m_target = (GraphyManager)target; + + SerializedObject serObj = serializedObject; + + #region Section -> Settings + + m_graphyMode = serObj.FindProperty("m_graphyMode"); + + m_enableOnStartup = serObj.FindProperty("m_enableOnStartup"); + + m_keepAlive = serObj.FindProperty("m_keepAlive"); + + m_background = serObj.FindProperty("m_background"); + m_backgroundColor = serObj.FindProperty("m_backgroundColor"); + + m_enableHotkeys = serObj.FindProperty("m_enableHotkeys"); + + m_toggleModeKeyCode = serObj.FindProperty("m_toggleModeKeyCode"); + + m_toggleModeCtrl = serObj.FindProperty("m_toggleModeCtrl"); + m_toggleModeAlt = serObj.FindProperty("m_toggleModeAlt"); + + m_toggleActiveKeyCode = serObj.FindProperty("m_toggleActiveKeyCode"); + + m_toggleActiveCtrl = serObj.FindProperty("m_toggleActiveCtrl"); + m_toggleActiveAlt = serObj.FindProperty("m_toggleActiveAlt"); + + m_graphModulePosition = serObj.FindProperty("m_graphModulePosition"); + + #endregion + + #region Section -> FPS + + m_fpsModuleState = serObj.FindProperty("m_fpsModuleState"); + + m_goodFpsColor = serObj.FindProperty("m_goodFpsColor"); + m_goodFpsThreshold = serObj.FindProperty("m_goodFpsThreshold"); + + m_cautionFpsColor = serObj.FindProperty("m_cautionFpsColor"); + m_cautionFpsThreshold = serObj.FindProperty("m_cautionFpsThreshold"); + + m_criticalFpsColor = serObj.FindProperty("m_criticalFpsColor"); + + m_fpsGraphResolution = serObj.FindProperty("m_fpsGraphResolution"); + + m_fpsTextUpdateRate = serObj.FindProperty("m_fpsTextUpdateRate"); + + #endregion + + #region Section -> RAM + + m_ramModuleState = serObj.FindProperty("m_ramModuleState"); + + m_allocatedRamColor = serObj.FindProperty("m_allocatedRamColor"); + m_reservedRamColor = serObj.FindProperty("m_reservedRamColor"); + m_monoRamColor = serObj.FindProperty("m_monoRamColor"); + + m_ramGraphResolution = serObj.FindProperty("m_ramGraphResolution"); + + m_ramTextUpdateRate = serObj.FindProperty("m_ramTextUpdateRate"); + + #endregion + + #region Section -> Audio + + m_findAudioListenerInCameraIfNull = serObj.FindProperty("m_findAudioListenerInCameraIfNull"); + + m_audioListener = serObj.FindProperty("m_audioListener"); + + m_audioModuleState = serObj.FindProperty("m_audioModuleState"); + + m_audioGraphColor = serObj.FindProperty("m_audioGraphColor"); + + m_audioGraphResolution = serObj.FindProperty("m_audioGraphResolution"); + + m_audioTextUpdateRate = serObj.FindProperty("m_audioTextUpdateRate"); + + m_FFTWindow = serObj.FindProperty("m_FFTWindow"); + + m_spectrumSize = serObj.FindProperty("m_spectrumSize"); + + #endregion + + #region Section -> Advanced Settings + + m_advancedModulePosition = serObj.FindProperty("m_advancedModulePosition"); + + m_advancedModuleState = serObj.FindProperty("m_advancedModuleState"); + + #endregion + + } + + #endregion + + #region Methods -> Public Override + + public override void OnInspectorGUI() + { + if (m_target == null && target == null) + { + base.OnInspectorGUI(); + return; + } + + float defaultLabelWidth = EditorGUIUtility.labelWidth; + float defaultFieldWidth = EditorGUIUtility.fieldWidth; + + //===== CONTENT REGION ======================================================================== + + GUILayout.Space(20); + + #region Section -> Logo + + if (GraphyEditorStyle.ManagerLogoTexture != null) + { + GUILayout.Label + ( + image: GraphyEditorStyle.ManagerLogoTexture, + style: new GUIStyle(GUI.skin.GetStyle("Label")) + { + alignment = TextAnchor.UpperCenter + } + ); + + GUILayout.Space(10); + } + else + { + EditorGUILayout.LabelField + ( + label: "[ GRAPHY - MANAGER ]", + style: GraphyEditorStyle.HeaderStyle1 + ); + } + + #endregion + + GUILayout.Space(5); //Extra pixels added when the logo is used. + + #region Section -> Settings + + EditorGUIUtility.labelWidth = 130; + EditorGUIUtility.fieldWidth = 35; + + EditorGUILayout.PropertyField + ( + m_graphyMode, + new GUIContent + ( + text: "Graphy Mode", + tooltip: "LIGHT mode increases compatibility with mobile and older, less powerful GPUs, but reduces the maximum graph resolutions to 128." + ) + ); + + GUILayout.Space(10); + + m_enableOnStartup.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Enable On Startup", + tooltip: "If ticked, Graphy will be displayed by default on startup, otherwise it will initiate and hide." + ), + value: m_enableOnStartup.boolValue + ); + + // This is a neat trick to hide Graphy in the Scene if it's going to be deactivated in play mode so that it doesn't use screen space. + if (!Application.isPlaying) + { + m_target.GetComponent().enabled = m_enableOnStartup.boolValue; + } + + m_keepAlive.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Keep Alive", + tooltip: "If ticked, it will survive scene changes.\n\nCAREFUL, if you set Graphy as a child of another GameObject, the root GameObject will also survive scene changes. If you want to avoid that put Graphy in the root of the Scene as its own entity." + ), + value: m_keepAlive.boolValue + ); + + GUILayout.Space(10); + + EditorGUILayout.BeginHorizontal(); + + m_background.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Background", + tooltip: "If ticked, it will show a background overlay to improve readability in cluttered scenes." + ), + value: m_background.boolValue + ); + + m_backgroundColor.colorValue = EditorGUILayout.ColorField(m_backgroundColor.colorValue); + + EditorGUILayout.EndHorizontal(); + + GUILayout.Space(10); + + m_enableHotkeys.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Enable Hotkeys", + tooltip: "If ticked, it will enable the hotkeys to be able to modify Graphy in runtime with custom keyboard shortcuts." + ), + value: m_enableHotkeys.boolValue + ); + + if (m_enableHotkeys.boolValue) + { + EditorGUILayout.BeginHorizontal(); + + EditorGUIUtility.labelWidth = 130; + EditorGUIUtility.fieldWidth = 35; + + EditorGUILayout.PropertyField + ( + m_toggleModeKeyCode, + new GUIContent + ( + text: "Toggle Mode Key", + tooltip: "If ticked, it will require clicking this key and the other ones you have set up." + ) + ); + + EditorGUIUtility.labelWidth = 30; + EditorGUIUtility.fieldWidth = 35; + + m_toggleModeCtrl.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Ctrl", + tooltip: "If ticked, it will require clicking Ctrl and the other keys you have set up." + ), + value: m_toggleModeCtrl.boolValue + ); + + m_toggleModeAlt.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Alt", + tooltip: "If ticked, it will require clicking Alt and the other keys you have set up." + ), + value: m_toggleModeAlt.boolValue + ); + + EditorGUILayout.EndHorizontal(); + + EditorGUILayout.BeginHorizontal(); + + EditorGUIUtility.labelWidth = 130; + EditorGUIUtility.fieldWidth = 35; + + EditorGUILayout.PropertyField + ( + m_toggleActiveKeyCode, + new GUIContent + ( + text: "Toggle Active Key", + tooltip: "If ticked, it will require clicking this key and the other ones you have set up." + ) + ); + + EditorGUIUtility.labelWidth = 30; + EditorGUIUtility.fieldWidth = 35; + + m_toggleActiveCtrl.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Ctrl", + tooltip: "If ticked, it will require clicking Ctrl and the other kesy you have set up." + ), + value: m_toggleActiveCtrl.boolValue + ); + + m_toggleActiveAlt.boolValue = EditorGUILayout.Toggle + ( + new GUIContent + ( + text: "Alt", + tooltip: "If ticked, it will require clicking Alt and the other keys you have set up." + ), + value: m_toggleActiveAlt.boolValue + ); + + EditorGUILayout.EndHorizontal(); + } + + GUILayout.Space(15); + + EditorGUIUtility.labelWidth = 155; + EditorGUIUtility.fieldWidth = 35; + + EditorGUILayout.PropertyField + ( + m_graphModulePosition, + new GUIContent + ( + text: "Graph modules position", + tooltip: "Defines in which corner the modules will be located." + ) + ); + + #endregion + + GUILayout.Space(20); + + #region Section -> FPS + + m_fpsModuleInspectorToggle = EditorGUILayout.Foldout + ( + m_fpsModuleInspectorToggle, + content: " [ FPS ]", + style: GraphyEditorStyle.FoldoutStyle + ); + + GUILayout.Space(5); + + if (m_fpsModuleInspectorToggle) + { + EditorGUILayout.PropertyField + ( + m_fpsModuleState, + new GUIContent + ( + text: "Module state", + tooltip: "FULL -> Text + Graph \nTEXT -> Just text \nOFF -> Turned off" + ) + ); + + GUILayout.Space(5); + + EditorGUILayout.LabelField("Fps thresholds and colors:"); + + EditorGUI.indentLevel++; + + EditorGUILayout.BeginHorizontal(); + + m_goodFpsThreshold.intValue = EditorGUILayout.IntField + ( + new GUIContent + ( + text: "- Good", + tooltip: "When FPS rise above this value, this color will be used." + ), + value: m_goodFpsThreshold.intValue + ); + + m_goodFpsColor.colorValue = EditorGUILayout.ColorField(m_goodFpsColor.colorValue); + + EditorGUILayout.EndHorizontal(); + + if (m_goodFpsThreshold.intValue <= m_cautionFpsThreshold.intValue && m_goodFpsThreshold.intValue > 1) + { + m_cautionFpsThreshold.intValue = m_goodFpsThreshold.intValue - 1; + } + else if (m_goodFpsThreshold.intValue <= 1) + { + m_goodFpsThreshold.intValue = 2; + } + + EditorGUILayout.BeginHorizontal(); + + m_cautionFpsThreshold.intValue = EditorGUILayout.IntField + ( + new GUIContent + ( + text: "- Caution", + tooltip: "When FPS falls between this and the Good value, this color will be used." + ), + value: m_cautionFpsThreshold.intValue + ); + + m_cautionFpsColor.colorValue = EditorGUILayout.ColorField(m_cautionFpsColor.colorValue); + + EditorGUILayout.EndHorizontal(); + + if (m_cautionFpsThreshold.intValue >= m_goodFpsThreshold.intValue) + { + m_cautionFpsThreshold.intValue = m_goodFpsThreshold.intValue - 1; + } + else if (m_cautionFpsThreshold.intValue <= 0) + { + m_cautionFpsThreshold.intValue = 1; + } + + EditorGUILayout.BeginHorizontal(); + + EditorGUILayout.IntField + ( + new GUIContent + ( + text: "- Critical", + tooltip: "When FPS falls below the Caution value, this color will be used. (You can't have negative FPS, so this value is just for reference, it can't be changed)." + ), + value: 0 + ); + + m_criticalFpsColor.colorValue = EditorGUILayout.ColorField(m_criticalFpsColor.colorValue); + + EditorGUILayout.EndHorizontal(); + + EditorGUI.indentLevel--; + + if (m_fpsModuleState.intValue == 0) + { + m_fpsGraphResolution.intValue = EditorGUILayout.IntSlider + ( + new GUIContent + ( + text: "Graph resolution", + tooltip: "Defines the amount of points in the graph" + ), + m_fpsGraphResolution.intValue, + leftValue: 20, + rightValue: m_graphyMode.intValue == 0 ? 300 : 128 + ); + } + + m_fpsTextUpdateRate.intValue = EditorGUILayout.IntSlider + ( + new GUIContent + ( + text: "Text update rate", + tooltip: "Defines the amount times the text is updated in 1 second." + ), + m_fpsTextUpdateRate.intValue, + leftValue: 1, + rightValue: 60 + ); + } + + #endregion + + GUILayout.Space(20); + + #region Section -> RAM + + m_ramModuleInspectorToggle = EditorGUILayout.Foldout + ( + m_ramModuleInspectorToggle, + content: " [ RAM ]", + style: GraphyEditorStyle.FoldoutStyle + ); + + GUILayout.Space(5); + + if (m_ramModuleInspectorToggle) + { + EditorGUILayout.PropertyField + ( + m_ramModuleState, + new GUIContent + ( + text: "Module state", + tooltip: "FULL -> Text + Graph \nTEXT -> Just text \nOFF -> Turned off" + ) + ); + + GUILayout.Space(5); + + EditorGUILayout.LabelField("Graph colors:"); + + EditorGUI.indentLevel++; + + m_allocatedRamColor.colorValue = EditorGUILayout.ColorField + ( + label: "- Allocated", + value: m_allocatedRamColor.colorValue + ); + + m_reservedRamColor.colorValue = EditorGUILayout.ColorField + ( + label: "- Reserved", + value: m_reservedRamColor.colorValue + ); + + m_monoRamColor.colorValue = EditorGUILayout.ColorField + ( + label: "- Mono", + value: m_monoRamColor.colorValue + ); + + EditorGUI.indentLevel--; + + if (m_ramModuleState.intValue == 0) + { + m_ramGraphResolution.intValue = EditorGUILayout.IntSlider( + new GUIContent + ( + text: "Graph resolution", + tooltip: "Defines the amount of points are in the graph" + ), + m_ramGraphResolution.intValue, + leftValue: 20, + rightValue: m_graphyMode.intValue == 0 ? 300 : 128 + ); + } + + m_ramTextUpdateRate.intValue = EditorGUILayout.IntSlider + ( + new GUIContent + ( + text: "Text update rate", + tooltip: "Defines the amount times the text is updated in 1 second." + ), + m_ramTextUpdateRate.intValue, + leftValue: 1, + rightValue: 60 + ); + } + + #endregion + + GUILayout.Space(20); + + #region Section -> Audio + + m_audioModuleInspectorToggle = EditorGUILayout.Foldout + ( + m_audioModuleInspectorToggle, + content: " [ AUDIO ]", + style: GraphyEditorStyle.FoldoutStyle + ); + + GUILayout.Space(5); + + if (m_audioModuleInspectorToggle) + { + EditorGUILayout.PropertyField + ( + m_audioModuleState, + new GUIContent + ( + text: "Module state", + tooltip: "FULL -> Text + Graph \nTEXT -> Just text \nOFF -> Turned off" + ) + ); + + GUILayout.Space(5); + + EditorGUILayout.PropertyField + ( + m_findAudioListenerInCameraIfNull, + new GUIContent + ( + text: "Find audio listener", + tooltip: "Tries to find the AudioListener in the Main camera in the scene. (if AudioListener is null)" + ) + ); + + EditorGUILayout.PropertyField + ( + m_audioListener, + new GUIContent + ( + text: "Audio Listener", + tooltip: "Graphy will take the data from this Listener. If none are specified, it will try to get it from the Main Camera in the scene." + ) + ); + + if (m_audioModuleState.intValue == 0) + { + m_audioGraphColor.colorValue = EditorGUILayout.ColorField + ( + label: "Graph color", + value: m_audioGraphColor.colorValue + ); + + m_audioGraphResolution.intValue = EditorGUILayout.IntSlider + ( + new GUIContent + ( + text: "Graph resolution", + tooltip: "Defines the amount of points that are in the graph." + ), + m_audioGraphResolution.intValue, + leftValue: 20, + rightValue: m_graphyMode.intValue == 0 ? 300 : 128 + ); + + // Forces the value to be a multiple of 3, this way the audio graph is painted correctly + if (m_audioGraphResolution.intValue % 3 != 0 && m_audioGraphResolution.intValue < 300) + { + m_audioGraphResolution.intValue += 3 - m_audioGraphResolution.intValue % 3; + } + //TODO: Figure out why a static version of the ForceMultipleOf3 isnt used. + } + + EditorGUILayout.PropertyField + ( + m_FFTWindow, + new GUIContent + ( + text: "FFT Window", + tooltip: "Used to reduce leakage between frequency bins/bands. Note, the more complex window type, the better the quality, but reduced speed. \n\nSimplest is rectangular. Most complex is BlackmanHarris" + ) + ); + + m_spectrumSize.intValue = EditorGUILayout.IntSlider + ( + new GUIContent + ( + text: "Spectrum size", + tooltip: "Has to be a power of 2 between 128-8192. The higher sample rate, the less precision but also more impact on performance. Careful with mobile devices" + ), + m_spectrumSize.intValue, + leftValue: 128, + rightValue: 8192 + ); + + int closestSpectrumIndex = 0; + int minDistanceToSpectrumValue = 100000; + + for (int i = 0; i < m_spectrumSizeValues.Length; i++) + { + int newDistance = Mathf.Abs + ( + value: m_spectrumSize.intValue - m_spectrumSizeValues[i] + ); + + if (newDistance < minDistanceToSpectrumValue) + { + minDistanceToSpectrumValue = newDistance; + closestSpectrumIndex = i; + } + } + + m_spectrumSize.intValue = m_spectrumSizeValues[closestSpectrumIndex]; + + m_audioTextUpdateRate.intValue = EditorGUILayout.IntSlider + ( + new GUIContent + ( + text: "Text update rate", + tooltip: "Defines the amount times the text is updated in 1 second" + ), + m_audioTextUpdateRate.intValue, + leftValue: 1, + rightValue: 60 + ); + } + + #endregion + + GUILayout.Space(20); + + #region Section -> Advanced Settings + + m_advancedModuleInspectorToggle = EditorGUILayout.Foldout + ( + m_advancedModuleInspectorToggle, + content: " [ ADVANCED DATA ]", + style: GraphyEditorStyle.FoldoutStyle + ); + + GUILayout.Space(5); + + if (m_advancedModuleInspectorToggle) + { + EditorGUILayout.PropertyField(m_advancedModulePosition); + + EditorGUILayout.PropertyField + ( + m_advancedModuleState, + new GUIContent + ( + text: "Module state", + tooltip: "FULL -> Text \nOFF -> Turned off" + ) + ); + } + + #endregion; + + EditorGUIUtility.labelWidth = defaultLabelWidth; + EditorGUIUtility.fieldWidth = defaultFieldWidth; + + serializedObject.ApplyModifiedProperties(); + } + + #endregion + + #region Methods -> Private + + #endregion + } +} \ No newline at end of file diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs.meta b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs.meta new file mode 100644 index 0000000..9296df9 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyManagerEditor.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f01a5c28e5127404da343db2a7409c10 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs new file mode 100644 index 0000000..11a4907 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs @@ -0,0 +1,61 @@ +/* --------------------------------------- + * Author: Martin Pane (martintayx@gmail.com) (@tayx94) + * Contributors: https://github.com/Tayx94/graphy/graphs/contributors + * Project: Graphy - Ultimate Stats Monitor + * Date: 20-Dec-17 + * Studio: Tayx + * + * Git repo: https://github.com/Tayx94/graphy + * + * This project is released under the MIT license. + * Attribution is not required, but it is always welcomed! + * -------------------------------------*/ + +using UnityEditor; +using UnityEngine; + +namespace Tayx.Graphy +{ + public class GraphyMenuItem + { + [MenuItem("Tools/Graphy/Create Prefab Variant")] + static void CreatePrefabVariant() + { + // Directory checking + if (!AssetDatabase.IsValidFolder("Assets/Graphy - Ultimate Stats Monitor")) + { + AssetDatabase.CreateFolder("Assets", "Graphy - Ultimate Stats Monitor"); + } + + if (!AssetDatabase.IsValidFolder( "Assets/Graphy - Ultimate Stats Monitor/Prefab Variants" ) ) + { + AssetDatabase.CreateFolder("Assets/Graphy - Ultimate Stats Monitor", "Prefab Variants" ); + } + + string graphyPrefabGuid = AssetDatabase.FindAssets( "[Graphy]" )[ 0 ]; + + Object originalPrefab = (GameObject)AssetDatabase.LoadAssetAtPath( AssetDatabase.GUIDToAssetPath( graphyPrefabGuid ), typeof(GameObject)); + GameObject objectSource = PrefabUtility.InstantiatePrefab(originalPrefab) as GameObject; + + int prefabVariantCount = + AssetDatabase.FindAssets( "Graphy_Variant", new []{ "Assets/Graphy - Ultimate Stats Monitor/Prefab Variants" } ).Length; + + GameObject prefabVariant = PrefabUtility.SaveAsPrefabAsset(objectSource, $"Assets/Graphy - Ultimate Stats Monitor/Prefab Variants/Graphy_Variant_{prefabVariantCount}.prefab" ); + + Object.DestroyImmediate(objectSource); + + foreach(SceneView scene in SceneView.sceneViews) + { + scene.ShowNotification(new GUIContent( "Prefab Variant Created at \"Assets/Graphy - Ultimate Stats Monitor/Prefab\"!" ) ); + } + } + + [MenuItem( "Tools/Graphy/Import Graphy Customization Scene" )] + static void ImportGraphyCustomizationScene() + { + string customizationSceneGuid = AssetDatabase.FindAssets( "Graphy_CustomizationScene" )[ 0 ]; + + AssetDatabase.ImportPackage( AssetDatabase.GUIDToAssetPath( customizationSceneGuid ), true ); + } + } +} \ No newline at end of file diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs.meta b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs.meta new file mode 100644 index 0000000..6955599 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/GraphyMenuItem.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 68962e071a0ce0549a853f10c6af3f54 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef b/Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef new file mode 100644 index 0000000..e37133d --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef @@ -0,0 +1,23 @@ +{ + "name": "Tayx.Graphy.Editor", + "references": [ + "GUID:18e5109d897e1b244ab2dfeaf5482c7b" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [ + { + "name": "com.unity.inputsystem", + "expression": "", + "define": "GRAPHY_NEW_INPUT" + } + ], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef.meta b/Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef.meta new file mode 100644 index 0000000..ee66473 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Editor/Tayx.Graphy.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 9c59a049deefdf64bbbaa730a340bb3f +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font.meta b/Assets/Graphy - Ultimate Stats Monitor/Font.meta new file mode 100644 index 0000000..170a66a --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 3ac48df14c942a247a9e31f953e82768 +folderAsset: yes +timeCreated: 1511635919 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold.meta b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold.meta new file mode 100644 index 0000000..8f54d4c --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 2b891f35198da7642a30fd430ae0d619 +folderAsset: yes +timeCreated: 1516718193 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt new file mode 100644 index 0000000..cb1565a --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt @@ -0,0 +1,18 @@ +Eric Tirado - NORTHWEST - BOLD, ROUGH - BETA + +Version 0.6 2016 +________________________________________________________________________________________ + +This font demo is free for personal and commercial use. + +DonÕt resell, donÕt rename, share it with this txt file. Easy. + +Sign up at tira.do/nw to get a good deal on our final release (coming soon) and be in the loop for more awesomeness! + +________________________________________________________________________________________ + +fonts@erictirado.com + +Eric Tirado © 2016 - All Rights Reserved +_______________________________________________________________________________________ +_______________________________________________________________________________________ \ No newline at end of file diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta new file mode 100644 index 0000000..f294d18 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/ERIC-TIRADO-NORTHWEST-LICENSE.txt.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: 67bbd8c5103323b4688fcfa3abe68927 +labels: +- font +timeCreated: 1516718196 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf new file mode 100644 index 0000000000000000000000000000000000000000..53182195d30522a4cfcdeb22548535323c5e1006 GIT binary patch literal 6040 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 literal 0 HcmV?d00001 diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf.meta b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf.meta new file mode 100644 index 0000000..555b5ce --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font/Northwest-Bold/NORTHWEST-B.otf.meta @@ -0,0 +1,22 @@ +fileFormatVersion: 2 +guid: d523cde1d178d7c4ca6bb724b9d5213e +labels: +- font +timeCreated: 1516718196 +licenseType: Store +TrueTypeFontImporter: + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontNames: + - NORTHWEST + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto.meta b/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto.meta new file mode 100644 index 0000000..06681c7 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 37f53a7f00580aa4fa7797d9308063e7 +folderAsset: yes +timeCreated: 1515073036 +licenseType: Store +DefaultImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt b/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt.meta b/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt.meta new file mode 100644 index 0000000..6903b6e --- /dev/null +++ b/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/LICENSE.txt.meta @@ -0,0 +1,10 @@ +fileFormatVersion: 2 +guid: eb908df110bf2314d94d245f8a338830 +labels: +- font +timeCreated: 1515073036 +licenseType: Store +TextScriptImporter: + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Bold.ttf b/Assets/Graphy - Ultimate Stats Monitor/Font/Roboto/Roboto-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..d3f01ad245b628f386ac95786f53167038720eb2 GIT binary patch literal 170760 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�!3r53e9=KAt@g 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