OgreTerrainQuadTreeNode.h

Go to the documentation of this file.
00001 /*
00002 -----------------------------------------------------------------------------
00003 This source file is part of OGRE
00004 (Object-oriented Graphics Rendering Engine)
00005 For the latest info, see http://www.ogre3d.org/
00006 
00007 Copyright (c) 2000-2012 Torus Knot Software Ltd
00008 
00009 Permission is hereby granted, free of charge, to any person obtaining a copy
00010 of this software and associated documentation files (the "Software"), to deal
00011 in the Software without restriction, including without limitation the rights
00012 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
00013 copies of the Software, and to permit persons to whom the Software is
00014 furnished to do so, subject to the following conditions:
00015 
00016 The above copyright notice and this permission notice shall be included in
00017 all copies or substantial portions of the Software.
00018 
00019 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
00020 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
00021 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
00022 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
00023 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
00024 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
00025 THE SOFTWARE.
00026 -----------------------------------------------------------------------------
00027 */
00028 
00029 #ifndef __Ogre_TerrainQuadTreeNode_H__
00030 #define __Ogre_TerrainQuadTreeNode_H__
00031 
00032 #include "OgreTerrainPrerequisites.h"
00033 #include "OgreCommon.h"
00034 #include "OgreHardwareIndexBuffer.h"
00035 #include "OgreMovableObject.h"
00036 #include "OgreRenderable.h"
00037 
00038 
00039 
00040 namespace Ogre
00041 {
00042     class HardwareVertexBufferSharedPtr;
00043     
00085     class _OgreTerrainExport TerrainQuadTreeNode : public TerrainAlloc
00086     {
00087     public:
00097         TerrainQuadTreeNode(Terrain* terrain, TerrainQuadTreeNode* parent, 
00098             uint16 xoff, uint16 yoff, uint16 size, uint16 lod, uint16 depth, uint16 quadrant);
00099         virtual ~TerrainQuadTreeNode();
00100 
00102         uint16 getXOffset() const { return mOffsetX; }
00104         uint16 getYOffset() const { return mOffsetY; }
00106         bool isLeaf() const;
00108         uint16 getBaseLod() const { return mBaseLod; }
00110         uint16 getLodCount() const;
00112         TerrainQuadTreeNode* getChild(unsigned short child) const;
00114         TerrainQuadTreeNode* getParent() const;
00116         Terrain* getTerrain() const;
00117 
00119         void prepare();
00121         void prepare(StreamSerialiser& stream);
00123         void load();
00125         void unload();
00127         void unprepare();
00129         void save(StreamSerialiser& stream);
00130 
00131         struct _OgreTerrainExport LodLevel : public TerrainAlloc
00132         {
00134             uint16 batchSize;
00136             IndexData* gpuIndexData;
00138             Real maxHeightDelta;
00140             Real calcMaxHeightDelta;
00142             Real lastTransitionDist;
00144             Real lastCFactor;
00145 
00146             LodLevel() : gpuIndexData(0), maxHeightDelta(0), calcMaxHeightDelta(0),
00147                 lastTransitionDist(0), lastCFactor(0) {}
00148         };
00149         typedef vector<LodLevel*>::type LodLevelList;
00150 
00156         const LodLevel* getLodLevel(uint16 lod);
00157 
00162         void preDeltaCalculation(const Rect& rect);
00163 
00165         void notifyDelta(uint16 x, uint16 y, uint16 lod, Real delta);
00166 
00169         void postDeltaCalculation(const Rect& rect);
00170 
00174         void finaliseDeltaValues(const Rect& rect);
00175 
00182         void assignVertexData(uint16 treeDepthStart, uint16 treeDepthEnd, uint16 resolution, uint sz);
00183 
00188         void useAncestorVertexData(TerrainQuadTreeNode* owner, uint16 treeDepthEnd, uint16 resolution);
00189 
00192         void updateVertexData(bool positions, bool deltas, const Rect& rect, bool cpuData);
00193 
00194 
00195 
00202         void mergeIntoBounds(long x, long y, const Vector3& pos);
00206         void resetBounds(const Rect& rect);
00207         
00212         bool rectIntersectsNode(const Rect& rect);
00217         bool rectContainsNode(const Rect& rect);
00222         bool pointIntersectsNode(long x, long y);
00223 
00225         const AxisAlignedBox& getAABB() const;
00227         Real getBoundingRadius() const;
00229         const Vector3& getLocalCentre() const { return mLocalCentre; }
00231         Real getMinHeight() const;
00233         Real getMaxHeight() const;
00234 
00240         bool calculateCurrentLod(const Camera* cam, Real cFactor);
00241 
00243         int getCurrentLod() const { return mCurrentLod; }
00245         bool isRenderedAtCurrentLod() const;
00247         bool isSelfOrChildRenderedAtCurrentLod() const;
00249         void setCurrentLod(int lod);
00251         float getLodTransition() const { return mLodTransition; }
00253         void setLodTransition(float t);
00254 
00256         static unsigned short POSITION_BUFFER;
00258         static unsigned short DELTA_BUFFER;
00259 
00261         Renderable *_getRenderable();
00262     protected:
00263         Terrain* mTerrain;
00264         TerrainQuadTreeNode* mParent;
00265         TerrainQuadTreeNode* mChildren[4];
00266         LodLevelList mLodLevels;
00267 
00268         uint16 mOffsetX, mOffsetY;
00269         uint16 mBoundaryX, mBoundaryY;
00271         uint16 mSize;
00272         uint16 mBaseLod;
00273         uint16 mDepth;
00274         uint16 mQuadrant;
00275         Vector3 mLocalCentre; // relative to terrain centre
00276         AxisAlignedBox mAABB; //relative to mLocalCentre
00277         Real mBoundingRadius; //relative to mLocalCentre
00278         int mCurrentLod; // -1 = none (do not render)
00279         unsigned short mMaterialLodIndex;
00280         float mLodTransition; // 0-1 transition to lower LOD
00282         TerrainQuadTreeNode* mChildWithMaxHeightDelta;
00283         bool mSelfOrChildRendered;
00284 
00285         struct VertexDataRecord : public TerrainAlloc
00286         {
00287             VertexData* cpuVertexData;
00288             VertexData* gpuVertexData;
00290             uint16 resolution;
00292             uint16 size;
00294             uint16 treeLevels;
00296             uint16 numSkirtRowsCols;
00298             uint16 skirtRowColSkip;
00300             bool gpuVertexDataDirty;
00301 
00302             VertexDataRecord(uint16 res, uint16 sz, uint16 lvls) 
00303                 : cpuVertexData(0), gpuVertexData(0), resolution(res), size(sz),
00304                 treeLevels(lvls), gpuVertexDataDirty(false) {}
00305         };
00306         
00307         TerrainQuadTreeNode* mNodeWithVertexData;
00308         VertexDataRecord* mVertexDataRecord;
00309 
00329         class _OgreTerrainExport Movable : public MovableObject
00330         {
00331         protected:
00332             TerrainQuadTreeNode* mParent;
00333         public:
00334             Movable(TerrainQuadTreeNode* parent);
00335             ~Movable();
00336             
00337             // necessary overrides
00338             const String& getMovableType(void) const;
00339             const AxisAlignedBox& getBoundingBox(void) const;
00340             Real getBoundingRadius(void) const;
00341             void _updateRenderQueue(RenderQueue* queue);
00342             void visitRenderables(Renderable::Visitor* visitor,  bool debugRenderables = false);
00343             bool isVisible(void) const;
00344             uint32 getVisibilityFlags(void) const;
00345             uint32 getQueryFlags(void) const;
00346             bool getCastShadows(void) const;
00347 
00348         };
00349         Movable* mMovable;
00350         friend class Movable;
00351         SceneNode* mLocalNode;
00352 
00354         class _OgreTerrainExport Rend : public Renderable, public TerrainAlloc
00355         {
00356         protected:
00357             TerrainQuadTreeNode* mParent;
00358         public:
00359             Rend(TerrainQuadTreeNode* parent);
00360             ~Rend();
00361 
00362             const MaterialPtr& getMaterial(void) const;
00363             Technique* getTechnique(void) const;
00364             void getRenderOperation(RenderOperation& op);
00365             void getWorldTransforms(Matrix4* xform) const;
00366             Real getSquaredViewDepth(const Camera* cam) const;
00367             const LightList& getLights(void) const;
00368             bool getCastsShadows(void) const;
00369 
00370         };
00371         Rend* mRend;
00372         friend class Rend;
00373 
00374         // actual implementation of MovableObject methods
00375         void updateRenderQueue(RenderQueue* queue);
00376         void visitRenderables(Renderable::Visitor* visitor,  bool debugRenderables = false);
00377         // actual implementations of Renderable methods
00378         const MaterialPtr& getMaterial(void) const;
00379         Technique* getTechnique(void) const;
00380         void getRenderOperation(RenderOperation& op);
00381         void getWorldTransforms(Matrix4* xform) const;
00382         Real getSquaredViewDepth(const Camera* cam) const;
00383         const LightList& getLights(void) const;
00384         bool getCastsShadows(void) const;
00385 
00386 
00387         const VertexDataRecord* getVertexDataRecord() const;
00388         void createCpuVertexData();
00389         /* Update the vertex buffers - the rect in question is relative to the whole terrain, 
00390             not the local vertex data (which may use a subset)
00391         */
00392         void updateVertexBuffer(HardwareVertexBufferSharedPtr& posbuf, HardwareVertexBufferSharedPtr& deltabuf, const Rect& rect);
00393         void destroyCpuVertexData();
00394 
00395         void createGpuVertexData();
00396         void destroyGpuVertexData();
00397         void updateGpuVertexData();
00398         void createGpuIndexData();
00399         void destroyGpuIndexData();
00400 
00401         void populateIndexData(uint16 batchSize, IndexData* destData);
00402         void writePosVertex(bool compress, uint16 x, uint16 y, float height, const Vector3& pos, float uvScale, float** ppPos);
00403         void writeDeltaVertex(bool compress, uint16 x, uint16 y, float delta, float deltaThresh, float** ppDelta);
00404         
00405         uint16 calcSkirtVertexIndex(uint16 mainIndex, bool isCol);
00406 
00407     };
00408 
00411 }
00412 
00413 #endif

Copyright © 2012 Torus Knot Software Ltd
Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
Last modified Fri May 25 23:36:28 2012