Revision 54fe333a
Added by Leszek Koltunski over 7 years ago
src/main/java/org/distorted/library/DistortedOutputSurface.java | ||
---|---|---|
32 | 32 |
private ArrayList<DistortedNode> mChildren; |
33 | 33 |
private int mNumChildren; // ==mChildren.length(), but we only create mChildren if the first one gets added |
34 | 34 |
|
35 |
private float mX, mY, mFOV;
|
|
35 |
private float mNear, mFOV;
|
|
36 | 36 |
int mWidth,mHeight,mDepth; |
37 | 37 |
float mDistance; |
38 | 38 |
float[] mProjectionMatrix; |
... | ... | |
53 | 53 |
mHeight= height; |
54 | 54 |
|
55 | 55 |
mFOV = 60.0f; |
56 |
mX = 0.0f; |
|
57 |
mY = 0.0f; |
|
56 |
mNear= 0.5f; |
|
58 | 57 |
|
59 | 58 |
mDepthCreated= createDepth; |
60 | 59 |
mFBOH[0] = fbo; |
... | ... | |
71 | 70 |
{ |
72 | 71 |
if( mFOV>0.0f ) // perspective projection |
73 | 72 |
{ |
74 |
float left = (-mX-mWidth /2.0f)/mHeight; |
|
75 |
float right = (-mX+mWidth /2.0f)/mHeight; |
|
76 |
float bottom = (-mY-mHeight/2.0f)/mHeight; |
|
77 |
float top = (-mY+mHeight/2.0f)/mHeight; |
|
78 |
float near = (top-bottom) / (2.0f*(float)Math.tan(mFOV*Math.PI/360)); |
|
79 |
mDistance = mHeight*near/(top-bottom); |
|
73 |
float a = 2.0f*(float)Math.tan(mFOV*Math.PI/360); |
|
74 |
float q = (float)mWidth/mHeight; |
|
75 |
float c = mHeight*mNear; |
|
76 |
|
|
77 |
float left = -q*c/2; |
|
78 |
float right = +q*c/2; |
|
79 |
float bottom = -c/2; |
|
80 |
float top = +c/2; |
|
81 |
float near = c/a; |
|
82 |
|
|
83 |
mDistance = mHeight/a; |
|
80 | 84 |
float far = 2*mDistance-near; |
81 | 85 |
mDepth = (int)((far-near)/2); |
82 | 86 |
|
... | ... | |
84 | 88 |
} |
85 | 89 |
else // parallel projection |
86 | 90 |
{ |
87 |
float left = -mX-mWidth /2.0f;
|
|
88 |
float right = -mX+mWidth /2.0f;
|
|
89 |
float bottom = -mY-mHeight/2.0f;
|
|
90 |
float top = -mY+mHeight/2.0f;
|
|
91 |
float near = (mWidth+mHeight)/2;
|
|
92 |
mDistance = 2*near;
|
|
93 |
float far = 3*near;
|
|
94 |
mDepth = (int)near;
|
|
91 |
float left = -mWidth /2.0f; |
|
92 |
float right = +mWidth /2.0f; |
|
93 |
float bottom = -mHeight/2.0f; |
|
94 |
float top = +mHeight/2.0f; |
|
95 |
float near = mWidth+mHeight-mHeight*(1.0f-mNear);
|
|
96 |
mDistance = mWidth+mHeight;
|
|
97 |
float far = mWidth+mHeight+mHeight*(1.0f-mNear);
|
|
98 |
mDepth = (int)((far-near)/2);
|
|
95 | 99 |
|
96 | 100 |
Matrix.orthoM(mProjectionMatrix, 0, left, right, bottom, top, near, far); |
97 | 101 |
} |
... | ... | |
170 | 174 |
* Create new Projection matrix. |
171 | 175 |
* |
172 | 176 |
* @param fov Vertical 'field of view' of the Projection frustrum (in degrees). |
173 |
* @param x X-coordinate of the point at which our camera looks at. 0 is the center. |
|
174 |
* @param y Y-coordinate of the point at which our camera looks at. 0 is the center. |
|
177 |
* Valid values: 0<=fov<180. FOV==0 means 'parallel projection'. |
|
178 |
* @param near Distance between the screen plane and the near plane. |
|
179 |
* Valid vaules: 0<near<1. When near==0, the Near Plane is exactly at the tip of the |
|
180 |
* pyramid. When near==1 (illegal!) the near plane is equivalent to the screen plane. |
|
175 | 181 |
*/ |
176 |
public void setProjection(float fov, float x, float y)
|
|
182 |
public void setProjection(float fov, float near)
|
|
177 | 183 |
{ |
178 |
mFOV = fov; |
|
179 |
mX = x; |
|
180 |
mY = y; |
|
184 |
if( fov < 180.0f && fov >=0.0f ) mFOV = fov; |
|
185 |
if( near< 1.0f && near> 0.0f ) mNear= near; |
|
181 | 186 |
|
182 | 187 |
createProjection(); |
183 | 188 |
} |
Also available in: Unified diff
Fixes for z-fighting.