00001
00032 #ifndef LL_LLSURFACEPATCH_H
00033 #define LL_LLSURFACEPATCH_H
00034
00035 #include "v3math.h"
00036 #include "v3dmath.h"
00037 #include "llmemory.h"
00038
00039 class LLSurface;
00040 class LLVOSurfacePatch;
00041 class LLVector2;
00042 class LLColor4U;
00043 class LLAgent;
00044
00045
00046
00047
00048 struct LLPatchVisibilityInfo
00049 {
00050 BOOL mbIsVisible;
00051 F32 mDistance;
00052 S32 mRenderLevel;
00053 U32 mRenderStride;
00054 };
00055
00056
00057
00058 class LLSurfacePatch
00059 {
00060 public:
00061 LLSurfacePatch();
00062 ~LLSurfacePatch();
00063
00064 void reset(const U32 id);
00065 void connectNeighbor(LLSurfacePatch *neighborp, const U32 direction);
00066 void disconnectNeighbor(LLSurface *surfacep);
00067
00068 void setNeighborPatch(const U32 direction, LLSurfacePatch *neighborp);
00069 LLSurfacePatch *getNeighborPatch(const U32 direction) const;
00070
00071 void colorPatch(const U8 r, const U8 g, const U8 b);
00072
00073 BOOL updateTexture();
00074
00075 void updateVerticalStats();
00076 void updateCompositionStats();
00077 void updateNormals();
00078
00079 void updateEastEdge();
00080 void updateNorthEdge();
00081
00082 void updateCameraDistanceRegion( const LLVector3 &pos_region);
00083 void updateVisibility();
00084
00085 void dirtyZ();
00086 void setHasReceivedData();
00087 BOOL getHasReceivedData() const;
00088
00089 F32 getDistance() const;
00090 F32 getMaxZ() const;
00091 F32 getMinZ() const;
00092 F32 getMeanComposition() const;
00093 F32 getMinComposition() const;
00094 F32 getMaxComposition() const;
00095 const LLVector3 &getCenterRegion() const;
00096 const U64 &getLastUpdateTime() const;
00097 LLSurface *getSurface() const { return mSurfacep; }
00098 LLVector3 getPointAgent(const U32 x, const U32 y) const;
00099 LLVector2 getTexCoords(const U32 x, const U32 y) const;
00100
00101 void calcNormal(const U32 x, const U32 y, const U32 stride);
00102 const LLVector3 &getNormal(const U32 x, const U32 y) const;
00103
00104 void eval(const U32 x, const U32 y, const U32 stride,
00105 LLVector3 *vertex, LLVector3 *normal, LLVector2 *tex0, LLVector2 *tex1);
00106
00107
00108
00109 LLVector3 getOriginAgent() const;
00110 const LLVector3d &getOriginGlobal() const;
00111 void setOriginGlobal(const LLVector3d &origin_global);
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123 BOOL getVisible() const;
00124 U32 getRenderStride() const;
00125 S32 getRenderLevel() const;
00126
00127 void setSurface(LLSurface *surfacep);
00128 void setDataZ(F32 *data_z) { mDataZ = data_z; }
00129 void setDataNorm(LLVector3 *data_norm) { mDataNorm = data_norm; }
00130 F32 *getDataZ() const { return mDataZ; }
00131
00132 void dirty();
00133 void clearDirty() { mDirty = FALSE; }
00134
00135 void clearVObj();
00136
00137 public:
00138 BOOL mHasReceivedData;
00139 BOOL mSTexUpdate;
00140
00141 protected:
00142 LLSurfacePatch *mNeighborPatches[8];
00143 BOOL mNormalsInvalid[9];
00144
00145 BOOL mDirty;
00146 BOOL mDirtyZStats;
00147 BOOL mHeightsGenerated;
00148
00149 U32 mDataOffset;
00150 F32 *mDataZ;
00151 LLVector3 *mDataNorm;
00152
00153
00154 LLPointer<LLVOSurfacePatch> mVObjp;
00155
00156
00157 LLPatchVisibilityInfo mVisInfo;
00158
00159
00160 LLVector3d mOriginGlobal;
00161 LLVector3 mOriginRegion;
00162
00163
00164
00165 LLVector3 mCenterRegion;
00166 F32 mMinZ, mMaxZ, mMeanZ;
00167 F32 mRadius;
00168
00169 F32 mMinComposition;
00170 F32 mMaxComposition;
00171 F32 mMeanComposition;
00172
00173 U8 mConnectedEdge;
00174
00175 U64 mLastUpdateTime;
00176
00177 LLSurface *mSurfacep;
00178 };
00179
00180
00181 #endif // LL_LLSURFACEPATCH_H