summaryrefslogtreecommitdiffstats
path: root/Third_Party/at.pimaker.ltcgi/Shaders/LTCGI_uniform.cginc
blob: 2bf46731c9381ec1a7ea7f6d625090f2fc5ff7d8 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef LTCGI_UNIFORM_INCLUDED
#define LTCGI_UNIFORM_INCLUDED

// global sampler (trilinear)
#ifndef LTCGI_SAMPLER
SamplerState sampler_LTCGI_trilinear_clamp_sampler;
#define LTCGI_SAMPLER sampler_LTCGI_trilinear_clamp_sampler
#define LTCGI_SAMPLER_RAW _LTCGI_trilinear_clamp_sampler
#endif

// LUTs
#ifndef SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER
#ifndef LTCGI_DISABLE_LUT2
uniform Texture2D<float4> _Udon_LTCGI_lut2;
#endif
uniform Texture2D<float4> _Udon_LTCGI_lut1;
#endif

#ifndef SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER
uniform Texture2D<float4> _Udon_LTCGI_static_uniforms;
#endif

#ifdef LTCGI_STATIC_UNIFORMS

float4 _Udon_LTCGI_Vertices_0_get(uint i) {
    return _Udon_LTCGI_static_uniforms[uint2(0, i)];
}
float4 _Udon_LTCGI_Vertices_1_get(uint i) {
    return _Udon_LTCGI_static_uniforms[uint2(1, i)];
}
float4 _Udon_LTCGI_Vertices_2_get(uint i) {
    return _Udon_LTCGI_static_uniforms[uint2(2, i)];
}
float4 _Udon_LTCGI_Vertices_3_get(uint i) {
    return _Udon_LTCGI_static_uniforms[uint2(3, i)];
}

#else

// vertices in object space; w component is UV (legacy)
uniform float4 _Udon_LTCGI_Vertices_0[MAX_SOURCES];
uniform float4 _Udon_LTCGI_Vertices_1[MAX_SOURCES];
uniform float4 _Udon_LTCGI_Vertices_2[MAX_SOURCES];
uniform float4 _Udon_LTCGI_Vertices_3[MAX_SOURCES];

float4 _Udon_LTCGI_Vertices_0_get(uint i) {
    return _Udon_LTCGI_Vertices_0[i];
}
float4 _Udon_LTCGI_Vertices_1_get(uint i) {
    return _Udon_LTCGI_Vertices_1[i];
}
float4 _Udon_LTCGI_Vertices_2_get(uint i) {
    return _Udon_LTCGI_Vertices_2[i];
}
float4 _Udon_LTCGI_Vertices_3_get(uint i) {
    return _Udon_LTCGI_Vertices_3[i];
}

#endif

// light source count, maximum is MAX_SOURCES
uniform uint _Udon_LTCGI_ScreenCount;

// per-renderer mask to select sources,
// for max perf update _Udon_LTCGI_ScreenCount too
uniform bool _Udon_LTCGI_Mask[MAX_SOURCES];

// extra data per light source, layout:
//  color.r   color.g   color.b   flags*
// * b0=double-sided, b1=diffuse-from-lightmap, b2=specular, b3=diffuse,
//   b4-b7=texture index (0=video, (n>0)=n-1)
//   b8-b9=color mode
//   b10-b11=lightmap channel (0=disabled, 1=r, 2=g, 3=b)
//   b12=cylinder
//   b13-14=audio link band
//   b15=lightmap diffuse only
// (color black = fully disabled)
uniform float4 _Udon_LTCGI_ExtraData[MAX_SOURCES];

ltcgi_flags ltcgi_parse_flags(uint val, bool noLmDiff)
{
    ltcgi_flags ret = (ltcgi_flags)0;
    ret.doublesided = (val & 1) == 1;

    #ifdef LTCGI_ALWAYS_LTC_DIFFUSE
    ret.diffFromLm  = false;
    #else
    ret.diffFromLm  = !noLmDiff && (val & 2) == 2;
    #endif

    ret.diffuse     = (val & 8) == 8;

    ret.specular    = (val & 4) == 4;
    ret.texindex    = (val & 0xf0) >> 4;
    ret.colormode   = (val & 0x300) >> 8;

    #ifdef LTCGI_ALWAYS_LTC_DIFFUSE
    ret.lmch        = 0;
    #else
    ret.lmch        = (val & 0xC00) >> 10;
    #endif

    ret.cylinder    = (val & (1 << 12)) == (1 << 12);

    #ifdef LTCGI_AUDIOLINK
    ret.alBand      = (val & 0x6000) >> 13;
    #endif

    ret.lmdOnly     = (val & (1 << 15)) == (1 << 15);

    return ret;
}

// video input
#ifndef SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER
uniform Texture2D<float4> _Udon_LTCGI_Texture_LOD0;
#ifndef LTCGI_FAST_SAMPLING
uniform Texture2D<float4> _Udon_LTCGI_Texture_LOD1;
uniform Texture2D<float4> _Udon_LTCGI_Texture_LOD2;
uniform Texture2D<float4> _Udon_LTCGI_Texture_LOD3;
#endif
#endif

// static textures
#ifdef LTCGI_STATIC_TEXTURES
UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(_Udon_LTCGI_Texture_LOD0_arr);
#ifndef LTCGI_FAST_SAMPLING
UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(_Udon_LTCGI_Texture_LOD1_arr);
UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(_Udon_LTCGI_Texture_LOD2_arr);
UNITY_DECLARE_TEX2DARRAY_NOSAMPLER(_Udon_LTCGI_Texture_LOD3_arr);
#endif
#endif

// lightmap
#ifndef SHADER_TARGET_SURFACE_ANALYSIS_MOJOSHADER
#ifndef LTCGI_ALWAYS_LTC_DIFFUSE
uniform Texture2D<float4> _Udon_LTCGI_Lightmap;
#endif
#endif
uniform float3 _Udon_LTCGI_LightmapMult;
uniform float4 _Udon_LTCGI_LightmapST;

// global toggle
uniform float _Udon_LTCGI_GlobalEnable;

#endif