Revision faa3ff56
Added by Leszek Koltunski over 7 years ago
src/main/java/org/distorted/library/effect/Effect.java | ||
---|---|---|
20 | 20 |
package org.distorted.library.effect; |
21 | 21 |
|
22 | 22 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
23 |
|
|
23 |
/** |
|
24 |
* Abstract Effect of any type. |
|
25 |
*/ |
|
24 | 26 |
public abstract class Effect |
25 | 27 |
{ |
26 | 28 |
private final static int MAX_UNITY_DIM = 4; |
... | ... | |
47 | 49 |
|
48 | 50 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
49 | 51 |
|
50 |
public abstract boolean compute(float[] uniforms, int index, long currentDuration, long step ); |
|
52 |
Effect(EffectName name) |
|
53 |
{ |
|
54 |
mName = name; |
|
55 |
mType = name.getType(); |
|
56 |
mDimension = name.getDimension(); |
|
57 |
mSupportsC = name.supportsCenter(); |
|
58 |
mSupportsR = name.supportsRegion(); |
|
51 | 59 |
|
52 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
60 |
int n = name.ordinal(); |
|
61 |
float[] u = name.getUnity(); |
|
62 |
int l = name.getUnity().length; |
|
53 | 63 |
|
64 |
for(int i=0; i<l; i++) |
|
65 |
{ |
|
66 |
mUnity[n*MAX_UNITY_DIM+i] = u[i]; |
|
67 |
} |
|
68 |
|
|
69 |
mUnityDim[n] = l; |
|
70 |
|
|
71 |
mID = ((mNextID++)<<EffectType.LENGTH) + mType.ordinal(); |
|
72 |
} |
|
73 |
|
|
74 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
75 |
/** |
|
76 |
* Only for use by the library itself. |
|
77 |
* |
|
78 |
* @y.exclude |
|
79 |
*/ |
|
54 | 80 |
public static void onDestroy() |
55 | 81 |
{ |
56 | 82 |
mNextID = 0; |
... | ... | |
59 | 85 |
} |
60 | 86 |
|
61 | 87 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
88 |
/** |
|
89 |
* Only for use by the library itself. |
|
90 |
* |
|
91 |
* @y.exclude |
|
92 |
*/ |
|
93 |
public abstract boolean compute(float[] uniforms, int index, long currentDuration, long step ); |
|
62 | 94 |
|
95 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
96 |
// PUBLIC API |
|
97 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
98 |
/** |
|
99 |
* Do the set of Uniforms written in buffer[index], buffer[index+1], etc represent a Unity, i.e a |
|
100 |
* null Effect? |
|
101 |
*/ |
|
63 | 102 |
public boolean isUnity(float[] buffer, int index) |
64 | 103 |
{ |
65 | 104 |
int name = mName.ordinal(); |
... | ... | |
82 | 121 |
return false; |
83 | 122 |
} |
84 | 123 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
85 |
|
|
124 |
/** |
|
125 |
* Return the EffectType enum corresponding to this Effect. |
|
126 |
* |
|
127 |
* @see EffectType |
|
128 |
*/ |
|
86 | 129 |
public EffectType getType() |
87 | 130 |
{ |
88 | 131 |
return mType; |
89 | 132 |
} |
90 | 133 |
|
91 | 134 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
92 |
|
|
135 |
/** |
|
136 |
* Return the EffectName enum corresponding to this Effect. |
|
137 |
* |
|
138 |
* @see EffectName |
|
139 |
*/ |
|
93 | 140 |
public EffectName getName() |
94 | 141 |
{ |
95 | 142 |
return mName; |
96 | 143 |
} |
97 | 144 |
|
98 | 145 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
99 |
|
|
146 |
/** |
|
147 |
* Return the unique ID of this Effect. |
|
148 |
*/ |
|
100 | 149 |
public long getID() |
101 | 150 |
{ |
102 | 151 |
return mID; |
103 | 152 |
} |
104 | 153 |
|
105 | 154 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
106 |
|
|
155 |
/** |
|
156 |
* Return a printable name of this Effect. |
|
157 |
*/ |
|
107 | 158 |
public String getString() |
108 | 159 |
{ |
109 | 160 |
return mName.name(); |
110 | 161 |
} |
111 | 162 |
|
112 | 163 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
113 |
|
|
164 |
/** |
|
165 |
* Does this effect have a Center? |
|
166 |
*/ |
|
114 | 167 |
public boolean supportsCenter() |
115 | 168 |
{ |
116 | 169 |
return mSupportsC; |
117 | 170 |
} |
118 | 171 |
|
119 | 172 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
120 |
|
|
173 |
/** |
|
174 |
* Does this effect support being masked by a Region? |
|
175 |
*/ |
|
121 | 176 |
public boolean supportsRegion() |
122 | 177 |
{ |
123 | 178 |
return mSupportsR; |
124 | 179 |
} |
125 | 180 |
|
126 | 181 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
127 |
|
|
182 |
/** |
|
183 |
* Return the number of Uniforms needed to describe this effect. |
|
184 |
*/ |
|
128 | 185 |
public int getDimension() |
129 | 186 |
{ |
130 | 187 |
return mDimension; |
131 | 188 |
} |
132 |
|
|
133 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
134 |
|
|
135 |
Effect(EffectName name) |
|
136 |
{ |
|
137 |
mName = name; |
|
138 |
mType = name.getType(); |
|
139 |
mDimension = name.getDimension(); |
|
140 |
mSupportsC = name.supportsCenter(); |
|
141 |
mSupportsR = name.supportsRegion(); |
|
142 |
|
|
143 |
int n = name.ordinal(); |
|
144 |
float[] u = name.getUnity(); |
|
145 |
int l = name.getUnity().length; |
|
146 |
|
|
147 |
for(int i=0; i<l; i++) |
|
148 |
{ |
|
149 |
mUnity[n*MAX_UNITY_DIM+i] = u[i]; |
|
150 |
} |
|
151 |
|
|
152 |
mUnityDim[n] = l; |
|
153 |
|
|
154 |
mID = ((mNextID++)<<EffectType.LENGTH) + mType.ordinal(); |
|
155 |
} |
|
156 | 189 |
} |
src/main/java/org/distorted/library/effect/EffectQuality.java | ||
---|---|---|
39 | 39 |
LOW ( 3 ); |
40 | 40 |
|
41 | 41 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
42 |
|
|
43 |
public static final float MULTIPLIER = 0.5f; // each next Quality level renders into 1/0.5 smaller buffers |
|
42 |
/** |
|
43 |
* Each next Quality level renders into 1/MULTIPLIER smaller buffers. |
|
44 |
*/ |
|
45 |
public static final float MULTIPLIER = 0.5f; |
|
46 |
/** |
|
47 |
* Numof of possible qualities. |
|
48 |
*/ |
|
44 | 49 |
public static final int LENGTH = values().length; |
45 | 50 |
|
46 | 51 |
private final int level; |
... | ... | |
53 | 58 |
} |
54 | 59 |
|
55 | 60 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
56 |
|
|
61 |
/** |
|
62 |
* Only for use by the library itself. |
|
63 |
* |
|
64 |
* @y.exclude |
|
65 |
*/ |
|
57 | 66 |
public int getLevel() |
58 | 67 |
{ |
59 | 68 |
return level; |
src/main/java/org/distorted/library/effect/EffectType.java | ||
---|---|---|
48 | 48 |
POSTPROCESS; |
49 | 49 |
|
50 | 50 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
51 |
|
|
52 |
public static final int LENGTH = values().length; // The number of effect types. |
|
53 |
public static final int MASK= (1<<LENGTH)-1; // Needed when we do bitwise operations on Effect Types. |
|
51 |
/** |
|
52 |
* Number of effect types. |
|
53 |
* Only for use by the library itself. |
|
54 |
* |
|
55 |
* @y.exclude |
|
56 |
*/ |
|
57 |
public static final int LENGTH = values().length; |
|
58 |
/** |
|
59 |
* Needed when we do bitwise operations on Effect Types. |
|
60 |
* Only for use by the library itself. |
|
61 |
* |
|
62 |
* @y.exclude |
|
63 |
*/ |
|
64 |
public static final int MASK= (1<<LENGTH)-1; |
|
54 | 65 |
|
55 | 66 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
56 |
// called from EffectQueue |
|
57 |
|
|
67 |
/** |
|
68 |
* Only for use by the library itself. |
|
69 |
* |
|
70 |
* @y.exclude |
|
71 |
*/ |
|
58 | 72 |
public static void reset(int[] maxtable) |
59 | 73 |
{ |
60 | 74 |
maxtable[0] =10; // By default, there can be a maximum 10 MATRIX effects in a single |
src/main/java/org/distorted/library/effect/FragmentEffect.java | ||
---|---|---|
20 | 20 |
package org.distorted.library.effect; |
21 | 21 |
|
22 | 22 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
23 |
// FRAGMENT EFFECTS
|
|
24 |
|
|
25 |
|
|
23 |
/**
|
|
24 |
* Fragment Effect - an Effect that works by injecting certain code into the main Fragment shader. |
|
25 |
*/ |
|
26 | 26 |
public abstract class FragmentEffect extends Effect |
27 | 27 |
{ |
28 |
public static final int NUM_UNIFORMS = 8; // 4-per effect interpolated values, 4 dimensional Region. |
|
28 |
/** |
|
29 |
* 8: 4-per effect interpolated values, 4 dimensional Region. |
|
30 |
*/ |
|
31 |
public static final int NUM_UNIFORMS = 8; |
|
29 | 32 |
private static String mGLSL = ""; |
30 | 33 |
private static int mNumEnabled = 0; |
31 | 34 |
|
... | ... | |
37 | 40 |
} |
38 | 41 |
|
39 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
43 |
// prepare code to be injected into the 'main_fragment_shader' main() function. |
|
40 | 44 |
|
41 | 45 |
static void addEffect(EffectName not_smooth, EffectName yes_smooth, String code) |
42 | 46 |
{ |
... | ... | |
64 | 68 |
} |
65 | 69 |
|
66 | 70 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
67 |
|
|
71 |
/** |
|
72 |
* Only for use by the library itself. |
|
73 |
* |
|
74 |
* @y.exclude |
|
75 |
*/ |
|
68 | 76 |
public static String getGLSL() |
69 | 77 |
{ |
70 | 78 |
return mGLSL + "{}"; |
71 | 79 |
} |
72 | 80 |
|
73 | 81 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
74 |
|
|
75 |
public static int getNumEnabled() |
|
82 |
/** |
|
83 |
* Only for use by the library itself. |
|
84 |
* |
|
85 |
* @y.exclude |
|
86 |
*/ |
|
87 |
public static void onDestroy() |
|
76 | 88 |
{ |
77 |
return mNumEnabled; |
|
89 |
mNumEnabled = 0; |
|
90 |
mGLSL = ""; |
|
78 | 91 |
} |
79 | 92 |
|
80 | 93 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
81 |
|
|
82 |
public static void onDestroy() |
|
94 |
// PUBLIC API |
|
95 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
96 |
/** |
|
97 |
* Return the number of Fragment effects enabled. |
|
98 |
*/ |
|
99 |
public static int getNumEnabled() |
|
83 | 100 |
{ |
84 |
mNumEnabled = 0; |
|
85 |
mGLSL = ""; |
|
101 |
return mNumEnabled; |
|
86 | 102 |
} |
87 | 103 |
} |
src/main/java/org/distorted/library/effect/FragmentEffectAlpha.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.type.Static4D; |
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 |
|
|
27 |
/** |
|
28 |
* Make a certain Region change its transparency level. |
|
29 |
*/ |
|
28 | 30 |
public class FragmentEffectAlpha extends FragmentEffect |
29 | 31 |
{ |
30 | 32 |
private Data1D mAlpha; |
31 | 33 |
private Data4D mRegion; |
32 | 34 |
|
35 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
36 |
/** |
|
37 |
* Only for use by the library itself. |
|
38 |
* |
|
39 |
* @y.exclude |
|
40 |
*/ |
|
41 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
42 |
{ |
|
43 |
mRegion.get(uniforms, index+4, currentDuration, step); |
|
44 |
return mAlpha.get(uniforms,index, currentDuration, step); |
|
45 |
} |
|
46 |
|
|
47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
48 |
// PUBLIC API |
|
33 | 49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 50 |
/** |
35 | 51 |
* Makes a certain sub-region of the Object smoothly change its transparency level. |
... | ... | |
61 | 77 |
} |
62 | 78 |
|
63 | 79 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
64 |
|
|
65 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
66 |
{ |
|
67 |
mRegion.get(uniforms, index+4, currentDuration, step); |
|
68 |
return mAlpha.get(uniforms,index, currentDuration, step); |
|
69 |
} |
|
70 |
|
|
71 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
72 |
|
|
80 |
/** |
|
81 |
* Have to call this before the shaders get compiled (i.e before Distorted.onCreate()) for the Effect to work. |
|
82 |
*/ |
|
73 | 83 |
public static void enable() |
74 | 84 |
{ |
75 | 85 |
addEffect( EffectName.ALPHA,EffectName.SMOOTH_ALPHA, |
src/main/java/org/distorted/library/effect/FragmentEffectBrightness.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.type.Static4D; |
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 |
|
|
27 |
/** |
|
28 |
* Make a certain Region change its brightness level. |
|
29 |
*/ |
|
28 | 30 |
public class FragmentEffectBrightness extends FragmentEffect |
29 | 31 |
{ |
30 | 32 |
private Data1D mBrightness; |
31 | 33 |
private Data4D mRegion; |
32 | 34 |
|
35 |
|
|
36 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
37 |
/** |
|
38 |
* Only for use by the library itself. |
|
39 |
* |
|
40 |
* @y.exclude |
|
41 |
*/ |
|
42 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
43 |
{ |
|
44 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
45 |
return mBrightness.get(uniforms,index,currentDuration,step); |
|
46 |
} |
|
47 |
|
|
48 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
49 |
// PUBLIC API |
|
33 | 50 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 51 |
/** |
35 | 52 |
* Makes a certain sub-region of the Object smoothly change its brightness level. |
... | ... | |
59 | 76 |
} |
60 | 77 |
|
61 | 78 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
62 |
|
|
63 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
64 |
{ |
|
65 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
66 |
return mBrightness.get(uniforms,index,currentDuration,step); |
|
67 |
} |
|
68 |
|
|
69 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
70 |
|
|
79 |
/** |
|
80 |
* Have to call this before the shaders get compiled (i.e before Distorted.onCreate()) for the Effect to work. |
|
81 |
*/ |
|
71 | 82 |
public static void enable() |
72 | 83 |
{ |
73 | 84 |
addEffect( EffectName.BRIGHTNESS,EffectName.SMOOTH_BRIGHTNESS, |
src/main/java/org/distorted/library/effect/FragmentEffectChroma.java | ||
---|---|---|
25 | 25 |
import org.distorted.library.type.Static4D; |
26 | 26 |
|
27 | 27 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
28 |
|
|
28 |
/** |
|
29 |
* Make a certain Region change its color. |
|
30 |
*/ |
|
29 | 31 |
public class FragmentEffectChroma extends FragmentEffect |
30 | 32 |
{ |
31 | 33 |
private Data1D mBlend; |
32 | 34 |
private Data3D mColor; |
33 | 35 |
private Data4D mRegion; |
34 | 36 |
|
37 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
38 |
/** |
|
39 |
* Only for use by the library itself. |
|
40 |
* |
|
41 |
* @y.exclude |
|
42 |
*/ |
|
43 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
44 |
{ |
|
45 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
46 |
mColor.get(uniforms,index+1,currentDuration,step); |
|
47 |
return mBlend.get(uniforms,index,currentDuration,step); |
|
48 |
} |
|
49 |
|
|
50 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
51 |
// PUBLIC API |
|
35 | 52 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
36 | 53 |
/** |
37 | 54 |
* Makes a certain sub-region of the Object smoothly change all three of its RGB components. |
... | ... | |
69 | 86 |
} |
70 | 87 |
|
71 | 88 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
72 |
|
|
73 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
74 |
{ |
|
75 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
76 |
mColor.get(uniforms,index+1,currentDuration,step); |
|
77 |
return mBlend.get(uniforms,index,currentDuration,step); |
|
78 |
} |
|
79 |
|
|
80 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
81 |
|
|
89 |
/** |
|
90 |
* Have to call this before the shaders get compiled (i.e before Distorted.onCreate()) for the Effect to work. |
|
91 |
*/ |
|
82 | 92 |
public static void enable() |
83 | 93 |
{ |
84 | 94 |
addEffect( EffectName.CHROMA,EffectName.SMOOTH_CHROMA, |
src/main/java/org/distorted/library/effect/FragmentEffectContrast.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.type.Static4D; |
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 |
|
|
27 |
/** |
|
28 |
* Make a certain Region change its contrast level. |
|
29 |
*/ |
|
28 | 30 |
public class FragmentEffectContrast extends FragmentEffect |
29 | 31 |
{ |
30 | 32 |
private Data1D mContrast; |
31 | 33 |
private Data4D mRegion; |
32 | 34 |
|
35 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
36 |
/** |
|
37 |
* Only for use by the library itself. |
|
38 |
* |
|
39 |
* @y.exclude |
|
40 |
*/ |
|
41 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
42 |
{ |
|
43 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
44 |
return mContrast.get(uniforms,index,currentDuration,step); |
|
45 |
} |
|
46 |
|
|
47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
48 |
// PUBLIC API |
|
33 | 49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 50 |
/** |
35 | 51 |
* Makes a certain sub-region of the Object smoothly change its contrast level. |
... | ... | |
59 | 75 |
} |
60 | 76 |
|
61 | 77 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
62 |
|
|
63 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
64 |
{ |
|
65 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
66 |
return mContrast.get(uniforms,index,currentDuration,step); |
|
67 |
} |
|
68 |
|
|
69 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
70 |
|
|
78 |
/** |
|
79 |
* Have to call this before the shaders get compiled (i.e before Distorted.onCreate()) for the Effect to work. |
|
80 |
*/ |
|
71 | 81 |
public static void enable() |
72 | 82 |
{ |
73 | 83 |
addEffect( EffectName.CONTRAST,EffectName.SMOOTH_CONTRAST, |
src/main/java/org/distorted/library/effect/FragmentEffectSaturation.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.type.Static4D; |
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 |
|
|
27 |
/** |
|
28 |
* Make a certain Region change its color saturation. |
|
29 |
*/ |
|
28 | 30 |
public class FragmentEffectSaturation extends FragmentEffect |
29 | 31 |
{ |
30 | 32 |
private Data1D mSaturation; |
31 | 33 |
private Data4D mRegion; |
32 | 34 |
|
35 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
36 |
/** |
|
37 |
* Only for use by the library itself. |
|
38 |
* |
|
39 |
* @y.exclude |
|
40 |
*/ |
|
41 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
42 |
{ |
|
43 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
44 |
return mSaturation.get(uniforms,index,currentDuration,step); |
|
45 |
} |
|
46 |
|
|
47 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
48 |
// PUBLIC API |
|
33 | 49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 50 |
/** |
35 | 51 |
* Makes a certain sub-region of the Object smoothly change its saturation level. |
... | ... | |
61 | 77 |
} |
62 | 78 |
|
63 | 79 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
64 |
|
|
65 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
66 |
{ |
|
67 |
mRegion.get(uniforms,index+4,currentDuration,step); |
|
68 |
return mSaturation.get(uniforms,index,currentDuration,step); |
|
69 |
} |
|
70 |
|
|
71 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
72 |
|
|
80 |
/** |
|
81 |
* Have to call this before the shaders get compiled (i.e before Distorted.onCreate()) for the Effect to work. |
|
82 |
*/ |
|
73 | 83 |
public static void enable() |
74 | 84 |
{ |
75 | 85 |
addEffect( EffectName.SATURATION,EffectName.SMOOTH_SATURATION, |
src/main/java/org/distorted/library/effect/MatrixEffect.java | ||
---|---|---|
20 | 20 |
package org.distorted.library.effect; |
21 | 21 |
|
22 | 22 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
23 |
// MATRIX EFFECTS. |
|
24 |
|
|
23 |
/** |
|
24 |
* Matrix Effect - an Effect that works by modifying the ModelView matrix. |
|
25 |
*/ |
|
25 | 26 |
public abstract class MatrixEffect extends Effect |
26 | 27 |
{ |
27 |
public static final int NUM_UNIFORMS = 7; // 4 per-effect interpolated values + 3 dimensional center. |
|
28 |
/** |
|
29 |
* 7: 4 per-effect interpolated values + 3 dimensional center. |
|
30 |
*/ |
|
31 |
public static final int NUM_UNIFORMS = 7; |
|
28 | 32 |
|
29 | 33 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
30 |
|
|
34 |
/** |
|
35 |
* Only for use by the library itself. |
|
36 |
* |
|
37 |
* @y.exclude |
|
38 |
*/ |
|
31 | 39 |
public abstract void apply(float[] matrix, float[] uniforms, int index); |
32 | 40 |
|
33 | 41 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/effect/MatrixEffectMove.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.type.Data3D; |
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 |
|
|
27 |
/** |
|
28 |
* Move the Mesh by a 3D vector. |
|
29 |
*/ |
|
28 | 30 |
public class MatrixEffectMove extends MatrixEffect |
29 | 31 |
{ |
30 | 32 |
private Data3D mVector; |
31 | 33 |
|
32 | 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
33 | 35 |
/** |
34 |
* Moves the Object by a (possibly changing in time) vector.
|
|
36 |
* Only for use by the library itself.
|
|
35 | 37 |
* |
36 |
* @param vector current coordinates of the vector we want to move the Object with.
|
|
38 |
* @y.exclude
|
|
37 | 39 |
*/ |
38 |
public MatrixEffectMove(Data3D vector) |
|
39 |
{ |
|
40 |
super(EffectName.MOVE); |
|
41 |
mVector = vector; |
|
42 |
} |
|
43 |
|
|
44 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
45 |
|
|
46 | 40 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
47 | 41 |
{ |
48 | 42 |
return mVector.get(uniforms,index,currentDuration,step); |
49 | 43 |
} |
50 | 44 |
|
51 | 45 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
52 |
|
|
46 |
/** |
|
47 |
* Only for use by the library itself. |
|
48 |
* |
|
49 |
* @y.exclude |
|
50 |
*/ |
|
53 | 51 |
public void apply(float[] matrix, float[] uniforms, int index) |
54 | 52 |
{ |
55 | 53 |
float sx = uniforms[NUM_UNIFORMS*index ]; |
... | ... | |
58 | 56 |
|
59 | 57 |
Matrix.translateM(matrix, 0, sx,-sy, sz); |
60 | 58 |
} |
59 |
|
|
60 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
61 |
// PUBLIC API |
|
62 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
63 |
/** |
|
64 |
* Move the Mesh by a 3D vector. |
|
65 |
* |
|
66 |
* @param vector current coordinates of the vector we want to move the Mesh with. |
|
67 |
*/ |
|
68 |
public MatrixEffectMove(Data3D vector) |
|
69 |
{ |
|
70 |
super(EffectName.MOVE); |
|
71 |
mVector = vector; |
|
72 |
} |
|
61 | 73 |
} |
src/main/java/org/distorted/library/effect/MatrixEffectQuaternion.java | ||
---|---|---|
25 | 25 |
import org.distorted.library.type.Data4D; |
26 | 26 |
|
27 | 27 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
28 |
|
|
28 |
/** |
|
29 |
* Rotate the Mesh by a quaternion. |
|
30 |
*/ |
|
29 | 31 |
public class MatrixEffectQuaternion extends MatrixEffect |
30 | 32 |
{ |
31 | 33 |
private Data4D mQuaternion; |
... | ... | |
36 | 38 |
|
37 | 39 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
38 | 40 |
/** |
39 |
* Rotates the Object by quaternion.
|
|
41 |
* Only for use by the library itself.
|
|
40 | 42 |
* |
41 |
* @param quaternion Quaternion describing the rotation. |
|
42 |
* @param center Coordinates of the Point we are rotating around. |
|
43 |
* @y.exclude |
|
43 | 44 |
*/ |
44 |
public MatrixEffectQuaternion(Data4D quaternion, Data3D center ) |
|
45 |
{ |
|
46 |
super(EffectName.QUATERNION); |
|
47 |
mQuaternion = quaternion; |
|
48 |
mCenter = center; |
|
49 |
} |
|
50 |
|
|
51 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
52 |
|
|
53 | 45 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
54 | 46 |
{ |
55 | 47 |
mCenter.get(uniforms,index+4,currentDuration,step); |
... | ... | |
57 | 49 |
} |
58 | 50 |
|
59 | 51 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
60 |
|
|
52 |
/** |
|
53 |
* Only for use by the library itself. |
|
54 |
* |
|
55 |
* @y.exclude |
|
56 |
*/ |
|
61 | 57 |
public void apply(float[] matrix, float[] uniforms, int index) |
62 | 58 |
{ |
63 | 59 |
float qX = uniforms[NUM_UNIFORMS*index ]; |
... | ... | |
119 | 115 |
matrix[14] = mTmpMatrix2[14]; |
120 | 116 |
matrix[15] = mTmpMatrix2[15]; |
121 | 117 |
} |
118 |
|
|
119 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
120 |
// PUBLIC API |
|
121 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
122 |
/** |
|
123 |
* Rotate the Mesh by a quaternion. |
|
124 |
* |
|
125 |
* @param quaternion Quaternion describing the rotation. |
|
126 |
* @param center Coordinates of the Point we are rotating around. |
|
127 |
*/ |
|
128 |
public MatrixEffectQuaternion(Data4D quaternion, Data3D center ) |
|
129 |
{ |
|
130 |
super(EffectName.QUATERNION); |
|
131 |
mQuaternion = quaternion; |
|
132 |
mCenter = center; |
|
133 |
} |
|
122 | 134 |
} |
src/main/java/org/distorted/library/effect/MatrixEffectRotate.java | ||
---|---|---|
25 | 25 |
import org.distorted.library.type.Data3D; |
26 | 26 |
|
27 | 27 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
28 |
|
|
28 |
/** |
|
29 |
* Rotate the Mesh by 'angle' degrees around the center, along an axis. |
|
30 |
*/ |
|
29 | 31 |
public class MatrixEffectRotate extends MatrixEffect |
30 | 32 |
{ |
31 | 33 |
private Data1D mAngle; |
... | ... | |
33 | 35 |
|
34 | 36 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
35 | 37 |
/** |
36 |
* Rotates the Object by 'angle' degrees around the center. |
|
37 |
* Static axis of rotation is given by the last parameter. |
|
38 |
* Only for use by the library itself. |
|
38 | 39 |
* |
39 |
* @param angle Angle that we want to rotate the Object to. Unit: degrees |
|
40 |
* @param axis Axis of rotation |
|
41 |
* @param center Coordinates of the Point we are rotating around. |
|
40 |
* @y.exclude |
|
42 | 41 |
*/ |
43 |
public MatrixEffectRotate(Data1D angle, Data3D axis, Data3D center) |
|
44 |
{ |
|
45 |
super(EffectName.ROTATE); |
|
46 |
mAngle = angle; |
|
47 |
mAxis = axis; |
|
48 |
mCenter = center; |
|
49 |
} |
|
50 |
|
|
51 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
52 |
|
|
53 | 42 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
54 | 43 |
{ |
55 | 44 |
mCenter.get(uniforms,index+4,currentDuration,step); |
... | ... | |
58 | 47 |
} |
59 | 48 |
|
60 | 49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
61 |
|
|
50 |
/** |
|
51 |
* Only for use by the library itself. |
|
52 |
* |
|
53 |
* @y.exclude |
|
54 |
*/ |
|
62 | 55 |
public void apply(float[] matrix, float[] uniforms, int index) |
63 | 56 |
{ |
64 | 57 |
float alpha = uniforms[NUM_UNIFORMS*index ]; |
... | ... | |
74 | 67 |
Matrix.rotateM( matrix, 0, alpha, axisX, axisY, axisZ); |
75 | 68 |
Matrix.translateM(matrix, 0,-x, y,-z); |
76 | 69 |
} |
70 |
|
|
71 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
72 |
// PUBLIC API |
|
73 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
74 |
/** |
|
75 |
* Rotate the Mesh by 'angle' degrees around the center, along an axis. |
|
76 |
* |
|
77 |
* @param angle Angle that we want to rotate the Object to. Unit: degrees |
|
78 |
* @param axis Axis of rotation |
|
79 |
* @param center Coordinates of the Point we are rotating around. |
|
80 |
*/ |
|
81 |
public MatrixEffectRotate(Data1D angle, Data3D axis, Data3D center) |
|
82 |
{ |
|
83 |
super(EffectName.ROTATE); |
|
84 |
mAngle = angle; |
|
85 |
mAxis = axis; |
|
86 |
mCenter = center; |
|
87 |
} |
|
77 | 88 |
} |
src/main/java/org/distorted/library/effect/MatrixEffectScale.java | ||
---|---|---|
25 | 25 |
import org.distorted.library.type.Static3D; |
26 | 26 |
|
27 | 27 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
28 |
|
|
28 |
/** |
|
29 |
* Scale the Mesh by 3D scale factors. |
|
30 |
*/ |
|
29 | 31 |
public class MatrixEffectScale extends MatrixEffect |
30 | 32 |
{ |
31 | 33 |
private Data3D mScale; |
32 | 34 |
|
33 | 35 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 36 |
/** |
35 |
* Scales the Object by (possibly changing in time) 3D scale factors.
|
|
37 |
* Only for use by the library itself.
|
|
36 | 38 |
* |
37 |
* @param scale current x- , y- and z- scale factors.
|
|
39 |
* @y.exclude
|
|
38 | 40 |
*/ |
39 |
public MatrixEffectScale(Data3D scale)
|
|
41 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step )
|
|
40 | 42 |
{ |
41 |
super(EffectName.SCALE); |
|
42 |
mScale = scale; |
|
43 |
return mScale.get(uniforms,index,currentDuration,step); |
|
43 | 44 |
} |
44 | 45 |
|
45 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
46 | 47 |
/** |
47 |
* Scales the Object by (possibly changing in time) 3D scale factors.
|
|
48 |
* Only for use by the library itself.
|
|
48 | 49 |
* |
49 |
* @param scale Common x,y, and z scale factor.
|
|
50 |
* @y.exclude
|
|
50 | 51 |
*/ |
51 |
public MatrixEffectScale(float scale)
|
|
52 |
public void apply(float[] matrix, float[] uniforms, int index)
|
|
52 | 53 |
{ |
53 |
super(EffectName.SCALE); |
|
54 |
mScale = new Static3D(scale,scale,scale); |
|
54 |
float sx = uniforms[NUM_UNIFORMS*index ]; |
|
55 |
float sy = uniforms[NUM_UNIFORMS*index+1]; |
|
56 |
float sz = uniforms[NUM_UNIFORMS*index+2]; |
|
57 |
|
|
58 |
Matrix.scaleM(matrix, 0, sx, sy, sz); |
|
55 | 59 |
} |
56 | 60 |
|
57 | 61 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
58 |
|
|
59 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
|
62 |
// PUBLIC API |
|
63 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
64 |
/** |
|
65 |
* Scale the Mesh by 3D scale factors. |
|
66 |
* |
|
67 |
* @param scale current x- , y- and z- scale factors. |
|
68 |
*/ |
|
69 |
public MatrixEffectScale(Data3D scale) |
|
60 | 70 |
{ |
61 |
return mScale.get(uniforms,index,currentDuration,step); |
|
71 |
super(EffectName.SCALE); |
|
72 |
mScale = scale; |
|
62 | 73 |
} |
63 | 74 |
|
64 | 75 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
65 |
|
|
66 |
public void apply(float[] matrix, float[] uniforms, int index) |
|
76 |
/** |
|
77 |
* Scale the Mesh by 3D scale factors. |
|
78 |
* |
|
79 |
* @param scale Common x,y, and z scale factor. |
|
80 |
*/ |
|
81 |
public MatrixEffectScale(float scale) |
|
67 | 82 |
{ |
68 |
float sx = uniforms[NUM_UNIFORMS*index ]; |
|
69 |
float sy = uniforms[NUM_UNIFORMS*index+1]; |
|
70 |
float sz = uniforms[NUM_UNIFORMS*index+2]; |
|
71 |
|
|
72 |
Matrix.scaleM(matrix, 0, sx, sy, sz); |
|
83 |
super(EffectName.SCALE); |
|
84 |
mScale = new Static3D(scale,scale,scale); |
|
73 | 85 |
} |
74 | 86 |
} |
src/main/java/org/distorted/library/effect/MatrixEffectShear.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.type.Data3D; |
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 |
|
|
27 |
/** |
|
28 |
* Shear the Mesh. |
|
29 |
*/ |
|
28 | 30 |
public class MatrixEffectShear extends MatrixEffect |
29 | 31 |
{ |
30 | 32 |
private Data3D mShear, mCenter; |
31 | 33 |
|
32 | 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
33 | 35 |
/** |
34 |
* Shears the Object.
|
|
36 |
* Only for use by the library itself.
|
|
35 | 37 |
* |
36 |
* @param shear The 3-tuple of shear factors. The first controls level |
|
37 |
* of shearing in the X-axis, second - Y-axis and the third - |
|
38 |
* Z-axis. Each is the tangens of the shear angle, i.e 0 - |
|
39 |
* no shear, 1 - shear by 45 degrees (tan(45deg)=1) etc. |
|
40 |
* @param center Center of shearing, i.e. the point which stays unmoved. |
|
38 |
* @y.exclude |
|
41 | 39 |
*/ |
42 |
public MatrixEffectShear(Data3D shear, Data3D center) |
|
43 |
{ |
|
44 |
super(EffectName.SHEAR); |
|
45 |
mShear = shear; |
|
46 |
mCenter = center; |
|
47 |
} |
|
48 |
|
|
49 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
50 |
|
|
51 | 40 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
52 | 41 |
{ |
53 | 42 |
mCenter.get(uniforms,index+4,currentDuration,step); |
... | ... | |
55 | 44 |
} |
56 | 45 |
|
57 | 46 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
58 |
|
|
47 |
/** |
|
48 |
* Only for use by the library itself. |
|
49 |
* |
|
50 |
* @y.exclude |
|
51 |
*/ |
|
59 | 52 |
public void apply(float[] matrix, float[] uniforms, int index) |
60 | 53 |
{ |
61 | 54 |
float sx = uniforms[NUM_UNIFORMS*index ]; |
... | ... | |
85 | 78 |
|
86 | 79 |
Matrix.translateM(matrix, 0,-x, y, -z); |
87 | 80 |
} |
81 |
|
|
82 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
83 |
// PUBLIC API |
|
84 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
85 |
/** |
|
86 |
* Shear the Mesh. |
|
87 |
* |
|
88 |
* @param shear The 3-tuple of shear factors. The first controls level |
|
89 |
* of shearing in the X-axis, second - Y-axis and the third - |
|
90 |
* Z-axis. Each is the tangens of the shear angle, i.e 0 - |
|
91 |
* no shear, 1 - shear by 45 degrees (tan(45deg)=1) etc. |
|
92 |
* @param center Center of shearing, i.e. the point which stays unmoved. |
|
93 |
*/ |
|
94 |
public MatrixEffectShear(Data3D shear, Data3D center) |
|
95 |
{ |
|
96 |
super(EffectName.SHEAR); |
|
97 |
mShear = shear; |
|
98 |
mCenter = center; |
|
99 |
} |
|
88 | 100 |
} |
src/main/java/org/distorted/library/effect/PostprocessEffect.java | ||
---|---|---|
28 | 28 |
import java.util.ArrayList; |
29 | 29 |
|
30 | 30 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
31 |
// POSTPROCESSING EFFECTS. |
|
32 |
|
|
31 |
/** |
|
32 |
* Postprocessing Effect - an Effect that works by running a certain Shader Program(s) on a Framebuffer. |
|
33 |
*/ |
|
33 | 34 |
public abstract class PostprocessEffect extends Effect |
34 | 35 |
{ |
35 |
public static final int NUM_UNIFORMS = 5; // 5 per-effect interpolated values. |
|
36 |
/** |
|
37 |
* 5: 5 per-effect interpolated values. |
|
38 |
*/ |
|
39 |
public static final int NUM_UNIFORMS = 5; |
|
36 | 40 |
|
37 |
static final int POS_DATA_SIZE= 2; // Blur Program: size of the position data in elements
|
|
38 |
static final int TEX_DATA_SIZE= 2; // Blur Program: size of the texture coordinate data in elements.
|
|
41 |
static final int POS_DATA_SIZE= 2; |
|
42 |
static final int TEX_DATA_SIZE= 2; |
|
39 | 43 |
|
40 | 44 |
static final FloatBuffer mQuadPositions, mQuadTexture, mQuadTextureInv; |
41 | 45 |
|
... | ... | |
82 | 86 |
} |
83 | 87 |
|
84 | 88 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
85 |
|
|
89 |
/** |
|
90 |
* Only for use by the library itself. |
|
91 |
* |
|
92 |
* @y.exclude |
|
93 |
*/ |
|
86 | 94 |
public static void createPrograms() |
87 | 95 |
{ |
88 | 96 |
Source source; |
... | ... | |
92 | 100 |
{ |
93 | 101 |
source = mSources.remove(0); |
94 | 102 |
|
95 |
//android.util.Log.d("postprocess", "compilaing: "+source.mName);
|
|
103 |
//android.util.Log.d("postprocess", "compiling: "+source.mName); |
|
96 | 104 |
|
97 | 105 |
try |
98 | 106 |
{ |
... | ... | |
107 | 115 |
} |
108 | 116 |
|
109 | 117 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
110 |
|
|
118 |
/** |
|
119 |
* Only for use by the library itself. |
|
120 |
* |
|
121 |
* @y.exclude |
|
122 |
*/ |
|
111 | 123 |
public abstract int apply(float[] uniforms, int index, float qualityScale, DistortedFramebuffer buffer); |
112 | 124 |
|
113 | 125 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java | ||
---|---|---|
26 | 26 |
import org.distorted.library.type.Data1D; |
27 | 27 |
|
28 | 28 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
29 |
|
|
29 |
/** |
|
30 |
* Blur the Framebuffer. |
|
31 |
*/ |
|
30 | 32 |
public class PostprocessEffectBlur extends PostprocessEffect |
31 | 33 |
{ |
32 | 34 |
private static final int MAX_HALO = 50; |
... | ... | |
62 | 64 |
private static int mIndex1, mIndex2; |
63 | 65 |
|
64 | 66 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
65 |
/** |
|
66 |
* Blur the object. |
|
67 |
* |
|
68 |
* @param blurRadius The 'strength' if the effect, in pixels. 0 = no blur, 10 = when blurring a given pixel, |
|
69 |
* take into account 10 pixels in each direction. |
|
70 |
*/ |
|
71 |
public PostprocessEffectBlur(Data1D blurRadius) |
|
67 |
// This implements the 'Better separable implementation using GPU fixed function sampling' from |
|
68 |
// https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms |
|
69 |
|
|
70 |
private void computeGaussianKernel(int radius) |
|
72 | 71 |
{ |
73 |
super(EffectName.BLUR); |
|
74 |
mBlurRadius = blurRadius; |
|
72 |
int offset = radius + radius*radius/4; |
|
73 |
|
|
74 |
if( weightsCache[offset]==0.0f ) |
|
75 |
{ |
|
76 |
float z, x= 0.0f, P= (float)NUM_GAUSSIAN / (radius>3 ? radius:3); |
|
77 |
mWeights[0] = GAUSSIAN[0]; |
|
78 |
float sum = GAUSSIAN[0]; |
|
79 |
int j; |
|
80 |
|
|
81 |
for(int i=1; i<=radius; i++) |
|
82 |
{ |
|
83 |
x += P; |
|
84 |
j = (int)x; |
|
85 |
z = x-j; |
|
86 |
|
|
87 |
mWeights[i] = (1-z)*GAUSSIAN[j] + z*GAUSSIAN[j+1]; |
|
88 |
sum += 2*mWeights[i]; |
|
89 |
} |
|
90 |
|
|
91 |
for(int i=0; i<=radius; i++) mWeights[i] /= sum; |
|
92 |
|
|
93 |
int numloops = radius/2; |
|
94 |
weightsCache[offset] = mWeights[0]; |
|
95 |
offsetsCache[offset] = 0.0f; |
|
96 |
|
|
97 |
for(int i=0; i<numloops; i++) |
|
98 |
{ |
|
99 |
offsetsCache[offset+i+1] = mWeights[2*i+1]*(2*i+1) + mWeights[2*i+2]*(2*i+2); |
|
100 |
weightsCache[offset+i+1] = mWeights[2*i+1] + mWeights[2*i+2]; |
|
101 |
offsetsCache[offset+i+1]/= weightsCache[offset+i+1]; |
|
102 |
} |
|
103 |
|
|
104 |
if( radius%2 == 1 ) |
|
105 |
{ |
|
106 |
int index = offset + radius/2 +1; |
|
107 |
offsetsCache[index]=radius; |
|
108 |
weightsCache[index]=mWeights[radius]; |
|
109 |
} |
|
110 |
} |
|
75 | 111 |
} |
76 | 112 |
|
77 | 113 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
78 |
|
|
114 |
/** |
|
115 |
* Only for use by the library itself. |
|
116 |
* |
|
117 |
* @y.exclude |
|
118 |
*/ |
|
79 | 119 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
80 | 120 |
{ |
81 | 121 |
return mBlurRadius.get(uniforms,index,currentDuration,step); |
82 | 122 |
} |
83 | 123 |
|
84 | 124 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
85 |
|
|
125 |
/** |
|
126 |
* Only for use by the library itself. |
|
127 |
* |
|
128 |
* @y.exclude |
|
129 |
*/ |
|
86 | 130 |
public int apply(float[] uniforms, int index, float qualityScale, DistortedFramebuffer buffer) |
87 | 131 |
{ |
88 | 132 |
if( mProgram1 ==null) |
... | ... | |
145 | 189 |
} |
146 | 190 |
|
147 | 191 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
148 |
|
|
192 |
// PUBLIC API |
|
193 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
194 |
/** |
|
195 |
* Have to call this before the shaders get compiled (i.e before Distorted.onCreate()) for the Effect to work. |
|
196 |
*/ |
|
149 | 197 |
public static void enable() |
150 | 198 |
{ |
151 | 199 |
final String blurVertex = |
... | ... | |
214 | 262 |
} |
215 | 263 |
|
216 | 264 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
217 |
// This implements the 'Better separable implementation using GPU fixed function sampling' from |
|
218 |
// https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms |
|
219 |
|
|
220 |
private void computeGaussianKernel(int radius) |
|
265 |
/** |
|
266 |
* Blur the Framebuffer. |
|
267 |
* |
|
268 |
* @param blurRadius The 'strength' if the effect, in pixels. 0 = no blur, 10 = when blurring a given pixel, |
|
269 |
* take into account 10 pixels in each direction. |
|
270 |
*/ |
|
271 |
public PostprocessEffectBlur(Data1D blurRadius) |
|
221 | 272 |
{ |
222 |
int offset = radius + radius*radius/4; |
|
223 |
|
|
224 |
if( weightsCache[offset]==0.0f ) |
|
225 |
{ |
|
226 |
float z, x= 0.0f, P= (float)NUM_GAUSSIAN / (radius>3 ? radius:3); |
|
227 |
mWeights[0] = GAUSSIAN[0]; |
|
228 |
float sum = GAUSSIAN[0]; |
|
229 |
int j; |
|
230 |
|
|
231 |
for(int i=1; i<=radius; i++) |
|
232 |
{ |
|
233 |
x += P; |
|
234 |
j = (int)x; |
|
235 |
z = x-j; |
|
236 |
|
|
237 |
mWeights[i] = (1-z)*GAUSSIAN[j] + z*GAUSSIAN[j+1]; |
|
238 |
sum += 2*mWeights[i]; |
|
239 |
} |
|
240 |
|
|
241 |
for(int i=0; i<=radius; i++) mWeights[i] /= sum; |
|
242 |
|
|
243 |
int numloops = radius/2; |
|
244 |
weightsCache[offset] = mWeights[0]; |
|
245 |
offsetsCache[offset] = 0.0f; |
|
246 |
|
|
247 |
for(int i=0; i<numloops; i++) |
|
248 |
{ |
|
249 |
offsetsCache[offset+i+1] = mWeights[2*i+1]*(2*i+1) + mWeights[2*i+2]*(2*i+2); |
|
250 |
weightsCache[offset+i+1] = mWeights[2*i+1] + mWeights[2*i+2]; |
|
251 |
offsetsCache[offset+i+1]/= weightsCache[offset+i+1]; |
|
252 |
} |
|
253 |
|
|
254 |
if( radius%2 == 1 ) |
|
255 |
{ |
|
256 |
int index = offset + radius/2 +1; |
|
257 |
offsetsCache[index]=radius; |
|
258 |
weightsCache[index]=mWeights[radius]; |
|
259 |
} |
|
260 |
} |
|
273 |
super(EffectName.BLUR); |
|
274 |
mBlurRadius = blurRadius; |
|
261 | 275 |
} |
262 | 276 |
} |
src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java | ||
---|---|---|
64 | 64 |
private static int mIndex1, mIndex2; |
65 | 65 |
|
66 | 66 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
67 |
// This implements the 'Better separable implementation using GPU fixed function sampling' from |
|
68 |
// https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms |
|
67 | 69 |
|
68 |
/** |
|
69 |
* Make the object glow with a specific color and a halo of specific radius. |
|
70 |
* |
|
71 |
* @param glowRadius The 'strength' if the effect, in pixels. 0 = no halo, 10 = halo of roughly 10 pixels |
|
72 |
* around the whole object. |
|
73 |
* @param color RGBA of the color with which to draw the glow. |
|
74 |
*/ |
|
75 |
public PostprocessEffectGlow(Data1D glowRadius, Data4D color) |
|
70 |
private void computeGaussianKernel(int radius) |
|
76 | 71 |
{ |
77 |
super(EffectName.GLOW); |
|
78 |
mGlowRadius = glowRadius; |
|
79 |
mColor = color; |
|
72 |
int offset = radius + radius*radius/4; |
|
73 |
|
|
74 |
if( weightsCache[offset]==0.0f ) |
|
75 |
{ |
|
76 |
float z, x= 0.0f, P= (float)NUM_GAUSSIAN / (radius>3 ? radius:3); |
|
77 |
mWeights[0] = GAUSSIAN[0]; |
|
78 |
float sum = GAUSSIAN[0]; |
|
79 |
int j; |
|
80 |
|
|
81 |
for(int i=1; i<=radius; i++) |
|
82 |
{ |
|
83 |
x += P; |
|
84 |
j = (int)x; |
|
85 |
z = x-j; |
|
86 |
|
|
87 |
mWeights[i] = (1-z)*GAUSSIAN[j] + z*GAUSSIAN[j+1]; |
|
88 |
sum += 2*mWeights[i]; |
|
89 |
} |
|
90 |
|
|
91 |
for(int i=0; i<=radius; i++) mWeights[i] /= sum; |
|
92 |
|
|
93 |
int numloops = radius/2; |
|
94 |
weightsCache[offset] = mWeights[0]; |
|
95 |
offsetsCache[offset] = 0.0f; |
|
96 |
|
|
97 |
for(int i=0; i<numloops; i++) |
|
98 |
{ |
|
99 |
offsetsCache[offset+i+1] = mWeights[2*i+1]*(2*i+1) + mWeights[2*i+2]*(2*i+2); |
|
100 |
weightsCache[offset+i+1] = mWeights[2*i+1] + mWeights[2*i+2]; |
|
101 |
offsetsCache[offset+i+1]/= weightsCache[offset+i+1]; |
|
102 |
} |
|
103 |
|
|
104 |
if( radius%2 == 1 ) |
|
105 |
{ |
|
106 |
int index = offset + radius/2 +1; |
|
107 |
offsetsCache[index]=radius; |
|
108 |
weightsCache[index]=mWeights[radius]; |
|
109 |
} |
|
110 |
} |
|
80 | 111 |
} |
81 | 112 |
|
82 | 113 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
83 |
|
|
114 |
/** |
|
115 |
* Only for use by the library itself. |
|
116 |
* |
|
117 |
* @y.exclude |
|
118 |
*/ |
|
84 | 119 |
public boolean compute(float[] uniforms, int index, long currentDuration, long step ) |
85 | 120 |
{ |
86 | 121 |
mColor.get(uniforms,index+1,currentDuration,step); |
... | ... | |
88 | 123 |
} |
89 | 124 |
|
90 | 125 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
91 |
|
|
126 |
/** |
|
127 |
* Only for use by the library itself. |
|
128 |
* |
|
129 |
* @y.exclude |
|
130 |
*/ |
|
92 | 131 |
public int apply(float[] uniforms, int index, float qualityScale, DistortedFramebuffer buffer) |
93 | 132 |
{ |
94 | 133 |
if( mProgram1 ==null) |
... | ... | |
151 | 190 |
} |
152 | 191 |
|
153 | 192 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
154 |
|
|
193 |
// PUBLIC API |
|
194 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
195 |
/** |
|
196 |
* Have to call this before the shaders get compiled (i.e before Distorted.onCreate()) for the Effect to work. |
|
197 |
*/ |
|
155 | 198 |
public static void enable() |
156 | 199 |
{ |
157 | 200 |
final String glowVertex = |
... | ... | |
220 | 263 |
} |
221 | 264 |
|
222 | 265 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
223 |
// This implements the 'Better separable implementation using GPU fixed function sampling' from |
|
224 |
// https://software.intel.com/en-us/blogs/2014/07/15/an-investigation-of-fast-real-time-gpu-based-image-blur-algorithms |
|
225 | 266 |
|
226 |
private void computeGaussianKernel(int radius) |
|
267 |
/** |
|
268 |
* Make the object glow with a specific color and a halo of specific radius. |
|
269 |
* |
|
270 |
* @param glowRadius The 'strength' if the effect, in pixels. 0 = no halo, 10 = halo of roughly 10 pixels |
|
271 |
* around the whole object. |
|
272 |
* @param color RGBA of the color with which to draw the glow. |
|
273 |
*/ |
|
274 |
public PostprocessEffectGlow(Data1D glowRadius, Data4D color) |
|
227 | 275 |
{ |
228 |
int offset = radius + radius*radius/4; |
|
229 |
|
|
230 |
if( weightsCache[offset]==0.0f ) |
|
231 |
{ |
|
232 |
float z, x= 0.0f, P= (float)NUM_GAUSSIAN / (radius>3 ? radius:3); |
|
233 |
mWeights[0] = GAUSSIAN[0]; |
|
234 |
float sum = GAUSSIAN[0]; |
|
235 |
int j; |
|
236 |
|
|
237 |
for(int i=1; i<=radius; i++) |
|
238 |
{ |
|
239 |
x += P; |
|
240 |
j = (int)x; |
|
241 |
z = x-j; |
|
242 |
|
|
243 |
mWeights[i] = (1-z)*GAUSSIAN[j] + z*GAUSSIAN[j+1]; |
|
244 |
sum += 2*mWeights[i]; |
|
245 |
} |
|
246 |
|
|
247 |
for(int i=0; i<=radius; i++) mWeights[i] /= sum; |
|
248 |
|
|
249 |
int numloops = radius/2; |
|
250 |
weightsCache[offset] = mWeights[0]; |
|
251 |
offsetsCache[offset] = 0.0f; |
|
252 |
|
|
253 |
for(int i=0; i<numloops; i++) |
|
254 |
{ |
|
255 |
offsetsCache[offset+i+1] = mWeights[2*i+1]*(2*i+1) + mWeights[2*i+2]*(2*i+2); |
|
256 |
weightsCache[offset+i+1] = mWeights[2*i+1] + mWeights[2*i+2]; |
|
257 |
offsetsCache[offset+i+1]/= weightsCache[offset+i+1]; |
|
258 |
} |
|
259 |
|
|
260 |
if( radius%2 == 1 ) |
|
261 |
{ |
|
262 |
int index = offset + radius/2 +1; |
|
263 |
offsetsCache[index]=radius; |
|
264 |
weightsCache[index]=mWeights[radius]; |
|
265 |
} |
|
266 |
} |
|
276 |
super(EffectName.GLOW); |
|
277 |
mGlowRadius = glowRadius; |
|
278 |
mColor = color; |
|
267 | 279 |
} |
268 | 280 |
} |
src/main/java/org/distorted/library/effect/VertexEffect.java | ||
---|---|---|
20 | 20 |
package org.distorted.library.effect; |
21 | 21 |
|
22 | 22 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
23 |
// VERTEX EFFECTS |
|
24 |
|
|
23 |
/** |
|
24 |
* Vertex Effect - an Effect that works by injecting certain code into the main Vertex shader. |
|
25 |
*/ |
|
25 | 26 |
public abstract class VertexEffect extends Effect |
26 | 27 |
{ |
27 |
public static final int NUM_UNIFORMS = 12; // 5 per-effect interpolated values, 3-dimensional center, 4-dimensional Region |
|
28 |
/** |
|
29 |
* 12: 5 per-effect interpolated values, 3-dimensional center, 4-dimensional Region |
|
30 |
*/ |
|
31 |
public static final int NUM_UNIFORMS = 12; |
|
28 | 32 |
private static String mGLSL = ""; |
29 | 33 |
private static int mNumEnabled = 0; |
30 | 34 |
|
... | ... | |
36 | 40 |
} |
37 | 41 |
|
38 | 42 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
43 |
// prepare code to be injected into the 'main_vertex_shader' main() function. |
|
39 | 44 |
|
40 | 45 |
static void addEffect(EffectName name, String code) |
41 | 46 |
{ |
... | ... | |
56 | 61 |
} |
57 | 62 |
|
58 | 63 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
59 |
|
|
64 |
/** |
|
65 |
* Only for use by the library itself. |
|
66 |
* |
|
67 |
* @y.exclude |
|
68 |
*/ |
|
60 | 69 |
public static String getGLSL() |
61 | 70 |
{ |
62 | 71 |
return mGLSL + "{}"; |
63 | 72 |
} |
64 | 73 |
|
65 | 74 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
66 |
|
|
67 |
public static int getNumEnabled() |
|
75 |
/** |
|
76 |
* Only for use by the library itself. |
|
77 |
* |
|
78 |
* @y.exclude |
|
79 |
*/ |
|
80 |
public static void onDestroy() |
|
68 | 81 |
{ |
69 |
return mNumEnabled; |
|
82 |
mNumEnabled = 0; |
|
83 |
mGLSL = ""; |
|
70 | 84 |
} |
71 | 85 |
|
72 | 86 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
73 |
|
|
74 |
public static void onDestroy() |
|
87 |
// PUBLIC API |
|
88 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
89 |
/** |
|
90 |
* Return the number of Fragment effects enabled. |
|
91 |
*/ |
|
92 |
public static int getNumEnabled() |
|
75 | 93 |
{ |
76 |
mNumEnabled = 0; |
|
77 |
mGLSL = ""; |
|
94 |
return mNumEnabled; |
|
78 | 95 |
} |
79 | 96 |
} |
src/main/java/org/distorted/library/effect/VertexEffectDeform.java | ||
---|---|---|
24 | 24 |
import org.distorted.library.type.Static4D; |
25 | 25 |
|
26 | 26 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
27 |
|
|
27 |
/** |
|
28 |
* Deform the Mesh by applying a 3D vector of force. |
|
29 |
*/ |
|
28 | 30 |
public class VertexEffectDeform extends VertexEffect |
29 | 31 |
{ |
30 | 32 |
private Data3D mVector, mCenter; |
... | ... | |
32 | 34 |
|
33 | 35 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
34 | 36 |
/** |
35 |
* Deform the shape of the whole Object with a (possibly changing in time) vector of force applied to |
|
36 |
* a (possibly changing in time) point on the Object. |
|
37 |
* |
|
38 |
* @param vector Vector of force that deforms the shape of the whole Object. |
Also available in: Unified diff
Javadoc.