00001
00032 #ifndef LL_PIPELINE_H
00033 #define LL_PIPELINE_H
00034
00035 #include "llerror.h"
00036 #include "lldarrayptr.h"
00037 #include "lldqueueptr.h"
00038 #include "llstat.h"
00039 #include "lldrawpool.h"
00040 #include "llspatialpartition.h"
00041 #include "m4math.h"
00042 #include "llmemory.h"
00043 #include "lldrawpool.h"
00044 #include "llgl.h"
00045 #include "lldrawable.h"
00046 #include "llrendertarget.h"
00047
00048 class LLViewerImage;
00049 class LLEdge;
00050 class LLFace;
00051 class LLViewerObject;
00052 class LLAgent;
00053 class LLDisplayPrimitive;
00054 class LLTextureEntry;
00055 class LLRenderFunc;
00056 class LLCubeMap;
00057 class LLCullResult;
00058 class LLVOAvatar;
00059
00060 typedef enum e_avatar_skinning_method
00061 {
00062 SKIN_METHOD_SOFTWARE,
00063 SKIN_METHOD_VERTEX_PROGRAM
00064 } EAvatarSkinningMethod;
00065
00066 BOOL compute_min_max(LLMatrix4& box, LLVector2& min, LLVector2& max);
00067 bool LLRayAABB(const LLVector3 ¢er, const LLVector3 &size, const LLVector3& origin, const LLVector3& dir, LLVector3 &coord, F32 epsilon = 0);
00068 BOOL LLLineSegmentAABB(const LLVector3& start, const LLVector3& end, const LLVector3& center, const LLVector3& size);
00069 BOOL setup_hud_matrices(BOOL for_select);
00070 glh::matrix4f glh_copy_matrix(GLdouble* src);
00071 glh::matrix4f glh_get_current_modelview();
00072 void glh_set_current_modelview(const glh::matrix4f& mat);
00073 glh::matrix4f glh_get_current_projection();
00074 void glh_set_current_projection(glh::matrix4f& mat);
00075 glh::matrix4f gl_ortho(GLfloat left, GLfloat right, GLfloat bottom, GLfloat top, GLfloat znear, GLfloat zfar);
00076 glh::matrix4f gl_perspective(GLfloat fovy, GLfloat aspect, GLfloat zNear, GLfloat zFar);
00077
00078 class LLPipeline
00079 {
00080 public:
00081 LLPipeline();
00082 ~LLPipeline();
00083
00084 void destroyGL();
00085 void restoreGL();
00086 void resetVertexBuffers();
00087 void resizeScreenTexture();
00088 void releaseGLBuffers();
00089 void createGLBuffers();
00090
00091 void resetVertexBuffers(LLDrawable* drawable);
00092 void setUseVBO(BOOL use_vbo);
00093 void generateImpostor(LLVOAvatar* avatar);
00094 void generateReflectionMap(LLCubeMap* cube_map, LLCamera& camera);
00095 void blurReflectionMap(LLCubeMap* cube_in, LLCubeMap* cube_out);
00096 void bindScreenToTexture();
00097 void renderBloom(BOOL for_snapshot);
00098
00099 LLCubeMap* findReflectionMap(const LLVector3& location);
00100
00101 void init();
00102 void cleanup();
00103 BOOL isInit() { return mInitialized; };
00104
00107 LLDrawPool *findPool(const U32 pool_type, LLViewerImage *tex0 = NULL);
00108
00111 LLDrawPool *getPool(const U32 pool_type, LLViewerImage *tex0 = NULL);
00112
00114 static LLDrawPool* getPoolFromTE(const LLTextureEntry* te, LLViewerImage* te_image);
00115 static U32 getPoolTypeFromTE(const LLTextureEntry* te, LLViewerImage* imagep);
00116
00117 void addPool(LLDrawPool *poolp);
00118 void removePool( LLDrawPool* poolp );
00119
00120 void allocDrawable(LLViewerObject *obj);
00121
00122 void unlinkDrawable(LLDrawable*);
00123
00124
00125 void markVisible(LLDrawable *drawablep, LLCamera& camera);
00126 void markOccluder(LLSpatialGroup* group);
00127 void doOcclusion(LLCamera& camera);
00128 void markNotCulled(LLSpatialGroup* group, LLCamera &camera);
00129 void markMoved(LLDrawable *drawablep, BOOL damped_motion = FALSE);
00130 void markShift(LLDrawable *drawablep);
00131 void markTextured(LLDrawable *drawablep);
00132 void markRebuild(LLDrawable *drawablep, LLDrawable::EDrawableFlags flag = LLDrawable::REBUILD_ALL, BOOL priority = FALSE);
00133
00134
00135 LLViewerObject* pickObject(const LLVector3 &start, const LLVector3 &end, LLVector3 &collision);
00136
00137
00138 void dirtyPoolObjectTextures(const std::set<LLViewerImage*>& textures);
00139
00140 void resetDrawOrders();
00141
00142 U32 addObject(LLViewerObject *obj);
00143
00144 void enableShadows(const BOOL enable_shadows);
00145
00146
00147
00148 S32 setLightingDetail(S32 level);
00149 S32 getLightingDetail() const { return mLightingDetail; }
00150 S32 getMaxLightingDetail() const;
00151
00152 void setUseVertexShaders(BOOL use_shaders);
00153 BOOL getUseVertexShaders() const { return mVertexShadersEnabled; }
00154 BOOL canUseVertexShaders();
00155 BOOL canUseWindLightShaders() const;
00156 BOOL canUseWindLightShadersOnObjects() const;
00157
00158
00159 void resetFrameStats();
00160
00161 void updateMoveDampedAsync(LLDrawable* drawablep);
00162 void updateMoveNormalAsync(LLDrawable* drawablep);
00163 void updateMovedList(LLDrawable::drawable_vector_t& move_list);
00164 void updateMove();
00165 void updateCull(LLCamera& camera, LLCullResult& result, S32 water_clip = 0);
00166 void updateGeom(F32 max_dtime);
00167
00168
00169 static F32 calcPixelArea(LLVector3 center, LLVector3 size, LLCamera& camera);
00170
00171 void stateSort(LLCamera& camera, LLCullResult& result);
00172 void stateSort(LLSpatialGroup* group, LLCamera& camera);
00173 void stateSort(LLSpatialBridge* bridge, LLCamera& camera);
00174 void stateSort(LLDrawable* drawablep, LLCamera& camera);
00175 void postSort(LLCamera& camera);
00176 void forAllVisibleDrawables(void (*func)(LLDrawable*));
00177
00178 void renderObjects(U32 type, U32 mask, BOOL texture = TRUE);
00179 void renderGroups(LLRenderPass* pass, U32 type, U32 mask, BOOL texture);
00180
00181 void grabReferences(LLCullResult& result);
00182
00183 void renderGeom(LLCamera& camera, BOOL forceVBOUpdate = FALSE);
00184 void renderGeomDeferred();
00185
00186 void processImagery(LLCamera& camera);
00187 void generateWaterReflection(LLCamera& camera);
00188 void renderHighlights();
00189 void renderDebug();
00190
00191 void renderForSelect(std::set<LLViewerObject*>& objects);
00192 void renderFaceForUVSelect(LLFace* facep);
00193 void rebuildPools();
00194
00195 void findReferences(LLDrawable *drawablep);
00196 BOOL verify();
00197
00198 S32 getLightCount() const { return mLights.size(); }
00199
00200 void calcNearbyLights(LLCamera& camera);
00201 void setupHWLights(LLDrawPool* pool);
00202 void setupAvatarLights(BOOL for_edit = FALSE);
00203 void enableLights(U32 mask);
00204 void enableLightsStatic();
00205 void enableLightsDynamic();
00206 void enableLightsAvatar();
00207 void enableLightsAvatarEdit(const LLColor4& color);
00208 void enableLightsFullbright(const LLColor4& color);
00209 void disableLights();
00210
00211 void shiftObjects(const LLVector3 &offset);
00212
00213 void setLight(LLDrawable *drawablep, BOOL is_light);
00214 void setActive(LLDrawable *drawablep, BOOL active);
00215
00216 BOOL hasRenderBatches(const U32 type) const;
00217 LLCullResult::drawinfo_list_t::iterator beginRenderMap(U32 type);
00218 LLCullResult::drawinfo_list_t::iterator endRenderMap(U32 type);
00219 LLCullResult::sg_list_t::iterator beginAlphaGroups();
00220 LLCullResult::sg_list_t::iterator endAlphaGroups();
00221
00222 void addTrianglesDrawn(S32 count);
00223 BOOL hasRenderType(const U32 type) const { return (type && (mRenderTypeMask & (1<<type))) ? TRUE : FALSE; }
00224 BOOL hasRenderDebugFeatureMask(const U32 mask) const { return (mRenderDebugFeatureMask & mask) ? TRUE : FALSE; }
00225 BOOL hasRenderDebugMask(const U32 mask) const { return (mRenderDebugMask & mask) ? TRUE : FALSE; }
00226 void setRenderTypeMask(const U32 mask) { mRenderTypeMask = mask; }
00227 U32 getRenderTypeMask() const { return mRenderTypeMask; }
00228 static void toggleRenderType(U32 type);
00229
00230
00231 static BOOL hasRenderTypeControl(void* data);
00232 static void toggleRenderDebug(void* data);
00233 static void toggleRenderDebugFeature(void* data);
00234 static void toggleRenderTypeControl(void* data);
00235 static BOOL toggleRenderTypeControlNegated(void* data);
00236 static BOOL toggleRenderDebugControl(void* data);
00237 static BOOL toggleRenderDebugFeatureControl(void* data);
00238
00239 static void setRenderParticleBeacons(BOOL val);
00240 static void toggleRenderParticleBeacons(void* data);
00241 static BOOL getRenderParticleBeacons(void* data);
00242
00243 static void setRenderSoundBeacons(BOOL val);
00244 static void toggleRenderSoundBeacons(void* data);
00245 static BOOL getRenderSoundBeacons(void* data);
00246
00247 static void setRenderPhysicalBeacons(BOOL val);
00248 static void toggleRenderPhysicalBeacons(void* data);
00249 static BOOL getRenderPhysicalBeacons(void* data);
00250
00251 static void setRenderScriptedBeacons(BOOL val);
00252 static void toggleRenderScriptedBeacons(void* data);
00253 static BOOL getRenderScriptedBeacons(void* data);
00254
00255 static void setRenderScriptedTouchBeacons(BOOL val);
00256 static void toggleRenderScriptedTouchBeacons(void* data);
00257 static BOOL getRenderScriptedTouchBeacons(void* data);
00258
00259 static void setRenderBeacons(BOOL val);
00260 static void toggleRenderBeacons(void* data);
00261 static BOOL getRenderBeacons(void* data);
00262
00263 static void setRenderHighlights(BOOL val);
00264 static void toggleRenderHighlights(void* data);
00265 static BOOL getRenderHighlights(void* data);
00266
00267 static BOOL getProcessBeacons(void* data);
00268
00269 private:
00270 void unloadShaders();
00271 void addToQuickLookup( LLDrawPool* new_poolp );
00272 void removeFromQuickLookup( LLDrawPool* poolp );
00273 BOOL updateDrawableGeom(LLDrawable* drawable, BOOL priority);
00274 void assertInitializedDoError();
00275 bool assertInitialized() { const bool is_init = isInit(); if (!is_init) assertInitializedDoError(); return is_init; };
00276
00277 public:
00278 enum {GPU_CLASS_MAX = 3 };
00279
00280 enum LLRenderTypeMask
00281 {
00282
00283 RENDER_TYPE_SKY = LLDrawPool::POOL_SKY,
00284 RENDER_TYPE_WL_SKY = LLDrawPool::POOL_WL_SKY,
00285 RENDER_TYPE_GROUND = LLDrawPool::POOL_GROUND,
00286 RENDER_TYPE_TERRAIN = LLDrawPool::POOL_TERRAIN,
00287 RENDER_TYPE_SIMPLE = LLDrawPool::POOL_SIMPLE,
00288 RENDER_TYPE_BUMP = LLDrawPool::POOL_BUMP,
00289 RENDER_TYPE_AVATAR = LLDrawPool::POOL_AVATAR,
00290 RENDER_TYPE_TREE = LLDrawPool::POOL_TREE,
00291 RENDER_TYPE_INVISIBLE = LLDrawPool::POOL_INVISIBLE,
00292 RENDER_TYPE_WATER = LLDrawPool::POOL_WATER,
00293 RENDER_TYPE_ALPHA = LLDrawPool::POOL_ALPHA,
00294 RENDER_TYPE_GLOW = LLDrawPool::POOL_GLOW,
00295
00296
00297 RENDER_TYPE_HUD = LLDrawPool::NUM_POOL_TYPES,
00298 RENDER_TYPE_VOLUME,
00299 RENDER_TYPE_GRASS,
00300 RENDER_TYPE_PARTICLES,
00301 RENDER_TYPE_CLOUDS,
00302 };
00303
00304 enum LLRenderDebugFeatureMask
00305 {
00306 RENDER_DEBUG_FEATURE_UI = 0x0001,
00307 RENDER_DEBUG_FEATURE_SELECTED = 0x0002,
00308 RENDER_DEBUG_FEATURE_HIGHLIGHTED = 0x0004,
00309 RENDER_DEBUG_FEATURE_DYNAMIC_TEXTURES = 0x0008,
00310
00311 RENDER_DEBUG_FEATURE_FLEXIBLE = 0x0010,
00312 RENDER_DEBUG_FEATURE_FOG = 0x0020,
00313 RENDER_DEBUG_FEATURE_PALETTE = 0x0040,
00314 RENDER_DEBUG_FEATURE_FR_INFO = 0x0080,
00315 RENDER_DEBUG_FEATURE_FOOT_SHADOWS = 0x0100,
00316 };
00317
00318 enum LLRenderDebugMask
00319 {
00320 RENDER_DEBUG_COMPOSITION = 0x000020,
00321 RENDER_DEBUG_VERIFY = 0x000080,
00322 RENDER_DEBUG_BBOXES = 0x000200,
00323 RENDER_DEBUG_OCTREE = 0x000400,
00324 RENDER_DEBUG_PICKING = 0x000800,
00325 RENDER_DEBUG_OCCLUSION = 0x001000,
00326 RENDER_DEBUG_POINTS = 0x002000,
00327 RENDER_DEBUG_TEXTURE_PRIORITY = 0x004000,
00328 RENDER_DEBUG_TEXTURE_AREA = 0x008000,
00329 RENDER_DEBUG_FACE_AREA = 0x010000,
00330 RENDER_DEBUG_PARTICLES = 0x020000,
00331 RENDER_DEBUG_GLOW = 0x040000,
00332 RENDER_DEBUG_TEXTURE_ANIM = 0x080000,
00333 RENDER_DEBUG_LIGHTS = 0x100000,
00334 RENDER_DEBUG_BATCH_SIZE = 0x200000,
00335 RENDER_DEBUG_SHAME = 0x400000,
00336 };
00337
00338 public:
00339
00340 LLSpatialPartition* getSpatialPartition(LLViewerObject* vobj);
00341
00342 void updateCamera(BOOL reset = FALSE);
00343
00344 LLVector3 mFlyCamPosition;
00345 LLQuaternion mFlyCamRotation;
00346
00347 BOOL mBackfaceCull;
00348 S32 mBatchCount;
00349 S32 mMatrixOpCount;
00350 S32 mTextureMatrixOps;
00351 S32 mMaxBatchSize;
00352 S32 mMinBatchSize;
00353 S32 mMeanBatchSize;
00354 S32 mTrianglesDrawn;
00355 S32 mNumVisibleNodes;
00356 LLStat mTrianglesDrawnStat;
00357 S32 mVerticesRelit;
00358
00359 S32 mLightingChanges;
00360 S32 mGeometryChanges;
00361
00362 S32 mNumVisibleFaces;
00363
00364 static S32 sCompiles;
00365
00366 static BOOL sShowHUDAttachments;
00367 static S32 sUseOcclusion;
00368 static BOOL sFastAlpha;
00369 static BOOL sDisableShaders;
00370 static BOOL sRenderBump;
00371 static BOOL sUseFBO;
00372 static BOOL sUseFarClip;
00373 static BOOL sSkipUpdate;
00374 static BOOL sDynamicReflections;
00375 static BOOL sWaterReflections;
00376 static BOOL sDynamicLOD;
00377 static BOOL sReflectionRender;
00378 static BOOL sImpostorRender;
00379 static BOOL sUnderWaterRender;
00380 static BOOL sRenderGlow;
00381 static BOOL sTextureBindTest;
00382 static BOOL sRenderFrameTest;
00383
00384
00385 LLRenderTarget mScreen;
00386
00387 LLVector2 mScreenScale;
00388
00389
00390 LLRenderTarget mWaterRef;
00391
00392
00393 LLRenderTarget mWaterDis;
00394
00395
00396 LLRenderTarget mGlow[3];
00397
00398
00399
00400
00401
00402
00403 LLPointer<LLCubeMap> mCubeBuffer;
00404
00405
00406 GLuint mBlurCubeBuffer[3];
00407 GLuint mBlurCubeTexture[3];
00408
00409
00410 GLuint mCubeFrameBuffer;
00411
00412
00413 GLuint mCubeDepth;
00414
00415
00416 LLColor4 mSunDiffuse;
00417 LLVector3 mSunDir;
00418
00419 BOOL mInitialized;
00420 BOOL mVertexShadersEnabled;
00421 S32 mVertexShadersLoaded;
00422
00423 protected:
00424 U32 mRenderTypeMask;
00425 U32 mRenderDebugFeatureMask;
00426 U32 mRenderDebugMask;
00427
00428 U32 mOldRenderDebugMask;
00429
00431
00432
00433 LLDrawable::drawable_vector_t mMovedList;
00434 LLDrawable::drawable_vector_t mMovedBridge;
00435 LLDrawable::drawable_vector_t mShiftList;
00436
00438
00439
00440 struct Light
00441 {
00442 Light(LLDrawable* ptr, F32 d, F32 f = 0.0f)
00443 : drawable(ptr),
00444 dist(d),
00445 fade(f)
00446 {}
00447 LLPointer<LLDrawable> drawable;
00448 F32 dist;
00449 F32 fade;
00450 struct compare
00451 {
00452 bool operator()(const Light& a, const Light& b) const
00453 {
00454 if ( a.dist < b.dist )
00455 return true;
00456 else if ( a.dist > b.dist )
00457 return false;
00458 else
00459 return a.drawable < b.drawable;
00460 }
00461 };
00462 };
00463 typedef std::set< Light, Light::compare > light_set_t;
00464
00465 LLDrawable::drawable_set_t mLights;
00466 light_set_t mNearbyLights;
00467 LLColor4 mHWLightColors[8];
00468
00470
00471
00472
00473 LLDrawable::drawable_list_t mBuildQ1;
00474 LLDrawable::drawable_list_t mBuildQ2;
00475
00476 LLDrawable::drawable_set_t mActiveQ;
00477
00478 LLDrawable::drawable_set_t mRetexturedList;
00479
00481
00482
00483
00484
00485 struct compare_pools
00486 {
00487 bool operator()(const LLDrawPool* a, const LLDrawPool* b) const
00488 {
00489 if (!a)
00490 return true;
00491 else if (!b)
00492 return false;
00493 else
00494 {
00495 S32 atype = a->getType();
00496 S32 btype = b->getType();
00497 if (atype < btype)
00498 return true;
00499 else if (atype > btype)
00500 return false;
00501 else
00502 return a->getId() < b->getId();
00503 }
00504 }
00505 };
00506 typedef std::set<LLDrawPool*, compare_pools > pool_set_t;
00507 pool_set_t mPools;
00508 LLDrawPool* mLastRebuildPool;
00509
00510
00511 std::map<uintptr_t, LLDrawPool*> mTerrainPools;
00512 std::map<uintptr_t, LLDrawPool*> mTreePools;
00513 LLDrawPool* mAlphaPool;
00514 LLDrawPool* mSkyPool;
00515 LLDrawPool* mTerrainPool;
00516 LLDrawPool* mWaterPool;
00517 LLDrawPool* mGroundPool;
00518 LLRenderPass* mSimplePool;
00519 LLDrawPool* mInvisiblePool;
00520 LLDrawPool* mGlowPool;
00521 LLDrawPool* mBumpPool;
00522 LLDrawPool* mWLSkyPool;
00523
00524
00525 public:
00526 std::vector<LLFace*> mHighlightFaces;
00527 protected:
00528 std::vector<LLFace*> mSelectedFaces;
00529
00530 LLPointer<LLViewerImage> mFaceSelectImagep;
00531 LLPointer<LLViewerImage> mBloomImagep;
00532 LLPointer<LLViewerImage> mBloomImage2p;
00533
00534 U32 mLightMask;
00535 U32 mLightMovingMask;
00536 S32 mLightingDetail;
00537
00538 static BOOL sRenderPhysicalBeacons;
00539 static BOOL sRenderScriptedTouchBeacons;
00540 static BOOL sRenderScriptedBeacons;
00541 static BOOL sRenderParticleBeacons;
00542 static BOOL sRenderSoundBeacons;
00543 public:
00544 static BOOL sRenderBeacons;
00545 static BOOL sRenderHighlight;
00546 static BOOL sRenderProcessBeacons;
00547 };
00548
00549 void render_bbox(const LLVector3 &min, const LLVector3 &max);
00550
00551 extern LLPipeline gPipeline;
00552 extern BOOL gRenderForSelect;
00553 extern BOOL gDebugPipeline;
00554 extern const LLMatrix4* gGLLastMatrix;
00555
00556 #endif