llsurfacepatch.h
上传用户:king477883
上传日期:2021-03-01
资源大小:9553k
文件大小:5k
- /**
- * @file llsurfacepatch.h
- * @brief LLSurfacePatch class definition
- *
- * $LicenseInfo:firstyear=2001&license=viewergpl$
- *
- * Copyright (c) 2001-2010, Linden Research, Inc.
- *
- * Second Life Viewer Source Code
- * The source code in this file ("Source Code") is provided by Linden Lab
- * to you under the terms of the GNU General Public License, version 2.0
- * ("GPL"), unless you have obtained a separate licensing agreement
- * ("Other License"), formally executed by you and Linden Lab. Terms of
- * the GPL can be found in doc/GPL-license.txt in this distribution, or
- * online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
- *
- * There are special exceptions to the terms and conditions of the GPL as
- * it is applied to this Source Code. View the full text of the exception
- * in the file doc/FLOSS-exception.txt in this software distribution, or
- * online at
- * http://secondlifegrid.net/programs/open_source/licensing/flossexception
- *
- * By copying, modifying or distributing this software, you acknowledge
- * that you have read and understood your obligations described above,
- * and agree to abide by those obligations.
- *
- * ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
- * WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
- * COMPLETENESS OR PERFORMANCE.
- * $/LicenseInfo$
- */
- #ifndef LL_LLSURFACEPATCH_H
- #define LL_LLSURFACEPATCH_H
- #include "v3math.h"
- #include "v3dmath.h"
- #include "llpointer.h"
- class LLSurface;
- class LLVOSurfacePatch;
- class LLVector2;
- class LLColor4U;
- class LLAgent;
- // A patch shouldn't know about its visibility since that really depends on the
- // camera that is looking (or not looking) at it. So, anything about a patch
- // that is specific to a camera should be in the class below.
- class LLPatchVisibilityInfo
- {
- public:
- LLPatchVisibilityInfo() :
- mbIsVisible(FALSE),
- mDistance(0.f),
- mRenderLevel(0),
- mRenderStride(0) { };
- ~LLPatchVisibilityInfo() { };
- BOOL mbIsVisible;
- F32 mDistance; // Distance from camera
- S32 mRenderLevel;
- U32 mRenderStride;
- };
- class LLSurfacePatch
- {
- public:
- LLSurfacePatch();
- ~LLSurfacePatch();
- void reset(const U32 id);
- void connectNeighbor(LLSurfacePatch *neighborp, const U32 direction);
- void disconnectNeighbor(LLSurface *surfacep);
- void setNeighborPatch(const U32 direction, LLSurfacePatch *neighborp);
- LLSurfacePatch *getNeighborPatch(const U32 direction) const;
- void colorPatch(const U8 r, const U8 g, const U8 b);
- BOOL updateTexture();
- void updateVerticalStats();
- void updateCompositionStats();
- void updateNormals();
- void updateEastEdge();
- void updateNorthEdge();
- void updateCameraDistanceRegion( const LLVector3 &pos_region);
- void updateVisibility();
- void updateGL();
- void dirtyZ(); // Dirty the z values of this patch
- void setHasReceivedData();
- BOOL getHasReceivedData() const;
- F32 getDistance() const;
- F32 getMaxZ() const;
- F32 getMinZ() const;
- F32 getMeanComposition() const;
- F32 getMinComposition() const;
- F32 getMaxComposition() const;
- const LLVector3 &getCenterRegion() const;
- const U64 &getLastUpdateTime() const;
- LLSurface *getSurface() const { return mSurfacep; }
- LLVector3 getPointAgent(const U32 x, const U32 y) const; // get the point at the offset.
- LLVector2 getTexCoords(const U32 x, const U32 y) const;
- void calcNormal(const U32 x, const U32 y, const U32 stride);
- const LLVector3 &getNormal(const U32 x, const U32 y) const;
- void eval(const U32 x, const U32 y, const U32 stride,
- LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex0, LLVector2 *tex1);
-
-
- LLVector3 getOriginAgent() const;
- const LLVector3d &getOriginGlobal() const;
- void setOriginGlobal(const LLVector3d &origin_global);
-
- // connectivity -- each LLPatch points at 5 neighbors (or NULL)
- // +---+---+---+
- // | | 2 | 5 |
- // +---+---+---+
- // | 3 | 0 | 1 |
- // +---+---+---+
- // | 6 | 4 | |
- // +---+---+---+
- BOOL getVisible() const;
- U32 getRenderStride() const;
- S32 getRenderLevel() const;
- void setSurface(LLSurface *surfacep);
- void setDataZ(F32 *data_z) { mDataZ = data_z; }
- void setDataNorm(LLVector3 *data_norm) { mDataNorm = data_norm; }
- F32 *getDataZ() const { return mDataZ; }
- void dirty(); // Mark this surface patch as dirty...
- void clearDirty() { mDirty = FALSE; }
- void clearVObj();
- public:
- BOOL mHasReceivedData; // has the patch EVER received height data?
- BOOL mSTexUpdate; // Does the surface texture need to be updated?
- protected:
- LLSurfacePatch *mNeighborPatches[8]; // Adjacent patches
- BOOL mNormalsInvalid[9]; // Which normals are invalid
- BOOL mDirty;
- BOOL mDirtyZStats;
- BOOL mHeightsGenerated;
- U32 mDataOffset;
- F32 *mDataZ;
- LLVector3 *mDataNorm;
- // Pointer to the LLVOSurfacePatch object which is used in the new renderer.
- LLPointer<LLVOSurfacePatch> mVObjp;
- // All of the camera-dependent stuff should be in its own class...
- LLPatchVisibilityInfo mVisInfo;
- // pointers to beginnings of patch data fields
- LLVector3d mOriginGlobal;
- LLVector3 mOriginRegion;
- // height field stats
- LLVector3 mCenterRegion; // Center in region-local coords
- F32 mMinZ, mMaxZ, mMeanZ;
- F32 mRadius;
- F32 mMinComposition;
- F32 mMaxComposition;
- F32 mMeanComposition;
- U8 mConnectedEdge; // This flag is non-zero iff patch is on at least one edge
- // of LLSurface that is "connected" to another LLSurface
- U64 mLastUpdateTime; // Time patch was last updated
- LLSurface *mSurfacep; // Pointer to "parent" surface
- };
- #endif // LL_LLSURFACEPATCH_H