├── CHANGELOG.md
├── LICENSE
├── README.md
└── Unity-Twitch-Chat
├── .gitignore
├── Assets
├── ExampleProject.meta
├── ExampleProject
│ ├── BoxController.cs
│ ├── BoxController.cs.meta
│ ├── BoxPrefab.prefab
│ ├── BoxPrefab.prefab.meta
│ ├── BoxSprite.png
│ ├── BoxSprite.png.meta
│ ├── ClickExplosionForce.cs
│ ├── ClickExplosionForce.cs.meta
│ ├── ColorNormalizationTester.cs
│ ├── ColorNormalizationTester.cs.meta
│ ├── ConnectionExample.cs
│ ├── ConnectionExample.cs.meta
│ ├── ListenerExample.cs
│ ├── ListenerExample.cs.meta
│ ├── Scenes.meta
│ └── Scenes
│ │ ├── ColorNormalizationTestScene.unity
│ │ ├── ColorNormalizationTestScene.unity.meta
│ │ ├── ExampleScene.unity
│ │ └── ExampleScene.unity.meta
├── Package.meta
├── Package
│ ├── Runtime.meta
│ ├── Runtime
│ │ ├── Chatter.cs
│ │ ├── Chatter.cs.meta
│ │ ├── Extensions.cs
│ │ ├── Extensions.cs.meta
│ │ ├── IRC.cs
│ │ ├── IRC.cs.meta
│ │ ├── IRCMessages.cs
│ │ ├── IRCMessages.cs.meta
│ │ ├── ParseHelper.cs
│ │ ├── ParseHelper.cs.meta
│ │ ├── RateLimit.cs
│ │ ├── RateLimit.cs.meta
│ │ ├── TwitchConnection.ReadThread.cs
│ │ ├── TwitchConnection.ReadThread.cs.meta
│ │ ├── TwitchConnection.WriteThread.cs
│ │ ├── TwitchConnection.WriteThread.cs.meta
│ │ ├── TwitchConnection.cs
│ │ ├── TwitchConnection.cs.meta
│ │ ├── Utils.cs
│ │ ├── Utils.cs.meta
│ │ ├── lexonegit.unity-twitch-chat.asmdef
│ │ └── lexonegit.unity-twitch-chat.asmdef.meta
│ ├── package.json
│ └── package.json.meta
├── TextMesh Pro.meta
└── TextMesh Pro
│ ├── Documentation.meta
│ ├── Documentation
│ ├── TextMesh Pro User Guide 2016.pdf
│ └── TextMesh Pro User Guide 2016.pdf.meta
│ ├── Fonts.meta
│ ├── Fonts
│ ├── LiberationSans - OFL.txt
│ ├── LiberationSans - OFL.txt.meta
│ ├── LiberationSans.ttf
│ └── LiberationSans.ttf.meta
│ ├── Resources.meta
│ ├── Resources
│ ├── Fonts & Materials.meta
│ ├── Fonts & Materials
│ │ ├── LiberationSans SDF - Drop Shadow.mat
│ │ ├── LiberationSans SDF - Drop Shadow.mat.meta
│ │ ├── LiberationSans SDF - Fallback.asset
│ │ ├── LiberationSans SDF - Fallback.asset.meta
│ │ ├── LiberationSans SDF - Outline.mat
│ │ ├── LiberationSans SDF - Outline.mat.meta
│ │ ├── LiberationSans SDF.asset
│ │ └── LiberationSans SDF.asset.meta
│ ├── LineBreaking Following Characters.txt
│ ├── LineBreaking Following Characters.txt.meta
│ ├── LineBreaking Leading Characters.txt
│ ├── LineBreaking Leading Characters.txt.meta
│ ├── Sprite Assets.meta
│ ├── Sprite Assets
│ │ ├── EmojiOne.asset
│ │ └── EmojiOne.asset.meta
│ ├── Style Sheets.meta
│ ├── Style Sheets
│ │ ├── Default Style Sheet.asset
│ │ └── Default Style Sheet.asset.meta
│ ├── TMP Settings.asset
│ └── TMP Settings.asset.meta
│ ├── Shaders.meta
│ ├── Shaders
│ ├── TMP_Bitmap-Custom-Atlas.shader
│ ├── TMP_Bitmap-Custom-Atlas.shader.meta
│ ├── TMP_Bitmap-Mobile.shader
│ ├── TMP_Bitmap-Mobile.shader.meta
│ ├── TMP_Bitmap.shader
│ ├── TMP_Bitmap.shader.meta
│ ├── TMP_SDF Overlay.shader
│ ├── TMP_SDF Overlay.shader.meta
│ ├── TMP_SDF SSD.shader
│ ├── TMP_SDF SSD.shader.meta
│ ├── TMP_SDF-Mobile Masking.shader
│ ├── TMP_SDF-Mobile Masking.shader.meta
│ ├── TMP_SDF-Mobile Overlay.shader
│ ├── TMP_SDF-Mobile Overlay.shader.meta
│ ├── TMP_SDF-Mobile SSD.shader
│ ├── TMP_SDF-Mobile SSD.shader.meta
│ ├── TMP_SDF-Mobile.shader
│ ├── TMP_SDF-Mobile.shader.meta
│ ├── TMP_SDF-Surface-Mobile.shader
│ ├── TMP_SDF-Surface-Mobile.shader.meta
│ ├── TMP_SDF-Surface.shader
│ ├── TMP_SDF-Surface.shader.meta
│ ├── TMP_SDF.shader
│ ├── TMP_SDF.shader.meta
│ ├── TMP_Sprite.shader
│ ├── TMP_Sprite.shader.meta
│ ├── TMPro.cginc
│ ├── TMPro.cginc.meta
│ ├── TMPro_Mobile.cginc
│ ├── TMPro_Mobile.cginc.meta
│ ├── TMPro_Properties.cginc
│ ├── TMPro_Properties.cginc.meta
│ ├── TMPro_Surface.cginc
│ └── TMPro_Surface.cginc.meta
│ ├── Sprites.meta
│ └── Sprites
│ ├── EmojiOne Attribution.txt
│ ├── EmojiOne Attribution.txt.meta
│ ├── EmojiOne.json
│ ├── EmojiOne.json.meta
│ ├── EmojiOne.png
│ └── EmojiOne.png.meta
├── Packages
├── manifest.json
└── packages-lock.json
└── ProjectSettings
├── AudioManager.asset
├── ClusterInputManager.asset
├── DynamicsManager.asset
├── EditorBuildSettings.asset
├── EditorSettings.asset
├── GraphicsSettings.asset
├── InputManager.asset
├── MemorySettings.asset
├── NavMeshAreas.asset
├── NetworkManager.asset
├── PackageManagerSettings.asset
├── Physics2DSettings.asset
├── PresetManager.asset
├── ProjectSettings.asset
├── ProjectVersion.txt
├── QualitySettings.asset
├── SceneTemplateSettings.json
├── TagManager.asset
├── TimeManager.asset
├── UnityConnectSettings.asset
├── VFXManager.asset
├── VersionControlSettings.asset
└── XRSettings.asset
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | # Changelog
2 | All notable changes to this project will be documented in this file.
3 |
4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
6 |
7 | ## [1.2.3] - 2024-08-22
8 |
9 | ### Added
10 | - Added joinChannelOnStart property
11 | - Added TextMeshPro to ExampleProject
12 |
13 | ### Changed
14 | - Improved alert descriptions
15 | - Improved example scripts
16 | - Upgraded ExampleProject to Unity 2022.3.41f1 (LTS)
17 |
18 | ## [1.2.2] - 2023-03-27
19 |
20 | ### Added
21 | - Added JoinChannel and LeaveChannel methods
22 |
23 | ### Changed
24 | - Fixed decoded chars array being too small issue
25 | - Switched to using StringBuilder when decoding IRC messages
26 | - Upgraded ExampleProject to Unity 2021.3.21f1 (LTS)
27 |
28 |
29 | ## [1.2.1] - 2023-01-24
30 |
31 | ### Added
32 | - Native Twitch chat-like name color behavior
33 | - Users that have not set their name color will be assigned a random color (session based)
34 | - Chatter.GetNameColor() now normalizes the color if needed, meaning that if the color is either too bright or too dark, it will be adjusted to be more readable
35 |
36 | - Color normalization test scene (ExampleProject)
37 |
38 |
39 | ### Changed
40 | - Minor changes to ExampleProject
41 |
42 | ### Removed
43 | - Removed maxDataPerFrame from inspector
44 |
45 | ## [1.2.0] - 2023-01-03
46 |
47 | ### Added
48 | - Support for anonymous login
49 | - Support for limiting how many messages can be processed each frame
50 | - Remake example project
51 | - Extensions class
52 | - Utils class
53 |
54 | ### Changed
55 | - Chatter.emotes is now an array instead of a list
56 | - Updated package.json
57 | - Reorganized folder structure
58 | - Restructured the code in various ways (pretty much no functional changes)
59 | - Replaced asmdef file
60 | - Change namespace to Lexone.UnityTwitchChat
61 | - Fixed old connection not being terminated when a new connection is made
62 | - Renamed some files
63 |
64 | ### Removed
65 | - Removed priority rate limit check (for now)
66 | - Removed a bunch of unused files
67 |
68 | ## [1.1.0] - 2022-01-20
69 | ### Added
70 | - TwitchIRC.singleton, which when true enables DontDestroyOnLoad and destroys duplicate instances
71 | - TwitchIRC.IsConnected, which is true only while there is a stable connection to Twitch
72 | - TwitchIRC.debugThreads, which allows debug warnings for thread termination to be turned on/off
73 | - Rate limiting
74 | - RateLimit class
75 | - Client sets rate limit based on user's channel permissions
76 | - Client delays messages that exceeed the rate limit
77 | - Client sends a warning when a message is queued that will exceed the rate limits
78 | - IRCTags.ContainsEmote and IRCTags.HasBadge (previously exclusive to the Chatter object)
79 | - Unity Tooltips for all inspector fields of the TwitchIRC class
80 | ### Changed
81 | - Chatter.MessageContainsEmote -> Chatter.ContainsEmote
82 | - Client now uses a standard backoff interval (0s, 1s, 2s, 4s, 8s, ...) when reattempting a failed connection
83 | - Fixed issue where TwitchIRC did not end a failed connection
84 | - Fixed issue where TwitchIRC did not properly handle no internet connection
85 | - Client now checks that the connection still exists in the receive thread instead of a third thread
86 | - On disconnect, pending status updates and chat messages are now propogated before a connection is terminated
87 | - Reduced default write interval to 100ms for faster responsiveness
88 | - Settled on a versioning method for pre-release versions
89 | ### Removed
90 | - TwitchIRC.status, which overcomplicated checking the connection for basic cases (for more complex connection handling, listen to the ConnectionAlertEvent)
91 |
92 | ## [1.0.0] - 2021-11-02
93 | ### Added
94 | - TwitchIRC catches a failed authentication attempt
95 | - TwitchIRC checks its connection to the IRC socket on a third thread.
96 | - TwitchIRC.SendPing method (ContextMenu action) for debugging connection
97 | - TwitchIRC.BlockingDisconnect which blocks the main thread while any remainig send/receive threads close (important for closing connecting during OnDisable and OnDestroy)
98 | - TwitchIRC.taskQueue which replaces the functionality of the MainThread class
99 | - XML descriptions for almost all class members
100 | ### Changed
101 | - API Changes
102 | - TwitchIRC.IRC_Connect -> TwitchIRC.Connect
103 | - TwitchIRC.IRC_Disconnect -> TwitchIRC.Disconnect
104 | - TwitchIRC.newChatMessageEvent -> TwitchIRC.ChatMessageEvent
105 | - TwitchIRC.statusEvent -> TwitchIRC.StatusUpdateEvent
106 | - TwitchIRC class
107 | - Each connection is encapsulated in an internal TwitchConnection object
108 | - Login messages are sent using the output thread instead of the main thread
109 | - When disconnecting, waits for threads to terminate before disconnect is completed
110 | - When connecting, disconnects any existing connection before proceding with a new connection
111 | - SendCommand no longer sends any messages instantly but uses priorityOutputQueue to send important messages first
112 | - IRCInputProc decodes buffered data from the socket instead of locking on StreamReader.ReadLine
113 | - Send/receive threads now sleep for a configurable number of milliseconds before reattempting sends/receives to reduce CPU usage
114 | - Uses thread safe classes for connected, outputQueue, priorityOutputQueue, and taskQueue
115 | - Versioning in CHANGELOG to reflect that the API was not stable
116 | ### Removed
117 | - MainThread class and prefab (functionality has been intergrated into TwitchIRC class)
118 | - IRCPrivMsg class and IRCUserstate class which were mostly unused
119 |
120 | ## [0.2.0] - 2021-10-26
121 | ### Added
122 | - CHANGELOG.md
123 | - package.json
124 | - Lexonegit.UnityTwitchChat.asmdef
125 | ### Changed
126 | - All scripts now belong to the Lexonegit.UnityTwitchChat namespace
127 | ### Removed
128 | - Sample scene (temporarily)
129 |
130 | ## [0.1.0] - 2021-06-12
131 | - Last release from lexonegit
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Original work Copyright (c) 2020 Leevi Seppälä (lexonegit)
4 | Modified work Copyright (c) 2021 Incredulous Interactive
5 |
6 | Permission is hereby granted, free of charge, to any person obtaining a copy
7 | of this software and associated documentation files (the "Software"), to deal
8 | in the Software without restriction, including without limitation the rights
9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 | copies of the Software, and to permit persons to whom the Software is
11 | furnished to do so, subject to the following conditions:
12 |
13 | The above copyright notice and this permission notice shall be included in all
14 | copies or substantial portions of the Software.
15 |
16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 | SOFTWARE.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Unity Twitch Chat
2 |
3 | This is a lightweight and efficient [Twitch.tv IRC](https://dev.twitch.tv/docs/irc/) client for Unity.
4 |
5 | In short, this allows you to integrate Twitch Chat to your Unity projects.
The primary goal is to be able to read and send chat messages as efficiently as possible.
6 |
7 |
8 |
9 | ## Chat message example
10 |
11 |
12 | ### Supported features
13 | - Reading and sending chat messages
14 | - Parsing Twitch emotes and badges
15 | - Optional anonymous login
16 | - Automatic ratelimit checks
17 | - Name color normalization (similar to native Twitch chat)
18 |
19 | ### Unsupported features
20 | - Special messages (whispers, sub/resub, raids, first time viewers, etc)
21 | - Bits cheering, channel points, predictions, etc
22 | - Moderation (ban, timeout, etc)
23 | - Third party extensions (FFZ, BTTV, 7TV, etc)
24 | - and more...
25 |
26 | ### Other limitations
27 | - WebGL builds are not supported
28 |
29 | ## Installation
30 |
31 | - Open Unity Package Manager (Window -> Package Manager)
32 | - Click the `+` button in the top left corner
33 | - Select `Add package from git URL...`
34 | - Copy and paste the following URL and finish by clicking `Add`
35 | ```
36 | https://github.com/lexonegit/Unity-Twitch-Chat.git?path=/Unity-Twitch-Chat/Assets/Package
37 | ```
38 |
39 |
40 | ## Quick start
41 | 1. Install the Unity package (see above)
42 | 2. Create a new empty GameObject and add the `Twitch IRC` component.
43 | 3. In the inspector, set your Twitch details (OAuth, username, channel)
44 | - You can generate an OAuth token at https://twitchapps.com/tmi/
45 | - Alternatively you can enable `Use Anonymous Login` to use without OAuth
46 | 4. Make sure `Connect IRC On Start` and `Join Channel On Start` are enabled and press play – You should now see JOIN messages, etc. in the console.
47 | 5. Create a new script that has a listener for the `IRC.OnChatMessage` event.
48 | - See ListenerExample.cs for reference.
49 | - The listener will receive `Chatter` objects which contain information about each chat message, such as the chatter name, message, emotes, etc...
50 |
51 | Having issues? Check out the included ExampleProject for a better understanding.
52 |
53 | ## Example project
54 | Spawn chatters as jumping boxes. Box color is based on their primary badge.
55 |
56 |
57 |
58 | ## API documentation
59 |
60 | ### IRC.cs
61 | - `void` **Connect()** - Connects to Twitch IRC
62 | - `void` **Disconnect()** - Disconnects from Twitch IRC
63 | - `void` **SendChatMessage(string message)** - Sends a chat message to the channel
64 | - `void` **JoinChannel(string channel)** - Join a Twitch channel
65 | - `void` **LeaveChannel(string channel)** - Leave a Twitch channel
66 | - `void` **Ping()** - Sends a PING message to the Twitch IRC server
67 | - `event` **OnChatMessage** - Event that is invoked when a chat message is received
68 | - `event` **OnConnectionAlert** - Event that is invoked when a connection alert is received
69 | - `IRCTags` **ClientUserTags** - Returns the tags of the client user (badges, name color, etc)
70 |
71 | ### Chatter.cs
72 | - `Color` **GetNameColor()** - Returns the color of the chatter's name
73 | - `bool` **IsDisplayNameFontSafe()** - Returns true if displayName is "font-safe" meaning that it only contains characters: a-z, A-Z, 0-9, _
74 | - `bool` **ContainsEmote(string emoteId)** - Returns true if the chatter's message contains the specified emote (by id)
75 | - `bool` **HasBadge(string badgeName)** - Returns true if the chatter has the specified badge
76 |
77 | ## License
78 | MIT License
79 |
80 | ## Projects made with Unity Twitch Chat
81 |
82 | Intro Fighters, stream overlay game https://lexone.itch.io/introfighters
83 |
84 | *Did you make something cool? Contact me (lexone on Discord) to get featured here!*
85 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/.gitignore:
--------------------------------------------------------------------------------
1 | # This .gitignore file should be placed at the root of your Unity project directory
2 | #
3 | # This is a slightly modified version from the official Unity .gitignore:
4 | # https://github.com/github/gitignore/blob/main/Unity.gitignore
5 | #
6 | /[Ll]ibrary/
7 | /[Tt]emp/
8 | /[Oo]bj/
9 | /[Bb]uild/
10 | /[Bb]uilds/
11 | /[Ll]ogs/
12 | /[Uu]ser[Ss]ettings/
13 |
14 | # MemoryCaptures can get excessive in size.
15 | # They also could contain extremely sensitive data
16 | /[Mm]emoryCaptures/
17 |
18 | # Recordings can get excessive in size
19 | /[Rr]ecordings/
20 |
21 | # Uncomment this line if you wish to ignore the asset store tools plugin
22 | # /[Aa]ssets/AssetStoreTools*
23 |
24 | # Autogenerated Jetbrains Rider plugin
25 | /[Aa]ssets/Plugins/Editor/JetBrains*
26 |
27 | # Visual Studio and VSCode cache directory
28 | .vs/
29 | .vscode/
30 |
31 | # Gradle cache directory
32 | .gradle/
33 |
34 | # Autogenerated VS/MD/Consulo solution and project files
35 | ExportedObj/
36 | .consulo/
37 | *.csproj
38 | *.unityproj
39 | *.sln
40 | *.suo
41 | *.tmp
42 | *.user
43 | *.userprefs
44 | *.pidb
45 | *.booproj
46 | *.svd
47 | *.pdb
48 | *.mdb
49 | *.opendb
50 | *.VC.db
51 |
52 | # Unity3D generated meta files
53 | *.pidb.meta
54 | *.pdb.meta
55 | *.mdb.meta
56 |
57 | # Unity3D generated file on crash reports
58 | sysinfo.txt
59 |
60 | # Builds
61 | *.apk
62 | *.aab
63 | *.unitypackage
64 | *.app
65 |
66 | # Crashlytics generated file
67 | crashlytics-build.properties
68 |
69 | # Packed Addressables
70 | /[Aa]ssets/[Aa]ddressable[Aa]ssets[Dd]ata/*/*.bin*
71 |
72 | # Temporary auto-generated Android Assets
73 | /[Aa]ssets/[Ss]treamingAssets/aa.meta
74 | /[Aa]ssets/[Ss]treamingAssets/aa/*
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7bab4565cd924034e9b4182cf0b2bca7
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/BoxController.cs:
--------------------------------------------------------------------------------
1 | using System.Collections;
2 | using System.Collections.Generic;
3 | using UnityEngine;
4 | using UnityEngine.UI;
5 | using Lexone.UnityTwitchChat;
6 |
7 | ///
8 | /// This is an example script that shows some examples on how you could use the information from a Chatter object.
9 | ///
10 | public class BoxController : MonoBehaviour
11 | {
12 | public Transform ui;
13 | public Text nameText;
14 | public SpriteRenderer spriteRenderer;
15 |
16 | [Header("Badge colors")]
17 | public Color broadcasterColor;
18 | public Color moderatorColor;
19 | public Color vipColor;
20 | public Color subscriberColor;
21 |
22 | public void Initialize(Chatter chatter)
23 | {
24 | // Change name text to chatter's name.
25 | // Use displayName if it is "font-safe",
26 | // meaning that it only contains characters: a-z, A-Z, 0-9, _ (most fonts support these characters)
27 | // If not "font-safe" then use login name instead, which should always be "font-safe"
28 | nameText.text = chatter.IsDisplayNameFontSafe() ? chatter.tags.displayName : chatter.login;
29 | nameText.color = chatter.GetNameColor();
30 |
31 | // Change box color to match chatter's primary badge
32 | if (chatter.HasBadge("broadcaster"))
33 | spriteRenderer.color = broadcasterColor;
34 | else
35 | if (chatter.HasBadge("moderator"))
36 | spriteRenderer.color = moderatorColor;
37 | else
38 | if (chatter.HasBadge("vip"))
39 | spriteRenderer.color = vipColor;
40 | else
41 | if (chatter.HasBadge("subscriber"))
42 | spriteRenderer.color = subscriberColor;
43 |
44 |
45 | // If the chatter's message contained the Kappa emote (emote ID: 25)
46 | // Then make their box double the size
47 | if (chatter.ContainsEmote("25"))
48 | {
49 | transform.localScale *= 2;
50 | }
51 |
52 |
53 | // Detach UI from parent so that it doesn't rotate with the box
54 | ui.SetParent(null);
55 |
56 | // Start the jump logic
57 | StartCoroutine(JumpLogic());
58 | }
59 |
60 | private void LateUpdate()
61 | {
62 | // Update UI position to be above the box
63 | ui.position = (Vector2)transform.position + new Vector2(0, 1.5f);
64 | }
65 |
66 | private IEnumerator JumpLogic()
67 | {
68 | Rigidbody2D rb = GetComponent();
69 |
70 | // Add some random initial force
71 | rb.AddForce(Random.insideUnitCircle * Random.Range(5f, 10f), ForceMode2D.Impulse);
72 | rb.AddTorque(Random.Range(-1f, 1f), ForceMode2D.Impulse);
73 |
74 | while (true)
75 | {
76 | yield return new WaitForSeconds(Random.Range(2f, 5f));
77 |
78 | int direction = Random.value > 0.5f ? 1 : -1; // Random jump direction
79 | Vector2 force = Vector2.up * 10f + (Vector2.right * direction); // Jump force
80 |
81 | rb.AddForce(force, ForceMode2D.Impulse);
82 | rb.AddTorque(Random.Range(-1f, 1f), ForceMode2D.Impulse);
83 | }
84 | }
85 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/BoxController.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 049bedfc21a78ec43bdaaefcbdc851ac
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/BoxPrefab.prefab.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3ef85c00760080040a6cd2edfb587566
3 | PrefabImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/BoxSprite.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/ExampleProject/BoxSprite.png
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/BoxSprite.png.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 00d6a81b72135b54895ec0bfabffa7cb
3 | TextureImporter:
4 | internalIDToNameTable: []
5 | externalObjects: {}
6 | serializedVersion: 12
7 | mipmaps:
8 | mipMapMode: 0
9 | enableMipMap: 0
10 | sRGBTexture: 1
11 | linearTexture: 0
12 | fadeOut: 0
13 | borderMipMap: 0
14 | mipMapsPreserveCoverage: 0
15 | alphaTestReferenceValue: 0.5
16 | mipMapFadeDistanceStart: 1
17 | mipMapFadeDistanceEnd: 3
18 | bumpmap:
19 | convertToNormalMap: 0
20 | externalNormalMap: 0
21 | heightScale: 0.25
22 | normalMapFilter: 0
23 | isReadable: 0
24 | streamingMipmaps: 0
25 | streamingMipmapsPriority: 0
26 | vTOnly: 0
27 | ignoreMasterTextureLimit: 0
28 | grayScaleToAlpha: 0
29 | generateCubemap: 6
30 | cubemapConvolution: 0
31 | seamlessCubemap: 0
32 | textureFormat: 1
33 | maxTextureSize: 2048
34 | textureSettings:
35 | serializedVersion: 2
36 | filterMode: 1
37 | aniso: 1
38 | mipBias: 0
39 | wrapU: 1
40 | wrapV: 1
41 | wrapW: 1
42 | nPOTScale: 0
43 | lightmap: 0
44 | compressionQuality: 50
45 | spriteMode: 1
46 | spriteExtrude: 1
47 | spriteMeshType: 1
48 | alignment: 0
49 | spritePivot: {x: 0.5, y: 0.5}
50 | spritePixelsToUnits: 512
51 | spriteBorder: {x: 0, y: 0, z: 0, w: 0}
52 | spriteGenerateFallbackPhysicsShape: 1
53 | alphaUsage: 1
54 | alphaIsTransparency: 1
55 | spriteTessellationDetail: -1
56 | textureType: 8
57 | textureShape: 1
58 | singleChannelComponent: 0
59 | flipbookRows: 1
60 | flipbookColumns: 1
61 | maxTextureSizeSet: 0
62 | compressionQualitySet: 0
63 | textureFormatSet: 0
64 | ignorePngGamma: 0
65 | applyGammaDecoding: 0
66 | cookieLightType: 0
67 | platformSettings:
68 | - serializedVersion: 3
69 | buildTarget: DefaultTexturePlatform
70 | maxTextureSize: 32
71 | resizeAlgorithm: 0
72 | textureFormat: -1
73 | textureCompression: 1
74 | compressionQuality: 50
75 | crunchedCompression: 0
76 | allowsAlphaSplitting: 0
77 | overridden: 0
78 | androidETC2FallbackOverride: 0
79 | forceMaximumCompressionQuality_BC6H_BC7: 0
80 | - serializedVersion: 3
81 | buildTarget: Standalone
82 | maxTextureSize: 2048
83 | resizeAlgorithm: 0
84 | textureFormat: -1
85 | textureCompression: 1
86 | compressionQuality: 50
87 | crunchedCompression: 0
88 | allowsAlphaSplitting: 0
89 | overridden: 0
90 | androidETC2FallbackOverride: 0
91 | forceMaximumCompressionQuality_BC6H_BC7: 0
92 | - serializedVersion: 3
93 | buildTarget: Server
94 | maxTextureSize: 2048
95 | resizeAlgorithm: 0
96 | textureFormat: -1
97 | textureCompression: 1
98 | compressionQuality: 50
99 | crunchedCompression: 0
100 | allowsAlphaSplitting: 0
101 | overridden: 0
102 | androidETC2FallbackOverride: 0
103 | forceMaximumCompressionQuality_BC6H_BC7: 0
104 | spriteSheet:
105 | serializedVersion: 2
106 | sprites: []
107 | outline: []
108 | physicsShape: []
109 | bones: []
110 | spriteID: 5e97eb03825dee720800000000000000
111 | internalID: 0
112 | vertices: []
113 | indices:
114 | edges: []
115 | weights: []
116 | secondaryTextures: []
117 | nameFileIdTable: {}
118 | spritePackingTag:
119 | pSDRemoveMatte: 0
120 | pSDShowRemoveMatteOption: 0
121 | userData:
122 | assetBundleName:
123 | assetBundleVariant:
124 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ClickExplosionForce.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 |
3 | public class ClickExplosionForce : MonoBehaviour
4 | {
5 | private Vector2 mousePosition;
6 |
7 | public float explosionStrength = 10f;
8 | public float explosionRadius = 5f;
9 |
10 | private void Update()
11 | {
12 | mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
13 |
14 | if (Input.GetKeyDown(KeyCode.Mouse0))
15 | {
16 | Collider2D[] colliders = Physics2D.OverlapCircleAll(mousePosition, explosionRadius);
17 | foreach (Collider2D hit in colliders)
18 | {
19 | Rigidbody2D rb = hit.GetComponent();
20 |
21 | if (rb != null)
22 | {
23 | Vector2 explosionDir = rb.position - mousePosition;
24 | rb.AddForce(explosionDir.normalized * explosionStrength, ForceMode2D.Impulse);
25 | rb.AddTorque(Random.Range(-0.5f, 0.5f), ForceMode2D.Impulse);
26 | }
27 | }
28 | }
29 | }
30 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ClickExplosionForce.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 69948cb5081364a45a405c9d7ba35a22
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ColorNormalizationTester.cs:
--------------------------------------------------------------------------------
1 | using System.Collections;
2 | using System.Collections.Generic;
3 | using UnityEngine;
4 | using UnityEngine.UI;
5 |
6 | public class ColorNormalizationTester : MonoBehaviour
7 | {
8 | private Text[] children;
9 |
10 | private void Start()
11 | {
12 | children = GetComponentsInChildren();
13 |
14 | foreach (Text text in children)
15 | {
16 | text.color = Lexone.UnityTwitchChat.ChatColors.NormalizeColor(text.color);
17 | }
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ColorNormalizationTester.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6a81e44d347011646960aedd2ebc278d
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ConnectionExample.cs:
--------------------------------------------------------------------------------
1 | using System.Collections;
2 | using System.Collections.Generic;
3 | using UnityEngine;
4 | using Lexone.UnityTwitchChat;
5 |
6 | public class ConnectionExample : MonoBehaviour
7 | {
8 | // This is just a simple example on how to use the IRC class methods
9 | // You could for example hook Unity UI events to these methods
10 |
11 | public void JoinChannel()
12 | {
13 | IRC.Instance.JoinChannel("my_channel_name");
14 | }
15 |
16 | public void LeaveChannel()
17 | {
18 | IRC.Instance.LeaveChannel("my_channel_name");
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ConnectionExample.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 9cf5500d5886ba34890b94528198988c
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ListenerExample.cs:
--------------------------------------------------------------------------------
1 | using System.Collections;
2 | using System.Collections.Generic;
3 | using UnityEngine;
4 | using Lexone.UnityTwitchChat;
5 |
6 | public class ListenerExample : MonoBehaviour
7 | {
8 | public Chatter chatterObject; // Latest chatter object
9 | public BoxController boxPrefab;
10 | public int maxBoxes = 100;
11 | private int spawnCount = 0;
12 |
13 | private void Start()
14 | {
15 | // Add a listener for the IRC.OnChatMessage event
16 | IRC.Instance.OnChatMessage += OnChatMessage;
17 | }
18 |
19 | private void OnChatMessage(Chatter chatter)
20 | {
21 | // Handle new chat messages...
22 |
23 | Debug.Log($"[LISTENER EXAMPLE] New chat message from {chatter.tags.displayName}");
24 |
25 | // Debug.Log($"Message content: {chatter.message}");
26 |
27 | if (spawnCount >= maxBoxes)
28 | {
29 | Debug.LogWarning("Max amount of boxes reached!");
30 | return;
31 | }
32 |
33 | // Spawn a new box
34 | Vector3 spawnPosition = Random.insideUnitCircle * 3f;
35 | BoxController box = Instantiate(boxPrefab, spawnPosition, Quaternion.identity);
36 |
37 | // Initialize the box with the chatter details
38 | box.Initialize(chatter);
39 |
40 | // This is just to show the latest chatter object in the inspector
41 | chatterObject = chatter;
42 |
43 | spawnCount++;
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/ListenerExample.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 974b535c3ec440b43a88f4a21641189d
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/Scenes.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a44a07640393c0a4380dc997bd4cea7a
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/Scenes/ColorNormalizationTestScene.unity.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 94cfb315511731e428d9ba222aa9c4ba
3 | DefaultImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/ExampleProject/Scenes/ExampleScene.unity.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 039773080f91d9848b23a0f0fcee6bde
3 | DefaultImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 080a4cd72e310154ab6941989ea869e9
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 8469b83194f969748a7b1a858e85821e
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/Chatter.cs:
--------------------------------------------------------------------------------
1 |
2 | using UnityEngine;
3 |
4 | namespace Lexone.UnityTwitchChat
5 | {
6 | [System.Serializable]
7 | public class Chatter
8 | {
9 | public Chatter(string login, string channel, string message, IRCTags tags)
10 | {
11 | this.login = login;
12 | this.channel = channel;
13 | this.message = message;
14 | this.tags = tags;
15 | }
16 |
17 | public string login, channel, message;
18 | public IRCTags tags = null;
19 |
20 | ///
21 | /// Returns the RGBA color of the chatter's name (tags.colorHex)
22 | /// Should the name color be normalized, if needed?
23 | ///
24 | public Color GetNameColor(bool normalize = true)
25 | {
26 | if (ColorUtility.TryParseHtmlString(tags.colorHex, out Color color))
27 | {
28 | if (normalize)
29 | return ChatColors.NormalizeColor(color);
30 | else
31 | return color;
32 | }
33 | else
34 | return Color.white; // Parsing failed somehow, return default white
35 | }
36 |
37 | ///
38 | /// Returns true if displayName is "font-safe"
39 | /// meaning that it only contains characters: a-z, A-Z, 0-9, _
40 | /// Useful because most fonts do not support unusual characters
41 | ///
42 | public bool IsDisplayNameFontSafe()
43 | {
44 | return ParseHelper.CheckNameRegex(tags.displayName);
45 | }
46 |
47 | ///
48 | /// Returns true if the chatter's message contains a given emote (by emote ID)
49 | /// You can find emote IDs by using the Twitch API, or 3rd party sites
50 | ///
51 | public bool ContainsEmote(string emoteId) => tags.ContainsEmote(emoteId);
52 |
53 | ///
54 | /// Returns true if the chatter has a given badge.
55 | ///
56 | public bool HasBadge(string badgeName) => tags.HasBadge(badgeName);
57 | }
58 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/Chatter.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: b73688d3783a3614b8c93efa1d360c30
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/Extensions.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using System.Net.Sockets;
3 | using System.Text;
4 |
5 | namespace Lexone.UnityTwitchChat
6 | {
7 | public static class Extensions
8 | {
9 | public static void WriteLine(this NetworkStream stream, string output, bool showDebug = false)
10 | {
11 | if (showDebug)
12 | Debug.Log($"{Tags.write} {output}");
13 |
14 | byte[] bytes = Encoding.UTF8.GetBytes(output);
15 | stream.Write(bytes, 0, bytes.Length);
16 | stream.WriteByte((byte)'\r');
17 | stream.WriteByte((byte)'\n');
18 | stream.Flush();
19 | }
20 |
21 | ///
22 | /// Returns a string description for the ConnectionAlert enum.
23 | ///
24 | public static string GetDescription(this IRCReply alert)
25 | {
26 | switch (alert)
27 | {
28 | case IRCReply.CONNECTED_TO_SERVER:
29 | return "Connected to IRC";
30 | case IRCReply.PONG_RECEIVED:
31 | return "Pong!";
32 | case IRCReply.JOINED_CHANNEL:
33 | return "Joined channel";
34 | case IRCReply.MISSING_LOGIN_INFO:
35 | return "Missing login information (OAuth or username)";
36 | case IRCReply.BAD_LOGIN:
37 | return "Login failed";
38 | case IRCReply.CONNECTION_INTERRUPTED:
39 | return "Connection to IRC interrupted";
40 | case IRCReply.NO_CONNECTION:
41 | return "Connection to IRC failed";
42 | default:
43 | return "Unknown alert";
44 | }
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/Extensions.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 42ab443598ebf494082d4cb95163ccaa
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/IRC.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 7b273dcbdb39fcc4ab442b61d920b4ee
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/IRCMessages.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Lexone.UnityTwitchChat
4 | {
5 | [System.Serializable]
6 | public struct ChatterEmote
7 | {
8 | [System.Serializable]
9 | public struct Index
10 | {
11 | public int startIndex, endIndex;
12 | }
13 |
14 | public string id;
15 | public Index[] indexes;
16 | }
17 |
18 | [System.Serializable]
19 | public struct ChatterBadge
20 | {
21 | public string id;
22 | public string version;
23 | }
24 |
25 | [System.Serializable]
26 | public class IRCTags
27 | {
28 | public string colorHex = string.Empty;
29 | public string displayName = string.Empty;
30 | public string channelId = string.Empty;
31 | public string userId = string.Empty;
32 |
33 | public ChatterBadge[] badges = new ChatterBadge[0];
34 | public ChatterEmote[] emotes = new ChatterEmote[0];
35 |
36 | public bool ContainsEmote(string emoteId)
37 | {
38 | foreach (ChatterEmote e in emotes)
39 | {
40 | if (e.id == emoteId)
41 | return true;
42 | }
43 |
44 | return false;
45 | }
46 |
47 | public bool HasBadge(string badge)
48 | {
49 | foreach (ChatterBadge b in badges)
50 | {
51 | if (b.id == badge)
52 | return true;
53 | }
54 |
55 | return false;
56 | }
57 | }
58 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/IRCMessages.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 88f24ef1dd0473b4195a973a997e8f20
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/ParseHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Text.RegularExpressions;
2 |
3 | namespace Lexone.UnityTwitchChat
4 | {
5 | internal static class ParseHelper
6 | {
7 | public static int IndexOfNth(this string source, char val, int nth = 0)
8 | {
9 | int index = source.IndexOf(val);
10 |
11 | for (int i = 0; i < nth; ++i)
12 | {
13 | if (index == -1)
14 | return -1;
15 |
16 | index = source.IndexOf(val, index + 1);
17 | }
18 |
19 | return index;
20 | }
21 |
22 | private static Regex symbolRegex = new Regex(@"^[a-zA-Z0-9_]+$", RegexOptions.Compiled);
23 | public static bool CheckNameRegex(string displayName)
24 | {
25 | return symbolRegex.IsMatch(displayName);
26 | }
27 |
28 | public static IRCTags ParseTags(string tagString)
29 | {
30 | IRCTags tags = new IRCTags();
31 | string[] split = tagString.Split(';');
32 |
33 | // Loop through tags
34 | for (int i = 0; i < split.Length; ++i)
35 | {
36 | string value = split[i].Substring(split[i].IndexOf('=') + 1);
37 |
38 | if (value.Length <= 0) // Ignore empty tags
39 | continue;
40 |
41 | // Find the tags we are interested in
42 | switch (split[i].Substring(0, split[i].IndexOf('=')))
43 | {
44 | case "badges":
45 | tags.badges = ParseBadges(value.Split(','));
46 | continue;
47 |
48 | case "color":
49 | tags.colorHex = value;
50 | continue;
51 |
52 | case "display-name":
53 | tags.displayName = value;
54 | continue;
55 |
56 | case "emotes":
57 | tags.emotes = ParseTwitchEmotes(value.Split('/'));
58 | continue;
59 |
60 | case "room-id": // room-id = channel ID
61 | tags.channelId = value;
62 | continue;
63 |
64 | case "user-id":
65 | tags.userId = value;
66 | continue;
67 | }
68 | }
69 |
70 | return tags;
71 | }
72 |
73 | public static string ParseLoginName(string ircString)
74 | {
75 | return ircString.Substring(1, ircString.IndexOf('!') - 1);
76 | }
77 |
78 | public static string ParseChannel(string ircString)
79 | {
80 | string channel = ircString.Substring(ircString.IndexOf('#') + 1);
81 |
82 | int index = channel.IndexOf(' ');
83 | if (index == -1)
84 | return channel;
85 | else
86 | // Further parsing (needed for PRIVMSG for example)
87 | return channel.Substring(0, index);
88 | }
89 |
90 | public static string ParseMessage(string ircString)
91 | {
92 | return ircString.Substring(ircString.IndexOfNth(' ', 2) + 2);
93 | }
94 |
95 | public static ChatterEmote[] ParseTwitchEmotes(string[] splitEmotes)
96 | {
97 | ChatterEmote[] emotes = new ChatterEmote[splitEmotes.Length];
98 |
99 | for (int i = 0; i < splitEmotes.Length; ++i)
100 | {
101 | string e = splitEmotes[i];
102 |
103 | string[] indexes = e.Substring(e.IndexOf(':') + 1).Length > 0 ? e.Substring(e.IndexOf(':') + 1).Split(',') : new string[0];
104 |
105 | ChatterEmote.Index[] ind = new ChatterEmote.Index[indexes.Length];
106 |
107 | for (int j = 0; j < ind.Length; ++j)
108 | {
109 | ind[j].startIndex = int.Parse(indexes[j].Substring(0, indexes[j].IndexOf('-')));
110 | ind[j].endIndex = int.Parse(indexes[j].Substring(indexes[j].IndexOf('-') + 1));
111 | }
112 |
113 | emotes[i] = new ChatterEmote()
114 | {
115 | id = e.Substring(0, e.IndexOf(':')),
116 | indexes = ind
117 | };
118 | }
119 |
120 | return emotes;
121 | }
122 |
123 | public static ChatterBadge[] ParseBadges(string[] splitBadges)
124 | {
125 | ChatterBadge[] badges = new ChatterBadge[splitBadges.Length];
126 |
127 | for (int i = 0; i < splitBadges.Length; ++i)
128 | {
129 | string s = splitBadges[i];
130 |
131 | badges[i].id = s.Substring(0, s.IndexOf('/'));
132 | badges[i].version = s.Substring(s.IndexOf('/') + 1);
133 | }
134 |
135 | return badges;
136 | }
137 | }
138 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/ParseHelper.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: eed34128418642443ac1a049db44b3d7
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/RateLimit.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace Lexone.UnityTwitchChat
4 | {
5 | // See: https://dev.twitch.tv/docs/irc#rate-limits
6 | public struct RateLimit
7 | {
8 | public RateLimit(int count, TimeSpan timeSpan)
9 | {
10 | this.count = count;
11 | this.timeSpan = timeSpan;
12 | }
13 |
14 | public int count;
15 | public TimeSpan timeSpan;
16 |
17 | ///
18 | /// The chat command/message rate limit for users in a channel who do not have moderator permissions.
19 | ///
20 | public readonly static RateLimit ChatRegular = new RateLimit(20, new TimeSpan(0, 0, 30));
21 |
22 | ///
23 | /// The chat command/message rate limit for users in a channel who are the broadcaster or have moderator permissions.
24 | ///
25 | public readonly static RateLimit ChatModerator = new RateLimit(100, new TimeSpan(0, 0, 30));
26 |
27 |
28 | //
29 | // The rest is currently not implemented/used
30 | //
31 |
32 |
33 | ///
34 | /// The site-wide rate limit for verified bots to send chat commands/messages. Note: Channel level rate limits still apply based on the bot's user permissions.
35 | ///
36 | public readonly static RateLimit SiteLimitVerified = new RateLimit(7500, new TimeSpan(0, 0, 30));
37 |
38 | ///
39 | /// The authentication attempt rate limit for a regular Twitch account.
40 | ///
41 | public readonly static RateLimit AuthAttemptsRegular = new RateLimit(20, new TimeSpan(0, 0, 10));
42 |
43 | ///
44 | /// The join attempt rate limit for a regular Twitch account.
45 | ///
46 | public readonly static RateLimit JoinAttemptsRegular = new RateLimit(20, new TimeSpan(0, 0, 10));
47 |
48 | ///
49 | /// The authentication attempt rate limit for a Twitch-verified bot.
50 | ///
51 | public readonly static RateLimit AuthAttemptsVerified = new RateLimit(200, new TimeSpan(0, 0, 10));
52 |
53 | ///
54 | /// The join attempt rate limit for a Twitch-verified bot.
55 | ///
56 | public readonly static RateLimit JoinAttemptsVerified = new RateLimit(2000, new TimeSpan(0, 0, 10));
57 |
58 | ///
59 | /// The number of whispers allowed per second. Note: Whispers use a composite rate limit. Make sure to also check the rate against and .
60 | ///
61 | public readonly static RateLimit WhispersA = new RateLimit(3, new TimeSpan(0, 0, 1));
62 |
63 | ///
64 | /// The number of whispers allowed per minute. Note: Whispers use a composite rate limit. Make sure to also check the rate against and .
65 | ///
66 | public readonly static RateLimit WhispersB = new RateLimit(100, new TimeSpan(0, 1, 0));
67 |
68 | ///
69 | /// The number of channels per day in which an account is allowed to send whispers. Note: Whispers use a composite rate limit. Make sure to also check the rate against and .
70 | ///
71 | public readonly static RateLimit WhisperChannels = new RateLimit(40, new TimeSpan(1, 0, 0, 0));
72 | }
73 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/RateLimit.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d9812dc9d1798394b8c3e9a0df1fb54a
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.ReadThread.cs:
--------------------------------------------------------------------------------
1 | using UnityEngine;
2 | using System;
3 | using System.Text;
4 | using System.Threading;
5 | using System.Net.Sockets;
6 | using System.IO;
7 |
8 | namespace Lexone.UnityTwitchChat
9 | {
10 | internal partial class TwitchConnection
11 | {
12 | // Used to generate session based random colors for undefined users
13 | private int sessionRandom = DateTime.Now.Second;
14 |
15 | private void ReadThreadLoop()
16 | {
17 | if (showThreadDebug)
18 | Debug.Log($"{Tags.thread} Read thread started");
19 |
20 | using (NetworkStream stream = tcpClient.GetStream())
21 | {
22 | byte[] readBuffer = new byte[readBufferSize];
23 | StringBuilder currentLine = new StringBuilder();
24 | Decoder decoder = Encoding.UTF8.GetDecoder();
25 |
26 | // Temporary solution(?):
27 | // Certain multi-byte UTF-8 characters can result in overflowing (special characters)
28 | // So we add a little extra space to the chars array just to be safe
29 | char[] chars = new char[readBufferSize + Mathf.Clamp(readBufferSize / 4, 1, 32)];
30 |
31 | while (ThreadsRunning)
32 | {
33 | // Check if the connection is still alive
34 | if (!CheckConnection(tcpClient.Client))
35 | {
36 | alertQueue.Enqueue(IRCReply.CONNECTION_INTERRUPTED);
37 | return;
38 | }
39 |
40 | while (stream.DataAvailable)
41 | {
42 | // Read the bytes from the stream
43 | int bytesReceived = stream.Read(readBuffer, 0, readBufferSize);
44 |
45 | // Decode the bytes to chars
46 | int charsDecoded = decoder.GetChars(readBuffer, 0, bytesReceived, chars, 0);
47 |
48 | for (int i = 0; i < charsDecoded; ++i)
49 | {
50 | // Character is a linebreak -> We have a complete line
51 | if (chars[i] == '\n' || chars[i] == '\r')
52 | {
53 | // If the line is not empty, handle it
54 | if (currentLine.Length > 0)
55 | {
56 | HandleRawLine(currentLine.ToString());
57 | currentLine.Clear();
58 | }
59 | }
60 | else
61 | {
62 | // Append the character to the current line
63 | currentLine.Append(chars[i]);
64 | }
65 | }
66 | }
67 |
68 | // Sleep to prevent high CPU usage
69 | Thread.Sleep(readInterval);
70 | }
71 | }
72 |
73 | if (showThreadDebug)
74 | Debug.Log($"{Tags.thread} Read thread stopped");
75 | }
76 |
77 | private bool CheckConnection(Socket socket)
78 | {
79 | bool poll = socket.Poll(1000, SelectMode.SelectRead);
80 | bool available = (socket.Available == 0);
81 |
82 | if ((poll && available) || !socket.Connected)
83 | return false;
84 | else
85 | return true;
86 | }
87 |
88 |
89 | private void HandleRawLine(string raw)
90 | {
91 | if (showIRCDebug)
92 | Debug.Log($"{Tags.read} {raw}");
93 |
94 | string ircString = raw;
95 | string tagString = string.Empty;
96 |
97 | // Parsing the raw IRC lines...
98 |
99 | if (raw[0] == '@')
100 | {
101 | int ind = raw.IndexOf(' ');
102 | tagString = raw.Substring(0, ind);
103 | ircString = raw.Substring(ind).TrimStart();
104 | }
105 |
106 | if (ircString[0] == ':')
107 | {
108 | string type = ircString.Substring(ircString.IndexOf(' ')).TrimStart();
109 | type = type.Substring(0, type.IndexOf(' '));
110 |
111 | switch (type)
112 | {
113 | case "PRIVMSG": // = Chat message
114 | HandlePRIVMSG(ircString, tagString);
115 | break;
116 | case "USERSTATE": // = Userstate
117 | HandleUSERSTATE(ircString, tagString);
118 | break;
119 | case "NOTICE": // = Notice
120 | HandleNOTICE(ircString, tagString);
121 | break;
122 |
123 | // RPL messages
124 | case "353": // = Successful channel join
125 | case "001": // = Successful IRC connection
126 | HandleRPL(type);
127 | break;
128 | }
129 | }
130 |
131 | // Respond to PING messages with PONG
132 | if (raw.StartsWith("PING"))
133 | Pong();
134 |
135 | // Alert when PONG messages are received
136 | if (raw.StartsWith(":tmi.twitch.tv PONG"))
137 | alertQueue.Enqueue(IRCReply.PONG_RECEIVED);
138 | }
139 |
140 | ///
141 | /// Handle a PRIVMSG message
142 | ///
143 | private void HandlePRIVMSG(string ircString, string tagString)
144 | {
145 | var login = ParseHelper.ParseLoginName(ircString);
146 | var channel = ParseHelper.ParseChannel(ircString);
147 | var message = ParseHelper.ParseMessage(ircString);
148 | var tags = ParseHelper.ParseTags(tagString);
149 |
150 | // Not all users have set their Twitch name color, so we need to check for that
151 | if (tags.colorHex.Length <= 0)
152 | tags.colorHex = useRandomColorForUndefined
153 | ? ChatColors.GetRandomNameColor(sessionRandom, login)
154 | : "#FFFFFF";
155 |
156 | // Sort emotes by startIndex to match emote order in the actual chat message
157 | if (tags.emotes.Length > 0)
158 | {
159 | Array.Sort(tags.emotes, (a, b) =>
160 | a.indexes[0].startIndex.CompareTo(b.indexes[0].startIndex));
161 | }
162 |
163 | // Queue new chatter object
164 | chatterQueue.Enqueue(new Chatter(login, channel, message, tags));
165 | }
166 |
167 | ///
168 | /// Handle a USERSTATE message
169 | ///
170 | private void HandleUSERSTATE(string ircString, string tagString)
171 | {
172 | var tags = ParseHelper.ParseTags(tagString);
173 | ClientUserTags = tags;
174 | UpdateRateLimits(); // Update rate limits based on client tags
175 | }
176 |
177 | ///
178 | /// Handle a NOTICE message
179 | ///
180 | private void HandleNOTICE(string ircString, string tagString)
181 | {
182 | if (ircString.Contains(":Login authentication failed"))
183 | {
184 | alertQueue.Enqueue(IRCReply.BAD_LOGIN);
185 | }
186 | }
187 |
188 | ///
189 | /// Handle an RPL message
190 | ///
191 | private void HandleRPL(string type)
192 | {
193 | switch (type)
194 | {
195 | case "001":
196 | alertQueue.Enqueue(IRCReply.CONNECTED_TO_SERVER);
197 |
198 | if (joinChannelOnStart)
199 | IRC.Instance.JoinChannel(channel);
200 |
201 | break;
202 | case "353":
203 | alertQueue.Enqueue(IRCReply.JOINED_CHANNEL);
204 | break;
205 | }
206 | }
207 | }
208 | }
209 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.ReadThread.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 0a4f8d91e5f7c4d4eae094d6999e753f
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.WriteThread.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using UnityEngine;
3 | using System.Threading;
4 | using System.Collections.Concurrent;
5 |
6 | namespace Lexone.UnityTwitchChat
7 | {
8 | internal partial class TwitchConnection
9 | {
10 | private ConcurrentQueue priorityWriteQueue = new ConcurrentQueue();
11 | private ConcurrentQueue writeQueue = new ConcurrentQueue();
12 | private ConcurrentQueue writeTimestamps = new ConcurrentQueue();
13 |
14 | private void WriteThreadLoop()
15 | {
16 | if (showThreadDebug)
17 | Debug.Log($"{Tags.thread} Write thread started");
18 |
19 | var stream = tcpClient.GetStream();
20 | RateLimit currentRateLimit;
21 |
22 | while (ThreadsRunning)
23 | {
24 | // Process priority write queue (no ratelimiting)
25 | while (!priorityWriteQueue.IsEmpty)
26 | {
27 | if (priorityWriteQueue.TryDequeue(out string message))
28 | {
29 | stream.WriteLine(message, showIRCDebug);
30 | }
31 | }
32 |
33 | // Get the current rate limit
34 | lock (rateLimitLock)
35 | currentRateLimit = rateLimit;
36 |
37 | // Remove old timestamps (ratelimiting)
38 | var minTime = DateTime.Now - rateLimit.timeSpan;
39 | while (writeTimestamps.TryPeek(out var timestamp) && timestamp < minTime)
40 | writeTimestamps.TryDequeue(out _);
41 |
42 | // Process the write queue (with IRC ratelimiting in mind)
43 | while (!writeQueue.IsEmpty && writeTimestamps.Count < rateLimit.count)
44 | {
45 | if (writeQueue.TryDequeue(out var message))
46 | {
47 | stream.WriteLine(message, showIRCDebug);
48 | writeTimestamps.Enqueue(DateTime.Now);
49 | }
50 | }
51 |
52 | // Sleep to prevent high CPU usage
53 | Thread.Sleep(writeInterval);
54 |
55 | }
56 |
57 | if (showThreadDebug)
58 | Debug.Log($"{Tags.thread} Write thread stopped");
59 | }
60 |
61 | public void Ping() => SendCommand("PING :tmi.twitch.tv", true);
62 | public void Pong() => SendCommand("PONG :tmi.twitch.tv", true);
63 |
64 | public void SendCommand(string command, bool priority = false)
65 | {
66 | if (priority)
67 | priorityWriteQueue.Enqueue(command);
68 | else
69 | writeQueue.Enqueue(command);
70 | }
71 |
72 | ///
73 | /// Sends a chat message to the channel.
74 | ///
75 | public void SendChatMessage(string message)
76 | {
77 | if (message.Length <= 0)
78 | {
79 | Debug.LogWarning($"{Tags.write} Tried sending an empty chat message");
80 | return;
81 | }
82 |
83 | // Place the chat message into the write queue
84 | SendCommand("PRIVMSG #" + channel + " :" + message);
85 | }
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.WriteThread.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: dad2684412a4f6b42bfd8bf09418213e
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections;
3 | using System.Net.Sockets;
4 | using System.Threading;
5 | using System.Collections.Concurrent;
6 |
7 | namespace Lexone.UnityTwitchChat
8 | {
9 | internal partial class TwitchConnection
10 | {
11 | public TwitchConnection(IRC irc)
12 | {
13 | try
14 | {
15 | tcpClient = new TcpClient(irc.address, irc.port);
16 | }
17 | catch
18 | {
19 | tcpClient = null;
20 | }
21 |
22 | this.oauth = irc.oauth;
23 | this.nick = irc.username;
24 | this.channel = irc.channel;
25 |
26 | this.readBufferSize = (int)irc.readBufferSize; // Parse enum value
27 | this.readInterval = irc.readInterval;
28 | this.writeInterval = irc.writeInterval;
29 |
30 | this.alertQueue = irc.alertQueue;
31 | this.chatterQueue = irc.chatterQueue;
32 |
33 | this.rateLimit = RateLimit.ChatRegular;
34 |
35 | this.joinChannelOnStart = irc.joinChannelOnStart;
36 | this.showIRCDebug = irc.showIRCDebug;
37 | this.showThreadDebug = irc.showThreadDebug;
38 |
39 | this.useRandomColorForUndefined = irc.useRandomColorForUndefined;
40 | }
41 |
42 | public TcpClient tcpClient { get; private set; }
43 |
44 | private IRCTags _clientUserTags;
45 | public IRCTags ClientUserTags
46 | {
47 | get => _clientUserTags;
48 | set => Interlocked.Exchange(ref _clientUserTags, value);
49 | }
50 |
51 | private int _threadsRunning = 1;
52 | private bool ThreadsRunning
53 | {
54 | get => _threadsRunning == 1;
55 | set => Interlocked.Exchange(ref _threadsRunning, value ? 1 : 0);
56 | }
57 |
58 | public bool disconnectCalled = false;
59 |
60 | private readonly string oauth;
61 | private readonly string nick;
62 | private readonly string channel;
63 | private readonly int readBufferSize;
64 | private readonly int readInterval;
65 | private readonly int writeInterval;
66 | private readonly bool joinChannelOnStart;
67 | private readonly bool showIRCDebug;
68 | private readonly bool showThreadDebug;
69 | private readonly bool useRandomColorForUndefined;
70 |
71 | private readonly ConcurrentQueue alertQueue;
72 | private readonly ConcurrentQueue chatterQueue;
73 |
74 | private Thread readThread;
75 | private Thread writeThread;
76 |
77 | private RateLimit rateLimit = RateLimit.ChatRegular;
78 | private object rateLimitLock = new object();
79 |
80 | public void Begin()
81 | {
82 | readThread = new Thread(() => ReadThreadLoop());
83 | writeThread = new Thread(() => WriteThreadLoop());
84 |
85 | readThread.Start();
86 | writeThread.Start();
87 |
88 | // Send connection commands
89 | SendCommand("PASS oauth:" + oauth.ToLower(), true);
90 | SendCommand("NICK " + nick.ToLower(), true);
91 | SendCommand("CAP REQ :twitch.tv/tags twitch.tv/commands", true); // twitch.tv/membership
92 | }
93 |
94 | public IEnumerator End()
95 | {
96 | if (tcpClient == null || disconnectCalled)
97 | yield break;
98 |
99 | disconnectCalled = true;
100 | ThreadsRunning = false;
101 |
102 | // Wait for the threads to stop
103 | while (readThread.IsAlive)
104 | yield return null;
105 | while (writeThread.IsAlive)
106 | yield return null;
107 |
108 | tcpClient.Close();
109 | }
110 |
111 | public void BlockingEnd()
112 | {
113 | if (tcpClient == null)
114 | return;
115 |
116 | disconnectCalled = true;
117 | ThreadsRunning = false;
118 | readThread?.Join();
119 | writeThread?.Join();
120 | tcpClient.Close();
121 | }
122 |
123 | private void UpdateRateLimits()
124 | {
125 | if (ClientUserTags.HasBadge("broadcaster") || ClientUserTags.HasBadge("moderator"))
126 | {
127 | lock (rateLimitLock)
128 | rateLimit = RateLimit.ChatModerator;
129 | }
130 | else
131 | {
132 | lock (rateLimitLock)
133 | rateLimit = RateLimit.ChatRegular;
134 | }
135 | }
136 |
137 | }
138 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/TwitchConnection.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e63f2c14884c7c440a75fd7342570e3d
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/Utils.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using UnityEngine;
3 |
4 | using Random = System.Random;
5 |
6 | namespace Lexone.UnityTwitchChat
7 | {
8 | ///
9 | /// https://www.ietf.org/rfc/rfc1459.txt (starting on page 42 - Replies)
10 | ///
11 | public enum IRCReply
12 | {
13 | // Twitch IRC specific codes
14 | CONNECTED_TO_SERVER = 001,
15 | PONG_RECEIVED = 007,
16 |
17 | // Command codes
18 | JOINED_CHANNEL = 353,
19 |
20 | // Error codes
21 | MISSING_LOGIN_INFO = 431,
22 | BAD_LOGIN = 464,
23 | CONNECTION_INTERRUPTED = 498,
24 | NO_CONNECTION = 499,
25 | }
26 |
27 |
28 | public enum ReadBufferSize
29 | {
30 | _32 = 32,
31 | _64 = 64,
32 | _128 = 128,
33 | _256 = 256,
34 | _512 = 512,
35 | _1024 = 1024,
36 | _2048 = 2048,
37 | _4096 = 4096,
38 | }
39 |
40 | public static class Tags
41 | {
42 | public static string read = "[IRC READ]";
43 | public static string write = "[IRC WRITE]";
44 | public static string thread = "[THREAD]";
45 | public static string alert = "[ALERT]";
46 | }
47 |
48 | public static class ChatColors
49 | {
50 | // These are taken from https://discuss.dev.twitch.tv/t/default-user-color-in-chat/385
51 | public static string[] defaultNameColors = new string[]
52 | {
53 | "#FF0000", // Red
54 | "#00FF00", // Green
55 | "#0000FF", // Blue
56 | "#B22222", // Firebrick
57 | "#FF7F50", // Coral
58 | "#9ACD32", // Yellow Green
59 | "#FF4500", // Orange Red
60 | "#2E8B57", // Sea Green
61 | "#DAA520", // Goldenrod
62 | "#D2691E", // Chocolate
63 | "#5F9EA0", // Cadet Blue
64 | "#1E90FF", // Dodger Blue
65 | "#FF69B4", // Hot Pink
66 | "#8A2BE2", // Blue Violet
67 | "#00FF7F", // Spring Green
68 | };
69 |
70 | ///
71 | /// Gets a random name color based on the chatter's login (+ session random seed)
72 | /// This is similar to what native Twitch chat does
73 | ///
74 | public static string GetRandomNameColor(int sessionRandom, string login)
75 | {
76 | int n = sessionRandom + login[0] + login[login.Length - 1];
77 | return defaultNameColors[n % defaultNameColors.Length];
78 | }
79 |
80 | // These values can be adjusted to control how dark and bright colors are handled
81 | public static float grayscaleLow = 0.3f;
82 | public static float grayscaleHigh = 1.0f;
83 | ///
84 | /// Normalizes the color if needed to make it more readable
85 | /// Very bright colors are darkened, very dark colors are brightened
86 | /// This is similar to what native Twitch chat does
87 | ///
88 | public static Color NormalizeColor(Color color)
89 | {
90 | // Too dark -> make brighter
91 | if (color.grayscale < grayscaleLow)
92 | {
93 | float delta = grayscaleLow - color.grayscale;
94 | return new Color(color.r + delta, color.g + delta, color.b + delta);
95 | }
96 |
97 | // Too bright -> make darker
98 | if (color.grayscale > grayscaleHigh)
99 | {
100 | float delta = grayscaleHigh - color.grayscale;
101 | return new Color(color.r + delta, color.g + delta, color.b + delta);
102 | }
103 |
104 | return color;
105 | }
106 | }
107 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/Utils.cs.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d85bf82f9bad72a4dab2a2e5a021bc1d
3 | MonoImporter:
4 | externalObjects: {}
5 | serializedVersion: 2
6 | defaultReferences: []
7 | executionOrder: 0
8 | icon: {instanceID: 0}
9 | userData:
10 | assetBundleName:
11 | assetBundleVariant:
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/lexonegit.unity-twitch-chat.asmdef:
--------------------------------------------------------------------------------
1 | {
2 | "name": "lexonegit.unity-twitch-chat"
3 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/Runtime/lexonegit.unity-twitch-chat.asmdef.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 427c63a364266f3438999d68e4849006
3 | AssemblyDefinitionImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "com.lexonegit.unity-twitch-chat",
3 | "version": "1.2.3",
4 | "displayName": "Unity Twitch Chat",
5 | "description": "Lightweight and easy-to-use Twitch IRC client for Unity projects",
6 | "documentationUrl": "https://github.com/lexonegit/Unity-Twitch-Chat",
7 | "changelogUrl": "https://github.com/lexonegit/Unity-Twitch-Chat/blob/master/CHANGELOG.md",
8 | "licensesUrl": "https://github.com/lexonegit/Unity-Twitch-Chat/blob/master/LICENSE",
9 | "keywords": [
10 | "Twitch",
11 | "Chat",
12 | "Twitch IRC"
13 | ],
14 | "author": {
15 | "name": "Lexone",
16 | "url": "https://github.com/lexonegit"
17 | }
18 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/Package/package.json.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a3d1c632776147e4284a50a192dfce32
3 | PackageManifestImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: f54d1bd14bd3ca042bd867b519fee8cc
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 8e7e8f5a82a3a134e91c54efd2274ea9
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Documentation/TextMesh Pro User Guide 2016.pdf.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 1b8d251f9af63b746bf2f7ffe00ebb9b
3 | DefaultImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6ab70aee4d56447429c680537fbf93ed
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt:
--------------------------------------------------------------------------------
1 | Digitized data copyright (c) 2010 Google Corporation
2 | with Reserved Font Arimo, Tinos and Cousine.
3 | Copyright (c) 2012 Red Hat, Inc.
4 | with Reserved Font Name Liberation.
5 |
6 | This Font Software is licensed under the SIL Open Font License, Version 1.1.
7 | This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL
8 |
9 | -----------------------------------------------------------
10 | SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
11 | -----------------------------------------------------------
12 |
13 | PREAMBLE
14 | The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others.
15 |
16 | The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives.
17 |
18 | DEFINITIONS
19 | "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation.
20 |
21 | "Reserved Font Name" refers to any names specified as such after the copyright statement(s).
22 |
23 | "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s).
24 |
25 | "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment.
26 |
27 | "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software.
28 |
29 | PERMISSION & CONDITIONS
30 | Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions:
31 |
32 | 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself.
33 |
34 | 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user.
35 |
36 | 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users.
37 |
38 | 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission.
39 |
40 | 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software.
41 |
42 | TERMINATION
43 | This license becomes null and void if any of the above conditions are not met.
44 |
45 | DISCLAIMER
46 | THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE.
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans - OFL.txt.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 6e59c59b81ab47f9b6ec5781fa725d2c
3 | timeCreated: 1484171296
4 | licenseType: Pro
5 | TextScriptImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans.ttf
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Fonts/LiberationSans.ttf.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e3265ab4bf004d28a9537516768c1c75
3 | timeCreated: 1484171297
4 | licenseType: Pro
5 | TrueTypeFontImporter:
6 | serializedVersion: 2
7 | fontSize: 16
8 | forceTextureCase: -2
9 | characterSpacing: 1
10 | characterPadding: 0
11 | includeFontData: 1
12 | use2xBehaviour: 0
13 | fontNames: []
14 | fallbackFontReferences: []
15 | customCharacters:
16 | fontRenderingMode: 0
17 | userData:
18 | assetBundleName:
19 | assetBundleVariant:
20 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 243e06394e614e5d99fab26083b707fa
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 731f1baa9d144a9897cb1d341c2092b8
3 | folderAsset: yes
4 | timeCreated: 1442040525
5 | licenseType: Pro
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!21 &2100000
4 | Material:
5 | serializedVersion: 6
6 | m_ObjectHideFlags: 0
7 | m_CorrespondingSourceObject: {fileID: 0}
8 | m_PrefabInstance: {fileID: 0}
9 | m_PrefabAsset: {fileID: 0}
10 | m_Name: LiberationSans SDF - Drop Shadow
11 | m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3}
12 | m_ShaderKeywords: OUTLINE_ON UNDERLAY_ON
13 | m_LightmapFlags: 5
14 | m_EnableInstancingVariants: 0
15 | m_DoubleSidedGI: 0
16 | m_CustomRenderQueue: -1
17 | stringTagMap: {}
18 | disabledShaderPasses: []
19 | m_SavedProperties:
20 | serializedVersion: 3
21 | m_TexEnvs:
22 | - _BumpMap:
23 | m_Texture: {fileID: 0}
24 | m_Scale: {x: 1, y: 1}
25 | m_Offset: {x: 0, y: 0}
26 | - _Cube:
27 | m_Texture: {fileID: 0}
28 | m_Scale: {x: 1, y: 1}
29 | m_Offset: {x: 0, y: 0}
30 | - _FaceTex:
31 | m_Texture: {fileID: 0}
32 | m_Scale: {x: 1, y: 1}
33 | m_Offset: {x: 0, y: 0}
34 | - _MainTex:
35 | m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee,
36 | type: 2}
37 | m_Scale: {x: 1, y: 1}
38 | m_Offset: {x: 0, y: 0}
39 | - _OutlineTex:
40 | m_Texture: {fileID: 0}
41 | m_Scale: {x: 1, y: 1}
42 | m_Offset: {x: 0, y: 0}
43 | m_Floats:
44 | - _Ambient: 0.5
45 | - _Bevel: 0.5
46 | - _BevelClamp: 0
47 | - _BevelOffset: 0
48 | - _BevelRoundness: 0
49 | - _BevelWidth: 0
50 | - _BumpFace: 0
51 | - _BumpOutline: 0
52 | - _ColorMask: 15
53 | - _Diffuse: 0.5
54 | - _DiffusePower: 1
55 | - _FaceDilate: 0.1
56 | - _FaceUVSpeedX: 0
57 | - _FaceUVSpeedY: 0
58 | - _GlowInner: 0.05
59 | - _GlowOffset: 0
60 | - _GlowOuter: 0.05
61 | - _GlowPower: 0.75
62 | - _GradientScale: 10
63 | - _LightAngle: 3.1416
64 | - _MaskSoftnessX: 0
65 | - _MaskSoftnessY: 0
66 | - _OutlineSoftness: 0
67 | - _OutlineUVSpeedX: 0
68 | - _OutlineUVSpeedY: 0
69 | - _OutlineWidth: 0.1
70 | - _PerspectiveFilter: 0.875
71 | - _Reflectivity: 10
72 | - _ScaleRatioA: 0.9
73 | - _ScaleRatioB: 0.73125
74 | - _ScaleRatioC: 0.64125
75 | - _ScaleX: 1
76 | - _ScaleY: 1
77 | - _ShaderFlags: 0
78 | - _Sharpness: 0
79 | - _SpecularPower: 2
80 | - _Stencil: 0
81 | - _StencilComp: 8
82 | - _StencilOp: 0
83 | - _StencilReadMask: 255
84 | - _StencilWriteMask: 255
85 | - _TextureHeight: 1024
86 | - _TextureWidth: 1024
87 | - _UnderlayDilate: 0
88 | - _UnderlayOffsetX: 0.5
89 | - _UnderlayOffsetY: -0.5
90 | - _UnderlaySoftness: 0.05
91 | - _VertexOffsetX: 0
92 | - _VertexOffsetY: 0
93 | - _WeightBold: 0.75
94 | - _WeightNormal: 0
95 | m_Colors:
96 | - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
97 | - _Color: {r: 1, g: 1, b: 1, a: 1}
98 | - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0}
99 | - _FaceColor: {r: 1, g: 1, b: 1, a: 1}
100 | - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5}
101 | - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767}
102 | - _OutlineColor: {r: 0, g: 0, b: 0, a: 1}
103 | - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1}
104 | - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1}
105 | - _SpecularColor: {r: 1, g: 1, b: 1, a: 1}
106 | - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
107 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Drop Shadow.mat.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e73a58f6e2794ae7b1b7e50b7fb811b0
3 | timeCreated: 1484172806
4 | licenseType: Pro
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Fallback.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 2e498d1c8094910479dc3e1b768306a4
3 | timeCreated: 1484171803
4 | licenseType: Pro
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!21 &2100000
4 | Material:
5 | serializedVersion: 6
6 | m_ObjectHideFlags: 0
7 | m_CorrespondingSourceObject: {fileID: 0}
8 | m_PrefabInstance: {fileID: 0}
9 | m_PrefabAsset: {fileID: 0}
10 | m_Name: LiberationSans SDF - Outline
11 | m_Shader: {fileID: 4800000, guid: fe393ace9b354375a9cb14cdbbc28be4, type: 3}
12 | m_ShaderKeywords: OUTLINE_ON
13 | m_LightmapFlags: 5
14 | m_EnableInstancingVariants: 0
15 | m_DoubleSidedGI: 0
16 | m_CustomRenderQueue: -1
17 | stringTagMap: {}
18 | disabledShaderPasses: []
19 | m_SavedProperties:
20 | serializedVersion: 3
21 | m_TexEnvs:
22 | - _BumpMap:
23 | m_Texture: {fileID: 0}
24 | m_Scale: {x: 1, y: 1}
25 | m_Offset: {x: 0, y: 0}
26 | - _Cube:
27 | m_Texture: {fileID: 0}
28 | m_Scale: {x: 1, y: 1}
29 | m_Offset: {x: 0, y: 0}
30 | - _FaceTex:
31 | m_Texture: {fileID: 0}
32 | m_Scale: {x: 1, y: 1}
33 | m_Offset: {x: 0, y: 0}
34 | - _MainTex:
35 | m_Texture: {fileID: 28684132378477856, guid: 8f586378b4e144a9851e7b34d9b748ee,
36 | type: 2}
37 | m_Scale: {x: 1, y: 1}
38 | m_Offset: {x: 0, y: 0}
39 | - _OutlineTex:
40 | m_Texture: {fileID: 0}
41 | m_Scale: {x: 1, y: 1}
42 | m_Offset: {x: 0, y: 0}
43 | m_Floats:
44 | - _Ambient: 0.5
45 | - _Bevel: 0.5
46 | - _BevelClamp: 0
47 | - _BevelOffset: 0
48 | - _BevelRoundness: 0
49 | - _BevelWidth: 0
50 | - _BumpFace: 0
51 | - _BumpOutline: 0
52 | - _ColorMask: 15
53 | - _Diffuse: 0.5
54 | - _FaceDilate: 0.1
55 | - _FaceUVSpeedX: 0
56 | - _FaceUVSpeedY: 0
57 | - _GlowInner: 0.05
58 | - _GlowOffset: 0
59 | - _GlowOuter: 0.05
60 | - _GlowPower: 0.75
61 | - _GradientScale: 10
62 | - _LightAngle: 3.1416
63 | - _MaskSoftnessX: 0
64 | - _MaskSoftnessY: 0
65 | - _OutlineSoftness: 0
66 | - _OutlineUVSpeedX: 0
67 | - _OutlineUVSpeedY: 0
68 | - _OutlineWidth: 0.1
69 | - _PerspectiveFilter: 0.875
70 | - _Reflectivity: 10
71 | - _ScaleRatioA: 0.9
72 | - _ScaleRatioB: 0.73125
73 | - _ScaleRatioC: 0.64125
74 | - _ScaleX: 1
75 | - _ScaleY: 1
76 | - _ShaderFlags: 0
77 | - _Sharpness: 0
78 | - _SpecularPower: 2
79 | - _Stencil: 0
80 | - _StencilComp: 8
81 | - _StencilOp: 0
82 | - _StencilReadMask: 255
83 | - _StencilWriteMask: 255
84 | - _TextureHeight: 1024
85 | - _TextureWidth: 1024
86 | - _UnderlayDilate: 0
87 | - _UnderlayOffsetX: 0
88 | - _UnderlayOffsetY: 0
89 | - _UnderlaySoftness: 0
90 | - _VertexOffsetX: 0
91 | - _VertexOffsetY: 0
92 | - _WeightBold: 0.75
93 | - _WeightNormal: 0
94 | m_Colors:
95 | - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767}
96 | - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0}
97 | - _FaceColor: {r: 1, g: 1, b: 1, a: 1}
98 | - _GlowColor: {r: 0, g: 1, b: 0, a: 0.5}
99 | - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767}
100 | - _OutlineColor: {r: 0, g: 0, b: 0, a: 1}
101 | - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1}
102 | - _ReflectOutlineColor: {r: 0, g: 0, b: 0, a: 1}
103 | - _SpecularColor: {r: 1, g: 1, b: 1, a: 1}
104 | - _UnderlayColor: {r: 0, g: 0, b: 0, a: 0.5}
105 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF - Outline.mat.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 79459efec17a4d00a321bdcc27bbc385
3 | timeCreated: 1484172856
4 | licenseType: Pro
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Fonts & Materials/LiberationSans SDF.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 8f586378b4e144a9851e7b34d9b748ee
3 | timeCreated: 1484171803
4 | licenseType: Pro
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt:
--------------------------------------------------------------------------------
1 | )]}〕〉》」』】〙〗〟’”⦆»ヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻‐゠–〜?!‼⁇⁈⁉・、%,.:;。!?]):;=}¢°"†‡℃〆%,.
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Following Characters.txt.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: fade42e8bc714b018fac513c043d323b
3 | timeCreated: 1425440388
4 | licenseType: Store
5 | TextScriptImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt:
--------------------------------------------------------------------------------
1 | ([{〔〈《「『【〘〖〝‘“⦅«$—…‥〳〴〵\[({£¥"々〇$¥₩ #
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/LineBreaking Leading Characters.txt.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d82c1b31c7e74239bff1220585707d2b
3 | timeCreated: 1425440388
4 | licenseType: Store
5 | TextScriptImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Sprite Assets.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 512a49d95c0c4332bdd98131869c23c9
3 | folderAsset: yes
4 | timeCreated: 1441876896
5 | licenseType: Pro
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Sprite Assets/EmojiOne.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c41005c129ba4d66911b75229fd70b45
3 | timeCreated: 1480316912
4 | licenseType: Pro
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Style Sheets.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 4aecb92fff08436c8303b10eab8da368
3 | folderAsset: yes
4 | timeCreated: 1441876950
5 | licenseType: Pro
6 | DefaultImporter:
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &11400000
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 0
6 | m_PrefabParentObject: {fileID: 0}
7 | m_PrefabInternal: {fileID: 0}
8 | m_GameObject: {fileID: 0}
9 | m_Enabled: 1
10 | m_EditorHideFlags: 0
11 | m_Script: {fileID: 11500000, guid: ab2114bdc8544297b417dfefe9f1e410, type: 3}
12 | m_Name: Default Style Sheet
13 | m_EditorClassIdentifier:
14 | m_StyleList:
15 | - m_Name: H1
16 | m_HashCode: 2425
17 | m_OpeningDefinition: <#40ff80>*
18 | m_ClosingDefinition: '*'
19 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d00000032000000650000006d0000003e0000003c000000620000003e0000003c000000230000003400000030000000660000006600000038000000300000003e0000002a000000
20 | m_ClosingTagArray: 2a0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000
21 | - m_Name: Quote
22 | m_HashCode: 92254330
23 | m_OpeningDefinition:
24 | m_ClosingDefinition:
25 | m_OpeningTagArray: 3c000000690000003e0000003c00000073000000690000007a000000650000003d0000003700000035000000250000003e0000003c0000006d000000610000007200000067000000690000006e0000003d0000003100000030000000250000003e000000
26 | m_ClosingTagArray: 3c0000002f000000690000003e0000003c0000002f00000073000000690000007a000000650000003e0000003c0000002f00000077000000690000006400000074000000680000003e0000003c0000002f0000006d000000610000007200000067000000690000006e0000003e000000
27 | - m_Name: Link
28 | m_HashCode: 2687968
29 | m_OpeningDefinition: <#40a0ff>
30 | m_ClosingDefinition:
31 | m_OpeningTagArray: 3c000000750000003e0000003c000000230000003400000030000000610000003000000066000000660000003e0000003c0000006c000000690000006e0000006b0000003d0000002200000049000000440000005f0000003000000031000000220000003e000000
32 | m_ClosingTagArray: 3c0000002f000000750000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f0000006c000000690000006e0000006b0000003e000000
33 | - m_Name: Title
34 | m_HashCode: 98732960
35 | m_OpeningDefinition:
36 | m_ClosingDefinition:
37 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000003200000035000000250000003e0000003c000000620000003e0000003c000000610000006c00000069000000670000006e0000003d00000063000000650000006e0000007400000065000000720000003e000000
38 | m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000610000006c00000069000000670000006e0000003e000000
39 | - m_Name: H2
40 | m_HashCode: 2426
41 | m_OpeningDefinition: <#4080FF>
42 | m_ClosingDefinition:
43 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000002e00000035000000650000006d0000003e0000003c000000620000003e0000003c000000230000003400000030000000380000003000000046000000460000003e000000
44 | m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000
45 | - m_Name: H3
46 | m_HashCode: 2427
47 | m_OpeningDefinition: <#FF8040>
48 | m_ClosingDefinition:
49 | m_OpeningTagArray: 3c00000073000000690000007a000000650000003d000000310000002e0000003100000037000000650000006d0000003e0000003c000000620000003e0000003c000000230000004600000046000000380000003000000034000000300000003e000000
50 | m_ClosingTagArray: 3c0000002f00000073000000690000007a000000650000003e0000003c0000002f000000620000003e0000003c0000002f000000630000006f0000006c0000006f000000720000003e000000
51 | - m_Name: C1
52 | m_HashCode: 2194
53 | m_OpeningDefinition:
54 | m_ClosingDefinition:
55 | m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000006600000066000000660000006600000034000000300000003e000000
56 | m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e000000
57 | - m_Name: C2
58 | m_HashCode: 2193
59 | m_OpeningDefinition:
60 | m_ClosingDefinition:
61 | m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000006600000066000000340000003000000046000000460000003e0000003c00000073000000690000007a000000650000003d000000310000003200000035000000250000003e000000
62 | m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f00000073000000690000007a000000650000003e000000
63 | - m_Name: C3
64 | m_HashCode: 2192
65 | m_OpeningDefinition:
66 | m_ClosingDefinition:
67 | m_OpeningTagArray: 3c000000630000006f0000006c0000006f000000720000003d000000230000003800000030000000410000003000000046000000460000003e0000003c000000620000003e000000
68 | m_ClosingTagArray: 3c0000002f000000630000006f0000006c0000006f000000720000003e0000003c0000002f000000620000003e000000
69 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/Style Sheets/Default Style Sheet.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: f952c082cb03451daed3ee968ac6c63e
3 | timeCreated: 1432805430
4 | licenseType: Store
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/TMP Settings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &11400000
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 0
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 11500000, guid: 2705215ac5b84b70bacc50632be6e391, type: 3}
13 | m_Name: TMP Settings
14 | m_EditorClassIdentifier:
15 | m_enableWordWrapping: 1
16 | m_enableKerning: 1
17 | m_enableExtraPadding: 0
18 | m_enableTintAllSprites: 0
19 | m_enableParseEscapeCharacters: 1
20 | m_EnableRaycastTarget: 1
21 | m_GetFontFeaturesAtRuntime: 1
22 | m_missingGlyphCharacter: 0
23 | m_warningsDisabled: 0
24 | m_defaultFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2}
25 | m_defaultFontAssetPath: Fonts & Materials/
26 | m_defaultFontSize: 36
27 | m_defaultAutoSizeMinRatio: 0.5
28 | m_defaultAutoSizeMaxRatio: 2
29 | m_defaultTextMeshProTextContainerSize: {x: 20, y: 5}
30 | m_defaultTextMeshProUITextContainerSize: {x: 200, y: 50}
31 | m_autoSizeTextContainer: 0
32 | m_fallbackFontAssets: []
33 | m_matchMaterialPreset: 1
34 | m_defaultSpriteAsset: {fileID: 11400000, guid: c41005c129ba4d66911b75229fd70b45,
35 | type: 2}
36 | m_defaultSpriteAssetPath: Sprite Assets/
37 | m_enableEmojiSupport: 1
38 | m_MissingCharacterSpriteUnicode: 0
39 | m_defaultColorGradientPresetsPath: Color Gradient Presets/
40 | m_defaultStyleSheet: {fileID: 11400000, guid: f952c082cb03451daed3ee968ac6c63e,
41 | type: 2}
42 | m_StyleSheetsResourcePath:
43 | m_leadingCharacters: {fileID: 4900000, guid: d82c1b31c7e74239bff1220585707d2b, type: 3}
44 | m_followingCharacters: {fileID: 4900000, guid: fade42e8bc714b018fac513c043d323b,
45 | type: 3}
46 | m_UseModernHangulLineBreakingRules: 0
47 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Resources/TMP Settings.asset.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3f5b5dff67a942289a9defa416b206f3
3 | timeCreated: 1436653997
4 | licenseType: Pro
5 | NativeFormatImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: e9f693669af91aa45ad615fc681ed29f
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader:
--------------------------------------------------------------------------------
1 | Shader "TextMeshPro/Bitmap Custom Atlas" {
2 |
3 | Properties {
4 | _MainTex ("Font Atlas", 2D) = "white" {}
5 | _FaceTex ("Font Texture", 2D) = "white" {}
6 | [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1)
7 |
8 | _VertexOffsetX ("Vertex OffsetX", float) = 0
9 | _VertexOffsetY ("Vertex OffsetY", float) = 0
10 | _MaskSoftnessX ("Mask SoftnessX", float) = 0
11 | _MaskSoftnessY ("Mask SoftnessY", float) = 0
12 |
13 | _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
14 | _Padding ("Padding", float) = 0
15 |
16 | _StencilComp("Stencil Comparison", Float) = 8
17 | _Stencil("Stencil ID", Float) = 0
18 | _StencilOp("Stencil Operation", Float) = 0
19 | _StencilWriteMask("Stencil Write Mask", Float) = 255
20 | _StencilReadMask("Stencil Read Mask", Float) = 255
21 |
22 | _CullMode("Cull Mode", Float) = 0
23 | _ColorMask("Color Mask", Float) = 15
24 | }
25 |
26 | SubShader{
27 |
28 | Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
29 |
30 | Stencil
31 | {
32 | Ref[_Stencil]
33 | Comp[_StencilComp]
34 | Pass[_StencilOp]
35 | ReadMask[_StencilReadMask]
36 | WriteMask[_StencilWriteMask]
37 | }
38 |
39 |
40 | Lighting Off
41 | Cull [_CullMode]
42 | ZTest [unity_GUIZTestMode]
43 | ZWrite Off
44 | Fog { Mode Off }
45 | Blend SrcAlpha OneMinusSrcAlpha
46 | ColorMask[_ColorMask]
47 |
48 | Pass {
49 | CGPROGRAM
50 | #pragma vertex vert
51 | #pragma fragment frag
52 |
53 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
54 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
55 |
56 |
57 | #include "UnityCG.cginc"
58 |
59 | struct appdata_t {
60 | float4 vertex : POSITION;
61 | fixed4 color : COLOR;
62 | float2 texcoord0 : TEXCOORD0;
63 | float2 texcoord1 : TEXCOORD1;
64 | };
65 |
66 | struct v2f {
67 | float4 vertex : SV_POSITION;
68 | fixed4 color : COLOR;
69 | float2 texcoord0 : TEXCOORD0;
70 | float2 texcoord1 : TEXCOORD1;
71 | float4 mask : TEXCOORD2;
72 | };
73 |
74 | uniform sampler2D _MainTex;
75 | uniform sampler2D _FaceTex;
76 | uniform float4 _FaceTex_ST;
77 | uniform fixed4 _FaceColor;
78 |
79 | uniform float _VertexOffsetX;
80 | uniform float _VertexOffsetY;
81 | uniform float4 _ClipRect;
82 | uniform float _MaskSoftnessX;
83 | uniform float _MaskSoftnessY;
84 |
85 | float2 UnpackUV(float uv)
86 | {
87 | float2 output;
88 | output.x = floor(uv / 4096);
89 | output.y = uv - 4096 * output.x;
90 |
91 | return output * 0.001953125;
92 | }
93 |
94 | v2f vert (appdata_t v)
95 | {
96 | float4 vert = v.vertex;
97 | vert.x += _VertexOffsetX;
98 | vert.y += _VertexOffsetY;
99 |
100 | vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
101 |
102 | float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert));
103 |
104 | fixed4 faceColor = v.color;
105 | faceColor *= _FaceColor;
106 |
107 | v2f OUT;
108 | OUT.vertex = vPosition;
109 | OUT.color = faceColor;
110 | OUT.texcoord0 = v.texcoord0;
111 | OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex);
112 | float2 pixelSize = vPosition.w;
113 | pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1]));
114 |
115 | // Clamp _ClipRect to 16bit.
116 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
117 | OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy));
118 |
119 | return OUT;
120 | }
121 |
122 | fixed4 frag (v2f IN) : SV_Target
123 | {
124 | fixed4 color = tex2D(_MainTex, IN.texcoord0) * tex2D(_FaceTex, IN.texcoord1) * IN.color;
125 |
126 | // Alternative implementation to UnityGet2DClipping with support for softness.
127 | #if UNITY_UI_CLIP_RECT
128 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
129 | color *= m.x * m.y;
130 | #endif
131 |
132 | #if UNITY_UI_ALPHACLIP
133 | clip(color.a - 0.001);
134 | #endif
135 |
136 | return color;
137 | }
138 | ENDCG
139 | }
140 | }
141 |
142 | CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
143 | }
144 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Custom-Atlas.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 48bb5f55d8670e349b6e614913f9d910
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader:
--------------------------------------------------------------------------------
1 | Shader "TextMeshPro/Mobile/Bitmap" {
2 |
3 | Properties {
4 | _MainTex ("Font Atlas", 2D) = "white" {}
5 | [HDR]_Color ("Text Color", Color) = (1,1,1,1)
6 | _DiffusePower ("Diffuse Power", Range(1.0,4.0)) = 1.0
7 |
8 | _VertexOffsetX("Vertex OffsetX", float) = 0
9 | _VertexOffsetY("Vertex OffsetY", float) = 0
10 | _MaskSoftnessX("Mask SoftnessX", float) = 0
11 | _MaskSoftnessY("Mask SoftnessY", float) = 0
12 |
13 | _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
14 |
15 | _StencilComp("Stencil Comparison", Float) = 8
16 | _Stencil("Stencil ID", Float) = 0
17 | _StencilOp("Stencil Operation", Float) = 0
18 | _StencilWriteMask("Stencil Write Mask", Float) = 255
19 | _StencilReadMask("Stencil Read Mask", Float) = 255
20 |
21 | _CullMode("Cull Mode", Float) = 0
22 | _ColorMask("Color Mask", Float) = 15
23 | }
24 |
25 | SubShader {
26 |
27 | Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
28 |
29 | Stencil
30 | {
31 | Ref[_Stencil]
32 | Comp[_StencilComp]
33 | Pass[_StencilOp]
34 | ReadMask[_StencilReadMask]
35 | WriteMask[_StencilWriteMask]
36 | }
37 |
38 |
39 | Lighting Off
40 | Cull [_CullMode]
41 | ZTest [unity_GUIZTestMode]
42 | ZWrite Off
43 | Fog { Mode Off }
44 | Blend SrcAlpha OneMinusSrcAlpha
45 | ColorMask[_ColorMask]
46 |
47 | Pass {
48 | CGPROGRAM
49 | #pragma vertex vert
50 | #pragma fragment frag
51 | #pragma fragmentoption ARB_precision_hint_fastest
52 |
53 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
54 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
55 |
56 |
57 | #include "UnityCG.cginc"
58 |
59 | struct appdata_t {
60 | float4 vertex : POSITION;
61 | fixed4 color : COLOR;
62 | float2 texcoord0 : TEXCOORD0;
63 | float2 texcoord1 : TEXCOORD1;
64 | };
65 |
66 | struct v2f {
67 | float4 vertex : POSITION;
68 | fixed4 color : COLOR;
69 | float2 texcoord0 : TEXCOORD0;
70 | float4 mask : TEXCOORD2;
71 | };
72 |
73 | sampler2D _MainTex;
74 | fixed4 _Color;
75 | float _DiffusePower;
76 |
77 | uniform float _VertexOffsetX;
78 | uniform float _VertexOffsetY;
79 | uniform float4 _ClipRect;
80 | uniform float _MaskSoftnessX;
81 | uniform float _MaskSoftnessY;
82 |
83 | v2f vert (appdata_t v)
84 | {
85 | v2f OUT;
86 | float4 vert = v.vertex;
87 | vert.x += _VertexOffsetX;
88 | vert.y += _VertexOffsetY;
89 |
90 | vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
91 |
92 | OUT.vertex = UnityPixelSnap(UnityObjectToClipPos(vert));
93 | OUT.color = v.color;
94 | OUT.color *= _Color;
95 | OUT.color.rgb *= _DiffusePower;
96 | OUT.texcoord0 = v.texcoord0;
97 |
98 | float2 pixelSize = OUT.vertex.w;
99 | //pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1]));
100 |
101 | // Clamp _ClipRect to 16bit.
102 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
103 | OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy));
104 |
105 | return OUT;
106 | }
107 |
108 | fixed4 frag (v2f IN) : COLOR
109 | {
110 | fixed4 color = fixed4(IN.color.rgb, IN.color.a * tex2D(_MainTex, IN.texcoord0).a);
111 |
112 | // Alternative implementation to UnityGet2DClipping with support for softness.
113 | #if UNITY_UI_CLIP_RECT
114 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
115 | color *= m.x * m.y;
116 | #endif
117 |
118 | #if UNITY_UI_ALPHACLIP
119 | clip(color.a - 0.001);
120 | #endif
121 |
122 | return color;
123 | }
124 | ENDCG
125 | }
126 | }
127 |
128 | SubShader {
129 | Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
130 | Lighting Off Cull Off ZTest Always ZWrite Off Fog { Mode Off }
131 | Blend SrcAlpha OneMinusSrcAlpha
132 | BindChannels {
133 | Bind "Color", color
134 | Bind "Vertex", vertex
135 | Bind "TexCoord", texcoord0
136 | }
137 | Pass {
138 | SetTexture [_MainTex] {
139 | constantColor [_Color] combine constant * primary, constant * texture
140 | }
141 | }
142 | }
143 |
144 | CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
145 | }
146 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap-Mobile.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 1e3b057af24249748ff873be7fafee47
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader:
--------------------------------------------------------------------------------
1 | Shader "TextMeshPro/Bitmap" {
2 |
3 | Properties {
4 | _MainTex ("Font Atlas", 2D) = "white" {}
5 | _FaceTex ("Font Texture", 2D) = "white" {}
6 | [HDR]_FaceColor ("Text Color", Color) = (1,1,1,1)
7 |
8 | _VertexOffsetX ("Vertex OffsetX", float) = 0
9 | _VertexOffsetY ("Vertex OffsetY", float) = 0
10 | _MaskSoftnessX ("Mask SoftnessX", float) = 0
11 | _MaskSoftnessY ("Mask SoftnessY", float) = 0
12 |
13 | _ClipRect("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
14 |
15 | _StencilComp("Stencil Comparison", Float) = 8
16 | _Stencil("Stencil ID", Float) = 0
17 | _StencilOp("Stencil Operation", Float) = 0
18 | _StencilWriteMask("Stencil Write Mask", Float) = 255
19 | _StencilReadMask("Stencil Read Mask", Float) = 255
20 |
21 | _CullMode("Cull Mode", Float) = 0
22 | _ColorMask("Color Mask", Float) = 15
23 | }
24 |
25 | SubShader{
26 |
27 | Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" }
28 |
29 | Stencil
30 | {
31 | Ref[_Stencil]
32 | Comp[_StencilComp]
33 | Pass[_StencilOp]
34 | ReadMask[_StencilReadMask]
35 | WriteMask[_StencilWriteMask]
36 | }
37 |
38 |
39 | Lighting Off
40 | Cull [_CullMode]
41 | ZTest [unity_GUIZTestMode]
42 | ZWrite Off
43 | Fog { Mode Off }
44 | Blend SrcAlpha OneMinusSrcAlpha
45 | ColorMask[_ColorMask]
46 |
47 | Pass {
48 | CGPROGRAM
49 | #pragma vertex vert
50 | #pragma fragment frag
51 |
52 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
53 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
54 |
55 |
56 | #include "UnityCG.cginc"
57 |
58 | struct appdata_t {
59 | float4 vertex : POSITION;
60 | fixed4 color : COLOR;
61 | float2 texcoord0 : TEXCOORD0;
62 | float2 texcoord1 : TEXCOORD1;
63 | };
64 |
65 | struct v2f {
66 | float4 vertex : SV_POSITION;
67 | fixed4 color : COLOR;
68 | float2 texcoord0 : TEXCOORD0;
69 | float2 texcoord1 : TEXCOORD1;
70 | float4 mask : TEXCOORD2;
71 | };
72 |
73 | uniform sampler2D _MainTex;
74 | uniform sampler2D _FaceTex;
75 | uniform float4 _FaceTex_ST;
76 | uniform fixed4 _FaceColor;
77 |
78 | uniform float _VertexOffsetX;
79 | uniform float _VertexOffsetY;
80 | uniform float4 _ClipRect;
81 | uniform float _MaskSoftnessX;
82 | uniform float _MaskSoftnessY;
83 |
84 | float2 UnpackUV(float uv)
85 | {
86 | float2 output;
87 | output.x = floor(uv / 4096);
88 | output.y = uv - 4096 * output.x;
89 |
90 | return output * 0.001953125;
91 | }
92 |
93 | v2f vert (appdata_t v)
94 | {
95 | float4 vert = v.vertex;
96 | vert.x += _VertexOffsetX;
97 | vert.y += _VertexOffsetY;
98 |
99 | vert.xy += (vert.w * 0.5) / _ScreenParams.xy;
100 |
101 | float4 vPosition = UnityPixelSnap(UnityObjectToClipPos(vert));
102 |
103 | fixed4 faceColor = v.color;
104 | faceColor *= _FaceColor;
105 |
106 | v2f OUT;
107 | OUT.vertex = vPosition;
108 | OUT.color = faceColor;
109 | OUT.texcoord0 = v.texcoord0;
110 | OUT.texcoord1 = TRANSFORM_TEX(UnpackUV(v.texcoord1), _FaceTex);
111 | float2 pixelSize = vPosition.w;
112 | pixelSize /= abs(float2(_ScreenParams.x * UNITY_MATRIX_P[0][0], _ScreenParams.y * UNITY_MATRIX_P[1][1]));
113 |
114 | // Clamp _ClipRect to 16bit.
115 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
116 | OUT.mask = float4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy));
117 |
118 | return OUT;
119 | }
120 |
121 | fixed4 frag (v2f IN) : SV_Target
122 | {
123 | fixed4 color = tex2D(_MainTex, IN.texcoord0);
124 | color = fixed4 (tex2D(_FaceTex, IN.texcoord1).rgb * IN.color.rgb, IN.color.a * color.a);
125 |
126 | // Alternative implementation to UnityGet2DClipping with support for softness.
127 | #if UNITY_UI_CLIP_RECT
128 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(IN.mask.xy)) * IN.mask.zw);
129 | color *= m.x * m.y;
130 | #endif
131 |
132 | #if UNITY_UI_ALPHACLIP
133 | clip(color.a - 0.001);
134 | #endif
135 |
136 | return color;
137 | }
138 | ENDCG
139 | }
140 | }
141 |
142 | CustomEditor "TMPro.EditorUtilities.TMP_BitmapShaderGUI"
143 | }
144 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Bitmap.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 128e987d567d4e2c824d754223b3f3b0
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF Overlay.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: dd89cf5b9246416f84610a006f916af7
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF SSD.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 14eb328de4b8eb245bb7cea29e4ac00b
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader:
--------------------------------------------------------------------------------
1 | // Simplified SDF shader:
2 | // - No Shading Option (bevel / bump / env map)
3 | // - No Glow Option
4 | // - Softness is applied on both side of the outline
5 |
6 | Shader "TextMeshPro/Mobile/Distance Field - Masking" {
7 |
8 | Properties {
9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1)
10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0
11 |
12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
15 |
16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5)
17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
21 |
22 | _WeightNormal ("Weight Normal", float) = 0
23 | _WeightBold ("Weight Bold", float) = .5
24 |
25 | _ShaderFlags ("Flags", float) = 0
26 | _ScaleRatioA ("Scale RatioA", float) = 1
27 | _ScaleRatioB ("Scale RatioB", float) = 1
28 | _ScaleRatioC ("Scale RatioC", float) = 1
29 |
30 | _MainTex ("Font Atlas", 2D) = "white" {}
31 | _TextureWidth ("Texture Width", float) = 512
32 | _TextureHeight ("Texture Height", float) = 512
33 | _GradientScale ("Gradient Scale", float) = 5
34 | _ScaleX ("Scale X", float) = 1
35 | _ScaleY ("Scale Y", float) = 1
36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
37 | _Sharpness ("Sharpness", Range(-1,1)) = 0
38 |
39 | _VertexOffsetX ("Vertex OffsetX", float) = 0
40 | _VertexOffsetY ("Vertex OffsetY", float) = 0
41 |
42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0
44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0
45 | _MaskTex ("Mask Texture", 2D) = "white" {}
46 | _MaskInverse ("Inverse", float) = 0
47 | _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1)
48 | _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01
49 | _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5
50 |
51 | _StencilComp ("Stencil Comparison", Float) = 8
52 | _Stencil ("Stencil ID", Float) = 0
53 | _StencilOp ("Stencil Operation", Float) = 0
54 | _StencilWriteMask ("Stencil Write Mask", Float) = 255
55 | _StencilReadMask ("Stencil Read Mask", Float) = 255
56 |
57 | _CullMode ("Cull Mode", Float) = 0
58 | _ColorMask ("Color Mask", Float) = 15
59 | }
60 |
61 | SubShader {
62 | Tags
63 | {
64 | "Queue"="Transparent"
65 | "IgnoreProjector"="True"
66 | "RenderType"="Transparent"
67 | }
68 |
69 |
70 | Stencil
71 | {
72 | Ref [_Stencil]
73 | Comp [_StencilComp]
74 | Pass [_StencilOp]
75 | ReadMask [_StencilReadMask]
76 | WriteMask [_StencilWriteMask]
77 | }
78 |
79 | Cull [_CullMode]
80 | ZWrite Off
81 | Lighting Off
82 | Fog { Mode Off }
83 | ZTest [unity_GUIZTestMode]
84 | Blend One OneMinusSrcAlpha
85 | ColorMask [_ColorMask]
86 |
87 | Pass {
88 | CGPROGRAM
89 | #pragma vertex VertShader
90 | #pragma fragment PixShader
91 | #pragma shader_feature __ OUTLINE_ON
92 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
93 |
94 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
95 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
96 |
97 |
98 | #include "UnityCG.cginc"
99 | #include "UnityUI.cginc"
100 | #include "TMPro_Properties.cginc"
101 |
102 | struct vertex_t {
103 | float4 vertex : POSITION;
104 | float3 normal : NORMAL;
105 | fixed4 color : COLOR;
106 | float2 texcoord0 : TEXCOORD0;
107 | float2 texcoord1 : TEXCOORD1;
108 | };
109 |
110 | struct pixel_t {
111 | float4 vertex : SV_POSITION;
112 | fixed4 faceColor : COLOR;
113 | fixed4 outlineColor : COLOR1;
114 | float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
115 | half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
116 | half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
117 | #if (UNDERLAY_ON | UNDERLAY_INNER)
118 | float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
119 | half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
120 | #endif
121 | };
122 |
123 | float _MaskWipeControl;
124 | float _MaskEdgeSoftness;
125 | fixed4 _MaskEdgeColor;
126 | bool _MaskInverse;
127 |
128 | pixel_t VertShader(vertex_t input)
129 | {
130 | float bold = step(input.texcoord1.y, 0);
131 |
132 | float4 vert = input.vertex;
133 | vert.x += _VertexOffsetX;
134 | vert.y += _VertexOffsetY;
135 | float4 vPosition = UnityObjectToClipPos(vert);
136 |
137 | float2 pixelSize = vPosition.w;
138 | pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
139 |
140 | float scale = rsqrt(dot(pixelSize, pixelSize));
141 | scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1);
142 | if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
143 |
144 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
145 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
146 |
147 | float layerScale = scale;
148 |
149 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
150 | float bias = (0.5 - weight) * scale - 0.5;
151 | float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
152 |
153 | float opacity = input.color.a;
154 | #if (UNDERLAY_ON | UNDERLAY_INNER)
155 | opacity = 1.0;
156 | #endif
157 |
158 | fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
159 | faceColor.rgb *= faceColor.a;
160 |
161 | fixed4 outlineColor = _OutlineColor;
162 | outlineColor.a *= opacity;
163 | outlineColor.rgb *= outlineColor.a;
164 | outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
165 |
166 | #if (UNDERLAY_ON | UNDERLAY_INNER)
167 |
168 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
169 | float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
170 |
171 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
172 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
173 | float2 layerOffset = float2(x, y);
174 | #endif
175 |
176 | // Generate UV for the Masking Texture
177 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
178 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
179 |
180 | // Structure for pixel shader
181 | pixel_t output = {
182 | vPosition,
183 | faceColor,
184 | outlineColor,
185 | float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y),
186 | half4(scale, bias - outline, bias + outline, bias),
187 | half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy)),
188 | #if (UNDERLAY_ON | UNDERLAY_INNER)
189 | float4(input.texcoord0 + layerOffset, input.color.a, 0),
190 | half2(layerScale, layerBias),
191 | #endif
192 | };
193 |
194 | return output;
195 | }
196 |
197 |
198 | // PIXEL SHADER
199 | fixed4 PixShader(pixel_t input) : SV_Target
200 | {
201 | half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
202 | half4 c = input.faceColor * saturate(d - input.param.w);
203 |
204 | #ifdef OUTLINE_ON
205 | c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
206 | c *= saturate(d - input.param.y);
207 | #endif
208 |
209 | #if UNDERLAY_ON
210 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
211 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
212 | #endif
213 |
214 | #if UNDERLAY_INNER
215 | half sd = saturate(d - input.param.z);
216 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
217 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
218 | #endif
219 |
220 | // Alternative implementation to UnityGet2DClipping with support for softness.
221 | //#if UNITY_UI_CLIP_RECT
222 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
223 | c *= m.x * m.y;
224 | //#endif
225 |
226 | float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a);
227 | float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl;
228 | a = saturate(t / _MaskEdgeSoftness);
229 | c.rgb = lerp(_MaskEdgeColor.rgb*c.a, c.rgb, a);
230 | c *= a;
231 |
232 | #if (UNDERLAY_ON | UNDERLAY_INNER)
233 | c *= input.texcoord1.z;
234 | #endif
235 |
236 | #if UNITY_UI_ALPHACLIP
237 | clip(c.a - 0.001);
238 | #endif
239 |
240 | return c;
241 | }
242 | ENDCG
243 | }
244 | }
245 |
246 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
247 | }
248 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Masking.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: bc1ede39bf3643ee8e493720e4259791
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader:
--------------------------------------------------------------------------------
1 | // Simplified SDF shader:
2 | // - No Shading Option (bevel / bump / env map)
3 | // - No Glow Option
4 | // - Softness is applied on both side of the outline
5 |
6 | Shader "TextMeshPro/Mobile/Distance Field Overlay" {
7 |
8 | Properties {
9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1)
10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0
11 |
12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
15 |
16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5)
17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
21 |
22 | _WeightNormal ("Weight Normal", float) = 0
23 | _WeightBold ("Weight Bold", float) = .5
24 |
25 | _ShaderFlags ("Flags", float) = 0
26 | _ScaleRatioA ("Scale RatioA", float) = 1
27 | _ScaleRatioB ("Scale RatioB", float) = 1
28 | _ScaleRatioC ("Scale RatioC", float) = 1
29 |
30 | _MainTex ("Font Atlas", 2D) = "white" {}
31 | _TextureWidth ("Texture Width", float) = 512
32 | _TextureHeight ("Texture Height", float) = 512
33 | _GradientScale ("Gradient Scale", float) = 5
34 | _ScaleX ("Scale X", float) = 1
35 | _ScaleY ("Scale Y", float) = 1
36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
37 | _Sharpness ("Sharpness", Range(-1,1)) = 0
38 |
39 | _VertexOffsetX ("Vertex OffsetX", float) = 0
40 | _VertexOffsetY ("Vertex OffsetY", float) = 0
41 |
42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0
44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0
45 |
46 | _StencilComp ("Stencil Comparison", Float) = 8
47 | _Stencil ("Stencil ID", Float) = 0
48 | _StencilOp ("Stencil Operation", Float) = 0
49 | _StencilWriteMask ("Stencil Write Mask", Float) = 255
50 | _StencilReadMask ("Stencil Read Mask", Float) = 255
51 |
52 | _CullMode ("Cull Mode", Float) = 0
53 | _ColorMask ("Color Mask", Float) = 15
54 | }
55 |
56 | SubShader {
57 | Tags
58 | {
59 | "Queue"="Overlay"
60 | "IgnoreProjector"="True"
61 | "RenderType"="Transparent"
62 | }
63 |
64 |
65 | Stencil
66 | {
67 | Ref [_Stencil]
68 | Comp [_StencilComp]
69 | Pass [_StencilOp]
70 | ReadMask [_StencilReadMask]
71 | WriteMask [_StencilWriteMask]
72 | }
73 |
74 | Cull [_CullMode]
75 | ZWrite Off
76 | Lighting Off
77 | Fog { Mode Off }
78 | ZTest Always
79 | Blend One OneMinusSrcAlpha
80 | ColorMask [_ColorMask]
81 |
82 | Pass {
83 | CGPROGRAM
84 | #pragma vertex VertShader
85 | #pragma fragment PixShader
86 | #pragma shader_feature __ OUTLINE_ON
87 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
88 |
89 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
90 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
91 |
92 | #include "UnityCG.cginc"
93 | #include "UnityUI.cginc"
94 | #include "TMPro_Properties.cginc"
95 |
96 | struct vertex_t {
97 | UNITY_VERTEX_INPUT_INSTANCE_ID
98 | float4 vertex : POSITION;
99 | float3 normal : NORMAL;
100 | fixed4 color : COLOR;
101 | float2 texcoord0 : TEXCOORD0;
102 | float2 texcoord1 : TEXCOORD1;
103 | };
104 |
105 | struct pixel_t {
106 | UNITY_VERTEX_INPUT_INSTANCE_ID
107 | UNITY_VERTEX_OUTPUT_STEREO
108 | float4 vertex : SV_POSITION;
109 | fixed4 faceColor : COLOR;
110 | fixed4 outlineColor : COLOR1;
111 | float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
112 | half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
113 | half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
114 | #if (UNDERLAY_ON | UNDERLAY_INNER)
115 | float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
116 | half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
117 | #endif
118 | };
119 |
120 |
121 | pixel_t VertShader(vertex_t input)
122 | {
123 | pixel_t output;
124 |
125 | UNITY_INITIALIZE_OUTPUT(pixel_t, output);
126 | UNITY_SETUP_INSTANCE_ID(input);
127 | UNITY_TRANSFER_INSTANCE_ID(input, output);
128 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
129 |
130 | float bold = step(input.texcoord1.y, 0);
131 |
132 | float4 vert = input.vertex;
133 | vert.x += _VertexOffsetX;
134 | vert.y += _VertexOffsetY;
135 | float4 vPosition = UnityObjectToClipPos(vert);
136 |
137 | float2 pixelSize = vPosition.w;
138 | pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
139 |
140 | float scale = rsqrt(dot(pixelSize, pixelSize));
141 | scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1);
142 | if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
143 |
144 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
145 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
146 |
147 | float layerScale = scale;
148 |
149 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
150 | float bias = (0.5 - weight) * scale - 0.5;
151 | float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
152 |
153 | float opacity = input.color.a;
154 | #if (UNDERLAY_ON | UNDERLAY_INNER)
155 | opacity = 1.0;
156 | #endif
157 |
158 | fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
159 | faceColor.rgb *= faceColor.a;
160 |
161 | fixed4 outlineColor = _OutlineColor;
162 | outlineColor.a *= opacity;
163 | outlineColor.rgb *= outlineColor.a;
164 | outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
165 |
166 | #if (UNDERLAY_ON | UNDERLAY_INNER)
167 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
168 | float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
169 |
170 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
171 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
172 | float2 layerOffset = float2(x, y);
173 | #endif
174 |
175 | // Generate UV for the Masking Texture
176 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
177 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
178 |
179 | // Populate structure for pixel shader
180 | output.vertex = vPosition;
181 | output.faceColor = faceColor;
182 | output.outlineColor = outlineColor;
183 | output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
184 | output.param = half4(scale, bias - outline, bias + outline, bias);
185 | output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy));
186 | #if (UNDERLAY_ON || UNDERLAY_INNER)
187 | output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
188 | output.underlayParam = half2(layerScale, layerBias);
189 | #endif
190 |
191 | return output;
192 | }
193 |
194 |
195 | // PIXEL SHADER
196 | fixed4 PixShader(pixel_t input) : SV_Target
197 | {
198 | UNITY_SETUP_INSTANCE_ID(input);
199 |
200 | half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
201 | half4 c = input.faceColor * saturate(d - input.param.w);
202 |
203 | #ifdef OUTLINE_ON
204 | c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
205 | c *= saturate(d - input.param.y);
206 | #endif
207 |
208 | #if UNDERLAY_ON
209 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
210 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
211 | #endif
212 |
213 | #if UNDERLAY_INNER
214 | half sd = saturate(d - input.param.z);
215 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
216 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
217 | #endif
218 |
219 | // Alternative implementation to UnityGet2DClipping with support for softness.
220 | #if UNITY_UI_CLIP_RECT
221 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
222 | c *= m.x * m.y;
223 | #endif
224 |
225 | #if (UNDERLAY_ON | UNDERLAY_INNER)
226 | c *= input.texcoord1.z;
227 | #endif
228 |
229 | #if UNITY_UI_ALPHACLIP
230 | clip(c.a - 0.001);
231 | #endif
232 |
233 | return c;
234 | }
235 | ENDCG
236 | }
237 | }
238 |
239 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
240 | }
241 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile Overlay.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: a02a7d8c237544f1962732b55a9aebf1
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader:
--------------------------------------------------------------------------------
1 | // Simplified SDF shader:
2 | // - No Shading Option (bevel / bump / env map)
3 | // - No Glow Option
4 | // - Softness is applied on both side of the outline
5 |
6 | Shader "TextMeshPro/Mobile/Distance Field SSD" {
7 |
8 | Properties {
9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1)
10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0
11 |
12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
15 |
16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5)
17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
21 |
22 | _WeightNormal ("Weight Normal", float) = 0
23 | _WeightBold ("Weight Bold", float) = .5
24 |
25 | _ShaderFlags ("Flags", float) = 0
26 | _ScaleRatioA ("Scale RatioA", float) = 1
27 | _ScaleRatioB ("Scale RatioB", float) = 1
28 | _ScaleRatioC ("Scale RatioC", float) = 1
29 |
30 | _MainTex ("Font Atlas", 2D) = "white" {}
31 | _TextureWidth ("Texture Width", float) = 512
32 | _TextureHeight ("Texture Height", float) = 512
33 | _GradientScale ("Gradient Scale", float) = 5
34 | _ScaleX ("Scale X", float) = 1
35 | _ScaleY ("Scale Y", float) = 1
36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
37 | _Sharpness ("Sharpness", Range(-1,1)) = 0
38 |
39 | _VertexOffsetX ("Vertex OffsetX", float) = 0
40 | _VertexOffsetY ("Vertex OffsetY", float) = 0
41 |
42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0
44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0
45 | _MaskTex ("Mask Texture", 2D) = "white" {}
46 | _MaskInverse ("Inverse", float) = 0
47 | _MaskEdgeColor ("Edge Color", Color) = (1,1,1,1)
48 | _MaskEdgeSoftness ("Edge Softness", Range(0, 1)) = 0.01
49 | _MaskWipeControl ("Wipe Position", Range(0, 1)) = 0.5
50 |
51 | _StencilComp ("Stencil Comparison", Float) = 8
52 | _Stencil ("Stencil ID", Float) = 0
53 | _StencilOp ("Stencil Operation", Float) = 0
54 | _StencilWriteMask ("Stencil Write Mask", Float) = 255
55 | _StencilReadMask ("Stencil Read Mask", Float) = 255
56 |
57 | _CullMode ("Cull Mode", Float) = 0
58 | _ColorMask ("Color Mask", Float) = 15
59 | }
60 |
61 | SubShader {
62 | Tags {
63 | "Queue"="Transparent"
64 | "IgnoreProjector"="True"
65 | "RenderType"="Transparent"
66 | }
67 |
68 | Stencil
69 | {
70 | Ref [_Stencil]
71 | Comp [_StencilComp]
72 | Pass [_StencilOp]
73 | ReadMask [_StencilReadMask]
74 | WriteMask [_StencilWriteMask]
75 | }
76 |
77 | Cull [_CullMode]
78 | ZWrite Off
79 | Lighting Off
80 | Fog { Mode Off }
81 | ZTest [unity_GUIZTestMode]
82 | Blend One OneMinusSrcAlpha
83 | ColorMask [_ColorMask]
84 |
85 | Pass {
86 | CGPROGRAM
87 | #pragma vertex VertShader
88 | #pragma fragment PixShader
89 | #pragma shader_feature __ OUTLINE_ON
90 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
91 |
92 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
93 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
94 |
95 | #include "UnityCG.cginc"
96 | #include "UnityUI.cginc"
97 | #include "TMPro_Properties.cginc"
98 |
99 | #include "TMPro_Mobile.cginc"
100 |
101 | ENDCG
102 | }
103 | }
104 |
105 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
106 | }
107 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile SSD.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c8d12adcee749c344b8117cf7c7eb912
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader:
--------------------------------------------------------------------------------
1 | // Simplified SDF shader:
2 | // - No Shading Option (bevel / bump / env map)
3 | // - No Glow Option
4 | // - Softness is applied on both side of the outline
5 |
6 | Shader "TextMeshPro/Mobile/Distance Field" {
7 |
8 | Properties {
9 | [HDR]_FaceColor ("Face Color", Color) = (1,1,1,1)
10 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0
11 |
12 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
13 | _OutlineWidth ("Outline Thickness", Range(0,1)) = 0
14 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
15 |
16 | [HDR]_UnderlayColor ("Border Color", Color) = (0,0,0,.5)
17 | _UnderlayOffsetX ("Border OffsetX", Range(-1,1)) = 0
18 | _UnderlayOffsetY ("Border OffsetY", Range(-1,1)) = 0
19 | _UnderlayDilate ("Border Dilate", Range(-1,1)) = 0
20 | _UnderlaySoftness ("Border Softness", Range(0,1)) = 0
21 |
22 | _WeightNormal ("Weight Normal", float) = 0
23 | _WeightBold ("Weight Bold", float) = .5
24 |
25 | _ShaderFlags ("Flags", float) = 0
26 | _ScaleRatioA ("Scale RatioA", float) = 1
27 | _ScaleRatioB ("Scale RatioB", float) = 1
28 | _ScaleRatioC ("Scale RatioC", float) = 1
29 |
30 | _MainTex ("Font Atlas", 2D) = "white" {}
31 | _TextureWidth ("Texture Width", float) = 512
32 | _TextureHeight ("Texture Height", float) = 512
33 | _GradientScale ("Gradient Scale", float) = 5
34 | _ScaleX ("Scale X", float) = 1
35 | _ScaleY ("Scale Y", float) = 1
36 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
37 | _Sharpness ("Sharpness", Range(-1,1)) = 0
38 |
39 | _VertexOffsetX ("Vertex OffsetX", float) = 0
40 | _VertexOffsetY ("Vertex OffsetY", float) = 0
41 |
42 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
43 | _MaskSoftnessX ("Mask SoftnessX", float) = 0
44 | _MaskSoftnessY ("Mask SoftnessY", float) = 0
45 |
46 | _StencilComp ("Stencil Comparison", Float) = 8
47 | _Stencil ("Stencil ID", Float) = 0
48 | _StencilOp ("Stencil Operation", Float) = 0
49 | _StencilWriteMask ("Stencil Write Mask", Float) = 255
50 | _StencilReadMask ("Stencil Read Mask", Float) = 255
51 |
52 | _CullMode ("Cull Mode", Float) = 0
53 | _ColorMask ("Color Mask", Float) = 15
54 | }
55 |
56 | SubShader {
57 | Tags
58 | {
59 | "Queue"="Transparent"
60 | "IgnoreProjector"="True"
61 | "RenderType"="Transparent"
62 | }
63 |
64 |
65 | Stencil
66 | {
67 | Ref [_Stencil]
68 | Comp [_StencilComp]
69 | Pass [_StencilOp]
70 | ReadMask [_StencilReadMask]
71 | WriteMask [_StencilWriteMask]
72 | }
73 |
74 | Cull [_CullMode]
75 | ZWrite Off
76 | Lighting Off
77 | Fog { Mode Off }
78 | ZTest [unity_GUIZTestMode]
79 | Blend One OneMinusSrcAlpha
80 | ColorMask [_ColorMask]
81 |
82 | Pass {
83 | CGPROGRAM
84 | #pragma vertex VertShader
85 | #pragma fragment PixShader
86 | #pragma shader_feature __ OUTLINE_ON
87 | #pragma shader_feature __ UNDERLAY_ON UNDERLAY_INNER
88 |
89 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
90 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
91 |
92 | #include "UnityCG.cginc"
93 | #include "UnityUI.cginc"
94 | #include "TMPro_Properties.cginc"
95 |
96 | struct vertex_t {
97 | UNITY_VERTEX_INPUT_INSTANCE_ID
98 | float4 vertex : POSITION;
99 | float3 normal : NORMAL;
100 | fixed4 color : COLOR;
101 | float2 texcoord0 : TEXCOORD0;
102 | float2 texcoord1 : TEXCOORD1;
103 | };
104 |
105 | struct pixel_t {
106 | UNITY_VERTEX_INPUT_INSTANCE_ID
107 | UNITY_VERTEX_OUTPUT_STEREO
108 | float4 vertex : SV_POSITION;
109 | fixed4 faceColor : COLOR;
110 | fixed4 outlineColor : COLOR1;
111 | float4 texcoord0 : TEXCOORD0; // Texture UV, Mask UV
112 | half4 param : TEXCOORD1; // Scale(x), BiasIn(y), BiasOut(z), Bias(w)
113 | half4 mask : TEXCOORD2; // Position in clip space(xy), Softness(zw)
114 | #if (UNDERLAY_ON | UNDERLAY_INNER)
115 | float4 texcoord1 : TEXCOORD3; // Texture UV, alpha, reserved
116 | half2 underlayParam : TEXCOORD4; // Scale(x), Bias(y)
117 | #endif
118 | };
119 |
120 |
121 | pixel_t VertShader(vertex_t input)
122 | {
123 | pixel_t output;
124 |
125 | UNITY_INITIALIZE_OUTPUT(pixel_t, output);
126 | UNITY_SETUP_INSTANCE_ID(input);
127 | UNITY_TRANSFER_INSTANCE_ID(input, output);
128 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
129 |
130 | float bold = step(input.texcoord1.y, 0);
131 |
132 | float4 vert = input.vertex;
133 | vert.x += _VertexOffsetX;
134 | vert.y += _VertexOffsetY;
135 | float4 vPosition = UnityObjectToClipPos(vert);
136 |
137 | float2 pixelSize = vPosition.w;
138 | pixelSize /= float2(_ScaleX, _ScaleY) * abs(mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy));
139 |
140 | float scale = rsqrt(dot(pixelSize, pixelSize));
141 | scale *= abs(input.texcoord1.y) * _GradientScale * (_Sharpness + 1);
142 | if(UNITY_MATRIX_P[3][3] == 0) scale = lerp(abs(scale) * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(input.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
143 |
144 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
145 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
146 |
147 | float layerScale = scale;
148 |
149 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
150 | float bias = (0.5 - weight) * scale - 0.5;
151 | float outline = _OutlineWidth * _ScaleRatioA * 0.5 * scale;
152 |
153 | float opacity = input.color.a;
154 | #if (UNDERLAY_ON | UNDERLAY_INNER)
155 | opacity = 1.0;
156 | #endif
157 |
158 | fixed4 faceColor = fixed4(input.color.rgb, opacity) * _FaceColor;
159 | faceColor.rgb *= faceColor.a;
160 |
161 | fixed4 outlineColor = _OutlineColor;
162 | outlineColor.a *= opacity;
163 | outlineColor.rgb *= outlineColor.a;
164 | outlineColor = lerp(faceColor, outlineColor, sqrt(min(1.0, (outline * 2))));
165 |
166 | #if (UNDERLAY_ON | UNDERLAY_INNER)
167 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
168 | float layerBias = (.5 - weight) * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
169 |
170 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
171 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
172 | float2 layerOffset = float2(x, y);
173 | #endif
174 |
175 | // Generate UV for the Masking Texture
176 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
177 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
178 |
179 | // Populate structure for pixel shader
180 | output.vertex = vPosition;
181 | output.faceColor = faceColor;
182 | output.outlineColor = outlineColor;
183 | output.texcoord0 = float4(input.texcoord0.x, input.texcoord0.y, maskUV.x, maskUV.y);
184 | output.param = half4(scale, bias - outline, bias + outline, bias);
185 | output.mask = half4(vert.xy * 2 - clampedRect.xy - clampedRect.zw, 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + pixelSize.xy));
186 | #if (UNDERLAY_ON || UNDERLAY_INNER)
187 | output.texcoord1 = float4(input.texcoord0 + layerOffset, input.color.a, 0);
188 | output.underlayParam = half2(layerScale, layerBias);
189 | #endif
190 |
191 | return output;
192 | }
193 |
194 |
195 | // PIXEL SHADER
196 | fixed4 PixShader(pixel_t input) : SV_Target
197 | {
198 | UNITY_SETUP_INSTANCE_ID(input);
199 |
200 | half d = tex2D(_MainTex, input.texcoord0.xy).a * input.param.x;
201 | half4 c = input.faceColor * saturate(d - input.param.w);
202 |
203 | #ifdef OUTLINE_ON
204 | c = lerp(input.outlineColor, input.faceColor, saturate(d - input.param.z));
205 | c *= saturate(d - input.param.y);
206 | #endif
207 |
208 | #if UNDERLAY_ON
209 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
210 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - input.underlayParam.y) * (1 - c.a);
211 | #endif
212 |
213 | #if UNDERLAY_INNER
214 | half sd = saturate(d - input.param.z);
215 | d = tex2D(_MainTex, input.texcoord1.xy).a * input.underlayParam.x;
216 | c += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - input.underlayParam.y)) * sd * (1 - c.a);
217 | #endif
218 |
219 | // Alternative implementation to UnityGet2DClipping with support for softness.
220 | #if UNITY_UI_CLIP_RECT
221 | half2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * input.mask.zw);
222 | c *= m.x * m.y;
223 | #endif
224 |
225 | #if (UNDERLAY_ON | UNDERLAY_INNER)
226 | c *= input.texcoord1.z;
227 | #endif
228 |
229 | #if UNITY_UI_ALPHACLIP
230 | clip(c.a - 0.001);
231 | #endif
232 |
233 | return c;
234 | }
235 | ENDCG
236 | }
237 | }
238 |
239 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
240 | }
241 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Mobile.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: fe393ace9b354375a9cb14cdbbc28be4
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader:
--------------------------------------------------------------------------------
1 | // Simplified version of the SDF Surface shader :
2 | // - No support for Bevel, Bump or envmap
3 | // - Diffuse only lighting
4 | // - Fully supports only 1 directional light. Other lights can affect it, but it will be per-vertex/SH.
5 |
6 | Shader "TextMeshPro/Mobile/Distance Field (Surface)" {
7 |
8 | Properties {
9 | _FaceTex ("Fill Texture", 2D) = "white" {}
10 | [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1)
11 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0
12 |
13 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
14 | _OutlineTex ("Outline Texture", 2D) = "white" {}
15 | _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
16 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
17 |
18 | [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5)
19 | _GlowOffset ("Offset", Range(-1,1)) = 0
20 | _GlowInner ("Inner", Range(0,1)) = 0.05
21 | _GlowOuter ("Outer", Range(0,1)) = 0.05
22 | _GlowPower ("Falloff", Range(1, 0)) = 0.75
23 |
24 | _WeightNormal ("Weight Normal", float) = 0
25 | _WeightBold ("Weight Bold", float) = 0.5
26 |
27 | // Should not be directly exposed to the user
28 | _ShaderFlags ("Flags", float) = 0
29 | _ScaleRatioA ("Scale RatioA", float) = 1
30 | _ScaleRatioB ("Scale RatioB", float) = 1
31 | _ScaleRatioC ("Scale RatioC", float) = 1
32 |
33 | _MainTex ("Font Atlas", 2D) = "white" {}
34 | _TextureWidth ("Texture Width", float) = 512
35 | _TextureHeight ("Texture Height", float) = 512
36 | _GradientScale ("Gradient Scale", float) = 5.0
37 | _ScaleX ("Scale X", float) = 1.0
38 | _ScaleY ("Scale Y", float) = 1.0
39 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
40 | _Sharpness ("Sharpness", Range(-1,1)) = 0
41 |
42 | _VertexOffsetX ("Vertex OffsetX", float) = 0
43 | _VertexOffsetY ("Vertex OffsetY", float) = 0
44 |
45 | _CullMode ("Cull Mode", Float) = 0
46 | //_MaskCoord ("Mask Coords", vector) = (0,0,0,0)
47 | //_MaskSoftness ("Mask Softness", float) = 0
48 | }
49 |
50 | SubShader {
51 |
52 | Tags {
53 | "Queue"="Transparent"
54 | "IgnoreProjector"="True"
55 | "RenderType"="Transparent"
56 | }
57 |
58 | LOD 300
59 | Cull [_CullMode]
60 |
61 | CGPROGRAM
62 | #pragma surface PixShader Lambert alpha:blend vertex:VertShader noforwardadd nolightmap nodirlightmap
63 | #pragma target 3.0
64 | #pragma shader_feature __ GLOW_ON
65 |
66 | #include "TMPro_Properties.cginc"
67 | #include "TMPro.cginc"
68 |
69 | half _FaceShininess;
70 | half _OutlineShininess;
71 |
72 | struct Input
73 | {
74 | fixed4 color : COLOR;
75 | float2 uv_MainTex;
76 | float2 uv2_FaceTex;
77 | float2 uv2_OutlineTex;
78 | float2 param; // Weight, Scale
79 | float3 viewDirEnv;
80 | };
81 |
82 | #include "TMPro_Surface.cginc"
83 |
84 | ENDCG
85 |
86 | // Pass to render object as a shadow caster
87 | Pass
88 | {
89 | Name "Caster"
90 | Tags { "LightMode" = "ShadowCaster" }
91 | Offset 1, 1
92 |
93 | Fog {Mode Off}
94 | ZWrite On ZTest LEqual Cull Off
95 |
96 | CGPROGRAM
97 | #pragma vertex vert
98 | #pragma fragment frag
99 | #pragma multi_compile_shadowcaster
100 | #include "UnityCG.cginc"
101 |
102 | struct v2f {
103 | V2F_SHADOW_CASTER;
104 | float2 uv : TEXCOORD1;
105 | float2 uv2 : TEXCOORD3;
106 | float alphaClip : TEXCOORD2;
107 | };
108 |
109 | uniform float4 _MainTex_ST;
110 | uniform float4 _OutlineTex_ST;
111 | float _OutlineWidth;
112 | float _FaceDilate;
113 | float _ScaleRatioA;
114 |
115 | v2f vert( appdata_base v )
116 | {
117 | v2f o;
118 | TRANSFER_SHADOW_CASTER(o)
119 | o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
120 | o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
121 | o.alphaClip = o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2;
122 | return o;
123 | }
124 |
125 | uniform sampler2D _MainTex;
126 |
127 | float4 frag(v2f i) : COLOR
128 | {
129 | fixed4 texcol = tex2D(_MainTex, i.uv).a;
130 | clip(texcol.a - i.alphaClip);
131 | SHADOW_CASTER_FRAGMENT(i)
132 | }
133 | ENDCG
134 | }
135 | }
136 |
137 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
138 | }
139 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface-Mobile.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 85187c2149c549c5b33f0cdb02836b17
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader:
--------------------------------------------------------------------------------
1 | Shader "TextMeshPro/Distance Field (Surface)" {
2 |
3 | Properties {
4 | _FaceTex ("Fill Texture", 2D) = "white" {}
5 | _FaceUVSpeedX ("Face UV Speed X", Range(-5, 5)) = 0.0
6 | _FaceUVSpeedY ("Face UV Speed Y", Range(-5, 5)) = 0.0
7 | [HDR]_FaceColor ("Fill Color", Color) = (1,1,1,1)
8 | _FaceDilate ("Face Dilate", Range(-1,1)) = 0
9 |
10 | [HDR]_OutlineColor ("Outline Color", Color) = (0,0,0,1)
11 | _OutlineTex ("Outline Texture", 2D) = "white" {}
12 | _OutlineUVSpeedX ("Outline UV Speed X", Range(-5, 5)) = 0.0
13 | _OutlineUVSpeedY ("Outline UV Speed Y", Range(-5, 5)) = 0.0
14 | _OutlineWidth ("Outline Thickness", Range(0, 1)) = 0
15 | _OutlineSoftness ("Outline Softness", Range(0,1)) = 0
16 |
17 | _Bevel ("Bevel", Range(0,1)) = 0.5
18 | _BevelOffset ("Bevel Offset", Range(-0.5,0.5)) = 0
19 | _BevelWidth ("Bevel Width", Range(-.5,0.5)) = 0
20 | _BevelClamp ("Bevel Clamp", Range(0,1)) = 0
21 | _BevelRoundness ("Bevel Roundness", Range(0,1)) = 0
22 |
23 | _BumpMap ("Normalmap", 2D) = "bump" {}
24 | _BumpOutline ("Bump Outline", Range(0,1)) = 0.5
25 | _BumpFace ("Bump Face", Range(0,1)) = 0.5
26 |
27 | _ReflectFaceColor ("Face Color", Color) = (0,0,0,1)
28 | _ReflectOutlineColor ("Outline Color", Color) = (0,0,0,1)
29 | _Cube ("Reflection Cubemap", Cube) = "black" { /* TexGen CubeReflect */ }
30 | _EnvMatrixRotation ("Texture Rotation", vector) = (0, 0, 0, 0)
31 | [HDR]_SpecColor ("Specular Color", Color) = (0,0,0,1)
32 |
33 | _FaceShininess ("Face Shininess", Range(0,1)) = 0
34 | _OutlineShininess ("Outline Shininess", Range(0,1)) = 0
35 |
36 | [HDR]_GlowColor ("Color", Color) = (0, 1, 0, 0.5)
37 | _GlowOffset ("Offset", Range(-1,1)) = 0
38 | _GlowInner ("Inner", Range(0,1)) = 0.05
39 | _GlowOuter ("Outer", Range(0,1)) = 0.05
40 | _GlowPower ("Falloff", Range(1, 0)) = 0.75
41 |
42 | _WeightNormal ("Weight Normal", float) = 0
43 | _WeightBold ("Weight Bold", float) = 0.5
44 |
45 | // Should not be directly exposed to the user
46 | _ShaderFlags ("Flags", float) = 0
47 | _ScaleRatioA ("Scale RatioA", float) = 1
48 | _ScaleRatioB ("Scale RatioB", float) = 1
49 | _ScaleRatioC ("Scale RatioC", float) = 1
50 |
51 | _MainTex ("Font Atlas", 2D) = "white" {}
52 | _TextureWidth ("Texture Width", float) = 512
53 | _TextureHeight ("Texture Height", float) = 512
54 | _GradientScale ("Gradient Scale", float) = 5.0
55 | _ScaleX ("Scale X", float) = 1.0
56 | _ScaleY ("Scale Y", float) = 1.0
57 | _PerspectiveFilter ("Perspective Correction", Range(0, 1)) = 0.875
58 | _Sharpness ("Sharpness", Range(-1,1)) = 0
59 |
60 | _VertexOffsetX ("Vertex OffsetX", float) = 0
61 | _VertexOffsetY ("Vertex OffsetY", float) = 0
62 |
63 | _CullMode ("Cull Mode", Float) = 0
64 | //_MaskCoord ("Mask Coords", vector) = (0,0,0,0)
65 | //_MaskSoftness ("Mask Softness", float) = 0
66 | }
67 |
68 | SubShader {
69 |
70 | Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" }
71 |
72 | LOD 300
73 | Cull [_CullMode]
74 |
75 | CGPROGRAM
76 | #pragma surface PixShader BlinnPhong alpha:blend vertex:VertShader nolightmap nodirlightmap
77 | #pragma target 3.0
78 | #pragma shader_feature __ GLOW_ON
79 | #pragma glsl
80 |
81 | #include "TMPro_Properties.cginc"
82 | #include "TMPro.cginc"
83 |
84 | half _FaceShininess;
85 | half _OutlineShininess;
86 |
87 | struct Input
88 | {
89 | fixed4 color : COLOR;
90 | float2 uv_MainTex;
91 | float2 uv2_FaceTex;
92 | float2 uv2_OutlineTex;
93 | float2 param; // Weight, Scale
94 | float3 viewDirEnv;
95 | };
96 |
97 |
98 | #define BEVEL_ON 1
99 | #include "TMPro_Surface.cginc"
100 |
101 | ENDCG
102 |
103 | // Pass to render object as a shadow caster
104 | Pass
105 | {
106 | Name "Caster"
107 | Tags { "LightMode" = "ShadowCaster" }
108 | Offset 1, 1
109 |
110 | Fog {Mode Off}
111 | ZWrite On
112 | ZTest LEqual
113 | Cull Off
114 |
115 | CGPROGRAM
116 | #pragma vertex vert
117 | #pragma fragment frag
118 | #pragma multi_compile_shadowcaster
119 | #include "UnityCG.cginc"
120 |
121 | struct v2f {
122 | V2F_SHADOW_CASTER;
123 | float2 uv : TEXCOORD1;
124 | float2 uv2 : TEXCOORD3;
125 | float alphaClip : TEXCOORD2;
126 | };
127 |
128 | uniform float4 _MainTex_ST;
129 | uniform float4 _OutlineTex_ST;
130 | float _OutlineWidth;
131 | float _FaceDilate;
132 | float _ScaleRatioA;
133 |
134 | v2f vert( appdata_base v )
135 | {
136 | v2f o;
137 | TRANSFER_SHADOW_CASTER(o)
138 | o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
139 | o.uv2 = TRANSFORM_TEX(v.texcoord, _OutlineTex);
140 | o.alphaClip = (1.0 - _OutlineWidth * _ScaleRatioA - _FaceDilate * _ScaleRatioA) / 2;
141 | return o;
142 | }
143 |
144 | uniform sampler2D _MainTex;
145 |
146 | float4 frag(v2f i) : COLOR
147 | {
148 | fixed4 texcol = tex2D(_MainTex, i.uv).a;
149 | clip(texcol.a - i.alphaClip);
150 | SHADOW_CASTER_FRAGMENT(i)
151 | }
152 | ENDCG
153 | }
154 | }
155 |
156 | CustomEditor "TMPro.EditorUtilities.TMP_SDFShaderGUI"
157 | }
158 |
159 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF-Surface.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: f7ada0af4f174f0694ca6a487b8f543d
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_SDF.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 68e6db2ebdc24f95958faec2be5558d6
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader:
--------------------------------------------------------------------------------
1 | Shader "TextMeshPro/Sprite"
2 | {
3 | Properties
4 | {
5 | [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
6 | _Color ("Tint", Color) = (1,1,1,1)
7 |
8 | _StencilComp ("Stencil Comparison", Float) = 8
9 | _Stencil ("Stencil ID", Float) = 0
10 | _StencilOp ("Stencil Operation", Float) = 0
11 | _StencilWriteMask ("Stencil Write Mask", Float) = 255
12 | _StencilReadMask ("Stencil Read Mask", Float) = 255
13 |
14 | _CullMode ("Cull Mode", Float) = 0
15 | _ColorMask ("Color Mask", Float) = 15
16 | _ClipRect ("Clip Rect", vector) = (-32767, -32767, 32767, 32767)
17 |
18 | [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
19 | }
20 |
21 | SubShader
22 | {
23 | Tags
24 | {
25 | "Queue"="Transparent"
26 | "IgnoreProjector"="True"
27 | "RenderType"="Transparent"
28 | "PreviewType"="Plane"
29 | "CanUseSpriteAtlas"="True"
30 | }
31 |
32 | Stencil
33 | {
34 | Ref [_Stencil]
35 | Comp [_StencilComp]
36 | Pass [_StencilOp]
37 | ReadMask [_StencilReadMask]
38 | WriteMask [_StencilWriteMask]
39 | }
40 |
41 | Cull [_CullMode]
42 | Lighting Off
43 | ZWrite Off
44 | ZTest [unity_GUIZTestMode]
45 | Blend SrcAlpha OneMinusSrcAlpha
46 | ColorMask [_ColorMask]
47 |
48 | Pass
49 | {
50 | Name "Default"
51 | CGPROGRAM
52 | #pragma vertex vert
53 | #pragma fragment frag
54 | #pragma target 2.0
55 |
56 | #include "UnityCG.cginc"
57 | #include "UnityUI.cginc"
58 |
59 | #pragma multi_compile __ UNITY_UI_CLIP_RECT
60 | #pragma multi_compile __ UNITY_UI_ALPHACLIP
61 |
62 | struct appdata_t
63 | {
64 | float4 vertex : POSITION;
65 | float4 color : COLOR;
66 | float2 texcoord : TEXCOORD0;
67 | UNITY_VERTEX_INPUT_INSTANCE_ID
68 | };
69 |
70 | struct v2f
71 | {
72 | float4 vertex : SV_POSITION;
73 | fixed4 color : COLOR;
74 | float2 texcoord : TEXCOORD0;
75 | float4 worldPosition : TEXCOORD1;
76 | UNITY_VERTEX_OUTPUT_STEREO
77 | };
78 |
79 | sampler2D _MainTex;
80 | fixed4 _Color;
81 | fixed4 _TextureSampleAdd;
82 | float4 _ClipRect;
83 | float4 _MainTex_ST;
84 |
85 | v2f vert(appdata_t v)
86 | {
87 | v2f OUT;
88 | UNITY_SETUP_INSTANCE_ID(v);
89 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
90 | OUT.worldPosition = v.vertex;
91 | OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);
92 |
93 | OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
94 |
95 | OUT.color = v.color * _Color;
96 | return OUT;
97 | }
98 |
99 | fixed4 frag(v2f IN) : SV_Target
100 | {
101 | half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
102 |
103 | #ifdef UNITY_UI_CLIP_RECT
104 | color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
105 | #endif
106 |
107 | #ifdef UNITY_UI_ALPHACLIP
108 | clip (color.a - 0.001);
109 | #endif
110 |
111 | return color;
112 | }
113 | ENDCG
114 | }
115 | }
116 | }
117 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMP_Sprite.shader.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: cf81c85f95fe47e1a27f6ae460cf182c
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro.cginc:
--------------------------------------------------------------------------------
1 | float2 UnpackUV(float uv)
2 | {
3 | float2 output;
4 | output.x = floor(uv / 4096);
5 | output.y = uv - 4096 * output.x;
6 |
7 | return output * 0.001953125;
8 | }
9 |
10 | fixed4 GetColor(half d, fixed4 faceColor, fixed4 outlineColor, half outline, half softness)
11 | {
12 | half faceAlpha = 1-saturate((d - outline * 0.5 + softness * 0.5) / (1.0 + softness));
13 | half outlineAlpha = saturate((d + outline * 0.5)) * sqrt(min(1.0, outline));
14 |
15 | faceColor.rgb *= faceColor.a;
16 | outlineColor.rgb *= outlineColor.a;
17 |
18 | faceColor = lerp(faceColor, outlineColor, outlineAlpha);
19 |
20 | faceColor *= faceAlpha;
21 |
22 | return faceColor;
23 | }
24 |
25 | float3 GetSurfaceNormal(float4 h, float bias)
26 | {
27 | bool raisedBevel = step(1, fmod(_ShaderFlags, 2));
28 |
29 | h += bias+_BevelOffset;
30 |
31 | float bevelWidth = max(.01, _OutlineWidth+_BevelWidth);
32 |
33 | // Track outline
34 | h -= .5;
35 | h /= bevelWidth;
36 | h = saturate(h+.5);
37 |
38 | if(raisedBevel) h = 1 - abs(h*2.0 - 1.0);
39 | h = lerp(h, sin(h*3.141592/2.0), _BevelRoundness);
40 | h = min(h, 1.0-_BevelClamp);
41 | h *= _Bevel * bevelWidth * _GradientScale * -2.0;
42 |
43 | float3 va = normalize(float3(1.0, 0.0, h.y - h.x));
44 | float3 vb = normalize(float3(0.0, -1.0, h.w - h.z));
45 |
46 | return cross(va, vb);
47 | }
48 |
49 | float3 GetSurfaceNormal(float2 uv, float bias, float3 delta)
50 | {
51 | // Read "height field"
52 | float4 h = {tex2D(_MainTex, uv - delta.xz).a,
53 | tex2D(_MainTex, uv + delta.xz).a,
54 | tex2D(_MainTex, uv - delta.zy).a,
55 | tex2D(_MainTex, uv + delta.zy).a};
56 |
57 | return GetSurfaceNormal(h, bias);
58 | }
59 |
60 | float3 GetSpecular(float3 n, float3 l)
61 | {
62 | float spec = pow(max(0.0, dot(n, l)), _Reflectivity);
63 | return _SpecularColor.rgb * spec * _SpecularPower;
64 | }
65 |
66 | float4 GetGlowColor(float d, float scale)
67 | {
68 | float glow = d - (_GlowOffset*_ScaleRatioB) * 0.5 * scale;
69 | float t = lerp(_GlowInner, (_GlowOuter * _ScaleRatioB), step(0.0, glow)) * 0.5 * scale;
70 | glow = saturate(abs(glow/(1.0 + t)));
71 | glow = 1.0-pow(glow, _GlowPower);
72 | glow *= sqrt(min(1.0, t)); // Fade off glow thinner than 1 screen pixel
73 | return float4(_GlowColor.rgb, saturate(_GlowColor.a * glow * 2));
74 | }
75 |
76 | float4 BlendARGB(float4 overlying, float4 underlying)
77 | {
78 | overlying.rgb *= overlying.a;
79 | underlying.rgb *= underlying.a;
80 | float3 blended = overlying.rgb + ((1-overlying.a)*underlying.rgb);
81 | float alpha = underlying.a + (1-underlying.a)*overlying.a;
82 | return float4(blended, alpha);
83 | }
84 |
85 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro.cginc.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 407bc68d299748449bbf7f48ee690f8d
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc:
--------------------------------------------------------------------------------
1 | struct vertex_t {
2 | UNITY_VERTEX_INPUT_INSTANCE_ID
3 | float4 position : POSITION;
4 | float3 normal : NORMAL;
5 | float4 color : COLOR;
6 | float2 texcoord0 : TEXCOORD0;
7 | float2 texcoord1 : TEXCOORD1;
8 | };
9 |
10 | struct pixel_t {
11 | UNITY_VERTEX_INPUT_INSTANCE_ID
12 | UNITY_VERTEX_OUTPUT_STEREO
13 | float4 position : SV_POSITION;
14 | float4 faceColor : COLOR;
15 | float4 outlineColor : COLOR1;
16 | float4 texcoord0 : TEXCOORD0;
17 | float4 param : TEXCOORD1; // weight, scaleRatio
18 | float2 mask : TEXCOORD2;
19 | #if (UNDERLAY_ON || UNDERLAY_INNER)
20 | float4 texcoord2 : TEXCOORD3;
21 | float4 underlayColor : COLOR2;
22 | #endif
23 | };
24 |
25 | float4 SRGBToLinear(float4 rgba) {
26 | return float4(lerp(rgba.rgb / 12.92f, pow((rgba.rgb + 0.055f) / 1.055f, 2.4f), step(0.04045f, rgba.rgb)), rgba.a);
27 | }
28 |
29 | pixel_t VertShader(vertex_t input)
30 | {
31 | pixel_t output;
32 |
33 | UNITY_INITIALIZE_OUTPUT(pixel_t, output);
34 | UNITY_SETUP_INSTANCE_ID(input);
35 | UNITY_TRANSFER_INSTANCE_ID(input, output);
36 | UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
37 |
38 | float bold = step(input.texcoord1.y, 0);
39 |
40 | float4 vert = input.position;
41 | vert.x += _VertexOffsetX;
42 | vert.y += _VertexOffsetY;
43 |
44 | float4 vPosition = UnityObjectToClipPos(vert);
45 |
46 | float weight = lerp(_WeightNormal, _WeightBold, bold) / 4.0;
47 | weight = (weight + _FaceDilate) * _ScaleRatioA * 0.5;
48 |
49 | // Generate UV for the Masking Texture
50 | float4 clampedRect = clamp(_ClipRect, -2e10, 2e10);
51 | float2 maskUV = (vert.xy - clampedRect.xy) / (clampedRect.zw - clampedRect.xy);
52 |
53 | float4 color = input.color;
54 | #if (FORCE_LINEAR && !UNITY_COLORSPACE_GAMMA)
55 | color = SRGBToLinear(input.color);
56 | #endif
57 |
58 | float opacity = color.a;
59 | #if (UNDERLAY_ON | UNDERLAY_INNER)
60 | opacity = 1.0;
61 | #endif
62 |
63 | float4 faceColor = float4(color.rgb, opacity) * _FaceColor;
64 | faceColor.rgb *= faceColor.a;
65 |
66 | float4 outlineColor = _OutlineColor;
67 | outlineColor.a *= opacity;
68 | outlineColor.rgb *= outlineColor.a;
69 |
70 | output.position = vPosition;
71 | output.faceColor = faceColor;
72 | output.outlineColor = outlineColor;
73 | output.texcoord0 = float4(input.texcoord0.xy, maskUV.xy);
74 | output.param = float4(0.5 - weight, 1.3333 * _GradientScale * (_Sharpness + 1) / _TextureWidth, _OutlineWidth * _ScaleRatioA * 0.5, 0);
75 |
76 | float2 mask = float2(0, 0);
77 | #if UNITY_UI_CLIP_RECT
78 | mask = vert.xy * 2 - clampedRect.xy - clampedRect.zw;
79 | #endif
80 | output.mask = mask;
81 |
82 | #if (UNDERLAY_ON || UNDERLAY_INNER)
83 | float4 underlayColor = _UnderlayColor;
84 | underlayColor.rgb *= underlayColor.a;
85 |
86 | float x = -(_UnderlayOffsetX * _ScaleRatioC) * _GradientScale / _TextureWidth;
87 | float y = -(_UnderlayOffsetY * _ScaleRatioC) * _GradientScale / _TextureHeight;
88 |
89 | output.texcoord2 = float4(input.texcoord0 + float2(x, y), input.color.a, 0);
90 | output.underlayColor = underlayColor;
91 | #endif
92 |
93 | return output;
94 | }
95 |
96 | float4 PixShader(pixel_t input) : SV_Target
97 | {
98 | UNITY_SETUP_INSTANCE_ID(input);
99 |
100 | float d = tex2D(_MainTex, input.texcoord0.xy).a;
101 |
102 | float2 UV = input.texcoord0.xy;
103 | float scale = rsqrt(abs(ddx(UV.x) * ddy(UV.y) - ddy(UV.x) * ddx(UV.y))) * input.param.y;
104 |
105 | #if (UNDERLAY_ON | UNDERLAY_INNER)
106 | float layerScale = scale;
107 | layerScale /= 1 + ((_UnderlaySoftness * _ScaleRatioC) * layerScale);
108 | float layerBias = input.param.x * layerScale - .5 - ((_UnderlayDilate * _ScaleRatioC) * .5 * layerScale);
109 | #endif
110 |
111 | scale /= 1 + (_OutlineSoftness * _ScaleRatioA * scale);
112 |
113 | float4 faceColor = input.faceColor * saturate((d - input.param.x) * scale + 0.5);
114 |
115 | #ifdef OUTLINE_ON
116 | float4 outlineColor = lerp(input.faceColor, input.outlineColor, sqrt(min(1.0, input.param.z * scale * 2)));
117 | faceColor = lerp(outlineColor, input.faceColor, saturate((d - input.param.x - input.param.z) * scale + 0.5));
118 | faceColor *= saturate((d - input.param.x + input.param.z) * scale + 0.5);
119 | #endif
120 |
121 | #if UNDERLAY_ON
122 | d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale;
123 | faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * saturate(d - layerBias) * (1 - faceColor.a);
124 | #endif
125 |
126 | #if UNDERLAY_INNER
127 | float bias = input.param.x * scale - 0.5;
128 | float sd = saturate(d * scale - bias - input.param.z);
129 | d = tex2D(_MainTex, input.texcoord2.xy).a * layerScale;
130 | faceColor += float4(_UnderlayColor.rgb * _UnderlayColor.a, _UnderlayColor.a) * (1 - saturate(d - layerBias)) * sd * (1 - faceColor.a);
131 | #endif
132 |
133 | #ifdef MASKING
134 | float a = abs(_MaskInverse - tex2D(_MaskTex, input.texcoord0.zw).a);
135 | float t = a + (1 - _MaskWipeControl) * _MaskEdgeSoftness - _MaskWipeControl;
136 | a = saturate(t / _MaskEdgeSoftness);
137 | faceColor.rgb = lerp(_MaskEdgeColor.rgb * faceColor.a, faceColor.rgb, a);
138 | faceColor *= a;
139 | #endif
140 |
141 | // Alternative implementation to UnityGet2DClipping with support for softness
142 | #if UNITY_UI_CLIP_RECT
143 | float2 maskZW = 0.25 / (0.25 * half2(_MaskSoftnessX, _MaskSoftnessY) + (1 / scale));
144 | float2 m = saturate((_ClipRect.zw - _ClipRect.xy - abs(input.mask.xy)) * maskZW);
145 | faceColor *= m.x * m.y;
146 | #endif
147 |
148 | #if (UNDERLAY_ON | UNDERLAY_INNER)
149 | faceColor *= input.texcoord2.z;
150 | #endif
151 |
152 | #if UNITY_UI_ALPHACLIP
153 | clip(faceColor.a - 0.001);
154 | #endif
155 |
156 | return faceColor;
157 | }
158 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Mobile.cginc.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: c334973cef89a9840b0b0c507e0377ab
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc:
--------------------------------------------------------------------------------
1 | // UI Editable properties
2 | uniform sampler2D _FaceTex; // Alpha : Signed Distance
3 | uniform float _FaceUVSpeedX;
4 | uniform float _FaceUVSpeedY;
5 | uniform fixed4 _FaceColor; // RGBA : Color + Opacity
6 | uniform float _FaceDilate; // v[ 0, 1]
7 | uniform float _OutlineSoftness; // v[ 0, 1]
8 |
9 | uniform sampler2D _OutlineTex; // RGBA : Color + Opacity
10 | uniform float _OutlineUVSpeedX;
11 | uniform float _OutlineUVSpeedY;
12 | uniform fixed4 _OutlineColor; // RGBA : Color + Opacity
13 | uniform float _OutlineWidth; // v[ 0, 1]
14 |
15 | uniform float _Bevel; // v[ 0, 1]
16 | uniform float _BevelOffset; // v[-1, 1]
17 | uniform float _BevelWidth; // v[-1, 1]
18 | uniform float _BevelClamp; // v[ 0, 1]
19 | uniform float _BevelRoundness; // v[ 0, 1]
20 |
21 | uniform sampler2D _BumpMap; // Normal map
22 | uniform float _BumpOutline; // v[ 0, 1]
23 | uniform float _BumpFace; // v[ 0, 1]
24 |
25 | uniform samplerCUBE _Cube; // Cube / sphere map
26 | uniform fixed4 _ReflectFaceColor; // RGB intensity
27 | uniform fixed4 _ReflectOutlineColor;
28 | //uniform float _EnvTiltX; // v[-1, 1]
29 | //uniform float _EnvTiltY; // v[-1, 1]
30 | uniform float3 _EnvMatrixRotation;
31 | uniform float4x4 _EnvMatrix;
32 |
33 | uniform fixed4 _SpecularColor; // RGB intensity
34 | uniform float _LightAngle; // v[ 0,Tau]
35 | uniform float _SpecularPower; // v[ 0, 1]
36 | uniform float _Reflectivity; // v[ 5, 15]
37 | uniform float _Diffuse; // v[ 0, 1]
38 | uniform float _Ambient; // v[ 0, 1]
39 |
40 | uniform fixed4 _UnderlayColor; // RGBA : Color + Opacity
41 | uniform float _UnderlayOffsetX; // v[-1, 1]
42 | uniform float _UnderlayOffsetY; // v[-1, 1]
43 | uniform float _UnderlayDilate; // v[-1, 1]
44 | uniform float _UnderlaySoftness; // v[ 0, 1]
45 |
46 | uniform fixed4 _GlowColor; // RGBA : Color + Intesity
47 | uniform float _GlowOffset; // v[-1, 1]
48 | uniform float _GlowOuter; // v[ 0, 1]
49 | uniform float _GlowInner; // v[ 0, 1]
50 | uniform float _GlowPower; // v[ 1, 1/(1+4*4)]
51 |
52 | // API Editable properties
53 | uniform float _ShaderFlags;
54 | uniform float _WeightNormal;
55 | uniform float _WeightBold;
56 |
57 | uniform float _ScaleRatioA;
58 | uniform float _ScaleRatioB;
59 | uniform float _ScaleRatioC;
60 |
61 | uniform float _VertexOffsetX;
62 | uniform float _VertexOffsetY;
63 |
64 | //uniform float _UseClipRect;
65 | uniform float _MaskID;
66 | uniform sampler2D _MaskTex;
67 | uniform float4 _MaskCoord;
68 | uniform float4 _ClipRect; // bottom left(x,y) : top right(z,w)
69 | //uniform float _MaskWipeControl;
70 | //uniform float _MaskEdgeSoftness;
71 | //uniform fixed4 _MaskEdgeColor;
72 | //uniform bool _MaskInverse;
73 |
74 | uniform float _MaskSoftnessX;
75 | uniform float _MaskSoftnessY;
76 |
77 | // Font Atlas properties
78 | uniform sampler2D _MainTex;
79 | uniform float _TextureWidth;
80 | uniform float _TextureHeight;
81 | uniform float _GradientScale;
82 | uniform float _ScaleX;
83 | uniform float _ScaleY;
84 | uniform float _PerspectiveFilter;
85 | uniform float _Sharpness;
86 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Properties.cginc.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 3997e2241185407d80309a82f9148466
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc:
--------------------------------------------------------------------------------
1 | void VertShader(inout appdata_full v, out Input data)
2 | {
3 | v.vertex.x += _VertexOffsetX;
4 | v.vertex.y += _VertexOffsetY;
5 |
6 | UNITY_INITIALIZE_OUTPUT(Input, data);
7 |
8 | float bold = step(v.texcoord1.y, 0);
9 |
10 | // Generate normal for backface
11 | float3 view = ObjSpaceViewDir(v.vertex);
12 | v.normal *= sign(dot(v.normal, view));
13 |
14 | #if USE_DERIVATIVE
15 | data.param.y = 1;
16 | #else
17 | float4 vert = v.vertex;
18 | float4 vPosition = UnityObjectToClipPos(vert);
19 | float2 pixelSize = vPosition.w;
20 |
21 | pixelSize /= float2(_ScaleX, _ScaleY) * mul((float2x2)UNITY_MATRIX_P, _ScreenParams.xy);
22 | float scale = rsqrt(dot(pixelSize, pixelSize));
23 | scale *= abs(v.texcoord1.y) * _GradientScale * (_Sharpness + 1);
24 | scale = lerp(scale * (1 - _PerspectiveFilter), scale, abs(dot(UnityObjectToWorldNormal(v.normal.xyz), normalize(WorldSpaceViewDir(vert)))));
25 | data.param.y = scale;
26 | #endif
27 |
28 | data.param.x = (lerp(_WeightNormal, _WeightBold, bold) / 4.0 + _FaceDilate) * _ScaleRatioA * 0.5; //
29 |
30 | v.texcoord1.xy = UnpackUV(v.texcoord1.x);
31 | data.viewDirEnv = mul((float3x3)_EnvMatrix, WorldSpaceViewDir(v.vertex));
32 | }
33 |
34 | void PixShader(Input input, inout SurfaceOutput o)
35 | {
36 |
37 | #if USE_DERIVATIVE
38 | float2 pixelSize = float2(ddx(input.uv_MainTex.y), ddy(input.uv_MainTex.y));
39 | pixelSize *= _TextureWidth * .75;
40 | float scale = rsqrt(dot(pixelSize, pixelSize)) * _GradientScale * (_Sharpness + 1);
41 | #else
42 | float scale = input.param.y;
43 | #endif
44 |
45 | // Signed distance
46 | float c = tex2D(_MainTex, input.uv_MainTex).a;
47 | float sd = (.5 - c - input.param.x) * scale + .5;
48 | float outline = _OutlineWidth*_ScaleRatioA * scale;
49 | float softness = _OutlineSoftness*_ScaleRatioA * scale;
50 |
51 | // Color & Alpha
52 | float4 faceColor = _FaceColor;
53 | float4 outlineColor = _OutlineColor;
54 | faceColor *= input.color;
55 | outlineColor.a *= input.color.a;
56 | faceColor *= tex2D(_FaceTex, float2(input.uv2_FaceTex.x + _FaceUVSpeedX * _Time.y, input.uv2_FaceTex.y + _FaceUVSpeedY * _Time.y));
57 | outlineColor *= tex2D(_OutlineTex, float2(input.uv2_OutlineTex.x + _OutlineUVSpeedX * _Time.y, input.uv2_OutlineTex.y + _OutlineUVSpeedY * _Time.y));
58 | faceColor = GetColor(sd, faceColor, outlineColor, outline, softness);
59 | faceColor.rgb /= max(faceColor.a, 0.0001);
60 |
61 | #if BEVEL_ON
62 | float3 delta = float3(1.0 / _TextureWidth, 1.0 / _TextureHeight, 0.0);
63 |
64 | float4 smp4x = {tex2D(_MainTex, input.uv_MainTex - delta.xz).a,
65 | tex2D(_MainTex, input.uv_MainTex + delta.xz).a,
66 | tex2D(_MainTex, input.uv_MainTex - delta.zy).a,
67 | tex2D(_MainTex, input.uv_MainTex + delta.zy).a };
68 |
69 | // Face Normal
70 | float3 n = GetSurfaceNormal(smp4x, input.param.x);
71 |
72 | // Bumpmap
73 | float3 bump = UnpackNormal(tex2D(_BumpMap, input.uv2_FaceTex.xy)).xyz;
74 | bump *= lerp(_BumpFace, _BumpOutline, saturate(sd + outline * 0.5));
75 | bump = lerp(float3(0, 0, 1), bump, faceColor.a);
76 | n = normalize(n - bump);
77 |
78 | // Cubemap reflection
79 | fixed4 reflcol = texCUBE(_Cube, reflect(input.viewDirEnv, mul((float3x3)unity_ObjectToWorld, n)));
80 | float3 emission = reflcol.rgb * lerp(_ReflectFaceColor.rgb, _ReflectOutlineColor.rgb, saturate(sd + outline * 0.5)) * faceColor.a;
81 | #else
82 | float3 n = float3(0, 0, -1);
83 | float3 emission = float3(0, 0, 0);
84 | #endif
85 |
86 | #if GLOW_ON
87 | float4 glowColor = GetGlowColor(sd, scale);
88 | glowColor.a *= input.color.a;
89 | emission += glowColor.rgb*glowColor.a;
90 | faceColor = BlendARGB(glowColor, faceColor);
91 | faceColor.rgb /= max(faceColor.a, 0.0001);
92 | #endif
93 |
94 | // Set Standard output structure
95 | o.Albedo = faceColor.rgb;
96 | o.Normal = -n;
97 | o.Emission = emission;
98 | o.Specular = lerp(_FaceShininess, _OutlineShininess, saturate(sd + outline * 0.5));
99 | o.Gloss = 1;
100 | o.Alpha = faceColor.a;
101 | }
102 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Shaders/TMPro_Surface.cginc.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d930090c0cd643c7b55f19a38538c162
3 | ShaderImporter:
4 | externalObjects: {}
5 | defaultTextures: []
6 | nonModifiableTextures: []
7 | userData:
8 | assetBundleName:
9 | assetBundleVariant:
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: d0603b6d5186471b96c778c3949c7ce2
3 | folderAsset: yes
4 | DefaultImporter:
5 | externalObjects: {}
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt:
--------------------------------------------------------------------------------
1 | This sample of beautiful emojis are provided by EmojiOne https://www.emojione.com/
2 |
3 | Please visit their website to view the complete set of their emojis and review their licensing terms.
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne Attribution.txt.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 381dcb09d5029d14897e55f98031fca5
3 | TextScriptImporter:
4 | externalObjects: {}
5 | userData:
6 | assetBundleName:
7 | assetBundleVariant:
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.json:
--------------------------------------------------------------------------------
1 | {"frames": [
2 |
3 | {
4 | "filename": "1f60a.png",
5 | "frame": {"x":0,"y":0,"w":128,"h":128},
6 | "rotated": false,
7 | "trimmed": false,
8 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
9 | "sourceSize": {"w":128,"h":128},
10 | "pivot": {"x":0.5,"y":0.5}
11 | },
12 | {
13 | "filename": "1f60b.png",
14 | "frame": {"x":128,"y":0,"w":128,"h":128},
15 | "rotated": false,
16 | "trimmed": false,
17 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
18 | "sourceSize": {"w":128,"h":128},
19 | "pivot": {"x":0.5,"y":0.5}
20 | },
21 | {
22 | "filename": "1f60d.png",
23 | "frame": {"x":256,"y":0,"w":128,"h":128},
24 | "rotated": false,
25 | "trimmed": false,
26 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
27 | "sourceSize": {"w":128,"h":128},
28 | "pivot": {"x":0.5,"y":0.5}
29 | },
30 | {
31 | "filename": "1f60e.png",
32 | "frame": {"x":384,"y":0,"w":128,"h":128},
33 | "rotated": false,
34 | "trimmed": false,
35 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
36 | "sourceSize": {"w":128,"h":128},
37 | "pivot": {"x":0.5,"y":0.5}
38 | },
39 | {
40 | "filename": "1f600.png",
41 | "frame": {"x":0,"y":128,"w":128,"h":128},
42 | "rotated": false,
43 | "trimmed": false,
44 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
45 | "sourceSize": {"w":128,"h":128},
46 | "pivot": {"x":0.5,"y":0.5}
47 | },
48 | {
49 | "filename": "1f601.png",
50 | "frame": {"x":128,"y":128,"w":128,"h":128},
51 | "rotated": false,
52 | "trimmed": false,
53 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
54 | "sourceSize": {"w":128,"h":128},
55 | "pivot": {"x":0.5,"y":0.5}
56 | },
57 | {
58 | "filename": "1f602.png",
59 | "frame": {"x":256,"y":128,"w":128,"h":128},
60 | "rotated": false,
61 | "trimmed": false,
62 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
63 | "sourceSize": {"w":128,"h":128},
64 | "pivot": {"x":0.5,"y":0.5}
65 | },
66 | {
67 | "filename": "1f603.png",
68 | "frame": {"x":384,"y":128,"w":128,"h":128},
69 | "rotated": false,
70 | "trimmed": false,
71 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
72 | "sourceSize": {"w":128,"h":128},
73 | "pivot": {"x":0.5,"y":0.5}
74 | },
75 | {
76 | "filename": "1f604.png",
77 | "frame": {"x":0,"y":256,"w":128,"h":128},
78 | "rotated": false,
79 | "trimmed": false,
80 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
81 | "sourceSize": {"w":128,"h":128},
82 | "pivot": {"x":0.5,"y":0.5}
83 | },
84 | {
85 | "filename": "1f605.png",
86 | "frame": {"x":128,"y":256,"w":128,"h":128},
87 | "rotated": false,
88 | "trimmed": false,
89 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
90 | "sourceSize": {"w":128,"h":128},
91 | "pivot": {"x":0.5,"y":0.5}
92 | },
93 | {
94 | "filename": "1f606.png",
95 | "frame": {"x":256,"y":256,"w":128,"h":128},
96 | "rotated": false,
97 | "trimmed": false,
98 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
99 | "sourceSize": {"w":128,"h":128},
100 | "pivot": {"x":0.5,"y":0.5}
101 | },
102 | {
103 | "filename": "1f609.png",
104 | "frame": {"x":384,"y":256,"w":128,"h":128},
105 | "rotated": false,
106 | "trimmed": false,
107 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
108 | "sourceSize": {"w":128,"h":128},
109 | "pivot": {"x":0.5,"y":0.5}
110 | },
111 | {
112 | "filename": "1f618.png",
113 | "frame": {"x":0,"y":384,"w":128,"h":128},
114 | "rotated": false,
115 | "trimmed": false,
116 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
117 | "sourceSize": {"w":128,"h":128},
118 | "pivot": {"x":0.5,"y":0.5}
119 | },
120 | {
121 | "filename": "1f923.png",
122 | "frame": {"x":128,"y":384,"w":128,"h":128},
123 | "rotated": false,
124 | "trimmed": false,
125 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
126 | "sourceSize": {"w":128,"h":128},
127 | "pivot": {"x":0.5,"y":0.5}
128 | },
129 | {
130 | "filename": "263a.png",
131 | "frame": {"x":256,"y":384,"w":128,"h":128},
132 | "rotated": false,
133 | "trimmed": false,
134 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
135 | "sourceSize": {"w":128,"h":128},
136 | "pivot": {"x":0.5,"y":0.5}
137 | },
138 | {
139 | "filename": "2639.png",
140 | "frame": {"x":384,"y":384,"w":128,"h":128},
141 | "rotated": false,
142 | "trimmed": false,
143 | "spriteSourceSize": {"x":0,"y":0,"w":128,"h":128},
144 | "sourceSize": {"w":128,"h":128},
145 | "pivot": {"x":0.5,"y":0.5}
146 | }],
147 | "meta": {
148 | "app": "http://www.codeandweb.com/texturepacker",
149 | "version": "1.0",
150 | "image": "EmojiOne.png",
151 | "format": "RGBA8888",
152 | "size": {"w":512,"h":512},
153 | "scale": "1",
154 | "smartupdate": "$TexturePacker:SmartUpdate:196a26a2e149d875b91ffc8fa3581e76:fc928c7e275404b7e0649307410475cb:424723c3774975ddb2053fd5c4b85f6e$"
155 | }
156 | }
157 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.json.meta:
--------------------------------------------------------------------------------
1 | fileFormatVersion: 2
2 | guid: 8f05276190cf498a8153f6cbe761d4e6
3 | timeCreated: 1480316860
4 | licenseType: Pro
5 | TextScriptImporter:
6 | userData:
7 | assetBundleName:
8 | assetBundleVariant:
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/lexonegit/Unity-Twitch-Chat/0c3e6e2950c760e542abdab75d18ff788b83881e/Unity-Twitch-Chat/Assets/TextMesh Pro/Sprites/EmojiOne.png
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/Packages/manifest.json:
--------------------------------------------------------------------------------
1 | {
2 | "dependencies": {
3 | "com.unity.ai.navigation": "1.1.5",
4 | "com.unity.collab-proxy": "2.4.4",
5 | "com.unity.feature.2d": "2.0.1",
6 | "com.unity.ide.rider": "3.0.31",
7 | "com.unity.ide.visualstudio": "2.0.22",
8 | "com.unity.ide.vscode": "1.2.5",
9 | "com.unity.test-framework": "1.1.33",
10 | "com.unity.textmeshpro": "3.0.6",
11 | "com.unity.timeline": "1.7.6",
12 | "com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.9",
13 | "com.unity.ugui": "1.0.0",
14 | "com.unity.visualscripting": "1.9.4",
15 | "com.unity.modules.ai": "1.0.0",
16 | "com.unity.modules.androidjni": "1.0.0",
17 | "com.unity.modules.animation": "1.0.0",
18 | "com.unity.modules.assetbundle": "1.0.0",
19 | "com.unity.modules.audio": "1.0.0",
20 | "com.unity.modules.cloth": "1.0.0",
21 | "com.unity.modules.director": "1.0.0",
22 | "com.unity.modules.imageconversion": "1.0.0",
23 | "com.unity.modules.imgui": "1.0.0",
24 | "com.unity.modules.jsonserialize": "1.0.0",
25 | "com.unity.modules.particlesystem": "1.0.0",
26 | "com.unity.modules.physics": "1.0.0",
27 | "com.unity.modules.physics2d": "1.0.0",
28 | "com.unity.modules.screencapture": "1.0.0",
29 | "com.unity.modules.terrain": "1.0.0",
30 | "com.unity.modules.terrainphysics": "1.0.0",
31 | "com.unity.modules.tilemap": "1.0.0",
32 | "com.unity.modules.ui": "1.0.0",
33 | "com.unity.modules.uielements": "1.0.0",
34 | "com.unity.modules.umbra": "1.0.0",
35 | "com.unity.modules.unityanalytics": "1.0.0",
36 | "com.unity.modules.unitywebrequest": "1.0.0",
37 | "com.unity.modules.unitywebrequestassetbundle": "1.0.0",
38 | "com.unity.modules.unitywebrequestaudio": "1.0.0",
39 | "com.unity.modules.unitywebrequesttexture": "1.0.0",
40 | "com.unity.modules.unitywebrequestwww": "1.0.0",
41 | "com.unity.modules.vehicles": "1.0.0",
42 | "com.unity.modules.video": "1.0.0",
43 | "com.unity.modules.vr": "1.0.0",
44 | "com.unity.modules.wind": "1.0.0",
45 | "com.unity.modules.xr": "1.0.0"
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/AudioManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!11 &1
4 | AudioManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_Volume: 1
8 | Rolloff Scale: 1
9 | Doppler Factor: 1
10 | Default Speaker Mode: 2
11 | m_SampleRate: 0
12 | m_DSPBufferSize: 1024
13 | m_VirtualVoiceCount: 512
14 | m_RealVoiceCount: 32
15 | m_SpatializerPlugin:
16 | m_AmbisonicDecoderPlugin:
17 | m_DisableAudio: 0
18 | m_VirtualizeEffects: 1
19 | m_RequestedDSPBufferSize: 0
20 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/ClusterInputManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!236 &1
4 | ClusterInputManager:
5 | m_ObjectHideFlags: 0
6 | m_Inputs: []
7 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/DynamicsManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!55 &1
4 | PhysicsManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 13
7 | m_Gravity: {x: 0, y: -9.81, z: 0}
8 | m_DefaultMaterial: {fileID: 0}
9 | m_BounceThreshold: 2
10 | m_DefaultMaxDepenetrationVelocity: 10
11 | m_SleepThreshold: 0.005
12 | m_DefaultContactOffset: 0.01
13 | m_DefaultSolverIterations: 6
14 | m_DefaultSolverVelocityIterations: 1
15 | m_QueriesHitBackfaces: 0
16 | m_QueriesHitTriggers: 1
17 | m_EnableAdaptiveForce: 0
18 | m_ClothInterCollisionDistance: 0.1
19 | m_ClothInterCollisionStiffness: 0.2
20 | m_ContactsGeneration: 1
21 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
22 | m_AutoSimulation: 1
23 | m_AutoSyncTransforms: 0
24 | m_ReuseCollisionCallbacks: 1
25 | m_ClothInterCollisionSettingsToggle: 0
26 | m_ClothGravity: {x: 0, y: -9.81, z: 0}
27 | m_ContactPairsMode: 0
28 | m_BroadphaseType: 0
29 | m_WorldBounds:
30 | m_Center: {x: 0, y: 0, z: 0}
31 | m_Extent: {x: 250, y: 250, z: 250}
32 | m_WorldSubdivisions: 8
33 | m_FrictionType: 0
34 | m_EnableEnhancedDeterminism: 0
35 | m_EnableUnifiedHeightmaps: 1
36 | m_SolverType: 0
37 | m_DefaultMaxAngularSpeed: 50
38 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/EditorBuildSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1045 &1
4 | EditorBuildSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_Scenes:
8 | - enabled: 1
9 | path: Assets/Scenes/SampleScene.unity
10 | guid: 2cda990e2423bbf4892e6590ba056729
11 | m_configObjects: {}
12 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/EditorSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!159 &1
4 | EditorSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 11
7 | m_SerializationMode: 2
8 | m_LineEndingsForNewScripts: 0
9 | m_DefaultBehaviorMode: 1
10 | m_PrefabRegularEnvironment: {fileID: 0}
11 | m_PrefabUIEnvironment: {fileID: 0}
12 | m_SpritePackerMode: 4
13 | m_SpritePackerPaddingPower: 1
14 | m_Bc7TextureCompressor: 0
15 | m_EtcTextureCompressorBehavior: 1
16 | m_EtcTextureFastCompressor: 1
17 | m_EtcTextureNormalCompressor: 2
18 | m_EtcTextureBestCompressor: 4
19 | m_ProjectGenerationIncludedExtensions: txt;xml;fnt;cd;asmdef;asmref;rsp
20 | m_ProjectGenerationRootNamespace:
21 | m_EnableTextureStreamingInEditMode: 1
22 | m_EnableTextureStreamingInPlayMode: 1
23 | m_AsyncShaderCompilation: 1
24 | m_CachingShaderPreprocessor: 1
25 | m_PrefabModeAllowAutoSave: 1
26 | m_EnterPlayModeOptionsEnabled: 1
27 | m_EnterPlayModeOptions: 3
28 | m_GameObjectNamingDigits: 1
29 | m_GameObjectNamingScheme: 0
30 | m_AssetNamingUsesSpace: 1
31 | m_UseLegacyProbeSampleCount: 0
32 | m_SerializeInlineMappingsOnOneLine: 1
33 | m_DisableCookiesInLightmapper: 1
34 | m_AssetPipelineMode: 1
35 | m_RefreshImportMode: 0
36 | m_CacheServerMode: 0
37 | m_CacheServerEndpoint:
38 | m_CacheServerNamespacePrefix: default
39 | m_CacheServerEnableDownload: 1
40 | m_CacheServerEnableUpload: 1
41 | m_CacheServerEnableAuth: 0
42 | m_CacheServerEnableTls: 0
43 | m_CacheServerValidationMode: 2
44 | m_CacheServerDownloadBatchSize: 128
45 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/GraphicsSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!30 &1
4 | GraphicsSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 13
7 | m_Deferred:
8 | m_Mode: 1
9 | m_Shader: {fileID: 69, guid: 0000000000000000f000000000000000, type: 0}
10 | m_DeferredReflections:
11 | m_Mode: 1
12 | m_Shader: {fileID: 74, guid: 0000000000000000f000000000000000, type: 0}
13 | m_ScreenSpaceShadows:
14 | m_Mode: 1
15 | m_Shader: {fileID: 64, guid: 0000000000000000f000000000000000, type: 0}
16 | m_LegacyDeferred:
17 | m_Mode: 1
18 | m_Shader: {fileID: 63, guid: 0000000000000000f000000000000000, type: 0}
19 | m_DepthNormals:
20 | m_Mode: 1
21 | m_Shader: {fileID: 62, guid: 0000000000000000f000000000000000, type: 0}
22 | m_MotionVectors:
23 | m_Mode: 1
24 | m_Shader: {fileID: 75, guid: 0000000000000000f000000000000000, type: 0}
25 | m_LightHalo:
26 | m_Mode: 1
27 | m_Shader: {fileID: 105, guid: 0000000000000000f000000000000000, type: 0}
28 | m_LensFlare:
29 | m_Mode: 1
30 | m_Shader: {fileID: 102, guid: 0000000000000000f000000000000000, type: 0}
31 | m_VideoShadersIncludeMode: 2
32 | m_AlwaysIncludedShaders:
33 | - {fileID: 7, guid: 0000000000000000f000000000000000, type: 0}
34 | - {fileID: 15104, guid: 0000000000000000f000000000000000, type: 0}
35 | - {fileID: 15105, guid: 0000000000000000f000000000000000, type: 0}
36 | - {fileID: 15106, guid: 0000000000000000f000000000000000, type: 0}
37 | - {fileID: 10753, guid: 0000000000000000f000000000000000, type: 0}
38 | - {fileID: 10770, guid: 0000000000000000f000000000000000, type: 0}
39 | - {fileID: 10783, guid: 0000000000000000f000000000000000, type: 0}
40 | m_PreloadedShaders: []
41 | m_SpritesDefaultMaterial: {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0}
42 | m_CustomRenderPipeline: {fileID: 0}
43 | m_TransparencySortMode: 0
44 | m_TransparencySortAxis: {x: 0, y: 0, z: 1}
45 | m_DefaultRenderingPath: 1
46 | m_DefaultMobileRenderingPath: 1
47 | m_TierSettings: []
48 | m_LightmapStripping: 0
49 | m_FogStripping: 0
50 | m_InstancingStripping: 0
51 | m_LightmapKeepPlain: 1
52 | m_LightmapKeepDirCombined: 1
53 | m_LightmapKeepDynamicPlain: 1
54 | m_LightmapKeepDynamicDirCombined: 1
55 | m_LightmapKeepShadowMask: 1
56 | m_LightmapKeepSubtractive: 1
57 | m_FogKeepLinear: 1
58 | m_FogKeepExp: 1
59 | m_FogKeepExp2: 1
60 | m_AlbedoSwatchInfos: []
61 | m_LightsUseLinearIntensity: 0
62 | m_LightsUseColorTemperature: 0
63 | m_DefaultRenderingLayerMask: 1
64 | m_LogWhenShaderIsCompiled: 0
65 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/MemorySettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!387306366 &1
4 | MemorySettings:
5 | m_ObjectHideFlags: 0
6 | m_EditorMemorySettings:
7 | m_MainAllocatorBlockSize: -1
8 | m_ThreadAllocatorBlockSize: -1
9 | m_MainGfxBlockSize: -1
10 | m_ThreadGfxBlockSize: -1
11 | m_CacheBlockSize: -1
12 | m_TypetreeBlockSize: -1
13 | m_ProfilerBlockSize: -1
14 | m_ProfilerEditorBlockSize: -1
15 | m_BucketAllocatorGranularity: -1
16 | m_BucketAllocatorBucketsCount: -1
17 | m_BucketAllocatorBlockSize: -1
18 | m_BucketAllocatorBlockCount: -1
19 | m_ProfilerBucketAllocatorGranularity: -1
20 | m_ProfilerBucketAllocatorBucketsCount: -1
21 | m_ProfilerBucketAllocatorBlockSize: -1
22 | m_ProfilerBucketAllocatorBlockCount: -1
23 | m_TempAllocatorSizeMain: -1
24 | m_JobTempAllocatorBlockSize: -1
25 | m_BackgroundJobTempAllocatorBlockSize: -1
26 | m_JobTempAllocatorReducedBlockSize: -1
27 | m_TempAllocatorSizeGIBakingWorker: -1
28 | m_TempAllocatorSizeNavMeshWorker: -1
29 | m_TempAllocatorSizeAudioWorker: -1
30 | m_TempAllocatorSizeCloudWorker: -1
31 | m_TempAllocatorSizeGfx: -1
32 | m_TempAllocatorSizeJobWorker: -1
33 | m_TempAllocatorSizeBackgroundWorker: -1
34 | m_TempAllocatorSizePreloadManager: -1
35 | m_PlatformMemorySettings: {}
36 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/NavMeshAreas.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!126 &1
4 | NavMeshProjectSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | areas:
8 | - name: Walkable
9 | cost: 1
10 | - name: Not Walkable
11 | cost: 1
12 | - name: Jump
13 | cost: 2
14 | - name:
15 | cost: 1
16 | - name:
17 | cost: 1
18 | - name:
19 | cost: 1
20 | - name:
21 | cost: 1
22 | - name:
23 | cost: 1
24 | - name:
25 | cost: 1
26 | - name:
27 | cost: 1
28 | - name:
29 | cost: 1
30 | - name:
31 | cost: 1
32 | - name:
33 | cost: 1
34 | - name:
35 | cost: 1
36 | - name:
37 | cost: 1
38 | - name:
39 | cost: 1
40 | - name:
41 | cost: 1
42 | - name:
43 | cost: 1
44 | - name:
45 | cost: 1
46 | - name:
47 | cost: 1
48 | - name:
49 | cost: 1
50 | - name:
51 | cost: 1
52 | - name:
53 | cost: 1
54 | - name:
55 | cost: 1
56 | - name:
57 | cost: 1
58 | - name:
59 | cost: 1
60 | - name:
61 | cost: 1
62 | - name:
63 | cost: 1
64 | - name:
65 | cost: 1
66 | - name:
67 | cost: 1
68 | - name:
69 | cost: 1
70 | - name:
71 | cost: 1
72 | m_LastAgentTypeID: -887442657
73 | m_Settings:
74 | - serializedVersion: 2
75 | agentTypeID: 0
76 | agentRadius: 0.5
77 | agentHeight: 2
78 | agentSlope: 45
79 | agentClimb: 0.75
80 | ledgeDropHeight: 0
81 | maxJumpAcrossDistance: 0
82 | minRegionArea: 2
83 | manualCellSize: 0
84 | cellSize: 0.16666667
85 | manualTileSize: 0
86 | tileSize: 256
87 | accuratePlacement: 0
88 | maxJobWorkers: 0
89 | preserveTilesOutsideBounds: 0
90 | debug:
91 | m_Flags: 0
92 | m_SettingNames:
93 | - Humanoid
94 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/NetworkManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!149 &1
4 | NetworkManager:
5 | m_ObjectHideFlags: 0
6 | m_DebugLevel: 0
7 | m_Sendrate: 15
8 | m_AssetToPrefab: {}
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/PackageManagerSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!114 &1
4 | MonoBehaviour:
5 | m_ObjectHideFlags: 61
6 | m_CorrespondingSourceObject: {fileID: 0}
7 | m_PrefabInstance: {fileID: 0}
8 | m_PrefabAsset: {fileID: 0}
9 | m_GameObject: {fileID: 0}
10 | m_Enabled: 1
11 | m_EditorHideFlags: 0
12 | m_Script: {fileID: 13964, guid: 0000000000000000e000000000000000, type: 0}
13 | m_Name:
14 | m_EditorClassIdentifier:
15 | m_EnablePreReleasePackages: 0
16 | m_EnablePackageDependencies: 0
17 | m_AdvancedSettingsExpanded: 1
18 | m_ScopedRegistriesSettingsExpanded: 1
19 | m_SeeAllPackageVersions: 0
20 | oneTimeWarningShown: 0
21 | m_Registries:
22 | - m_Id: main
23 | m_Name:
24 | m_Url: https://packages.unity.com
25 | m_Scopes: []
26 | m_IsDefault: 1
27 | m_Capabilities: 7
28 | m_UserSelectedRegistryName:
29 | m_UserAddingNewScopedRegistry: 0
30 | m_RegistryInfoDraft:
31 | m_ErrorMessage:
32 | m_Original:
33 | m_Id:
34 | m_Name:
35 | m_Url:
36 | m_Scopes: []
37 | m_IsDefault: 0
38 | m_Capabilities: 0
39 | m_Modified: 0
40 | m_Name:
41 | m_Url:
42 | m_Scopes:
43 | -
44 | m_SelectedScopeIndex: 0
45 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/Physics2DSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!19 &1
4 | Physics2DSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 5
7 | m_Gravity: {x: 0, y: -9.81}
8 | m_DefaultMaterial: {fileID: 0}
9 | m_VelocityIterations: 8
10 | m_PositionIterations: 3
11 | m_VelocityThreshold: 1
12 | m_MaxLinearCorrection: 0.2
13 | m_MaxAngularCorrection: 8
14 | m_MaxTranslationSpeed: 100
15 | m_MaxRotationSpeed: 360
16 | m_BaumgarteScale: 0.2
17 | m_BaumgarteTimeOfImpactScale: 0.75
18 | m_TimeToSleep: 0.5
19 | m_LinearSleepTolerance: 0.01
20 | m_AngularSleepTolerance: 2
21 | m_DefaultContactOffset: 0.01
22 | m_JobOptions:
23 | serializedVersion: 2
24 | useMultithreading: 0
25 | useConsistencySorting: 0
26 | m_InterpolationPosesPerJob: 100
27 | m_NewContactsPerJob: 30
28 | m_CollideContactsPerJob: 100
29 | m_ClearFlagsPerJob: 200
30 | m_ClearBodyForcesPerJob: 200
31 | m_SyncDiscreteFixturesPerJob: 50
32 | m_SyncContinuousFixturesPerJob: 50
33 | m_FindNearestContactsPerJob: 100
34 | m_UpdateTriggerContactsPerJob: 100
35 | m_IslandSolverCostThreshold: 100
36 | m_IslandSolverBodyCostScale: 1
37 | m_IslandSolverContactCostScale: 10
38 | m_IslandSolverJointCostScale: 10
39 | m_IslandSolverBodiesPerJob: 50
40 | m_IslandSolverContactsPerJob: 50
41 | m_SimulationMode: 0
42 | m_QueriesHitTriggers: 1
43 | m_QueriesStartInColliders: 1
44 | m_CallbacksOnDisable: 1
45 | m_ReuseCollisionCallbacks: 1
46 | m_AutoSyncTransforms: 0
47 | m_AlwaysShowColliders: 0
48 | m_ShowColliderSleep: 1
49 | m_ShowColliderContacts: 0
50 | m_ShowColliderAABB: 0
51 | m_ContactArrowScale: 0.2
52 | m_ColliderAwakeColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.7529412}
53 | m_ColliderAsleepColor: {r: 0.5686275, g: 0.95686275, b: 0.54509807, a: 0.36078432}
54 | m_ColliderContactColor: {r: 1, g: 0, b: 1, a: 0.6862745}
55 | m_ColliderAABBColor: {r: 1, g: 1, b: 0, a: 0.2509804}
56 | m_LayerCollisionMatrix: ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
57 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/PresetManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!1386491679 &1
4 | PresetManager:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 2
7 | m_DefaultPresets: {}
8 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/ProjectVersion.txt:
--------------------------------------------------------------------------------
1 | m_EditorVersion: 2022.3.41f1
2 | m_EditorVersionWithRevision: 2022.3.41f1 (0f988161febf)
3 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/QualitySettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!47 &1
4 | QualitySettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 5
7 | m_CurrentQuality: 5
8 | m_QualitySettings:
9 | - serializedVersion: 2
10 | name: Very Low
11 | pixelLightCount: 0
12 | shadows: 0
13 | shadowResolution: 0
14 | shadowProjection: 1
15 | shadowCascades: 1
16 | shadowDistance: 15
17 | shadowNearPlaneOffset: 3
18 | shadowCascade2Split: 0.33333334
19 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
20 | shadowmaskMode: 0
21 | skinWeights: 1
22 | textureQuality: 1
23 | anisotropicTextures: 0
24 | antiAliasing: 0
25 | softParticles: 0
26 | softVegetation: 0
27 | realtimeReflectionProbes: 0
28 | billboardsFaceCameraPosition: 0
29 | vSyncCount: 0
30 | lodBias: 0.3
31 | maximumLODLevel: 0
32 | streamingMipmapsActive: 0
33 | streamingMipmapsAddAllCameras: 1
34 | streamingMipmapsMemoryBudget: 512
35 | streamingMipmapsRenderersPerFrame: 512
36 | streamingMipmapsMaxLevelReduction: 2
37 | streamingMipmapsMaxFileIORequests: 1024
38 | particleRaycastBudget: 4
39 | asyncUploadTimeSlice: 2
40 | asyncUploadBufferSize: 16
41 | asyncUploadPersistentBuffer: 1
42 | resolutionScalingFixedDPIFactor: 1
43 | customRenderPipeline: {fileID: 0}
44 | excludedTargetPlatforms: []
45 | - serializedVersion: 2
46 | name: Low
47 | pixelLightCount: 0
48 | shadows: 0
49 | shadowResolution: 0
50 | shadowProjection: 1
51 | shadowCascades: 1
52 | shadowDistance: 20
53 | shadowNearPlaneOffset: 3
54 | shadowCascade2Split: 0.33333334
55 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
56 | shadowmaskMode: 0
57 | skinWeights: 2
58 | textureQuality: 0
59 | anisotropicTextures: 0
60 | antiAliasing: 0
61 | softParticles: 0
62 | softVegetation: 0
63 | realtimeReflectionProbes: 0
64 | billboardsFaceCameraPosition: 0
65 | vSyncCount: 0
66 | lodBias: 0.4
67 | maximumLODLevel: 0
68 | streamingMipmapsActive: 0
69 | streamingMipmapsAddAllCameras: 1
70 | streamingMipmapsMemoryBudget: 512
71 | streamingMipmapsRenderersPerFrame: 512
72 | streamingMipmapsMaxLevelReduction: 2
73 | streamingMipmapsMaxFileIORequests: 1024
74 | particleRaycastBudget: 16
75 | asyncUploadTimeSlice: 2
76 | asyncUploadBufferSize: 16
77 | asyncUploadPersistentBuffer: 1
78 | resolutionScalingFixedDPIFactor: 1
79 | customRenderPipeline: {fileID: 0}
80 | excludedTargetPlatforms: []
81 | - serializedVersion: 2
82 | name: Medium
83 | pixelLightCount: 1
84 | shadows: 1
85 | shadowResolution: 0
86 | shadowProjection: 1
87 | shadowCascades: 1
88 | shadowDistance: 20
89 | shadowNearPlaneOffset: 3
90 | shadowCascade2Split: 0.33333334
91 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
92 | shadowmaskMode: 0
93 | skinWeights: 2
94 | textureQuality: 0
95 | anisotropicTextures: 1
96 | antiAliasing: 0
97 | softParticles: 0
98 | softVegetation: 0
99 | realtimeReflectionProbes: 0
100 | billboardsFaceCameraPosition: 0
101 | vSyncCount: 1
102 | lodBias: 0.7
103 | maximumLODLevel: 0
104 | streamingMipmapsActive: 0
105 | streamingMipmapsAddAllCameras: 1
106 | streamingMipmapsMemoryBudget: 512
107 | streamingMipmapsRenderersPerFrame: 512
108 | streamingMipmapsMaxLevelReduction: 2
109 | streamingMipmapsMaxFileIORequests: 1024
110 | particleRaycastBudget: 64
111 | asyncUploadTimeSlice: 2
112 | asyncUploadBufferSize: 16
113 | asyncUploadPersistentBuffer: 1
114 | resolutionScalingFixedDPIFactor: 1
115 | customRenderPipeline: {fileID: 0}
116 | excludedTargetPlatforms: []
117 | - serializedVersion: 2
118 | name: High
119 | pixelLightCount: 2
120 | shadows: 2
121 | shadowResolution: 1
122 | shadowProjection: 1
123 | shadowCascades: 2
124 | shadowDistance: 40
125 | shadowNearPlaneOffset: 3
126 | shadowCascade2Split: 0.33333334
127 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
128 | shadowmaskMode: 1
129 | skinWeights: 2
130 | textureQuality: 0
131 | anisotropicTextures: 1
132 | antiAliasing: 0
133 | softParticles: 0
134 | softVegetation: 1
135 | realtimeReflectionProbes: 1
136 | billboardsFaceCameraPosition: 1
137 | vSyncCount: 1
138 | lodBias: 1
139 | maximumLODLevel: 0
140 | streamingMipmapsActive: 0
141 | streamingMipmapsAddAllCameras: 1
142 | streamingMipmapsMemoryBudget: 512
143 | streamingMipmapsRenderersPerFrame: 512
144 | streamingMipmapsMaxLevelReduction: 2
145 | streamingMipmapsMaxFileIORequests: 1024
146 | particleRaycastBudget: 256
147 | asyncUploadTimeSlice: 2
148 | asyncUploadBufferSize: 16
149 | asyncUploadPersistentBuffer: 1
150 | resolutionScalingFixedDPIFactor: 1
151 | customRenderPipeline: {fileID: 0}
152 | excludedTargetPlatforms: []
153 | - serializedVersion: 2
154 | name: Very High
155 | pixelLightCount: 3
156 | shadows: 2
157 | shadowResolution: 2
158 | shadowProjection: 1
159 | shadowCascades: 2
160 | shadowDistance: 70
161 | shadowNearPlaneOffset: 3
162 | shadowCascade2Split: 0.33333334
163 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
164 | shadowmaskMode: 1
165 | skinWeights: 4
166 | textureQuality: 0
167 | anisotropicTextures: 2
168 | antiAliasing: 2
169 | softParticles: 1
170 | softVegetation: 1
171 | realtimeReflectionProbes: 1
172 | billboardsFaceCameraPosition: 1
173 | vSyncCount: 1
174 | lodBias: 1.5
175 | maximumLODLevel: 0
176 | streamingMipmapsActive: 0
177 | streamingMipmapsAddAllCameras: 1
178 | streamingMipmapsMemoryBudget: 512
179 | streamingMipmapsRenderersPerFrame: 512
180 | streamingMipmapsMaxLevelReduction: 2
181 | streamingMipmapsMaxFileIORequests: 1024
182 | particleRaycastBudget: 1024
183 | asyncUploadTimeSlice: 2
184 | asyncUploadBufferSize: 16
185 | asyncUploadPersistentBuffer: 1
186 | resolutionScalingFixedDPIFactor: 1
187 | customRenderPipeline: {fileID: 0}
188 | excludedTargetPlatforms: []
189 | - serializedVersion: 2
190 | name: Ultra
191 | pixelLightCount: 4
192 | shadows: 2
193 | shadowResolution: 2
194 | shadowProjection: 1
195 | shadowCascades: 4
196 | shadowDistance: 150
197 | shadowNearPlaneOffset: 3
198 | shadowCascade2Split: 0.33333334
199 | shadowCascade4Split: {x: 0.06666667, y: 0.2, z: 0.46666667}
200 | shadowmaskMode: 1
201 | skinWeights: 255
202 | textureQuality: 0
203 | anisotropicTextures: 2
204 | antiAliasing: 2
205 | softParticles: 1
206 | softVegetation: 1
207 | realtimeReflectionProbes: 1
208 | billboardsFaceCameraPosition: 1
209 | vSyncCount: 1
210 | lodBias: 2
211 | maximumLODLevel: 0
212 | streamingMipmapsActive: 0
213 | streamingMipmapsAddAllCameras: 1
214 | streamingMipmapsMemoryBudget: 512
215 | streamingMipmapsRenderersPerFrame: 512
216 | streamingMipmapsMaxLevelReduction: 2
217 | streamingMipmapsMaxFileIORequests: 1024
218 | particleRaycastBudget: 4096
219 | asyncUploadTimeSlice: 2
220 | asyncUploadBufferSize: 16
221 | asyncUploadPersistentBuffer: 1
222 | resolutionScalingFixedDPIFactor: 1
223 | customRenderPipeline: {fileID: 0}
224 | excludedTargetPlatforms: []
225 | m_PerPlatformDefaultQuality:
226 | Android: 2
227 | GameCoreScarlett: 5
228 | GameCoreXboxOne: 5
229 | Lumin: 5
230 | Nintendo Switch: 5
231 | PS4: 5
232 | PS5: 5
233 | Server: 0
234 | Stadia: 5
235 | Standalone: 5
236 | WebGL: 3
237 | Windows Store Apps: 5
238 | XboxOne: 5
239 | iPhone: 2
240 | tvOS: 2
241 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/SceneTemplateSettings.json:
--------------------------------------------------------------------------------
1 | {
2 | "templatePinStates": [],
3 | "dependencyTypeInfos": [
4 | {
5 | "userAdded": false,
6 | "type": "UnityEngine.AnimationClip",
7 | "ignore": false,
8 | "defaultInstantiationMode": 0,
9 | "supportsModification": true
10 | },
11 | {
12 | "userAdded": false,
13 | "type": "UnityEditor.Animations.AnimatorController",
14 | "ignore": false,
15 | "defaultInstantiationMode": 0,
16 | "supportsModification": true
17 | },
18 | {
19 | "userAdded": false,
20 | "type": "UnityEngine.AnimatorOverrideController",
21 | "ignore": false,
22 | "defaultInstantiationMode": 0,
23 | "supportsModification": true
24 | },
25 | {
26 | "userAdded": false,
27 | "type": "UnityEditor.Audio.AudioMixerController",
28 | "ignore": false,
29 | "defaultInstantiationMode": 0,
30 | "supportsModification": true
31 | },
32 | {
33 | "userAdded": false,
34 | "type": "UnityEngine.ComputeShader",
35 | "ignore": true,
36 | "defaultInstantiationMode": 1,
37 | "supportsModification": true
38 | },
39 | {
40 | "userAdded": false,
41 | "type": "UnityEngine.Cubemap",
42 | "ignore": false,
43 | "defaultInstantiationMode": 0,
44 | "supportsModification": true
45 | },
46 | {
47 | "userAdded": false,
48 | "type": "UnityEngine.GameObject",
49 | "ignore": false,
50 | "defaultInstantiationMode": 0,
51 | "supportsModification": true
52 | },
53 | {
54 | "userAdded": false,
55 | "type": "UnityEditor.LightingDataAsset",
56 | "ignore": false,
57 | "defaultInstantiationMode": 0,
58 | "supportsModification": false
59 | },
60 | {
61 | "userAdded": false,
62 | "type": "UnityEngine.LightingSettings",
63 | "ignore": false,
64 | "defaultInstantiationMode": 0,
65 | "supportsModification": true
66 | },
67 | {
68 | "userAdded": false,
69 | "type": "UnityEngine.Material",
70 | "ignore": false,
71 | "defaultInstantiationMode": 0,
72 | "supportsModification": true
73 | },
74 | {
75 | "userAdded": false,
76 | "type": "UnityEditor.MonoScript",
77 | "ignore": true,
78 | "defaultInstantiationMode": 1,
79 | "supportsModification": true
80 | },
81 | {
82 | "userAdded": false,
83 | "type": "UnityEngine.PhysicMaterial",
84 | "ignore": false,
85 | "defaultInstantiationMode": 0,
86 | "supportsModification": true
87 | },
88 | {
89 | "userAdded": false,
90 | "type": "UnityEngine.PhysicsMaterial2D",
91 | "ignore": false,
92 | "defaultInstantiationMode": 0,
93 | "supportsModification": true
94 | },
95 | {
96 | "userAdded": false,
97 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessProfile",
98 | "ignore": false,
99 | "defaultInstantiationMode": 0,
100 | "supportsModification": true
101 | },
102 | {
103 | "userAdded": false,
104 | "type": "UnityEngine.Rendering.PostProcessing.PostProcessResources",
105 | "ignore": false,
106 | "defaultInstantiationMode": 0,
107 | "supportsModification": true
108 | },
109 | {
110 | "userAdded": false,
111 | "type": "UnityEngine.Rendering.VolumeProfile",
112 | "ignore": false,
113 | "defaultInstantiationMode": 0,
114 | "supportsModification": true
115 | },
116 | {
117 | "userAdded": false,
118 | "type": "UnityEditor.SceneAsset",
119 | "ignore": false,
120 | "defaultInstantiationMode": 0,
121 | "supportsModification": false
122 | },
123 | {
124 | "userAdded": false,
125 | "type": "UnityEngine.Shader",
126 | "ignore": true,
127 | "defaultInstantiationMode": 1,
128 | "supportsModification": true
129 | },
130 | {
131 | "userAdded": false,
132 | "type": "UnityEngine.ShaderVariantCollection",
133 | "ignore": true,
134 | "defaultInstantiationMode": 1,
135 | "supportsModification": true
136 | },
137 | {
138 | "userAdded": false,
139 | "type": "UnityEngine.Texture",
140 | "ignore": false,
141 | "defaultInstantiationMode": 0,
142 | "supportsModification": true
143 | },
144 | {
145 | "userAdded": false,
146 | "type": "UnityEngine.Texture2D",
147 | "ignore": false,
148 | "defaultInstantiationMode": 0,
149 | "supportsModification": true
150 | },
151 | {
152 | "userAdded": false,
153 | "type": "UnityEngine.Timeline.TimelineAsset",
154 | "ignore": false,
155 | "defaultInstantiationMode": 0,
156 | "supportsModification": true
157 | }
158 | ],
159 | "defaultDependencyTypeInfo": {
160 | "userAdded": false,
161 | "type": "",
162 | "ignore": false,
163 | "defaultInstantiationMode": 1,
164 | "supportsModification": true
165 | },
166 | "newSceneOverride": 0
167 | }
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/TagManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!78 &1
4 | TagManager:
5 | serializedVersion: 2
6 | tags: []
7 | layers:
8 | - Default
9 | - TransparentFX
10 | - Ignore Raycast
11 | -
12 | - Water
13 | - UI
14 | -
15 | -
16 | -
17 | -
18 | -
19 | -
20 | -
21 | -
22 | -
23 | -
24 | -
25 | -
26 | -
27 | -
28 | -
29 | -
30 | -
31 | -
32 | -
33 | -
34 | -
35 | -
36 | -
37 | -
38 | -
39 | -
40 | m_SortingLayers:
41 | - name: Default
42 | uniqueID: 0
43 | locked: 0
44 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/TimeManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!5 &1
4 | TimeManager:
5 | m_ObjectHideFlags: 0
6 | Fixed Timestep: 0.02
7 | Maximum Allowed Timestep: 0.33333334
8 | m_TimeScale: 1
9 | Maximum Particle Timestep: 0.03
10 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/UnityConnectSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!310 &1
4 | UnityConnectSettings:
5 | m_ObjectHideFlags: 0
6 | serializedVersion: 1
7 | m_Enabled: 0
8 | m_TestMode: 0
9 | m_EventOldUrl: https://api.uca.cloud.unity3d.com/v1/events
10 | m_EventUrl: https://cdp.cloud.unity3d.com/v1/events
11 | m_ConfigUrl: https://config.uca.cloud.unity3d.com
12 | m_DashboardUrl: https://dashboard.unity3d.com
13 | m_TestInitMode: 0
14 | CrashReportingSettings:
15 | m_EventUrl: https://perf-events.cloud.unity3d.com
16 | m_Enabled: 0
17 | m_LogBufferSize: 10
18 | m_CaptureEditorExceptions: 1
19 | UnityPurchasingSettings:
20 | m_Enabled: 0
21 | m_TestMode: 0
22 | UnityAnalyticsSettings:
23 | m_Enabled: 0
24 | m_TestMode: 0
25 | m_InitializeOnStartup: 1
26 | m_PackageRequiringCoreStatsPresent: 0
27 | UnityAdsSettings:
28 | m_Enabled: 0
29 | m_InitializeOnStartup: 1
30 | m_TestMode: 0
31 | m_IosGameId:
32 | m_AndroidGameId:
33 | m_GameIds: {}
34 | m_GameId:
35 | PerformanceReportingSettings:
36 | m_Enabled: 0
37 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/VFXManager.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!937362698 &1
4 | VFXManager:
5 | m_ObjectHideFlags: 0
6 | m_IndirectShader: {fileID: 0}
7 | m_CopyBufferShader: {fileID: 0}
8 | m_SortShader: {fileID: 0}
9 | m_StripUpdateShader: {fileID: 0}
10 | m_RenderPipeSettingsPath:
11 | m_FixedTimeStep: 0.016666668
12 | m_MaxDeltaTime: 0.05
13 | m_CompiledVersion: 0
14 | m_RuntimeVersion: 0
15 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/VersionControlSettings.asset:
--------------------------------------------------------------------------------
1 | %YAML 1.1
2 | %TAG !u! tag:unity3d.com,2011:
3 | --- !u!890905787 &1
4 | VersionControlSettings:
5 | m_ObjectHideFlags: 0
6 | m_Mode: Visible Meta Files
7 | m_CollabEditorSettings:
8 | inProgressEnabled: 1
9 |
--------------------------------------------------------------------------------
/Unity-Twitch-Chat/ProjectSettings/XRSettings.asset:
--------------------------------------------------------------------------------
1 | {
2 | "m_SettingKeys": [
3 | "VR Device Disabled",
4 | "VR Device User Alert"
5 | ],
6 | "m_SettingValues": [
7 | "False",
8 | "False"
9 | ]
10 | }
--------------------------------------------------------------------------------