diff options
Diffstat (limited to 'indra/llmath/llcamera.cpp')
-rw-r--r-- | indra/llmath/llcamera.cpp | 704 |
1 files changed, 352 insertions, 352 deletions
diff --git a/indra/llmath/llcamera.cpp b/indra/llmath/llcamera.cpp index 18d704dd0f..3daed2ac31 100644 --- a/indra/llmath/llcamera.cpp +++ b/indra/llmath/llcamera.cpp @@ -1,25 +1,25 @@ -/** +/** * @file llcamera.cpp * @brief Implementation of the LLCamera class. * * $LicenseInfo:firstyear=2000&license=viewerlgpl$ * Second Life Viewer Source Code * Copyright (C) 2010, Linden Research, Inc. - * + * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; * version 2.1 of the License only. - * + * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * + * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * + * * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA * $/LicenseInfo$ */ @@ -32,43 +32,43 @@ // ---------------- Constructors and destructors ---------------- LLCamera::LLCamera() : - LLCoordFrame(), - mView(DEFAULT_FIELD_OF_VIEW), - mAspect(DEFAULT_ASPECT_RATIO), - mViewHeightInPixels( -1 ), // invalid height - mNearPlane(DEFAULT_NEAR_PLANE), - mFarPlane(DEFAULT_FAR_PLANE), - mFixedDistance(-1.f), - mPlaneCount(6), - mFrustumCornerDist(0.f) -{ - for (U32 i = 0; i < PLANE_MASK_NUM; i++) - { - mPlaneMask[i] = PLANE_MASK_NONE; - } - - calculateFrustumPlanes(); -} + LLCoordFrame(), + mView(DEFAULT_FIELD_OF_VIEW), + mAspect(DEFAULT_ASPECT_RATIO), + mViewHeightInPixels( -1 ), // invalid height + mNearPlane(DEFAULT_NEAR_PLANE), + mFarPlane(DEFAULT_FAR_PLANE), + mFixedDistance(-1.f), + mPlaneCount(6), + mFrustumCornerDist(0.f) +{ + for (U32 i = 0; i < PLANE_MASK_NUM; i++) + { + mPlaneMask[i] = PLANE_MASK_NONE; + } + + calculateFrustumPlanes(); +} LLCamera::LLCamera(F32 vertical_fov_rads, F32 aspect_ratio, S32 view_height_in_pixels, F32 near_plane, F32 far_plane) : - LLCoordFrame(), - mViewHeightInPixels(view_height_in_pixels), - mFixedDistance(-1.f), - mPlaneCount(6), - mFrustumCornerDist(0.f) -{ - for (U32 i = 0; i < PLANE_MASK_NUM; i++) - { - mPlaneMask[i] = PLANE_MASK_NONE; - } - - mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO); - mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE); - if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE; - mFarPlane = llclamp(far_plane, MIN_FAR_PLANE, MAX_FAR_PLANE); - - setView(vertical_fov_rads); -} + LLCoordFrame(), + mViewHeightInPixels(view_height_in_pixels), + mFixedDistance(-1.f), + mPlaneCount(6), + mFrustumCornerDist(0.f) +{ + for (U32 i = 0; i < PLANE_MASK_NUM; i++) + { + mPlaneMask[i] = PLANE_MASK_NONE; + } + + mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO); + mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE); + if(far_plane < 0) far_plane = DEFAULT_FAR_PLANE; + mFarPlane = llclamp(far_plane, MIN_FAR_PLANE, MAX_FAR_PLANE); + + setView(vertical_fov_rads); +} LLCamera::~LLCamera() { @@ -77,20 +77,20 @@ LLCamera::~LLCamera() // ---------------- LLCamera::getFoo() member functions ---------------- -F32 LLCamera::getMinView() const +F32 LLCamera::getMinView() const { - // minimum vertical fov needs to be constrained in narrow windows. - return mAspect > 1 - ? MIN_FIELD_OF_VIEW // wide views - : MIN_FIELD_OF_VIEW * 1/mAspect; // clamps minimum width in narrow views + // minimum vertical fov needs to be constrained in narrow windows. + return mAspect > 1 + ? MIN_FIELD_OF_VIEW // wide views + : MIN_FIELD_OF_VIEW * 1/mAspect; // clamps minimum width in narrow views } -F32 LLCamera::getMaxView() const +F32 LLCamera::getMaxView() const { - // maximum vertical fov needs to be constrained in wide windows. - return mAspect > 1 - ? MAX_FIELD_OF_VIEW / mAspect // clamps maximum width in wide views - : MAX_FIELD_OF_VIEW; // narrow views + // maximum vertical fov needs to be constrained in wide windows. + return mAspect > 1 + ? MAX_FIELD_OF_VIEW / mAspect // clamps maximum width in wide views + : MAX_FIELD_OF_VIEW; // narrow views } LLPlane LLCamera::getUserClipPlane() @@ -102,437 +102,437 @@ LLPlane LLCamera::getUserClipPlane() void LLCamera::setUserClipPlane(LLPlane& plane) { - mPlaneCount = AGENT_PLANE_USER_CLIP_NUM; - mAgentPlanes[AGENT_PLANE_USER_CLIP] = plane; - mPlaneMask[AGENT_PLANE_USER_CLIP] = plane.calcPlaneMask(); + mPlaneCount = AGENT_PLANE_USER_CLIP_NUM; + mAgentPlanes[AGENT_PLANE_USER_CLIP] = plane; + mPlaneMask[AGENT_PLANE_USER_CLIP] = plane.calcPlaneMask(); } void LLCamera::disableUserClipPlane() { - mPlaneCount = AGENT_PLANE_NO_USER_CLIP_NUM; + mPlaneCount = AGENT_PLANE_NO_USER_CLIP_NUM; } -void LLCamera::setView(F32 vertical_fov_rads) +void LLCamera::setView(F32 vertical_fov_rads) { - mView = llclamp(vertical_fov_rads, MIN_FIELD_OF_VIEW, MAX_FIELD_OF_VIEW); - calculateFrustumPlanes(); + mView = llclamp(vertical_fov_rads, MIN_FIELD_OF_VIEW, MAX_FIELD_OF_VIEW); + calculateFrustumPlanes(); } void LLCamera::setViewHeightInPixels(S32 height) { - mViewHeightInPixels = height; + mViewHeightInPixels = height; - // Don't really need to do this, but update the pixel meter ratio with it. - calculateFrustumPlanes(); + // Don't really need to do this, but update the pixel meter ratio with it. + calculateFrustumPlanes(); } -void LLCamera::setAspect(F32 aspect_ratio) +void LLCamera::setAspect(F32 aspect_ratio) { - mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO); - calculateFrustumPlanes(); + mAspect = llclamp(aspect_ratio, MIN_ASPECT_RATIO, MAX_ASPECT_RATIO); + calculateFrustumPlanes(); } -void LLCamera::setNear(F32 near_plane) +void LLCamera::setNear(F32 near_plane) { - mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE); - calculateFrustumPlanes(); + mNearPlane = llclamp(near_plane, MIN_NEAR_PLANE, MAX_NEAR_PLANE); + calculateFrustumPlanes(); } -void LLCamera::setFar(F32 far_plane) +void LLCamera::setFar(F32 far_plane) { - mFarPlane = llclamp(far_plane, MIN_FAR_PLANE, MAX_FAR_PLANE); - calculateFrustumPlanes(); + mFarPlane = llclamp(far_plane, MIN_FAR_PLANE, MAX_FAR_PLANE); + calculateFrustumPlanes(); } -// ---------------- read/write to buffer ---------------- +// ---------------- read/write to buffer ---------------- size_t LLCamera::writeFrustumToBuffer(char *buffer) const { - memcpy(buffer, &mView, sizeof(F32)); /* Flawfinder: ignore */ - buffer += sizeof(F32); - memcpy(buffer, &mAspect, sizeof(F32)); /* Flawfinder: ignore */ - buffer += sizeof(F32); - memcpy(buffer, &mNearPlane, sizeof(F32)); /* Flawfinder: ignore */ - buffer += sizeof(F32); - memcpy(buffer, &mFarPlane, sizeof(F32)); /* Flawfinder: ignore */ - return 4*sizeof(F32); + memcpy(buffer, &mView, sizeof(F32)); /* Flawfinder: ignore */ + buffer += sizeof(F32); + memcpy(buffer, &mAspect, sizeof(F32)); /* Flawfinder: ignore */ + buffer += sizeof(F32); + memcpy(buffer, &mNearPlane, sizeof(F32)); /* Flawfinder: ignore */ + buffer += sizeof(F32); + memcpy(buffer, &mFarPlane, sizeof(F32)); /* Flawfinder: ignore */ + return 4*sizeof(F32); } size_t LLCamera::readFrustumFromBuffer(const char *buffer) { - memcpy(&mView, buffer, sizeof(F32)); /* Flawfinder: ignore */ - buffer += sizeof(F32); - memcpy(&mAspect, buffer, sizeof(F32)); /* Flawfinder: ignore */ - buffer += sizeof(F32); - memcpy(&mNearPlane, buffer, sizeof(F32)); /* Flawfinder: ignore */ - buffer += sizeof(F32); - memcpy(&mFarPlane, buffer, sizeof(F32)); /* Flawfinder: ignore */ - return 4*sizeof(F32); + memcpy(&mView, buffer, sizeof(F32)); /* Flawfinder: ignore */ + buffer += sizeof(F32); + memcpy(&mAspect, buffer, sizeof(F32)); /* Flawfinder: ignore */ + buffer += sizeof(F32); + memcpy(&mNearPlane, buffer, sizeof(F32)); /* Flawfinder: ignore */ + buffer += sizeof(F32); + memcpy(&mFarPlane, buffer, sizeof(F32)); /* Flawfinder: ignore */ + return 4*sizeof(F32); } -// ---------------- test methods ---------------- +// ---------------- test methods ---------------- -static const LLVector4a sFrustumScaler[] = +static const LLVector4a sFrustumScaler[] = { - LLVector4a(-1,-1,-1), - LLVector4a( 1,-1,-1), - LLVector4a(-1, 1,-1), - LLVector4a( 1, 1,-1), - LLVector4a(-1,-1, 1), - LLVector4a( 1,-1, 1), - LLVector4a(-1, 1, 1), - LLVector4a( 1, 1, 1) // 8 entries + LLVector4a(-1,-1,-1), + LLVector4a( 1,-1,-1), + LLVector4a(-1, 1,-1), + LLVector4a( 1, 1,-1), + LLVector4a(-1,-1, 1), + LLVector4a( 1,-1, 1), + LLVector4a(-1, 1, 1), + LLVector4a( 1, 1, 1) // 8 entries }; bool LLCamera::isChanged() { - bool changed = false; - for (U32 i = 0; i < mPlaneCount; i++) - { - U8 mask = mPlaneMask[i]; - if (mask != 0xff && !changed) - { - changed = !mAgentPlanes[i].equal(mLastAgentPlanes[i]); - } - mLastAgentPlanes[i].set(mAgentPlanes[i]); - } - - return changed; + bool changed = false; + for (U32 i = 0; i < mPlaneCount; i++) + { + U8 mask = mPlaneMask[i]; + if (mask != 0xff && !changed) + { + changed = !mAgentPlanes[i].equal(mLastAgentPlanes[i]); + } + mLastAgentPlanes[i].set(mAgentPlanes[i]); + } + + return changed; } -S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius, const LLPlane* planes) -{ - if(!planes) - { - //use agent space - planes = mAgentPlanes; - } - - U8 mask = 0; - bool result = false; - LLVector4a rscale, maxp, minp; - LLSimdScalar d; - U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM); // mAgentPlanes[] size is 7 - for (U32 i = 0; i < max_planes; i++) - { - mask = mPlaneMask[i]; - if (mask < PLANE_MASK_NUM) - { - const LLPlane& p(planes[i]); - p.getAt<3>(d); - rscale.setMul(radius, sFrustumScaler[mask]); - minp.setSub(center, rscale); - d = -d; - if (p.dot3(minp).getF32() > d) - { - return 0; - } - - if(!result) - { - maxp.setAdd(center, rscale); - result = (p.dot3(maxp).getF32() > d); - } - } - } - - return result?1:2; +S32 LLCamera::AABBInFrustum(const LLVector4a ¢er, const LLVector4a& radius, const LLPlane* planes) +{ + if(!planes) + { + //use agent space + planes = mAgentPlanes; + } + + U8 mask = 0; + bool result = false; + LLVector4a rscale, maxp, minp; + LLSimdScalar d; + U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM); // mAgentPlanes[] size is 7 + for (U32 i = 0; i < max_planes; i++) + { + mask = mPlaneMask[i]; + if (mask < PLANE_MASK_NUM) + { + const LLPlane& p(planes[i]); + p.getAt<3>(d); + rscale.setMul(radius, sFrustumScaler[mask]); + minp.setSub(center, rscale); + d = -d; + if (p.dot3(minp).getF32() > d) + { + return 0; + } + + if(!result) + { + maxp.setAdd(center, rscale); + result = (p.dot3(maxp).getF32() > d); + } + } + } + + return result?1:2; } //exactly same as the function AABBInFrustum(...) //except uses mRegionPlanes instead of mAgentPlanes. -S32 LLCamera::AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& radius) +S32 LLCamera::AABBInRegionFrustum(const LLVector4a& center, const LLVector4a& radius) { - return AABBInFrustum(center, radius, mRegionPlanes); + return AABBInFrustum(center, radius, mRegionPlanes); } -S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes) -{ - if(!planes) - { - //use agent space - planes = mAgentPlanes; - } - - U8 mask = 0; - bool result = false; - LLVector4a rscale, maxp, minp; - LLSimdScalar d; - U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM); // mAgentPlanes[] size is 7 - for (U32 i = 0; i < max_planes; i++) - { - mask = mPlaneMask[i]; - if ((i != 5) && (mask < PLANE_MASK_NUM)) - { - const LLPlane& p(planes[i]); - p.getAt<3>(d); - rscale.setMul(radius, sFrustumScaler[mask]); - minp.setSub(center, rscale); - d = -d; - if (p.dot3(minp).getF32() > d) - { - return 0; - } - - if(!result) - { - maxp.setAdd(center, rscale); - result = (p.dot3(maxp).getF32() > d); - } - } - } - - return result?1:2; +S32 LLCamera::AABBInFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius, const LLPlane* planes) +{ + if(!planes) + { + //use agent space + planes = mAgentPlanes; + } + + U8 mask = 0; + bool result = false; + LLVector4a rscale, maxp, minp; + LLSimdScalar d; + U32 max_planes = llmin(mPlaneCount, (U32) AGENT_PLANE_USER_CLIP_NUM); // mAgentPlanes[] size is 7 + for (U32 i = 0; i < max_planes; i++) + { + mask = mPlaneMask[i]; + if ((i != 5) && (mask < PLANE_MASK_NUM)) + { + const LLPlane& p(planes[i]); + p.getAt<3>(d); + rscale.setMul(radius, sFrustumScaler[mask]); + minp.setSub(center, rscale); + d = -d; + if (p.dot3(minp).getF32() > d) + { + return 0; + } + + if(!result) + { + maxp.setAdd(center, rscale); + result = (p.dot3(maxp).getF32() > d); + } + } + } + + return result?1:2; } //exactly same as the function AABBInFrustumNoFarClip(...) //except uses mRegionPlanes instead of mAgentPlanes. -S32 LLCamera::AABBInRegionFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius) +S32 LLCamera::AABBInRegionFrustumNoFarClip(const LLVector4a& center, const LLVector4a& radius) { - return AABBInFrustumNoFarClip(center, radius, mRegionPlanes); + return AABBInFrustumNoFarClip(center, radius, mRegionPlanes); } -int LLCamera::sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius) +int LLCamera::sphereInFrustumQuick(const LLVector3 &sphere_center, const F32 radius) { - LLVector3 dist = sphere_center-mFrustCenter; - float dsq = dist * dist; - float rsq = mFarPlane*0.5f + radius; - rsq *= rsq; + LLVector3 dist = sphere_center-mFrustCenter; + float dsq = dist * dist; + float rsq = mFarPlane*0.5f + radius; + rsq *= rsq; - if (dsq < rsq) - { - return 1; - } - - return 0; + if (dsq < rsq) + { + return 1; + } + + return 0; } // Return 1 if sphere is in frustum, 2 if fully in frustum, otherwise 0. // NOTE: 'center' is in absolute frame. -int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius) const -{ - // Returns 1 if sphere is in frustum, 0 if not. - bool res = false; - for (int i = 0; i < 6; i++) - { - if (mPlaneMask[i] != PLANE_MASK_NONE) - { - float d = mAgentPlanes[i].dist(sphere_center); - - if (d > radius) - { - return 0; - } - res = res || (d > -radius); - } - } - - return res?1:2; +int LLCamera::sphereInFrustum(const LLVector3 &sphere_center, const F32 radius) const +{ + // Returns 1 if sphere is in frustum, 0 if not. + bool res = false; + for (int i = 0; i < 6; i++) + { + if (mPlaneMask[i] != PLANE_MASK_NONE) + { + float d = mAgentPlanes[i].dist(sphere_center); + + if (d > radius) + { + return 0; + } + res = res || (d > -radius); + } + } + + return res?1:2; } // return height of a sphere of given radius, located at center, in pixels F32 LLCamera::heightInPixels(const LLVector3 ¢er, F32 radius ) const { - if (radius == 0.f) return 0.f; + if (radius == 0.f) return 0.f; - // If height initialized - if (mViewHeightInPixels > -1) - { - // Convert sphere to coord system with 0,0,0 at camera - LLVector3 vec = center - mOrigin; + // If height initialized + if (mViewHeightInPixels > -1) + { + // Convert sphere to coord system with 0,0,0 at camera + LLVector3 vec = center - mOrigin; - // Compute distance to sphere - F32 dist = vec.magVec(); + // Compute distance to sphere + F32 dist = vec.magVec(); - // Calculate angle of whole object - F32 angle = 2.0f * (F32) atan2(radius, dist); + // Calculate angle of whole object + F32 angle = 2.0f * (F32) atan2(radius, dist); - // Calculate fraction of field of view - F32 fraction_of_fov = angle / mView; + // Calculate fraction of field of view + F32 fraction_of_fov = angle / mView; - // Compute number of pixels tall, based on vertical field of view - return (fraction_of_fov * mViewHeightInPixels); - } - else - { - // return invalid height - return -1.0f; - } + // Compute number of pixels tall, based on vertical field of view + return (fraction_of_fov * mViewHeightInPixels); + } + else + { + // return invalid height + return -1.0f; + } } -// ---------------- friends and operators ---------------- +// ---------------- friends and operators ---------------- -std::ostream& operator<<(std::ostream &s, const LLCamera &C) +std::ostream& operator<<(std::ostream &s, const LLCamera &C) { - s << "{ \n"; - s << " Center = " << C.getOrigin() << "\n"; - s << " AtAxis = " << C.getXAxis() << "\n"; - s << " LeftAxis = " << C.getYAxis() << "\n"; - s << " UpAxis = " << C.getZAxis() << "\n"; - s << " View = " << C.getView() << "\n"; - s << " Aspect = " << C.getAspect() << "\n"; - s << " NearPlane = " << C.mNearPlane << "\n"; - s << " FarPlane = " << C.mFarPlane << "\n"; - s << "}"; - return s; + s << "{ \n"; + s << " Center = " << C.getOrigin() << "\n"; + s << " AtAxis = " << C.getXAxis() << "\n"; + s << " LeftAxis = " << C.getYAxis() << "\n"; + s << " UpAxis = " << C.getZAxis() << "\n"; + s << " View = " << C.getView() << "\n"; + s << " Aspect = " << C.getAspect() << "\n"; + s << " NearPlane = " << C.mNearPlane << "\n"; + s << " FarPlane = " << C.mFarPlane << "\n"; + s << "}"; + return s; } // ---------------- private member functions ---------------- -void LLCamera::calculateFrustumPlanes() +void LLCamera::calculateFrustumPlanes() { - // The planes only change when any of the frustum descriptions change. - // They are not affected by changes of the position of the Frustum - // because they are known in the view frame and the position merely - // provides information on how to get from the absolute frame to the - // view frame. + // The planes only change when any of the frustum descriptions change. + // They are not affected by changes of the position of the Frustum + // because they are known in the view frame and the position merely + // provides information on how to get from the absolute frame to the + // view frame. - F32 left,right,top,bottom; - top = mFarPlane * (F32)tanf(0.5f * mView); - bottom = -top; - left = top * mAspect; - right = -left; + F32 left,right,top,bottom; + top = mFarPlane * (F32)tanf(0.5f * mView); + bottom = -top; + left = top * mAspect; + right = -left; - calculateFrustumPlanes(left, right, top, bottom); + calculateFrustumPlanes(left, right, top, bottom); } LLPlane planeFromPoints(LLVector3 p1, LLVector3 p2, LLVector3 p3) { - LLVector3 n = ((p2-p1)%(p3-p1)); - n.normVec(); + LLVector3 n = ((p2-p1)%(p3-p1)); + n.normVec(); - return LLPlane(p1, n); + return LLPlane(p1, n); } void LLCamera::ignoreAgentFrustumPlane(S32 idx) { - if (idx < 0 || idx > (S32) mPlaneCount) - { - return; - } + if (idx < 0 || idx > (S32) mPlaneCount) + { + return; + } - mPlaneMask[idx] = PLANE_MASK_NONE; - mAgentPlanes[idx].clear(); + mPlaneMask[idx] = PLANE_MASK_NONE; + mAgentPlanes[idx].clear(); } void LLCamera::calcAgentFrustumPlanes(LLVector3* frust) { - - for (int i = 0; i < AGENT_FRUSTRUM_NUM; i++) - { - mAgentFrustum[i] = frust[i]; - } - mFrustumCornerDist = (frust[5] - getOrigin()).magVec(); + for (int i = 0; i < AGENT_FRUSTRUM_NUM; i++) + { + mAgentFrustum[i] = frust[i]; + } + + mFrustumCornerDist = (frust[5] - getOrigin()).magVec(); - //frust contains the 8 points of the frustum, calculate 6 planes + //frust contains the 8 points of the frustum, calculate 6 planes - //order of planes is important, keep most likely to fail in the front of the list + //order of planes is important, keep most likely to fail in the front of the list - //near - frust[0], frust[1], frust[2] - mAgentPlanes[AGENT_PLANE_NEAR] = planeFromPoints(frust[0], frust[1], frust[2]); + //near - frust[0], frust[1], frust[2] + mAgentPlanes[AGENT_PLANE_NEAR] = planeFromPoints(frust[0], frust[1], frust[2]); - //far - mAgentPlanes[AGENT_PLANE_FAR] = planeFromPoints(frust[5], frust[4], frust[6]); + //far + mAgentPlanes[AGENT_PLANE_FAR] = planeFromPoints(frust[5], frust[4], frust[6]); - //left - mAgentPlanes[AGENT_PLANE_LEFT] = planeFromPoints(frust[4], frust[0], frust[7]); + //left + mAgentPlanes[AGENT_PLANE_LEFT] = planeFromPoints(frust[4], frust[0], frust[7]); - //right - mAgentPlanes[AGENT_PLANE_RIGHT] = planeFromPoints(frust[1], frust[5], frust[6]); + //right + mAgentPlanes[AGENT_PLANE_RIGHT] = planeFromPoints(frust[1], frust[5], frust[6]); - //top - mAgentPlanes[AGENT_PLANE_TOP] = planeFromPoints(frust[3], frust[2], frust[6]); + //top + mAgentPlanes[AGENT_PLANE_TOP] = planeFromPoints(frust[3], frust[2], frust[6]); - //bottom - mAgentPlanes[AGENT_PLANE_BOTTOM] = planeFromPoints(frust[1], frust[0], frust[4]); + //bottom + mAgentPlanes[AGENT_PLANE_BOTTOM] = planeFromPoints(frust[1], frust[0], frust[4]); - //cache plane octant facing mask for use in AABBInFrustum - for (U32 i = 0; i < mPlaneCount; i++) - { - mPlaneMask[i] = mAgentPlanes[i].calcPlaneMask(); - } + //cache plane octant facing mask for use in AABBInFrustum + for (U32 i = 0; i < mPlaneCount; i++) + { + mPlaneMask[i] = mAgentPlanes[i].calcPlaneMask(); + } } //calculate regional planes from mAgentPlanes. //vector "shift" is the vector of the region origin in the agent space. -void LLCamera::calcRegionFrustumPlanes(const LLVector3& shift, F32 far_clip_distance) -{ - F32 far_w; - { - LLVector3 p = getOrigin(); - LLVector3 n(mAgentPlanes[5][0], mAgentPlanes[5][1], mAgentPlanes[5][2]); - F32 dd = n * p; - if(dd + mAgentPlanes[5][3] < 0) //signed distance - { - far_w = -far_clip_distance - dd; - } - else - { - far_w = far_clip_distance - dd; - } - far_w += n * shift; - } - - F32 d; - LLVector3 n; - for(S32 i = 0 ; i < 7; i++) - { - if (mPlaneMask[i] != 0xff) - { - n.setVec(mAgentPlanes[i][0], mAgentPlanes[i][1], mAgentPlanes[i][2]); - - if(i != 5) - { - d = mAgentPlanes[i][3] + n * shift; - } - else - { - d = far_w; - } - mRegionPlanes[i].setVec(n, d); - } - } +void LLCamera::calcRegionFrustumPlanes(const LLVector3& shift, F32 far_clip_distance) +{ + F32 far_w; + { + LLVector3 p = getOrigin(); + LLVector3 n(mAgentPlanes[5][0], mAgentPlanes[5][1], mAgentPlanes[5][2]); + F32 dd = n * p; + if(dd + mAgentPlanes[5][3] < 0) //signed distance + { + far_w = -far_clip_distance - dd; + } + else + { + far_w = far_clip_distance - dd; + } + far_w += n * shift; + } + + F32 d; + LLVector3 n; + for(S32 i = 0 ; i < 7; i++) + { + if (mPlaneMask[i] != 0xff) + { + n.setVec(mAgentPlanes[i][0], mAgentPlanes[i][1], mAgentPlanes[i][2]); + + if(i != 5) + { + d = mAgentPlanes[i][3] + n * shift; + } + else + { + d = far_w; + } + mRegionPlanes[i].setVec(n, d); + } + } } void LLCamera::calculateFrustumPlanes(F32 left, F32 right, F32 top, F32 bottom) { - //calculate center and radius squared of frustum in world absolute coordinates - static LLVector3 const X_AXIS(1.f, 0.f, 0.f); - mFrustCenter = X_AXIS*mFarPlane*0.5f; - mFrustCenter = transformToAbsolute(mFrustCenter); - mFrustRadiusSquared = mFarPlane*0.5f; - mFrustRadiusSquared *= mFrustRadiusSquared * 1.05f; //pad radius squared by 5% + //calculate center and radius squared of frustum in world absolute coordinates + static LLVector3 const X_AXIS(1.f, 0.f, 0.f); + mFrustCenter = X_AXIS*mFarPlane*0.5f; + mFrustCenter = transformToAbsolute(mFrustCenter); + mFrustRadiusSquared = mFarPlane*0.5f; + mFrustRadiusSquared *= mFrustRadiusSquared * 1.05f; //pad radius squared by 5% } // x and y are in WINDOW space, so x = Y-Axis (left/right), y= Z-Axis(Up/Down) void LLCamera::calculateFrustumPlanesFromWindow(F32 x1, F32 y1, F32 x2, F32 y2) { - F32 bottom, top, left, right; - F32 view_height = (F32)tanf(0.5f * mView) * mFarPlane; - F32 view_width = view_height * mAspect; - - left = x1 * -2.f * view_width; - right = x2 * -2.f * view_width; - bottom = y1 * 2.f * view_height; - top = y2 * 2.f * view_height; + F32 bottom, top, left, right; + F32 view_height = (F32)tanf(0.5f * mView) * mFarPlane; + F32 view_width = view_height * mAspect; + + left = x1 * -2.f * view_width; + right = x2 * -2.f * view_width; + bottom = y1 * 2.f * view_height; + top = y2 * 2.f * view_height; - calculateFrustumPlanes(left, right, top, bottom); + calculateFrustumPlanes(left, right, top, bottom); } -// NOTE: this is the OpenGL matrix that will transform the default OpenGL view +// NOTE: this is the OpenGL matrix that will transform the default OpenGL view // (-Z=at, Y=up) to the default view of the LLCamera class (X=at, Z=up): -// +// // F32 cfr_transform = { 0.f, 0.f, -1.f, 0.f, // -Z becomes X -// -1.f, 0.f, 0.f, 0.f, // -X becomes Y -// 0.f, 1.f, 0.f, 0.f, // Y becomes Z -// 0.f, 0.f, 0.f, 1.f }; +// -1.f, 0.f, 0.f, 0.f, // -X becomes Y +// 0.f, 1.f, 0.f, 0.f, // Y becomes Z +// 0.f, 0.f, 0.f, 1.f }; |