From 87f8e85a2900e74cfbcb5004811364399c4e3903 Mon Sep 17 00:00:00 2001 From: Tim Aidley Date: Wed, 9 Aug 2017 16:09:56 -0700 Subject: [PATCH] Rexport of brushes from M13. Fixes incorrect snow falling speed. Change-Id: Ibdd358cc7100f619026485f1e5e48361431edbdc --- .../Assets/Brushes/Basic/Bubbles/Bubbles.mat | 3 - .../Brushes/Basic/Bubbles/Bubbles.shader | 205 ++++++------ .../Basic/ChromaticWave/ChromaticWave.shader | 140 ++++---- .../Basic/CoarseBristles/CoarseBristles.mat | 94 +++++- .../Assets/Brushes/Basic/Disco/Disco.shader | 122 +++---- .../Brushes/Basic/DotMarker/DotMarker.mat | 94 +++++- .../Assets/Brushes/Basic/Dots/Dots.shader | 163 +++++----- .../DiffuseNoTextureDoubleSided.shader | 80 ++--- .../DoubleTaperedFlat/DoubleTaperedFlat.mat | 3 + .../DoubleTaperedMarker.mat | 3 + .../DoubleTaperedMarker.shader | 112 +++---- .../Brushes/Basic/DuctTape/DuctTape.mat | 58 +--- .../Brushes/Basic/Electricity/Electricity.mat | 3 + .../Basic/Electricity/Electricity.shader | 288 ++++++++--------- .../Assets/Brushes/Basic/Embers/Embers.mat | 3 - .../Assets/Brushes/Basic/Embers/Embers.shader | 241 +++++++------- .../Assets/Brushes/Basic/Fire/Fire.mat | 3 + .../Assets/Brushes/Basic/Fire/Fire.mat.meta | 4 - .../Assets/Brushes/Basic/Fire/Fire.shader | 172 +++++----- .../Assets/Brushes/Basic/Flat/Flat.mat | 96 +++++- .../Basic/FlatDeprecated/FlatDeprecated.mat | 94 +++++- .../Basic/Highlighter/AdditiveCutout.shader | 102 +++--- .../Brushes/Basic/Highlighter/Highlighter.mat | 3 + .../Brushes/Basic/HyperGrid/HyperGrid.mat | 3 + .../Brushes/Basic/HyperGrid/HyperGrid.shader | 154 ++++----- .../Brushes/Basic/Hypercolor/Hypercolor.mat | 3 + .../Basic/Hypercolor/Hypercolor.shader | 150 ++++----- .../Assets/Brushes/Basic/Ink/Ink.mat | 58 +--- .../Assets/Brushes/Basic/Leaves/Leaves.mat | 102 +++++- .../Assets/Brushes/Basic/Leaves/normal.png | Bin 0 -> 142238 bytes .../Brushes/Basic/Leaves/normal.png.meta | 55 ++++ .../Assets/Brushes/Basic/Light/Light.mat | 94 +++++- .../Brushes/Basic/LightWire/LightWire.shader | 164 +++++----- .../Assets/Brushes/Basic/Marker/Marker.mat | 94 +++++- .../Brushes/Basic/NeonPulse/NeonPulse.mat | 3 + .../Brushes/Basic/OilPaint/OilPaint.mat | 58 +--- .../Assets/Brushes/Basic/Paper/Paper.mat | 58 +--- .../Assets/Brushes/Basic/Plasma/Plasma.mat | 3 + .../Assets/Brushes/Basic/Plasma/Plasma.shader | 218 ++++++------- .../Brushes/Basic/Rainbow/Rainbow.mat.meta | 3 - .../Brushes/Basic/Rainbow/Rainbow.shader | 300 +++++++++--------- .../Assets/Brushes/Basic/Smoke/Smoke.shader | 208 ++++++------ .../Assets/Brushes/Basic/Snow/Snow.mat | 3 - .../Assets/Brushes/Basic/Snow/Snow.shader | 168 +++++----- .../Basic/SoftHighlighter/SoftHighlighter.mat | 3 + .../SoftHighlighter/SoftHighlighter.shader | 114 +++---- .../Brushes/Basic/Splatter/Splatter.mat | 94 +++++- .../Assets/Brushes/Basic/Stars/Stars.mat | 3 - .../Assets/Brushes/Basic/Stars/Stars.shader | 124 ++++---- .../Brushes/Basic/Streamers/Streamers.mat | 3 + .../Brushes/Basic/Streamers/Streamers.shader | 202 ++++++------ .../Assets/Brushes/Basic/Taffy/Taffy.mat | 94 +++++- .../Brushes/Basic/TaperedFlat/TaperedFlat.mat | 94 +++++- .../Basic/TaperedMarker/TaperedMarker.mat | 94 +++++- .../TaperedMarker_Flat/TaperedMarker_Flat.mat | 98 +++++- .../Brushes/Basic/ThickPaint/ThickPaint.mat | 58 +--- .../Assets/Brushes/Basic/Toon/Toon.mat | 3 - .../Assets/Brushes/Basic/Toon/Toon.shader | 223 ++++++------- .../Brushes/Basic/VelvetInk/VelvetInk.shader | 112 +++---- .../Brushes/Basic/Waveform/Waveform.mat | 3 + .../Brushes/Basic/Waveform/Waveform.shader | 136 ++++---- .../Basic/WaveformPulse/NeonPulse.shader | 90 +++--- .../Assets/Brushes/Basic/Wire/Wire.mat | 94 +++++- .../Brushes/Shared/Shaders/Bloom.shader | 110 +++---- .../Brushes/Shared/Shaders/Diffuse.shader | 50 +-- .../Shared/Shaders/DiffuseOpaque.shader | 14 +- .../Brushes/Shared/Shaders/Standard.shader | 128 ++++---- .../Brushes/Shared/Shaders/Unlit.shader | 2 +- .../Assets/Shaders/Include/Brush.cginc | 24 +- .../Assets/Shaders/Include/Particles.cginc | 76 +++-- .../Assets/Shaders/Unlit-Diffuse.shader | 66 ++-- .../ProjectSettings/ProjectSettings.asset | 11 + 72 files changed, 3542 insertions(+), 2566 deletions(-) create mode 100644 UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/normal.png create mode 100644 UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/normal.png.meta diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.mat index 5eb2f14e..480004cd 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.mat @@ -130,9 +130,6 @@ Material: - first: name: _SpecularHighlights second: 1 - - first: - name: _SpreadRate - second: 1.539 - first: name: _SpreadSize second: 1.25 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.shader index 16ed50fe..69045059 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.shader @@ -14,113 +14,108 @@ Shader "Brush/Particle/Bubbles" { Properties { - _MainTex ("Particle Texture", 2D) = "white" {} - _ScrollRate("Scroll Rate", Float) = 1.0 - _ScrollJitterIntensity("Scroll Jitter Intensity", Float) = 1.0 - _ScrollJitterFrequency("Scroll Jitter Frequency", Float) = 1.0 - _SpreadRate ("Spread Rate", Range(0.3, 5)) = 1.539 + _MainTex ("Particle Texture", 2D) = "white" {} + _ScrollRate("Scroll Rate", Float) = 1.0 + _ScrollJitterIntensity("Scroll Jitter Intensity", Float) = 1.0 + _ScrollJitterFrequency("Scroll Jitter Frequency", Float) = 1.0 + _SpreadRate ("Spread Rate", Range(0.3, 5)) = 1.539 } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True" } - Blend One One - AlphaTest Greater .01 - ColorMask RGB - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile_particles - #pragma target 3.0 - #pragma multi_compile __ TBT_LINEAR_TARGET - - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - #include "../../../Shaders/Include/Particles.cginc" - #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" - - sampler2D _MainTex; - fixed4 _TintColor; - - struct v2f { - float4 vertex : SV_POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - float3 worldPos : TEXCOORD1; - }; - - float4 _MainTex_ST; - float _ScrollRate; - float _ScrollJitterIntensity; - float _ScrollJitterFrequency; - float3 _WorldSpaceRootCameraPosition; - float _SpreadRate; - - float4 displace(float4 pos, float timeOffset) { - float t = _Time.y*_ScrollRate + timeOffset; - - pos.x += sin(t + _Time.y + pos.z * _ScrollJitterFrequency) * _ScrollJitterIntensity; - pos.z += cos(t + _Time.y + pos.x * _ScrollJitterFrequency) * _ScrollJitterIntensity; - pos.y += cos(t * 1.2 + _Time.y + pos.x * _ScrollJitterFrequency) * _ScrollJitterIntensity; - - float time = _Time.x * 5; - float d = 30; - float freq = .1; - float3 disp = float3(1,0,0) * curlX(pos.xyz * freq + time, d); - disp += float3(0,1,0) * curlY(pos.xyz * freq +time, d); - disp += float3(0,0,1) * curlZ(pos.xyz * freq + time, d); - pos.xyz += disp * 10 * kDecimetersToWorldUnits; - return pos; - } - - v2f vert (ParticleVertexWithSpread_t v) { - v2f o; - v.color = TbVertToSrgb(v.color); - float4 pos_WS = OrientParticleAndSpread_WS( - v.vid, v.corner.xyz, v.center, - v.texcoord.z /* rotation */, v.texcoord.w /* birthTime */, - v.origin, _SpreadRate); - - // Do this in scene space to avoid swimming through parameter space. - // With genius particles, we'd do this in modelspace or something similar. - // TODO(pld): object/canvas space is more invariant than scene space, - // so use OrientParticle rather than OrientParticle_WS - { - float4 pos_CS = mul(xf_I_CS, pos_WS); - pos_CS = displace(pos_CS, v.color.a * 10); - pos_WS = mul(xf_CS, pos_CS); - } - - o.vertex = mul(UNITY_MATRIX_VP, pos_WS); - o.worldPos = pos_WS; - - // Brighten up the bubbles - o.color = v.color; - o.color.a = 1; - o.texcoord = TRANSFORM_TEX(v.texcoord.xy,_MainTex); - - return o; - } - - fixed4 frag (v2f i) : SV_Target - { - float4 tex = tex2D(_MainTex, i.texcoord); - - // RGB Channels of the texture are affected by color - float3 basecolor = i.color * tex.rgb; - - // Alpha channel of the texture is not affected by color. It is the fake "highlight" bubble effect. - float3 highlightcolor = tex.a; - - float4 color = float4(basecolor + highlightcolor, 1); - return SrgbToNative(color); - } - ENDCG - } - } + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True" } + Blend One One + AlphaTest Greater .01 + ColorMask RGB + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_particles + #pragma target 3.0 + #pragma multi_compile __ TBT_LINEAR_TARGET + + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + #include "../../../Shaders/Include/Particles.cginc" + #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" + + sampler2D _MainTex; + fixed4 _TintColor; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + float4 _MainTex_ST; + float _ScrollRate; + float _ScrollJitterIntensity; + float _ScrollJitterFrequency; + float3 _WorldSpaceRootCameraPosition; + float _SpreadRate; + + float3 computeDisplacement(float3 seed, float timeOffset) { + float3 jitter; { + float t = _Time.y * _ScrollRate + timeOffset; + jitter.x = sin(t + _Time.y + seed.z * _ScrollJitterFrequency); + jitter.z = cos(t + _Time.y + seed.x * _ScrollJitterFrequency); + jitter.y = cos(t * 1.2 + _Time.y + seed.x * _ScrollJitterFrequency); + jitter *= _ScrollJitterIntensity; + } + + float3 curl; { + float3 v = (seed + jitter) * .1 + _Time.x * 5; + float d = 30; + curl = float3(curlX(v, d), curlY(v, d), curlZ(v, d)) * 10; + } + + return (jitter + curl) * kDecimetersToWorldUnits; + } + + v2f vert (ParticleVertexWithSpread_t v) { + v2f o; + v.color = TbVertToSrgb(v.color); + float birthTime = v.texcoord.w; + float rotation = v.texcoord.z; + float halfSize = GetParticleHalfSize(v.corner.xyz, v.center, birthTime); + float spreadProgress = SpreadProgress(birthTime, _SpreadRate); + float4 center = SpreadParticle(v, spreadProgress); + + float3 displacement_SS = spreadProgress * computeDisplacement(center, 1); + float3 displacement_WS = mul(xf_CS, displacement_SS); + float3 displacement_OS = mul(unity_WorldToObject, displacement_WS); + center.xyz += displacement_OS; + float4 corner = OrientParticle(center.xyz, halfSize, v.vid, rotation); + o.vertex = mul(UNITY_MATRIX_MVP, corner); + + // Brighten up the bubbles + o.color = v.color; + o.color.a = 1; + o.texcoord = TRANSFORM_TEX(v.texcoord.xy,_MainTex); + + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + float4 tex = tex2D(_MainTex, i.texcoord); + + // RGB Channels of the texture are affected by color + float3 basecolor = i.color * tex.rgb; + + // Alpha channel of the texture is not affected by color. It is the fake "highlight" bubble effect. + float3 highlightcolor = tex.a; + + float4 color = float4(basecolor + highlightcolor, 1); + return SrgbToNative(color); + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ChromaticWave/ChromaticWave.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ChromaticWave/ChromaticWave.shader index 6c5e5592..08ebafd7 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ChromaticWave/ChromaticWave.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ChromaticWave/ChromaticWave.shader @@ -14,87 +14,87 @@ Shader "Brush/Visualizer/RainbowTube" { Properties { - _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 + _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend One One //SrcAlpha One - BlendOp Add, Min - AlphaTest Greater .01 - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma target 3.0 - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #pragma target 3.0 + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One //SrcAlpha One + BlendOp Add, Min + AlphaTest Greater .01 + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" + SubShader { + Pass { - float _EmissionGain; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #pragma target 3.0 - struct v2f { - float4 vertex : POSITION; - float4 color : COLOR; - float2 texcoord : TEXCOORD0; - float4 unbloomedColor : TEXCOORD1; - }; + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" - v2f vert (appdata_t v) - { - v.color = TbVertToSrgb(v.color); - v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - o.texcoord = v.texcoord; - o.color = bloomColor(v.color, _EmissionGain); - o.unbloomedColor = v.color; - return o; - } + float _EmissionGain; - // Input color is srgb - fixed4 frag (v2f i) : COLOR - { - // Envelope - float envelope = sin(i.texcoord.x * 3.14159); - i.texcoord.y += i.texcoord.x * 3 + _BeatOutputAccum.b*3; + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 unbloomedColor : TEXCOORD1; + }; + + v2f vert (appdata_t v) + { + v.color = TbVertToSrgb(v.color); + v2f o; + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.texcoord = v.texcoord; + o.color = bloomColor(v.color, _EmissionGain); + o.unbloomedColor = v.color; + return o; + } + + // Input color is srgb + fixed4 frag (v2f i) : COLOR + { + // Envelope + float envelope = sin(i.texcoord.x * 3.14159); + i.texcoord.y += i.texcoord.x * 3 + _BeatOutputAccum.b*3; #ifdef AUDIO_REACTIVE - float waveform_r = .5*(tex2D(_WaveFormTex, float2(i.texcoord.x,0)).r - .5f); - float waveform_g = .5*(tex2D(_WaveFormTex, float2(i.texcoord.x*1.8,0)).r - .5f); - float waveform_b = .5*(tex2D(_WaveFormTex, float2(i.texcoord.x*2.4,0)).r - .5f); + float waveform_r = .5*(tex2D(_WaveFormTex, float2(i.texcoord.x,0)).r - .5f); + float waveform_g = .5*(tex2D(_WaveFormTex, float2(i.texcoord.x*1.8,0)).r - .5f); + float waveform_b = .5*(tex2D(_WaveFormTex, float2(i.texcoord.x*2.4,0)).r - .5f); #else - float waveform_r = .15 * sin( -20 * i.unbloomedColor.r * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.r); - float waveform_g = .15 * sin( -30 * i.unbloomedColor.g * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.g); - float waveform_b = .15 * sin( -40 * i.unbloomedColor.b * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.b); + float waveform_r = .15 * sin( -20 * i.unbloomedColor.r * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.r); + float waveform_g = .15 * sin( -30 * i.unbloomedColor.g * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.g); + float waveform_b = .15 * sin( -40 * i.unbloomedColor.b * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.b); #endif - i.texcoord.y = fmod(i.texcoord.y + i.texcoord.x, 1); - float procedural_line_r = saturate(1 - 40*abs(i.texcoord.y - .5 + waveform_r)); - float procedural_line_g = saturate(1 - 40*abs(i.texcoord.y - .5 + waveform_g)); - float procedural_line_b = saturate(1 - 40*abs(i.texcoord.y - .5 + waveform_b)); - float4 color = procedural_line_r * float4(1,0,0,0) + procedural_line_g * float4(0,1,0,0) + procedural_line_b * float4(0,0,1,0); - color.w = 1; - color = i.color * color; + i.texcoord.y = fmod(i.texcoord.y + i.texcoord.x, 1); + float procedural_line_r = saturate(1 - 40*abs(i.texcoord.y - .5 + waveform_r)); + float procedural_line_g = saturate(1 - 40*abs(i.texcoord.y - .5 + waveform_g)); + float procedural_line_b = saturate(1 - 40*abs(i.texcoord.y - .5 + waveform_b)); + float4 color = procedural_line_r * float4(1,0,0,0) + procedural_line_g * float4(0,1,0,0) + procedural_line_b * float4(0,0,1,0); + color.w = 1; + color = i.color * color; - color = float4(color.rgb * color.a, 1.0); - color = SrgbToNative(color); - return color; - } - ENDCG - } - } + color = float4(color.rgb * color.a, 1.0); + color = SrgbToNative(color); + return color; + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/CoarseBristles/CoarseBristles.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/CoarseBristles/CoarseBristles.mat index b90a3741..f11cb410 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/CoarseBristles/CoarseBristles.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/CoarseBristles/CoarseBristles.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: CoarseBristles m_Shader: {fileID: 4800000, guid: 561cd39ab4e063843a09f5c11c3a8531, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 2800000, guid: 511e136566fbfc241b63ff2207dbcafe, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.25 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Disco/Disco.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Disco/Disco.shader index 43eab7db..ae4ebd58 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Disco/Disco.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Disco/Disco.shader @@ -13,76 +13,76 @@ // limitations under the License. Shader "Brush/Disco" { - Properties { - _Color ("Main Color", Color) = (1,1,1,1) - _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0) - _Shininess ("Shininess", Range (0.01, 1)) = 0.078125 - _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {} - _BumpMap ("Normalmap", 2D) = "bump" {} - } - SubShader { - Cull Back - CGPROGRAM - #pragma target 3.0 - #pragma surface surf StandardSpecular vertex:vert noshadow - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "../../../Shaders/Include/Brush.cginc" + Properties { + _Color ("Main Color", Color) = (1,1,1,1) + _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0) + _Shininess ("Shininess", Range (0.01, 1)) = 0.078125 + _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {} + _BumpMap ("Normalmap", 2D) = "bump" {} + } + SubShader { + Cull Back + CGPROGRAM + #pragma target 3.0 + #pragma surface surf StandardSpecular vertex:vert noshadow + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "../../../Shaders/Include/Brush.cginc" + + struct Input { + float2 uv_MainTex; + float2 uv_BumpMap; + float4 color : Color; + float3 worldPos; + }; - struct Input { - float2 uv_MainTex; - float2 uv_BumpMap; - float4 color : Color; - float3 worldPos; - }; + sampler2D _MainTex; + sampler2D _BumpMap; + fixed4 _Color; + half _Shininess; - sampler2D _MainTex; - sampler2D _BumpMap; - fixed4 _Color; - half _Shininess; + void vert (inout appdata_full v) { + v.color = TbVertToNative(v.color); + float t, uTileRate, waveIntensity; - void vert (inout appdata_full v) { - v.color = TbVertToNative(v.color); - float t, uTileRate, waveIntensity; - - float radius = v.texcoord.z; + float radius = v.texcoord.z; #ifdef AUDIO_REACTIVE - t = _BeatOutputAccum.z * 5; - uTileRate = 5; - waveIntensity = (_PeakBandLevels.y * .8 + .5); - float waveform = tex2Dlod(_WaveFormTex, float4(v.texcoord.x * 2, 0, 0, 0)).b - .5f; - v.vertex.xyz += waveform * v.normal.xyz * .2; -#else - t = _Time.z; - uTileRate = 10; - waveIntensity = .6; + t = _BeatOutputAccum.z * 5; + uTileRate = 5; + waveIntensity = (_PeakBandLevels.y * .8 + .5); + float waveform = tex2Dlod(_WaveFormTex, float4(v.texcoord.x * 2, 0, 0, 0)).b - .5f; + v.vertex.xyz += waveform * v.normal.xyz * .2; +#else + t = _Time.z; + uTileRate = 10; + waveIntensity = .6; #endif - // Ensure the t parameter wraps (1.0 becomes 0.0) to avoid cracks at the seam. - float theta = fmod(v.texcoord.y, 1); - v.vertex.xyz += pow(1 -(sin(t + v.texcoord.x * uTileRate + theta * 10) + 1),2) - * v.normal.xyz * waveIntensity - * radius; - } + // Ensure the t parameter wraps (1.0 becomes 0.0) to avoid cracks at the seam. + float theta = fmod(v.texcoord.y, 1); + v.vertex.xyz += pow(1 -(sin(t + v.texcoord.x * uTileRate + theta * 10) + 1),2) + * v.normal.xyz * waveIntensity + * radius; + } - // Input color is _native_ - void surf (Input IN, inout SurfaceOutputStandardSpecular o) { - fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); - o.Albedo = tex.rgb * _Color.rgb * IN.color.rgb; - o.Smoothness = _Shininess; - o.Specular = _SpecColor * IN.color.rgb; - o.Normal = float3(0,0,1); + // Input color is _native_ + void surf (Input IN, inout SurfaceOutputStandardSpecular o) { + fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); + o.Albedo = tex.rgb * _Color.rgb * IN.color.rgb; + o.Smoothness = _Shininess; + o.Specular = _SpecColor * IN.color.rgb; + o.Normal = float3(0,0,1); - // XXX need to convert world normal to tangent space normal somehow... - float3 worldNormal = normalize(cross(ddy(IN.worldPos), ddx(IN.worldPos))); - o.Normal = -cross(cross(o.Normal, worldNormal), worldNormal); - o.Normal = normalize(o.Normal); + // XXX need to convert world normal to tangent space normal somehow... + float3 worldNormal = normalize(cross(ddy(IN.worldPos), ddx(IN.worldPos))); + o.Normal = -cross(cross(o.Normal, worldNormal), worldNormal); + o.Normal = normalize(o.Normal); - // Add a fake "disco ball" hot spot - float fakeLight = pow( abs(dot(worldNormal, float3(0,1,0))),100); - o.Emission = IN.color.rgb * fakeLight * 200; - } - ENDCG + // Add a fake "disco ball" hot spot + float fakeLight = pow( abs(dot(worldNormal, float3(0,1,0))),100); + o.Emission = IN.color.rgb * fakeLight * 200; + } + ENDCG } FallBack "Transparent/Cutout/VertexLit" diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DotMarker/DotMarker.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DotMarker/DotMarker.mat index 700316da..c96aa6a7 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DotMarker/DotMarker.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DotMarker/DotMarker.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: DotMarker m_Shader: {fileID: 4800000, guid: 0688c89ab91f95a49a7395fe0da3a0a6, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 2800000, guid: e4cba7db327fac04f9f443913ee51fc0, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.5 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Dots/Dots.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Dots/Dots.shader index 985b3f95..fdf5a3a1 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Dots/Dots.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Dots/Dots.shader @@ -16,101 +16,100 @@ Shader "Brush/Visualizer/Dots" { Properties { - _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) - _MainTex ("Particle Texture", 2D) = "white" {} - _WaveformFreq("Waveform Freq", Float) = 1 - _WaveformIntensity("Waveform Intensity", Vector) = (0,1,0,0) - _BaseGain("Base Gain", Float) = 0 - _EmissionGain("Emission Gain", Float) = 0 + _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex ("Particle Texture", 2D) = "white" {} + _WaveformFreq("Waveform Freq", Float) = 1 + _WaveformIntensity("Waveform Intensity", Vector) = (0,1,0,0) + _BaseGain("Base Gain", Float) = 0 + _EmissionGain("Emission Gain", Float) = 0 } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True" } - Blend One One - BlendOp Add, Min - AlphaTest Greater .01 - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True" } + Blend One One + BlendOp Add, Min + AlphaTest Greater .01 + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - SubShader { - Pass { + SubShader { + Pass { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma target 3.0 - #pragma glsl - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - #include "../../../Shaders/Include/Particles.cginc" - #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma glsl + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + #include "../../../Shaders/Include/Particles.cginc" + #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" - sampler2D _MainTex; - fixed4 _TintColor; + sampler2D _MainTex; + fixed4 _TintColor; - struct v2f { - float4 vertex : SV_POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - float waveform : TEXCOORD1; - }; + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + float waveform : TEXCOORD1; + }; - float4 _MainTex_ST; - float _WaveformFreq; - float4 _WaveformIntensity; - float _EmissionGain; - float _BaseGain; + float4 _MainTex_ST; + float _WaveformFreq; + float4 _WaveformIntensity; + float _EmissionGain; + float _BaseGain; - v2f vert (ParticleVertex_t v) - { - v.color = TbVertToSrgb(v.color); - v2f o; - float4 worldPos = OrientParticle_WS( - v.vid, v.corner.xyz, v.center, - v.texcoord.z /* rotation */, v.texcoord.w /* birthTime */); - - float waveform = 0; - float4 dispVec = float4(0,0,0,0); - // Subtract out the Canvas space pose to keep displacement relative to the stroke - // when transforming (e.g. apply displacement in an immutable space). - // TODO(pld): object/canvas space is more invariant than scene space, - // so use OrientParticle rather than OrientParticle_WS + v2f vert (ParticleVertex_t v) + { + v.color = TbVertToSrgb(v.color); + v2f o; + float birthTime = v.texcoord.w; + float rotation = v.texcoord.z; + float halfSize = GetParticleHalfSize(v.corner.xyz, v.center, birthTime); + float4 center = float4(v.center.xyz, 1); + float4 corner = OrientParticle(center.xyz, halfSize, v.vid, rotation); + float waveform = 0; + // TODO: displacement should happen before orientation #ifdef AUDIO_REACTIVE - waveform = tex2Dlod(_FFTTex, float4(fmod(worldPos.x * _WaveformFreq + _BeatOutputAccum.z*.5,1),0,0,0) ).b * .25; - dispVec.xyz += waveform * _WaveformIntensity.xyz; + float4 dispVec = float4(0,0,0,0); + float4 corner_WS = mul(unity_ObjectToWorld, corner); + // TODO(pld): worldspace is almost certainly incorrect: use scene or object? + waveform = tex2Dlod(_FFTTex, float4(fmod(corner_WS.x * _WaveformFreq + _BeatOutputAccum.z*.5,1),0,0,0) ).b * .25; + dispVec.xyz += waveform * _WaveformIntensity.xyz; + corner = corner + dispVec; #endif + o.vertex = mul(UNITY_MATRIX_MVP, corner); + o.color = v.color * _BaseGain; + o.texcoord = TRANSFORM_TEX(v.texcoord.xy,_MainTex); + o.waveform = waveform * 15; + return o; + } - worldPos += mul(xf_CS, dispVec); - o.vertex = mul(UNITY_MATRIX_VP, worldPos); - o.color = v.color * _BaseGain; - o.texcoord = TRANSFORM_TEX(v.texcoord.xy,_MainTex); - o.waveform = waveform * 15; - return o; - } - - // Input color is srgb - fixed4 frag (v2f i) : SV_Target - { + // Input color is srgb + fixed4 frag (v2f i) : SV_Target + { #ifdef AUDIO_REACTIVE - // Deform uv's by waveform displacement amount vertically - // Envelop by "V" UV to keep the edges clean - float vDistance = abs(i.texcoord.y - .5)*2; - float vStretched = (i.texcoord.y - 0.5) * (.5 - abs(i.waveform)) * 2 + 0.5; - i.texcoord.y = lerp(vStretched, i.texcoord.y, vDistance); + // Deform uv's by waveform displacement amount vertically + // Envelop by "V" UV to keep the edges clean + float vDistance = abs(i.texcoord.y - .5)*2; + float vStretched = (i.texcoord.y - 0.5) * (.5 - abs(i.waveform)) * 2 + 0.5; + i.texcoord.y = lerp(vStretched, i.texcoord.y, vDistance); #endif - float4 tex = tex2D(_MainTex, i.texcoord); - float4 c = i.color * _TintColor * tex; - - // Only alpha channel receives emission boost - c.rgb += c.rgb * c.a * _EmissionGain; - c.a = 1; - c = SrgbToNative(c); - return float4(c.rgb, 1.0); - } - ENDCG - } - } + float4 tex = tex2D(_MainTex, i.texcoord); + float4 c = i.color * _TintColor * tex; + + // Only alpha channel receives emission boost + c.rgb += c.rgb * c.a * _EmissionGain; + c.a = 1; + c = SrgbToNative(c); + return float4(c.rgb, 1.0); + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DiffuseNoTextureDoubleSided.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DiffuseNoTextureDoubleSided.shader index 8459e49f..0616a8e1 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DiffuseNoTextureDoubleSided.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DiffuseNoTextureDoubleSided.shader @@ -14,58 +14,58 @@ Shader "Brush/Special/DiffuseNoTextureDoubleSided" { Properties { - _Color ("Main Color", Color) = (1,1,1,1) + _Color ("Main Color", Color) = (1,1,1,1) } SubShader { - Cull Off - Tags{ "DisableBatching" = "True" } + Cull Off + Tags{ "DisableBatching" = "True" } - CGPROGRAM - #pragma surface surf Lambert vertex:vert addshadow - #pragma target 3.0 - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "../../../Shaders/Include/Brush.cginc" + CGPROGRAM + #pragma surface surf Lambert vertex:vert addshadow + #pragma target 3.0 + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "../../../Shaders/Include/Brush.cginc" - fixed4 _Color; + fixed4 _Color; - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float3 normal : NORMAL; - float4 tangent : TANGENT; - float2 texcoord0 : TEXCOORD0; - float4 texcoord1 : TEXCOORD1; - float4 texcoord2 : TEXCOORD2; - }; + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + float4 tangent : TANGENT; + float2 texcoord0 : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + float4 texcoord2 : TEXCOORD2; + }; - struct Input { - float2 uv_MainTex; - float4 color : COLOR; - fixed vface : VFACE; - }; + struct Input { + float2 uv_MainTex; + float4 color : COLOR; + fixed vface : VFACE; + }; - void vert (inout appdata_t v, out Input o) { + void vert (inout appdata_t v, out Input o) { - // - // XXX - THIS TAPERING CODE SHOULD BE REMOVED ONCE THE TAPERING IS DONE IN THE GEOMETRY GENERATION - // THE SHADER WILL REMAIN AS A SIMPLE "DiffuseNoTextureDoubleSided" SHADER. - // + // + // XXX - THIS TAPERING CODE SHOULD BE REMOVED ONCE THE TAPERING IS DONE IN THE GEOMETRY GENERATION + // THE SHADER WILL REMAIN AS A SIMPLE "DiffuseNoTextureDoubleSided" SHADER. + // - UNITY_INITIALIZE_OUTPUT(Input, o); - float envelope = sin(v.texcoord0.x * 3.14159); - float widthMultiplier = 1 - envelope; - v.vertex.xyz += -v.texcoord1 * widthMultiplier; - v.color = TbVertToNative(v.color); - } + UNITY_INITIALIZE_OUTPUT(Input, o); + float envelope = sin(v.texcoord0.x * 3.14159); + float widthMultiplier = 1 - envelope; + v.vertex.xyz += -v.texcoord1 * widthMultiplier; + v.color = TbVertToNative(v.color); + } - void surf (Input IN, inout SurfaceOutput o) { - fixed4 c = _Color; - o.Normal = float3(0,0,IN.vface); - o.Albedo = c.rgb * IN.color.rgb; - } - ENDCG + void surf (Input IN, inout SurfaceOutput o) { + fixed4 c = _Color; + o.Normal = float3(0,0,IN.vface); + o.Albedo = c.rgb * IN.color.rgb; + } + ENDCG } Fallback "Transparent/Cutout/VertexLit" diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DoubleTaperedFlat.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DoubleTaperedFlat.mat index 354013bf..40bb8dbd 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DoubleTaperedFlat.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedFlat/DoubleTaperedFlat.mat @@ -71,3 +71,6 @@ Material: - first: name: _TintColor second: {r: 0.99999994, g: 0.99999994, b: 0.99999994, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.mat index ae209cf7..503a5ebc 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.mat @@ -68,3 +68,6 @@ Material: - first: name: _TintColor second: {r: 0.99999994, g: 0.99999994, b: 0.99999994, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.shader index 3655c132..95a1b8db 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DoubleTaperedMarker/DoubleTaperedMarker.shader @@ -17,67 +17,67 @@ Properties { } Category { - Cull Off Lighting Off - - SubShader { - Tags{ "DisableBatching" = "True" } - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma target 3.0 - #pragma multi_compile_particles - #pragma multi_compile_fog - #pragma multi_compile __ TBT_LINEAR_TARGET + Cull Off Lighting Off - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" + SubShader { + Tags{ "DisableBatching" = "True" } + Pass { - sampler2D _MainTex; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord0 : TEXCOORD0; - float3 texcoord1 : TEXCOORD1; //per vert offset vector - }; + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_particles + #pragma multi_compile_fog + #pragma multi_compile __ TBT_LINEAR_TARGET - struct v2f { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - UNITY_FOG_COORDS(1) - }; - - v2f vert (appdata_t v) - { + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" - // - // XXX - THIS SHADER SHOULD BE DELETED AFTER WE TAPERING IS DONE IN THE GEOMETRY GENERATION - // + sampler2D _MainTex; - v2f o; - float envelope = sin(v.texcoord0.x * 3.14159); - float widthMultiplier = 1 - envelope; - v.vertex.xyz += -v.texcoord1 * widthMultiplier; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - o.color = TbVertToNative(v.color); - o.texcoord = v.texcoord0; - UNITY_TRANSFER_FOG(o, o.vertex); - return o; - } - - fixed4 frag (v2f i) : COLOR - { - - UNITY_APPLY_FOG(i.fogCoord, i.color.rgb); - return float4(i.color.rgb, 1); - - } + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord0 : TEXCOORD0; + float3 texcoord1 : TEXCOORD1; //per vert offset vector + }; - ENDCG - } - } + struct v2f { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_FOG_COORDS(1) + }; + + v2f vert (appdata_t v) + { + + // + // XXX - THIS SHADER SHOULD BE DELETED AFTER WE TAPERING IS DONE IN THE GEOMETRY GENERATION + // + + v2f o; + float envelope = sin(v.texcoord0.x * 3.14159); + float widthMultiplier = 1 - envelope; + v.vertex.xyz += -v.texcoord1 * widthMultiplier; + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.color = TbVertToNative(v.color); + o.texcoord = v.texcoord0; + UNITY_TRANSFER_FOG(o, o.vertex); + return o; + } + + fixed4 frag (v2f i) : COLOR + { + + UNITY_APPLY_FOG(i.fogCoord, i.color.rgb); + return float4(i.color.rgb, 1); + + } + + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DuctTape/DuctTape.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DuctTape/DuctTape.mat index 3e949867..eaf439a4 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DuctTape/DuctTape.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/DuctTape/DuctTape.mat @@ -8,9 +8,9 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: DuctTape m_Shader: {fileID: 4800000, guid: 6af6ca8fad7576846a6a44f5c6d7bf6b, type: 3} - m_ShaderKeywords: _ALPHATEST_ON _LIGHTMAPPING_REALTIME _NORMALMAP - m_LightmapFlags: 5 - m_CustomRenderQueue: 2450 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 @@ -45,12 +45,6 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - - first: - name: _Illum - second: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - first: name: _MainTex second: @@ -75,19 +69,10 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - - first: - name: _SpecGlossMap - second: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} m_Floats: - - first: - name: _AlphaTestRef - second: 0.541 - first: name: _BumpScale - second: 1.12 + second: 1 - first: name: _Cutoff second: 0.2 @@ -98,29 +83,20 @@ Material: name: _DstBlend second: 0 - first: - name: _EmissionGain - second: 0.5 - - first: - name: _EmissionLM - second: 0 - - first: - name: _EmissionScaleUI - second: 0 + name: _GlossMapScale + second: 1 - first: name: _Glossiness - second: 0.644 - - first: - name: _InvFade - second: 1 + second: 0.5 - first: - name: _Lightmapping + name: _GlossyReflections second: 1 - first: name: _Metallic - second: 0.204 + second: 0 - first: name: _Mode - second: 1 + second: 0 - first: name: _OcclusionStrength second: 1 @@ -130,6 +106,12 @@ Material: - first: name: _Shininess second: 0.414 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 - first: name: _SrcBlend second: 1 @@ -145,13 +127,7 @@ Material: second: {r: 0.7058824, g: 0.7058824, b: 0.7058824, a: 1} - first: name: _EmissionColor - second: {r: 0, g: 0, b: 0, a: 0} - - first: - name: _EmissionColorUI - second: {r: 1, g: 1, b: 1, a: 1} + second: {r: 0, g: 0, b: 0, a: 1} - first: name: _SpecColor second: {r: 0.5372549, g: 0.5372549, b: 0.5372549, a: 1} - - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.mat index 943090d6..2ecec5d4 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.mat @@ -68,3 +68,6 @@ Material: - first: name: _TintColor second: {r: 0.99999994, g: 0.99999994, b: 0.99999994, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.shader index c29992ad..330eecb0 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Electricity/Electricity.shader @@ -14,158 +14,158 @@ Shader "Brush/Special/Electricity" { Properties { - _MainTex ("Color", 2D) = "white" {} - _DisplacementIntensity("Displacement", Float) = .1 + _MainTex ("Color", 2D) = "white" {} + _DisplacementIntensity("Displacement", Float) = .1 _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 } CGINCLUDE - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float3 normal : NORMAL; - float3 tangent : TANGENT; - float2 texcoord0 : TEXCOORD0; - float3 texcoord1 : TEXCOORD1; - }; - - sampler2D _MainTex; - half _DisplacementIntensity; - half _EmissionGain; - - struct v2f { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; - - float3 displacement(float3 pos, float mod) { - // Noise - float time = _Time.w; - float d = 30; - float freq = .1 + mod; - float3 disp = float3(1,0,0) * curlX(pos * freq + time, d); - disp += float3(0,1,0) * curlY(pos * freq + time, d); - disp += float3(0,0,1) * curlZ(pos * freq + time, d); - - time = _Time.w*1.777; - d = 100; - freq = .2 + mod; - float3 disp2 = float3(1,0,0) * curlX(pos * freq + time, d); - disp2 += float3(0,1,0) * curlY(pos * freq + time, d); - disp2 += float3(0,0,1) * curlZ(pos * freq + time, d); - disp = disp * 3 + disp2 * 7; - return disp; - } - - - v2f vertModulated (appdata_t v, float mod, float dir) - { - v.color = TbVertToSrgb(v.color); - v2f o; - float envelope = sin(v.texcoord0.x * (3.14159)); - float envelopePow = (1-pow(1 - envelope, 10)); - - float3 offsetFromMiddleToEdge_CS = v.texcoord1; - float widthiness_CS = length(offsetFromMiddleToEdge_CS) / .02; - float3 midpointPos_CS = v.vertex.xyz - offsetFromMiddleToEdge_CS; - float3 disp = displacement(midpointPos_CS / widthiness_CS, mod); - disp *= widthiness_CS; - - float waveform = 0; + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + float3 tangent : TANGENT; + float2 texcoord0 : TEXCOORD0; + float3 texcoord1 : TEXCOORD1; + }; + + sampler2D _MainTex; + half _DisplacementIntensity; + half _EmissionGain; + + struct v2f { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + float3 displacement(float3 pos, float mod) { + // Noise + float time = _Time.w; + float d = 30; + float freq = .1 + mod; + float3 disp = float3(1,0,0) * curlX(pos * freq + time, d); + disp += float3(0,1,0) * curlY(pos * freq + time, d); + disp += float3(0,0,1) * curlZ(pos * freq + time, d); + + time = _Time.w*1.777; + d = 100; + freq = .2 + mod; + float3 disp2 = float3(1,0,0) * curlX(pos * freq + time, d); + disp2 += float3(0,1,0) * curlY(pos * freq + time, d); + disp2 += float3(0,0,1) * curlZ(pos * freq + time, d); + disp = disp * 3 + disp2 * 7; + return disp; + } + + + v2f vertModulated (appdata_t v, float mod, float dir) + { + v.color = TbVertToSrgb(v.color); + v2f o; + float envelope = sin(v.texcoord0.x * (3.14159)); + float envelopePow = (1-pow(1 - envelope, 10)); + + float3 offsetFromMiddleToEdge_CS = v.texcoord1; + float widthiness_CS = length(offsetFromMiddleToEdge_CS) / .02; + float3 midpointPos_CS = v.vertex.xyz - offsetFromMiddleToEdge_CS; + float3 disp = displacement(midpointPos_CS / widthiness_CS, mod); + disp *= widthiness_CS; + + float waveform = 0; #ifdef AUDIO_REACTIVE - disp *= (_BeatOutput.x * 1 + .5); - waveform = (tex2Dlod(_WaveFormTex, float4(v.texcoord0.x,0,0,0)).r - .5f); - disp.y += waveform * .1; - v.color = v.color*.5 + v.color*_BeatOutput.z*.5; + disp *= (_BeatOutput.x * 1 + .5); + waveform = (tex2Dlod(_WaveFormTex, float4(v.texcoord0.x,0,0,0)).r - .5f); + disp.y += waveform * .1; + v.color = v.color*.5 + v.color*_BeatOutput.z*.5; #endif - // This recreates the standard ribbon position with some tapering at edges - v.vertex.xyz = midpointPos_CS + offsetFromMiddleToEdge_CS * envelopePow; - - // This adds curl noise - v.vertex.xyz += disp * _DisplacementIntensity * envelopePow; - - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - o.color = bloomColor(v.color, _EmissionGain); - o.texcoord = v.texcoord0; - - return o; - } - - v2f vert_1 (appdata_t v) - { - return vertModulated(v, 1, 1); - } - - v2f vert_2 (appdata_t v) - { - return vertModulated(v, 1.333, -1); - } - - v2f vert_3 (appdata_t v) - { - return vertModulated(v, 1.77, -1); - } - - // Input color is srgb - fixed4 frag (v2f i) : COLOR - { - // interior procedural line - float procedural = ( abs(i.texcoord.y - 0.5) < .1 ) ? 2 : 0; - i.color.a = 1; // kill any other alpha values that may come into this brush - float4 c = i.color + i.color * procedural; - c = float4(c.rgb * c.a, 1.0); - c = SrgbToNative(c); - return c; - } + // This recreates the standard ribbon position with some tapering at edges + v.vertex.xyz = midpointPos_CS + offsetFromMiddleToEdge_CS * envelopePow; + + // This adds curl noise + v.vertex.xyz += disp * _DisplacementIntensity * envelopePow; + + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.color = bloomColor(v.color, _EmissionGain); + o.texcoord = v.texcoord0; + + return o; + } + + v2f vert_1 (appdata_t v) + { + return vertModulated(v, 1, 1); + } + + v2f vert_2 (appdata_t v) + { + return vertModulated(v, 1.333, -1); + } + + v2f vert_3 (appdata_t v) + { + return vertModulated(v, 1.77, -1); + } + + // Input color is srgb + fixed4 frag (v2f i) : COLOR + { + // interior procedural line + float procedural = ( abs(i.texcoord.y - 0.5) < .1 ) ? 2 : 0; + i.color.a = 1; // kill any other alpha values that may come into this brush + float4 c = i.color + i.color * procedural; + c = float4(c.rgb * c.a, 1.0); + c = SrgbToNative(c); + return c; + } ENDCG Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend One One //SrcAlpha One - BlendOp Add, Min - AlphaTest Greater .01 - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - - SubShader { - Pass { - CGPROGRAM - #pragma vertex vert_1 - #pragma fragment frag - #pragma target 3.0 - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - ENDCG - } - - Pass { - CGPROGRAM - #pragma vertex vert_2 - #pragma fragment frag - #pragma target 3.0 - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - ENDCG - } - - Pass { - CGPROGRAM - #pragma vertex vert_3 - #pragma fragment frag - #pragma target 3.0 - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - ENDCG - } - } + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One //SrcAlpha One + BlendOp Add, Min + AlphaTest Greater .01 + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } + + + SubShader { + Pass { + CGPROGRAM + #pragma vertex vert_1 + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + ENDCG + } + + Pass { + CGPROGRAM + #pragma vertex vert_2 + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + ENDCG + } + + Pass { + CGPROGRAM + #pragma vertex vert_3 + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.mat index 5e399476..8a065cd4 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.mat @@ -130,9 +130,6 @@ Material: - first: name: _SpecularHighlights second: 1 - - first: - name: _SpreadRate - second: 1.539 - first: name: _SpreadSize second: 1 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.shader index a72df67a..03060a95 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.shader @@ -14,136 +14,141 @@ Shader "Brush/Particle/Embers" { Properties { - _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) - _MainTex ("Particle Texture", 2D) = "white" {} - _ScrollRate("Scroll Rate", Float) = 1.0 - _ScrollDistance("Scroll Distance", Vector) = (1.0, 0, 0) - _ScrollJitterIntensity("Scroll Jitter Intensity", Float) = 1.0 - _ScrollJitterFrequency("Scroll Jitter Frequency", Float) = 1.0 - _SpreadRate ("Spread Rate", Range(0.3, 5)) = 1.539 + _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex ("Particle Texture", 2D) = "white" {} + _ScrollRate("Scroll Rate", Float) = 1.0 + _ScrollDistance("Scroll Distance", Vector) = (1.0, 0, 0) + _ScrollJitterIntensity("Scroll Jitter Intensity", Float) = 1.0 + _ScrollJitterFrequency("Scroll Jitter Frequency", Float) = 1.0 + _SpreadRate ("Spread Rate", Range(0.3, 5)) = 1.539 } - + Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True" } - Blend One One // SrcAlpha One - BlendOp Add, Min - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #pragma target 3.0 - - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - #include "../../../Shaders/Include/Particles.cginc" - #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" - - sampler2D _MainTex; - fixed4 _TintColor; - - struct v2f { - float4 vertex : SV_POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; - - float4 _MainTex_ST; - float _ScrollRate; - // In decimeters - float3 _ScrollDistance; - // Amplitude: in decimeters - float _ScrollJitterIntensity; - float _ScrollJitterFrequency; - float _SpreadRate; - - // pos and seed should be stable values. - // seed is a value in [0, 1] - // t01 is a time value in [0, 1] - float3 ComputeDisplacement(float3 pos, float seed, float t01) { - float t2 = _Time.y; - - // Animate the motion of the embers - // Accumulate all displacement into a common, pre-transformed space. - float4 dispVec = float4(_ScrollDistance, 0.0) * t01; - - dispVec.x += sin(t01 * _ScrollJitterFrequency + seed * 100 + t2 + pos.z) * _ScrollJitterIntensity; - dispVec.y += (fmod(seed * 100, 1) - 0.5) * _ScrollDistance.y * t01; - dispVec.z += cos(t01 * _ScrollJitterFrequency + seed * 100 + t2 + pos.x) * _ScrollJitterIntensity; + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" "DisableBatching"="True" } + Blend One One // SrcAlpha One + BlendOp Add, Min + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #pragma target 3.0 + + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + #include "../../../Shaders/Include/Particles.cginc" + #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" + + sampler2D _MainTex; + fixed4 _TintColor; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + float4 _MainTex_ST; + float _ScrollRate; + // In decimeters + float3 _ScrollDistance; + // Amplitude: in decimeters + float _ScrollJitterIntensity; + float _ScrollJitterFrequency; + float _SpreadRate; + + // pos and seed should be stable values. + // seed is a value in [0, 1] + // t01 is a time value in [0, 1] + float3 ComputeDisplacement(float3 pos, float seed, float t01) { + float t2 = _Time.y; + + // Animate the motion of the embers + // Accumulate all displacement into a common, pre-transformed space. + float4 dispVec = float4(_ScrollDistance, 0.0) * t01; + + dispVec.x += sin(t01 * _ScrollJitterFrequency + seed * 100 + t2 + pos.z) * _ScrollJitterIntensity; + dispVec.y += (fmod(seed * 100, 1) - 0.5) * _ScrollDistance.y * t01; + dispVec.z += cos(t01 * _ScrollJitterFrequency + seed * 100 + t2 + pos.x) * _ScrollJitterIntensity; #ifdef AUDIO_REACTIVE - float fft = (tex2Dlod(_FFTTex, float4(pos.y,0,0,0)).b)*2 + .1; - dispVec.y += fft; -#endif - return dispVec * kDecimetersToWorldUnits; - } - - v2f vert (ParticleVertexWithSpread_t v) { - v.color = TbVertToSrgb(v.color); - v2f o; - // Used as a random-ish seed for various calculations - float seed = v.color.a; - float t01 = fmod(_Time.y*_ScrollRate + seed * 10, 1); - v.corner = OrientParticleAndSpread( - v.vid, v.corner.xyz, v.center, - v.texcoord.z /* rotation */, v.texcoord.w /* birthTime */, - v.origin, _SpreadRate); - float3 disp = ComputeDisplacement(v.center, seed, t01); - - // Ramp color from bright to dark over particle lifetime - float3 incolor = v.color.rgb; - float t_minus_1 = 1-t01; - float sparkle = (pow(abs(sin(_Time.y * 3 + seed * 10)), 30)); - v.color.rgb += pow(t_minus_1,10)*incolor*200; - v.color.rgb += incolor * sparkle * 50; + float fft = (tex2Dlod(_FFTTex, float4(pos.y,0,0,0)).b)*2 + .1; + dispVec.y += fft; +#endif + return dispVec * kDecimetersToWorldUnits; + } + + v2f vert (ParticleVertexWithSpread_t v) { + v.color = TbVertToSrgb(v.color); + v2f o; + // Used as a random-ish seed for various calculations + float seed = v.color.a; + float t01 = fmod(_Time.y*_ScrollRate + seed * 10, 1); + float birthTime = v.texcoord.w; + float rotation = v.texcoord.z; + float halfSize = GetParticleHalfSize(v.corner.xyz, v.center, birthTime); + float spreadProgress = SpreadProgress(birthTime, _SpreadRate); + float4 center = SpreadParticle(v, spreadProgress); + float3 disp = ComputeDisplacement(center.xyz, seed, t01); + disp = spreadProgress * disp; + + // Ramp color from bright to dark over particle lifetime + float3 incolor = v.color.rgb; + float t_minus_1 = 1-t01; + float sparkle = (pow(abs(sin(_Time.y * 3 + seed * 10)), 30)); + v.color.rgb += pow(t_minus_1,10)*incolor*200; + v.color.rgb += incolor * sparkle * 50; #ifdef AUDIO_REACTIVE - // Additional color boost from beat detection - v.color.rgb = v.color.rgb * .5 + 2*_BeatOutput.x * v.color.rgb; + // Additional color boost from beat detection + v.color.rgb = v.color.rgb * .5 + 2*_BeatOutput.x * v.color.rgb; #endif - // Dim over lifetime - v.color.rgb *= incolor * pow (1 - t01, 2)*5; + // Dim over lifetime + v.color.rgb *= incolor * pow (1 - t01, 2)*5; - // Custom vertex animation + // Custom vertex animation #if 1 - // Displacement is in scene space - // Note that xf_CS is actually scene, not canvas - // The problem with this is that if you scale up a layer, the particles - // get big but the overall motion stays the same. - float4 pos_WS = mul(unity_ObjectToWorld, v.corner); - pos_WS.xyz += mul(xf_CS, disp); - o.vertex = mul(UNITY_MATRIX_VP, pos_WS); + // Displacement is in scene space + // Note that xf_CS is actually scene, not canvas + // The problem with this is that if you scale up a layer, the particles + // get big but the overall motion stays the same. + float4 center_WS = mul(unity_ObjectToWorld, center); + center_WS.xyz += mul(xf_CS, disp); + float4 corner_WS = OrientParticle_WS(center_WS.xyz, halfSize, v.vid, rotation); + o.vertex = mul(UNITY_MATRIX_VP, corner_WS); #else - // TODO(pld): convince drew to use this version - // Displacement is in canvas space - // Note that we assume object space == canvas space (which it is, for TB) - o.vertex = mul(UNITY_MATRIX_MVP, v.corner + float4(disp,0)); + // TODO(pld): convince drew to use this version + // Displacement is in canvas space + // Note that we assume object space == canvas space (which it is, for TB) + center = center + float4(disp.xyz, 0); + float4 corner = OrientParticle(center.xyz, halfSize, v.vid, rotation); + o.vertex = mul(UNITY_MATRIX_MVP, corner); #endif - o.color = v.color; - o.texcoord = TRANSFORM_TEX(v.texcoord.xy,_MainTex); - - return o; - } - - // i.color is srgb - fixed4 frag (v2f i) : SV_Target - { - float4 color = 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord); - color = float4(color.rgb * color.a, 1.0); - color = SrgbToNative(color); - return color; - } - ENDCG - } - } + o.color = v.color; + o.texcoord = TRANSFORM_TEX(v.texcoord.xy,_MainTex); + + return o; + } + + // i.color is srgb + fixed4 frag (v2f i) : SV_Target + { + float4 color = 2.0f * i.color * _TintColor * tex2D(_MainTex, i.texcoord); + color = float4(color.rgb * color.a, 1.0); + color = SrgbToNative(color); + return color; + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat index 0444f1a8..4f950e75 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat @@ -44,3 +44,6 @@ Material: - first: name: _TintColor second: {r: 0.61764705, g: 0.61764705, b: 0.61764705, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat.meta b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat.meta index 424fd7a7..1306c70f 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat.meta +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.mat.meta @@ -1,8 +1,4 @@ fileFormatVersion: 2 guid: cb92b59794ca4255b0170e3f42f12f9e -timeCreated: 1481917485 -licenseType: Pro NativeFormatImporter: userData: - assetBundleName: - assetBundleVariant: diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.shader index b7f59260..17bd6c36 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.shader @@ -16,106 +16,106 @@ Shader "Brush/Special/Fire" { Properties { - _MainTex ("Particle Texture", 2D) = "white" {} - _Scroll1 ("Scroll1", Float) = 0 - _Scroll2 ("Scroll2", Float) = 0 - _DisplacementIntensity("Displacement", Float) = .1 + _MainTex ("Particle Texture", 2D) = "white" {} + _Scroll1 ("Scroll1", Float) = 0 + _Scroll2 ("Scroll2", Float) = 0 + _DisplacementIntensity("Displacement", Float) = .1 _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend One One // SrcAlpha One - BlendOp Add, Min - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma target 3.0 - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - - sampler2D _MainTex; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float3 normal : NORMAL; - centroid float2 texcoord : TEXCOORD0; - float3 worldPos : TEXCOORD1; - }; - - struct v2f { - float4 vertex : POSITION; - float4 color : COLOR; - centroid float2 texcoord : TEXCOORD0; - float3 worldPos : TEXCOORD1; - }; - - float4 _MainTex_ST; - fixed _Scroll1; - fixed _Scroll2; - half _DisplacementIntensity; - half _EmissionGain; - - v2f vert (appdata_t v) - { - v.color = TbVertToSrgb(v.color); - v2f o; - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - o.color = bloomColor(v.color, _EmissionGain); - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - o.worldPos = mul(unity_ObjectToWorld, v.vertex); - return o; - } - - // Note: input color is srgb - fixed4 frag (v2f i) : COLOR - { - half2 displacement; - float procedural_line = 0; + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One // SrcAlpha One + BlendOp Add, Min + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + + sampler2D _MainTex; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + centroid float2 texcoord : TEXCOORD0; + float3 worldPos : TEXCOORD1; + }; + + struct v2f { + float4 vertex : POSITION; + float4 color : COLOR; + centroid float2 texcoord : TEXCOORD0; + float3 worldPos : TEXCOORD1; + }; + + float4 _MainTex_ST; + fixed _Scroll1; + fixed _Scroll2; + half _DisplacementIntensity; + half _EmissionGain; + + v2f vert (appdata_t v) + { + v.color = TbVertToSrgb(v.color); + v2f o; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + o.color = bloomColor(v.color, _EmissionGain); + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.worldPos = mul(unity_ObjectToWorld, v.vertex); + return o; + } + + // Note: input color is srgb + fixed4 frag (v2f i) : COLOR + { + half2 displacement; + float procedural_line = 0; #ifdef AUDIO_REACTIVE - // Envelope - float envelope = sin(i.texcoord.x * 3.14159); - float envelopeHalf = sin(i.texcoord.x * 3.14159 * .5); + // Envelope + float envelope = sin(i.texcoord.x * 3.14159); + float envelopeHalf = sin(i.texcoord.x * 3.14159 * .5); - // Basic fire effect - displacement = tex2D(_MainTex, i.texcoord + half2(-_Time.x * _Scroll1, 0) ).a; + // Basic fire effect + displacement = tex2D(_MainTex, i.texcoord + half2(-_Time.x * _Scroll1, 0) ).a; - // Waveform fire effect - float waveform = (tex2D(_WaveFormTex, float2(i.texcoord.x * .2 + .025*i.worldPos.y,0)).g - .5f) + displacement*.05; - procedural_line = pow(abs(1 - abs((i.texcoord.y - .5) + waveform)), max(100 * i.texcoord.x, 0.001)); + // Waveform fire effect + float waveform = (tex2D(_WaveFormTex, float2(i.texcoord.x * .2 + .025*i.worldPos.y,0)).g - .5f) + displacement*.05; + procedural_line = pow(abs(1 - abs((i.texcoord.y - .5) + waveform)), max(100 * i.texcoord.x, 0.001)); - waveform = (tex2D(_WaveFormTex, float2(i.texcoord.x * .3 + .034*i.worldPos.y,0)).w - .5f) + displacement*.02; - procedural_line += pow(abs(1 - abs((i.texcoord.y - .5) + waveform)), max(100 * i.texcoord.x, 0.001)); + waveform = (tex2D(_WaveFormTex, float2(i.texcoord.x * .3 + .034*i.worldPos.y,0)).w - .5f) + displacement*.02; + procedural_line += pow(abs(1 - abs((i.texcoord.y - .5) + waveform)), max(100 * i.texcoord.x, 0.001)); - //procedural_line = saturate(1 - 10*abs(i.texcoord.y - .5 + waveform * envelopeHalf)); - //procedural_line = pow(procedural_line, i.texcoord.x* 10); + //procedural_line = saturate(1 - 10*abs(i.texcoord.y - .5 + waveform * envelopeHalf)); + //procedural_line = pow(procedural_line, i.texcoord.x* 10); #else - displacement = tex2D(_MainTex, i.texcoord + half2(-_Time.x * _Scroll1, 0) ).a; + displacement = tex2D(_MainTex, i.texcoord + half2(-_Time.x * _Scroll1, 0) ).a; #endif - half4 tex = tex2D(_MainTex, i.texcoord + half2(-_Time.x * _Scroll2, 0) - displacement * _DisplacementIntensity); + half4 tex = tex2D(_MainTex, i.texcoord + half2(-_Time.x * _Scroll2, 0) - displacement * _DisplacementIntensity); #ifdef AUDIO_REACTIVE - tex = tex * .5 + 2 * procedural_line * ( envelope * envelopeHalf); + tex = tex * .5 + 2 * procedural_line * ( envelope * envelopeHalf); #endif - float4 color = i.color * tex; - color = float4(color.rgb * color.a, 1.0); - color = SrgbToNative(color); - return color; - } - ENDCG - } - } + float4 color = i.color * tex; + color = float4(color.rgb * color.a, 1.0); + color = SrgbToNative(color); + return color; + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Flat/Flat.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Flat/Flat.mat index dd851997..acf2e769 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Flat/Flat.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Flat/Flat.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: Flat m_Shader: {fileID: 4800000, guid: fc163d24473ddd04881e4fc188ed5802, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 - m_CustomRenderQueue: 2000 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.5 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/FlatDeprecated/FlatDeprecated.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/FlatDeprecated/FlatDeprecated.mat index 2364f2ad..28e70f0b 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/FlatDeprecated/FlatDeprecated.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/FlatDeprecated/FlatDeprecated.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: FlatDeprecated m_Shader: {fileID: 4800000, guid: 561cd39ab4e063843a09f5c11c3a8531, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.5 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/AdditiveCutout.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/AdditiveCutout.shader index 71f6d5e9..9537d8a9 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/AdditiveCutout.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/AdditiveCutout.shader @@ -14,66 +14,66 @@ Shader "Brush/Special/AdditiveCutout" { Properties { - _MainTex ("Texture", 2D) = "white" {} - _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 + _MainTex ("Texture", 2D) = "white" {} + _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend SrcAlpha One - AlphaTest Greater .01 - ColorMask RGB - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend SrcAlpha One + AlphaTest Greater .01 + ColorMask RGB + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - sampler2D _MainTex; - uniform float _Cutoff; - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float3 normal : NORMAL; - float2 texcoord : TEXCOORD0; - }; + SubShader { + Pass { - struct v2f { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; - - float4 _MainTex_ST; + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" - v2f vert (appdata_t v) - { + sampler2D _MainTex; + uniform float _Cutoff; + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + float2 texcoord : TEXCOORD0; + }; - v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - o.color = TbVertToNative(v.color); - return o; - } - - fixed4 frag (v2f i) : COLOR - { - half4 c = tex2D(_MainTex, i.texcoord ); + struct v2f { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; - // Cutoff the alpha value based on the incoming vertex alpha - i.color.a = (i.color.a * c.a < _Cutoff) ? 0 : 1; + float4 _MainTex_ST; - return i.color * float4(c.rgb,1); - } - ENDCG - } - } + v2f vert (appdata_t v) + { + + v2f o; + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + o.color = TbVertToNative(v.color); + return o; + } + + fixed4 frag (v2f i) : COLOR + { + half4 c = tex2D(_MainTex, i.texcoord ); + + // Cutoff the alpha value based on the incoming vertex alpha + i.color.a = (i.color.a * c.a < _Cutoff) ? 0 : 1; + + return i.color * float4(c.rgb,1); + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/Highlighter.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/Highlighter.mat index 08d48a57..734c1049 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/Highlighter.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/Highlighter.mat @@ -65,3 +65,6 @@ Material: - first: name: _TintColor second: {r: 0.61764705, g: 0.61764705, b: 0.61764705, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.mat index 8d3dd502..e7c93d2e 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.mat @@ -50,3 +50,6 @@ Material: - first: name: _WaveformIntensity second: {r: 0, g: 0.3, b: 0, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.shader index 1637d7ca..15f8e960 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/HyperGrid/HyperGrid.shader @@ -16,92 +16,92 @@ Shader "Brush/Special/HyperGrid" { Properties { - _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) - _MainTex ("Particle Texture", 2D) = "white" {} + _TintColor ("Tint Color", Color) = (0.5,0.5,0.5,0.5) + _MainTex ("Particle Texture", 2D) = "white" {} } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend One One - BlendOp Add, Min - AlphaTest Greater .01 - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma target 3.0 - #pragma glsl - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One + BlendOp Add, Min + AlphaTest Greater .01 + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - sampler2D _MainTex; - fixed4 _TintColor; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - float4 texcoord1 : TEXCOORD1; - }; + SubShader { + Pass { - struct v2f { - float4 vertex : SV_POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; - - float4 _MainTex_ST; - - v2f vert (appdata_t v) - { - v.color = TbVertToSrgb(v.color); - v2f o; - // Subtract out the Canvas space pose to keep the verts from popping around while - // transforming (e.g. apply quantization in an immutable space). - float4 worldPos = mul(unity_ObjectToWorld, v.vertex); - worldPos = mul(xf_I_CS, worldPos); - - float waveform = 0; + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma glsl + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" + + sampler2D _MainTex; + fixed4 _TintColor; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 texcoord1 : TEXCOORD1; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert (appdata_t v) + { + v.color = TbVertToSrgb(v.color); + v2f o; + // Subtract out the Canvas space pose to keep the verts from popping around while + // transforming (e.g. apply quantization in an immutable space). + float4 worldPos = mul(unity_ObjectToWorld, v.vertex); + worldPos = mul(xf_I_CS, worldPos); + + float waveform = 0; + + float lifetime = _Time.y - v.texcoord1.w; + float size = length(v.texcoord1.xyz); + float release = saturate(lifetime); - float lifetime = _Time.y - v.texcoord1.w; - float size = length(v.texcoord1.xyz); - float release = saturate(lifetime); - #ifdef AUDIO_REACTIVE - worldPos.y -= release * fmod(_BeatOutputAccum.x - v.texcoord1.w, 5); - worldPos.y += .3 * release * pow(sin(_BeatOutputAccum.x * 2 + worldPos.x),5); + worldPos.y -= release * fmod(_BeatOutputAccum.x - v.texcoord1.w, 5); + worldPos.y += .3 * release * pow(sin(_BeatOutputAccum.x * 2 + worldPos.x),5); #endif - // Quantize vertices - float q = (1.0f / size) * .5; - q += 5 * saturate(1- release*10); - float3 quantPos = ceil(worldPos.xyz * q) / q; - worldPos.xyz = quantPos; - worldPos = mul(xf_CS, worldPos); - o.vertex = mul(UNITY_MATRIX_VP, worldPos); + // Quantize vertices + float q = (1.0f / size) * .5; + q += 5 * saturate(1- release*10); + float3 quantPos = ceil(worldPos.xyz * q) / q; + worldPos.xyz = quantPos; + worldPos = mul(xf_CS, worldPos); + o.vertex = mul(UNITY_MATRIX_VP, worldPos); - o.color = 2 * v.color + v.color.yzxw * _BeatOutput.x; - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - return o; - } + o.color = 2 * v.color + v.color.yzxw * _BeatOutput.x; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + return o; + } - // Input color is srgb - fixed4 frag (v2f i) : SV_Target - { - float4 c = i.color * _TintColor * tex2D(_MainTex, i.texcoord); - c = float4(c.rgb * c.a, 1.0); - c = SrgbToNative(c); - return c; - } - ENDCG - } - } + // Input color is srgb + fixed4 frag (v2f i) : SV_Target + { + float4 c = i.color * _TintColor * tex2D(_MainTex, i.texcoord); + c = float4(c.rgb * c.a, 1.0); + c = SrgbToNative(c); + return c; + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.mat index b99de0fe..beb81226 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.mat @@ -65,3 +65,6 @@ Material: - first: name: _TintColor second: {r: 0.61764705, g: 0.61764705, b: 0.61764705, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.shader index 3d4b1d0b..5590604f 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Hypercolor/Hypercolor.shader @@ -14,91 +14,91 @@ Shader "Brush/Special/Hypercolor" { Properties { - _Color ("Main Color", Color) = (1,1,1,1) - _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0) - _Shininess ("Shininess", Range (0.01, 1)) = 0.078125 - _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {} - _BumpMap ("Normalmap", 2D) = "bump" {} - _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 + _Color ("Main Color", Color) = (1,1,1,1) + _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0) + _Shininess ("Shininess", Range (0.01, 1)) = 0.078125 + _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {} + _BumpMap ("Normalmap", 2D) = "bump" {} + _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } SubShader { - Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} - Cull Back - LOD 100 - - CGPROGRAM - #pragma target 3.0 - #pragma surface surf StandardSpecular vertex:vert alphatest:_Cutoff addshadow - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "../../../Shaders/Include/Brush.cginc" - - struct Input { - float2 uv_MainTex; - float2 uv_BumpMap; - float4 color : Color; - float3 worldPos; - }; - - sampler2D _MainTex; - sampler2D _BumpMap; - fixed4 _Color; - half _Shininess; - - void vert (inout appdata_full v) { - v.color = TbVertToSrgb(v.color); - - float t = 0.0; - - float strokeWidth = abs(v.texcoord.z) * 1.2; + Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} + Cull Back + LOD 100 + + CGPROGRAM + #pragma target 3.0 + #pragma surface surf StandardSpecular vertex:vert alphatest:_Cutoff addshadow + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "../../../Shaders/Include/Brush.cginc" + + struct Input { + float2 uv_MainTex; + float2 uv_BumpMap; + float4 color : Color; + float3 worldPos; + }; + + sampler2D _MainTex; + sampler2D _BumpMap; + fixed4 _Color; + half _Shininess; + + void vert (inout appdata_full v) { + v.color = TbVertToSrgb(v.color); + + float t = 0.0; + + float strokeWidth = abs(v.texcoord.z) * 1.2; #ifdef AUDIO_REACTIVE - t = _BeatOutputAccum.z * 5; - float waveIntensity = _BeatOutput.z * .1 * strokeWidth; - v.vertex.xyz += (pow(1 - (sin(t + v.texcoord.x * 5 + v.texcoord.y * 10) + 1), 2) - * cross(v.tangent.xyz, v.normal.xyz) - * waveIntensity) - ; + t = _BeatOutputAccum.z * 5; + float waveIntensity = _BeatOutput.z * .1 * strokeWidth; + v.vertex.xyz += (pow(1 - (sin(t + v.texcoord.x * 5 + v.texcoord.y * 10) + 1), 2) + * cross(v.tangent.xyz, v.normal.xyz) + * waveIntensity) + ; #endif - } - - void surf (Input IN, inout SurfaceOutputStandardSpecular o) { - fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); - - float scroll = _Time.z; + } + + void surf (Input IN, inout SurfaceOutputStandardSpecular o) { + fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); + + float scroll = _Time.z; #ifdef AUDIO_REACTIVE - float3 localPos = mul(xf_I_CS, float4(IN.worldPos, 1.0)).xyz; - float t = length(localPos) * .5; - scroll = _BeatOutputAccum.y*30; - float angle = atan2(localPos.x, localPos.y); - float waveform = tex2D(_WaveFormTex, float2(angle * 6,0)).g*2; - - tex.rgb = float3(1,0,0) * (sin(tex.r*2 + scroll*0.5 - t) + 1); - tex.rgb += float3(0,1,0) * (sin(tex.r*3 + scroll*1 - t) + 1); - tex.rgb += float3(0,0,1) * (sin(tex.r*4 + scroll*0.25 - t) + 1); + float3 localPos = mul(xf_I_CS, float4(IN.worldPos, 1.0)).xyz; + float t = length(localPos) * .5; + scroll = _BeatOutputAccum.y*30; + float angle = atan2(localPos.x, localPos.y); + float waveform = tex2D(_WaveFormTex, float2(angle * 6,0)).g*2; + + tex.rgb = float3(1,0,0) * (sin(tex.r*2 + scroll*0.5 - t) + 1); + tex.rgb += float3(0,1,0) * (sin(tex.r*3 + scroll*1 - t) + 1); + tex.rgb += float3(0,0,1) * (sin(tex.r*4 + scroll*0.25 - t) + 1); #else - tex.rgb = float3(1,0,0) * (sin(tex.r * 2 + scroll*0.5 - IN.uv_MainTex.x) + 1) * 2; - tex.rgb += float3(0,1,0) * (sin(tex.r * 3.3 + scroll*1 - IN.uv_MainTex.x) + 1) * 2; - tex.rgb += float3(0,0,1) * (sin(tex.r * 4.66 + scroll*0.25 - IN.uv_MainTex.x) + 1) * 2; + tex.rgb = float3(1,0,0) * (sin(tex.r * 2 + scroll*0.5 - IN.uv_MainTex.x) + 1) * 2; + tex.rgb += float3(0,1,0) * (sin(tex.r * 3.3 + scroll*1 - IN.uv_MainTex.x) + 1) * 2; + tex.rgb += float3(0,0,1) * (sin(tex.r * 4.66 + scroll*0.25 - IN.uv_MainTex.x) + 1) * 2; #endif - - o.Albedo = SrgbToNative(tex * IN.color).rgb; - o.Smoothness = _Shininess; - o.Specular = SrgbToNative(_SpecColor * tex).rgb; - o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); - o.Alpha = tex.a * IN.color.a; + + o.Albedo = SrgbToNative(tex * IN.color).rgb; + o.Smoothness = _Shininess; + o.Specular = SrgbToNative(_SpecColor * tex).rgb; + o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); + o.Alpha = tex.a * IN.color.a; #ifdef AUDIO_REACTIVE - o.Emission = o.Albedo; - o.Albedo = .2; - o.Specular *= .5; + o.Emission = o.Albedo; + o.Albedo = .2; + o.Specular *= .5; #endif - - } - ENDCG + + } + ENDCG } - FallBack "Transparent/Cutout/VertexLit" + FallBack "Transparent/Cutout/VertexLit" } - - - + + + diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Ink/Ink.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Ink/Ink.mat index 6c066ed1..6c186301 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Ink/Ink.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Ink/Ink.mat @@ -8,9 +8,9 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: Ink m_Shader: {fileID: 4800000, guid: 6af6ca8fad7576846a6a44f5c6d7bf6b, type: 3} - m_ShaderKeywords: _ALPHATEST_ON _LIGHTMAPPING_REALTIME _NORMALMAP - m_LightmapFlags: 5 - m_CustomRenderQueue: 2450 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 @@ -45,12 +45,6 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - - first: - name: _Illum - second: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - first: name: _MainTex second: @@ -75,19 +69,10 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - - first: - name: _SpecGlossMap - second: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} m_Floats: - - first: - name: _AlphaTestRef - second: 0.541 - first: name: _BumpScale - second: 1.12 + second: 1 - first: name: _Cutoff second: 0.5 @@ -98,29 +83,20 @@ Material: name: _DstBlend second: 0 - first: - name: _EmissionGain - second: 0.5 - - first: - name: _EmissionLM - second: 0 - - first: - name: _EmissionScaleUI - second: 0 + name: _GlossMapScale + second: 1 - first: name: _Glossiness - second: 0.644 - - first: - name: _InvFade - second: 1 + second: 0.5 - first: - name: _Lightmapping + name: _GlossyReflections second: 1 - first: name: _Metallic - second: 0.204 + second: 0 - first: name: _Mode - second: 1 + second: 0 - first: name: _OcclusionStrength second: 1 @@ -130,6 +106,12 @@ Material: - first: name: _Shininess second: 0.4 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 - first: name: _SrcBlend second: 1 @@ -145,13 +127,7 @@ Material: second: {r: 1, g: 1, b: 1, a: 1} - first: name: _EmissionColor - second: {r: 0, g: 0, b: 0, a: 0} - - first: - name: _EmissionColorUI - second: {r: 1, g: 1, b: 1, a: 1} + second: {r: 0, g: 0, b: 0, a: 1} - first: name: _SpecColor second: {r: 0.23529412, g: 0.23529412, b: 0.23529412, a: 1} - - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/Leaves.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/Leaves.mat index 30756c38..b5e4b389 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/Leaves.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/Leaves.mat @@ -7,16 +7,40 @@ Material: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_Name: Leaves - m_Shader: {fileID: 4800000, guid: 561cd39ab4e063843a09f5c11c3a8531, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_Shader: {fileID: 4800000, guid: 6af6ca8fad7576846a6a44f5c6d7bf6b, type: 3} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 2800000, guid: 735a5f2fd14c4764682ef32fc6822de5, type: 3} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,83 @@ Material: m_Texture: {fileID: 2800000, guid: 3743071a0f034424390b1aa53dda0d60, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.5 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic second: 0 - first: - name: _InvFade + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _Shininess + second: 0.395 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec + second: 0 + - first: + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} + - first: + name: _SpecColor + second: {r: 0, g: 0, b: 0, a: 0} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/normal.png b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Leaves/normal.png new file mode 100644 index 0000000000000000000000000000000000000000..33d0084025989904ee22bed0db8e529647c90bf0 GIT binary patch literal 142238 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 lSM&bwwf}VZKmR+(yQ*f>-+hb^rTsy`52a compiler error: too many instructions for SM 2.0 - - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - - sampler2D _MainTex; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float3 normal : NORMAL; - float2 texcoord : TEXCOORD0; - }; - - struct v2f { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - float4 worldPos : TEXCOORD1; - }; - - float4 _MainTex_ST; - fixed _Scroll1; - fixed _Scroll2; - half _DisplacementIntensity; - half _EmissionGain; - - v2f vert (appdata_t v) - { - v.color = TbVertToSrgb(v.color); - - v2f o; - o.worldPos = mul(unity_ObjectToWorld, v.vertex); - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - o.color = v.color; - return o; - } - - float rand_1_05(in float2 uv) - { - float2 noise = (frac(sin(dot(uv ,float2(12.9898,78.233)*2.0)) * 43758.5453)); - return abs(noise.x + noise.y) * 0.5; - } - - // Input color is srgb - fixed4 frag (v2f i) : COLOR - { - // Create parametric flowing UV's - half2 uvs = i.texcoord; - float row_id = floor(uvs.y * 5); - float row_rand = rand_1_05(row_id.xx); - uvs.x += row_rand * 200; - - half2 sins = sin(uvs.x * half2(10,23) + _Time.z * half2(5,3)); - uvs.y = 5 * uvs.y + dot(half2(.05, -.05), sins); + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One // SrcAlpha One + BlendOp Add, Min + AlphaTest Greater .01 + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } + + SubShader { + Pass { + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile_particles + #pragma multi_compile __ TBT_LINEAR_TARGET + #pragma target 3.0 // Required -> compiler error: too many instructions for SM 2.0 + + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + + sampler2D _MainTex; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 worldPos : TEXCOORD1; + }; + + float4 _MainTex_ST; + fixed _Scroll1; + fixed _Scroll2; + half _DisplacementIntensity; + half _EmissionGain; + + v2f vert (appdata_t v) + { + v.color = TbVertToSrgb(v.color); + + v2f o; + o.worldPos = mul(unity_ObjectToWorld, v.vertex); + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + o.color = v.color; + return o; + } + + float rand_1_05(in float2 uv) + { + float2 noise = (frac(sin(dot(uv ,float2(12.9898,78.233)*2.0)) * 43758.5453)); + return abs(noise.x + noise.y) * 0.5; + } + + // Input color is srgb + fixed4 frag (v2f i) : COLOR + { + // Create parametric flowing UV's + half2 uvs = i.texcoord; + float row_id = floor(uvs.y * 5); + float row_rand = rand_1_05(row_id.xx); + uvs.x += row_rand * 200; + + half2 sins = sin(uvs.x * half2(10,23) + _Time.z * half2(5,3)); + uvs.y = 5 * uvs.y + dot(half2(.05, -.05), sins); #ifdef AUDIO_REACTIVE - // Scrolling UVs - uvs.x *= .5 + row_rand * .3; - uvs.x -= _BeatOutputAccum.x * (1 + fmod(row_id * 1.61803398875, 1) - 0.5); + // Scrolling UVs + uvs.x *= .5 + row_rand * .3; + uvs.x -= _BeatOutputAccum.x * (1 + fmod(row_id * 1.61803398875, 1) - 0.5); #else - // Scrolling UVs - uvs.x *= .5 + row_rand * .3; - uvs.x -= _Time.y * (1 + fmod(row_id * 1.61803398875, 1) - 0.5); + // Scrolling UVs + uvs.x *= .5 + row_rand * .3; + uvs.x -= _Time.y * (1 + fmod(row_id * 1.61803398875, 1) - 0.5); #endif - // Sample final texture - half4 tex = tex2D(_MainTex, uvs); - - // Boost hot spot in texture - tex += pow(tex, 2) * 55; + // Sample final texture + half4 tex = tex2D(_MainTex, uvs); + + // Boost hot spot in texture + tex += pow(tex, 2) * 55; - // Clean up border pixels filtering artifacts - tex *= fmod(uvs.y,1); // top edge - tex *= fmod(uvs.y,1); // top edge - tex *= 1 - fmod(uvs.y,1); // bottom edge - tex *= 1 - fmod(uvs.y,1); // bottom edge + // Clean up border pixels filtering artifacts + tex *= fmod(uvs.y,1); // top edge + tex *= fmod(uvs.y,1); // top edge + tex *= 1 - fmod(uvs.y,1); // bottom edge + tex *= 1 - fmod(uvs.y,1); // bottom edge #ifdef AUDIO_REACTIVE - tex += tex * _BeatOutput.x; + tex += tex * _BeatOutput.x; #endif - float4 color = i.color * tex * exp(_EmissionGain * 5.0f); - color = float4(color.rgb * color.a, 1.0); - color = SrgbToNative(color); - return color; - } - ENDCG - } - } + float4 color = i.color * tex * exp(_EmissionGain * 5.0f); + color = float4(color.rgb * color.a, 1.0); + color = SrgbToNative(color); + return color; + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Taffy/Taffy.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Taffy/Taffy.mat index 7978ffb9..f3b6c171 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Taffy/Taffy.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Taffy/Taffy.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: Taffy m_Shader: {fileID: 4800000, guid: 0688c89ab91f95a49a7395fe0da3a0a6, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 2800000, guid: 0758becf0979c9c42a2419c32260227b, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.5 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedFlat/TaperedFlat.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedFlat/TaperedFlat.mat index 53c748f8..62862319 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedFlat/TaperedFlat.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedFlat/TaperedFlat.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: TaperedFlat m_Shader: {fileID: 4800000, guid: 561cd39ab4e063843a09f5c11c3a8531, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 2800000, guid: f3edc2a3ac909e640b160e04d7c1f116, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.067 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker/TaperedMarker.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker/TaperedMarker.mat index 6b8049cd..8a4a0ab4 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker/TaperedMarker.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker/TaperedMarker.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: TaperedMarker m_Shader: {fileID: 4800000, guid: 0688c89ab91f95a49a7395fe0da3a0a6, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 2800000, guid: 12b1499f1adf4d545a80f2ec18204030, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.067 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker_Flat/TaperedMarker_Flat.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker_Flat/TaperedMarker_Flat.mat index bfe0d1cd..3e645a4f 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker_Flat/TaperedMarker_Flat.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/TaperedMarker_Flat/TaperedMarker_Flat.mat @@ -7,16 +7,40 @@ Material: m_PrefabParentObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_Name: TaperedMarker_Flat - m_Shader: {fileID: 4800000, guid: 0688c89ab91f95a49a7395fe0da3a0a6, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_Shader: {fileID: 4800000, guid: 561cd39ab4e063843a09f5c11c3a8531, type: 3} + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 2800000, guid: 12b1499f1adf4d545a80f2ec18204030, type: 3} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff - second: 0.067 + second: 0.5 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ThickPaint/ThickPaint.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ThickPaint/ThickPaint.mat index a34ffecc..358df40c 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ThickPaint/ThickPaint.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/ThickPaint/ThickPaint.mat @@ -8,9 +8,9 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: ThickPaint m_Shader: {fileID: 4800000, guid: 6af6ca8fad7576846a6a44f5c6d7bf6b, type: 3} - m_ShaderKeywords: _ALPHATEST_ON _LIGHTMAPPING_REALTIME _NORMALMAP - m_LightmapFlags: 5 - m_CustomRenderQueue: 2450 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 + m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 @@ -45,12 +45,6 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - - first: - name: _Illum - second: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} - first: name: _MainTex second: @@ -75,19 +69,10 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} - - first: - name: _SpecGlossMap - second: - m_Texture: {fileID: 0} - m_Scale: {x: 1, y: 1} - m_Offset: {x: 0, y: 0} m_Floats: - - first: - name: _AlphaTestRef - second: 0.541 - first: name: _BumpScale - second: 1.12 + second: 1 - first: name: _Cutoff second: 0.5 @@ -98,29 +83,20 @@ Material: name: _DstBlend second: 0 - first: - name: _EmissionGain - second: 0.5 - - first: - name: _EmissionLM - second: 0 - - first: - name: _EmissionScaleUI - second: 0 + name: _GlossMapScale + second: 1 - first: name: _Glossiness - second: 0.644 - - first: - name: _InvFade - second: 1 + second: 0.5 - first: - name: _Lightmapping + name: _GlossyReflections second: 1 - first: name: _Metallic - second: 0.204 + second: 0 - first: name: _Mode - second: 1 + second: 0 - first: name: _OcclusionStrength second: 1 @@ -130,6 +106,12 @@ Material: - first: name: _Shininess second: 0.4 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 - first: name: _SrcBlend second: 1 @@ -145,13 +127,7 @@ Material: second: {r: 1, g: 1, b: 1, a: 1} - first: name: _EmissionColor - second: {r: 0, g: 0, b: 0, a: 0} - - first: - name: _EmissionColorUI - second: {r: 1, g: 1, b: 1, a: 1} + second: {r: 0, g: 0, b: 0, a: 1} - first: name: _SpecColor second: {r: 0.23529412, g: 0.23529412, b: 0.23529412, a: 1} - - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.mat index 33305a82..7a97eda8 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.mat @@ -40,9 +40,6 @@ Material: - first: name: _InvFade second: 1 - - first: - name: _OutlineMax - second: 0.005 m_Colors: - first: name: _Color diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.shader index d34bfea3..7fb6a684 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Toon/Toon.shader @@ -14,112 +14,113 @@ Shader "Brush/Special/Toon" { Properties { - _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} - _OutlineMax("Maximum outline size", Range(0, .5)) = .005 + _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} + _OutlineMax("Maximum outline size", Range(0, .5)) = .005 } CGINCLUDE - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" - #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #pragma multi_compile_fog - #pragma target 3.0 - sampler2D _MainTex; - float4 _MainTex_ST; - float _OutlineMax; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float3 normal : NORMAL; - float3 texcoord : TEXCOORD0; - }; - - struct v2f { - float4 vertex : SV_POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - UNITY_FOG_COORDS(1) - }; - - v2f vertInflate (appdata_t v, float inflate) - { - - v2f o; - float outlineEnabled = inflate; - float radius = v.texcoord.z; - inflate *= radius * .4; - float bulge = 0.0; + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + #include "Assets/ThirdParty/Noise/Shaders/Noise.cginc" + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #pragma multi_compile_fog + #pragma target 3.0 + sampler2D _MainTex; + float4 _MainTex_ST; + float _OutlineMax; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + float3 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : SV_POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + UNITY_FOG_COORDS(1) + }; + + v2f vertInflate (appdata_t v, float inflate) + { + + v2f o; + float outlineEnabled = inflate; + float radius = v.texcoord.z; + inflate *= radius * .4; + float bulge = 0.0; + float3 worldNormal = UnityObjectToWorldNormal(v.normal); #ifdef AUDIO_REACTIVE - float fft = tex2Dlod(_FFTTex, float4(_BeatOutputAccum.z*.25 + v.texcoord.x, 0,0,0)).g; - bulge = fft * radius * 10.0; -#endif - - // - // Careful: perspective projection is non-afine, so math assumptions may not be valid here. - // - - // Technically these are not yet in NDC because they haven't been divided by W, so their - // range is currently [-W, W]. - o.vertex = mul(UNITY_MATRIX_MVP, float4(v.vertex.xyz + v.normal.xyz * bulge, v.vertex.w)); - float4 outline_NDC = mul(UNITY_MATRIX_MVP, - float4(v.vertex.xyz + v.normal.xyz * inflate, v.vertex.w)); - - // Displacement in proper NDC coords (e.g. [-1, 1]) - float3 disp = outline_NDC.xyz / outline_NDC.w - o.vertex.xyz / o.vertex.w; - - // Magnitude is a scaling factor to shrink large outlines down to a max width, in NDC space. - // Notice here we're only measuring 2D displacment in X and Y. - float mag = length(disp.xy); - mag = min(_OutlineMax, mag) / mag; - - // Ideally we would project back into world space to do the scaling, but the inverse - // projection matrix is not currently available. So instead, we multiply back in the w - // component so both sides of the += operator below are in the same space. Also note - // that the w component is a function of depth, so modifying X and Y independent of Z - // should mean that the original w value remains valid. - o.vertex.xyz += float3(disp.xy * mag, disp.z) * o.vertex.w * outlineEnabled; - - // Push Z back to avoid z-fighting when scaled very small. This is not legit, - // mathematically speaking and likely causes crazy surface derivitives. - o.vertex.z -= disp.z * o.vertex.w * outlineEnabled; + float fft = tex2Dlod(_FFTTex, float4(_BeatOutputAccum.z*.25 + v.texcoord.x, 0,0,0)).g; + bulge = fft * radius * 10.0; +#endif + + // + // Careful: perspective projection is non-afine, so math assumptions may not be valid here. + // + + // Technically these are not yet in NDC because they haven't been divided by W, so their + // range is currently [-W, W]. + o.vertex = mul(UNITY_MATRIX_MVP, float4(v.vertex.xyz + v.normal.xyz * bulge, v.vertex.w)); + float4 outline_NDC = mul(UNITY_MATRIX_MVP, + float4(v.vertex.xyz + v.normal.xyz * inflate, v.vertex.w)); + + // Displacement in proper NDC coords (e.g. [-1, 1]) + float3 disp = outline_NDC.xyz / outline_NDC.w - o.vertex.xyz / o.vertex.w; + + // Magnitude is a scaling factor to shrink large outlines down to a max width, in NDC space. + // Notice here we're only measuring 2D displacment in X and Y. + float mag = length(disp.xy); + mag = min(_OutlineMax, mag) / mag; + + // Ideally we would project back into world space to do the scaling, but the inverse + // projection matrix is not currently available. So instead, we multiply back in the w + // component so both sides of the += operator below are in the same space. Also note + // that the w component is a function of depth, so modifying X and Y independent of Z + // should mean that the original w value remains valid. + o.vertex.xyz += float3(disp.xy * mag, disp.z) * o.vertex.w * outlineEnabled; + + // Push Z back to avoid z-fighting when scaled very small. This is not legit, + // mathematically speaking and likely causes crazy surface derivitives. + o.vertex.z -= disp.z * o.vertex.w * outlineEnabled; o.color = v.color; o.color.a = 1; - o.color.xyz += v.normal.y *.2; + o.color.xyz += worldNormal.y *.2; o.color.xyz = max(0, o.color.xyz); o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - UNITY_TRANSFER_FOG(o, o.vertex); + UNITY_TRANSFER_FOG(o, o.vertex); return o; - } - - v2f vert (appdata_t v) - { - v.color = TbVertToNative(v.color); - return vertInflate(v,0); - } - - v2f vertEdge (appdata_t v) - { - // v.color = TbVertToNative(v.color); no need - return vertInflate(v, 1.0); - } - - fixed4 fragBlack (v2f i) : SV_Target - { - float4 color = float4(0,0,0,1); - UNITY_APPLY_FOG(i.fogCoord, color); - return color; - } - - fixed4 fragColor (v2f i) : SV_Target - { - UNITY_APPLY_FOG(i.fogCoord, i.color); - return i.color; - } + } + + v2f vert (appdata_t v) + { + v.color = TbVertToNative(v.color); + return vertInflate(v,0); + } + + v2f vertEdge (appdata_t v) + { + // v.color = TbVertToNative(v.color); no need + return vertInflate(v, 1.0); + } + + fixed4 fragBlack (v2f i) : SV_Target + { + float4 color = float4(0,0,0,1); + UNITY_APPLY_FOG(i.fogCoord, color); + return color; + } + + fixed4 fragColor (v2f i) : SV_Target + { + UNITY_APPLY_FOG(i.fogCoord, i.color); + return i.color; + } ENDCG @@ -128,21 +129,21 @@ ENDCG SubShader { // For exportManifest.json: // GltfCull Back - Cull Back - Pass{ - CGPROGRAM - #pragma vertex vert - #pragma fragment fragColor - ENDCG - } - - Cull Front - Pass{ - CGPROGRAM - #pragma vertex vertEdge - #pragma fragment fragBlack - ENDCG - } - } + Cull Back + Pass{ + CGPROGRAM + #pragma vertex vert + #pragma fragment fragColor + ENDCG + } + + Cull Front + Pass{ + CGPROGRAM + #pragma vertex vertEdge + #pragma fragment fragBlack + ENDCG + } + } Fallback "Diffuse" } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/VelvetInk/VelvetInk.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/VelvetInk/VelvetInk.shader index 4b75a401..cb457c64 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/VelvetInk/VelvetInk.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/VelvetInk/VelvetInk.shader @@ -14,70 +14,70 @@ Shader "Brush/Special/VelvetInk" { Properties { - _MainTex ("Texture", 2D) = "white" {} + _MainTex ("Texture", 2D) = "white" {} } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend SrcAlpha One - AlphaTest Greater .01 - ColorMask RGB - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend SrcAlpha One + AlphaTest Greater .01 + ColorMask RGB + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - sampler2D _MainTex; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float3 normal : NORMAL; - float2 texcoord : TEXCOORD0; - }; - - struct v2f { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; - - float4 _MainTex_ST; - - v2f vert (appdata_t v) - { + SubShader { + Pass { - v2f o; - - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" + + sampler2D _MainTex; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float3 normal : NORMAL; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + float4 _MainTex_ST; + + v2f vert (appdata_t v) + { + + v2f o; + + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); #ifdef AUDIO_REACTIVE - v.color = TbVertToSrgb(v.color); - o.color = musicReactiveColor(v.color, _BeatOutput.w); - v.vertex = musicReactiveAnimation(v.vertex, v.color, _BeatOutput.w, o.texcoord.x); - o.color = SrgbToNative(o.color); + v.color = TbVertToSrgb(v.color); + o.color = musicReactiveColor(v.color, _BeatOutput.w); + v.vertex = musicReactiveAnimation(v.vertex, v.color, _BeatOutput.w, o.texcoord.x); + o.color = SrgbToNative(o.color); #else - o.color = TbVertToNative(v.color); + o.color = TbVertToNative(v.color); #endif - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + + return o; + } - return o; - } - - fixed4 frag (v2f i) : COLOR - { - half4 c = tex2D(_MainTex, i.texcoord ); - return i.color * c; - } - ENDCG - } - } + fixed4 frag (v2f i) : COLOR + { + half4 c = tex2D(_MainTex, i.texcoord ); + return i.color * c; + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.mat index ab02fb12..6c653201 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.mat @@ -41,3 +41,6 @@ Material: - first: name: _TintColor second: {r: 0.99999994, g: 0.99999994, b: 0.99999994, a: 1} +--- !u!1002 &2100001 +EditorExtensionImpl: + serializedVersion: 6 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.shader index f9eb6d99..ee4e467a 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.shader @@ -14,86 +14,86 @@ Shader "Brush/Visualizer/Waveform" { Properties { - _MainTex ("Particle Texture", 2D) = "white" {} - _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 + _MainTex ("Particle Texture", 2D) = "white" {} + _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend One One // SrcAlpha One - BlendOp Add, Min - AlphaTest Greater .01 - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma target 3.0 - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One // SrcAlpha One + BlendOp Add, Min + AlphaTest Greater .01 + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" + SubShader { + Pass { - sampler2D _MainTex; - float4 _MainTex_ST; - float _EmissionGain; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma target 3.0 + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET - struct v2f { - float4 vertex : POSITION; - float4 color : COLOR; - float2 texcoord : TEXCOORD0; - float4 unbloomedColor : TEXCOORD1; - }; + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" - v2f vert (appdata_t v) - { - v.color = TbVertToSrgb(v.color); + sampler2D _MainTex; + float4 _MainTex_ST; + float _EmissionGain; - v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - o.color = bloomColor(v.color, _EmissionGain); - o.unbloomedColor = v.color; - return o; - } + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; - // Input colors are srgb - fixed4 frag (v2f i) : COLOR - { - // Envelope - float envelope = sin(i.texcoord.x * 3.14159); + struct v2f { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + float4 unbloomedColor : TEXCOORD1; + }; + + v2f vert (appdata_t v) + { + v.color = TbVertToSrgb(v.color); + + v2f o; + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + o.color = bloomColor(v.color, _EmissionGain); + o.unbloomedColor = v.color; + return o; + } + + // Input colors are srgb + fixed4 frag (v2f i) : COLOR + { + // Envelope + float envelope = sin(i.texcoord.x * 3.14159); #ifdef AUDIO_REACTIVE - float waveform = (tex2D(_WaveFormTex, float2(i.texcoord.x,0)).r) - .5; + float waveform = (tex2D(_WaveFormTex, float2(i.texcoord.x,0)).r) - .5; #else - float waveform = .15 * sin( -30 * i.unbloomedColor.r * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.r); - waveform += .15 * sin( -40 * i.unbloomedColor.g * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.g); - waveform += .15 * sin( -50 * i.unbloomedColor.b * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.b); + float waveform = .15 * sin( -30 * i.unbloomedColor.r * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.r); + waveform += .15 * sin( -40 * i.unbloomedColor.g * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.g); + waveform += .15 * sin( -50 * i.unbloomedColor.b * _Time.w + i.texcoord.x * 100 * i.unbloomedColor.b); #endif - - float pinch = (1 - envelope) * 40 + 20; - float procedural_line = saturate(1 - pinch*abs(i.texcoord.y - .5 -waveform * envelope)); - float4 color = 1; - color.rgb *= envelope * procedural_line; - color = i.color * color; - color = float4(color.rgb * color.a, 1.0); - color = SrgbToNative(color); - return color; - } - ENDCG - } - } + + float pinch = (1 - envelope) * 40 + 20; + float procedural_line = saturate(1 - pinch*abs(i.texcoord.y - .5 -waveform * envelope)); + float4 color = 1; + color.rgb *= envelope * procedural_line; + color = i.color * color; + color = float4(color.rgb * color.a, 1.0); + color = SrgbToNative(color); + return color; + } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/WaveformPulse/NeonPulse.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/WaveformPulse/NeonPulse.shader index 29fd4074..701eaa1a 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/WaveformPulse/NeonPulse.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/WaveformPulse/NeonPulse.shader @@ -14,57 +14,57 @@ Shader "Brush/Visualizer/WaveformPulse" { Properties { - _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 + _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 } SubShader { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend One One - Cull off ZWrite Off - - CGPROGRAM - #pragma target 3.0 - #pragma surface surf StandardSpecular vertex:vert - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "../../../Shaders/Include/Brush.cginc" - - struct Input { - float4 color : Color; - float2 tex : TEXCOORD0; - float3 viewDir; - float3 worldNormal; - INTERNAL_DATA - }; - - float _EmissionGain; + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One + Cull off ZWrite Off - void vert (inout appdata_full i, out Input o) { - UNITY_INITIALIZE_OUTPUT(Input, o); - o.color = TbVertToSrgb(o.color); - o.tex = i.texcoord; - } - - // Input color is srgb - void surf (Input IN, inout SurfaceOutputStandardSpecular o) { - o.Smoothness = .8; - o.Specular = .05; - float audioMultiplier = 1; + CGPROGRAM + #pragma target 3.0 + #pragma surface surf StandardSpecular vertex:vert + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET + #include "../../../Shaders/Include/Brush.cginc" + + struct Input { + float4 color : Color; + float2 tex : TEXCOORD0; + float3 viewDir; + float3 worldNormal; + INTERNAL_DATA + }; + + float _EmissionGain; + + void vert (inout appdata_full i, out Input o) { + UNITY_INITIALIZE_OUTPUT(Input, o); + o.color = TbVertToSrgb(o.color); + o.tex = i.texcoord; + } + + // Input color is srgb + void surf (Input IN, inout SurfaceOutputStandardSpecular o) { + o.Smoothness = .8; + o.Specular = .05; + float audioMultiplier = 1; #ifdef AUDIO_REACTIVE - audioMultiplier += audioMultiplier * _BeatOutput.x; - IN.tex.x -= _BeatOutputAccum.z; - IN.color += IN.color * _BeatOutput.w * .25; + audioMultiplier += audioMultiplier * _BeatOutput.x; + IN.tex.x -= _BeatOutputAccum.z; + IN.color += IN.color * _BeatOutput.w * .25; #else - IN.tex.x -= _Time.x*15; + IN.tex.x -= _Time.x*15; #endif - IN.tex.x = fmod( abs(IN.tex.x),1); - float neon = saturate(pow( 10 * saturate(.2 - IN.tex.x),5) * audioMultiplier); - float4 bloom = bloomColor(IN.color, _EmissionGain); - float3 n = WorldNormalVector (IN, o.Normal); - half rim = 1.0 - saturate(dot (normalize(IN.viewDir), n)); - bloom *= pow(1-rim,5); - o.Emission = SrgbToNative(bloom * neon); - } - ENDCG + IN.tex.x = fmod( abs(IN.tex.x),1); + float neon = saturate(pow( 10 * saturate(.2 - IN.tex.x),5) * audioMultiplier); + float4 bloom = bloomColor(IN.color, _EmissionGain); + float3 n = WorldNormalVector (IN, o.Normal); + half rim = 1.0 - saturate(dot (normalize(IN.viewDir), n)); + bloom *= pow(1-rim,5); + o.Emission = SrgbToNative(bloom * neon); + } + ENDCG } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Wire/Wire.mat b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Wire/Wire.mat index e4a3a9b8..c5c1f76e 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Wire/Wire.mat +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Basic/Wire/Wire.mat @@ -8,15 +8,39 @@ Material: m_PrefabInternal: {fileID: 0} m_Name: Wire m_Shader: {fileID: 4800000, guid: 0688c89ab91f95a49a7395fe0da3a0a6, type: 3} - m_ShaderKeywords: - m_LightmapFlags: 5 + m_ShaderKeywords: _EMISSION + m_LightmapFlags: 1 m_CustomRenderQueue: -1 stringTagMap: {} m_SavedProperties: serializedVersion: 2 m_TexEnvs: - first: - name: _Illum + name: _BumpMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailAlbedoMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailMask + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _DetailNormalMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _EmissionMap second: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} @@ -27,23 +51,77 @@ Material: m_Texture: {fileID: 0} m_Scale: {x: 1, y: 1} m_Offset: {x: 0, y: 0} + - first: + name: _MetallicGlossMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _OcclusionMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - first: + name: _ParallaxMap + second: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} m_Floats: + - first: + name: _BumpScale + second: 1 - first: name: _Cutoff second: 0.067 - first: - name: _EmissionGain + name: _DetailNormalMapScale + second: 1 + - first: + name: _DstBlend + second: 0 + - first: + name: _GlossMapScale + second: 1 + - first: + name: _Glossiness second: 0.5 - first: - name: _EmissionLM + name: _GlossyReflections + second: 1 + - first: + name: _Metallic + second: 0 + - first: + name: _Mode + second: 0 + - first: + name: _OcclusionStrength + second: 1 + - first: + name: _Parallax + second: 0.02 + - first: + name: _SmoothnessTextureChannel + second: 0 + - first: + name: _SpecularHighlights + second: 1 + - first: + name: _SrcBlend + second: 1 + - first: + name: _UVSec second: 0 - first: - name: _InvFade + name: _ZWrite second: 1 m_Colors: - first: name: _Color second: {r: 1, g: 1, b: 1, a: 1} - first: - name: _TintColor - second: {r: 0.5441177, g: 0.16886412, b: 0, a: 0.5019608} + name: _EmissionColor + second: {r: 0, g: 0, b: 0, a: 1} diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Bloom.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Bloom.shader index 4ab183bb..e7bcd837 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Bloom.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Bloom.shader @@ -14,71 +14,71 @@ Shader "Brush/Bloom" { Properties { - _MainTex ("Particle Texture", 2D) = "white" {} - _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 + _MainTex ("Particle Texture", 2D) = "white" {} + _EmissionGain ("Emission Gain", Range(0, 1)) = 0.5 } Category { - Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } - Blend One One // SrcAlpha One - BlendOp Add, Min - AlphaTest Greater .01 - ColorMask RGBA - Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - - SubShader { - Pass { - - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - #pragma multi_compile_particles - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET + Tags { "Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent" } + Blend One One // SrcAlpha One + BlendOp Add, Min + AlphaTest Greater .01 + ColorMask RGBA + Cull Off Lighting Off ZWrite Off Fog { Color (0,0,0,0) } - #include "UnityCG.cginc" - #include "../../../Shaders/Include/Brush.cginc" + SubShader { + Pass { - sampler2D _MainTex; - float4 _MainTex_ST; - float _EmissionGain; - - struct appdata_t { - float4 vertex : POSITION; - fixed4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #pragma multi_compile_particles + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET - struct v2f { - float4 vertex : POSITION; - float4 color : COLOR; - float2 texcoord : TEXCOORD0; - }; + #include "UnityCG.cginc" + #include "../../../Shaders/Include/Brush.cginc" - v2f vert (appdata_t v) - { - v.color = TbVertToSrgb(v.color); - v2f o; - o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); - o.color = bloomColor(v.color, _EmissionGain); + sampler2D _MainTex; + float4 _MainTex_ST; + float _EmissionGain; + + struct appdata_t { + float4 vertex : POSITION; + fixed4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + struct v2f { + float4 vertex : POSITION; + float4 color : COLOR; + float2 texcoord : TEXCOORD0; + }; + + v2f vert (appdata_t v) + { + v.color = TbVertToSrgb(v.color); + v2f o; + o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); + o.color = bloomColor(v.color, _EmissionGain); #ifdef AUDIO_REACTIVE - o.color = musicReactiveColor(o.color, _BeatOutput.y); - v.vertex = musicReactiveAnimation(v.vertex, v.color, _BeatOutput.y, o.texcoord.x); + o.color = musicReactiveColor(o.color, _BeatOutput.y); + v.vertex = musicReactiveAnimation(v.vertex, v.color, _BeatOutput.y, o.texcoord.x); #endif - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - return o; - } + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + return o; + } - fixed4 frag (v2f i) : COLOR - { - float4 color = i.color * tex2D(_MainTex, i.texcoord); - color = float4(color.rgb * color.a, 1.0); - color = SrgbToNative(color); - return float4(color.rgb, 1.0); - } + fixed4 frag (v2f i) : COLOR + { + float4 color = i.color * tex2D(_MainTex, i.texcoord); + color = float4(color.rgb * color.a, 1.0); + color = SrgbToNative(color); + return float4(color.rgb, 1.0); + } - ENDCG - } - } + ENDCG + } + } } } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Diffuse.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Diffuse.shader index 28e7045f..f5e5d647 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Diffuse.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Diffuse.shader @@ -14,16 +14,16 @@ Shader "Brush/Diffuse" { Properties { - _Color ("Main Color", Color) = (1,1,1,1) - _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} - _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 + _Color ("Main Color", Color) = (1,1,1,1) + _MainTex ("Base (RGB) Trans (A)", 2D) = "white" {} + _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } SubShader { - Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} - LOD 200 + Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} + LOD 200 Cull Back - + CGPROGRAM #pragma surface surf Lambert vertex:vert alphatest:_Cutoff addshadow #pragma multi_compile __ TBT_LINEAR_TARGET @@ -32,19 +32,19 @@ CGPROGRAM sampler2D _MainTex; fixed4 _Color; -struct Input { - float2 uv_MainTex; - float4 color : COLOR; +struct Input { + float2 uv_MainTex; + float4 color : COLOR; }; void vert (inout appdata_full v) { - v.color = TbVertToNative(v.color); + v.color = TbVertToNative(v.color); } - + void surf (Input IN, inout SurfaceOutput o) { - fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; - o.Albedo = c.rgb * IN.color.rgb; - o.Alpha = c.a * IN.color.a; + fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; + o.Albedo = c.rgb * IN.color.rgb; + o.Alpha = c.a * IN.color.a; } ENDCG } @@ -52,9 +52,9 @@ ENDCG // MOBILE VERSION SubShader { - Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} - LOD 100 - + Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} + LOD 100 + CGPROGRAM #pragma surface surf Lambert vertex:vert alphatest:_Cutoff #pragma multi_compile __ TBT_LINEAR_TARGET @@ -63,19 +63,19 @@ CGPROGRAM sampler2D _MainTex; fixed4 _Color; -struct Input { - float2 uv_MainTex; - float4 color : COLOR; +struct Input { + float2 uv_MainTex; + float4 color : COLOR; }; void vert (inout appdata_full v) { - v.color = TbVertToNative(v.color); + v.color = TbVertToNative(v.color); } - + void surf (Input IN, inout SurfaceOutput o) { - fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; - o.Albedo = c.rgb * IN.color.rgb; - o.Alpha = c.a * IN.color.a; + fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; + o.Albedo = c.rgb * IN.color.rgb; + o.Alpha = c.a * IN.color.a; } ENDCG } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/DiffuseOpaque.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/DiffuseOpaque.shader index 1af1491a..341cc5a1 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/DiffuseOpaque.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/DiffuseOpaque.shader @@ -14,30 +14,30 @@ Shader "Brush/DiffuseOpaque" { Properties { - _Color ("Main Color", Color) = (1,1,1,1) + _Color ("Main Color", Color) = (1,1,1,1) } SubShader { - + Cull Back CGPROGRAM -#pragma surface surf Lambert vertex:vert addshadow +#pragma surface surf Lambert vertex:vert addshadow #pragma multi_compile __ TBT_LINEAR_TARGET #include "../../../Shaders/Include/Brush.cginc" fixed4 _Color; -struct Input { - float4 color : COLOR; +struct Input { + float4 color : COLOR; }; void vert(inout appdata_full v) { - v.color = TbVertToNative(v.color); + v.color = TbVertToNative(v.color); } void surf (Input IN, inout SurfaceOutput o) { - o.Albedo = _Color * IN.color.rgb; + o.Albedo = _Color * IN.color.rgb; } ENDCG } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Standard.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Standard.shader index f22d1cf6..357483db 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Standard.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Standard.shader @@ -14,80 +14,80 @@ Shader "Brush/Standard" { Properties { - _Color ("Main Color", Color) = (1,1,1,1) - _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0) - _Shininess ("Shininess", Range (0.01, 1)) = 0.078125 - _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {} - _BumpMap ("Normalmap", 2D) = "bump" {} - _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 + _Color ("Main Color", Color) = (1,1,1,1) + _SpecColor ("Specular Color", Color) = (0.5, 0.5, 0.5, 0) + _Shininess ("Shininess", Range (0.01, 1)) = 0.078125 + _MainTex ("Base (RGB) TransGloss (A)", 2D) = "white" {} + _BumpMap ("Normalmap", 2D) = "bump" {} + _Cutoff ("Alpha cutoff", Range(0,1)) = 0.5 } SubShader { - Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} - LOD 400 + Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} + LOD 400 Cull Back - - CGPROGRAM - #pragma target 3.0 - #pragma surface surf StandardSpecular vertex:vert alphatest:_Cutoff addshadow - #pragma multi_compile __ AUDIO_REACTIVE - #pragma multi_compile __ TBT_LINEAR_TARGET - #include "../../../Shaders/Include/Brush.cginc" + CGPROGRAM + #pragma target 3.0 + #pragma surface surf StandardSpecular vertex:vert alphatest:_Cutoff addshadow + #pragma multi_compile __ AUDIO_REACTIVE + #pragma multi_compile __ TBT_LINEAR_TARGET - struct Input { - float2 uv_MainTex; - float2 uv_BumpMap; - float4 color : Color; - }; - - sampler2D _MainTex; - sampler2D _BumpMap; - fixed4 _Color; - half _Shininess; + #include "../../../Shaders/Include/Brush.cginc" - void vert (inout appdata_full i /*, out Input o*/) { - // UNITY_INITIALIZE_OUTPUT(Input, o); - // o.tangent = v.tangent; - i.color = TbVertToNative(i.color); - } - - void surf (Input IN, inout SurfaceOutputStandardSpecular o) { - fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); - o.Albedo = tex.rgb * _Color.rgb * IN.color.rgb; - o.Smoothness = _Shininess; - o.Specular = _SpecColor; - o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); - o.Alpha = tex.a * IN.color.a; - } + struct Input { + float2 uv_MainTex; + float2 uv_BumpMap; + float4 color : Color; + }; + + sampler2D _MainTex; + sampler2D _BumpMap; + fixed4 _Color; + half _Shininess; + + void vert (inout appdata_full i /*, out Input o*/) { + // UNITY_INITIALIZE_OUTPUT(Input, o); + // o.tangent = v.tangent; + i.color = TbVertToNative(i.color); + } + + void surf (Input IN, inout SurfaceOutputStandardSpecular o) { + fixed4 tex = tex2D(_MainTex, IN.uv_MainTex); + o.Albedo = tex.rgb * _Color.rgb * IN.color.rgb; + o.Smoothness = _Shininess; + o.Specular = _SpecColor; + o.Normal = UnpackNormal(tex2D(_BumpMap, IN.uv_BumpMap)); + o.Alpha = tex.a * IN.color.a; + } ENDCG } - - // MOBILE VERSION - SubShader { - Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} - LOD 100 - - CGPROGRAM - #pragma surface surf Lambert vertex:vert alphatest:_Cutoff - sampler2D _MainTex; - fixed4 _Color; + // MOBILE VERSION + SubShader { + Tags {"Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout"} + LOD 100 - struct Input { - float2 uv_MainTex; - float4 color : COLOR; - }; + CGPROGRAM + #pragma surface surf Lambert vertex:vert alphatest:_Cutoff + + sampler2D _MainTex; + fixed4 _Color; + + struct Input { + float2 uv_MainTex; + float4 color : COLOR; + }; + + void vert (inout appdata_full v) { + } - void vert (inout appdata_full v) { - } - - void surf (Input IN, inout SurfaceOutput o) { - fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; - o.Albedo = c.rgb * IN.color.rgb; - o.Alpha = c.a * IN.color.a; - } - ENDCG - } + void surf (Input IN, inout SurfaceOutput o) { + fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color; + o.Albedo = c.rgb * IN.color.rgb; + o.Alpha = c.a * IN.color.a; + } + ENDCG + } - FallBack "Transparent/Cutout/VertexLit" + FallBack "Transparent/Cutout/VertexLit" } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Unlit.shader b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Unlit.shader index b7c8f6a7..cdaa4df1 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Unlit.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Unlit.shader @@ -55,7 +55,7 @@ SubShader { { v2f o; - + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); o.texcoord = v.texcoord; o.color = TbVertToNative(v.color); diff --git a/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Brush.cginc b/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Brush.cginc index 446ae66b..667131b9 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Brush.cginc +++ b/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Brush.cginc @@ -63,10 +63,10 @@ float randomizeByColor(float4 color) { } float3 randomNormal(float3 color) { - float noiseX = frac(sin(color.x))*46336.23745f; - float noiseY = frac(sin(color.y))*34748.34744f; - float noiseZ = frac(sin(color.z))*59998.47362f; - return normalize(float3(noiseX, noiseY, noiseZ)); + float noiseX = frac(sin(color.x))*46336.23745f; + float noiseY = frac(sin(color.y))*34748.34744f; + float noiseZ = frac(sin(color.z))*59998.47362f; + return normalize(float3(noiseX, noiseY, noiseZ)); } float4 musicReactiveColor(float4 color, float beat) { @@ -115,10 +115,10 @@ float4 SrgbToLinear(float4 color) { float4 SrgbToLinear_Large(float4 color) { float4 linearColor = SrgbToLinear(color); - color.r = color.r < 1.0 ? linearColor.r : color.r; - color.g = color.g < 1.0 ? linearColor.g : color.g; - color.b = color.b < 1.0 ? linearColor.b : color.b; - return color; + color.r = color.r < 1.0 ? linearColor.r : color.r; + color.g = color.g < 1.0 ? linearColor.g : color.g; + color.b = color.b < 1.0 ? linearColor.b : color.b; + return color; } float4 LinearToSrgb(float4 color) { @@ -129,14 +129,14 @@ float4 LinearToSrgb(float4 color) { float3 S3 = sqrt(S2); color.rgb = 0.662002687 * S1 + 0.684122060 * S2 - 0.323583601 * S3 - 0.0225411470 * linearColor; return color; -} +} // TB mesh colors are sRGB. TBT mesh colors are linear. float4 TbVertToSrgb(float4 color) { return LinearToSrgb(color); } float4 TbVertToLinear(float4 color) { return color; } // Conversions to and from native colorspace. -// Note that SrgbToLinear_Large only converts to linear in the 0:1 range +// Note that SrgbToLinear_Large only converts to linear in the 0:1 range // because Linear HDR values don't work with the Tilt Brush bloom filter #ifdef TBT_LINEAR_TARGET float4 SrgbToNative(float4 color) { return SrgbToLinear_Large(color); } @@ -148,6 +148,6 @@ float4 TbVertToNative(float4 color) { return TbVertToSrgb(color); } float4 NativeToSrgb(float4 color) { return color; } #endif -// TBT is in meters, TB is in decimeters. -#define kDecimetersToWorldUnits 0.1 +// TBT is in meters, TB is in decimeters. +#define kDecimetersToWorldUnits 0.1 diff --git a/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Particles.cginc b/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Particles.cginc index b22954a3..60d81331 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Particles.cginc +++ b/UnitySDK/Assets/TiltBrush/Assets/Shaders/Include/Particles.cginc @@ -90,31 +90,32 @@ float3 _RotatedQuadCorner(float3 up, float3 rt, float3 center, } // Returns the position of a camera-oriented quad corner. -// The _WS variant returns a worldspace position. // // center - object-space center of quad // halfSize - distance from center to an edge -// corner - a number in [0,3] in CCW order as seen from front, bottom-left is 0 +// corner - A non-negative number whose value mod 4 indicates the corner. +// In CCW order as seen from front, bottom-left is 0. // rotation - in radians // -float3 _OrientParticle(float3 center, float halfSize, int corner, float rotation) -{ +float4 OrientParticle(float3 center, float halfSize, int corner, float rotation) { + corner = corner & 3; float3 up, rt; { float4x4 cameraToObject = mul(unity_WorldToObject, unity_CameraToWorld); float3 upIsh = mul(cameraToObject, float3(0, 1, 0)); float3 objSpaceCameraPos = mul(cameraToObject, float4(0, 0, 0, 1)); float3 fwd = (center - objSpaceCameraPos); rt = normalize(cross(upIsh, fwd)); - // TODO(timaidley): Temporarily revert to previous behaviour; see b/62067322 - up = upIsh; // normalize(cross(fwd, rt)); + up = normalize(cross(fwd, rt)); } - return _RotatedQuadCorner(up, rt, center, halfSize, corner, rotation); + return float4(_RotatedQuadCorner(up, rt, center, halfSize, corner, rotation).xyz, 1); } -float3 _OrientParticle_WS(float3 center_OS, float halfSize_OS, int corner, float rotation) -{ - float3 center_WS = mul(unity_ObjectToWorld, float4(center_OS, 1)); +// Like OrientParticle, but takes the center in WS +// Slightly fewer matrix multiplies than the other version, +// but susceptible to FP inaccuracy when far away from the origin +float4 OrientParticle_WS(float3 center_WS, float halfSize_OS, int corner, float rotation) { + corner = corner & 3; float3 up_WS, rt_WS; { // Trying to write this without using unity_CameraToWorld because some renderers // don't keep around the inverse view matrix. upIsh_WS won't be unit-length, but that's fine. @@ -122,12 +123,11 @@ float3 _OrientParticle_WS(float3 center_OS, float halfSize_OS, int corner, float float3 cameraPos_WS = _WorldSpaceCameraPos; float3 fwd_WS = (center_WS - cameraPos_WS); rt_WS = normalize(cross(upIsh_WS, fwd_WS)); - // TODO(timaidley): Temporarily revert to previous behaviour; see b/62067322 - up_WS = upIsh_WS; // normalize(cross(fwd_WS, rt_WS)); + up_WS = normalize(cross(fwd_WS, rt_WS)); } float halfSize_WS = halfSize_OS * length(unity_ObjectToWorld[0].xyz); - return _RotatedQuadCorner(up_WS, rt_WS, center_WS, halfSize_WS, corner, rotation); + return float4(_RotatedQuadCorner(up_WS, rt_WS, center_WS, halfSize_WS, corner, rotation), 1); } // Sign bit of time is used to determine if this is a preview brush or not. @@ -144,38 +144,36 @@ float _ParticleUnpackTime(inout float time) { return sizeAdjust; } -// Adjusts a quad vertex to make the quad camera-facing, and scales the particle -// if the particle is in "preview mode". +// Works out the size of a particle from its corner and center positions, +// and the amount of time since it was spawned. // -// The "AndSpread" versions additionally cause the quad to spread out from -// an origin position. -// The "_WS" versions return the result in worldspace instead of objectspace. -// -// vertexId - Which corner of the quad (0 lower-left, increasing CCW) // corner - Object-space position of this corner; only used to compute particle size // center - Object-space position of the center after fully-born -// rotation - in radians // birthTime - Particle birth time; sign bit indicates preview-ness -// origin - Object-space position of center at birth -// spreadRate - How fast quad moves from origin to center. Units of periods-per-second, -// where one period is about 63% (ie, a decay to 1/e) - -#define OrientParticleAndSpread(a,b,c,d,e,f,g) OrientParticle(a,b,c,d,e) - -#define OrientParticleAndSpread_WS(a,b,c,d,e,f,g) OrientParticle_WS(a,b,c,d,e) - -float4 OrientParticle( - uint vertexId, float3 corner, float3 center, float rotation, float birthTime) { +// +float GetParticleHalfSize(float3 corner, float3 center, float birthTime) { float sizeAdjust = _ParticleUnpackTime(/* inout */ birthTime); float halfSize = length(corner - center) * kRecipSquareRootOfTwo * sizeAdjust; - float3 newCorner = _OrientParticle(center, halfSize, vertexId & 3, rotation); - return float4(newCorner.xyz, 1); + return halfSize; } -float4 OrientParticle_WS( - uint vertexId, float3 corner, float3 center, float rotation, float birthTime) { - float sizeAdjust = _ParticleUnpackTime(/* inout */ birthTime); - float halfSize = length(corner - center) * kRecipSquareRootOfTwo * sizeAdjust; - float3 newCorner_WS = _OrientParticle_WS(center, halfSize, vertexId & 3, rotation); - return float4(newCorner_WS.xyz, 1); +// Determines how far a particle halfSize moved from its origin to its resting position. +// Result its between 0 .. 1 +// +// birthTime - Particle birth time; sign bit indicates preview-ness +// spreadRate - How fast quad moves from origin to center. Units of periods-per-second, +// where one period is about 63% (ie, a decay to 1/e) +// +float SpreadProgress(float birthTime, float spreadRate) { + return 1; +} + +// Animates a particle position from its origin to its resting position +// +// center - Object-space position of the center after fully-born +// origin - Object-space position of center at birth +// progress - How far between the origin and center to place the particle +// +float4 SpreadParticle(ParticleVertexWithSpread_t particle, float progress) { + return float4(particle.center.xyz, 1); } diff --git a/UnitySDK/Assets/TiltBrush/Assets/Shaders/Unlit-Diffuse.shader b/UnitySDK/Assets/TiltBrush/Assets/Shaders/Unlit-Diffuse.shader index 90b8446c..2290d6ea 100644 --- a/UnitySDK/Assets/TiltBrush/Assets/Shaders/Unlit-Diffuse.shader +++ b/UnitySDK/Assets/TiltBrush/Assets/Shaders/Unlit-Diffuse.shader @@ -19,46 +19,46 @@ Shader "Unlit/Diffuse" { Properties { - _Color ("Color", Color) = (1,1,1,1) + _Color ("Color", Color) = (1,1,1,1) } SubShader { - Tags { "RenderType"="Opaque" } - LOD 100 - Blend One One, Zero One + Tags { "RenderType"="Opaque" } + LOD 100 + Blend One One, Zero One - - Pass { - CGPROGRAM - #pragma vertex vert - #pragma fragment frag - - #include "UnityCG.cginc" - struct appdata_t { - float4 vertex : POSITION; - }; + Pass { + CGPROGRAM + #pragma vertex vert + #pragma fragment frag - struct v2f { - float4 vertex : SV_POSITION; - }; + #include "UnityCG.cginc" - uniform float4 _Color; - - v2f vert (appdata_t v) - { - v2f o; - o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); - return o; - } - - fixed4 frag (v2f i) : SV_Target - { - _Color.rgb *= _Color.a; - return _Color; - } - ENDCG - } + struct appdata_t { + float4 vertex : POSITION; + }; + + struct v2f { + float4 vertex : SV_POSITION; + }; + + uniform float4 _Color; + + v2f vert (appdata_t v) + { + v2f o; + o.vertex = mul(UNITY_MATRIX_MVP, v.vertex); + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + _Color.rgb *= _Color.a; + return _Color; + } + ENDCG + } } } diff --git a/UnitySDK/ProjectSettings/ProjectSettings.asset b/UnitySDK/ProjectSettings/ProjectSettings.asset index bb906e7a..5cfd546b 100644 --- a/UnitySDK/ProjectSettings/ProjectSettings.asset +++ b/UnitySDK/ProjectSettings/ProjectSettings.asset @@ -29,6 +29,7 @@ PlayerSettings: m_StackTraceTypes: 010000000100000001000000010000000100000001000000 iosShowActivityIndicatorOnLoading: -1 androidShowActivityIndicatorOnLoading: -1 + tizenShowActivityIndicatorOnLoading: -1 iosAppInBackgroundBehavior: 0 displayResolutionDialog: 2 iosAllowHTTPDownload: 1 @@ -44,6 +45,7 @@ PlayerSettings: runInBackground: 1 captureSingleScreen: 0 Override IPod Music: 0 + muteOtherAudioSources: 0 Prepare IOS For Recording: 0 submitAnalytics: 1 usePlayerLog: 1 @@ -144,6 +146,7 @@ PlayerSettings: tvOSSmallIconLayers: [] tvOSLargeIconLayers: [] tvOSTopShelfImageLayers: [] + tvOSTopShelfImageWideLayers: [] iOSLaunchScreenType: 0 iOSLaunchScreenPortrait: {fileID: 0} iOSLaunchScreenLandscape: {fileID: 0} @@ -164,6 +167,9 @@ PlayerSettings: iOSDeviceRequirements: [] iOSURLSchemes: [] appleDeveloperTeamID: + iOSManualSigningProvisioningProfileID: + tvOSManualSigningProvisioningProfileID: + appleEnableAutomaticSigning: 0 AndroidTargetDevice: 0 AndroidSplashScreenScale: 0 androidSplashScreen: {fileID: 0} @@ -301,6 +307,9 @@ PlayerSettings: ps4attribShareSupport: 0 ps4attribExclusiveVR: 0 ps4disableAutoHideSplash: 0 + ps4videoRecordingFeaturesUsed: 0 + ps4contentSearchFeaturesUsed: 0 + ps4attribEyeToEyeDistanceSettingVR: 0 ps4IncludedModules: [] monoEnv: psp2Splashimage: {fileID: 0} @@ -430,12 +439,14 @@ PlayerSettings: XboxOneAllowedProductIds: [] XboxOnePersistentLocalStorageSize: 0 intPropertyNames: + - Android::ScriptingBackend - Standalone::ScriptingBackend - WebGL::ScriptingBackend - WebGL::audioCompressionFormat - WebGL::exceptionSupport - WebGL::memorySize - WebPlayer::ScriptingBackend + Android::ScriptingBackend: 0 Standalone::ScriptingBackend: 0 WebGL::ScriptingBackend: 1 WebGL::audioCompressionFormat: 4