-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathx_tf_particle_v9.jxs
More file actions
350 lines (285 loc) · 8.6 KB
/
x_tf_particle_v9.jxs
File metadata and controls
350 lines (285 loc) · 8.6 KB
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
<jittershader name="fill-flat-quads">
<description>Default Shader </description>
<param name="iPosition" type="vec3" state="POSITION" />
<param name="iVelocity" type="vec3" state="NORMAL" />
<param name="iOrigin" type="vec3" state="VERTEX_ATTR0" />
<param name="iAgeNoise" type="vec4" state="VERTEX_ATTR1" />
<param name="uPoint" type="vec3" default="0.50 0.50 0.0" />
<param name="uForceFlow" type="vec3" default="0.00 0.00 0.0" />
<param name="uForceFlow2" type="vec3" default="0.00 0.00 0.0" />
<param name="uForceOrigin" type="vec3" default="0.00 0.00 0.0" />
<param name="uForcePoint" type="vec3" default="0.00 0.00 0.0" />
<param name="uFriction" type="float" default="0.98" />
<param name="uAging" type="float" default="0.01" />
<param name="uLuminance" type="float" default="0.1" />
<param name="uDelMode" type="int" default="0" />
<param name="uZFactor" type="float" default="1" />
<param name="uZSource" type="int" default="0" />
<param name="uLumaToAcc" type="int" default="0" />
<param name="uLumaToPoint" type="int" default="0" />
<param name="uLumaToOrigin" type="int" default="0" />
<param name="uLumaSource" type="int" default="0" />
<param name="txInput1" type="int" default="0" />
<param name="txInput2" type="int" default="1" />
<param name="opticalFlow" type="int" default="2" />
<param name="opticalFlow2" type="int" default="3" />
<param name="txMix" type="int" default="4" />
<param name="texDim" type="vec2" default="640.0 360.0" />
<language name="glsl" version="1.5">
<bind param="iPosition" program="vp" />
<bind param="iVelocity" program="vp" />
<bind param="iOrigin" program="vp" />
<bind param="iAgeNoise" program="vp" />
<bind param="uPoint" program="vp" />
<bind param="uForceFlow" program="vp" />
<bind param="uForceFlow2" program="vp" />
<bind param="uForcePoint" program="vp" />
<bind param="uForceOrigin" program="vp" />
<bind param="uFriction" program="vp" />
<bind param="uAging" program="vp" />
<bind param="uLuminance" program="vp" />
<bind param="uDelMode" program="vp" />
<bind param="uZFactor" program="vp" />
<bind param="uZSource" program="vp" />
<bind param="uLumaToAcc" program="vp" />
<bind param="uLumaToPoint" program="vp" />
<bind param="uLumaToOrigin" program="vp" />
<bind param="uLumaSource" program="vp" />
<bind param="txInput1" program="vp" />
<bind param="txInput2" program="vp" />
<bind param="opticalFlow" program="vp" />
<bind param="opticalFlow2" program="vp" />
<bind param="txMix" program="vp" />
<bind param="texDim" program="vp" />
<program name="vp" type="vertex">
<![CDATA[
#version 330 core
uniform vec3 uPoint;
uniform vec3 uForceFlow;
uniform vec3 uForceFlow2;
uniform vec3 uForcePoint;
uniform vec3 uForceOrigin;
uniform float uFriction;
uniform float uAging;
uniform float uLuminance;
uniform float uZFactor;
uniform int uZSource;
uniform int uDelMode;
uniform int uLumaToAcc;
uniform int uLumaToOrigin;
uniform int uLumaToPoint;
uniform int uLumaSource;
uniform vec2 texDim;
uniform sampler2DRect txInput1;
uniform sampler2DRect txInput2;
uniform sampler2DRect opticalFlow;
uniform sampler2DRect opticalFlow2;
uniform sampler2DRect txMix;
in vec3 iPosition;
in vec3 iVelocity;
in vec3 iOrigin;
in vec4 iAgeNoise;
out vec3 oOrigin;
out vec3 oPosition;
out vec3 oVelocity;
out vec4 oAgeNoise;
void Reflect(inout vec3 velocity, inout vec3 position, in vec3 worldsize )
{
if (position.x > worldsize.x )
{
position.x = worldsize.x;
velocity.x *= -1.0;
}
else if (position.x < -worldsize.x)
{
position.x = -worldsize.x;
velocity.x *= -1.0;
}
if (position.y > worldsize.y )
{
position.y = worldsize.y;
velocity.y *= -1.0;
}
else if (position.y < -worldsize.y)
{
position.y = -worldsize.y;
velocity.y *= -1.0;
}
if (position.z > worldsize.z )
{
position.z = worldsize.z;
velocity.z *= -1.0;
}
else if (position.z < -worldsize.z)
{
position.z = -worldsize.z;
velocity.z *= -1.0;
}
}
void overflow(inout vec3 position, in vec3 worldsize )
{
if (position.x >= worldsize.x )
{
position.x = -worldsize.x;
}
else if (position.x <= -worldsize.x)
{
position.x = worldsize.x;
}
if (position.y >= worldsize.y )
{
position.y = -worldsize.y;
}
else if (position.y <= -worldsize.y)
{
position.y = worldsize.y;
}
if (position.z >= worldsize.z )
{
position.z = -worldsize.z;
}
else if (position.z <= -worldsize.z)
{
position.z = worldsize.z;
}
}
void delete(inout vec3 position, in vec3 worldsize, in vec3 newPos)
{
position.x = position.x > worldsize.x || position.x < -worldsize.x ? position.x = newPos.x : position.x;
position.y = position.y > worldsize.y || position.y < -worldsize.y ? position.y = newPos.y : position.y;
position.z = position.z > worldsize.z || position.z < -worldsize.z ? position.z = newPos.z : position.z;
}
void main() {
vec2 texcoord = ((iPosition.xy + 1.0) / 2.0) * texDim;
float ratio = texDim.x / texDim.y;
vec4 texIn1 = texture(txInput1, texcoord);
vec4 texIn2 = texture(txInput2, texcoord);
vec4 texMix = texture(txMix, texcoord);
// Luminance von Textures
vec4 lumacoeff = vec4(0.299,0.587,0.114,0.);
float luma1 = dot(texIn1,lumacoeff);
float luma2 = dot(texIn2,lumacoeff);
float lumamix = dot(texMix,lumacoeff);
float alpha1 = texIn1.a;
float alpha2 = texIn2.a;
// Depth Option
// perfect would be to include some kind of depthtexture in alpha channel of movies
float zpos = 0;
float d;
switch(uZSource) {
case 0:
d = luma1 * 2.0 - 1.0;
zpos += d;
break;
case 1:
d = luma2 * 2.0 - 1.0;
zpos += d;
break;
case 2:
d = alpha1 - 0.5;
zpos += alpha1;
break;
case 3:
d = alpha2 - 0.5;
zpos += alpha2;
break;
default:
zpos += iOrigin.z;
break;
}
zpos *= uZFactor;
vec3 originalPos = vec3(iOrigin.xy,zpos);
vec3 attractionPoint = vec3(uPoint);
vec3 worldsize = vec3(1.0,1.0,1.0);
// Masse ist random von jit.noise (X)
//float mass = iAgeNoise.y;
//float aging = iAgeNoise.x;
float mass;
switch(uLumaSource) {
case 0:
mass = luma1;
break;
case 1:
mass = luma2;
break;
case 2:
mass = lumamix;
break;
default:
break;
}
mass *= 0.95; // bright luma == grosse masse
mass += 0.05; // dark luminance == wenig masse
// FLOW1 : FORCE AND ACCELERATION
vec4 flow = texture(opticalFlow, texcoord); //iColor.xy * texDim);
vec3 flowdir = vec3(flow.x - flow.y, flow.z-flow.w,flow.z - flow.y - flow.x);
vec3 acc = vec3(0.0);
acc = vec3(flowdir.xy * (uForceFlow.xy * 0.001), flowdir.z * (uForceFlow.z * -0.001));
if (uLumaToAcc == 1) { acc *= mass; }
// FLOW2 : FORCE AND ACCELERATION
vec4 flow2 = texture(opticalFlow2, texcoord); //iColor.xy * texDim);
vec3 flowdir2 = vec3(flow2.x - flow2.y, flow2.z-flow2.w,flow2.z - flow2.y - flow2.x);
vec3 acc2 = vec3(0.0);
acc2 = flowdir2 * (uForceFlow2 * 0.001);
if (uLumaToAcc == 1) { acc2 *= mass; }
// FORCE TO ORIGIN
vec3 dirOrigin = originalPos - iPosition;
//vec3 dirOrigin = iPosition - oPosition;
vec3 normDirOrigin = clamp(normalize(dirOrigin), vec3(-1.0), vec3(1.0));
float distOrigin = clamp(length(dirOrigin),0.0,1.0);
vec3 accOrigin = (normDirOrigin * distOrigin) * (uForceOrigin * 0.01);
if (uLumaToOrigin == 1) { accOrigin *= mass; }
// FORCE TO POINT
float randx = iAgeNoise.z * 2.0 - 1.0;
vec3 dirPoint = uPoint - iPosition;
vec3 normDirPoint = clamp(normalize(dirPoint),vec3(-1.0),vec3(1.0));
float distPoint = clamp(length(dirPoint),0.0,1.0);
vec3 accPoint = (normDirPoint * distPoint) * (uForcePoint * 0.01);
if (uLumaToPoint == 1) {
accPoint *= mass;
//accPoint *= randx;
}
// VELOCITY
// Original Velocity = 0
//float randomage = iAgeNoise.x * 0.01;
//float mass = iAgeNoise.y;
//vec3 randomNumbers = iAgeNoise.yzw * 0.001;
float age = iAgeNoise.x;
// mass (0.05 - 1.0) basiert auf Luminance / Black Paricles = 0.05, white = 1.0
// friction (0.0 - 1.0)
// friction += mass * 0.1 // 0.005 - 0.1
if(age > 1.0) {
//oVelocity = vec3(0.0) * uFriction;
oVelocity = iVelocity * uFriction;
age = 0.0;
oPosition = iOrigin;
mass = mass;
} else {
age += (uAging * mass) * 0.001;
oVelocity = iVelocity * uFriction;
oVelocity += accOrigin;
oVelocity += (acc + acc2);
oVelocity += accPoint;
oPosition = iPosition + oVelocity;
}
if (uDelMode == 1) {
delete(oPosition, worldsize, originalPos);
} else if (uDelMode == 2) {
Reflect(oVelocity,oPosition,worldsize);
} else if (uDelMode == 3) {
overflow(oPosition,worldsize);
} else {}
oOrigin = iOrigin;
oAgeNoise = vec4(age,iAgeNoise.yzw);
}
]]>
</program>
<program name="fp" type="fragment">
<![CDATA[
#version 330 core
void main() {
}
]]>
</program>
</language>
</jittershader>