Revision 86eb00a9
Added by Leszek Koltunski almost 9 years ago
| src/main/java/org/distorted/library/Distorted.java | ||
|---|---|---|
| 90 | 90 |
|
| 91 | 91 |
} |
| 92 | 92 |
|
| 93 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 94 |
|
|
| 95 |
static DistortedFramebuffer getFBO(int w, int h) |
|
| 96 |
{
|
|
| 97 |
// TODO: a static factory of Framebuffers. |
|
| 98 |
|
|
| 99 |
return null; |
|
| 100 |
} |
|
| 101 |
|
|
| 102 | 93 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 103 | 94 |
|
| 104 | 95 |
static boolean isInitialized() |
| ... | ... | |
| 106 | 97 |
return (mMainProgramAttributes!=null); |
| 107 | 98 |
} |
| 108 | 99 |
|
| 109 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 110 |
/** |
|
| 111 |
* Release all internal memory caches (in particular the FBOs used as buffers for postprocessing) |
|
| 112 |
*/ |
|
| 113 |
public static void clean() |
|
| 114 |
{
|
|
| 115 |
// TODO |
|
| 116 |
} |
|
| 117 |
|
|
| 118 | 100 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 119 | 101 |
/** |
| 120 | 102 |
* When OpenGL context gets created, you need to call this method so that the library can initialise its internal data structures. |
| ... | ... | |
| 209 | 191 |
EffectMessageSender.stopSending(); |
| 210 | 192 |
|
| 211 | 193 |
mMainProgramAttributes = null; |
| 194 |
mPostProgramAttributes = null; |
|
| 212 | 195 |
} |
| 213 | 196 |
} |
| src/main/java/org/distorted/library/DistortedEffects.java | ||
|---|---|---|
| 49 | 49 |
private static long mNextID =0; |
| 50 | 50 |
private long mID; |
| 51 | 51 |
|
| 52 |
private static DistortedFramebuffer mBufferFBO; |
|
| 53 |
|
|
| 52 | 54 |
private EffectQueueMatrix mM; |
| 53 | 55 |
private EffectQueueFragment mF; |
| 54 | 56 |
private EffectQueueVertex mV; |
| ... | ... | |
| 67 | 69 |
mQuadPositions.put(positionData).position(0); |
| 68 | 70 |
mQuadTexture = ByteBuffer.allocateDirect(TEX_DATA_SIZE *dataLength*BYTES_PER_FLOAT).order(ByteOrder.nativeOrder()).asFloatBuffer(); |
| 69 | 71 |
mQuadTexture.put(textureData).position(0); |
| 72 |
|
|
| 73 |
mBufferFBO = new DistortedFramebuffer(1,1); |
|
| 70 | 74 |
} |
| 71 | 75 |
|
| 72 | 76 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 130 | 134 |
float halfZ = halfInputW*mesh.zFactor; |
| 131 | 135 |
|
| 132 | 136 |
GLES20.glUseProgram(Distorted.mainProgramH); |
| 137 |
GLES20.glViewport(0, 0, df.mWidth, df.mHeight); |
|
| 133 | 138 |
|
| 134 | 139 |
if( mP.mNumEffects==0 ) |
| 135 | 140 |
{
|
| 136 |
GLES20.glViewport(0, 0, df.mWidth, df.mHeight); |
|
| 137 |
|
|
| 138 | 141 |
mM.send(df,halfInputW,halfInputH,halfZ); |
| 139 | 142 |
mV.send(halfInputW,halfInputH,halfZ); |
| 140 | 143 |
mF.send(halfInputW,halfInputH); |
| ... | ... | |
| 143 | 146 |
} |
| 144 | 147 |
else |
| 145 | 148 |
{
|
| 146 |
DistortedFramebuffer buffer = Distorted.getFBO(df.mWidth,df.mHeight); |
|
| 147 |
|
|
| 148 |
GLES20.glViewport(0, 0, buffer.mWidth, buffer.mHeight); |
|
| 149 |
buffer.setAsOutput(); |
|
| 149 |
mBufferFBO.resizeFast(df.mWidth, df.mHeight); |
|
| 150 |
mBufferFBO.setAsOutput(); |
|
| 150 | 151 |
|
| 151 |
mM.send(buffer,halfInputW,halfInputH,halfZ);
|
|
| 152 |
mM.send(mBufferFBO,halfInputW,halfInputH,halfZ);
|
|
| 152 | 153 |
mV.send(halfInputW,halfInputH,halfZ); |
| 153 | 154 |
mF.send(halfInputW,halfInputH); |
| 154 | 155 |
|
| ... | ... | |
| 156 | 157 |
|
| 157 | 158 |
GLES20.glUseProgram(Distorted.postProgramH); |
| 158 | 159 |
GLES20.glViewport(0, 0, df.mWidth, df.mHeight); |
| 159 |
buffer.setAsInput();
|
|
| 160 |
mBufferFBO.setAsInput();
|
|
| 160 | 161 |
df.setAsOutput(); |
| 161 | 162 |
mP.send(halfInputW,halfInputH); |
| 162 | 163 |
|
| src/main/java/org/distorted/library/DistortedFramebuffer.java | ||
|---|---|---|
| 55 | 55 |
private boolean mMarked; |
| 56 | 56 |
private boolean mDepthWanted; |
| 57 | 57 |
|
| 58 |
private int mTexWidth, mTexHeight; |
|
| 59 |
|
|
| 58 | 60 |
// Projection stuff |
| 59 | 61 |
private float mX, mY, mFOV; |
| 60 | 62 |
int mWidth,mHeight,mDepth; |
| ... | ... | |
| 74 | 76 |
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); |
| 75 | 77 |
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); |
| 76 | 78 |
GLES20.glTexParameterf(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); |
| 77 |
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, mWidth, mHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
|
|
| 79 |
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, mTexWidth, mTexHeight, 0, GLES20.GL_RGBA, GLES20.GL_UNSIGNED_BYTE, null);
|
|
| 78 | 80 |
|
| 79 | 81 |
GLES20.glGenFramebuffers(1, fboIds, 0); |
| 80 | 82 |
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]); |
| 81 | 83 |
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_COLOR_ATTACHMENT0, GLES20.GL_TEXTURE_2D, colorIds[0], 0); |
| 82 | 84 |
|
| 83 | 85 |
checkStatus("color");
|
| 84 |
|
|
| 85 |
mList.add(this); |
|
| 86 | 86 |
} |
| 87 |
|
|
| 88 |
if( mDepthWanted && depthIds[0]==NOT_CREATED_YET ) // we need to create a new DEPTH attachment |
|
| 87 |
if( mDepthWanted && depthIds[0]==NOT_CREATED_YET ) // we need to create a new DEPTH attachment |
|
| 89 | 88 |
{
|
| 90 | 89 |
GLES20.glGenTextures(1, depthIds, 0); |
| 91 | 90 |
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, depthIds[0]); |
| ... | ... | |
| 93 | 92 |
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_REPEAT); |
| 94 | 93 |
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); |
| 95 | 94 |
GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_NEAREST); |
| 96 |
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_DEPTH_COMPONENT, mWidth, mHeight, 0, GLES20.GL_DEPTH_COMPONENT, GLES20.GL_UNSIGNED_SHORT, null);
|
|
| 95 |
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_DEPTH_COMPONENT, mTexWidth, mTexHeight, 0, GLES20.GL_DEPTH_COMPONENT, GLES20.GL_UNSIGNED_SHORT, null);
|
|
| 97 | 96 |
|
| 98 | 97 |
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]); |
| 99 | 98 |
GLES20.glFramebufferTexture2D(GLES20.GL_FRAMEBUFFER, GLES20.GL_DEPTH_ATTACHMENT, GLES20.GL_TEXTURE_2D, depthIds[0], 0); |
| ... | ... | |
| 265 | 264 |
} |
| 266 | 265 |
} |
| 267 | 266 |
|
| 267 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 268 |
// if new size fits into the size of the underlying Texture, just change the projection without |
|
| 269 |
// reallocating the Texture. Otherwise, we need to reallocate. |
|
| 270 |
// |
|
| 271 |
// Must be called form a thread holding the OpenGL context. |
|
| 272 |
|
|
| 273 |
void resizeFast(int width, int height) |
|
| 274 |
{
|
|
| 275 |
if( mWidth!=width || mHeight!=height ) |
|
| 276 |
{
|
|
| 277 |
mWidth = width; |
|
| 278 |
mHeight= height; |
|
| 279 |
|
|
| 280 |
createProjection(); |
|
| 281 |
|
|
| 282 |
if( mWidth>mTexWidth || mHeight>mTexHeight ) |
|
| 283 |
{
|
|
| 284 |
mTexWidth = mWidth; |
|
| 285 |
mTexHeight= mHeight; |
|
| 286 |
deleteFBO(); |
|
| 287 |
createFBO(); |
|
| 288 |
} |
|
| 289 |
} |
|
| 290 |
} |
|
| 291 |
|
|
| 268 | 292 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 269 | 293 |
// PUBLIC API |
| 270 | 294 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 281 | 305 |
|
| 282 | 306 |
mHeight = height; |
| 283 | 307 |
mWidth = width; |
| 308 |
mTexHeight = height; |
|
| 309 |
mTexWidth = width; |
|
| 284 | 310 |
mFOV = 60.0f; |
| 285 | 311 |
mX = 0.0f; |
| 286 | 312 |
mY = 0.0f; |
| ... | ... | |
| 292 | 318 |
depthIds[0]= NOT_CREATED_YET; |
| 293 | 319 |
|
| 294 | 320 |
createProjection(); |
| 321 |
|
|
| 322 |
mList.add(this); |
|
| 295 | 323 |
} |
| 296 | 324 |
|
| 297 | 325 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 345 | 373 |
{
|
| 346 | 374 |
tex.createTexture(); |
| 347 | 375 |
tex.setAsInput(); |
| 376 |
DistortedFramebuffer.deleteAllMarked(); |
|
| 377 |
DistortedTexture.deleteAllMarked(); |
|
| 348 | 378 |
createFBO(); |
| 349 | 379 |
setAsOutput(); |
| 350 | 380 |
effects.drawPriv(tex.mHalfX, tex.mHalfY, mesh, this, time); |
| 351 |
DistortedFramebuffer.deleteAllMarked(); |
|
| 352 |
DistortedTexture.deleteAllMarked(); |
|
| 353 | 381 |
} |
| 354 | 382 |
|
| 355 | 383 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 371 | 399 |
|
| 372 | 400 |
if( fbo.colorIds[0]>0 ) // fbo created with the first constructor |
| 373 | 401 |
{
|
| 402 |
DistortedFramebuffer.deleteAllMarked(); |
|
| 403 |
DistortedTexture.deleteAllMarked(); |
|
| 374 | 404 |
createFBO(); |
| 375 | 405 |
setAsOutput(); |
| 376 | 406 |
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, fbo.colorIds[0]); |
| 377 | 407 |
effects.drawPriv(fbo.mWidth/2, fbo.mHeight/2, mesh, this, time); |
| 378 |
DistortedFramebuffer.deleteAllMarked(); |
|
| 379 |
DistortedTexture.deleteAllMarked(); |
|
| 380 | 408 |
} |
| 381 | 409 |
} |
| 382 | 410 |
|
| ... | ... | |
| 391 | 419 |
*/ |
| 392 | 420 |
public void renderTo(DistortedTree dt, long time) |
| 393 | 421 |
{
|
| 422 |
DistortedFramebuffer.deleteAllMarked(); |
|
| 423 |
DistortedTexture.deleteAllMarked(); |
|
| 394 | 424 |
createFBO(); |
| 395 | 425 |
setAsOutput(); |
| 396 | 426 |
dt.drawRecursive(time,this); |
| 397 |
DistortedFramebuffer.deleteAllMarked(); |
|
| 398 |
DistortedTexture.deleteAllMarked(); |
|
| 399 | 427 |
} |
| 400 | 428 |
|
| 401 | 429 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| ... | ... | |
| 445 | 473 |
{
|
| 446 | 474 |
if( mWidth!=width || mHeight!=height ) |
| 447 | 475 |
{
|
| 448 |
mWidth = width; |
|
| 449 |
mHeight= height; |
|
| 476 |
mWidth = width; |
|
| 477 |
mHeight = height; |
|
| 478 |
mTexWidth = width; |
|
| 479 |
mTexHeight= height; |
|
| 450 | 480 |
|
| 451 | 481 |
createProjection(); |
| 452 | 482 |
|
Also available in: Unified diff
Initial version of the first post-processing effect - BLUR - ready for the first app!