Project

General

Profile

« Previous | Next » 

Revision f046b159

Added by Leszek Koltunski almost 4 years ago

First attempt at the MeshBase.apply(VertexEffect) API.

View differences:

src/main/java/org/distorted/library/effect/Effect.java
69 69
    float[] u = name.getUnity();
70 70
    int l = u.length;
71 71

  
72
    for(int i=0; i<l; i++)
73
      {
74
      mUnity[n*MAX_UNITY_DIM+i] = u[i];
75
      }
72
    System.arraycopy(u, 0, mUnity, MAX_UNITY_DIM*n, l);
76 73

  
77 74
    mUnityDim[n] = l;
78 75

  
src/main/java/org/distorted/library/effect/VertexEffect.java
21 21

  
22 22
import org.distorted.library.type.Static4D;
23 23

  
24
import java.lang.reflect.Method;
25

  
24 26
///////////////////////////////////////////////////////////////////////////////////////////////////
25 27
/**
26 28
 * Abstract class that represents an Effect that works by injecting certain code into the main Vertex shader.
......
37 39
  private static String mGLSL = "";
38 40
  private static int mNumEnabled = 0;
39 41

  
42
  private static String mFullGLSL = "";
43
  private static int mFullEnabled = 0;
44
  private static boolean mFullPrepared = false;
45

  
40 46
  final static Static4D MAX_REGION = new Static4D(0,0,0,1000000);
41 47

  
42 48
///////////////////////////////////////////////////////////////////////////////////////////////////
......
47 53
    }
48 54

  
49 55
///////////////////////////////////////////////////////////////////////////////////////////////////
50
// prepare code to be injected into the 'main_vertex_shader' main() function.
51 56

  
52
  static void addEffect(EffectName name, String code)
57
  private static String retSection(int effect, String code)
53 58
    {
54
    int effect = name.ordinal();
55

  
56
    if( mEnabled[effect] ) return;
57

  
58
    mEnabled[effect] = true;
59
    mNumEnabled ++;
60

  
61
    mGLSL +=
59
    return
62 60

  
63 61
        "if( vName[i]=="+effect+")\n" +
64 62
          "{\n" +
......
67 65
        "else\n";
68 66
    }
69 67

  
68
///////////////////////////////////////////////////////////////////////////////////////////////////
69
// prepare the code to be injected into the Full program, i.e. code of ALL vertex effects.
70

  
71
  private static void prepareFull()
72
    {
73
    Method method;
74

  
75
    for(EffectName name: EffectName.values())
76
      {
77
      if( name.getType() == EffectType.VERTEX )
78
        {
79
        Class<? extends Effect> cls = name.getEffectClass();
80

  
81
        try
82
          {
83
          method = cls.getDeclaredMethod("code");
84
          }
85
        catch(NoSuchMethodException ex)
86
          {
87
          android.util.Log.e("Effect", "exception getting method: "+ex.getMessage());
88
          method = null;
89
          }
90

  
91
        try
92
          {
93
          if( method!=null )
94
            {
95
            Object value = method.invoke(null);
96
            String code = (String)value;
97
            mFullGLSL += retSection(name.ordinal(),code);
98
            mFullEnabled++;
99
            }
100
          }
101
        catch(Exception ex)
102
          {
103
          android.util.Log.e("Effect", "exception invoking method: "+ex.getMessage());
104
          }
105
        }
106
      }
107
    }
108

  
109
///////////////////////////////////////////////////////////////////////////////////////////////////
110
// prepare code to be injected into the 'main_vertex_shader' main() function.
111

  
112
  static void addEffect(EffectName name, String code)
113
    {
114
    int effect = name.ordinal();
115

  
116
    if( !mEnabled[effect] )
117
      {
118
      mEnabled[effect] = true;
119
      mNumEnabled ++;
120
      mGLSL += retSection(effect,code);
121
      }
122
    }
123

  
70 124
///////////////////////////////////////////////////////////////////////////////////////////////////
71 125
/**
72 126
 * Only for use by the library itself.
......
78 132
    return mGLSL + "{}";
79 133
    }
80 134

  
135
///////////////////////////////////////////////////////////////////////////////////////////////////
136
/**
137
 * Only for use by the library itself.
138
 *
139
 * @y.exclude
140
 */
141
  public static String getAllGLSL()
142
    {
143
    if( !mFullPrepared )
144
      {
145
      prepareFull();
146
      mFullPrepared = true;
147
      }
148

  
149
    return mFullGLSL + "{}";
150
    }
151

  
152
///////////////////////////////////////////////////////////////////////////////////////////////////
153
/**
154
 * Only for use by the library itself.
155
 *
156
 * @y.exclude
157
 */
158
  public static int getAllEnabled()
159
    {
160
    if( !mFullPrepared )
161
      {
162
      prepareFull();
163
      mFullPrepared = true;
164
      }
165

  
166
    return mFullEnabled;
167
    }
168

  
81 169
///////////////////////////////////////////////////////////////////////////////////////////////////
82 170

  
83 171
  static void destroyStatics()
84 172
    {
85 173
    mNumEnabled = 0;
86 174
    mGLSL = "";
175
    mFullEnabled= 0;
176
    mFullGLSL = "";
177
    mFullPrepared = false;
87 178
    }
88 179

  
89 180
///////////////////////////////////////////////////////////////////////////////////////////////////
src/main/java/org/distorted/library/effect/VertexEffectDeform.java
29 29
 */
30 30
public class VertexEffectDeform extends VertexEffect
31 31
  {
32
  private static final EffectName NAME = EffectName.DEFORM;
33

  
32 34
  private Data3D mVector, mCenter;
33 35
  private Data1D mRadius;
34 36
  private Data4D mRegion;
......
41 43
 */
42 44
  public boolean compute(float[] uniforms, int index, long currentDuration, long step )
43 45
    {
44
    mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step);
45
    mRegion.get(uniforms,index+REGION_OFFSET,currentDuration,step);
46
    mRadius.get(uniforms,index+3,currentDuration,step);
47
    return mVector.get(uniforms,index,currentDuration,step);
46
    mCenter.get(uniforms,index+CENTER_OFFSET  ,currentDuration,step);
47
    mRegion.get(uniforms,index+REGION_OFFSET  ,currentDuration,step);
48
    mRadius.get(uniforms,index+VALUES_OFFSET+3,currentDuration,step);
49

  
50
    return mVector.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
48 51
    }
49 52

  
50 53
///////////////////////////////////////////////////////////////////////////////////////////////////
......
103 106
///////////////////////////////////////////////////////////////////////////////////////////////////
104 107
// 2020-05-03: replaced vec3 'u_Bounding' with a uniform 'vUniforms[effect].w' (i.e. mRadius)
105 108
///////////////////////////////////////////////////////////////////////////////////////////////////
106
/**
107
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
108
 */
109
  public static void enable()
109

  
110
  static String code()
110 111
    {
111
    addEffect( EffectName.DEFORM,
112
    return
112 113

  
113 114
        "const vec3 ONE = vec3(1.0,1.0,1.0);                                 \n"
114 115
      + "const float A = 0.5;                                                \n"
......
144 145
      + "v.z += force.z*d*d*(3.0*d*d -8.0*d +6.0);                           \n"  // thick bubble
145 146
      + "float b = -(12.0*force.z*d*(1.0-d)*(1.0-d)*(1.0-d))*one_over_denom; \n"
146 147

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

  
151
///////////////////////////////////////////////////////////////////////////////////////////////////
152
/**
153
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
154
 */
155
  public static void enable()
156
    {
157
    addEffect( NAME, code() );
149 158
    }
150 159

  
151 160
///////////////////////////////////////////////////////////////////////////////////////////////////
......
161 170
 */
162 171
  public VertexEffectDeform(Data3D vector, Data1D radius, Data3D center, Data4D region)
163 172
    {
164
    super(EffectName.DEFORM);
173
    super(NAME);
165 174
    mVector = vector;
166 175
    mRadius = radius;
167 176
    mCenter = center;
......
180 189
 */
181 190
  public VertexEffectDeform(Data3D vector, Data1D radius, Data3D center)
182 191
    {
183
    super(EffectName.DEFORM);
192
    super(NAME);
184 193
    mVector = vector;
185 194
    mRadius = radius;
186 195
    mCenter = center;
src/main/java/org/distorted/library/effect/VertexEffectDistort.java
28 28
 */
29 29
public class VertexEffectDistort extends VertexEffect
30 30
  {
31
  private static final EffectName NAME = EffectName.DISTORT;
32

  
31 33
  private Data3D mVector, mCenter;
32 34
  private Data4D mRegion;
33 35

  
......
41 43
    {
42 44
    mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step);
43 45
    mRegion.get(uniforms,index+REGION_OFFSET,currentDuration,step);
44
    return mVector.get(uniforms,index,currentDuration,step);
46

  
47
    return mVector.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
45 48
    }
46 49

  
47 50
///////////////////////////////////////////////////////////////////////////////////////////////////
......
118 121
// which makes Vrot = (a+n.y*c , b-n.y*c , v*n) where
119 122
// a = vx*nz-vz*nx , b = vy*nz-vz*ny , c = (vx*ny-vy*nx)/(1+nz)    (unless n=(0,0,-1))
120 123
///////////////////////////////////////////////////////////////////////////////////////////////////
121
/**
122
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
123
 */
124
  public static void enable()
124

  
125
  static String code()
125 126
    {
126
    addEffect(EffectName.DISTORT,
127
    return
127 128

  
128 129
        "vec3 ps = vUniforms[effect+1].yzw - v;                        \n"
129 130
      + "vec3 force = vUniforms[effect].xyz;                           \n"
......
152 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!
153 154

  
154 155
      + "  n = normalize(n);                                           \n"
155
      + "  }                                                           \n"
156
      );
156
      + "  }                                                           \n";
157
    }
158

  
159
///////////////////////////////////////////////////////////////////////////////////////////////////
160
/**
161
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
162
 */
163
  public static void enable()
164
    {
165
    addEffect( NAME, code() );
157 166
    }
158 167

  
159 168
///////////////////////////////////////////////////////////////////////////////////////////////////
......
166 175
 */
167 176
  public VertexEffectDistort(Data3D vector, Data3D center, Data4D region)
168 177
    {
169
    super(EffectName.DISTORT);
178
    super(NAME);
170 179
    mVector = vector;
171 180
    mCenter = center;
172 181
    mRegion = (region==null ? MAX_REGION : region);
......
181 190
 */
182 191
  public VertexEffectDistort(Data3D vector, Data3D center)
183 192
    {
184
    super(EffectName.DISTORT);
193
    super(NAME);
185 194
    mVector = vector;
186 195
    mCenter = center;
187 196
    mRegion = MAX_REGION;
src/main/java/org/distorted/library/effect/VertexEffectMove.java
28 28
 */
29 29
public class VertexEffectMove extends VertexEffect
30 30
  {
31
  private static final EffectName NAME = EffectName.VERTEX_MOVE;
32

  
31 33
  private Data3D mVector;
32 34

  
33 35
///////////////////////////////////////////////////////////////////////////////////////////////////
......
38 40
 */
39 41
  public boolean compute(float[] uniforms, int index, long currentDuration, long step )
40 42
    {
41
    return mVector.get(uniforms,index,currentDuration,step);
43
    return mVector.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
44
    }
45

  
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47

  
48
  static String code()
49
    {
50
    return "v += vUniforms[effect].xyz;";
42 51
    }
43 52

  
44 53
///////////////////////////////////////////////////////////////////////////////////////////////////
......
49 58
 */
50 59
  public static void enable()
51 60
    {
52
    addEffect( EffectName.VERTEX_MOVE, "v += vUniforms[effect].xyz;" );
61
    addEffect( NAME, code() );
53 62
    }
54 63

  
55 64
///////////////////////////////////////////////////////////////////////////////////////////////////
......
60 69
 */
61 70
  public VertexEffectMove(Data3D vector)
62 71
    {
63
    super(EffectName.VERTEX_MOVE);
72
    super(NAME);
64 73
    mVector = vector;
65 74
    }
66 75
  }
src/main/java/org/distorted/library/effect/VertexEffectPinch.java
34 34
 */
35 35
public class VertexEffectPinch extends VertexEffect
36 36
  {
37
  private static final EffectName NAME = EffectName.PINCH;
38

  
37 39
  private Data3D mPinch;
38 40
  private Data3D mCenter;
39 41
  private Data4D mRegion;
......
48 50
    {
49 51
    mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step);
50 52
    mRegion.get(uniforms,index+REGION_OFFSET,currentDuration,step);
51
    boolean ret = mPinch.get(uniforms,index,currentDuration,step);
53
    boolean ret = mPinch.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
52 54

  
53
    uniforms[index+1] = (float)(Math.PI*uniforms[index+1]/180);
54
    uniforms[index+2] = (float)(Math.PI*uniforms[index+2]/180);
55
    uniforms[index+VALUES_OFFSET+1] = (float)(Math.PI*uniforms[index+1]/180);
56
    uniforms[index+VALUES_OFFSET+2] = (float)(Math.PI*uniforms[index+2]/180);
55 57

  
56 58
    return ret;
57 59
    }
58 60

  
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60
// PUBLIC API
61 61
///////////////////////////////////////////////////////////////////////////////////////////////////
62 62
// Pull P=(v.x,v.y) along a vector from the center of region sphere to a point on it defined by
63 63
// the (latitude,longitude) pair of angles with P' = P + (1-h)*dist(line to P)
64 64
// when h>1 we are pushing points away from S: P' = P + (1/h-1)*dist(line to P)
65 65
// (where 'line' above passes through the center point and goes along the vector)
66 66
///////////////////////////////////////////////////////////////////////////////////////////////////
67
/**
68
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
69
 */
70
  public static void enable()
67

  
68
  static String code()
71 69
    {
72
    addEffect(EffectName.PINCH,
70
    return
73 71

  
74 72
        "vec3 ps = vUniforms[effect+1].yzw -v;               \n"
75 73
      + "float h         = vUniforms[effect].x;              \n"
......
93 91
      + "n_ps = sign_ps*n_ps/(dot_ps-(sign_ps-1.0));         \n" // uff! now n_ps is the parallel to ps component of n, even if ps==0
94 92
      + "float move = deg*(h-1.0)/(h/B+1.0/A);               \n" // move(0)=-A*deg, move(1)=0, move(inf)=B*deg
95 93
      + "n += move * abs(dot(n,dir)) * n_ps;                 \n"
96
      + "n = normalize(n);"
97
      );
94
      + "n = normalize(n);";
95
    }
96

  
97
///////////////////////////////////////////////////////////////////////////////////////////////////
98
// PUBLIC API
99
///////////////////////////////////////////////////////////////////////////////////////////////////
100
/**
101
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
102
 */
103
  public static void enable()
104
    {
105
    addEffect( NAME, code() );
98 106
    }
99 107

  
100 108
///////////////////////////////////////////////////////////////////////////////////////////////////
......
109 117
 */
110 118
  public VertexEffectPinch(Data3D pinch, Data3D center, Data4D region)
111 119
    {
112
    super(EffectName.PINCH);
120
    super(NAME);
113 121
    mPinch  = pinch;
114 122
    mCenter = center;
115 123
    mRegion = (region==null ? MAX_REGION : region);
......
126 134
 */
127 135
  public VertexEffectPinch(Data3D pinch, Data3D center)
128 136
    {
129
    super(EffectName.PINCH);
137
    super(NAME);
130 138
    mPinch  = pinch;
131 139
    mCenter = center;
132 140
    mRegion = MAX_REGION;
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
    }
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;
src/main/java/org/distorted/library/effect/VertexEffectScale.java
28 28
 */
29 29
public class VertexEffectScale extends VertexEffect
30 30
  {
31
  private static final EffectName NAME = EffectName.VERTEX_SCALE;
32

  
31 33
  private Data3D mScale;
32 34

  
33 35
///////////////////////////////////////////////////////////////////////////////////////////////////
......
38 40
 */
39 41
  public boolean compute(float[] uniforms, int index, long currentDuration, long step )
40 42
    {
41
    return mScale.get(uniforms,index,currentDuration,step);
43
    return mScale.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
44
    }
45

  
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47

  
48
  static String code()
49
    {
50
    return "v *= vUniforms[effect].xyz;";
42 51
    }
43 52

  
44 53
///////////////////////////////////////////////////////////////////////////////////////////////////
......
49 58
 */
50 59
  public static void enable()
51 60
    {
52
    addEffect( EffectName.VERTEX_SCALE, "v *= vUniforms[effect].xyz;" );
61
    addEffect( NAME, code() );
53 62
    }
54 63

  
55 64
///////////////////////////////////////////////////////////////////////////////////////////////////
......
60 69
 */
61 70
  public VertexEffectScale(Data3D scale)
62 71
    {
63
    super(EffectName.VERTEX_SCALE);
72
    super(NAME);
64 73
    mScale = scale;
65 74
    }
66 75

  
......
72 81
 */
73 82
  public VertexEffectScale(float scale)
74 83
    {
75
    super(EffectName.VERTEX_SCALE);
84
    super(NAME);
76 85
    mScale = new Static3D(scale,scale,scale);
77 86
    }
78 87
  }
src/main/java/org/distorted/library/effect/VertexEffectShear.java
27 27
 */
28 28
public class VertexEffectShear extends VertexEffect
29 29
  {
30
  private Data3D mShear, mCenter;
30
  private static final EffectName NAME = EffectName.VERTEX_SHEAR;
31

  
32
  private Data3D mShear;
33
  private Data3D mCenter;
31 34

  
32 35
///////////////////////////////////////////////////////////////////////////////////////////////////
33 36
/**
......
38 41
  public boolean compute(float[] uniforms, int index, long currentDuration, long step )
39 42
    {
40 43
    mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step);
41
    return mShear.get(uniforms,index,currentDuration,step);
44
    return mShear.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
42 45
    }
43 46

  
44 47
///////////////////////////////////////////////////////////////////////////////////////////////////
45
// PUBLIC API
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47
/*
48
  float sx = uniforms[NUM_UNIFORMS*index  ];
49
    float sy = uniforms[NUM_UNIFORMS*index+1];
50
    float sz = uniforms[NUM_UNIFORMS*index+2];
51 48

  
52
    float x  = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET  ];
53
    float y  = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+1];
54
    float z  = uniforms[NUM_UNIFORMS*index+CENTER_OFFSET+2];
49
  static String code()
50
    {
51
    return
52

  
53
      "float sx = vUniforms[effect].x;               \n"
54
    + "float sy = vUniforms[effect].y;               \n"
55
    + "float sz = vUniforms[effect].z;               \n"
56
    + "vec3 center = vUniforms[effect+1].yzw;        \n"
55 57

  
56
    Matrix.translateM(matrix, 0, x, y, z);
58
    + "v -= center;                                  \n"
57 59

  
58
    matrix[4] += sx*matrix[0]; // Multiply viewMatrix by 1 x 0 0 , i.e. X-shear.
59
    matrix[5] += sx*matrix[1]; //                        0 1 0 0
60
    matrix[6] += sx*matrix[2]; //                        0 0 1 0
61
    matrix[7] += sx*matrix[3]; //                        0 0 0 1
60
    + "float new_vx = (1.0+sx*sy)*v.x + sx*v.y;      \n"
61
    + "float new_vy = sy*v.x + v.y;                  \n"
62
    + "float new_vz = sz*v.y + v.z;                  \n"
62 63

  
63
    matrix[0] += sy*matrix[4]; // Multiply viewMatrix by 1 0 0 0 , i.e. Y-shear.
64
    matrix[1] += sy*matrix[5]; //                        y 1 0 0
65
    matrix[2] += sy*matrix[6]; //                        0 0 1 0
66
    matrix[3] += sy*matrix[7]; //                        0 0 0 1
64
    + "v.x = new_vx;                                 \n"
65
    + "v.y = new_vy;                                 \n"
66
    + "v.z = new_vz;                                 \n"
67 67

  
68
    matrix[4] += sz*matrix[8]; // Multiply viewMatrix by 1 0 0 0 , i.e. Z-shear.
69
    matrix[5] += sz*matrix[9]; //                        0 1 0 0
70
    matrix[6] += sz*matrix[10];//                        0 z 1 0
71
    matrix[7] += sz*matrix[11];//                        0 0 0 1
68
    + "v += center;                                  \n"
72 69

  
73
    Matrix.translateM(matrix, 0,-x,-y,-z);
74
*/
70
    + "float new_nx = (1.0+sx*sy)*n.x + sx*n.y;      \n"
71
    + "float new_ny = sy*n.x + n.y;                  \n"
72
    + "float new_nz = sz*n.y + n.z;                  \n"
75 73

  
74
    + "n.x = new_nx;                                 \n"
75
    + "n.y = new_ny;                                 \n"
76
    + "n.z = new_nz;                                 \n";
77
    }
78

  
79
///////////////////////////////////////////////////////////////////////////////////////////////////
80
// PUBLIC API
81
///////////////////////////////////////////////////////////////////////////////////////////////////
76 82
/**
77 83
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
78 84
 */
79 85
  public static void enable()
80 86
    {
81
    addEffect( EffectName.VERTEX_SHEAR,
82

  
83
               "float sx = vUniforms[effect].x;               \n"
84
             + "float sy = vUniforms[effect].y;               \n"
85
             + "float sz = vUniforms[effect].z;               \n"
86
             + "vec3 center = vUniforms[effect+1].yzw;        \n"
87

  
88
             + "v -= center;                                  \n"
89

  
90
             + "float new_vx = (1.0+sx*sy)*v.x + sx*v.y;      \n"
91
             + "float new_vy = sy*v.x + v.y;                  \n"
92
             + "float new_vz = sz*v.y + v.z;                  \n"
93

  
94
             + "v.x = new_vx;                                 \n"
95
             + "v.y = new_vy;                                 \n"
96
             + "v.z = new_vz;                                 \n"
97

  
98
             + "v += center;                                  \n"
99

  
100
             + "float new_nx = (1.0+sx*sy)*n.x + sx*n.y;      \n"
101
             + "float new_ny = sy*n.x + n.y;                  \n"
102
             + "float new_nz = sz*n.y + n.z;                  \n"
103

  
104
             + "n.x = new_nx;                                 \n"
105
             + "n.y = new_ny;                                 \n"
106
             + "n.z = new_nz;                                 \n"
107
             );
87
    addEffect( NAME, code() );
108 88
    }
109 89

  
110 90
///////////////////////////////////////////////////////////////////////////////////////////////////
......
119 99
 */
120 100
  public VertexEffectShear(Data3D shear, Data3D center)
121 101
    {
122
    super(EffectName.VERTEX_SHEAR);
102
    super(NAME);
123 103
    mShear = shear;
124 104
    mCenter = center;
125 105
    }
src/main/java/org/distorted/library/effect/VertexEffectSink.java
30 30
 */
31 31
public class VertexEffectSink extends VertexEffect
32 32
  {
33
  private static final EffectName NAME = EffectName.SINK;
34

  
33 35
  private Data1D mSink;
34 36
  private Data3D mCenter;
35 37
  private Data4D mRegion;
......
44 46
    {
45 47
    mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step);
46 48
    mRegion.get(uniforms,index+REGION_OFFSET,currentDuration,step);
47
    return mSink.get(uniforms,index,currentDuration,step);
49
    return mSink.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
48 50
    }
49 51

  
50 52
///////////////////////////////////////////////////////////////////////////////////////////////////
51
// PUBLIC API
52
///////////////////////////////////////////////////////////////////////////////////////////////////
53
// Pull P=(v.x,v.y) towards center of the effect with P' = P + (1-h)*dist(S-P)
54
// when h>1 we are pushing points away from S: P' = P + (1/h-1)*dist(S-P)
55
///////////////////////////////////////////////////////////////////////////////////////////////////
56
/**
57
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
58
 */
59
  public static void enable()
53

  
54
  static String code()
60 55
    {
61
    addEffect(EffectName.SINK,
56
    return
62 57

  
63 58
        "vec3 ps = vUniforms[effect+1].yzw - v;            \n"
64 59
      + "float h = vUniforms[effect].x;                    \n"
......
74 69
      + "n_ps = (sign_ps*n_ps)/(dot_ps-(sign_ps-1.0));     \n" // uff! now n_ps is the parallel to ps component of n, even if ps==0
75 70
      + "float move = deg*(h-1.0)/(h/B+1.0/A);             \n" // move(0)=-A*deg, move(1)=0, move(inf)=B*deg
76 71
      + "n += move*n_ps;                                   \n"
77
      + "n = normalize(n);"
78
      );
72
      + "n = normalize(n);";
73
    }
74

  
75
///////////////////////////////////////////////////////////////////////////////////////////////////
76
// PUBLIC API
77
///////////////////////////////////////////////////////////////////////////////////////////////////
78
// Pull P=(v.x,v.y) towards center of the effect with P' = P + (1-h)*dist(S-P)
79
// when h>1 we are pushing points away from S: P' = P + (1/h-1)*dist(S-P)
80
///////////////////////////////////////////////////////////////////////////////////////////////////
81
/**
82
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
83
 */
84
  public static void enable()
85
    {
86
    addEffect(NAME, code() );
79 87
    }
80 88

  
81 89
///////////////////////////////////////////////////////////////////////////////////////////////////
......
89 97
 */
90 98
  public VertexEffectSink(Data1D sink, Data3D center, Data4D region)
91 99
    {
92
    super(EffectName.SINK);
100
    super(NAME);
93 101
    mSink   = sink;
94 102
    mCenter = center;
95 103
    mRegion = (region==null ? MAX_REGION : region);
......
105 113
 */
106 114
  public VertexEffectSink(Data1D sink, Data3D center)
107 115
    {
108
    super(EffectName.SINK);
116
    super(NAME);
109 117
    mSink   = sink;
110 118
    mCenter = center;
111 119
    mRegion = MAX_REGION;
src/main/java/org/distorted/library/effect/VertexEffectSwirl.java
34 34
 */
35 35
public class VertexEffectSwirl extends VertexEffect
36 36
  {
37
  private static final EffectName NAME = EffectName.SWIRL;
38

  
37 39
  private Data1D mSwirl;
38 40
  private Data3D mCenter;
39 41
  private Data4D mRegion;
......
48 50
    {
49 51
    mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step);
50 52
    mRegion.get(uniforms,index+REGION_OFFSET,currentDuration,step);
51
    boolean ret = mSwirl.get(uniforms,index,currentDuration,step);
53
    boolean ret = mSwirl.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
52 54

  
53
    uniforms[index] = (float)(Math.PI*uniforms[index]/180);
55
    uniforms[index+VALUES_OFFSET] = (float)(Math.PI*uniforms[index]/180);
54 56

  
55 57
    return ret;
56 58
    }
57 59

  
58
///////////////////////////////////////////////////////////////////////////////////////////////////
59
// PUBLIC API
60 60
///////////////////////////////////////////////////////////////////////////////////////////////////
61 61
// Let d be the degree of the current vertex V with respect to center of the effect S and Region vRegion.
62 62
// This effect rotates the current vertex V by vInterpolated.x radians clockwise around the circle dilated
63 63
// by (1-d) around the center of the effect S.
64 64
///////////////////////////////////////////////////////////////////////////////////////////////////
65
/**
66
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
67
 */
68
  public static void enable()
65

  
66
  static String code()
69 67
    {
70
    addEffect(EffectName.SWIRL,
68
    return
71 69

  
72 70
        "vec3 center = vUniforms[effect+1].yzw;                             \n"
73 71
      + "vec3 PS = center-v.xyz;                                            \n"
......
81 79
      + "vec4 SG = (1.0-deg1)*SO;                                           \n" // coordinates of the dilated circle P is going to get rotated around
82 80
      + "float d2 = max(0.0,degree(SG,PS2));                                \n" // make it a max(0,deg) because otherwise when center=left edge of the
83 81
                                                                                // object some points end up with d2<0 and they disappear off view.
84
      + "v.xy += deg1 * (PS.xy - PS2.xy/(1.0-d2));                          \n" // if d2=1 (i.e P=center) we should have P unchanged. How to do it?
85
      );
82
      + "v.xy += deg1 * (PS.xy - PS2.xy/(1.0-d2));                          \n";// if d2=1 (i.e P=center) we should have P unchanged. How to do it?
83
    }
84

  
85
///////////////////////////////////////////////////////////////////////////////////////////////////
86
// PUBLIC API
87
///////////////////////////////////////////////////////////////////////////////////////////////////
88
/**
89
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
90
 */
91
  public static void enable()
92
    {
93
    addEffect( NAME, code() );
86 94
    }
87 95

  
88 96
///////////////////////////////////////////////////////////////////////////////////////////////////
......
95 103
 */
96 104
  public VertexEffectSwirl(Data1D swirl, Data3D center, Data4D region)
97 105
    {
98
    super(EffectName.SWIRL);
106
    super(NAME);
99 107
    mSwirl  = swirl;
100 108
    mCenter = center;
101 109
    mRegion = (region==null ? MAX_REGION : region);
......
110 118
 */
111 119
  public VertexEffectSwirl(Data1D swirl, Data3D center)
112 120
    {
113
    super(EffectName.SWIRL);
121
    super(NAME);
114 122
    mSwirl  = swirl;
115 123
    mCenter = center;
116 124
    mRegion = MAX_REGION;
src/main/java/org/distorted/library/effect/VertexEffectWave.java
33 33
 */
34 34
public class VertexEffectWave extends VertexEffect
35 35
  {
36
  private static final EffectName NAME = EffectName.WAVE;
37

  
36 38
  private Data5D mWave;
37 39
  private Data3D mCenter;
38 40
  private Data4D mRegion;
......
47 49
    {
48 50
    mCenter.get(uniforms,index+CENTER_OFFSET,currentDuration,step);
49 51
    mRegion.get(uniforms,index+REGION_OFFSET,currentDuration,step);
50
    boolean ret = mWave.get(uniforms,index,currentDuration,step);
52
    boolean ret = mWave.get(uniforms,index+VALUES_OFFSET,currentDuration,step);
51 53

  
52
    uniforms[index+2] = (float)(Math.PI*uniforms[index+2]/180);
53
    uniforms[index+3] = (float)(Math.PI*uniforms[index+3]/180);
54
    uniforms[index+4] = (float)(Math.PI*uniforms[index+4]/180);
54
    uniforms[index+VALUES_OFFSET+2] = (float)(Math.PI*uniforms[index+2]/180);
55
    uniforms[index+VALUES_OFFSET+3] = (float)(Math.PI*uniforms[index+3]/180);
56
    uniforms[index+VALUES_OFFSET+4] = (float)(Math.PI*uniforms[index+4]/180);
55 57

  
56 58
    return ret;
57 59
    }
58 60

  
59
///////////////////////////////////////////////////////////////////////////////////////////////////
60
// PUBLIC API
61
///////////////////////////////////////////////////////////////////////////////////////////////////
61
//////////////////////////////////////////////////////////////////////////////////////////////
62 62
// Directional sinusoidal wave effect.
63 63
//
64 64
// This is an effect from a (hopefully!) generic family of effects of the form (vec3 V: |V|=1 , f(x,y) )  (*)
......
122 122
//
123 123
// Generally speaking I'd keep to amplitude < length, as the opposite case has some other problems as well.
124 124
///////////////////////////////////////////////////////////////////////////////////////////////////
125
/**
126
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
127
 */
128
  public static void enable()
125

  
126
  static String code()
129 127
    {
130
    addEffect(EffectName.WAVE,
128
    return
131 129

  
132 130
        "vec3 center     = vUniforms[effect+1].yzw;                   \n"
133 131
      + "float amplitude = vUniforms[effect  ].x;                     \n"
......
184 182
      +     "n.y = (n.y*normal.z + n.z*normal.y);                     \n"   // ? Because if we do the above, my Nexus4 crashes
185 183
      +     "n.z = (n.z*normal.z);                                    \n"   // during shader compilation!
186 184
      +     "}                                                        \n"
187
      +   "}"
188
      );
185
      +   "}";
186
    }
187

  
188
///////////////////////////////////////////////////////////////////////////////////////////////////
189
// PUBLIC API
190
///////////////////////////////////////////////////////////////////////////////////////////////////
191
/**
192
 * Have to call this before the shaders get compiled (i.e before DistortedLibrary.onCreate()) for the Effect to work.
193
 */
194
  public static void enable()
195
    {
196
    addEffect( NAME, code() );
189 197
    }
190 198

  
191 199
///////////////////////////////////////////////////////////////////////////////////////////////////
......
219 227
 */
220 228
  public VertexEffectWave(Data5D wave, Data3D center, Data4D region)
221 229
    {
222
    super(EffectName.WAVE);
230
    super(NAME);
223 231
    mWave   = wave;
224 232
    mCenter = center;
225 233
    mRegion = (region==null ? MAX_REGION : region);
......
229 237
/**
230 238
 * Directional, sinusoidal wave effect.
231 239
 *
232
 * @param wave   see {@link #VertexEffectWave(Data5D,Data3D)}
240
 * @param wave   see {@link #VertexEffectWave(Data5D,Data3D,Data4D)}
233 241
 * @param center 3-dimensional Data that, at any given time, returns the Center of the Effect.
234 242
 */
235 243
  public VertexEffectWave(Data5D wave, Data3D center)
236 244
    {
237
    super(EffectName.WAVE);
245
    super(NAME);
238 246
    mWave   = wave;
239 247
    mCenter = center;
240 248
    mRegion = MAX_REGION;
src/main/java/org/distorted/library/effectqueue/EffectQueue.java
37 37
 */
38 38
public abstract class EffectQueue implements InternalMaster.Slave
39 39
  {
40
  static final int MAIN_VARIANTS = 3; // Number of Main program variants (ATM 3: MAIN, MAIN OIT, PREPROCESS)
40
  static final int MAIN_VARIANTS = 4; // Number of Main program variants (ATM 4: MAIN, MAIN OIT, PREPROCESS, FULL)
41 41

  
42 42
  private static final int CREATE = 0;
43 43
  private static final int ATTACH = 1;
......
47 47
  int mNumEffects;              // 'ToBe' will be more than mNumEffects if doWork() hasn't
48 48
  private int mNumEffectsToBe;  // added them yet (or less if it hasn't removed some yet)
49 49
  float[] mUniforms;
50
  private int mNumUniforms;
50 51
  long[] mCurrentDuration;
51 52
  Effect[] mEffects;
52 53
  int[] mName;
53
  long mTime=0;
54
  long mTime;
54 55

  
55 56
  private static int[] mMax = new int[EffectType.LENGTH];
56 57
  private static long mNextID;
......
60 61
  private int mIndex;
61 62
  private boolean mCreated;
62 63

  
63
  private class Job
64
  private static class Job
64 65
    {
65 66
    int type;
66 67
    int num;
......
88 89
  EffectQueue(int numUniforms, int index)
89 90
    {
90 91
    mCreated            = false;
92
    mTime               = 0;
91 93
    mID                 = 0;
92 94
    mNumEffects         = 0;
93 95
    mNumEffectsToBe     = 0;
94 96
    mIndex              = index;
97
    mNumUniforms        = numUniforms;
95 98

  
96
    mJobs.add(new Job(CREATE,numUniforms,false,null));  // create the stuff that depends on max number
99
    mJobs.add(new Job(CREATE,numUniforms,false,null)); // create the stuff that depends on max number
97 100
    InternalMaster.newSlave(this);                     // of uniforms later, on first render.
98 101
    }
99 102

  
103
///////////////////////////////////////////////////////////////////////////////////////////////////
104

  
105
  EffectQueue(EffectQueue source)
106
    {
107
    if( !source.mCreated )
108
      {
109
      mCreated            = false;
110
      mTime               = 0;
111
      mID                 = 0;
112
      mNumEffects         = 0;
113
      mNumEffectsToBe     = 0;
114
      mIndex              = source.mIndex;
115
      mNumUniforms        = source.mNumUniforms;
116

  
117
      int numJobs = source.mJobs.size();
118

  
119
      for(int i=0; i<numJobs; i++)
120
        {
121
        Job job = source.mJobs.get(i);
122
        mJobs.add(job);
123
        }
124

  
125
      InternalMaster.newSlave(this);
126
      }
127
    else
128
      {
129
      mCreated            = true;
130
      mTime               = source.mTime;
131
      mID                 = source.mID;
132
      mNumEffects         = source.mNumEffects;
133
      mNumEffectsToBe     = source.mNumEffectsToBe;
134
      mIndex              = source.mIndex;
135
      mNumUniforms        = source.mNumUniforms;
136

  
137
      int max = mMax[mIndex];
138
      if( max>0 )
139
        {
140
        mUniforms        = new float[max*source.mNumUniforms];
141
        mCurrentDuration = new long[max];
142
        mEffects         = new Effect[max];
143
        mName            = new int[max];
144
        }
145

  
146
      for(int i=0; i<mNumEffects; i++ )
147
        {
148
        mEffects[i]         = source.mEffects[i];
149
        mCurrentDuration[i] = source.mCurrentDuration[i];
150
        mName[i]            = source.mName[i];
151
        }
152
      }
153
    }
154

  
100 155
///////////////////////////////////////////////////////////////////////////////////////////////////
101 156

  
102 157
  public static void allocateQueues(EffectQueue[] queues, EffectQueue[] from, int flags)
......
135 190
    }
136 191

  
137 192
///////////////////////////////////////////////////////////////////////////////////////////////////
193
// variant: 0 --> MAIN  1 --> OIT  2 --> prePOST  3 --> FULL
138 194

  
139 195
  public static void getUniforms(int programH, int variant)
140 196
    {
src/main/java/org/distorted/library/effectqueue/EffectQueueFragment.java
43 43
    super(NUM_UNIFORMS,INDEX);
44 44
    }
45 45

  
46
///////////////////////////////////////////////////////////////////////////////////////////////////
47

  
48
  EffectQueueFragment(EffectQueueFragment source)
49
    {
50
    super(source);
51
    }
52

  
46 53
///////////////////////////////////////////////////////////////////////////////////////////////////
47 54

  
48 55
  static void uniforms(int mProgramH, int variant)
src/main/java/org/distorted/library/effectqueue/EffectQueueMatrix.java
47 47
    super(NUM_UNIFORMS,INDEX );
48 48
    }
49 49

  
50
///////////////////////////////////////////////////////////////////////////////////////////////////
51

  
52
  EffectQueueMatrix(EffectQueueMatrix source)
53
    {
54
    super(source);
55
    }
56

  
50 57
///////////////////////////////////////////////////////////////////////////////////////////////////
51 58

  
52 59
  static void uniforms(int mProgramH, int variant)
src/main/java/org/distorted/library/effectqueue/EffectQueuePostprocess.java
64 64
    super(NUM_UNIFORMS,INDEX );
65 65
    }
66 66

  
67
///////////////////////////////////////////////////////////////////////////////////////////////////
68

  
69
  EffectQueuePostprocess(EffectQueuePostprocess source)
70
    {
71
    super(source);
72
    }
73

  
67 74
///////////////////////////////////////////////////////////////////////////////////////////////////
68 75

  
69 76
  void compute(long currTime)
src/main/java/org/distorted/library/effectqueue/EffectQueueVertex.java
26 26
import org.distorted.library.message.EffectMessageSender;
27 27

  
28 28
///////////////////////////////////////////////////////////////////////////////////////////////////
29

  
30
class EffectQueueVertex extends EffectQueue
29
/**
30
 * Not part of public API, do not document (public only because has to be used in Meshes)
31
 *
32
 * @y.exclude
33
 */
34
public class EffectQueueVertex extends EffectQueue
31 35
  { 
32 36
  private static final int NUM_UNIFORMS = VertexEffect.NUM_UNIFORMS;
33 37
  private static final int INDEX = EffectType.VERTEX.ordinal();
......
39 43

  
40 44
///////////////////////////////////////////////////////////////////////////////////////////////////
41 45
   
42
  EffectQueueVertex()
46
  public EffectQueueVertex()
43 47
    { 
44 48
    super(NUM_UNIFORMS,INDEX);
45 49
    }
46 50

  
51
///////////////////////////////////////////////////////////////////////////////////////////////////
52

  
53
  public EffectQueueVertex(EffectQueueVertex source)
54
    {
55
    super(source);
56
    }
57

  
47 58
///////////////////////////////////////////////////////////////////////////////////////////////////
48 59

  
49 60
  static void uniforms(int mProgramH, int variant)
......
55 66
    }
56 67

  
57 68
///////////////////////////////////////////////////////////////////////////////////////////////////
58
  
59
  void compute(long currTime)
69
/**
70
 * Not part of public API, do not document (public only because has to be used in Meshes)
71
 *
72
 * @y.exclude
73
 */
74
  public void compute(long currTime)
60 75
    {
61 76
    if( currTime==mTime ) return;
62 77
    if( mTime==0 ) mTime = currTime;
......
76 91
    }
77 92

  
78 93
///////////////////////////////////////////////////////////////////////////////////////////////////
79

  
80
  void send(float inflate, int variant)
94
/**
95
 * Not part of public API, do not document (public only because has to be used in Meshes)
96
 *
97
 * @y.exclude
98
 */
99
  public void send(float inflate, int variant)
81 100
    {
82 101
    GLES30.glUniform1i( mNumEffectsH[variant], mNumEffects);
83 102
    GLES30.glUniform1f( mInflateH[variant]   , inflate    );
src/main/java/org/distorted/library/main/DistortedLibrary.java
129 129
  private static int mBlitDepthH;
130 130
  private static final FloatBuffer mQuadPositions;
131 131

  
132
  /// FULL PROGRAM ///
133
  private static DistortedProgram mFullProgram;
134

  
132 135
  static
133 136
    {
134 137
    float[] positionData= { -0.5f, -0.5f,  -0.5f, 0.5f,  0.5f,-0.5f,  0.5f, 0.5f };
......
288 291
    mNormalMVPMatrixH  = GLES30.glGetUniformLocation( normalProgramH, "u_MVPMatrix");
289 292
    }
290 293

  
294
///////////////////////////////////////////////////////////////////////////////////////////////////
295

  
296
  private static void createFullProgram(Resources resources)
297
    {
298
    final InputStream fullVertStream = resources.openRawResource(R.raw.main_vertex_shader);
299
    final InputStream fullFragStream = resources.openRawResource(R.raw.main_fragment_shader);
300

  
301
    int numV = VertexEffect.getAllEnabled();
302

  
303
    String fullVertHeader= mGLSL_VERSION + ("#define NUM_VERTEX "   + ( numV>0 ? getMax(EffectType.VERTEX ) : 0 ) + "\n");
304
    String fullFragHeader= mGLSL_VERSION + ("#define NUM_FRAGMENT " +                                         0   + "\n");
305
    String enabledEffectV= VertexEffect.getAllGLSL();
306
    String enabledEffectF= "{}";
307

  
308
    String[] feedback = { "v_Position", "v_endPosition" };
309

  
310
    try
311
      {
312
      mFullProgram = new DistortedProgram(fullVertStream, fullFragStream, fullVertHeader, fullFragHeader,
313
                                          enabledEffectV, enabledEffectF, mGLSL, feedback);
314
      }
315
    catch(Exception e)
316
      {
317
      Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile FULL program: "+e.getMessage());
318
      throw new RuntimeException(e.getMessage());
319
      }
320

  
321
    int fullProgramH = mFullProgram.getProgramHandle();
322
    EffectQueue.getUniforms(fullProgramH,3);
323
    }
324

  
291 325
///////////////////////////////////////////////////////////////////////////////////////////////////
292 326

  
293 327
  private static void createProgramsOIT(Resources resources)
......
418 452
    GLES30.glEndTransformFeedback();
419 453
    GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
420 454

  
421
    DistortedLibrary.mNormalProgram.useProgram();
422
    GLES30.glUniformMatrix4fv(DistortedLibrary.mNormalMVPMatrixH, 1, false, EffectQueue.getMVP(queues) , 0);
423
    mesh.bindTransformAttribs(DistortedLibrary.mNormalProgram);
455
    mNormalProgram.useProgram();
456
    GLES30.glUniformMatrix4fv(mNormalMVPMatrixH, 1, false, EffectQueue.getMVP(queues) , 0);
457
    mesh.bindTransformAttribs(mNormalProgram);
424 458
    GLES30.glLineWidth(8.0f);
425 459
    GLES30.glDrawArrays(GLES30.GL_LINES, 0, 2*num);
426 460
    }
427 461

  
462
///////////////////////////////////////////////////////////////////////////////////////////////////
463
// execute all VertexEffects and adjust all vertices
464

  
465
  public static void adjustVertices(MeshBase mesh)
466
    {
467
    if( mFullProgram!=null )
468
      {
469
      GLES30.glViewport(0, 0, 500, 500 ); // TODO ???
470

  
471
      int num = mesh.getNumVertices();
472
      int tfo = mesh.getTFO();
473

  
474
      mFullProgram.useProgram();
475
      mesh.bindVertexAttribs(mFullProgram);
476
      mesh.computeQueue();
477
      mesh.sendQueue();
478

  
479
      GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, tfo );
480
      GLES30.glBeginTransformFeedback( GLES30.GL_POINTS);
481
      InternalRenderState.switchOffDrawing();
482
      GLES30.glDrawArrays( GLES30.GL_POINTS, 0, num );
483
      InternalRenderState.restoreDrawing();
484
      GLES30.glEndTransformFeedback();
485
      GLES30.glBindBufferBase(GLES30.GL_TRANSFORM_FEEDBACK_BUFFER, 0, 0);
486

  
487
      mesh.copyTransformToVertex();
488
      }
489
    }
490

  
428 491
///////////////////////////////////////////////////////////////////////////////////////////////////
429 492

  
430 493
  static void drawPrivOIT(DistortedEffects effects, MeshBase mesh, InternalOutputSurface surface, long currTime)
......
460 523

  
461 524
  static void drawPriv(DistortedEffects effects, MeshBase mesh, InternalOutputSurface surface, long currTime)
462 525
    {
463
    if( mMainOITProgram!=null )
526
    if( mMainProgram!=null )
464 527
      {
465 528
      EffectQueue[] queues = effects.getQueues();
466 529

  
......
824 887
      exception = ex;
825 888
      }
826 889

  
890
    try
891
      {
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff