Revision faa3ff56
Added by Leszek Koltunski over 8 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.