Revision 09d4f4b1
Added by Leszek Koltunski almost 9 years ago
| src/main/java/org/distorted/library/DistortedFramebuffer.java | ||
|---|---|---|
| 59 | 59 |
float mDistance; |
| 60 | 60 |
float[] mProjectionMatrix; |
| 61 | 61 |
|
| 62 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 63 |
|
|
| 64 |
private void createProjection() |
|
| 65 |
{
|
|
| 66 |
if( mWidth>0 && mHeight>1 ) |
|
| 67 |
{
|
|
| 68 |
if( mFOV>0.0f ) // perspective projection |
|
| 69 |
{
|
|
| 70 |
float left = (-mX-mWidth /2.0f)/mHeight; |
|
| 71 |
float right = (-mX+mWidth /2.0f)/mHeight; |
|
| 72 |
float bottom = (-mY-mHeight/2.0f)/mHeight; |
|
| 73 |
float top = (-mY+mHeight/2.0f)/mHeight; |
|
| 74 |
float near = (top-bottom) / (2.0f*(float)Math.tan(mFOV*Math.PI/360)); |
|
| 75 |
mDistance = mHeight*near/(top-bottom); |
|
| 76 |
float far = 2*mDistance-near; |
|
| 77 |
mDepth = (int)((far-near)/2); |
|
| 78 |
|
|
| 79 |
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far); |
|
| 80 |
} |
|
| 81 |
else // parallel projection |
|
| 82 |
{
|
|
| 83 |
float left = -mX-mWidth /2.0f; |
|
| 84 |
float right = -mX+mWidth /2.0f; |
|
| 85 |
float bottom = -mY-mHeight/2.0f; |
|
| 86 |
float top = -mY+mHeight/2.0f; |
|
| 87 |
float near = (mWidth+mHeight)/2; |
|
| 88 |
mDistance = 2*near; |
|
| 89 |
float far = 3*near; |
|
| 90 |
mDepth = (int)near; |
|
| 91 |
|
|
| 92 |
Matrix.orthoM(mProjectionMatrix, 0, left, right, bottom, top, near, far); |
|
| 93 |
} |
|
| 94 |
} |
|
| 95 |
} |
|
| 96 |
|
|
| 97 | 62 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 98 | 63 |
// Must be called from a thread holding OpenGL Context |
| 99 | 64 |
|
| ... | ... | |
| 148 | 113 |
mMarked = false; |
| 149 | 114 |
} |
| 150 | 115 |
|
| 116 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 117 |
// Must be called from a thread holding OpenGL Context |
|
| 118 |
|
|
| 119 |
void setAsOutput() |
|
| 120 |
{
|
|
| 121 |
if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO(); |
|
| 122 |
|
|
| 123 |
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]); |
|
| 124 |
} |
|
| 125 |
|
|
| 126 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 127 |
// Must be called from a thread holding OpenGL Context |
|
| 128 |
|
|
| 129 |
void setAsInput() |
|
| 130 |
{
|
|
| 131 |
if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO(); |
|
| 132 |
|
|
| 133 |
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texIds[0]); |
|
| 134 |
} |
|
| 135 |
|
|
| 151 | 136 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 152 | 137 |
|
| 153 | 138 |
void reset() |
| ... | ... | |
| 156 | 141 |
texIds[0] = TEXTURE_NOT_CREATED_YET; |
| 157 | 142 |
} |
| 158 | 143 |
|
| 144 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 145 |
|
|
| 146 |
private void createProjection() |
|
| 147 |
{
|
|
| 148 |
if( mWidth>0 && mHeight>1 ) |
|
| 149 |
{
|
|
| 150 |
if( mFOV>0.0f ) // perspective projection |
|
| 151 |
{
|
|
| 152 |
float left = (-mX-mWidth /2.0f)/mHeight; |
|
| 153 |
float right = (-mX+mWidth /2.0f)/mHeight; |
|
| 154 |
float bottom = (-mY-mHeight/2.0f)/mHeight; |
|
| 155 |
float top = (-mY+mHeight/2.0f)/mHeight; |
|
| 156 |
float near = (top-bottom) / (2.0f*(float)Math.tan(mFOV*Math.PI/360)); |
|
| 157 |
mDistance = mHeight*near/(top-bottom); |
|
| 158 |
float far = 2*mDistance-near; |
|
| 159 |
mDepth = (int)((far-near)/2); |
|
| 160 |
|
|
| 161 |
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far); |
|
| 162 |
} |
|
| 163 |
else // parallel projection |
|
| 164 |
{
|
|
| 165 |
float left = -mX-mWidth /2.0f; |
|
| 166 |
float right = -mX+mWidth /2.0f; |
|
| 167 |
float bottom = -mY-mHeight/2.0f; |
|
| 168 |
float top = -mY+mHeight/2.0f; |
|
| 169 |
float near = (mWidth+mHeight)/2; |
|
| 170 |
mDistance = 2*near; |
|
| 171 |
float far = 3*near; |
|
| 172 |
mDepth = (int)near; |
|
| 173 |
|
|
| 174 |
Matrix.orthoM(mProjectionMatrix, 0, left, right, bottom, top, near, far); |
|
| 175 |
} |
|
| 176 |
} |
|
| 177 |
} |
|
| 178 |
|
|
| 159 | 179 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 160 | 180 |
|
| 161 | 181 |
static synchronized void release() |
| ... | ... | |
| 293 | 313 |
|
| 294 | 314 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
| 295 | 315 |
/** |
| 296 |
* Set this as the Framebuffer to write to. |
|
| 297 |
* <p> |
|
| 298 |
* Must be called from a thread holding OpenGL Context |
|
| 299 |
*/ |
|
| 300 |
public void setAsOutput() |
|
| 301 |
{
|
|
| 302 |
if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO(); |
|
| 303 |
|
|
| 304 |
GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, fboIds[0]); |
|
| 305 |
} |
|
| 306 |
|
|
| 307 |
/////////////////////////////////////////////////////////////////////////////////////////////////// |
|
| 308 |
/** |
|
| 309 |
* Set this as the Framebuffer to read from. |
|
| 310 |
* <p> |
|
| 311 |
* Must be called from a thread holding OpenGL Context |
|
| 316 |
* Return the ID of the Texture (COLOR attachment 0) that's backing this FBO. |
|
| 317 |
* <p> |
|
| 318 |
* Catch: this will only work if the library has had time to actually create the texture. Remember |
|
| 319 |
* that the texture gets created only on first render, thus creating a Texture object and immediately |
|
| 320 |
* calling this method will return an invalid (negative) result. |
|
| 321 |
* |
|
| 322 |
* @returns If there was not a single render between creation of the Object and calling this method on |
|
| 323 |
* it, return a negative value. Otherwise, return ID of COLOR attachment 0. |
|
| 312 | 324 |
*/ |
| 313 |
public void setAsInput()
|
|
| 325 |
public int getTextureID()
|
|
| 314 | 326 |
{
|
| 315 |
if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO(); |
|
| 316 |
|
|
| 317 |
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, texIds[0]); |
|
| 327 |
return texIds[0]; |
|
| 318 | 328 |
} |
| 319 |
|
|
| 320 | 329 |
} |
Also available in: Unified diff
Change of API in DistortedFramebuffer.