28 |
28 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
29 |
29 |
/**
|
30 |
30 |
* Class which represents a OpenGL Framebuffer object.
|
31 |
|
*
|
|
31 |
* <p>
|
32 |
32 |
* User is able to create either WRITE-only Framebuffers from objects already constructed outside
|
33 |
33 |
* of the library (the first constructor; primary use case: the screen) or an offscreen READ-WRITE
|
34 |
34 |
* FBOs (used by the DistortedNode, but also can be used by external users of the library)
|
35 |
|
*
|
|
35 |
* <p>
|
36 |
36 |
* Also, keep all objects created in a static LinkedList. The point: we need to be able to mark
|
37 |
37 |
* Framebuffers for deletion, and delete all marked objects later at a convenient time (that's
|
38 |
38 |
* because we can only delete from a thread that holds the OpenGL context so here we provide a
|
... | ... | |
63 |
63 |
|
64 |
64 |
private void createProjection()
|
65 |
65 |
{
|
66 |
|
float ratio = (float) mWidth / mHeight;
|
67 |
|
float left =-ratio; //
|
68 |
|
float right = ratio; // Create a new perspective projection matrix.
|
69 |
|
float bottom = -1.0f; //
|
70 |
|
float top = 1.0f; // any change to those values will have serious consequences!
|
71 |
|
float near, far;
|
72 |
|
|
73 |
66 |
if( mFOV>0.0f ) // perspective projection
|
74 |
67 |
{
|
75 |
|
near= (float)(top / Math.tan(mFOV*Math.PI/360));
|
|
68 |
float ratio = (float) mWidth / mHeight;
|
|
69 |
float left =-ratio;
|
|
70 |
float right = ratio;
|
|
71 |
float bottom = -1.0f;
|
|
72 |
float top = 1.0f;
|
|
73 |
float near= (float)(top / Math.tan(mFOV*Math.PI/360));
|
76 |
74 |
mDistance = (int)(mHeight*near/(top-bottom));
|
77 |
|
far = 2*mDistance-near;
|
|
75 |
float far = 2*mDistance-near;
|
|
76 |
mDepth = (int)((far-near)/2);
|
78 |
77 |
|
79 |
78 |
if( far<=0 )
|
80 |
79 |
{
|
... | ... | |
84 |
83 |
else
|
85 |
84 |
Matrix.frustumM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
|
86 |
85 |
}
|
87 |
|
else // parallel projection
|
|
86 |
else // parallel projection
|
88 |
87 |
{
|
89 |
|
near= (float)(top / Math.tan(Math.PI/360));
|
|
88 |
float left =-mWidth/2;
|
|
89 |
float right = mWidth/2;
|
|
90 |
float bottom =-mHeight/2;
|
|
91 |
float top = mHeight/2;
|
|
92 |
float near= (float)(top / Math.tan(Math.PI/360));
|
90 |
93 |
mDistance = (int)(mHeight*near/(top-bottom));
|
91 |
|
far = 2*mDistance-near;
|
|
94 |
float far = 2*mDistance-near;
|
|
95 |
mDepth = (int)((far-near)/2);
|
92 |
96 |
|
93 |
|
Matrix.orthoM(mProjectionMatrix, 0, -mWidth/2, mWidth/2,-mHeight/2, mHeight/2, near, far);
|
|
97 |
Matrix.orthoM(mProjectionMatrix, 0, left, right, bottom, top, near, far);
|
94 |
98 |
}
|
95 |
|
|
96 |
|
mDepth = (int)((far-near)/2);
|
97 |
99 |
}
|
98 |
100 |
|
99 |
101 |
///////////////////////////////////////////////////////////////////////////////////////////////////
|
... | ... | |
257 |
259 |
* Create new Projection matrix.
|
258 |
260 |
*
|
259 |
261 |
* @param fov Vertical 'field of view' of the Projection frustrum (in degrees).
|
260 |
|
* @param x X-coordinate of the point at which our camera looks at. -1<x<1
|
261 |
|
* @param y Y-coordinate of the point at which our camera looks at. -1<y<1
|
|
262 |
* @param x X-coordinate of the point at which our camera looks at. -mWidth/2 < x < mWidth/2
|
|
263 |
* @param y Y-coordinate of the point at which our camera looks at. -mHeight/2 < y < mHeight/2
|
262 |
264 |
*/
|
263 |
265 |
public void setProjection(float fov, float x, float y)
|
264 |
266 |
{
|
... | ... | |
276 |
278 |
* As the Framebuffer is not created until the first render, typical usage of this API is actually
|
277 |
279 |
* to set the size of an not-yet-created Framebuffer of an object that has been created with the
|
278 |
280 |
* second constructor.
|
279 |
|
*
|
|
281 |
* <p>
|
280 |
282 |
* Fully creating an object, rendering to it, then resizing mid-render is also possible.
|
281 |
283 |
*
|
282 |
284 |
* @param width The new width.
|
... | ... | |
300 |
302 |
* Set this as the Framebuffer to write to.
|
301 |
303 |
*/
|
302 |
304 |
|
303 |
|
public void setOutput()
|
|
305 |
public void setAsOutput()
|
304 |
306 |
{
|
305 |
307 |
if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO();
|
306 |
308 |
|
... | ... | |
312 |
314 |
* Set this as the Framebuffer to read from.
|
313 |
315 |
*/
|
314 |
316 |
|
315 |
|
public void setInput()
|
|
317 |
public void setAsInput()
|
316 |
318 |
{
|
317 |
319 |
if( texIds[0]==TEXTURE_NOT_CREATED_YET ) createFBO();
|
318 |
320 |
|
Javadoc