#ifndef POI_GLITTER #define POI_GLITTER half3 _GlitterColor; POI_TEXTURE_NOSAMPLER(_GlitterMask); float2 _GlitterPan; POI_TEXTURE_NOSAMPLER(_GlitterColorMap); half _GlitterSpeed; half _GlitterBrightness; float _GlitterFrequency; float _GlitterJitter; half _GlitterSize; half _GlitterContrast; half _GlitterAngleRange; half _GlitterMinBrightness; half _GlitterBias; float _GlitterRandomColors; float2 _GlitterMinMaxSaturation; float2 _GlitterMinMaxBrightness; fixed _GlitterUseSurfaceColor; uint _GlitterBlendType; float3 randomFloat3(float2 Seed, float maximum) { return(.5 + float3( frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), frac(sin(dot(float2(Seed), float2(12.9898, 78.233))) * 43758.5453) ) * .5) * (maximum); } float3 randomFloat3Range(float2 Seed, float Range) { return(float3( frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) ) * 2 - 1) * Range; } float3 randomFloat3WiggleRange(float2 Seed, float Range) { float3 rando = (float3( frac(sin(dot(Seed.xy, float2(12.9898, 78.233))) * 43758.5453), frac(sin(dot(Seed.yx, float2(12.9898, 78.233))) * 43758.5453), frac(sin(dot(float2(Seed.x * Seed.y, Seed.y + Seed.x), float2(12.9898, 78.233))) * 43758.5453) ) * 2 - 1); float speed = 1 + _GlitterSpeed; return float3(sin((_Time.x + rando.x * pi) * speed), sin((_Time.x + rando.y * pi) * speed), sin((_Time.x + rando.z * pi) * speed)) * Range; } void Unity_RandomRange_float(float2 Seed, float Min, float Max, out float Out) { float randomno = frac(sin(dot(Seed, float2(12.9898, 78.233))) * 43758.5453); Out = lerp(Min, Max, randomno); } float3 RandomColorFromPoint(float2 rando) { fixed hue = random2(rando.x + rando.y).x; fixed saturation = lerp(_GlitterMinMaxSaturation.x, _GlitterMinMaxSaturation.y, rando.x); fixed value = lerp(_GlitterMinMaxBrightness.x, _GlitterMinMaxBrightness.y, rando.y); float3 hsv = float3(hue, saturation, value); return HSVtoRGB(hsv); } void applyGlitter(inout float3 finalEmission, inout float4 finalColor) { // Scale float2 st = poiMesh.uv[0] * _GlitterFrequency; // Tile the space float2 i_st = floor(st); float2 f_st = frac(st); float m_dist = 10.; // minimun distance float2 m_point = 0; // minimum point float2 randoPoint = 0; for (int j = -1; j <= 1; j ++) { for (int i = -1; i <= 1; i ++) { float2 neighbor = float2(i, j); float2 pos = random2(i_st + neighbor); float2 rando = pos; pos = 0.5 + 0.5 * sin(_GlitterJitter * 6.2831 * pos); float2 diff = neighbor + pos - f_st; float dist = length(diff); if (dist < m_dist) { m_dist = dist; m_point = pos; randoPoint = rando; } } } // Assign a color using the closest point position //color += dot(m_point, float2(.3, .6)); // Add distance field to closest point center // color.g = m_dist; // Show isolines //color -= abs(sin(40.0 * m_dist)) * 0.07; // Draw cell center half glitterAlpha = (1. - step(_GlitterSize, m_dist)); float3 randomRotation = 0; UNITY_BRANCH if (_GlitterSpeed > 0) { randomRotation = randomFloat3WiggleRange(randoPoint, _GlitterAngleRange); } else { randomRotation = randomFloat3Range(randoPoint, _GlitterAngleRange); } float3 norm = poiMesh.normals[0]; float3 glitterReflectionDirection = normalize(lerp(-poiCam.viewDir, mul(poiRotationMatrixFromAngles(randomRotation), norm), glitterAlpha)); float3 finalGlitter = lerp(0, _GlitterMinBrightness, glitterAlpha) + max(pow(dot(lerp(glitterReflectionDirection, poiCam.viewDir, _GlitterBias), poiCam.viewDir), _GlitterContrast) * _GlitterBrightness, 0); _GlitterColor *= lerp(1, finalColor, _GlitterUseSurfaceColor); _GlitterColor *= POI2D_SAMPLER_PAN(_GlitterColorMap, _MainTex, poiMesh.uv[_GlitterColorMapUV], _GlitterColorMapPan); float glitterMask = POI2D_SAMPLER_PAN(_GlitterMask, _MainTex, poiMesh.uv[_GlitterMaskUV], _GlitterMaskPan); #ifdef POI_BLACKLIGHT if(_BlackLightMaskGlitter != 4) { glitterMask *= blackLightMask[_BlackLightMaskGlitter]; } #endif _GlitterColor *= glitterMask; if(_GlitterRandomColors) { _GlitterColor *= RandomColorFromPoint(random2(randoPoint.x + randoPoint.y)); } UNITY_BRANCH if(_GlitterBlendType == 0) { finalEmission += finalGlitter * _GlitterColor; } else { finalColor.rgb = lerp(finalColor.rgb, finalGlitter * _GlitterColor, finalGlitter); } // Draw grid //color.r += step(.98, f_st.x) + step(.98, f_st.y); } #endif /* float2 F = inoise(poiMesh.uv[0] * _GlitterFrequency, _GlitterJitter) * .7; float HeightMap = (F.y - F.x) * _GlitterSpeed; float3 normal = UnityObjectToWorldNormal(float3(0, 0, 1)); normal = HeightToNormal(HeightMap, normal, poiMesh.worldPos); normal = WorldToTangentNormalfloattor(normal); //Unity_NormalFromHeight_World((HeightMap), test); //poiMathMagic((F.y - F.x), test); //test = (UnpackScaleNormal(float4(test, 1),40)); test = normalize( test.x * poiMesh.tangent + test.y * poiMesh.binormal + test.z * poiMesh.normals[0] ); //finalColor.rgb = dot(test, -poiCam.viewDir) * _GlitterBrightness; finalColor.rgb = normal; */ /* half circleGradient; half3 circleColor; inoise(poiMesh.uv[0] * _GlitterFrequency, circleGradient, circleColor); half circle = 1 - pow(max(0.0, abs(circleGradient) * _GlitterSpeed - 1), 2); float2 P = poiMesh.uv[0] * _GlitterFrequency; float2 Pi = mod(floor(P), 289.0); float2 Pf = ceil(P) * .03; finalColor.rgb = circle * circleColor; void inoise(float2 P, out half cirlceGradient, out half3 circleColor) { float2 Pi = mod(floor(P), 289.0); float2 Pf = frac(P); float3 oi = float3(-1.0, 0.0, 1.0); float3 of = float3(-0.5, 0.5, 1.5); float3 px = Permutation(Pi.x + oi); float3 p, ox, oy, dx, dy; float2 F = 1e6; for (int i = 0; i < 3; i ++) { p = Permutation(px[i] + Pi.y + oi); // pi1, pi2, pi3 ox = frac(p * K) - Ko; oy = mod(floor(p * K), 7.0) * K - Ko; dx = Pf.x - of[i] + _GlitterJitter * ox; dy = Pf.y - of + _GlitterJitter * oy; float3 d = dx * dx + dy * dy; // di1, di2 and di3, squared //find the lowest and second lowest distances for (int n = 0; n < 3; n ++) { if (d[n] < F[0]) { F[1] = F[0]; F[0] = d[n]; } else if(d[n] < F[1]) { F[1] = d[n]; } } } circleColor = randomFloat3(Pi, 1); cirlceGradient = F.x; } */