OgreTerrainGroup.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_TerrainGroup_H__
00030 #define __Ogre_TerrainGroup_H__
00031 
00032 #include "OgreTerrainPrerequisites.h"
00033 #include "OgreTerrain.h"
00034 #include "OgreWorkQueue.h"
00035 #include "OgreIteratorWrappers.h"
00036 
00037 namespace Ogre
00038 {
00069     class _OgreTerrainExport TerrainGroup : public WorkQueue::RequestHandler, 
00070         public WorkQueue::ResponseHandler, public TerrainAlloc
00071     {
00072     public:
00079         TerrainGroup(SceneManager* sm, Terrain::Alignment align, uint16 terrainSize, 
00080             Real terrainWorldSize);
00086         TerrainGroup(SceneManager* sm);
00087         virtual ~TerrainGroup();
00088 
00106         virtual Terrain::ImportData& getDefaultImportSettings() { return mDefaultImportData; }
00107 
00110         virtual void setOrigin(const Vector3& pos);
00111 
00114         virtual const Vector3& getOrigin() const { return mOrigin; }
00115 
00118         virtual Terrain::Alignment getAlignment() const { return mAlignment; }
00119 
00122         virtual Real getTerrainWorldSize() const { return mTerrainWorldSize; }
00127         virtual void setTerrainWorldSize(Real newWorldSize);
00130         virtual uint16 getTerrainSize() const { return mTerrainSize; }
00136         virtual void setTerrainSize(uint16 newTerrainSize);
00139         virtual SceneManager* getSceneManager() const { return mSceneManager; }
00140 
00150         void setFilenameConvention(const String& prefix, const String& extension);
00152         void setFilenamePrefix(const String& prefix);
00154         void setFilenameExtension(const String& extension);
00156         const String& getFilenamePrefix() const { return mFilenamePrefix; }
00158         const String& getFilenameExtension() const { return mFilenameExtension; }
00159 
00161         void setResourceGroup(const String& grp) { mResourceGroup = grp; }
00163         const String& getResourceGroup() const { return mResourceGroup; }
00177         virtual void defineTerrain(long x, long y);
00178 
00189         virtual void defineTerrain(long x, long y, float constantHeight);
00190 
00201         virtual void defineTerrain(long x, long y, const Terrain::ImportData* importData);
00202 
00215         virtual void defineTerrain(long x, long y, const Image* img, const Terrain::LayerInstanceList* layers = 0);
00216 
00229         virtual void defineTerrain(long x, long y, const float* pFloat, const Terrain::LayerInstanceList* layers = 0);
00230 
00241         virtual void defineTerrain(long x, long y, const String& filename);
00242 
00243 
00248         virtual void loadAllTerrains(bool synchronous = false);
00249         
00256         virtual void loadTerrain(long x, long y, bool synchronous = false);
00257         
00270         virtual void unloadTerrain(long x, long y);
00271 
00278         virtual void removeTerrain(long x, long y);
00279 
00282         void removeAllTerrains();
00283 
00298         void saveAllTerrains(bool onlyIfModified, bool replaceManualFilenames = true);
00299         
00302         struct _OgreTerrainExport TerrainSlotDefinition
00303         {
00305             String filename;
00307             Terrain::ImportData* importData;
00308 
00309             TerrainSlotDefinition() :importData(0) {}
00310             ~TerrainSlotDefinition();
00311 
00313             void useImportData();
00315             void useFilename();
00317             void freeImportData();
00318         };
00319 
00321         struct _OgreTerrainExport TerrainSlot : public TerrainAlloc
00322         {
00324             long x, y;
00326             TerrainSlotDefinition def;
00328             Terrain* instance;
00329 
00330             TerrainSlot(long _x, long _y) : x(_x), y(_y), instance(0) {}
00331             ~TerrainSlot();
00332             void freeInstance();
00333         };
00334         
00344         virtual TerrainSlotDefinition* getTerrainDefinition(long x, long y) const;
00345         
00351         virtual Terrain* getTerrain(long x, long y) const;
00352 
00357         void freeTemporaryResources();
00358 
00362         void update(bool synchronous = false);
00363 
00367         void updateGeometry();
00368 
00372         void updateDerivedData(bool synchronous = false, uint8 typeMask = 0xFF);
00373         
00376         struct _OgreTerrainExport RayResult
00377         {
00379             bool hit;
00381             Terrain* terrain;
00383             Vector3 position;
00384 
00385             RayResult(bool _hit, Terrain* _terrain, const Vector3& _pos)
00386                 : hit(_hit), terrain(_terrain), position(_pos) {}
00387         };
00388         
00396         float getHeightAtWorldPosition(Real x, Real y, Real z, Terrain** ppTerrain = 0);
00397 
00405         float getHeightAtWorldPosition(const Vector3& pos, Terrain** ppTerrain = 0);
00406 
00416         RayResult rayIntersects(const Ray& ray, Real distanceLimit = 0) const; 
00417         
00418         typedef vector<Terrain*>::type TerrainList; 
00428         void boxIntersects(const AxisAlignedBox& box, TerrainList* resultList) const;
00438         void sphereIntersects(const Sphere& sphere, TerrainList* resultList) const;
00439         
00444         void convertWorldPositionToTerrainSlot(const Vector3& pos, long *x, long *y) const;
00445 
00450         void convertTerrainSlotToWorldPosition(long x, long y, Vector3* pos) const;
00451         
00455         bool isDerivedDataUpdateInProgress() const;
00456 
00458         typedef map<uint32, TerrainSlot*>::type TerrainSlotMap;
00459         typedef MapIterator<TerrainSlotMap> TerrainIterator;
00460         typedef ConstMapIterator<TerrainSlotMap> ConstTerrainIterator;
00461 
00463         TerrainIterator getTerrainIterator();
00465         ConstTerrainIterator getTerrainIterator() const;
00466 
00468         bool canHandleRequest(const WorkQueue::Request* req, const WorkQueue* srcQ);
00470         WorkQueue::Response* handleRequest(const WorkQueue::Request* req, const WorkQueue* srcQ);
00472         bool canHandleResponse(const WorkQueue::Response* res, const WorkQueue* srcQ);
00474         void handleResponse(const WorkQueue::Response* res, const WorkQueue* srcQ);
00475 
00477         uint32 packIndex(long x, long y) const;
00478         
00480         void unpackIndex(uint32 key, long *x, long *y);
00481 
00483         String generateFilename(long x, long y) const;
00484 
00487         void saveGroupDefinition(const String& filename);
00490         void saveGroupDefinition(StreamSerialiser& stream);
00493         void loadGroupDefinition(const String& filename);
00496         void loadGroupDefinition(StreamSerialiser& stream);
00497 
00498 
00499         static const uint16 WORKQUEUE_LOAD_REQUEST;
00500         static const uint32 CHUNK_ID;
00501         static const uint16 CHUNK_VERSION;
00502 
00503     protected:
00504         SceneManager *mSceneManager;
00505         Terrain::Alignment mAlignment;
00506         uint16 mTerrainSize;
00507         Real mTerrainWorldSize;
00508         Terrain::ImportData mDefaultImportData;
00509         Vector3 mOrigin;
00510         TerrainSlotMap mTerrainSlots;
00511         uint16 mWorkQueueChannel;
00512         String mFilenamePrefix;
00513         String mFilenameExtension;
00514         String mResourceGroup;
00515         Terrain::DefaultGpuBufferAllocator mBufferAllocator;
00516         
00518         Vector3 getTerrainSlotPosition(long x, long y);
00520         TerrainSlot* getTerrainSlot(long x, long y, bool createIfMissing);
00521         TerrainSlot* getTerrainSlot(long x, long y) const;
00522         void connectNeighbour(TerrainSlot* slot, long offsetx, long offsety);
00523 
00524         void loadTerrainImpl(TerrainSlot* slot, bool synchronous);
00525 
00527         struct LoadRequest
00528         {
00529             TerrainSlot* slot;
00530             TerrainGroup* origin;
00531             _OgreTerrainExport friend std::ostream& operator<<(std::ostream& o, const LoadRequest& r)
00532             { return o; }       
00533         };
00534         
00535 
00536     };
00537 
00538 
00542 }
00543 
00544 #endif
00545 

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