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 enum
00046 {
00047 VERTEX_DATA_MASK = (1 << LLVertexBuffer::TYPE_VERTEX) |
00048 (1 << LLVertexBuffer::TYPE_NORMAL) |
00049 (1 << LLVertexBuffer::TYPE_TEXCOORD) |
00050 (1 << LLVertexBuffer::TYPE_TEXCOORD2) |
00051 (1 << LLVertexBuffer::TYPE_COLOR)
00052 };
00053
00054 LLVOSurfacePatch(const LLUUID &id, const LLPCode pcode, LLViewerRegion *regionp);
00055
00056 void markDead();
00057
00058
00059 static void initClass();
00060
00061 virtual U32 getPartitionType() const;
00062
00063 LLDrawable* createDrawable(LLPipeline *pipeline);
00064 BOOL updateGeometry(LLDrawable *drawable);
00065 BOOL updateLOD();
00066 void updateFaceSize(S32 idx);
00067 void getGeometry(LLStrider<LLVector3> &verticesp,
00068 LLStrider<LLVector3> &normalsp,
00069 LLStrider<LLColor4U> &colorsp,
00070 LLStrider<LLVector2> &texCoords0p,
00071 LLStrider<LLVector2> &texCoords1p,
00072 LLStrider<U32> &indicesp);
00073
00074 void updateTextures(LLAgent &agent);
00075 void setPixelAreaAndAngle(LLAgent &agent);
00076
00077 void updateSpatialExtents(LLVector3& newMin, LLVector3& newMax);
00078 BOOL isActive() const;
00079
00080 void setPatch(LLSurfacePatch *patchp);
00081 LLSurfacePatch *getPatch() const { return mPatchp; }
00082
00083 void dirtyPatch();
00084 void dirtyGeom();
00085
00086 BOOL mDirtiedPatch;
00087 protected:
00088 ~LLVOSurfacePatch();
00089
00090 LLFacePool *mPool;
00091 LLFacePool *getPool();
00092 S32 mBaseComp;
00093 LLSurfacePatch *mPatchp;
00094 BOOL mDirtyTexture;
00095 BOOL mDirtyTerrain;
00096
00097 S32 mLastNorthStride;
00098 S32 mLastEastStride;
00099 S32 mLastStride;
00100 S32 mLastLength;
00101
00102 void calcColor(const LLVector3* vertex, const LLVector3* normal, LLColor4U* colorp);
00103 BOOL updateShadows(BOOL use_shadow_factor = FALSE);
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<U32> &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<U32> &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<U32> &indicesp,
00133 U32 &index_offset);
00134 };
00135
00136 #endif // LL_VOSURFACEPATCH_H