1 | #include <OgreNoMemoryMacros.h>
|
---|
2 | #include <CEGUI/CEGUI.h>
|
---|
3 | #include <../CEGUIRenderer/include/OgreCEGUIRenderer.h>
|
---|
4 | #include <../CEGUIRenderer/include/OgreCEGUIResourceProvider.h>
|
---|
5 | #include <../CEGUIRenderer/include/OgreCEGUITexture.h>
|
---|
6 | #include <OgreMemoryMacros.h>
|
---|
7 |
|
---|
8 | #include <Ogre.h>
|
---|
9 |
|
---|
10 | //#include "OgreReferenceAppLayer.h"
|
---|
11 | //#include "OgreRefAppWorld.h"
|
---|
12 | #include "TestCullingIVApplication.h"
|
---|
13 | #include "IVFrameListener.h"
|
---|
14 |
|
---|
15 | #define WIN32_LEAN_AND_MEAN
|
---|
16 | #include <windows.h>
|
---|
17 |
|
---|
18 |
|
---|
19 | /*********************************************************/
|
---|
20 | /* TestCullingIVApplication implementation */
|
---|
21 | /*********************************************************/
|
---|
22 |
|
---|
23 | //-----------------------------------------------------------------------
|
---|
24 | TestCullingIVApplication::TestCullingIVApplication()
|
---|
25 | {
|
---|
26 | mIVReader = new IVReader();
|
---|
27 | }
|
---|
28 | //-----------------------------------------------------------------------
|
---|
29 | TestCullingIVApplication::~TestCullingIVApplication()
|
---|
30 | {
|
---|
31 | OGRE_DELETE(mIVReader);
|
---|
32 | }
|
---|
33 | //-----------------------------------------------------------------------
|
---|
34 | void TestCullingIVApplication::createCamera()
|
---|
35 | {
|
---|
36 | // create the camera
|
---|
37 | mCamera = mSceneMgr->createCamera("PlayerCam");
|
---|
38 | // Look back along -Z
|
---|
39 | mCamera->lookAt(Vector3(0, 0, -300));
|
---|
40 |
|
---|
41 | /** set a nice viewpoint
|
---|
42 | * we use a camera node here and apply all transformations on it instead
|
---|
43 | * of applying all transformations directly to the camera
|
---|
44 | * because then the camera is displayed correctly in the visualization
|
---|
45 | */
|
---|
46 | mCamNode = mSceneMgr->getRootSceneNode()->
|
---|
47 | createChildSceneNode("CamNode1", Vector3(0, -100, -200));
|
---|
48 |
|
---|
49 | mCamNode->attachObject(mCamera);
|
---|
50 | //mCamNode->lookAt(Vector3(0, 0, -300), Node::TS_WORLD);
|
---|
51 | //mCamNode->setOrientation(Quaternion(-0.3486, 0.0122, 0.9365, 0.0329));
|
---|
52 |
|
---|
53 | //-- create visualization camera
|
---|
54 | mVizCamera = mSceneMgr->createCamera("VizCam");
|
---|
55 | mVizCamera->setPosition(mCamNode->getPosition());
|
---|
56 |
|
---|
57 | mVizCamera->setNearClipDistance(1);
|
---|
58 | mCamera->setNearClipDistance(1);
|
---|
59 |
|
---|
60 | // infinite far plane?
|
---|
61 | if (mRoot->getRenderSystem()->getCapabilities()->hasCapability(RSC_INFINITE_FAR_PLANE))
|
---|
62 | {
|
---|
63 | mVizCamera->setFarClipDistance(0);
|
---|
64 | mCamera->setFarClipDistance(0);
|
---|
65 | }
|
---|
66 | else
|
---|
67 | {
|
---|
68 | mVizCamera->setFarClipDistance(20000);
|
---|
69 | mCamera->setFarClipDistance(20000);
|
---|
70 | }
|
---|
71 | }
|
---|
72 |
|
---|
73 | //-----------------------------------------------------------------------
|
---|
74 | bool TestCullingIVApplication::setup()
|
---|
75 | {
|
---|
76 | bool carryOn = ExampleApplication::setup();
|
---|
77 |
|
---|
78 | if (carryOn)
|
---|
79 | createRenderTargetListener();
|
---|
80 |
|
---|
81 | return carryOn;
|
---|
82 | }
|
---|
83 | //-----------------------------------------------------------------------
|
---|
84 | void TestCullingIVApplication::createRenderTargetListener()
|
---|
85 | {
|
---|
86 | mWindow->addListener(new VisualizationRenderTargetListener(mSceneMgr));
|
---|
87 | }
|
---|
88 | //-----------------------------------------------------------------------
|
---|
89 | void TestCullingIVApplication::createScene()
|
---|
90 | {
|
---|
91 | Real scale = 1;
|
---|
92 | mSceneMgr->setOption("NodeVizScale", &scale);
|
---|
93 | // HACK: change this to relative path
|
---|
94 | //String path = "E:/svn/gametools/trunk/VUT/Ogre/resources/";
|
---|
95 | String path = "D:/svn/trunk/VUT/Ogre/resources/";
|
---|
96 |
|
---|
97 | SceneNode *node1 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node1");
|
---|
98 | SceneNode *node2 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node2");
|
---|
99 | SceneNode *node3 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node3");
|
---|
100 | SceneNode *node4 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node4");
|
---|
101 | SceneNode *node5 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node5");
|
---|
102 | SceneNode *node6 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node6");
|
---|
103 | SceneNode *node7 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node7");
|
---|
104 | SceneNode *node8 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node8");
|
---|
105 | SceneNode *node9 = mSceneMgr->getRootSceneNode()->createChildSceneNode("Node9");
|
---|
106 |
|
---|
107 |
|
---|
108 | node1->translate(Vector3(-500, 0, 750));
|
---|
109 | node2->translate(Vector3(-400, 0, 750));
|
---|
110 | node3->scale(Vector3(100, 100 ,100));
|
---|
111 | node3->pitch(Radian(3 * Math::HALF_PI));
|
---|
112 | node4->translate(Vector3(-100, 0, 0));
|
---|
113 | node5->translate(Vector3(0, 300, 0));
|
---|
114 |
|
---|
115 | node6->scale(Vector3(100, 100 ,100));
|
---|
116 | node6->pitch(Radian(3 * Math::HALF_PI));
|
---|
117 | node6->roll(Radian(Math::HALF_PI));
|
---|
118 | node6->translate(Vector3(0, -100, 0));
|
---|
119 |
|
---|
120 | node7->scale(Vector3(100, 100 ,100));
|
---|
121 | node7->pitch(Radian(3 * Math::HALF_PI));
|
---|
122 | node7->roll(Radian(Math::HALF_PI));
|
---|
123 | node7->translate(Vector3(100, 0, 0));
|
---|
124 |
|
---|
125 | node8->translate(Vector3(-300, -300, 0));
|
---|
126 |
|
---|
127 | Log *log = LogManager::getSingleton().createLog("IVLog.log");
|
---|
128 | mIVReader->setLog(log);
|
---|
129 |
|
---|
130 | /*if (mIVReader->loadFile("media\\house_test1.iv"))
|
---|
131 | {
|
---|
132 | mIVReader->buildTree(mSceneMgr, node1);
|
---|
133 | mIVReader->buildTree(mSceneMgr, node2);
|
---|
134 | }
|
---|
135 | if (mIVReader->loadFile("media\\anhk.wrl"))
|
---|
136 | {
|
---|
137 | mIVReader->buildTree(mSceneMgr, node3);
|
---|
138 | }
|
---|
139 | if (mIVReader->loadFile("media\\ant.wrl"))
|
---|
140 | {
|
---|
141 | mIVReader->buildTree(mSceneMgr, node4);
|
---|
142 | }
|
---|
143 | if (mIVReader->loadFile("media\\zepplin0.wrl"))
|
---|
144 | {
|
---|
145 | mIVReader->buildTree(mSceneMgr, node5);
|
---|
146 | }
|
---|
147 | if (mIVReader->loadFile("media\\warbird.wrl"))
|
---|
148 | {
|
---|
149 | mIVReader->buildTree(mSceneMgr, node6);
|
---|
150 | }
|
---|
151 | if (mIVReader->loadFile("media\\z_wing.wrl"))
|
---|
152 | {
|
---|
153 | mIVReader->buildTree(mSceneMgr, node7);
|
---|
154 | }*/
|
---|
155 |
|
---|
156 | String fileName = path + "media\\city1500_flat_1.iv";
|
---|
157 | if (mIVReader->loadFile(fileName.c_str()))
|
---|
158 | {
|
---|
159 | mIVReader->buildTree(mSceneMgr, node8);
|
---|
160 | }
|
---|
161 |
|
---|
162 | fileName = path + "media\\roofs_1500.iv";
|
---|
163 | if (mIVReader->loadFile(fileName.c_str()))
|
---|
164 | {
|
---|
165 | mIVReader->buildTree(mSceneMgr, node8);
|
---|
166 | }
|
---|
167 |
|
---|
168 | fileName = path + "media\\CityRoads60.iv";
|
---|
169 | if (mIVReader->loadFile(fileName.c_str()))
|
---|
170 | {
|
---|
171 | mIVReader->buildTree(mSceneMgr, node8);
|
---|
172 | }
|
---|
173 |
|
---|
174 | fileName = path + "media\\CityPlane60.iv";
|
---|
175 | if (mIVReader->loadFile(fileName.c_str()))
|
---|
176 | {
|
---|
177 | mIVReader->buildTree(mSceneMgr, node8);
|
---|
178 | }
|
---|
179 |
|
---|
180 | fileName = path + "media\\test.iv";
|
---|
181 | if (mIVReader->loadFile(fileName.c_str()))
|
---|
182 | {
|
---|
183 | mIVReader->buildTree(mSceneMgr, node9);
|
---|
184 | }
|
---|
185 |
|
---|
186 | mIVReader->collapse();
|
---|
187 |
|
---|
188 |
|
---|
189 | // Set ambient light
|
---|
190 | mAmbientLight = ColourValue(0.5 , 0.5, 0.5);
|
---|
191 | mSceneMgr->setAmbientLight(mAmbientLight);
|
---|
192 |
|
---|
193 | //-- create light
|
---|
194 | mSunLight = mSceneMgr->createLight("SunLight");
|
---|
195 | mSunLight->setType(Light::LT_DIRECTIONAL);
|
---|
196 | //mSunLight->setType(Light::LT_SPOTLIGHT);
|
---|
197 | //mSunLight->setSpotlightRange(Degree(30), Degree(50));
|
---|
198 |
|
---|
199 | mSunLight->setPosition(707, 2000, 500);
|
---|
200 | mSunLight->setCastShadows(true);
|
---|
201 |
|
---|
202 | // set light angle not too small over the surface, otherwise shadows textures will be broken
|
---|
203 | Vector3 dir(0.5, 1, 0.5);
|
---|
204 | dir.normalise();
|
---|
205 | mSunLight->setDirection(dir);
|
---|
206 | //mSunLight->setDirection(Vector3::NEGATIVE_UNIT_Y);
|
---|
207 | mSunLight->setDiffuseColour(1, 1, 1);
|
---|
208 | mSunLight->setSpecularColour(1, 1, 1);
|
---|
209 |
|
---|
210 | // -- Fog
|
---|
211 | // NB it's VERY important to set this before calling setWorldGeometry
|
---|
212 | // because the vertex program picked will be different
|
---|
213 | ColourValue fadeColour(0.93, 0.86, 0.76);
|
---|
214 | mWindow->getViewport(0)->setBackgroundColour(fadeColour);
|
---|
215 | //mSceneMgr->setFog( FOG_LINEAR, fadeColour, .001, 500, 1000);
|
---|
216 |
|
---|
217 | // Create a skybox
|
---|
218 | mSceneMgr->setSkyBox(true, "Examples/CloudyNoonSkyBox", 5000, true);
|
---|
219 |
|
---|
220 |
|
---|
221 | //-- CEGUI setup
|
---|
222 | setupGui();
|
---|
223 |
|
---|
224 | // Use 512x512 texture in GL since we can't go higher than the window res
|
---|
225 | mSceneMgr->setShadowTextureSettings(512, 2);
|
---|
226 |
|
---|
227 | mSceneMgr->setShadowColour(ColourValue(0.5, 0.5, 0.5));
|
---|
228 | }
|
---|
229 | //-----------------------------------------------------------------------
|
---|
230 | void TestCullingIVApplication::setupGui()
|
---|
231 | {
|
---|
232 | mGUIRenderer = new CEGUI::OgreCEGUIRenderer(mWindow, Ogre::RENDER_QUEUE_OVERLAY,
|
---|
233 | false, 3000, ST_EXTERIOR_CLOSE);
|
---|
234 | mGUISystem = new CEGUI::System(mGUIRenderer);
|
---|
235 |
|
---|
236 | // Mouse
|
---|
237 | CEGUI::SchemeManager::getSingleton().loadScheme((CEGUI::utf8*)"TaharezLook.scheme");
|
---|
238 | CEGUI::MouseCursor::getSingleton().setImage("TaharezLook", "MouseArrow");
|
---|
239 | mGUISystem->setDefaultMouseCursor((CEGUI::utf8*)"TaharezLook",
|
---|
240 | (CEGUI::utf8*)"MouseArrow");
|
---|
241 |
|
---|
242 | CEGUI::MouseCursor::getSingleton().show();
|
---|
243 | }
|
---|
244 | //-----------------------------------------------------------------------
|
---|
245 | void TestCullingIVApplication::createFrameListener()
|
---|
246 | {
|
---|
247 | mIVFrameListener = new IVFrameListener(mWindow, mCamera, mSceneMgr,
|
---|
248 | mGUIRenderer, mVizCamera, mCamNode, mSunLight, this);
|
---|
249 |
|
---|
250 | mRoot->addFrameListener(mIVFrameListener);
|
---|
251 | }
|
---|
252 | //-----------------------------------------------------------------------
|
---|
253 | void TestCullingIVApplication::chooseSceneManager()
|
---|
254 | {
|
---|
255 | mSceneMgr = mRoot->getSceneManager(ST_GENERIC);
|
---|
256 | }
|
---|
257 |
|
---|
258 |
|
---|
259 |
|
---|
260 | /**************************************************************/
|
---|
261 | /* VisualizationRenderTargetListener implementation */
|
---|
262 | /**************************************************************/
|
---|
263 |
|
---|
264 | //-----------------------------------------------------------------------
|
---|
265 | VisualizationRenderTargetListener::VisualizationRenderTargetListener(SceneManager *sceneMgr)
|
---|
266 | :RenderTargetListener(), mSceneMgr(sceneMgr)
|
---|
267 | {
|
---|
268 | }
|
---|
269 | //-----------------------------------------------------------------------
|
---|
270 | void VisualizationRenderTargetListener::preViewportUpdate(const RenderTargetViewportEvent &evt)
|
---|
271 | {
|
---|
272 | // visualization viewport
|
---|
273 | const bool showViz = evt.source->getZOrder() == VIZ_VIEWPORT_Z_ORDER;
|
---|
274 | const bool nShowViz = !showViz;
|
---|
275 |
|
---|
276 | mSavedShadowTechnique = mSceneMgr->getShadowTechnique();
|
---|
277 | mSavedAmbientLight = mSceneMgr->getAmbientLight();
|
---|
278 |
|
---|
279 | // -- ambient light must be full for visualization, shadows disabled
|
---|
280 | if (showViz)
|
---|
281 | {
|
---|
282 | mSceneMgr->setAmbientLight(ColourValue(1, 1, 1));
|
---|
283 | mSceneMgr->setShadowTechnique(SHADOWTYPE_NONE);
|
---|
284 | }
|
---|
285 |
|
---|
286 | mSceneMgr->setOption("PrepareVisualization", &showViz);
|
---|
287 | mSceneMgr->setOption("SkyBoxEnabled", &nShowViz);
|
---|
288 | //mSceneMgr->setOption("SkyPlaneEnabled", &showViz);
|
---|
289 |
|
---|
290 | RenderTargetListener::preViewportUpdate(evt);
|
---|
291 | }
|
---|
292 | //-----------------------------------------------------------------------
|
---|
293 | void VisualizationRenderTargetListener::postRenderTargetUpdate(const RenderTargetEvent &evt)
|
---|
294 | {
|
---|
295 | // reset values
|
---|
296 | mSceneMgr->setShadowTechnique(mSavedShadowTechnique);
|
---|
297 | mSceneMgr->setAmbientLight(mSavedAmbientLight);
|
---|
298 |
|
---|
299 | RenderTargetListener::postRenderTargetUpdate(evt);
|
---|
300 | }
|
---|
301 | //-----------------------------------------------------------------------
|
---|
302 | INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR strCmdLine, INT )
|
---|
303 | {
|
---|
304 | // Create application object
|
---|
305 | TestCullingIVApplication app;
|
---|
306 |
|
---|
307 | try
|
---|
308 | {
|
---|
309 | app.go();
|
---|
310 | }
|
---|
311 | catch( Ogre::Exception& e )
|
---|
312 | {
|
---|
313 | MessageBox( NULL, e.getFullDescription().c_str(),
|
---|
314 | "An exception has occured!", MB_OK | MB_ICONERROR | MB_TASKMODAL);
|
---|
315 | }
|
---|
316 |
|
---|
317 | return 0;
|
---|
318 | }
|
---|