Revision f046b159
Added by Leszek Koltunski almost 4 years ago
src/main/java/org/distorted/library/effect/VertexEffectRotate.java | ||
---|---|---|
30 | 30 |
*/ |
31 | 31 |
public class VertexEffectRotate extends VertexEffect |
32 | 32 |
{ |
33 |
private static final EffectName NAME = EffectName.VERTEX_ROTATE; |
|
34 |
|
|
33 | 35 |
private Data1D mAngle; |
34 | 36 |
private Data3D mAxis, mCenter; |
35 | 37 |
|
... | ... | |
42 | 44 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
43 | 45 |
{ |
44 | 46 |
mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step); |
45 |
mAxis.get(uniforms,index+1,currentDuration,step); |
|
47 |
mAxis.get(uniforms,index+VALUES_OFFSET+1,currentDuration,step);
|
|
46 | 48 |
|
47 | 49 |
float len = uniforms[index+1]*uniforms[index+1] + uniforms[index+2]*uniforms[index+2] + uniforms[index+3]*uniforms[index+3]; |
48 | 50 |
len = (float)Math.sqrt(len); |
49 | 51 |
|
50 | 52 |
if( len!=0 ) |
51 | 53 |
{ |
52 |
uniforms[index+1] /= len; |
|
53 |
uniforms[index+2] /= len; |
|
54 |
uniforms[index+3] /= len; |
|
54 |
uniforms[index+VALUES_OFFSET+1] /= len;
|
|
55 |
uniforms[index+VALUES_OFFSET+2] /= len;
|
|
56 |
uniforms[index+VALUES_OFFSET+3] /= len;
|
|
55 | 57 |
} |
56 | 58 |
|
57 |
return mAngle.get(uniforms,index,currentDuration,step); |
|
59 |
return mAngle.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
|
|
58 | 60 |
} |
59 | 61 |
|
60 | 62 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
61 |
// PUBLIC API |
|
62 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
63 |
/** |
|
64 |
* Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work. |
|
65 |
*/ |
|
66 |
public static void enable() |
|
63 |
|
|
64 |
static String code() |
|
67 | 65 |
{ |
68 |
addEffect( EffectName.VERTEX_ROTATE, |
|
66 |
return |
|
67 |
|
|
68 |
"float angle = vUniforms[effect].x*3.1415/360.0;\n" |
|
69 |
+ "vec3 center = vUniforms[effect+1].yzw; \n" |
|
70 |
+ "float sinHalf = sin(angle); \n" |
|
71 |
+ "float cosHalf = cos(angle); \n" |
|
69 | 72 |
|
70 |
"float angle = vUniforms[effect].x*3.1415/360.0;\n"
|
|
71 |
+ "vec3 center = vUniforms[effect+1].yzw; \n"
|
|
72 |
+ "float sinHalf = sin(angle); \n"
|
|
73 |
+ "float cosHalf = cos(angle); \n"
|
|
73 |
+ "float qx = vUniforms[effect].y * sinHalf; \n"
|
|
74 |
+ "float qy = vUniforms[effect].z * sinHalf; \n"
|
|
75 |
+ "float qz = vUniforms[effect].w * sinHalf; \n"
|
|
76 |
+ "float qw = cosHalf; \n"
|
|
74 | 77 |
|
75 |
+ "float qx = vUniforms[effect].y * sinHalf; \n" |
|
76 |
+ "float qy = vUniforms[effect].z * sinHalf; \n" |
|
77 |
+ "float qz = vUniforms[effect].w * sinHalf; \n" |
|
78 |
+ "float qw = cosHalf; \n" |
|
78 |
+ "v -= center; \n" |
|
79 | 79 |
|
80 |
+ "v -= center; \n" |
|
80 |
+ "float tx = qx - v.z*qy + v.y*qz + v.x*qw; \n" |
|
81 |
+ "float ty = qy + v.z*qx + v.y*qw - v.x*qz; \n" |
|
82 |
+ "float tz = qz + v.z*qw - v.y*qx + v.x*qy; \n" |
|
83 |
+ "float tw = qw - v.z*qz - v.y*qy - v.x*qx; \n" |
|
81 | 84 |
|
82 |
+ "float tx = qx - v.z*qy + v.y*qz + v.x*qw; \n" |
|
83 |
+ "float ty = qy + v.z*qx + v.y*qw - v.x*qz; \n" |
|
84 |
+ "float tz = qz + v.z*qw - v.y*qx + v.x*qy; \n" |
|
85 |
+ "float tw = qw - v.z*qz - v.y*qy - v.x*qx; \n" |
|
85 |
+ "v.x = qw*tx + qz*ty - qy*tz - qx*tw; \n" |
|
86 |
+ "v.y = qw*ty - qz*tx - qy*tw + qx*tz; \n" |
|
87 |
+ "v.z = qw*tz - qz*tw + qy*tx - qx*ty; \n" |
|
86 | 88 |
|
87 |
+ "v.x = qw*tx + qz*ty - qy*tz - qx*tw; \n" |
|
88 |
+ "v.y = qw*ty - qz*tx - qy*tw + qx*tz; \n" |
|
89 |
+ "v.z = qw*tz - qz*tw + qy*tx - qx*ty; \n" |
|
89 |
+ "v += center; \n" |
|
90 | 90 |
|
91 |
+ "v += center; \n" |
|
91 |
+ "float nx = - n.z*qy + n.y*qz + n.x*qw; \n" |
|
92 |
+ "float ny = + n.z*qx + n.y*qw - n.x*qz; \n" |
|
93 |
+ "float nz = + n.z*qw - n.y*qx + n.x*qy; \n" |
|
94 |
+ "float nw = - n.z*qz - n.y*qy - n.x*qx; \n" |
|
92 | 95 |
|
93 |
+ "float nx = - n.z*qy + n.y*qz + n.x*qw; \n"
|
|
94 |
+ "float ny = + n.z*qx + n.y*qw - n.x*qz; \n"
|
|
95 |
+ "float nz = + n.z*qw - n.y*qx + n.x*qy; \n"
|
|
96 |
+ "float nw = - n.z*qz - n.y*qy - n.x*qx; \n"
|
|
96 |
+ "n.x = qw*nx + qz*ny - qy*nz - qx*nw; \n"
|
|
97 |
+ "n.y = qw*ny - qz*nx - qy*nw + qx*nz; \n"
|
|
98 |
+ "n.z = qw*nz - qz*nw + qy*nx - qx*ny; \n";
|
|
99 |
}
|
|
97 | 100 |
|
98 |
+ "n.x = qw*nx + qz*ny - qy*nz - qx*nw; \n" |
|
99 |
+ "n.y = qw*ny - qz*nx - qy*nw + qx*nz; \n" |
|
100 |
+ "n.z = qw*nz - qz*nw + qy*nx - qx*ny; \n" |
|
101 |
); |
|
101 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
102 |
// PUBLIC API |
|
103 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
104 |
/** |
|
105 |
* Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work. |
|
106 |
*/ |
|
107 |
public static void enable() |
|
108 |
{ |
|
109 |
addEffect( NAME, code() ); |
|
102 | 110 |
} |
103 | 111 |
|
104 | 112 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
... | ... | |
111 | 119 |
*/ |
112 | 120 |
public VertexEffectRotate(Data1D angle, Data3D axis, Data3D center) |
113 | 121 |
{ |
114 |
super(EffectName.VERTEX_ROTATE);
|
|
122 |
super(NAME);
|
|
115 | 123 |
mAngle = angle; |
116 | 124 |
mAxis = axis; |
117 | 125 |
mCenter = center; |
Also available in: Unified diff
First attempt at the MeshBase.apply(VertexEffect) API.