yum/3ner

A toon shader for Unity's BIRP.

git clone https://git.yummers.dev/yum/3ner

yumFold: add plane to octahedron code00553b3

master
29.3 KiB799 linesraw
1#ifndef __VERTEX_INC
2#define __VERTEX_INC
3
4#include "globals.cginc"
5#include "vertex_deformation.hlsl"
6
7#define OPCODE_NONE 0
8#define OPCODE_TUBE_TO_PLANE 1
9#define OPCODE_PLANE_TO_TUBE 2
10#define OPCODE_POINT_ALIGN 3
11#define OPCODE_AXIS_ALIGN 4
12#define OPCODE_NORM_CONVERSION 5
13#define OPCODE_SEAL 6
14#define OPCODE_SINE_WAVES 7
15#define OPCODE_FBM 8
16#define OPCODE_PLANE_TO_HEMI_OCTAHEDRON 9
17#define OPCODE_HEMI_OCTAHEDRON_TO_PLANE 10
18#define OPCODE_SCALE 11
19#define OPCODE_TRANSLATE 12
20#define OPCODE_PLANE_TO_OCTAHEDRON 13
21#define OPCODE_OCTAHEDRON_TO_PLANE 14
22#define OPCODE_ROTATE 15
23
24#if defined(_VERTEX_DEFORMATION)
25
26void apply_tube_to_plane(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
27  float3 p = v0.xyz;
28  float3 r = v1.xyz;
29  float3 s = v2.xyz;
30  float t = f0;
31  objPos = tube_to_plane(objPos, p, r, s, t);
32}
33
34void apply_tube_to_plane_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
35  float3 p = v0.xyz;
36  float3 r = v1.xyz;
37  float3 s = v2.xyz;
38  float t = f0;
39  tube_to_plane_normal(objPos, objNorm, objTan, p, r, s, t);
40}
41
42void apply_plane_to_tube(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
43  float3 p = v0.xyz;
44  float3 r = v1.xyz;
45  float3 s = v2.xyz;
46  float t = f0;
47  objPos = plane_to_tube(objPos, p, r, s, t);
48}
49
50void apply_plane_to_tube_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
51  float3 p = v0.xyz;
52  float3 r = v1.xyz;
53  float3 s = v2.xyz;
54  float t = f0;
55  plane_to_tube_normal(objPos, objNorm, objTan, p, r, s, t);
56}
57
58void apply_point_align(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
59  float3 po = v0.xyz;
60  float3 pp = v1.xyz;
61  float3 r = v2.xyz;
62  float t = f0;
63  objPos = point_align(objPos, po, pp, r, t);
64}
65
66void apply_point_align_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
67  float3 po = v0.xyz;
68  float3 pp = v1.xyz;
69  float3 r = v2.xyz;
70  float t = f0;
71  point_align_normal(objPos, objNorm, objTan, po, pp, r, t);
72}
73
74void apply_axis_align(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
75  float3 po = v0.xyz;
76  float3 pp = v1.xyz;
77  float3 r = v2.xyz;
78  float t = f0;
79  objPos = axis_align(objPos, po, pp, r, t);
80}
81
82void apply_axis_align_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
83  float3 po = v0.xyz;
84  float3 pp = v1.xyz;
85  float3 r = v2.xyz;
86  float t = f0;
87  axis_align_normal(objPos, objNorm, objTan, po, pp, r, t);
88}
89
90void apply_norm_conversion(inout float3 objPos, float f0, float f1, float f2) {
91  float input_k = f0;
92  float output_k = f1;
93  float t = f2;
94  objPos = norm_conversion(objPos, input_k, output_k, t);
95}
96
97void apply_norm_conversion_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float f0, float f1, float f2) {
98  float input_k = f0;
99  float output_k = f1;
100  float t = f2;
101  norm_conversion_normal(objPos, objNorm, objTan, input_k, output_k, t);
102}
103
104void apply_seal(inout float3 objPos, float f0, float f1, float f2, float t) {
105  float A = f0;
106  float k = f1;
107  float st = t * f2;
108  objPos = seal(objPos, A, k, st);
109}
110
111void apply_seal_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float f0, float f1, float f2, float t) {
112  float A = f0;
113  float k = f1;
114  float st = t * f2;
115  seal_normal(objPos, objNorm, objTan, A, k, st);
116}
117
118void apply_sine_waves(inout float3 objPos, float4 v0, float4 v1, float4 v2, float4 v3, float t) {
119  float st = t * 10;
120  float3 amplitude = v0.xyz;
121  float3 direction = v1.xyz;
122  float3 k = v2.xyz;
123  float3 omega = v3.xyz;
124  objPos = sine_wave(objPos, amplitude, direction, k, omega, st);
125}
126
127void apply_sine_waves_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float4 v3, float t) {
128  float st = t * 10;
129  float3 amplitude = v0.xyz;
130  float3 direction = v1.xyz;
131  float3 k = v2.xyz;
132  float3 omega = v3.xyz;
133  sine_wave_normal(objPos, objNorm, objTan, amplitude, direction, k, omega, st);
134}
135
136void apply_fbm(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0, float f1, float f2, float t) {
137  float st = t;
138  float3 amplitude = v0.xyz;
139  float3 velocity = v1.xyz;
140  float3 period = v2.xyz;
141  float gain = f0;
142  float lacunarity = f1;
143  float octaves = f2;
144  objPos = fbm(objPos, st, amplitude, gain, lacunarity, period, octaves, velocity);
145}
146
147void apply_fbm_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0, float f1, float f2, float t) {
148  float st = t;
149  float3 amplitude = v0.xyz;
150  float3 velocity = v1.xyz;
151  float3 period = v2.xyz;
152  float gain = f0;
153  float lacunarity = f1;
154  float octaves = f2;
155  fbm_normal(objPos, objNorm, objTan, st, amplitude, gain, lacunarity, period, octaves, velocity);
156}
157
158void apply_plane_to_hemi_octahedron(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
159  float3 p = v0.xyz;
160  float3 r = v1.xyz;
161  float3 s = v2.xyz;
162  float t = f0;
163  objPos = plane_to_hemi_octahedron(objPos, p, r, s, t);
164}
165
166void apply_plane_to_hemi_octahedron_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
167  float3 p = v0.xyz;
168  float3 r = v1.xyz;
169  float3 s = v2.xyz;
170  float t = f0;
171  plane_to_hemi_octahedron_normal(objPos, objNorm, objTan, p, r, s, t);
172}
173
174void apply_hemi_octahedron_to_plane(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
175  float3 p = v0.xyz;
176  float3 r = v1.xyz;
177  float3 s = v2.xyz;
178  float t = f0;
179  objPos = hemi_octahedron_to_plane(objPos, p, r, s, t);
180}
181
182void apply_hemi_octahedron_to_plane_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
183  float3 p = v0.xyz;
184  float3 r = v1.xyz;
185  float3 s = v2.xyz;
186  float t = f0;
187  hemi_octahedron_to_plane_normal(objPos, objNorm, objTan, p, r, s, t);
188}
189
190void apply_scale(inout float3 objPos, float4 v0, float f0) {
191  float3 k = v0.xyz;
192  float t = f0;
193  objPos = scale(objPos, k, t);
194}
195
196void apply_scale_normal(inout float3 objPos, inout float3 objNorm,
197    inout float3 objTan, float4 v0, float f0) {
198  float3 k = v0.xyz;
199  float t = f0;
200  scale_normal(objPos, objNorm, objTan, k, t);
201}
202
203void apply_translate(inout float3 objPos, float4 v0, float f0) {
204  float3 offset = v0.xyz;
205  float t = f0;
206  objPos = translate(objPos, offset, t);
207}
208
209void apply_translate_normal(inout float3 objPos, inout float3 objNorm,
210    inout float3 objTan, float4 v0, float f0) {
211  float3 offset = v0.xyz;
212  float t = f0;
213  translate_normal(objPos, objNorm, objTan, offset, t);
214}
215
216void apply_plane_to_octahedron(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
217  float3 p = v0.xyz;
218  float3 r = v1.xyz;
219  float3 s = v2.xyz;
220  float t = f0;
221  objPos = plane_to_octahedron(objPos, p, r, s, t);
222}
223
224void apply_plane_to_octahedron_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
225  float3 p = v0.xyz;
226  float3 r = v1.xyz;
227  float3 s = v2.xyz;
228  float t = f0;
229  plane_to_octahedron_normal(objPos, objNorm, objTan, p, r, s, t);
230}
231
232void apply_octahedron_to_plane(inout float3 objPos, float4 v0, float4 v1, float4 v2, float f0) {
233  float3 p = v0.xyz;
234  float3 r = v1.xyz;
235  float3 s = v2.xyz;
236  float t = f0;
237  objPos = octahedron_to_plane(objPos, p, r, s, t);
238}
239
240void apply_octahedron_to_plane_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan, float4 v0, float4 v1, float4 v2, float f0) {
241  float3 p = v0.xyz;
242  float3 r = v1.xyz;
243  float3 s = v2.xyz;
244  float t = f0;
245  octahedron_to_plane_normal(objPos, objNorm, objTan, p, r, s, t);
246}
247
248void apply_rotate(inout float3 objPos, float4 v0, float4 v1, float f0, float f1) {
249  float3 p = v0.xyz;
250  float3 axis = v1.xyz;
251  float angle = f0;
252  float t = f1;
253  objPos = rotate(objPos, p, axis, angle, t);
254}
255
256void apply_rotate_normal(inout float3 objPos, inout float3 objNorm,
257    inout float3 objTan, float4 v0, float4 v1, float f0, float f1) {
258  float3 p = v0.xyz;
259  float3 axis = v1.xyz;
260  float angle = f0;
261  float t = f1;
262  rotate_normal(objPos, objNorm, objTan, p, axis, angle, t);
263}
264
265void deform(inout float3 objPos) {
266  const float t = getTime();
267
268  [loop]
269  for (int i = 0; i < 16; i++) {
270    float enabled;
271    int opcode;
272    float f0, f1, f2, f3;
273    float4 v0, v1, v2, v3;
274
275    [forcecase]
276    switch (i) {
277      case 0:
278        enabled = _Vertex_Deformation_Slot_0_Enabled;
279        opcode = _Vertex_Deformation_Slot_0_Opcode;
280        f0 = _Vertex_Deformation_Slot_0_Float_0;
281        f1 = _Vertex_Deformation_Slot_0_Float_1;
282        f2 = _Vertex_Deformation_Slot_0_Float_2;
283        f3 = _Vertex_Deformation_Slot_0_Float_3;
284        v0 = _Vertex_Deformation_Slot_0_Vector_0;
285        v1 = _Vertex_Deformation_Slot_0_Vector_1;
286        v2 = _Vertex_Deformation_Slot_0_Vector_2;
287        v3 = _Vertex_Deformation_Slot_0_Vector_3;
288        break;
289      case 1:
290        enabled = _Vertex_Deformation_Slot_1_Enabled;
291        opcode = _Vertex_Deformation_Slot_1_Opcode;
292        f0 = _Vertex_Deformation_Slot_1_Float_0;
293        f1 = _Vertex_Deformation_Slot_1_Float_1;
294        f2 = _Vertex_Deformation_Slot_1_Float_2;
295        f3 = _Vertex_Deformation_Slot_1_Float_3;
296        v0 = _Vertex_Deformation_Slot_1_Vector_0;
297        v1 = _Vertex_Deformation_Slot_1_Vector_1;
298        v2 = _Vertex_Deformation_Slot_1_Vector_2;
299        v3 = _Vertex_Deformation_Slot_1_Vector_3;
300        break;
301      case 2:
302        enabled = _Vertex_Deformation_Slot_2_Enabled;
303        opcode = _Vertex_Deformation_Slot_2_Opcode;
304        f0 = _Vertex_Deformation_Slot_2_Float_0;
305        f1 = _Vertex_Deformation_Slot_2_Float_1;
306        f2 = _Vertex_Deformation_Slot_2_Float_2;
307        f3 = _Vertex_Deformation_Slot_2_Float_3;
308        v0 = _Vertex_Deformation_Slot_2_Vector_0;
309        v1 = _Vertex_Deformation_Slot_2_Vector_1;
310        v2 = _Vertex_Deformation_Slot_2_Vector_2;
311        v3 = _Vertex_Deformation_Slot_2_Vector_3;
312        break;
313      case 3:
314        enabled = _Vertex_Deformation_Slot_3_Enabled;
315        opcode = _Vertex_Deformation_Slot_3_Opcode;
316        f0 = _Vertex_Deformation_Slot_3_Float_0;
317        f1 = _Vertex_Deformation_Slot_3_Float_1;
318        f2 = _Vertex_Deformation_Slot_3_Float_2;
319        f3 = _Vertex_Deformation_Slot_3_Float_3;
320        v0 = _Vertex_Deformation_Slot_3_Vector_0;
321        v1 = _Vertex_Deformation_Slot_3_Vector_1;
322        v2 = _Vertex_Deformation_Slot_3_Vector_2;
323        v3 = _Vertex_Deformation_Slot_3_Vector_3;
324        break;
325      case 4:
326        enabled = _Vertex_Deformation_Slot_4_Enabled;
327        opcode = _Vertex_Deformation_Slot_4_Opcode;
328        f0 = _Vertex_Deformation_Slot_4_Float_0;
329        f1 = _Vertex_Deformation_Slot_4_Float_1;
330        f2 = _Vertex_Deformation_Slot_4_Float_2;
331        f3 = _Vertex_Deformation_Slot_4_Float_3;
332        v0 = _Vertex_Deformation_Slot_4_Vector_0;
333        v1 = _Vertex_Deformation_Slot_4_Vector_1;
334        v2 = _Vertex_Deformation_Slot_4_Vector_2;
335        v3 = _Vertex_Deformation_Slot_4_Vector_3;
336        break;
337      case 5:
338        enabled = _Vertex_Deformation_Slot_5_Enabled;
339        opcode = _Vertex_Deformation_Slot_5_Opcode;
340        f0 = _Vertex_Deformation_Slot_5_Float_0;
341        f1 = _Vertex_Deformation_Slot_5_Float_1;
342        f2 = _Vertex_Deformation_Slot_5_Float_2;
343        f3 = _Vertex_Deformation_Slot_5_Float_3;
344        v0 = _Vertex_Deformation_Slot_5_Vector_0;
345        v1 = _Vertex_Deformation_Slot_5_Vector_1;
346        v2 = _Vertex_Deformation_Slot_5_Vector_2;
347        v3 = _Vertex_Deformation_Slot_5_Vector_3;
348        break;
349      case 6:
350        enabled = _Vertex_Deformation_Slot_6_Enabled;
351        opcode = _Vertex_Deformation_Slot_6_Opcode;
352        f0 = _Vertex_Deformation_Slot_6_Float_0;
353        f1 = _Vertex_Deformation_Slot_6_Float_1;
354        f2 = _Vertex_Deformation_Slot_6_Float_2;
355        f3 = _Vertex_Deformation_Slot_6_Float_3;
356        v0 = _Vertex_Deformation_Slot_6_Vector_0;
357        v1 = _Vertex_Deformation_Slot_6_Vector_1;
358        v2 = _Vertex_Deformation_Slot_6_Vector_2;
359        v3 = _Vertex_Deformation_Slot_6_Vector_3;
360        break;
361      case 7:
362        enabled = _Vertex_Deformation_Slot_7_Enabled;
363        opcode = _Vertex_Deformation_Slot_7_Opcode;
364        f0 = _Vertex_Deformation_Slot_7_Float_0;
365        f1 = _Vertex_Deformation_Slot_7_Float_1;
366        f2 = _Vertex_Deformation_Slot_7_Float_2;
367        f3 = _Vertex_Deformation_Slot_7_Float_3;
368        v0 = _Vertex_Deformation_Slot_7_Vector_0;
369        v1 = _Vertex_Deformation_Slot_7_Vector_1;
370        v2 = _Vertex_Deformation_Slot_7_Vector_2;
371        v3 = _Vertex_Deformation_Slot_7_Vector_3;
372        break;
373      case 8:
374        enabled = _Vertex_Deformation_Slot_8_Enabled;
375        opcode = _Vertex_Deformation_Slot_8_Opcode;
376        f0 = _Vertex_Deformation_Slot_8_Float_0;
377        f1 = _Vertex_Deformation_Slot_8_Float_1;
378        f2 = _Vertex_Deformation_Slot_8_Float_2;
379        f3 = _Vertex_Deformation_Slot_8_Float_3;
380        v0 = _Vertex_Deformation_Slot_8_Vector_0;
381        v1 = _Vertex_Deformation_Slot_8_Vector_1;
382        v2 = _Vertex_Deformation_Slot_8_Vector_2;
383        v3 = _Vertex_Deformation_Slot_8_Vector_3;
384        break;
385      case 9:
386        enabled = _Vertex_Deformation_Slot_9_Enabled;
387        opcode = _Vertex_Deformation_Slot_9_Opcode;
388        f0 = _Vertex_Deformation_Slot_9_Float_0;
389        f1 = _Vertex_Deformation_Slot_9_Float_1;
390        f2 = _Vertex_Deformation_Slot_9_Float_2;
391        f3 = _Vertex_Deformation_Slot_9_Float_3;
392        v0 = _Vertex_Deformation_Slot_9_Vector_0;
393        v1 = _Vertex_Deformation_Slot_9_Vector_1;
394        v2 = _Vertex_Deformation_Slot_9_Vector_2;
395        v3 = _Vertex_Deformation_Slot_9_Vector_3;
396        break;
397      case 10:
398        enabled = _Vertex_Deformation_Slot_10_Enabled;
399        opcode = _Vertex_Deformation_Slot_10_Opcode;
400        f0 = _Vertex_Deformation_Slot_10_Float_0;
401        f1 = _Vertex_Deformation_Slot_10_Float_1;
402        f2 = _Vertex_Deformation_Slot_10_Float_2;
403        f3 = _Vertex_Deformation_Slot_10_Float_3;
404        v0 = _Vertex_Deformation_Slot_10_Vector_0;
405        v1 = _Vertex_Deformation_Slot_10_Vector_1;
406        v2 = _Vertex_Deformation_Slot_10_Vector_2;
407        v3 = _Vertex_Deformation_Slot_10_Vector_3;
408        break;
409      case 11:
410        enabled = _Vertex_Deformation_Slot_11_Enabled;
411        opcode = _Vertex_Deformation_Slot_11_Opcode;
412        f0 = _Vertex_Deformation_Slot_11_Float_0;
413        f1 = _Vertex_Deformation_Slot_11_Float_1;
414        f2 = _Vertex_Deformation_Slot_11_Float_2;
415        f3 = _Vertex_Deformation_Slot_11_Float_3;
416        v0 = _Vertex_Deformation_Slot_11_Vector_0;
417        v1 = _Vertex_Deformation_Slot_11_Vector_1;
418        v2 = _Vertex_Deformation_Slot_11_Vector_2;
419        v3 = _Vertex_Deformation_Slot_11_Vector_3;
420        break;
421      case 12:
422        enabled = _Vertex_Deformation_Slot_12_Enabled;
423        opcode = _Vertex_Deformation_Slot_12_Opcode;
424        f0 = _Vertex_Deformation_Slot_12_Float_0;
425        f1 = _Vertex_Deformation_Slot_12_Float_1;
426        f2 = _Vertex_Deformation_Slot_12_Float_2;
427        f3 = _Vertex_Deformation_Slot_12_Float_3;
428        v0 = _Vertex_Deformation_Slot_12_Vector_0;
429        v1 = _Vertex_Deformation_Slot_12_Vector_1;
430        v2 = _Vertex_Deformation_Slot_12_Vector_2;
431        v3 = _Vertex_Deformation_Slot_12_Vector_3;
432        break;
433      case 13:
434        enabled = _Vertex_Deformation_Slot_13_Enabled;
435        opcode = _Vertex_Deformation_Slot_13_Opcode;
436        f0 = _Vertex_Deformation_Slot_13_Float_0;
437        f1 = _Vertex_Deformation_Slot_13_Float_1;
438        f2 = _Vertex_Deformation_Slot_13_Float_2;
439        f3 = _Vertex_Deformation_Slot_13_Float_3;
440        v0 = _Vertex_Deformation_Slot_13_Vector_0;
441        v1 = _Vertex_Deformation_Slot_13_Vector_1;
442        v2 = _Vertex_Deformation_Slot_13_Vector_2;
443        v3 = _Vertex_Deformation_Slot_13_Vector_3;
444        break;
445      case 14:
446        enabled = _Vertex_Deformation_Slot_14_Enabled;
447        opcode = _Vertex_Deformation_Slot_14_Opcode;
448        f0 = _Vertex_Deformation_Slot_14_Float_0;
449        f1 = _Vertex_Deformation_Slot_14_Float_1;
450        f2 = _Vertex_Deformation_Slot_14_Float_2;
451        f3 = _Vertex_Deformation_Slot_14_Float_3;
452        v0 = _Vertex_Deformation_Slot_14_Vector_0;
453        v1 = _Vertex_Deformation_Slot_14_Vector_1;
454        v2 = _Vertex_Deformation_Slot_14_Vector_2;
455        v3 = _Vertex_Deformation_Slot_14_Vector_3;
456        break;
457      case 15:
458        enabled = _Vertex_Deformation_Slot_15_Enabled;
459        opcode = _Vertex_Deformation_Slot_15_Opcode;
460        f0 = _Vertex_Deformation_Slot_15_Float_0;
461        f1 = _Vertex_Deformation_Slot_15_Float_1;
462        f2 = _Vertex_Deformation_Slot_15_Float_2;
463        f3 = _Vertex_Deformation_Slot_15_Float_3;
464        v0 = _Vertex_Deformation_Slot_15_Vector_0;
465        v1 = _Vertex_Deformation_Slot_15_Vector_1;
466        v2 = _Vertex_Deformation_Slot_15_Vector_2;
467        v3 = _Vertex_Deformation_Slot_15_Vector_3;
468        break;
469    }
470
471    if (enabled > 0.5) {
472      switch (opcode) {
473        case OPCODE_TUBE_TO_PLANE:
474          apply_tube_to_plane(objPos, v0, v1, v2, f0);
475          break;
476        case OPCODE_PLANE_TO_TUBE:
477          apply_plane_to_tube(objPos, v0, v1, v2, f0);
478          break;
479        case OPCODE_POINT_ALIGN:
480          apply_point_align(objPos, v0, v1, v2, f0);
481          break;
482        case OPCODE_AXIS_ALIGN:
483          apply_axis_align(objPos, v0, v1, v2, f0);
484          break;
485        case OPCODE_NORM_CONVERSION:
486          apply_norm_conversion(objPos, f0, f1, f2);
487          break;
488        case OPCODE_SEAL:
489          apply_seal(objPos, f0, f1, f2, t);
490          break;
491        case OPCODE_SINE_WAVES:
492          apply_sine_waves(objPos, v0, v1, v2, v3, t);
493          break;
494        case OPCODE_FBM:
495          apply_fbm(objPos, v0, v1, v2, f0, f1, f2, t);
496          break;
497        case OPCODE_PLANE_TO_HEMI_OCTAHEDRON:
498          apply_plane_to_hemi_octahedron(objPos, v0, v1, v2, f0);
499          break;
500        case OPCODE_HEMI_OCTAHEDRON_TO_PLANE:
501          apply_hemi_octahedron_to_plane(objPos, v0, v1, v2, f0);
502          break;
503        case OPCODE_SCALE:
504          apply_scale(objPos, v0, f0);
505          break;
506        case OPCODE_TRANSLATE:
507          apply_translate(objPos, v0, f0);
508          break;
509        case OPCODE_PLANE_TO_OCTAHEDRON:
510          apply_plane_to_octahedron(objPos, v0, v1, v2, f0);
511          break;
512        case OPCODE_OCTAHEDRON_TO_PLANE:
513          apply_octahedron_to_plane(objPos, v0, v1, v2, f0);
514          break;
515        case OPCODE_ROTATE:
516          apply_rotate(objPos, v0, v1, f0, f1);
517          break;
518      }
519    }
520  }
521}
522
523void deform_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan) {
524  const float t = getTime();
525
526  [loop]
527  for (int i = 0; i < 16; i++) {
528    float enabled;
529    int opcode;
530    float f0, f1, f2, f3;
531    float4 v0, v1, v2, v3;
532
533    [forcecase]
534    switch (i) {
535      case 0:
536        enabled = _Vertex_Deformation_Slot_0_Enabled;
537        opcode = _Vertex_Deformation_Slot_0_Opcode;
538        f0 = _Vertex_Deformation_Slot_0_Float_0;
539        f1 = _Vertex_Deformation_Slot_0_Float_1;
540        f2 = _Vertex_Deformation_Slot_0_Float_2;
541        f3 = _Vertex_Deformation_Slot_0_Float_3;
542        v0 = _Vertex_Deformation_Slot_0_Vector_0;
543        v1 = _Vertex_Deformation_Slot_0_Vector_1;
544        v2 = _Vertex_Deformation_Slot_0_Vector_2;
545        v3 = _Vertex_Deformation_Slot_0_Vector_3;
546        break;
547      case 1:
548        enabled = _Vertex_Deformation_Slot_1_Enabled;
549        opcode = _Vertex_Deformation_Slot_1_Opcode;
550        f0 = _Vertex_Deformation_Slot_1_Float_0;
551        f1 = _Vertex_Deformation_Slot_1_Float_1;
552        f2 = _Vertex_Deformation_Slot_1_Float_2;
553        f3 = _Vertex_Deformation_Slot_1_Float_3;
554        v0 = _Vertex_Deformation_Slot_1_Vector_0;
555        v1 = _Vertex_Deformation_Slot_1_Vector_1;
556        v2 = _Vertex_Deformation_Slot_1_Vector_2;
557        v3 = _Vertex_Deformation_Slot_1_Vector_3;
558        break;
559      case 2:
560        enabled = _Vertex_Deformation_Slot_2_Enabled;
561        opcode = _Vertex_Deformation_Slot_2_Opcode;
562        f0 = _Vertex_Deformation_Slot_2_Float_0;
563        f1 = _Vertex_Deformation_Slot_2_Float_1;
564        f2 = _Vertex_Deformation_Slot_2_Float_2;
565        f3 = _Vertex_Deformation_Slot_2_Float_3;
566        v0 = _Vertex_Deformation_Slot_2_Vector_0;
567        v1 = _Vertex_Deformation_Slot_2_Vector_1;
568        v2 = _Vertex_Deformation_Slot_2_Vector_2;
569        v3 = _Vertex_Deformation_Slot_2_Vector_3;
570        break;
571      case 3:
572        enabled = _Vertex_Deformation_Slot_3_Enabled;
573        opcode = _Vertex_Deformation_Slot_3_Opcode;
574        f0 = _Vertex_Deformation_Slot_3_Float_0;
575        f1 = _Vertex_Deformation_Slot_3_Float_1;
576        f2 = _Vertex_Deformation_Slot_3_Float_2;
577        f3 = _Vertex_Deformation_Slot_3_Float_3;
578        v0 = _Vertex_Deformation_Slot_3_Vector_0;
579        v1 = _Vertex_Deformation_Slot_3_Vector_1;
580        v2 = _Vertex_Deformation_Slot_3_Vector_2;
581        v3 = _Vertex_Deformation_Slot_3_Vector_3;
582        break;
583      case 4:
584        enabled = _Vertex_Deformation_Slot_4_Enabled;
585        opcode = _Vertex_Deformation_Slot_4_Opcode;
586        f0 = _Vertex_Deformation_Slot_4_Float_0;
587        f1 = _Vertex_Deformation_Slot_4_Float_1;
588        f2 = _Vertex_Deformation_Slot_4_Float_2;
589        f3 = _Vertex_Deformation_Slot_4_Float_3;
590        v0 = _Vertex_Deformation_Slot_4_Vector_0;
591        v1 = _Vertex_Deformation_Slot_4_Vector_1;
592        v2 = _Vertex_Deformation_Slot_4_Vector_2;
593        v3 = _Vertex_Deformation_Slot_4_Vector_3;
594        break;
595      case 5:
596        enabled = _Vertex_Deformation_Slot_5_Enabled;
597        opcode = _Vertex_Deformation_Slot_5_Opcode;
598        f0 = _Vertex_Deformation_Slot_5_Float_0;
599        f1 = _Vertex_Deformation_Slot_5_Float_1;
600        f2 = _Vertex_Deformation_Slot_5_Float_2;
601        f3 = _Vertex_Deformation_Slot_5_Float_3;
602        v0 = _Vertex_Deformation_Slot_5_Vector_0;
603        v1 = _Vertex_Deformation_Slot_5_Vector_1;
604        v2 = _Vertex_Deformation_Slot_5_Vector_2;
605        v3 = _Vertex_Deformation_Slot_5_Vector_3;
606        break;
607      case 6:
608        enabled = _Vertex_Deformation_Slot_6_Enabled;
609        opcode = _Vertex_Deformation_Slot_6_Opcode;
610        f0 = _Vertex_Deformation_Slot_6_Float_0;
611        f1 = _Vertex_Deformation_Slot_6_Float_1;
612        f2 = _Vertex_Deformation_Slot_6_Float_2;
613        f3 = _Vertex_Deformation_Slot_6_Float_3;
614        v0 = _Vertex_Deformation_Slot_6_Vector_0;
615        v1 = _Vertex_Deformation_Slot_6_Vector_1;
616        v2 = _Vertex_Deformation_Slot_6_Vector_2;
617        v3 = _Vertex_Deformation_Slot_6_Vector_3;
618        break;
619      case 7:
620        enabled = _Vertex_Deformation_Slot_7_Enabled;
621        opcode = _Vertex_Deformation_Slot_7_Opcode;
622        f0 = _Vertex_Deformation_Slot_7_Float_0;
623        f1 = _Vertex_Deformation_Slot_7_Float_1;
624        f2 = _Vertex_Deformation_Slot_7_Float_2;
625        f3 = _Vertex_Deformation_Slot_7_Float_3;
626        v0 = _Vertex_Deformation_Slot_7_Vector_0;
627        v1 = _Vertex_Deformation_Slot_7_Vector_1;
628        v2 = _Vertex_Deformation_Slot_7_Vector_2;
629        v3 = _Vertex_Deformation_Slot_7_Vector_3;
630        break;
631      case 8:
632        enabled = _Vertex_Deformation_Slot_8_Enabled;
633        opcode = _Vertex_Deformation_Slot_8_Opcode;
634        f0 = _Vertex_Deformation_Slot_8_Float_0;
635        f1 = _Vertex_Deformation_Slot_8_Float_1;
636        f2 = _Vertex_Deformation_Slot_8_Float_2;
637        f3 = _Vertex_Deformation_Slot_8_Float_3;
638        v0 = _Vertex_Deformation_Slot_8_Vector_0;
639        v1 = _Vertex_Deformation_Slot_8_Vector_1;
640        v2 = _Vertex_Deformation_Slot_8_Vector_2;
641        v3 = _Vertex_Deformation_Slot_8_Vector_3;
642        break;
643      case 9:
644        enabled = _Vertex_Deformation_Slot_9_Enabled;
645        opcode = _Vertex_Deformation_Slot_9_Opcode;
646        f0 = _Vertex_Deformation_Slot_9_Float_0;
647        f1 = _Vertex_Deformation_Slot_9_Float_1;
648        f2 = _Vertex_Deformation_Slot_9_Float_2;
649        f3 = _Vertex_Deformation_Slot_9_Float_3;
650        v0 = _Vertex_Deformation_Slot_9_Vector_0;
651        v1 = _Vertex_Deformation_Slot_9_Vector_1;
652        v2 = _Vertex_Deformation_Slot_9_Vector_2;
653        v3 = _Vertex_Deformation_Slot_9_Vector_3;
654        break;
655      case 10:
656        enabled = _Vertex_Deformation_Slot_10_Enabled;
657        opcode = _Vertex_Deformation_Slot_10_Opcode;
658        f0 = _Vertex_Deformation_Slot_10_Float_0;
659        f1 = _Vertex_Deformation_Slot_10_Float_1;
660        f2 = _Vertex_Deformation_Slot_10_Float_2;
661        f3 = _Vertex_Deformation_Slot_10_Float_3;
662        v0 = _Vertex_Deformation_Slot_10_Vector_0;
663        v1 = _Vertex_Deformation_Slot_10_Vector_1;
664        v2 = _Vertex_Deformation_Slot_10_Vector_2;
665        v3 = _Vertex_Deformation_Slot_10_Vector_3;
666        break;
667      case 11:
668        enabled = _Vertex_Deformation_Slot_11_Enabled;
669        opcode = _Vertex_Deformation_Slot_11_Opcode;
670        f0 = _Vertex_Deformation_Slot_11_Float_0;
671        f1 = _Vertex_Deformation_Slot_11_Float_1;
672        f2 = _Vertex_Deformation_Slot_11_Float_2;
673        f3 = _Vertex_Deformation_Slot_11_Float_3;
674        v0 = _Vertex_Deformation_Slot_11_Vector_0;
675        v1 = _Vertex_Deformation_Slot_11_Vector_1;
676        v2 = _Vertex_Deformation_Slot_11_Vector_2;
677        v3 = _Vertex_Deformation_Slot_11_Vector_3;
678        break;
679      case 12:
680        enabled = _Vertex_Deformation_Slot_12_Enabled;
681        opcode = _Vertex_Deformation_Slot_12_Opcode;
682        f0 = _Vertex_Deformation_Slot_12_Float_0;
683        f1 = _Vertex_Deformation_Slot_12_Float_1;
684        f2 = _Vertex_Deformation_Slot_12_Float_2;
685        f3 = _Vertex_Deformation_Slot_12_Float_3;
686        v0 = _Vertex_Deformation_Slot_12_Vector_0;
687        v1 = _Vertex_Deformation_Slot_12_Vector_1;
688        v2 = _Vertex_Deformation_Slot_12_Vector_2;
689        v3 = _Vertex_Deformation_Slot_12_Vector_3;
690        break;
691      case 13:
692        enabled = _Vertex_Deformation_Slot_13_Enabled;
693        opcode = _Vertex_Deformation_Slot_13_Opcode;
694        f0 = _Vertex_Deformation_Slot_13_Float_0;
695        f1 = _Vertex_Deformation_Slot_13_Float_1;
696        f2 = _Vertex_Deformation_Slot_13_Float_2;
697        f3 = _Vertex_Deformation_Slot_13_Float_3;
698        v0 = _Vertex_Deformation_Slot_13_Vector_0;
699        v1 = _Vertex_Deformation_Slot_13_Vector_1;
700        v2 = _Vertex_Deformation_Slot_13_Vector_2;
701        v3 = _Vertex_Deformation_Slot_13_Vector_3;
702        break;
703      case 14:
704        enabled = _Vertex_Deformation_Slot_14_Enabled;
705        opcode = _Vertex_Deformation_Slot_14_Opcode;
706        f0 = _Vertex_Deformation_Slot_14_Float_0;
707        f1 = _Vertex_Deformation_Slot_14_Float_1;
708        f2 = _Vertex_Deformation_Slot_14_Float_2;
709        f3 = _Vertex_Deformation_Slot_14_Float_3;
710        v0 = _Vertex_Deformation_Slot_14_Vector_0;
711        v1 = _Vertex_Deformation_Slot_14_Vector_1;
712        v2 = _Vertex_Deformation_Slot_14_Vector_2;
713        v3 = _Vertex_Deformation_Slot_14_Vector_3;
714        break;
715      case 15:
716        enabled = _Vertex_Deformation_Slot_15_Enabled;
717        opcode = _Vertex_Deformation_Slot_15_Opcode;
718        f0 = _Vertex_Deformation_Slot_15_Float_0;
719        f1 = _Vertex_Deformation_Slot_15_Float_1;
720        f2 = _Vertex_Deformation_Slot_15_Float_2;
721        f3 = _Vertex_Deformation_Slot_15_Float_3;
722        v0 = _Vertex_Deformation_Slot_15_Vector_0;
723        v1 = _Vertex_Deformation_Slot_15_Vector_1;
724        v2 = _Vertex_Deformation_Slot_15_Vector_2;
725        v3 = _Vertex_Deformation_Slot_15_Vector_3;
726        break;
727    }
728
729    [branch]
730    if (enabled > 0.5) {
731      [forcecase]
732      switch (opcode) {
733        case OPCODE_TUBE_TO_PLANE:
734          apply_tube_to_plane_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
735          break;
736        case OPCODE_PLANE_TO_TUBE:
737          apply_plane_to_tube_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
738          break;
739        case OPCODE_POINT_ALIGN:
740          apply_point_align_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
741          break;
742        case OPCODE_AXIS_ALIGN:
743          apply_axis_align_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
744          break;
745        case OPCODE_NORM_CONVERSION:
746          apply_norm_conversion_normal(objPos, objNorm, objTan, f0, f1, f2);
747          break;
748        case OPCODE_SEAL:
749          apply_seal_normal(objPos, objNorm, objTan, f0, f1, f2, t);
750          break;
751        case OPCODE_SINE_WAVES:
752          apply_sine_waves_normal(objPos, objNorm, objTan, v0, v1, v2, v3, t);
753          break;
754        case OPCODE_FBM:
755          apply_fbm_normal(objPos, objNorm, objTan, v0, v1, v2, f0, f1, f2, t);
756          break;
757        case OPCODE_PLANE_TO_HEMI_OCTAHEDRON:
758          apply_plane_to_hemi_octahedron_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
759          break;
760        case OPCODE_HEMI_OCTAHEDRON_TO_PLANE:
761          apply_hemi_octahedron_to_plane_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
762          break;
763        case OPCODE_SCALE:
764          apply_scale_normal(objPos, objNorm, objTan, v0, f0);
765          break;
766        case OPCODE_TRANSLATE:
767          apply_translate_normal(objPos, objNorm, objTan, v0, f0);
768          break;
769        case OPCODE_PLANE_TO_OCTAHEDRON:
770          apply_plane_to_octahedron_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
771          break;
772        case OPCODE_OCTAHEDRON_TO_PLANE:
773          apply_octahedron_to_plane_normal(objPos, objNorm, objTan, v0, v1, v2, f0);
774          break;
775        case OPCODE_ROTATE:
776          apply_rotate_normal(objPos, objNorm, objTan, v0, v1, f0, f1);
777          break;
778      }
779    }
780  }
781}
782
783#else
784
785void deform(inout float3 objPos) {
786}
787
788void deform_normal(inout float3 objPos, inout float3 objNorm, inout float3 objTan) {
789}
790
791#endif  // _VERTEX_DEFORMATION
792
793void propagateObjPos(inout v2f i) {
794  i.worldPos = mul(unity_ObjectToWorld, float4(i.objPos, 1));
795  i.pos = UnityObjectToClipPos(i.objPos);
796  i.eyeVec.xyz = i.worldPos - _WorldSpaceCameraPos;
797}
798
799#endif  // __VERTEX_INC