00001
00032 #ifndef LL_VOSURFACEPATCH_H
00033 #define LL_VOSURFACEPATCH_H
00034
00035 #include "llviewerobject.h"
00036 #include "llstrider.h"
00037
00038 class LLSurfacePatch;
00039 class LLDrawPool;
00040 class LLVector2;
00041
00042 class LLVOSurfacePatch : public LLStaticViewerObject
00043 {
00044 public:
00045 static F32 sLODFactor;
00046
00047 enum
00048 {
00049 VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
00050 (1 << LLVertexBuffer::TYPE_NORMAL) |
00051 (1 << LLVertexBuffer::TYPE_TEXCOORD) |
00052 (1 << LLVertexBuffer::TYPE_TEXCOORD2) |
00053 (1 << LLVertexBuffer::TYPE_COLOR)
00054 };
00055
00056 LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
00057
00058 void markDead();
00059
00060
00061 static void initClass();
00062
00063 virtual U32 getPartitionType() const;
00064
00065 LLDrawable* createDrawable(LLPipeline *pipeline);
00066 BOOL updateGeometry(LLDrawable *drawable);
00067 BOOL updateLOD();
00068 void updateFaceSize(S32 idx);
00069 void getGeometry(LLStrider<LLVector3> &verticesp,
00070 LLStrider<LLVector3> &normalsp,
00071 LLStrider<LLColor4U> &colorsp,
00072 LLStrider<LLVector2> &texCoords0p,
00073 LLStrider<LLVector2> &texCoords1p,
00074 LLStrider<U16> &indicesp);
00075
00076 void updateTextures(LLAgent &agent);
00077 void setPixelAreaAndAngle(LLAgent &agent);
00078
00079 void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
00080 BOOL isActive() const;
00081
00082 void setPatch(LLSurfacePatch *patchp);
00083 LLSurfacePatch *getPatch() const { return mPatchp; }
00084
00085 void dirtyPatch();
00086 void dirtyGeom();
00087
00088 BOOL mDirtiedPatch;
00089 protected:
00090 ~LLVOSurfacePatch();
00091
00092 LLFacePool *mPool;
00093 LLFacePool *getPool();
00094 S32 mBaseComp;
00095 LLSurfacePatch *mPatchp;
00096 BOOL mDirtyTexture;
00097 BOOL mDirtyTerrain;
00098
00099 S32 mLastNorthStride;
00100 S32 mLastEastStride;
00101 S32 mLastStride;
00102 S32 mLastLength;
00103
00104 void getGeomSizesMain(const S32 stride, S32 &num_vertices, S32 &num_indices);
00105 void getGeomSizesNorth(const S32 stride, const S32 north_stride,
00106 S32 &num_vertices, S32 &num_indices);
00107 void getGeomSizesEast(const S32 stride, const S32 east_stride,
00108 S32 &num_vertices, S32 &num_indices);
00109
00110 void updateMainGeometry(LLFace *facep,
00111 LLStrider<LLVector3> &verticesp,
00112 LLStrider<LLVector3> &normalsp,
00113 LLStrider<LLColor4U> &colorsp,
00114 LLStrider<LLVector2> &texCoords0p,
00115 LLStrider<LLVector2> &texCoords1p,
00116 LLStrider<U16> &indicesp,
00117 U32 &index_offset);
00118 void updateNorthGeometry(LLFace *facep,
00119 LLStrider<LLVector3> &verticesp,
00120 LLStrider<LLVector3> &normalsp,
00121 LLStrider<LLColor4U> &colorsp,
00122 LLStrider<LLVector2> &texCoords0p,
00123 LLStrider<LLVector2> &texCoords1p,
00124 LLStrider<U16> &indicesp,
00125 U32 &index_offset);
00126 void updateEastGeometry(LLFace *facep,
00127 LLStrider<LLVector3> &verticesp,
00128 LLStrider<LLVector3> &normalsp,
00129 LLStrider<LLColor4U> &colorsp,
00130 LLStrider<LLVector2> &texCoords0p,
00131 LLStrider<LLVector2> &texCoords1p,
00132 LLStrider<U16> &indicesp,
00133 U32 &index_offset);
00134 };
00135
00136 #endif // LL_VOSURFACEPATCH_H