Revision 1e667536
Added by Leszek Koltunski over 5 years ago
| src/main/java/org/distorted/library/effect/VertexEffectDistort.java | ||
|---|---|---|
| 131 | 131 | + "vec4 region= vUniforms[effect+2]; \n" | 
| 132 | 132 | + "float d = degree(region,ps); \n" | 
| 133 | 133 |  | 
| 134 | + "if( d>0.0 ) \n" | |
| 135 |       + "  {                                                           \n"
 | |
| 136 | + " v += d*force; \n" | |
| 134 | + "v += d*force; \n" | |
| 137 | 135 |  | 
| 138 | + " float tp = 1.0+n.z; \n" | |
| 139 | + " float tr = 1.0 / (tp - (1.0 - sign(tp))); \n" | |
| 136 | + "float tp = 1.0+n.z; \n" | |
| 137 | + "float tr = 1.0 / (tp - (sign(tp)-1.0)); \n" // proper way to compute 1/x is | |
| 138 | // 1/(x-(sign(x)-1)) and NOT 1/(x+1-sign(x)) | |
| 140 | 139 |  | 
| 141 |       + "  float ap = ps.x*n.z - ps.z*n.x;                             \n"   // likewise rotate the ps vector
 | |
| 142 |       + "  float bp = ps.y*n.z - ps.z*n.y;                             \n"   //
 | |
| 143 |       + "  float cp =(ps.x*n.y - ps.y*n.x)*tr;                         \n"   //
 | |
| 144 |       + "  vec3 psRot = vec3( ap+n.y*cp , bp-n.x*cp , dot(ps,n) );     \n"   //
 | |
| 140 |       + "float ap = ps.x*n.z - ps.z*n.x;                               \n"   // rotate the ps vector
 | |
| 141 |       + "float bp = ps.y*n.z - ps.z*n.y;                               \n"   //
 | |
| 142 |       + "float cp =(ps.x*n.y - ps.y*n.x)*tr;                           \n"   //
 | |
| 143 |       + "vec3 psRot = vec3( ap+n.y*cp , bp-n.x*cp , dot(ps,n) );       \n"   //
 | |
| 145 | 144 |  | 
| 146 |       + "  float len = length(psRot);                                  \n"
 | |
| 147 |       + "  float corr= sign(len)-1.0;                                  \n"   // make N (0,0,1) if ps=(0,0,0)
 | |
| 148 |       + "  vec3 N = vec3( -dot(force,n)*psRot.xy, region.w*len-corr ); \n"   // modified rotated normal
 | |
| 145 |       + "float len = length(psRot);                                    \n"
 | |
| 146 |       + "float corr= sign(len)-1.0;                                    \n"   // make N (0,0,1) if ps=(0,0,0)
 | |
| 147 |       + "vec3 N = vec3( -dot(force,n)*psRot.xy, region.w*len-corr );   \n"   // modified rotated normal
 | |
| 149 | 148 | // dot(force,n) is rotated force.z | 
| 150 | + " float an = N.x*n.z + N.z*n.x; \n" // now create the normal vector | |
| 151 | + " float bn = N.y*n.z + N.z*n.y; \n" // back from our modified normal | |
| 152 | + " float cn =(N.x*n.y - N.y*n.x)*tr; \n" // rotated back | |
| 153 | + " n = vec3( an+n.y*cn , bn-n.x*cn , -N.x*n.x-N.y*n.y+N.z*n.z);\n" // notice 4 signs change! | |
| 149 | + "float an = N.x*n.z + N.z*n.x; \n" // now create the normal vector | |
| 150 | + "float bn = N.y*n.z + N.z*n.y; \n" // back from our modified normal | |
| 151 | + "float cn =(N.x*n.y - N.y*n.x)*tr; \n" // rotated back | |
| 152 | + "n = vec3( an+n.y*cn , bn-n.x*cn , -N.x*n.x-N.y*n.y+N.z*n.z); \n" // notice 4 signs change! | |
| 153 |  | |
| 154 | + " n = normalize(n); \n"; | |
| 154 | 155 |  | 
| 155 | + " n = normalize(n); \n" | |
| 156 | + " } \n"; | |
| 157 | 156 | } | 
| 158 | 157 |  | 
| 159 | 158 | /////////////////////////////////////////////////////////////////////////////////////////////////// | 
| src/main/res/raw/main_vertex_shader.glsl | ||
|---|---|---|
| 75 | 75 |  | 
| 76 | 76 | float degree(in vec4 region, in vec3 PS) | 
| 77 | 77 |   {
 | 
| 78 | vec3 PO = PS + region.xyz; | |
| 79 | float D = region.w*region.w-dot(PO,PO); // D = |OX|^2 - |PO|^2 | |
| 78 | float ps_sq = dot(PS,PS); | |
| 80 | 79 |  | 
| 81 |   if( D<=0.0 ) return 0.0;
 | |
| 80 |   if( ps_sq==0.0 ) return 1.0;
 | |
| 82 | 81 |  | 
| 83 | float ps_sq = dot(PS,PS); | |
| 84 | float one_over_ps_sq = 1.0/(ps_sq-(sign(ps_sq)-1.0)); // return 1.0 if ps_sq = 0.0 | |
| 85 | // Important: if we want to write | |
| 86 | // b = 1/a if a!=0, b=1 otherwise | |
| 87 | // we need to write that as | |
| 88 | // b = 1 / ( a-(sign(a)-1) ) | |
| 89 | // [ and NOT 1 / ( a + 1 - sign(a) ) ] | |
| 90 | // because the latter, if 0<a<2^-24, | |
| 91 | // will suffer from round-off error and in this case | |
| 92 | // a + 1.0 = 1.0 !! so 1 / (a+1-sign(a)) = 1/0 ! | |
| 93 | float DOT = dot(PS,PO)*one_over_ps_sq; | |
| 94 |  | |
| 95 | return 1.0 / (1.0 + 1.0/(sqrt(DOT*DOT+D*one_over_ps_sq)-DOT)); | |
| 82 | vec3 PO = PS + region.xyz; | |
| 83 | float d = region.w*region.w-dot(PO,PO); | |
| 84 |  | |
| 85 | if( d<=0.0 ) return 0.0; | |
| 86 |  | |
| 87 | float b = dot(PS,PO)/ps_sq; | |
| 88 |  | |
| 89 | return 1.0 / (1.0 + 1.0/(sqrt(b*b + d/ps_sq)-b)); | |
| 96 | 90 | } | 
| 97 | 91 |  | 
| 98 | 92 | #endif // NUM_VERTEX>0 | 
Also available in: Unified diff
1) Cube: convert it to the latest library. Main difference: objects are rendered better, individual cubits have rounded corners.
2) Examples: some adjustments to MeshJoin & Predeform
3) Library: fix a bug in main_vertex_shader's 'degree' function, which didn't work proprely in case of a vertex which was exactly at the center (i.e. vector PS was zero)