Revision 040cd18c
Added by Leszek Koltunski over 7 years ago
| src/main/java/org/distorted/library/effect/PostprocessEffectBlur.java | ||
|---|---|---|
| 144 | 144 |
{
|
| 145 | 145 |
if( mProgram1 ==null) |
| 146 | 146 |
{
|
| 147 |
mProgram1 = mPrograms.get(mIndex1); |
|
| 148 |
mProgram2 = mPrograms.get(mIndex2); |
|
| 147 |
try |
|
| 148 |
{
|
|
| 149 |
mProgram1 = mPrograms.get(mIndex1); |
|
| 150 |
mProgram2 = mPrograms.get(mIndex2); |
|
| 151 |
} |
|
| 152 |
catch(Exception ex) |
|
| 153 |
{
|
|
| 154 |
return 0; |
|
| 155 |
} |
|
| 149 | 156 |
} |
| 150 | 157 |
|
| 151 | 158 |
DistortedRenderState.useStencilMark(); |
| src/main/java/org/distorted/library/effect/PostprocessEffectGlow.java | ||
|---|---|---|
| 148 | 148 |
{
|
| 149 | 149 |
if( mProgram1 ==null) |
| 150 | 150 |
{
|
| 151 |
mProgram1 = mPrograms.get(mIndex1); |
|
| 152 |
mProgram2 = mPrograms.get(mIndex2); |
|
| 151 |
try |
|
| 152 |
{
|
|
| 153 |
mProgram1 = mPrograms.get(mIndex1); |
|
| 154 |
mProgram2 = mPrograms.get(mIndex2); |
|
| 155 |
} |
|
| 156 |
catch(Exception ex) |
|
| 157 |
{
|
|
| 158 |
return 0; |
|
| 159 |
} |
|
| 153 | 160 |
} |
| 154 | 161 |
|
| 155 | 162 |
DistortedRenderState.useStencilMark(); |
| src/main/java/org/distorted/library/main/Distorted.java | ||
|---|---|---|
| 28 | 28 |
import org.distorted.library.effect.FragmentEffect; |
| 29 | 29 |
import org.distorted.library.effect.PostprocessEffect; |
| 30 | 30 |
import org.distorted.library.effect.VertexEffect; |
| 31 |
import org.distorted.library.program.*; |
|
| 32 | 31 |
|
| 33 | 32 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 34 | 33 |
/** |
| ... | ... | |
| 106 | 105 |
* Needs to be called from a thread holding the OpenGL context. |
| 107 | 106 |
* |
| 108 | 107 |
* @param context Context of the App using the library - used to open up Resources and read Shader code. |
| 109 |
* @throws FragmentCompilationException Fragment Shader failed to compile |
|
| 110 |
* @throws VertexCompilationException Vertex Shader failed to compile |
|
| 111 |
* @throws VertexUniformsException Too many uniforms in the Vertex Shader |
|
| 112 |
* @throws FragmentUniformsException Too many uniforms in the Fragment Shader |
|
| 113 |
* @throws LinkingException Shader failed to link |
|
| 114 | 108 |
*/ |
| 115 | 109 |
public static void onCreate(final Context context) |
| 116 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException |
|
| 117 | 110 |
{
|
| 118 | 111 |
final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); |
| 119 | 112 |
final ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo(); |
| 120 | 113 |
android.util.Log.e("DISTORTED", "Using OpenGL ES "+configurationInfo.getGlEsVersion());
|
| 121 | 114 |
|
| 122 |
GLSL = ( (configurationInfo.reqGlEsVersion>>16)>=3 ? 300 : 100 );
|
|
| 123 |
GLSL_VERSION= (GLSL==100 ? "#version 100\n" : "#version 300 es\n");
|
|
| 115 |
GLSL = ( (configurationInfo.reqGlEsVersion>>16)>=3 ? 310 : 100 );
|
|
| 116 |
GLSL_VERSION= (GLSL==100 ? "#version 100\n" : "#version 310 es\n");
|
|
| 124 | 117 |
|
| 125 | 118 |
EffectMessageSender.startSending(); |
| 126 | 119 |
|
| ... | ... | |
| 133 | 126 |
|
| 134 | 127 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 135 | 128 |
/** |
| 136 |
* Call this so that the Library can release its internal data structures. |
|
| 129 |
* Call this so that the Library can mark OpenGL objects that would need to be recreated when we |
|
| 130 |
* get resumed. |
|
| 137 | 131 |
* Must be called from Activity.onPause(). |
| 138 | 132 |
*/ |
| 139 | 133 |
public static void onPause() |
| ... | ... | |
| 162 | 156 |
|
| 163 | 157 |
mInitialized = false; |
| 164 | 158 |
} |
| 165 |
|
|
| 166 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 167 |
/** |
|
| 168 |
* Return 2 or 3 depending if we have OpenGL Es 2.0 or 3.x context created. |
|
| 169 |
*/ |
|
| 170 |
public static int getGlVersion() |
|
| 171 |
{
|
|
| 172 |
return GLSL == 300 ? 3:2; |
|
| 173 |
} |
|
| 174 | 159 |
} |
| src/main/java/org/distorted/library/main/DistortedEffects.java | ||
|---|---|---|
| 31 | 31 |
import org.distorted.library.effect.VertexEffect; |
| 32 | 32 |
import org.distorted.library.message.EffectListener; |
| 33 | 33 |
import org.distorted.library.program.DistortedProgram; |
| 34 |
import org.distorted.library.program.FragmentCompilationException; |
|
| 35 |
import org.distorted.library.program.FragmentUniformsException; |
|
| 36 |
import org.distorted.library.program.LinkingException; |
|
| 37 |
import org.distorted.library.program.VertexCompilationException; |
|
| 38 |
import org.distorted.library.program.VertexUniformsException; |
|
| 39 | 34 |
|
| 40 | 35 |
import java.io.InputStream; |
| 41 | 36 |
import java.nio.ByteBuffer; |
| ... | ... | |
| 92 | 87 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 93 | 88 |
|
| 94 | 89 |
static void createProgram(Resources resources) |
| 95 |
throws FragmentCompilationException,VertexCompilationException,VertexUniformsException,FragmentUniformsException,LinkingException |
|
| 96 | 90 |
{
|
| 97 | 91 |
// MAIN PROGRAM //////////////////////////////////// |
| 98 | 92 |
final InputStream mainVertStream = resources.openRawResource(R.raw.main_vertex_shader); |
| ... | ... | |
| 113 | 107 |
|
| 114 | 108 |
String[] feedback = { "v_Position", "v_endPosition" };
|
| 115 | 109 |
|
| 116 |
mMainProgram = new DistortedProgram( mainVertStream, mainFragStream, mainVertHeader, mainFragHeader, |
|
| 117 |
enabledEffectV, enabledEffectF, Distorted.GLSL, feedback); |
|
| 110 |
try |
|
| 111 |
{
|
|
| 112 |
mMainProgram = new DistortedProgram(mainVertStream, mainFragStream, mainVertHeader, mainFragHeader, |
|
| 113 |
enabledEffectV, enabledEffectF, Distorted.GLSL, feedback); |
|
| 114 |
} |
|
| 115 |
catch(Exception e) |
|
| 116 |
{
|
|
| 117 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile MAIN program: "+e.getMessage());
|
|
| 118 |
throw new RuntimeException(e.getMessage()); |
|
| 119 |
} |
|
| 118 | 120 |
|
| 119 | 121 |
int mainProgramH = mMainProgram.getProgramHandle(); |
| 120 | 122 |
EffectQueueFragment.getUniforms(mainProgramH); |
| ... | ... | |
| 135 | 137 |
} |
| 136 | 138 |
catch(Exception e) |
| 137 | 139 |
{
|
| 138 |
Log.e("EFFECTS", "exception trying to compile BLIT program: "+e.getMessage());
|
|
| 140 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile BLIT program: "+e.getMessage());
|
|
| 139 | 141 |
throw new RuntimeException(e.getMessage()); |
| 140 | 142 |
} |
| 141 | 143 |
|
| ... | ... | |
| 153 | 155 |
} |
| 154 | 156 |
catch(Exception e) |
| 155 | 157 |
{
|
| 156 |
Log.e("EFFECTS", "exception trying to compile BLIT DEPTH program: "+e.getMessage());
|
|
| 158 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile BLIT DEPTH program: "+e.getMessage());
|
|
| 157 | 159 |
throw new RuntimeException(e.getMessage()); |
| 158 | 160 |
} |
| 159 | 161 |
|
| ... | ... | |
| 173 | 175 |
} |
| 174 | 176 |
catch(Exception e) |
| 175 | 177 |
{
|
| 176 |
Log.e("EFFECTS", "exception trying to compile NORMAL program: "+e.getMessage());
|
|
| 178 |
Log.e("EFFECTS", e.getClass().getSimpleName()+" trying to compile NORMAL program: "+e.getMessage());
|
|
| 177 | 179 |
throw new RuntimeException(e.getMessage()); |
| 178 | 180 |
} |
| 179 | 181 |
|
| ... | ... | |
| 284 | 286 |
mMainProgram.useProgram(); |
| 285 | 287 |
GLES31.glUniform1i(mMainTextureH, 0); |
| 286 | 288 |
|
| 287 |
if( Distorted.GLSL >= 300 ) |
|
| 288 |
{
|
|
| 289 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.mAttVBO[0]); |
|
| 290 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0); |
|
| 291 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1); |
|
| 292 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
|
| 293 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); |
|
| 294 |
} |
|
| 295 |
else |
|
| 296 |
{
|
|
| 297 |
mesh.mVertAttribs.position(0); |
|
| 298 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, mesh.mVertAttribs); |
|
| 299 |
mesh.mVertAttribs.position(MeshObject.POS_DATA_SIZE); |
|
| 300 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, mesh.mVertAttribs); |
|
| 301 |
mesh.mVertAttribs.position(MeshObject.POS_DATA_SIZE+MeshObject.NOR_DATA_SIZE); |
|
| 302 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, mesh.mVertAttribs); |
|
| 303 |
} |
|
| 289 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, mesh.mAttVBO[0]); |
|
| 290 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[0], MeshObject.POS_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET0); |
|
| 291 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[1], MeshObject.NOR_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET1); |
|
| 292 |
GLES31.glVertexAttribPointer(mMainProgram.mAttribute[2], MeshObject.TEX_DATA_SIZE, GLES31.GL_FLOAT, false, MeshObject.VERTSIZE, MeshObject.OFFSET2); |
|
| 293 |
GLES31.glBindBuffer(GLES31.GL_ARRAY_BUFFER, 0); |
|
| 304 | 294 |
|
| 305 | 295 |
mM.send(surface,halfW,halfH,halfZ,marginInPixels); |
| 306 | 296 |
mV.send(); |
| src/main/java/org/distorted/library/main/DistortedFramebuffer.java | ||
|---|---|---|
| 31 | 31 |
public class DistortedFramebuffer extends DistortedOutputSurface implements DistortedInputSurface |
| 32 | 32 |
{
|
| 33 | 33 |
|
| 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 35 |
|
|
| 36 |
void prepareDebug(long time) {}
|
|
| 37 |
void renderDebug(long time) {}
|
|
| 38 |
|
|
| 39 | 34 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 40 | 35 |
// Must be called from a thread holding OpenGL Context |
| 41 | 36 |
|
| ... | ... | |
| 201 | 196 |
super(width,height,NOT_CREATED_YET,numcolors,depthStencil,NOT_CREATED_YET,TYPE_USER); |
| 202 | 197 |
} |
| 203 | 198 |
|
| 204 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 205 |
|
|
| 206 |
/** |
|
| 207 |
* Create new offscreen Framebuffer with COLOR0 attachment only. |
|
| 208 |
* |
|
| 209 |
* @param width Width of the COLOR0 attachment. |
|
| 210 |
* @param height Height of the COLOR0 attachment. |
|
| 211 |
*/ |
|
| 212 |
@SuppressWarnings("unused")
|
|
| 213 |
public DistortedFramebuffer(int width, int height) |
|
| 214 |
{
|
|
| 215 |
super(width,height,NOT_CREATED_YET, 1, NO_DEPTH_NO_STENCIL,NOT_CREATED_YET,TYPE_USER); |
|
| 216 |
} |
|
| 217 |
|
|
| 218 | 199 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 219 | 200 |
/** |
| 220 | 201 |
* Bind the underlying rectangle of pixels as a OpenGL Texture. |
| src/main/java/org/distorted/library/main/DistortedMaster.java | ||
|---|---|---|
| 96 | 96 |
} |
| 97 | 97 |
|
| 98 | 98 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 99 |
// can make this logarithmic but the typical number of children is very small anyway |
|
| 99 |
// Can make this logarithmic but the typical number of children is very small anyway. |
|
| 100 |
// |
|
| 101 |
// We want to keep same buckets next to each other, while avoiding changes in order of the children |
|
| 102 |
// (if possible!) We want to keep bucket=0 (i.e. the non-postprocessed children) at the beginning. |
|
| 100 | 103 |
|
| 101 |
static void addSorted(ArrayList<DistortedNode> mChildren, DistortedNode newChild)
|
|
| 104 |
static void addSortingByBuckets(ArrayList<DistortedNode> mChildren, DistortedNode newChild)
|
|
| 102 | 105 |
{
|
| 103 | 106 |
int i,num = mChildren.size(); |
| 104 | 107 |
long bucket = newChild.getPostprocessQueue().getID(); |
| 108 |
boolean sameBucket = false; |
|
| 105 | 109 |
|
| 106 | 110 |
for(i=0; i<num; i++) |
| 107 | 111 |
{
|
| 108 |
if( mChildren.get(i).getPostprocessQueue().getID() > bucket ) break; |
|
| 112 |
if( mChildren.get(i).getPostprocessQueue().getID() == bucket ) |
|
| 113 |
{
|
|
| 114 |
sameBucket=true; |
|
| 115 |
} |
|
| 116 |
else if( sameBucket || bucket==0 ) |
|
| 117 |
{
|
|
| 118 |
break; |
|
| 119 |
} |
|
| 109 | 120 |
} |
| 110 | 121 |
|
| 111 | 122 |
mChildren.add(i,newChild); |
| src/main/java/org/distorted/library/main/DistortedNode.java | ||
|---|---|---|
| 228 | 228 |
if( mNumChildren[0]==0 && newData.mFBO!=null ) |
| 229 | 229 |
{
|
| 230 | 230 |
newData.mFBO.markForDeletion(); |
| 231 |
android.util.Log.d("NODE", "ERROR!! this NodeData cannot possibly contain a non-null FBO!! "+newData.mFBO.getID() );
|
|
| 231 |
android.util.Log.e("NODE", "ERROR!! this NodeData cannot possibly contain a non-null FBO!! "+newData.mFBO.getID() );
|
|
| 232 | 232 |
newData.mFBO = null; |
| 233 | 233 |
} |
| 234 | 234 |
|
| ... | ... | |
| 283 | 283 |
|
| 284 | 284 |
if( input.setAsInput() ) |
| 285 | 285 |
{
|
| 286 |
surface.setAsOutput(currTime); |
|
| 287 | 286 |
mState.apply(); |
| 288 | 287 |
GLES31.glDisable(GLES31.GL_BLEND); |
| 289 | 288 |
mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0); |
| ... | ... | |
| 303 | 302 |
|
| 304 | 303 |
if( input.setAsInput() ) |
| 305 | 304 |
{
|
| 306 |
surface.setAsOutput(currTime); |
|
| 307 | 305 |
mState.apply(); |
| 308 | 306 |
mEffects.drawPriv(mSurface.getWidth()/2.0f, mSurface.getHeight()/2.0f, mMesh, surface, currTime, 0); |
| 309 | 307 |
return 1; |
| ... | ... | |
| 364 | 362 |
if( mParent!=null ) |
| 365 | 363 |
{
|
| 366 | 364 |
mParent.mChildren.remove(this); |
| 367 |
DistortedMaster.addSorted(mParent.mChildren,this);
|
|
| 365 |
DistortedMaster.addSortingByBuckets(mParent.mChildren,this);
|
|
| 368 | 366 |
} |
| 369 | 367 |
else if( mSurfaceParent!=null ) |
| 370 | 368 |
{
|
| 371 | 369 |
ArrayList<DistortedNode> children = mSurfaceParent.getChildren(); |
| 372 | 370 |
children.remove(this); |
| 373 |
DistortedMaster.addSorted(children,this);
|
|
| 371 |
DistortedMaster.addSortingByBuckets(children,this);
|
|
| 374 | 372 |
} |
| 375 | 373 |
} |
| 376 | 374 |
|
| ... | ... | |
| 651 | 649 |
if( mChildren==null ) mChildren = new ArrayList<>(2); |
| 652 | 650 |
job.node.mParent = this; |
| 653 | 651 |
job.node.mSurfaceParent = null; |
| 654 |
DistortedMaster.addSorted(mChildren,job.node);
|
|
| 652 |
DistortedMaster.addSortingByBuckets(mChildren,job.node);
|
|
| 655 | 653 |
mNumChildren[0]++; |
| 656 | 654 |
break; |
| 657 | 655 |
case DETACH: numChanges++; |
| ... | ... | |
| 678 | 676 |
} |
| 679 | 677 |
break; |
| 680 | 678 |
case SORT : mChildren.remove(job.node); |
| 681 |
DistortedMaster.addSorted(mChildren,job.node);
|
|
| 679 |
DistortedMaster.addSortingByBuckets(mChildren,job.node);
|
|
| 682 | 680 |
break; |
| 683 | 681 |
} |
| 684 | 682 |
} |
| src/main/java/org/distorted/library/main/DistortedObject.java | ||
|---|---|---|
| 119 | 119 |
DistortedObject object; |
| 120 | 120 |
int num = mDoneList.size(); |
| 121 | 121 |
|
| 122 |
for(int i=0; i<num; i++) |
|
| 122 |
try |
|
| 123 |
{
|
|
| 124 |
for (int i = 0; i < num; i++) |
|
| 125 |
{
|
|
| 126 |
object = mDoneList.removeFirst(); |
|
| 127 |
mToDoMap.put(object.mID, object.new Job(object, JOB_CREATE)); |
|
| 128 |
object.recreate(); |
|
| 129 |
} |
|
| 130 |
} |
|
| 131 |
catch( Exception ex ) |
|
| 123 | 132 |
{
|
| 124 |
object = mDoneList.removeFirst(); |
|
| 125 |
mToDoMap.put(object.mID, object.new Job(object,JOB_CREATE) ); |
|
| 126 |
object.recreate(); |
|
| 133 |
// something else removed an object in the meantime; ignore |
|
| 127 | 134 |
} |
| 128 | 135 |
|
| 129 | 136 |
mToDo = true; |
| src/main/java/org/distorted/library/main/DistortedObjectCounter.java | ||
|---|---|---|
| 1 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 2 |
// Copyright 2016 Leszek Koltunski // |
|
| 3 |
// // |
|
| 4 |
// This file is part of Distorted. // |
|
| 5 |
// // |
|
| 6 |
// Distorted is free software: you can redistribute it and/or modify // |
|
| 7 |
// it under the terms of the GNU General Public License as published by // |
|
| 8 |
// the Free Software Foundation, either version 2 of the License, or // |
|
| 9 |
// (at your option) any later version. // |
|
| 10 |
// // |
|
| 11 |
// Distorted is distributed in the hope that it will be useful, // |
|
| 12 |
// but WITHOUT ANY WARRANTY; without even the implied warranty of // |
|
| 13 |
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // |
|
| 14 |
// GNU General Public License for more details. // |
|
| 15 |
// // |
|
| 16 |
// You should have received a copy of the GNU General Public License // |
|
| 17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
|
| 18 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 19 |
|
|
| 20 |
package org.distorted.library.main; |
|
| 21 |
|
|
| 22 |
import java.util.ArrayList; |
|
| 23 |
|
|
| 24 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 25 |
/** |
|
| 26 |
* Return unique IDs of objects in a lazy way. When we create a new Object, return the lowest unused |
|
| 27 |
* integer. When an objects gets deleted, its ID then gets marked unused. We do not try to 'collapse' |
|
| 28 |
* unused holes. |
|
| 29 |
*/ |
|
| 30 |
class DistortedObjectCounter |
|
| 31 |
{
|
|
| 32 |
private ArrayList<Integer> mUsed; |
|
| 33 |
private int mFirstUnused; |
|
| 34 |
|
|
| 35 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 36 |
|
|
| 37 |
DistortedObjectCounter() |
|
| 38 |
{
|
|
| 39 |
mUsed = new ArrayList<>(); |
|
| 40 |
mFirstUnused = 0; |
|
| 41 |
} |
|
| 42 |
|
|
| 43 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 44 |
|
|
| 45 |
int returnNext() |
|
| 46 |
{
|
|
| 47 |
int size = mUsed.size(); |
|
| 48 |
|
|
| 49 |
if( mFirstUnused<size ) |
|
| 50 |
{
|
|
| 51 |
int ret = mFirstUnused; |
|
| 52 |
|
|
| 53 |
mUsed.set(mFirstUnused,1); |
|
| 54 |
|
|
| 55 |
int found=-1; |
|
| 56 |
|
|
| 57 |
for(int i=mFirstUnused+1; i<size; i++ ) |
|
| 58 |
{
|
|
| 59 |
if( mUsed.get(i)==0 ) |
|
| 60 |
{
|
|
| 61 |
found = i; |
|
| 62 |
break; |
|
| 63 |
} |
|
| 64 |
} |
|
| 65 |
|
|
| 66 |
mFirstUnused = found<0 ? size : found; |
|
| 67 |
|
|
| 68 |
return ret; |
|
| 69 |
} |
|
| 70 |
|
|
| 71 |
mUsed.add(1); |
|
| 72 |
mFirstUnused++; |
|
| 73 |
|
|
| 74 |
return size; |
|
| 75 |
} |
|
| 76 |
|
|
| 77 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 78 |
|
|
| 79 |
void release(int objID) |
|
| 80 |
{
|
|
| 81 |
int size = mUsed.size(); |
|
| 82 |
|
|
| 83 |
if( objID<size && objID>=0 && mUsed.get(objID)==1 ) |
|
| 84 |
{
|
|
| 85 |
mUsed.set(objID,0); |
|
| 86 |
if( objID<mFirstUnused ) mFirstUnused = objID; |
|
| 87 |
} |
|
| 88 |
} |
|
| 89 |
|
|
| 90 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 91 |
|
|
| 92 |
void releaseAll() |
|
| 93 |
{
|
|
| 94 |
mUsed.clear(); |
|
| 95 |
mFirstUnused = 0; |
|
| 96 |
} |
|
| 97 |
} |
|
| src/main/java/org/distorted/library/main/DistortedOutputSurface.java | ||
|---|---|---|
| 34 | 34 |
*/ |
| 35 | 35 |
public abstract class DistortedOutputSurface extends DistortedSurface implements DistortedMaster.Slave |
| 36 | 36 |
{
|
| 37 |
//////////// DEBUG FLAGS ///////////////////////////////////////////// |
|
| 38 |
/** |
|
| 39 |
* When rendering a Screen, show FPS in the upper-left corner? |
|
| 40 |
*/ |
|
| 41 |
public static final int DEBUG_FPS = 1; |
|
| 42 |
//////////// END DEBUG FLAGS ///////////////////////////////////////// |
|
| 43 |
|
|
| 44 | 37 |
/** |
| 45 | 38 |
* Do not create DEPTH or STENCIL attachment |
| 46 | 39 |
*/ |
| ... | ... | |
| 77 | 70 |
private ArrayList<Job> mJobs = new ArrayList<>(); |
| 78 | 71 |
|
| 79 | 72 |
// Global buffers used for postprocessing. |
| 80 |
private static DistortedOutputSurface[] mBuffer = new DistortedOutputSurface[EffectQuality.LENGTH];
|
|
| 73 |
private static DistortedOutputSurface[] mBuffer = null;
|
|
| 81 | 74 |
|
| 82 | 75 |
private long mTime; |
| 83 | 76 |
private float mFOV; |
| ... | ... | |
| 95 | 88 |
private int mClear; |
| 96 | 89 |
float mMipmap; |
| 97 | 90 |
|
| 98 |
private int mDebugLevel; |
|
| 99 |
|
|
| 100 | 91 |
int mRealWidth; // the Surface can be backed up with a texture that is |
| 101 | 92 |
int mRealHeight; // larger than the viewport we have to it. |
| 102 | 93 |
// mWidth,mHeight are the sizes of the Viewport, those - |
| 103 | 94 |
// sizes of the backing up texture. |
| 104 | 95 |
|
| 105 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 106 |
|
|
| 107 |
abstract void prepareDebug(long time); |
|
| 108 |
abstract void renderDebug(long time); |
|
| 109 |
|
|
| 110 | 96 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 111 | 97 |
|
| 112 | 98 |
DistortedOutputSurface(int width, int height, int createColor, int numcolors, int depthStencil, int fbo, int type) |
| ... | ... | |
| 128 | 114 |
mDepthStencilH[0]= 0; |
| 129 | 115 |
|
| 130 | 116 |
mTime = 0; |
| 131 |
mDebugLevel = 0; |
|
| 132 | 117 |
|
| 133 | 118 |
mClearR = 0.0f; |
| 134 | 119 |
mClearG = 0.0f; |
| ... | ... | |
| 184 | 169 |
|
| 185 | 170 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 186 | 171 |
|
| 187 |
private static void createBuffers(int width, int height, float near) |
|
| 172 |
private static void createPostprocessingBuffers(int width, int height, float near)
|
|
| 188 | 173 |
{
|
| 174 |
mBuffer = new DistortedOutputSurface[EffectQuality.LENGTH]; |
|
| 189 | 175 |
float mipmap=1.0f; |
| 190 | 176 |
|
| 191 | 177 |
for(int j=0; j<EffectQuality.LENGTH; j++) |
| ... | ... | |
| 221 | 207 |
|
| 222 | 208 |
static synchronized void onDestroy() |
| 223 | 209 |
{
|
| 224 |
for(int j=0; j<EffectQuality.LENGTH; j++)
|
|
| 210 |
if( mBuffer!=null )
|
|
| 225 | 211 |
{
|
| 226 |
mBuffer[j] = null; |
|
| 212 |
for (int i=0; i<EffectQuality.LENGTH; i++) |
|
| 213 |
{
|
|
| 214 |
mBuffer[i] = null; |
|
| 215 |
} |
|
| 216 |
|
|
| 217 |
mBuffer = null; |
|
| 227 | 218 |
} |
| 228 | 219 |
} |
| 229 | 220 |
|
| 230 | 221 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 231 | 222 |
// The postprocessing buffers mBuffer[] are generally speaking too large (there's just one static |
| 232 |
// set of them) so before we use them for output, we need to adjust the Vieport as if they were |
|
| 223 |
// set of them) so before we use them for output, we need to adjust the Viewport as if they were
|
|
| 233 | 224 |
// smaller. That takes care of outputting pixels to them. When we use them as input, we have to |
| 234 | 225 |
// adjust the texture coords - see the get{Width|Height}Correction functions.
|
| 235 | 226 |
|
| 236 |
private static void cloneViewport(DistortedOutputSurface from) |
|
| 227 |
private static void clonePostprocessingViewport(DistortedOutputSurface from)
|
|
| 237 | 228 |
{
|
| 238 |
if( mBuffer[0].mWidth != from.mWidth ) |
|
| 229 |
if( mBuffer[0].mWidth != from.mWidth || mBuffer[0].mHeight != from.mHeight )
|
|
| 239 | 230 |
{
|
| 240 | 231 |
DistortedOutputSurface surface; |
| 241 | 232 |
|
| ... | ... | |
| 304 | 295 |
return 1; |
| 305 | 296 |
} |
| 306 | 297 |
|
| 298 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 299 |
|
|
| 300 |
void clear() |
|
| 301 |
{
|
|
| 302 |
DistortedRenderState.colorDepthStencilOn(); |
|
| 303 |
GLES31.glClearColor(mClearR, mClearG, mClearB, mClearA); |
|
| 304 |
GLES31.glClearDepthf(mClearDepth); |
|
| 305 |
GLES31.glClearStencil(mClearStencil); |
|
| 306 |
GLES31.glClear(mClear); |
|
| 307 |
DistortedRenderState.colorDepthStencilRestore(); |
|
| 308 |
} |
|
| 309 |
|
|
| 307 | 310 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 308 | 311 |
// Render all children, one by one. If there are no postprocessing effects, just render to THIS. |
| 309 | 312 |
// Otherwise, render to a buffer and on each change of Postprocessing Bucket, apply the postprocessing |
| ... | ... | |
| 322 | 325 |
currQueue = child1.getPostprocessQueue(); |
| 323 | 326 |
currBucket= currQueue.getID(); |
| 324 | 327 |
|
| 325 |
if( currBucket==0 ) numRenders += child1.draw(time,this); |
|
| 328 |
if( currBucket==0 ) |
|
| 329 |
{
|
|
| 330 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, mFBOH[0]); |
|
| 331 |
numRenders += child1.draw(time,this); |
|
| 332 |
} |
|
| 326 | 333 |
else |
| 327 | 334 |
{
|
| 328 |
if( mBuffer[0]==null ) createBuffers(mWidth,mHeight,mNear);
|
|
| 335 |
if( mBuffer==null ) createPostprocessingBuffers(mWidth,mHeight,mNear);
|
|
| 329 | 336 |
|
| 330 | 337 |
if( lastBucket!=currBucket ) |
| 331 | 338 |
{
|
| 332 |
if( lastBucket!=0 ) |
|
| 339 |
if( lastBucket==0 ) |
|
| 340 |
{
|
|
| 341 |
clonePostprocessingViewport(this); |
|
| 342 |
} |
|
| 343 |
else |
|
| 333 | 344 |
{
|
| 334 | 345 |
for(int j=bucketChange; j<i; j++) |
| 335 | 346 |
{
|
| ... | ... | |
| 346 | 357 |
internalQuality = currQueue.getInternalQuality(); |
| 347 | 358 |
quality = currQueue.getQuality(); |
| 348 | 359 |
bucketChange = i; |
| 349 |
|
|
| 350 |
cloneViewport(this); |
|
| 351 | 360 |
} |
| 352 | 361 |
|
| 362 |
mBuffer[quality].setAsOutput(time); |
|
| 353 | 363 |
child1.drawNoBlend(time,mBuffer[quality]); |
| 354 | 364 |
|
| 355 | 365 |
if( i==numChildren-1 ) |
| ... | ... | |
| 363 | 373 |
numRenders += currQueue.postprocess(mBuffer); |
| 364 | 374 |
numRenders += blitWithDepth(time, mBuffer[quality]); |
| 365 | 375 |
} |
| 366 |
} |
|
| 376 |
} // end postprocessed child case
|
|
| 367 | 377 |
|
| 368 | 378 |
lastQueue = currQueue; |
| 369 | 379 |
lastBucket= currBucket; |
| 370 |
} |
|
| 380 |
} // end main for loop
|
|
| 371 | 381 |
|
| 372 | 382 |
return numRenders; |
| 373 | 383 |
} |
| ... | ... | |
| 423 | 433 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 424 | 434 |
// PUBLIC API |
| 425 | 435 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 426 |
/** |
|
| 427 |
* Make the library show various debugging information. |
|
| 428 |
* <p> |
|
| 429 |
* Currently only DEBUG_FPS - show FPS in the upper-left corner of every Screen - is defined. |
|
| 430 |
* |
|
| 431 |
* @param bitmask 0, or a bitmask of DEBUG_** flags to enable (currently only DEBUG_FPS defined) |
|
| 432 |
*/ |
|
| 433 |
public void setDebug(int bitmask) |
|
| 434 |
{
|
|
| 435 |
if( this instanceof DistortedScreen ) |
|
| 436 |
mDebugLevel = bitmask; |
|
| 437 |
} |
|
| 438 |
|
|
| 439 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 440 | 436 |
|
| 441 | 437 |
/** |
| 442 | 438 |
* Draws all the attached children to this OutputSurface. |
| ... | ... | |
| 448 | 444 |
*/ |
| 449 | 445 |
public int render(long time) |
| 450 | 446 |
{
|
| 451 |
if( mDebugLevel!=0 ) prepareDebug(time); |
|
| 452 |
|
|
| 453 | 447 |
// change tree topology (attach and detach children) |
| 454 | 448 |
/* |
| 455 | 449 |
boolean changed1 = |
| ... | ... | |
| 494 | 488 |
setAsOutput(time); |
| 495 | 489 |
numRenders += renderChildren(time,mNumChildren,mChildren); |
| 496 | 490 |
|
| 497 |
if( mDebugLevel != 0 ) renderDebug(time); |
|
| 498 |
|
|
| 499 | 491 |
return numRenders; |
| 500 | 492 |
} |
| 501 | 493 |
|
| ... | ... | |
| 515 | 507 |
if( mTime!=time ) |
| 516 | 508 |
{
|
| 517 | 509 |
mTime = time; |
| 518 |
DistortedRenderState.colorDepthStencilOn(); |
|
| 519 |
GLES31.glClearColor(mClearR, mClearG, mClearB, mClearA); |
|
| 520 |
GLES31.glClearDepthf(mClearDepth); |
|
| 521 |
GLES31.glClearStencil(mClearStencil); |
|
| 522 |
GLES31.glClear(mClear); |
|
| 523 |
DistortedRenderState.colorDepthStencilRestore(); |
|
| 524 |
/* |
|
| 525 |
if( mSSBO[0]>=0 ) |
|
| 526 |
{
|
|
| 527 |
// yes, this DOES keep on working when 'value' overflows into negative territory. |
|
| 528 |
int value = mIntBuffer.get(FRAME_DELAY*mSurfaceID+mLastIndex); |
|
| 529 |
|
|
| 530 |
if( value-mLastValue[mLastIndex]!=mLastDiff ) |
|
| 531 |
{
|
|
| 532 |
android.util.Log.d("surface", "id " + mSurfaceID +
|
|
| 533 |
(mType == TYPE_USER ? " USER" : (mType == TYPE_SYST ? " SYST" : " TREE")) + |
|
| 534 |
" viewport: (" + mWidth + "x" + mHeight + ") last frame: " + (value - mLastValue[mLastIndex])
|
|
| 535 |
+ " avg: " + (mAvgSum/RUNNING_AVERAGE) |
|
| 536 |
); |
|
| 537 |
} |
|
| 538 |
|
|
| 539 |
mLastDiff = value-mLastValue[mLastIndex]; |
|
| 540 |
mLastValue[mLastIndex] = value; |
|
| 541 |
|
|
| 542 |
mAvgSum += (mLastDiff-mRunningAvg[mAvgIndex]); |
|
| 543 |
mRunningAvg[mAvgIndex] = mLastDiff; |
|
| 544 |
if( ++mAvgIndex>=RUNNING_AVERAGE ) mAvgIndex =0; |
|
| 545 |
} |
|
| 546 |
|
|
| 547 |
if( ++mLastIndex >= FRAME_DELAY ) mLastIndex=0; |
|
| 548 |
*/ |
|
| 510 |
clear(); |
|
| 549 | 511 |
} |
| 550 | 512 |
} |
| 551 | 513 |
|
| ... | ... | |
| 683 | 645 |
mNear=0.99f; |
| 684 | 646 |
} |
| 685 | 647 |
|
| 686 |
if( mBuffer[0]!=null )
|
|
| 648 |
if( mBuffer!=null ) |
|
| 687 | 649 |
{
|
| 688 | 650 |
for(int j=0; j<EffectQuality.LENGTH; j++) mBuffer[j].mNear = mNear; |
| 689 | 651 |
} |
| ... | ... | |
| 874 | 836 |
{
|
| 875 | 837 |
case ATTACH: if( mChildren==null ) mChildren = new ArrayList<>(2); |
| 876 | 838 |
job.node.setSurfaceParent(this); |
| 877 |
DistortedMaster.addSorted(mChildren,job.node);
|
|
| 839 |
DistortedMaster.addSortingByBuckets(mChildren,job.node);
|
|
| 878 | 840 |
mNumChildren++; |
| 879 | 841 |
break; |
| 880 | 842 |
case DETACH: if( mNumChildren>0 && mChildren.remove(job.node) ) |
| ... | ... | |
| 897 | 859 |
} |
| 898 | 860 |
break; |
| 899 | 861 |
case SORT : mChildren.remove(job.node); |
| 900 |
DistortedMaster.addSorted(mChildren,job.node);
|
|
| 862 |
DistortedMaster.addSortingByBuckets(mChildren,job.node);
|
|
| 901 | 863 |
break; |
| 902 | 864 |
} |
| 903 | 865 |
} |
| src/main/java/org/distorted/library/main/DistortedScreen.java | ||
|---|---|---|
| 1 | 1 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 2 |
// Copyright 2016 Leszek Koltunski //
|
|
| 2 |
// Copyright 2018 Leszek Koltunski //
|
|
| 3 | 3 |
// // |
| 4 | 4 |
// This file is part of Distorted. // |
| 5 | 5 |
// // |
| ... | ... | |
| 34 | 34 |
* <p> |
| 35 | 35 |
* User is able to render to it just like to a DistortedFramebuffer. |
| 36 | 36 |
*/ |
| 37 |
public class DistortedScreen extends DistortedOutputSurface
|
|
| 37 |
public class DistortedScreen extends DistortedFramebuffer
|
|
| 38 | 38 |
{
|
| 39 | 39 |
///// DEBUGGING ONLY ///////////////////////// |
| 40 |
private boolean mShowFPS; |
|
| 41 |
|
|
| 40 | 42 |
private static final int NUM_FRAMES = 100; |
| 41 | 43 |
|
| 42 | 44 |
private MeshObject fpsMesh; |
| ... | ... | |
| 46 | 48 |
private Bitmap fpsBitmap; |
| 47 | 49 |
private Paint mPaint; |
| 48 | 50 |
private int fpsH, fpsW; |
| 49 |
private String fpsString = "";
|
|
| 51 |
private String fpsString; |
|
| 50 | 52 |
private long lastTime=0; |
| 51 | 53 |
private long[] durations; |
| 52 | 54 |
private int currDuration; |
| 53 | 55 |
private static MatrixEffectMove mMoveEffect = new MatrixEffectMove( new Static3D(5,5,0) ); |
| 54 |
private boolean mInitialized;
|
|
| 56 |
///// END DEBUGGING //////////////////////////
|
|
| 55 | 57 |
|
| 56 | 58 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 57 |
// here we don't manage underlying OpenGL assets ourselves |
|
| 58 |
|
|
| 59 |
void create() {}
|
|
| 60 |
void delete() {}
|
|
| 61 |
void recreate() {}
|
|
| 59 |
// PUBLIC API |
|
| 60 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 61 |
/** |
|
| 62 |
* Create a new Screen. Initially 1x1 in size. |
|
| 63 |
* <p> |
|
| 64 |
* Has to be followed by a 'resize()' to set the size. |
|
| 65 |
*/ |
|
| 66 |
public DistortedScreen() |
|
| 67 |
{
|
|
| 68 |
super(1,1,1,BOTH_DEPTH_STENCIL); |
|
| 69 |
mShowFPS = false; |
|
| 70 |
} |
|
| 62 | 71 |
|
| 63 | 72 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 73 |
/** |
|
| 74 |
* Draws all the attached children to this OutputSurface. |
|
| 75 |
* <p> |
|
| 76 |
* Must be called from a thread holding OpenGL Context. |
|
| 77 |
* |
|
| 78 |
* @param time Current time, in milliseconds. This will be passed to all the Effects stored in the children Nodes. |
|
| 79 |
* @return Number of objects rendered. |
|
| 80 |
*/ |
|
| 81 |
public int render(long time) |
|
| 82 |
{
|
|
| 83 |
if( mShowFPS ) |
|
| 84 |
{
|
|
| 85 |
if( lastTime==0 ) lastTime = time; |
|
| 64 | 86 |
|
| 65 |
private void initialize() |
|
| 87 |
currDuration++; |
|
| 88 |
if (currDuration >= NUM_FRAMES) currDuration = 0; |
|
| 89 |
durations[NUM_FRAMES] += ((time - lastTime) - durations[currDuration]); |
|
| 90 |
durations[currDuration] = time - lastTime; |
|
| 91 |
|
|
| 92 |
fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f; |
|
| 93 |
|
|
| 94 |
mPaint.setColor(0xffffffff); |
|
| 95 |
fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint); |
|
| 96 |
mPaint.setColor(0xff000000); |
|
| 97 |
fpsCanvas.drawText(fpsString, fpsW/2, 0.75f*fpsH, mPaint); |
|
| 98 |
fpsTexture.setTexture(fpsBitmap); |
|
| 99 |
|
|
| 100 |
lastTime = time; |
|
| 101 |
} |
|
| 102 |
|
|
| 103 |
int numrender = super.render(time); |
|
| 104 |
|
|
| 105 |
GLES31.glBindFramebuffer(GLES31.GL_FRAMEBUFFER, 0); |
|
| 106 |
clear(); |
|
| 107 |
setAsInput(); |
|
| 108 |
GLES31.glColorMask(true,true,true,true); |
|
| 109 |
GLES31.glDepthMask(false); |
|
| 110 |
GLES31.glDisable(GLES31.GL_STENCIL_TEST); |
|
| 111 |
GLES31.glDisable(GLES31.GL_DEPTH_TEST); |
|
| 112 |
GLES31.glDisable(GLES31.GL_BLEND); |
|
| 113 |
|
|
| 114 |
DistortedEffects.blitPriv(this); |
|
| 115 |
|
|
| 116 |
if( mShowFPS && fpsTexture.setAsInput()) |
|
| 117 |
{
|
|
| 118 |
fpsEffects.drawPriv(fpsW / 2.0f, fpsH / 2.0f, fpsMesh, this, time, 0); |
|
| 119 |
} |
|
| 120 |
|
|
| 121 |
return numrender+1; |
|
| 122 |
} |
|
| 123 |
|
|
| 124 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 125 |
/** |
|
| 126 |
* Make the library show Frames Per Second in the upper-left corner. |
|
| 127 |
* <p> |
|
| 128 |
*/ |
|
| 129 |
public void showFPS() |
|
| 66 | 130 |
{
|
| 131 |
mShowFPS = true; |
|
| 132 |
|
|
| 67 | 133 |
fpsW = 120; |
| 68 | 134 |
fpsH = 70; |
| 69 | 135 |
|
| 136 |
fpsString = ""; |
|
| 70 | 137 |
fpsBitmap = Bitmap.createBitmap(fpsW,fpsH, Bitmap.Config.ARGB_8888); |
| 71 | 138 |
fpsMesh = new MeshFlat(1,1); |
| 72 | 139 |
fpsTexture = new DistortedTexture(fpsW,fpsH); |
| ... | ... | |
| 85 | 152 |
|
| 86 | 153 |
for(int i=0; i<NUM_FRAMES+1; i++) durations[i]=16; // Assume FPS will be |
| 87 | 154 |
durations[NUM_FRAMES] = NUM_FRAMES*16; // close to 1000/16 ~ 60 |
| 88 |
mInitialized=true; |
|
| 89 |
} |
|
| 90 |
|
|
| 91 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 92 |
|
|
| 93 |
void prepareDebug(long time) |
|
| 94 |
{
|
|
| 95 |
if( !mInitialized ) initialize(); |
|
| 96 |
|
|
| 97 |
if( lastTime==0 ) lastTime = time; |
|
| 98 |
|
|
| 99 |
currDuration++; |
|
| 100 |
if (currDuration >= NUM_FRAMES) currDuration = 0; |
|
| 101 |
durations[NUM_FRAMES] += ((time - lastTime) - durations[currDuration]); |
|
| 102 |
durations[currDuration] = time - lastTime; |
|
| 103 |
|
|
| 104 |
fpsString = "" + ((int)(10000.0f*NUM_FRAMES/durations[NUM_FRAMES]))/10.0f; |
|
| 105 |
|
|
| 106 |
mPaint.setColor(0xffffffff); |
|
| 107 |
fpsCanvas.drawRect(0, 0, fpsW, fpsH, mPaint); |
|
| 108 |
mPaint.setColor(0xff000000); |
|
| 109 |
fpsCanvas.drawText(fpsString, fpsW/2, 0.75f*fpsH, mPaint); |
|
| 110 |
fpsTexture.setTexture(fpsBitmap); |
|
| 111 |
|
|
| 112 |
lastTime = time; |
|
| 113 |
} |
|
| 114 |
|
|
| 115 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 116 |
|
|
| 117 |
void renderDebug(long time) |
|
| 118 |
{
|
|
| 119 |
if (fpsTexture.setAsInput()) |
|
| 120 |
{
|
|
| 121 |
setAsOutput(time); |
|
| 122 |
GLES31.glColorMask(true,true,true,true); |
|
| 123 |
GLES31.glDepthMask(false); |
|
| 124 |
GLES31.glDisable(GLES31.GL_STENCIL_TEST); |
|
| 125 |
GLES31.glDisable(GLES31.GL_DEPTH_TEST); |
|
| 126 |
fpsEffects.drawPriv(fpsW/2.0f, fpsH/2.0f, fpsMesh, this, time, 0); |
|
| 127 |
} |
|
| 128 |
} |
|
| 129 |
|
|
| 130 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 131 |
// PUBLIC API |
|
| 132 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 133 |
/** |
|
| 134 |
* Create a new Screen. |
|
| 135 |
* <p> |
|
| 136 |
* Has to be followed by a 'resize()' to set the size. |
|
| 137 |
*/ |
|
| 138 |
public DistortedScreen() |
|
| 139 |
{
|
|
| 140 |
// Screen also has to be created (3rd arg 'NOT_CREATED_YET') because of the SSBO inside OutputSurface. |
|
| 141 |
super(0,0,NOT_CREATED_YET,1,DEPTH_NO_STENCIL,0,TYPE_USER); |
|
| 142 |
|
|
| 143 |
mInitialized = false; |
|
| 144 | 155 |
} |
| 145 |
} |
|
| 156 |
} |
|
| src/main/java/org/distorted/library/main/EffectQueuePostprocess.java | ||
|---|---|---|
| 32 | 32 |
private static final int NUM_UNIFORMS = PostprocessEffect.NUM_UNIFORMS; |
| 33 | 33 |
private static final int INDEX = EffectType.POSTPROCESS.ordinal(); |
| 34 | 34 |
|
| 35 |
|
|
| 36 | 35 |
private int mHalo; |
| 37 | 36 |
|
| 38 | 37 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/java/org/distorted/library/program/DistortedProgram.java | ||
|---|---|---|
| 443 | 443 |
* Create a new Shader Program from two source strings. |
| 444 | 444 |
* <p> |
| 445 | 445 |
* Needs to be called from a thread holding the OpenGL context. |
| 446 |
* Assumed to hold GLSL 'version 300 es' source. |
|
| 447 | 446 |
* |
| 448 | 447 |
* @param vertex Vertex shader code. |
| 449 | 448 |
* @param fragment Fragment shader code. |
| src/main/res/raw/blit_depth_fragment_shader.glsl | ||
|---|---|---|
| 17 | 17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
| 18 | 18 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 19 | 19 |
|
| 20 |
precision lowp float;
|
|
| 20 |
precision highp float;
|
|
| 21 | 21 |
|
| 22 |
#if __VERSION__ != 100 |
|
| 23 | 22 |
out vec4 fragColor; // The output color |
| 24 | 23 |
in vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment. |
| 25 |
#define TEXTURE texture |
|
| 26 |
#define FRAG_COLOR fragColor |
|
| 27 |
#else |
|
| 28 |
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment. |
|
| 29 |
#define TEXTURE texture2D |
|
| 30 |
#define FRAG_COLOR gl_FragColor |
|
| 31 |
#endif |
|
| 32 | 24 |
|
| 33 | 25 |
uniform sampler2D u_Texture; |
| 34 | 26 |
uniform sampler2D u_DepthTexture; |
| ... | ... | |
| 37 | 29 |
|
| 38 | 30 |
void main() |
| 39 | 31 |
{
|
| 40 |
gl_FragDepth = TEXTURE(u_DepthTexture,v_TexCoordinate).r;
|
|
| 41 |
FRAG_COLOR = TEXTURE(u_Texture ,v_TexCoordinate);
|
|
| 32 |
gl_FragDepth = texture(u_DepthTexture,v_TexCoordinate).r;
|
|
| 33 |
fragColor = texture(u_Texture ,v_TexCoordinate);
|
|
| 42 | 34 |
} |
| src/main/res/raw/blit_depth_vertex_shader.glsl | ||
|---|---|---|
| 17 | 17 |
// along with Distorted. If not, see <http://www.gnu.org/licenses/>. // |
| 18 | 18 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 19 | 19 |
|
| 20 |
precision lowp float;
|
|
| 20 |
precision highp float;
|
|
| 21 | 21 |
|
| 22 |
#if __VERSION__ != 100 |
|
| 23 | 22 |
in vec2 a_Position; // Per-vertex position. |
| 24 | 23 |
out vec2 v_TexCoordinate; // |
| 25 |
#else |
|
| 26 |
attribute vec2 a_Position; // Per-vertex position. |
|
| 27 |
varying vec2 v_TexCoordinate; // |
|
| 28 |
#endif |
|
| 29 | 24 |
|
| 30 | 25 |
uniform float u_Depth; // distance from the near plane to render plane, in clip coords |
| 31 | 26 |
uniform vec2 u_TexCorr; // when we blit from postprocessing buffers, the buffers can be |
| src/main/res/raw/blit_fragment_shader.glsl | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
precision lowp float; |
| 21 | 21 |
|
| 22 |
#if __VERSION__ != 100 |
|
| 23 | 22 |
out vec4 fragColor; // The output color |
| 24 | 23 |
in vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment. |
| 25 |
#define TEXTURE texture |
|
| 26 |
#define FRAG_COLOR fragColor |
|
| 27 |
#else |
|
| 28 |
varying vec2 v_TexCoordinate; // Interpolated texture coordinate per fragment. |
|
| 29 |
#define TEXTURE texture2D |
|
| 30 |
#define FRAG_COLOR gl_FragColor |
|
| 31 |
#endif |
|
| 32 |
|
|
| 33 | 24 |
uniform sampler2D u_Texture; // The input texture. |
| 34 | 25 |
|
| 35 | 26 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 36 | 27 |
|
| 37 | 28 |
void main() |
| 38 | 29 |
{
|
| 39 |
FRAG_COLOR = TEXTURE(u_Texture,v_TexCoordinate);
|
|
| 30 |
fragColor = texture(u_Texture,v_TexCoordinate);
|
|
| 40 | 31 |
} |
| src/main/res/raw/blit_vertex_shader.glsl | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
precision lowp float; |
| 21 | 21 |
|
| 22 |
#if __VERSION__ != 100 |
|
| 23 | 22 |
in vec2 a_Position; // Per-vertex position. |
| 24 | 23 |
out vec2 v_TexCoordinate; // |
| 25 |
#else |
|
| 26 |
attribute vec2 a_Position; // Per-vertex position. |
|
| 27 |
varying vec2 v_TexCoordinate; // |
|
| 28 |
#endif |
|
| 29 |
|
|
| 30 | 24 |
uniform float u_Depth; // distance from the near plane to render plane, in clip coords |
| 31 | 25 |
|
| 32 | 26 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| src/main/res/raw/normal_fragment_shader.glsl | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
precision lowp float; |
| 21 | 21 |
|
| 22 |
#if __VERSION__ != 100 |
|
| 23 | 22 |
out vec4 fragColor; |
| 24 |
#define FRAG_COLOR fragColor |
|
| 25 |
#else |
|
| 26 |
#define FRAG_COLOR gl_FragColor |
|
| 27 |
#endif |
|
| 28 | 23 |
|
| 29 | 24 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 30 | 25 |
|
| 31 | 26 |
void main() |
| 32 | 27 |
{
|
| 33 |
FRAG_COLOR = vec4(1.0,0.0,0.0,1.0);
|
|
| 28 |
fragColor = vec4(1.0,0.0,0.0,1.0);
|
|
| 34 | 29 |
} |
| src/main/res/raw/normal_vertex_shader.glsl | ||
|---|---|---|
| 19 | 19 |
|
| 20 | 20 |
precision lowp float; |
| 21 | 21 |
|
| 22 |
#if __VERSION__ != 100 |
|
| 23 | 22 |
in vec3 a_Position; |
| 24 |
#else |
|
| 25 |
attribute vec3 a_Position; |
|
| 26 |
#endif |
|
| 27 |
|
|
| 28 | 23 |
uniform mat4 u_MVPMatrix; |
| 29 | 24 |
|
| 30 | 25 |
////////////////////////////////////////////////////////////////////////////////////////////// |
| 31 | 26 |
|
| 32 | 27 |
void main() |
| 33 | 28 |
{
|
| 34 |
gl_Position = u_MVPMatrix*vec4( a_Position, 1.0);
|
|
| 29 |
gl_Position = u_MVPMatrix * vec4(a_Position, 1.0);
|
|
| 35 | 30 |
} |
Also available in: Unified diff
Port all the 'non-controversial' changes from order-independent-transparency branch.