Project

General

Profile

« Previous | Next » 

Revision 54fe333a

Added by Leszek Koltunski about 7 years ago

Fixes for z-fighting.

View differences:

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