Project

General

Profile

« Previous | Next » 

Revision 4aa38649

Added by Leszek Koltunski almost 6 years ago

Redefine the Vertex Region from (x,y,r,unused) to (x,y,z,r). This takes into account the 'Z', which makes it possible to warp only one side of a 3D Mesh like Sphere.

Also corresponding changes in applications.

View differences:

src/main/java/org/distorted/library/effect/VertexEffectDeform.java
110 110
    {
111 111
    addEffect( EffectName.DEFORM,
112 112

  
113
        "const vec2 ONE = vec2(1.0,1.0);  \n"
113
        "const vec3 ONE = vec3(1.0,1.0,1.0);  \n"
114 114
      + "const float A = 0.5; \n"
115 115
      + "const float B = 0.2; \n"
116 116
      + "const float C = 5.0; \n"
117 117

  
118
      + "vec2 center = vUniforms[effect+1].yz; \n"
119
      + "vec2 ps     = center-v.xy; \n"
120
      + "vec2 aPS    = abs(ps); \n"
121
      + "vec2 maxps  = u_objD.xy + abs(center); \n"
118
      + "vec3 center = vUniforms[effect+1].yzw; \n"
119
      + "vec3 ps     = center-v.xyz; \n"
120
      + "vec3 aPS    = abs(ps); \n"
121
      + "vec3 maxps  = u_objD + abs(center); \n"
122 122
      + "float d     = degree_region(vUniforms[effect+2],ps); \n"
123 123
      + "vec3 force  = vUniforms[effect].xyz * d; \n"
124
      + "vec2 aForce = abs(force.xy); \n"
125
      + "float denom = dot(ps+(1.0-d)*force.xy,ps); \n"
124
      + "vec3 aForce = abs(force); \n"
125
      + "float denom = dot(ps+(1.0-d)*force,ps); \n"
126 126
      + "float one_over_denom = 1.0/(denom-0.001*(sign(denom)-1.0)); \n"
127
      + "vec2 Aw = A*maxps; \n"
128
      + "vec2 quot = ps / maxps; \n"
127
      + "vec3 Aw = A*maxps; \n"
128
      + "vec3 quot = ps / maxps; \n"
129 129
      + "quot = quot*quot; \n"                                                 // ( (x/W)^2 , (y/H)^2 ) where x,y are distances from V to center
130 130

  
131 131
      + "float denomV = 1.0 / (aForce.y + Aw.x); \n"
132 132
      + "float denomH = 1.0 / (aForce.x + Aw.y); \n"
133 133

  
134
      + "vec2 vertCorr= ONE - aPS / ( aForce+C*aPS + (ONE-sign(aForce)) ); \n" // avoid division by 0 when force and PS both are 0
134
      + "vec3 vertCorr= ONE - aPS / ( aForce+C*aPS + (ONE-sign(aForce)) ); \n" // avoid division by 0 when force and PS both are 0
135 135

  
136 136
      + "float mvXvert = -B * ps.x * aForce.y * (1.0-quot.y) * denomV; \n"     // impact the vertical   component of the force vector has on horizontal movement
137 137
      + "float mvYhorz = -B * ps.y * aForce.x * (1.0-quot.x) * denomH; \n"     // impact the horizontal component of the force vector has on vertical   movement
......
144 144
      + "v.z += force.z*d*d*(3.0*d*d -8.0*d +6.0); \n"                         // thick bubble
145 145
      + "float b = -(12.0*force.z*d*(1.0-d)*(1.0-d)*(1.0-d))*one_over_denom; \n"
146 146

  
147
      + "n.xy += n.z*b*ps;"
147
      + "n.xy += n.z*b*ps.xy;"
148 148
      );
149 149
    }
150 150

  
......
178 178
    super(EffectName.DEFORM);
179 179
    mVector = vector;
180 180
    mCenter = center;
181
    mRegion = new Static4D(0,0,Float.MAX_VALUE, Float.MAX_VALUE);
181
    mRegion = new Static4D(0,0,0, Float.MAX_VALUE);
182 182
    }
183 183
  }
src/main/java/org/distorted/library/effect/VertexEffectDistort.java
112 112
    {
113 113
    addEffect(EffectName.DISTORT,
114 114

  
115
        "vec2 center = vUniforms[effect+1].yz; \n"
116
      + "vec2 ps = center-v.xy; \n"
115
        "vec3 center = vUniforms[effect+1].yzw; \n"
116
      + "vec3 ps = center-v.xyz; \n"
117 117
      + "vec3 force = vUniforms[effect].xyz; \n"
118 118
      + "float d = degree(vUniforms[effect+2],center,ps); \n"
119
      + "float denom = dot(ps+(1.0-d)*force.xy,ps); \n"
119
      + "float denom = dot(ps+(1.0-d)*force,ps); \n"
120 120
      + "float one_over_denom = 1.0/(denom-0.001*(sign(denom)-1.0)); \n"          // = denom==0 ? 1000:1/denom;
121 121

  
122 122
       //v.z += force.z*d;                                                        // cone
......
129 129
      + "float b = -(12.0*force.z*d*(1.0-d)*(1.0-d)*(1.0-d))*one_over_denom; \n"  //
130 130

  
131 131
      + "v.xy += d*force.xy; \n"
132
      + "n.xy += n.z*b*ps;"
132
      + "n.xy += n.z*b*ps.xy;"
133 133
      );
134 134
    }
135 135

  
......
161 161
    super(EffectName.DISTORT);
162 162
    mVector = vector;
163 163
    mCenter = center;
164
    mRegion = new Static4D(0,0,Float.MAX_VALUE, Float.MAX_VALUE);
164
    mRegion = new Static4D(0,0,0, Float.MAX_VALUE);
165 165
    }
166 166
  }
167 167

  
src/main/java/org/distorted/library/effect/VertexEffectPinch.java
69 69
    {
70 70
    addEffect(EffectName.PINCH,
71 71

  
72
        "vec2 center = vUniforms[effect+1].yz; \n"
73
      + "vec2 ps = center-v.xy; \n"
72
        "vec3 center = vUniforms[effect+1].yzw; \n"
73
      + "vec3 ps = center-v.xyz; \n"
74 74
      + "float h = vUniforms[effect].x; \n"
75 75
      + "float t = degree(vUniforms[effect+2],center,ps) * (1.0-h)/max(1.0,h); \n"
76 76
      + "float angle = vUniforms[effect].y; \n"
77 77
      + "vec2 dir = vec2(sin(angle),-cos(angle)); \n"
78
      + "v.xy += t*dot(ps,dir)*dir;"
78
      + "v.xy += t*dot(ps.xy,dir)*dir;"
79 79
      );
80 80
    }
81 81

  
......
109 109
    super(EffectName.PINCH);
110 110
    mPinch  = pinch;
111 111
    mCenter = center;
112
    mRegion = new Static4D(0,0,Float.MAX_VALUE, Float.MAX_VALUE);
112
    mRegion = new Static4D(0,0,0, Float.MAX_VALUE);
113 113
    }
114 114
  }
src/main/java/org/distorted/library/effect/VertexEffectSink.java
65 65
    {
66 66
    addEffect(EffectName.SINK,
67 67

  
68
        "vec2 center = vUniforms[effect+1].yz; \n"
69
      + "vec2 ps = center-v.xy; \n"
68
        "vec3 center = vUniforms[effect+1].yzw; \n"
69
      + "vec3 ps = center-v.xyz; \n"
70 70
      + "float h = vUniforms[effect].x; \n"
71 71
      + "float t = degree(vUniforms[effect+2],center,ps) * (1.0-h)/max(1.0,h); \n"
72 72

  
73
      + "v.xy += t*ps;"
73
      + "v.xy += t*ps.xy;"
74 74
      );
75 75
    }
76 76

  
......
104 104
    super(EffectName.SINK);
105 105
    mSink   = sink;
106 106
    mCenter = center;
107
    mRegion = new Static4D(0,0,Float.MAX_VALUE, Float.MAX_VALUE);
107
    mRegion = new Static4D(0,0,0, Float.MAX_VALUE);
108 108
    }
109 109
  }
src/main/java/org/distorted/library/effect/VertexEffectSwirl.java
66 66
    {
67 67
    addEffect(EffectName.SWIRL,
68 68

  
69
        "vec2 center  = vUniforms[effect+1].yz; \n"
70
      + "vec2 PS = center-v.xy; \n"
69
        "vec3 center  = vUniforms[effect+1].yzw; \n"
70
      + "vec3 PS = center-v.xyz; \n"
71 71
      + "vec4 SO = vUniforms[effect+2]; \n"
72 72
      + "float d1_circle = degree_region(SO,PS); \n"
73 73
      + "float d1_bitmap = degree_bitmap(center,PS); \n"
......
76 76
      + "float sinA = sin(alpha); \n"
77 77
      + "float cosA = cos(alpha); \n"
78 78

  
79
      + "vec2 PS2 = vec2( PS.x*cosA+PS.y*sinA,-PS.x*sinA+PS.y*cosA ); \n" // vector PS rotated by A radians clockwise around center.
80
      + "vec4 SG = (1.0-d1_circle)*SO; \n"                                // coordinates of the dilated circle P is going to get rotated around
81
      + "float d2 = max(0.0,degree(SG,center,PS2)); \n"                   // make it a max(0,deg) because otherwise when center=left edge of the
82
                                                                          // bitmap some points end up with d2<0 and they disappear off view.
83
      + "v.xy += min(d1_circle,d1_bitmap)*(PS - PS2/(1.0-d2)); \n"        // if d2=1 (i.e P=center) we should have P unchanged. How to do it?
79
      + "vec3 PS2 = vec3( PS.x*cosA+PS.y*sinA,-PS.x*sinA+PS.y*cosA, PS.z ); \n" // vector PS rotated by A radians clockwise around center.
80
      + "vec4 SG = (1.0-d1_circle)*SO; \n"                                      // coordinates of the dilated circle P is going to get rotated around
81
      + "float d2 = max(0.0,degree(SG,center,PS2)); \n"                         // make it a max(0,deg) because otherwise when center=left edge of the
82
                                                                                // bitmap some points end up with d2<0 and they disappear off view.
83
      + "v.xy += min(d1_circle,d1_bitmap)*(PS.xy - PS2.xy/(1.0-d2)); \n"        // if d2=1 (i.e P=center) we should have P unchanged. How to do it?
84 84
      );
85 85
    }
86 86

  
......
112 112
    super(EffectName.SWIRL);
113 113
    mSwirl  = swirl;
114 114
    mCenter = center;
115
    mRegion = new Static4D(0,0,Float.MAX_VALUE, Float.MAX_VALUE);
115
    mRegion = new Static4D(0,0,0, Float.MAX_VALUE);
116 116
    }
117 117
  }
118 118

  
src/main/java/org/distorted/library/effect/VertexEffectWave.java
127 127
    {
128 128
    addEffect(EffectName.WAVE,
129 129

  
130
        "vec2 center     = vUniforms[effect+1].yz; \n"
130
        "vec3 center     = vUniforms[effect+1].yzw; \n"
131 131
      + "float amplitude = vUniforms[effect  ].x; \n"
132 132
      + "float length    = vUniforms[effect  ].y; \n"
133 133

  
134
      + "vec2 ps = center - v.xy; \n"
134
      + "vec3 ps = center - v.xyz; \n"
135 135
      + "float deg = amplitude*degree_region(vUniforms[effect+2],ps); \n"
136 136

  
137 137
      + "if( deg != 0.0 && length != 0.0 ) \n"
......
170 170

  
171 171
      +     "vec3 normal = cross(sx,sy); \n"
172 172

  
173
      +     "if( normal.z<=0.0 ) \n"                   // Why this bizarre shit rather than the straightforward
173
      +     "if( normal.z<=0.0 ) \n"                   // Why this bizarre thing rather than the straightforward
174 174
      +       "{ \n"                                   //
175 175
      +       "normal.x= 0.0; \n"                      // if( normal.z>0.0 )
176 176
      +       "normal.y= 0.0; \n"                      //   {
......
179 179
                                                       //   n.z = (n.z*normal.z);
180 180
                                                       //   }
181 181
      +     "n.x = (n.x*normal.z + n.z*normal.x); \n"  //
182
      +     "n.y = (n.y*normal.z + n.z*normal.y); \n"  // ? Because if we do the above, my shitty Nexus4 crashes
182
      +     "n.y = (n.y*normal.z + n.z*normal.y); \n"  // ? Because if we do the above, my Nexus4 crashes
183 183
      +     "n.z = (n.z*normal.z); \n"                 // during shader compilation!
184 184
      +     "} \n"
185 185
      +   "}"
......
235 235
    super(EffectName.WAVE);
236 236
    mWave   = wave;
237 237
    mCenter = center;
238
    mRegion = new Static4D(0,0,Float.MAX_VALUE, Float.MAX_VALUE);
238
    mRegion = new Static4D(0,0,0, Float.MAX_VALUE);
239 239
    }
240 240
  }
src/main/java/org/distorted/library/main/DistortedScreen.java
38 38
public class DistortedScreen extends DistortedFramebuffer
39 39
  {
40 40
  ///// DEBUGGING ONLY /////////////////////////
41
  private boolean mShowFPS;
42

  
43 41
  private static final int NUM_FRAMES  = 100;
42
  private static final int FPS_W       = 120;
43
  private static final int FPS_H       =  70;
44

  
45
  private boolean mShowFPS;
44 46

  
45 47
  private MeshQuad fpsMesh;
46 48
  private DistortedTexture fpsTexture;
......
48 50
  private Canvas fpsCanvas;
49 51
  private Bitmap fpsBitmap;
50 52
  private Paint mPaint;
51
  private int fpsH, fpsW;
52 53
  private String fpsString;
53 54
  private long lastTime=0;
54 55
  private long[] durations;
......
100 101
      fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f;
101 102

  
102 103
      mPaint.setColor(0xffffffff);
103
      fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint);
104
      fpsCanvas.drawRect(0, 0, FPS_W, FPS_H, mPaint);
104 105
      mPaint.setColor(0xff000000);
105
      fpsCanvas.drawText(fpsString, fpsW/2, 0.75f*fpsH, mPaint);
106
      fpsCanvas.drawText(fpsString, FPS_W/2, 0.75f*FPS_H, mPaint);
106 107
      fpsTexture.setTexture(fpsBitmap);
107 108

  
108 109
      lastTime = time;
......
129 130

  
130 131
    if( mShowFPS && fpsTexture.setAsInput())
131 132
      {
132
      fpsEffects.drawPriv(fpsW / 2.0f, fpsH / 2.0f, fpsMesh, this, time);
133
      fpsEffects.drawPriv(FPS_W / 2.0f, FPS_H / 2.0f, fpsMesh, this, time);
133 134
      }
134 135

  
135 136
    if( ++mCurRenderedFBO>=Distorted.FBO_QUEUE_SIZE )
......
155 156
    if( !mShowFPS )
156 157
      {
157 158
      mShowFPS = true;
158

  
159
      fpsW = 120;
160
      fpsH = 70;
161

  
162 159
      fpsString = "";
163
      fpsBitmap = Bitmap.createBitmap(fpsW, fpsH, Bitmap.Config.ARGB_8888);
160
      fpsBitmap = Bitmap.createBitmap(FPS_W, FPS_H, Bitmap.Config.ARGB_8888);
164 161
      fpsMesh = new MeshQuad();
165
      fpsTexture = new DistortedTexture(fpsW, fpsH);
162
      fpsTexture = new DistortedTexture(FPS_W, FPS_H);
166 163
      fpsTexture.setTexture(fpsBitmap);
167 164
      fpsCanvas = new Canvas(fpsBitmap);
168 165
      fpsEffects = new DistortedEffects();
......
171 168
      mPaint = new Paint();
172 169
      mPaint.setAntiAlias(true);
173 170
      mPaint.setTextAlign(Paint.Align.CENTER);
174
      mPaint.setTextSize(0.7f * fpsH);
171
      mPaint.setTextSize(0.7f * FPS_H);
175 172

  
176 173
      durations = new long[NUM_FRAMES + 1];
177 174
      currDuration = 0;
src/main/res/raw/main_vertex_shader.glsl
43 43
uniform int vName[NUM_VERTEX];       // their names.
44 44
uniform vec4 vUniforms[3*NUM_VERTEX];// i-th effect is 3 consecutive vec4's: [3*i], [3*i+1], [3*i+2].
45 45
                                     // The first vec4 is the Interpolated values,
46
                                     // next is half cache half Center, the third -  the Region.
46
                                     // second vec4: first float - cache, next 3: Center, the third -  the Region.
47 47

  
48 48
//////////////////////////////////////////////////////////////////////////////////////////////
49 49
// HELPER FUNCTIONS
......
62 62
//////////////////////////////////////////////////////////////////////////////////////////////
63 63
// return degree of the point as defined by the bitmap rectangle
64 64

  
65
float degree_bitmap(in vec2 S, in vec2 PS)
65
float degree_bitmap(in vec3 S, in vec3 PS)
66 66
  {
67
  vec2 A = sign(PS)*u_objD.xy + S;
67
  vec3 A = sign(PS)*u_objD + S;
68 68

  
69
  vec2 signA = sign(A);                           //
70
  vec2 signA_SQ = signA*signA;                    // div = PS/A if A!=0, 0 otherwise.
71
  vec2 div = signA_SQ*PS/(A-(vec2(1,1)-signA_SQ));//
69
  vec3 signA = sign(A);                                    //
70
  vec3 signA_SQ = signA*signA;                             // div = PS/A if A!=0, 0 otherwise.
71
  vec3 div = signA_SQ*PS/(A-(vec3(1.0,1.0,1.0)-signA_SQ)); //
72 72

  
73 73
  return 1.0-max(div.x,div.y);
74 74
  }
......
94 94
// where a = PS*PO/|PS| but we are really looking for d = |PX|/(|PX|+|PS|) = 1/(1+ (|PS|/|PX|) ) and
95 95
// |PX|/|PS| = -b + sqrt(b^2 + (OX^2-PO^2)/PS^2) where b=PS*PO/|PS|^2 which can be computed with only one sqrt.
96 96

  
97
float degree_region(in vec4 region, in vec2 PS)
97
float degree_region(in vec4 region, in vec3 PS)
98 98
  {
99
  vec2 PO  = PS + region.xy;
100
  float D = region.z*region.z-dot(PO,PO);      // D = |OX|^2 - |PO|^2
99
  vec3 PO  = PS + region.xyz;
100
  float D = region.w*region.w-dot(PO,PO);      // D = |OX|^2 - |PO|^2
101 101

  
102 102
  if( D<=0.0 ) return 0.0;
103 103

  
......
119 119
//////////////////////////////////////////////////////////////////////////////////////////////
120 120
// return min(degree_bitmap,degree_region). Just like degree_region, currently only supports circles.
121 121

  
122
float degree(in vec4 region, in vec2 S, in vec2 PS)
122
float degree(in vec4 region, in vec3 S, in vec3 PS)
123 123
  {
124
  vec2 PO  = PS + region.xy;
125
  float D = region.z*region.z-dot(PO,PO);      // D = |OX|^2 - |PO|^2
124
  vec3 PO  = PS + region.xyz;
125
  float D = region.w*region.w-dot(PO,PO);      // D = |OX|^2 - |PO|^2
126 126

  
127 127
  if( D<=0.0 ) return 0.0;
128 128

  
129
  vec2 A = sign(PS)*u_objD.xy + S;
130
  vec2 signA = sign(A);
131
  vec2 signA_SQ = signA*signA;
132
  vec2 div = signA_SQ*PS/(A-(vec2(1,1)-signA_SQ));
129
  vec3 A = sign(PS)*u_objD.xyz + S;
130
  vec3 signA = sign(A);
131
  vec3 signA_SQ = signA*signA;
132
  vec3 div = signA_SQ*PS/(A-(vec3(1.0,1.0,1.0)-signA_SQ));
133 133
  float E = 1.0-max(div.x,div.y);
134 134

  
135 135
  float ps_sq = dot(PS,PS);

Also available in: Unified diff