pipeline.h

Go to the documentation of this file.
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); // Shouldn't be defined here!
00067 bool LLRayAABB(const LLVector3 &center, 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);    // Only to be used by LLDrawPool classes for splitting pools!
00118         void             removePool( LLDrawPool* poolp );
00119 
00120         void             allocDrawable(LLViewerObject *obj);
00121 
00122         void             unlinkDrawable(LLDrawable*);
00123 
00124         // Object related methods
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         //get the object between start and end that's closest to start.  Return the point of collision in collision.
00135         LLViewerObject* pickObject(const LLVector3 &start, const LLVector3 &end, LLVector3 &collision);
00136 
00137         // Something about these textures has changed.  Dirty them.
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 //      void            setLocalLighting(const BOOL local_lighting);
00147 //      BOOL            isLocalLightingEnabled() const;
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         // phases
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);  //if water_clip is 0, ignore water plane, 1, cull to above plane, -1, cull to below plane
00166         void updateGeom(F32 max_dtime);
00167 
00168         //calculate pixel area of given box from vantage point of given camera
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(); // Rebuild pools
00194 
00195         void findReferences(LLDrawable *drawablep);     // Find the lists which have references to this object
00196         BOOL verify();                                          // Verify that all data in the pipeline is "correct"
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         // For UI control of render features
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                 // Following are pool types (some are also object types)
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                 // Following are object types (only used in drawable mRenderType)
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 //              RENDER_DEBUG_FEATURE_HW_LIGHTING                = 0x0010,
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;  // 0 = no occlusion, 1 = read only, 2 = read/write
00368         static BOOL                             sFastAlpha;
00369         static BOOL                             sDisableShaders; // if TRUE, rendering will be done without shaders
00370         static BOOL                             sRenderBump;
00371         static BOOL                             sUseFBO;
00372         static BOOL                             sUseFarClip;
00373         static BOOL                             sSkipUpdate; //skip lod updates
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         //screen texture
00385         LLRenderTarget                  mScreen;
00386         
00387         LLVector2                               mScreenScale;
00388 
00389         //water reflection texture
00390         LLRenderTarget                          mWaterRef;
00391 
00392         //water distortion texture (refraction)
00393         LLRenderTarget                          mWaterDis;
00394 
00395         //texture for making the glow
00396         LLRenderTarget                          mGlow[3];
00397         
00398         //framebuffer objects for off-screen scratch space
00399         //GLuint                                        mFramebuffer[4];
00400         //GLuint                                        mDepthbuffer[2];
00401 
00402         //dynamic cube map scratch space
00403         LLPointer<LLCubeMap>    mCubeBuffer;
00404 
00405         //cube map anti-aliasing buffers
00406         GLuint                                  mBlurCubeBuffer[3];
00407         GLuint                                  mBlurCubeTexture[3];
00408 
00409         //frambuffer object for rendering dynamic cube maps
00410         GLuint                                  mCubeFrameBuffer;
00411         
00412         //depth buffer object for rendering dynamic cube maps
00413         GLuint                                  mCubeDepth;
00414 
00415         
00416         LLColor4                                mSunDiffuse;
00417         LLVector3                               mSunDir;
00418 
00419         BOOL                                    mInitialized;
00420         BOOL                                    mVertexShadersEnabled;
00421         S32                                             mVertexShadersLoaded; // 0 = no, 1 = yes, -1 = failed
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; // lights near camera
00467         LLColor4                                                mHWLightColors[8];
00468         
00470         //
00471         // Different queues of drawables being processed.
00472         //
00473         LLDrawable::drawable_list_t     mBuildQ1; // priority
00474         LLDrawable::drawable_list_t     mBuildQ2; // non-priority
00475                 
00476         LLDrawable::drawable_set_t              mActiveQ;
00477         
00478         LLDrawable::drawable_set_t              mRetexturedList;
00479 
00481         //
00482         // Draw pools are responsible for storing all rendered data,
00483         // and performing the actual rendering of objects.
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         // For quick-lookups into mPools (mapped by texture pointer)
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         // Note: no need to keep an quick-lookup to avatar pools, since there's only one per avatar
00524         
00525 public:
00526         std::vector<LLFace*>            mHighlightFaces;        // highlight faces on physical objects
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

Generated on Fri May 16 08:34:28 2008 for SecondLife by  doxygen 1.5.5