1 | /* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */ |
---|
2 | /* |
---|
3 | * Copyright (c) 2004-2013 HUBzero Foundation, LLC |
---|
4 | * |
---|
5 | * Authors: |
---|
6 | * Wei Qiao <qiaow@purdue.edu> |
---|
7 | */ |
---|
8 | |
---|
9 | #include "particle_common.cg" |
---|
10 | |
---|
11 | void main(in float4 posin : POSITION, |
---|
12 | in float4 colin : COLOR0, |
---|
13 | out float4 posout : POSITION, |
---|
14 | out float4 colout : COLOR0, |
---|
15 | out float2 center : TEXCOORD2, |
---|
16 | out float4 rotation : TEXCOORD3, |
---|
17 | out float4 pointSize : PSIZE, |
---|
18 | uniform sampler3D vfield : TEXUNIT1, |
---|
19 | uniform float tanHalfFOV, |
---|
20 | uniform float4x4 modelview, |
---|
21 | uniform float4x4 mvp) |
---|
22 | { |
---|
23 | float4 vec; |
---|
24 | vec.xyz = posin.xyz; |
---|
25 | vec.w = 1.0; |
---|
26 | |
---|
27 | // length |
---|
28 | // the scale of from bottom to top |
---|
29 | float3 velocity = tex3D(vfield, vec.xyz).yzw * 2 - float3(1, 1, 1); |
---|
30 | |
---|
31 | // bottom to top |
---|
32 | // scale |
---|
33 | center.y = ((((int) (length(velocity.xyz) * 511)) / SUBIMAGE_SIZE_Y) * SUBIMAGE_SIZE_Y) / 512.0; |
---|
34 | |
---|
35 | velocity = mul(modelview, float4(velocity.x, velocity.y, velocity.z, 0.0)).xyz; |
---|
36 | if (length(velocity) != 0.0) |
---|
37 | velocity = normalize(velocity); |
---|
38 | |
---|
39 | float a = (asin(velocity.z) / 3.141592 + 1) * 0.5; |
---|
40 | center.x = ((((int) (a * 511)) / SUBIMAGE_SIZE_X) * SUBIMAGE_SIZE_X) / 512.0; |
---|
41 | |
---|
42 | if ((abs(velocity.x) == 0.0) && (abs(velocity.y) == 0.0)) { |
---|
43 | rotation.x = 1; |
---|
44 | rotation.y = 0; |
---|
45 | rotation.z = 0; |
---|
46 | rotation.w = 1; |
---|
47 | } else { |
---|
48 | float2 xy = normalize(velocity.xy); |
---|
49 | rotation.x = xy.x * 0.8; |
---|
50 | rotation.y = -xy.y * 0.8; |
---|
51 | rotation.z = xy.y * 0.8; |
---|
52 | rotation.w = xy.x * 0.8; |
---|
53 | } |
---|
54 | |
---|
55 | float4 posEye = mul(modelview, posin); |
---|
56 | //pointSize = tanHalfFOV / -posEye.z / 5; |
---|
57 | //pointSize = tanHalfFOV / -posEye.z / 10; //j-wire |
---|
58 | pointSize = 20; //0 / -posEye.z; |
---|
59 | |
---|
60 | posout = mul(mvp, vec); |
---|
61 | |
---|
62 | colout = colin; |
---|
63 | } |
---|