Revision f046b159
Added by Leszek Koltunski almost 4 years ago
src/main/java/org/distorted/library/effect/VertexEffectQuaternion.java | ||
---|---|---|
29 | 29 |
*/ |
30 | 30 |
public class VertexEffectQuaternion extends VertexEffect |
31 | 31 |
{ |
32 |
private static final EffectName NAME = EffectName.VERTEX_QUATERNION; |
|
33 |
|
|
32 | 34 |
private Data4D mQuaternion; |
33 | 35 |
private Data3D mCenter; |
34 | 36 |
|
... | ... | |
41 | 43 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
42 | 44 |
{ |
43 | 45 |
mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step); |
44 |
return mQuaternion.get(uniforms,index,currentDuration,step); |
|
46 |
return mQuaternion.get(uniforms,index+VALUES_OFFSET,currentDuration,step); |
|
47 |
} |
|
48 |
|
|
49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
50 |
|
|
51 |
static String code() |
|
52 |
{ |
|
53 |
return |
|
54 |
|
|
55 |
"float qx = vUniforms[effect].x; \n" |
|
56 |
+ "float qy = vUniforms[effect].y; \n" |
|
57 |
+ "float qz = vUniforms[effect].z; \n" |
|
58 |
+ "float qw = vUniforms[effect].w; \n" |
|
59 |
+ "vec3 center = vUniforms[effect+1].yzw; \n" |
|
60 |
|
|
61 |
+ "v -= center; \n" |
|
62 |
|
|
63 |
+ "float tx = qx - v.z*qy + v.y*qz + v.x*qw; \n" |
|
64 |
+ "float ty = qy + v.z*qx + v.y*qw - v.x*qz; \n" |
|
65 |
+ "float tz = qz + v.z*qw - v.y*qx + v.x*qy; \n" |
|
66 |
+ "float tw = qw - v.z*qz - v.y*qy - v.x*qx; \n" |
|
67 |
|
|
68 |
+ "v.x = qw*tx + qz*ty - qy*tz - qx*tw; \n" |
|
69 |
+ "v.y = qw*ty - qz*tx - qy*tw + qx*tz; \n" |
|
70 |
+ "v.z = qw*tz - qz*tw + qy*tx - qx*ty; \n" |
|
71 |
|
|
72 |
+ "v += center; \n" |
|
73 |
|
|
74 |
+ "float nx = - n.z*qy + n.y*qz + n.x*qw; \n" |
|
75 |
+ "float ny = + n.z*qx + n.y*qw - n.x*qz; \n" |
|
76 |
+ "float nz = + n.z*qw - n.y*qx + n.x*qy; \n" |
|
77 |
+ "float nw = - n.z*qz - n.y*qy - n.x*qx; \n" |
|
78 |
|
|
79 |
+ "n.x = qw*nx + qz*ny - qy*nz - qx*nw; \n" |
|
80 |
+ "n.y = qw*ny - qz*nx - qy*nw + qx*nz; \n" |
|
81 |
+ "n.z = qw*nz - qz*nw + qy*nx - qx*ny; \n"; |
|
45 | 82 |
} |
46 | 83 |
|
47 | 84 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
52 | 89 |
*/ |
53 | 90 |
public static void enable() |
54 | 91 |
{ |
55 |
addEffect( EffectName.VERTEX_QUATERNION, |
|
56 |
"float qx = vUniforms[effect].x; \n" |
|
57 |
+ "float qy = vUniforms[effect].y; \n" |
|
58 |
+ "float qz = vUniforms[effect].z; \n" |
|
59 |
+ "float qw = vUniforms[effect].w; \n" |
|
60 |
+ "vec3 center = vUniforms[effect+1].yzw; \n" |
|
61 |
|
|
62 |
+ "v -= center; \n" |
|
63 |
|
|
64 |
+ "float tx = qx - v.z*qy + v.y*qz + v.x*qw; \n" |
|
65 |
+ "float ty = qy + v.z*qx + v.y*qw - v.x*qz; \n" |
|
66 |
+ "float tz = qz + v.z*qw - v.y*qx + v.x*qy; \n" |
|
67 |
+ "float tw = qw - v.z*qz - v.y*qy - v.x*qx; \n" |
|
68 |
|
|
69 |
+ "v.x = qw*tx + qz*ty - qy*tz - qx*tw; \n" |
|
70 |
+ "v.y = qw*ty - qz*tx - qy*tw + qx*tz; \n" |
|
71 |
+ "v.z = qw*tz - qz*tw + qy*tx - qx*ty; \n" |
|
72 |
|
|
73 |
+ "v += center; \n" |
|
74 |
|
|
75 |
+ "float nx = - n.z*qy + n.y*qz + n.x*qw; \n" |
|
76 |
+ "float ny = + n.z*qx + n.y*qw - n.x*qz; \n" |
|
77 |
+ "float nz = + n.z*qw - n.y*qx + n.x*qy; \n" |
|
78 |
+ "float nw = - n.z*qz - n.y*qy - n.x*qx; \n" |
|
79 |
|
|
80 |
+ "n.x = qw*nx + qz*ny - qy*nz - qx*nw; \n" |
|
81 |
+ "n.y = qw*ny - qz*nx - qy*nw + qx*nz; \n" |
|
82 |
+ "n.z = qw*nz - qz*nw + qy*nx - qx*ny; \n" |
|
83 |
); |
|
92 |
addEffect( NAME, code() ); |
|
84 | 93 |
} |
85 | 94 |
|
86 | 95 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
92 | 101 |
*/ |
93 | 102 |
public VertexEffectQuaternion(Data4D quaternion, Data3D center ) |
94 | 103 |
{ |
95 |
super(EffectName.VERTEX_QUATERNION);
|
|
104 |
super(NAME);
|
|
96 | 105 |
mQuaternion = quaternion; |
97 | 106 |
mCenter = center; |
98 | 107 |
} |
Also available in: Unified diff
First attempt at the MeshBase.apply(VertexEffect) API.