source: trunk/VUT/work/ogre_changes/Plugins/OctreeSceneManager/src/OgreTerrainPageSource.cpp @ 139

Revision 139, 5.9 KB checked in by mattausch, 19 years ago (diff)

fixed bug with tight octree boxes
added more flexible renderqueue (can delete per flag)
reordered functions in visibility terrain scene manager

Line 
1/*
2-----------------------------------------------------------------------------
3This source file is part of OGRE
4(Object-oriented Graphics Rendering Engine)
5For the latest info, see http://www.ogre3d.org/
6
7Copyright (c) 2000-2005 The OGRE Team
8Also see acknowledgements in Readme.html
9
10This program is free software; you can redistribute it and/or modify it under
11the terms of the GNU Lesser General Public License as published by the Free Software
12Foundation; either version 2 of the License, or (at your option) any later
13version.
14
15This program is distributed in the hope that it will be useful, but WITHOUT
16ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
17FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
18
19You should have received a copy of the GNU Lesser General Public License along with
20this program; if not, write to the Free Software Foundation, Inc., 59 Temple
21Place - Suite 330, Boston, MA 02111-1307, USA, or go to
22http://www.gnu.org/copyleft/lesser.txt.
23-----------------------------------------------------------------------------
24*/
25#include "OgreTerrainPageSource.h"
26#include "OgreTerrainPage.h"
27#include "OgreTerrainRenderable.h"
28#include "OgreSceneNode.h"
29#include "OgreTerrainSceneManager.h"
30#include "OgreLogManager.h"
31
32namespace Ogre {
33
34    //-----------------------------------------------------------------------
35    template<> TerrainPageSourceListenerManager* Singleton<TerrainPageSourceListenerManager>::ms_Singleton = 0;
36    TerrainPageSourceListenerManager* TerrainPageSourceListenerManager::getSingletonPtr(void)
37    {
38        return ms_Singleton;
39    }
40    TerrainPageSourceListenerManager& TerrainPageSourceListenerManager::getSingleton(void)
41    { 
42        assert( ms_Singleton );  return ( *ms_Singleton ); 
43    }
44    //-------------------------------------------------------------------------
45        void TerrainPageSourceListenerManager::addListener(TerrainPageSourceListener* pl)
46        {
47        mPageSourceListeners.push_back(pl);
48        }
49    //-------------------------------------------------------------------------
50        void TerrainPageSourceListenerManager::removeListener(TerrainPageSourceListener* pl)
51        {
52        PageSourceListenerList::iterator i, iend;
53        iend = mPageSourceListeners.end();
54        for(i = mPageSourceListeners.begin(); i != iend; ++i)
55        {
56            if (*i == pl)
57            {
58                mPageSourceListeners.erase(i);
59                break;
60            }
61        }
62        }
63    //-------------------------------------------------------------------------
64        void TerrainPageSourceListenerManager::firePageConstructed(size_t pagex, size_t pagez, Real* heightData)
65        {
66        PageSourceListenerList::iterator i, iend;
67        iend = mPageSourceListeners.end();
68        for(i = mPageSourceListeners.begin(); i != iend; ++i)
69        {
70            (*i)->pageConstructed(pagex, pagez, heightData);
71        }
72        }
73        //-------------------------------------------------------------------------
74        TerrainPageSource::TerrainPageSource() : mSceneManager(0), mAsyncLoading(false) {
75        }
76        //-------------------------------------------------------------------------
77        TerrainPage* TerrainPageSource::buildPage(Real* heightData, const MaterialPtr& pMaterial)
78    {
79        String name;
80
81        // Create a Terrain Page
82        TerrainPage* page = new TerrainPage((mPageSize-1) / (mTileSize-1));
83        // Create a node for all tiles to be attached to
84        // Note we sequentially name since page can be attached at different points
85        // so page x/z is not appropriate
86        static size_t pageIndex = 0;
87                StringUtil::StrStreamType page_str;
88                page_str << pageIndex;
89        name = "page[";
90        name += page_str.str() + "]";
91        page->pageSceneNode = mSceneManager->createSceneNode(name);
92       
93        size_t q = 0;
94        for ( size_t j = 0; j < mPageSize - 1; j += ( mTileSize - 1 ) )
95        {
96            size_t p = 0;
97
98            for ( size_t i = 0; i < mPageSize - 1; i += ( mTileSize - 1 ) )
99            {
100                                StringUtil::StrStreamType new_name_str;
101                               
102                // Create scene node for the tile and the TerrainRenderable
103                new_name_str << "tile[" << pageIndex << "][" << (int)p << "," << (int)q << "]";
104                                name = new_name_str.str();
105
106                SceneNode *c = page->pageSceneNode->createChildSceneNode( name );
107                               
108                TerrainRenderable *tile = new TerrainRenderable(name);
109                                // set queue
110                                tile->setRenderQueueGroup(mSceneManager->getWorldGeometryRenderQueue());
111                // Initialise the tile
112                                tile->setMaterial(pMaterial);
113                               
114                tile->initialise(i, j, heightData);
115                // Attach it to the page
116                page->tiles[ p ][ q ] = tile;
117                // Attach it to the node
118                c ->attachObject( tile );
119                p++;
120                       
121            }
122
123            q++;
124
125        }
126
127        pageIndex++;
128
129        // calculate neighbours for page
130        page->linkNeighbours();
131
132        return page;
133    }
134    //-------------------------------------------------------------------------
135    void TerrainPageSource::firePageConstructed(size_t pagex, size_t pagez, Real* heightData)
136    {
137                TerrainPageSourceListenerManager::getSingleton().firePageConstructed(pagex, pagez, heightData);
138    }
139    //-------------------------------------------------------------------------
140    void TerrainPageSource::addListener(TerrainPageSourceListener* pl)
141    {
142                TerrainPageSourceListenerManager::getSingleton().addListener(pl);
143    }
144    //-------------------------------------------------------------------------
145    void TerrainPageSource::removeListener(TerrainPageSourceListener* pl)
146    {
147                TerrainPageSourceListenerManager::getSingleton().removeListener(pl);
148
149    }
150    //-------------------------------------------------------------------------
151
152}
Note: See TracBrowser for help on using the repository browser.