1 | #include "ExampleApplication.h"
|
---|
2 | #include "ExtendedCamera.h"
|
---|
3 | #include "Grass.h"
|
---|
4 | #include <vector>
|
---|
5 | #include <OgreVector3.h>
|
---|
6 | #include "LightComposite.h"
|
---|
7 | #include <OgreOSMScene.h>
|
---|
8 | #include <OgreConfigFile.h>
|
---|
9 |
|
---|
10 | /** |
---|
11 | Callback handler to post-process created objects. |
---|
12 | */ |
---|
13 | class OSceneCallback : public OSMSceneCallbacks |
---|
14 | {
|
---|
15 | public:
|
---|
16 | // We override the OnCreate method for cameras (See IXMLSceneCallbacks class)
|
---|
17 | void OnCameraCreate(Ogre::Camera* pCamera, TiXmlElement* pCameraDesc)
|
---|
18 | {
|
---|
19 | // If a camera of name "FirstCamera" is loaded, it will be set as the default current
|
---|
20 | if(pCamera->getName() == "FirstCamera")
|
---|
21 | Ogre::Root::getSingleton().getAutoCreatedWindow()->getViewport(0)->setCamera(pCamera);
|
---|
22 | } |
---|
23 |
|
---|
24 |
|
---|
25 | }; |
---|
26 |
|
---|
27 | class SampleListener : public ExampleFrameListener
|
---|
28 | {
|
---|
29 | protected:
|
---|
30 | // References to the main character and the camera
|
---|
31 | Character *mChar;
|
---|
32 | ExtendedCamera *mExCamera;
|
---|
33 |
|
---|
34 | // Camera mode - Now supports 1st person, 3rd person (chasing) and 3rd person (fixed)
|
---|
35 | unsigned int mMode;
|
---|
36 | AnimationState* mCharacterAnimState;
|
---|
37 |
|
---|
38 | public:
|
---|
39 |
|
---|
40 | SampleListener(RenderWindow* win, Camera* cam)
|
---|
41 | : ExampleFrameListener(win, cam)
|
---|
42 | {
|
---|
43 | mChar = 0;
|
---|
44 | mExCamera = 0;
|
---|
45 | mMode = 0;
|
---|
46 | mMoveSpeed = 1000;
|
---|
47 | }
|
---|
48 |
|
---|
49 | void setCharacter (Character *character) {
|
---|
50 | mChar = character;
|
---|
51 | mCharacterAnimState = mChar->getEntity()->getAnimationState("Fly");
|
---|
52 | mCharacterAnimState->setEnabled(true);
|
---|
53 | mCharacterAnimState->setLoop(true);
|
---|
54 | }
|
---|
55 |
|
---|
56 | void setExtendedCamera (ExtendedCamera *cam) {
|
---|
57 | mExCamera = cam;
|
---|
58 | }
|
---|
59 |
|
---|
60 | bool frameStarted(const FrameEvent& evt)
|
---|
61 | {
|
---|
62 | mInputDevice->capture ();
|
---|
63 |
|
---|
64 | if (mChar) {
|
---|
65 | mChar->update (evt.timeSinceLastFrame, mInputDevice);
|
---|
66 |
|
---|
67 | if (mExCamera) {
|
---|
68 | mExCamera->update (evt.timeSinceLastFrame,
|
---|
69 | mChar->getCameraNode ()->getWorldPosition (),
|
---|
70 | mChar->getSightNode ()->getWorldPosition ());
|
---|
71 |
|
---|
72 | }
|
---|
73 | }
|
---|
74 |
|
---|
75 | mCharacterAnimState->addTime(evt.timeSinceLastFrame);
|
---|
76 |
|
---|
77 | // Exit if we press Esc
|
---|
78 | if (mInputDevice->isKeyDown (KC_ESCAPE))
|
---|
79 | return false;
|
---|
80 |
|
---|
81 | return true;
|
---|
82 | }
|
---|
83 | };
|
---|
84 |
|
---|
85 | class SkyPlaneListener : public ExampleFrameListener
|
---|
86 | {
|
---|
87 | protected:
|
---|
88 | // References to the main character and the camera
|
---|
89 | SceneManager *mSceneMgr;
|
---|
90 | Grass *mGrass;
|
---|
91 | LightComposite *mLightComposite;
|
---|
92 |
|
---|
93 | // Create the scene loader
|
---|
94 | OSMScene* mOScene;
|
---|
95 |
|
---|
96 | // Camera mode - Now supports 1st person, 3rd person (chasing) and 3rd person (fixed)
|
---|
97 | unsigned int mMode;
|
---|
98 | AnimationState *mAnimState;
|
---|
99 |
|
---|
100 | // Gametools 8/11/2005 - Isma
|
---|
101 | Real mAnimationSpeed;
|
---|
102 | AnimationState* mCharacterAnimState;
|
---|
103 | Real mFactorAnimationSpeed;
|
---|
104 | Real mAngle;
|
---|
105 | Real mStepAngle;
|
---|
106 |
|
---|
107 | unsigned int mFrame;
|
---|
108 | public:
|
---|
109 |
|
---|
110 |
|
---|
111 | void loadScene(Ogre::String filename) |
---|
112 | { |
---|
113 | // Create an oE_Loader Callback object to post-process created objects
|
---|
114 | OSceneCallback oeCallback;
|
---|
115 |
|
---|
116 | mOScene = new OSMScene(mSceneMgr, mWindow);
|
---|
117 |
|
---|
118 | // Initialises with the scene to be loaded and the callback if requiered
|
---|
119 | mOScene->initialise(filename.c_str(), &oeCallback);
|
---|
120 |
|
---|
121 | // create and setup the scene in the root node
|
---|
122 | mOScene->createScene(); |
---|
123 | }
|
---|
124 |
|
---|
125 | SkyPlaneListener(RenderWindow* win, Camera* cam, SceneManager *sceneMgr)
|
---|
126 | : ExampleFrameListener(win, cam)
|
---|
127 | {
|
---|
128 | //showDebugOverlay(false);
|
---|
129 | mSceneMgr = sceneMgr;
|
---|
130 | mMoveScale = 1;
|
---|
131 | mRotScale = 0.025;
|
---|
132 | mAngle = 0.0;
|
---|
133 | mStepAngle = 10.0;
|
---|
134 |
|
---|
135 | Ogre::ConfigFile config;
|
---|
136 | config.load("configScene.cfg");
|
---|
137 | Ogre::String moveSpeed = config.getSetting("MoveSpeed");
|
---|
138 | mMoveSpeed = Ogre::StringConverter::parseReal(moveSpeed);
|
---|
139 |
|
---|
140 | showDebugOverlay(false);
|
---|
141 | //createCameraAutoTracking();
|
---|
142 |
|
---|
143 | SceneNode *snButterfly = mSceneMgr->getSceneNode("butterflyNode");
|
---|
144 | Entity *entityButterfly = (Entity*) snButterfly->getAttachedObject(0);
|
---|
145 | mCharacterAnimState = entityButterfly->getAnimationState("Fly");
|
---|
146 | mCharacterAnimState->setEnabled(true);
|
---|
147 | mCharacterAnimState->setLoop(true);
|
---|
148 |
|
---|
149 | mFrame = 0;
|
---|
150 | mFactorAnimationSpeed = 2.0;
|
---|
151 | //mFactorAnimationSpeed = 0.1;
|
---|
152 | }
|
---|
153 |
|
---|
154 | void createCameraAutoTracking()
|
---|
155 | {
|
---|
156 | SceneNode *cameraSceneNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("CamNode");
|
---|
157 | cameraSceneNode->attachObject(mCamera);
|
---|
158 | SceneNode *entitySceneNode = mSceneMgr->getSceneNode("butterflyNode");
|
---|
159 | SceneNode *targetNode = mSceneMgr->getSceneNode("targetNode");
|
---|
160 | //SceneNode *snLight = mSceneMgr->getSceneNode("lightNode");
|
---|
161 | cameraSceneNode->setAutoTracking(true,targetNode);
|
---|
162 | //cameraSceneNode->setAutoTracking(true,snLight);
|
---|
163 | cameraSceneNode->translate(Vector3(300.0,0.0,0.0));
|
---|
164 | // set up spline animation of node
|
---|
165 | Animation* anim = mSceneMgr->createAnimation("CameraTrack",10);
|
---|
166 | // Spline it for nice curves
|
---|
167 | anim->setInterpolationMode(Animation::IM_SPLINE);
|
---|
168 | // Create a track to animate the camera's node
|
---|
169 | NodeAnimationTrack* track = anim->createNodeTrack(0, cameraSceneNode);
|
---|
170 | //AnimationTrack* track = anim->createTrack(0, snLight);
|
---|
171 | // Setup keyframes
|
---|
172 | TransformKeyFrame* key = track->createNodeKeyFrame(0); // startposition
|
---|
173 | key->setTranslate(Vector3(0.0,0.0,300.0));
|
---|
174 | key = track->createNodeKeyFrame(2.5);
|
---|
175 | key->setTranslate(Vector3(-600.0,0.0,0.0));
|
---|
176 | key = track->createNodeKeyFrame(5);
|
---|
177 | key->setTranslate(Vector3(0.0,0.0,-600.0));
|
---|
178 | key = track->createNodeKeyFrame(7.5);
|
---|
179 | key->setTranslate(Vector3(600.0,0.0,0.0));
|
---|
180 | key = track->createNodeKeyFrame(10);
|
---|
181 | key->setTranslate(Vector3(0.0,0.0,300.0));
|
---|
182 |
|
---|
183 | // Create a new animation state to track this
|
---|
184 | mAnimState = mSceneMgr->createAnimationState("CameraTrack");
|
---|
185 | mAnimState->setEnabled(true);
|
---|
186 | mAnimState->setLoop(true);
|
---|
187 | }
|
---|
188 |
|
---|
189 | void setGrass(Grass *grass)
|
---|
190 | {
|
---|
191 | mGrass = grass;
|
---|
192 | }
|
---|
193 |
|
---|
194 | void setLightComposite(LightComposite *lightComposite)
|
---|
195 | {
|
---|
196 | loadScene("../../media/scene/scene.OSM");
|
---|
197 | mLightComposite = lightComposite;
|
---|
198 | }
|
---|
199 |
|
---|
200 | bool frameStarted(const FrameEvent& evt)
|
---|
201 | {
|
---|
202 | mLightComposite->update(mInputDevice);
|
---|
203 |
|
---|
204 | /*
|
---|
205 | mAnimState->addTime(evt.timeSinceLastFrame * 0.5 * mFactorAnimationSpeed);
|
---|
206 | //mGrass->waveGrass(evt.timeSinceLastFrame);
|
---|
207 | //SceneNode *snLight = mSceneMgr->getSceneNode("bulletaLanternNode");
|
---|
208 | SceneNode *snLight = mSceneMgr->getSceneNode("lightNode");
|
---|
209 |
|
---|
210 | if (mInputDevice->isKeyDown(KC_I))
|
---|
211 | {
|
---|
212 | snLight->setPosition(snLight->getPosition() + Vector3(0.0,0.0,10.0));
|
---|
213 | }
|
---|
214 | if (mInputDevice->isKeyDown(KC_K))
|
---|
215 | {
|
---|
216 | snLight->setPosition(snLight->getPosition() + Vector3(0.0,0.0,-10.0));
|
---|
217 | }
|
---|
218 | if (mInputDevice->isKeyDown(KC_J))
|
---|
219 | {
|
---|
220 | snLight->translate(-10.0,0.0,0.0);
|
---|
221 | }
|
---|
222 | if (mInputDevice->isKeyDown(KC_L))
|
---|
223 | {
|
---|
224 | snLight->translate(10.0,0.0,0.0);
|
---|
225 | }
|
---|
226 | if (mInputDevice->isKeyDown(KC_U))
|
---|
227 | {
|
---|
228 | snLight->translate(0.0,10.0,0.0);
|
---|
229 | }
|
---|
230 | if (mInputDevice->isKeyDown(KC_O))
|
---|
231 | {
|
---|
232 | snLight->translate(0.0,-10.0,0.0);
|
---|
233 | }
|
---|
234 |
|
---|
235 | if ((mAngle < -45) && (mStepAngle < 0))
|
---|
236 | {
|
---|
237 | mStepAngle = -mStepAngle;
|
---|
238 | }
|
---|
239 | if ((mAngle > 45) && (mStepAngle > 0))
|
---|
240 | {
|
---|
241 | mStepAngle = -mStepAngle;
|
---|
242 | }
|
---|
243 | mAngle = mAngle + mStepAngle;
|
---|
244 | snLight->rotate(Vector3::UNIT_X,Radian(Degree(mStepAngle)));
|
---|
245 | Real sunHeight;
|
---|
246 | Real sunShift;
|
---|
247 | SceneNode *snSun = mSceneMgr->getSceneNode("sunNode");
|
---|
248 | sunHeight = -mAngle * 20.0;
|
---|
249 | sunShift = -mAngle * 400.0;
|
---|
250 | snSun->setPosition(0.0,2000.0,0.0);
|
---|
251 | snSun->translate(0.0,sunHeight,sunShift);
|
---|
252 | //LogManager::getSingleton().logMessage("sunHeight:" + StringConverter::toString(sunHeight));
|
---|
253 |
|
---|
254 | //ColourValue newColour;
|
---|
255 | //Real intensity;
|
---|
256 | //intensity = 1.0 - (Math::Abs(mAngle) + 45.0) / 90.0;
|
---|
257 | //newColour.r = mLightComposite->getNightLight().r + (mLightComposite->getRangeLight().r * intensity);
|
---|
258 | //newColour.g = mLightComposite->getNightLight().g + (mLightComposite->getRangeLight().g * intensity);
|
---|
259 | //newColour.b = mLightComposite->getNightLight().b + (mLightComposite->getRangeLight().b * intensity);
|
---|
260 | //mLightComposite->setAmbientColour(newColour);
|
---|
261 |
|
---|
262 | Light *light = mLightComposite->getLight(0);
|
---|
263 |
|
---|
264 | //ColourValue newDiffuseColour;
|
---|
265 | //ColourValue diffuseDarkColour(0.0,0.0,0.0);
|
---|
266 | //ColourValue diffuseBrightColour(0.7,0.8,1.0);
|
---|
267 | //ColourValue diffuseRange = diffuseBrightColour - diffuseDarkColour;
|
---|
268 | //newDiffuseColour.r = diffuseDarkColour.r + (diffuseRange.r * intensity);
|
---|
269 | //newDiffuseColour.g = diffuseDarkColour.g + (diffuseRange.g * intensity);
|
---|
270 | //newDiffuseColour.b = diffuseDarkColour.b + (diffuseRange.b * intensity);
|
---|
271 | light->setDiffuseColour(ColourValue(1.0,1.0,1.0));
|
---|
272 | light->setSpecularColour(ColourValue(1.0,1.0,1.0));
|
---|
273 |
|
---|
274 | Vector3 dir=Vector3(snSun->getPosition());
|
---|
275 | dir.normalise();
|
---|
276 | light->setDirection(dir);
|
---|
277 | LogManager::getSingleton().logMessage("LightDirection:" + StringConverter::toString(light->getDirection()));
|
---|
278 |
|
---|
279 | GpuProgramParametersSharedPtr vertParams,fragParams;
|
---|
280 | MaterialPtr mat = MaterialManager::getSingleton().getByName("chestnutLeavesBillboardCloudGroupMaterial0");
|
---|
281 | vertParams = mat->getBestTechnique()->getPass(0)->getVertexProgramParameters();
|
---|
282 | //vertParams->setNamedConstant("lightDirection",dir);
|
---|
283 | fragParams = mat->getBestTechnique()->getPass(0)->getFragmentProgramParameters();
|
---|
284 | //fragParams->setNamedConstant("Kd",intensity);
|
---|
285 |
|
---|
286 | //ColourValue newShadowColour;
|
---|
287 | //ColourValue darkShadow(0.4,0.4,0.4);
|
---|
288 | //ColourValue lightShadow(0.8,0.8,0.8);
|
---|
289 | //ColourValue shadowRange = lightShadow - darkShadow;
|
---|
290 | //newShadowColour.r = darkShadow.r + (shadowRange.r * intensity);
|
---|
291 | //newShadowColour.g = darkShadow.g + (shadowRange.g * intensity);
|
---|
292 | //newShadowColour.b = darkShadow.b + (shadowRange.b * intensity);
|
---|
293 | //mLightComposite->setShadowColour(newShadowColour);
|
---|
294 |
|
---|
295 | //BillboardSet *bbs = mSceneMgr->getBillboardSet("lightbbs");
|
---|
296 | //bbs->getBillboard(0)->setColour(newColour);
|
---|
297 |
|
---|
298 | // Gametools 8/11/2005 - Isma
|
---|
299 | // When recording....
|
---|
300 | //mAnimationSpeed = Math::RangeRandom(0.25*evt.timeSinceLastFrame,0.5*evt.timeSinceLastFrame);
|
---|
301 | mAnimationSpeed = Math::RangeRandom(evt.timeSinceLastFrame*1000.0,evt.timeSinceLastFrame*1200.0);
|
---|
302 |
|
---|
303 | //mLightComposite->showDebugShadowMap(0);
|
---|
304 | */
|
---|
305 | SceneNode *butterflyNode = mSceneMgr->getSceneNode("butterflyNode");
|
---|
306 | Entity* butterfly = (Entity*)butterflyNode->getAttachedObject(0);
|
---|
307 | Ogre::AnimationState* characterAnimState = butterfly ->getAnimationState("Fly");
|
---|
308 | characterAnimState->setEnabled(true);
|
---|
309 | characterAnimState->setLoop(true);
|
---|
310 | characterAnimState->addTime(evt.timeSinceLastFrame);
|
---|
311 |
|
---|
312 |
|
---|
313 | static Ogre::Real currentTime = 0;
|
---|
314 |
|
---|
315 | // We update all loaded animations each frame
|
---|
316 | Ogre::SceneManager::AnimationIterator animationIt = mSceneMgr->getAnimationIterator();
|
---|
317 |
|
---|
318 | while(animationIt.hasMoreElements())
|
---|
319 | {
|
---|
320 | Ogre::Animation* animation = animationIt.getNext();
|
---|
321 |
|
---|
322 | const Ogre::Animation::NodeTrackList& trackList = animation->_getNodeTrackList();
|
---|
323 |
|
---|
324 | Ogre::Animation::NodeTrackList::const_iterator it = trackList.begin();
|
---|
325 | Ogre::Animation::NodeTrackList::const_iterator iend = trackList.end();
|
---|
326 |
|
---|
327 | for(; it != iend; ++it) {
|
---|
328 | const Ogre::NodeAnimationTrack* track = it->second;
|
---|
329 | track->getAssociatedNode()->resetToInitialState();
|
---|
330 | }
|
---|
331 |
|
---|
332 | currentTime += evt.timeSinceLastFrame;
|
---|
333 | animation->apply(currentTime);
|
---|
334 | }
|
---|
335 |
|
---|
336 | return ExampleFrameListener::frameStarted(evt);
|
---|
337 | }
|
---|
338 |
|
---|
339 | bool frameEnded(const FrameEvent& evt)
|
---|
340 | {
|
---|
341 | return ExampleFrameListener::frameEnded(evt);
|
---|
342 | }
|
---|
343 | };
|
---|
344 |
|
---|
345 | class SkyPlaneApplication : public ExampleApplication
|
---|
346 | {
|
---|
347 | public:
|
---|
348 | std::vector<Vector3> vVertexs;
|
---|
349 |
|
---|
350 | SkyPlaneApplication()
|
---|
351 | {
|
---|
352 | }
|
---|
353 |
|
---|
354 |
|
---|
355 |
|
---|
356 |
|
---|
357 | protected:
|
---|
358 |
|
---|
359 | // Gametools 8/11/2005
|
---|
360 | // Main character
|
---|
361 | OgreCharacter *ogre;
|
---|
362 | ExtendedCamera *exCamera;
|
---|
363 | Grass *mGrass;
|
---|
364 | LightComposite *mLightComposite;
|
---|
365 | Ogre::ConfigFile config;
|
---|
366 | Ogre::String mNumTrees;
|
---|
367 | bool grassEnabled;
|
---|
368 | bool trunkLOD;
|
---|
369 |
|
---|
370 | // Just override the mandatory create scene method
|
---|
371 | void createScene(void)
|
---|
372 | {
|
---|
373 |
|
---|
374 | config.load("configScene.cfg");
|
---|
375 | mNumTrees = config.getSetting("NumTrees");
|
---|
376 |
|
---|
377 | Ogre::String sGrassEnabled = config.getSetting("Grass");
|
---|
378 | grassEnabled = Ogre::StringConverter::parseBool(sGrassEnabled);
|
---|
379 |
|
---|
380 | Ogre::String sTrunkLOD = config.getSetting("TrunkLOD");
|
---|
381 | trunkLOD = Ogre::StringConverter::parseBool(sTrunkLOD);
|
---|
382 |
|
---|
383 | SceneManager *mSceneMgr = Root::getSingleton().getSceneManager("ExampleSMInstance");
|
---|
384 |
|
---|
385 | ColourValue nightLight(0.09,0.07,0.27);
|
---|
386 | ColourValue dayLight(1.0,1.0,1.0);
|
---|
387 | //ColourValue dayLight(0.85,0.88,0.96);
|
---|
388 | ColourValue shadow(0.6,0.6,0.6,1.0);
|
---|
389 | mLightComposite = new LightComposite();
|
---|
390 | //mLightComposite->setDayLight(nightLight);
|
---|
391 | mLightComposite->setDayLight(dayLight);
|
---|
392 | mLightComposite->setNightLight(nightLight);
|
---|
393 | mLightComposite->init(mSceneMgr,mCamera);
|
---|
394 | mLightComposite->setShadowTexturePixelFormat(PF_A8R8G8B8);
|
---|
395 | // ATI
|
---|
396 | // Seems that NVIDIA don't support at all 16 bits FLOAT RGBA textures...!
|
---|
397 | //mLightComposite->setShadowTexturePixelFormat(PF_FLOAT16_RGBA);
|
---|
398 | // NVIDIA
|
---|
399 | //mLightComposite->setShadowTexturePixelFormat(PF_FLOAT32_RGBA);
|
---|
400 | //mLightComposite->setShadowTextureSize(1024);
|
---|
401 | mLightComposite->setShadowTextureSize(512);
|
---|
402 | mLightComposite->setShadowColour(shadow);
|
---|
403 | //mLightComposite->setAmbientColour(nightLight);
|
---|
404 | mLightComposite->setAmbientColour(dayLight);
|
---|
405 | mLightComposite->showShadowMapOverlay(false);
|
---|
406 | mLightComposite->createShadowMapOverlay(0);
|
---|
407 |
|
---|
408 | //mLightComposite->setDayLight(Vector3(1.0,1.0,1.0));
|
---|
409 | //mLightComposite->setNightLight(Vector3(0.0,0.0,0.0));
|
---|
410 |
|
---|
411 | //// Define the required skyplane
|
---|
412 | //Plane skyPlane;
|
---|
413 | //// 5000 world units from the camera
|
---|
414 | //skyPlane.d = 5000;
|
---|
415 | //// Above the camera, facing down
|
---|
416 | //skyPlane.normal = -Vector3::UNIT_Y;
|
---|
417 | //// Create the plane 10000 units wide, tile the texture 3 times
|
---|
418 | //mSceneMgr->setSkyPlane(true, skyPlane,"Examples/SpaceSkyPlaneNight",150000,500);
|
---|
419 |
|
---|
420 | mSceneMgr->setSkyBox(true, "CloudsSkyBox");
|
---|
421 |
|
---|
422 | // Floor plane
|
---|
423 | Plane plane;
|
---|
424 | plane.normal = Vector3::UNIT_Y;
|
---|
425 | plane.d = 100;
|
---|
426 | MeshManager::getSingleton().createPlane("Ground", ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME, plane,
|
---|
427 | 15000, 15000, 200, 200, true, 1, 60, 60, Vector3::UNIT_Z);
|
---|
428 | Entity* pPlaneEnt = mSceneMgr->createEntity("Ground", "Ground");
|
---|
429 | pPlaneEnt->setMaterialName("Examples/GrassFloor");
|
---|
430 | pPlaneEnt->setCastShadows(false);
|
---|
431 |
|
---|
432 | SceneNode *terrain = mSceneMgr->getRootSceneNode()->createChildSceneNode();
|
---|
433 | terrain->attachObject(pPlaneEnt);
|
---|
434 | terrain->setPosition(Vector3(0.0,0.0,0.0));
|
---|
435 |
|
---|
436 | MeshPtr meshPtr3= (MeshPtr)MeshManager::getSingleton().load("chestnutTrunkLevel3.mesh",
|
---|
437 | ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME);
|
---|
438 | if (!meshPtr3.isNull())
|
---|
439 | {
|
---|
440 | meshPtr3->createManualLodLevel(500,"chestnutTrunkLevel2.mesh");
|
---|
441 | meshPtr3->createManualLodLevel(1000,"chestnutTrunkLevel1.mesh");
|
---|
442 | meshPtr3->createManualLodLevel(1300,"chestnutTrunkLevel0.mesh");
|
---|
443 | }
|
---|
444 |
|
---|
445 | SceneNode *forestNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("forestNode");
|
---|
446 |
|
---|
447 | for (unsigned int i = 0; i < Ogre::StringConverter::parseInt(mNumTrees); i++)
|
---|
448 | {
|
---|
449 | Real xPos = Math::RangeRandom(-5000.0, 5000.0);
|
---|
450 | Real zPos = Math::RangeRandom(-5000.0, 5000.0);
|
---|
451 |
|
---|
452 | if (i == 0)
|
---|
453 | {
|
---|
454 | xPos = 200;
|
---|
455 | zPos = 0;
|
---|
456 | }
|
---|
457 | else if (i == 1)
|
---|
458 | {
|
---|
459 | xPos = -200;
|
---|
460 | zPos = 0;
|
---|
461 | }
|
---|
462 |
|
---|
463 | if ((i == 0) || (i == 1) || !(((xPos < 1000) && (xPos > -2000)) && ((zPos < 1000) && (zPos > -2000))))
|
---|
464 | {
|
---|
465 | Entity *leaves = mSceneMgr->createEntity("leavesNode_" + StringConverter::toString(i),"chestnutLeavesVisibilityBillboardCloudGroupedIndirectTexturing.mesh");
|
---|
466 | leaves->setCastShadows(true);
|
---|
467 | SceneNode *leavesNode = forestNode->createChildSceneNode();
|
---|
468 | leavesNode->setPosition(xPos,120.0,zPos);
|
---|
469 | leavesNode->attachObject(leaves);
|
---|
470 | leavesNode->scale(4.0,4.0,4.0);
|
---|
471 | leaves->setNormaliseNormals(true);
|
---|
472 |
|
---|
473 | SceneNode *trunkNode;
|
---|
474 | Entity* trunk;
|
---|
475 | if (trunkLOD)
|
---|
476 | {
|
---|
477 | trunk = mSceneMgr->createEntity("head1_" + StringConverter::toString(i), "chestnutTrunkLevel3.mesh");
|
---|
478 | trunkNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("trunkNode_" + StringConverter::toString(i));
|
---|
479 | }
|
---|
480 | else
|
---|
481 | {
|
---|
482 | trunk = mSceneMgr->createEntity("head1_" + StringConverter::toString(i), "chestnutTrunkLevel2.mesh");
|
---|
483 | trunkNode = forestNode->createChildSceneNode();
|
---|
484 | }
|
---|
485 | trunkNode->attachObject(trunk);
|
---|
486 | trunkNode->setPosition(xPos,-100.0,zPos);
|
---|
487 | trunkNode->scale(4.0,4.0,4.0);
|
---|
488 | trunk->setNormaliseNormals(true);
|
---|
489 | }
|
---|
490 | }
|
---|
491 |
|
---|
492 | StaticGeometry* s = mSceneMgr->createStaticGeometry("forestStatic");
|
---|
493 | s->setRegionDimensions(Vector3(1000, 1000, 1000));
|
---|
494 | s->setOrigin(Vector3(-500, 500, 500));
|
---|
495 | s->addSceneNode(forestNode);
|
---|
496 | s->build();
|
---|
497 | forestNode->setVisible(false, true);
|
---|
498 | s->setCastShadows(true);
|
---|
499 | s->setVisible(true);
|
---|
500 |
|
---|
501 | // Point light, movable, reddish
|
---|
502 | //ColourValue mMinLightColour(0.7, 0.9, 0.4);
|
---|
503 | //ColourValue mMaxLightColour(0.8, 0.9, 0.4);
|
---|
504 | //Real mMinFlareSize = 400;
|
---|
505 | //Real mMaxFlareSize = 500;
|
---|
506 | //Light *mLight = mSceneMgr->createLight("Light2");
|
---|
507 | //mLight->setType(Light::LT_DIRECTIONAL);
|
---|
508 | //mLight->setDirection(Vector3(-0.5, -1.0, 0.5));
|
---|
509 | //mLight->setCastShadows(true);
|
---|
510 | //mLight->setDiffuseColour(1.0, 1.0, 1.0);
|
---|
511 | //mLight->setSpecularColour(1.0, 1.0, 1.0);
|
---|
512 |
|
---|
513 | //SceneNode *lightNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("lightNode");
|
---|
514 | //lightNode->attachObject(mLight);
|
---|
515 | //mLightComposite->addLight(mLight);
|
---|
516 | //mLightComposite->setCurrentLight(0);
|
---|
517 |
|
---|
518 | //SceneNode *sunNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("sunNode");
|
---|
519 | //BillboardSet* bbsSun = mSceneMgr->createBillboardSet("lightbbs", 1);
|
---|
520 | //bbsSun->setMaterialName("Examples/Flare");
|
---|
521 | //Billboard* bb = bbsSun->createBillboard(0,0,0,dayLight);
|
---|
522 | //bb->setDimensions(1500.0,1500.0);
|
---|
523 | //sunNode->attachObject(bbsSun);
|
---|
524 |
|
---|
525 | //lightNode->setDirection(Vector3::UNIT_Z);
|
---|
526 | //lightNode->setPosition(Vector3(186.65,561.971,216.371));
|
---|
527 |
|
---|
528 | Entity *entityRuinMesh = mSceneMgr->createEntity("ruin","ruin.mesh");
|
---|
529 | entityRuinMesh->setCastShadows(true);
|
---|
530 | SceneNode *snRuinMesh = mSceneMgr->getRootSceneNode()->createChildSceneNode();
|
---|
531 | snRuinMesh->attachObject(entityRuinMesh);
|
---|
532 | snRuinMesh->translate(0,-110.0,105.0+150.0);
|
---|
533 | snRuinMesh->scale(2.0,2.0,2.0);
|
---|
534 |
|
---|
535 | Entity *barrel = mSceneMgr->createEntity("barrel","barrel.mesh");
|
---|
536 | SceneNode *barrelNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("barrelNode");
|
---|
537 | barrelNode->attachObject(barrel);
|
---|
538 | barrelNode->translate(225.0,-20.0,185.0);
|
---|
539 | barrelNode->scale(0.75,0.75,0.75);
|
---|
540 | barrelNode->rotate(Vector3::UNIT_X,Radian(Degree(90.0)));
|
---|
541 | barrel->setCastShadows(true);
|
---|
542 | barrel->setNormaliseNormals(true);
|
---|
543 |
|
---|
544 | Entity *butterfly = mSceneMgr->createEntity("butterfly", "butterfly_bones_animated.mesh");
|
---|
545 | SceneNode *butterflyNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("butterflyNode");
|
---|
546 | butterflyNode->setPosition(Vector3(0.0,200.0,3000.0));
|
---|
547 | butterflyNode->attachObject(butterfly);
|
---|
548 | butterflyNode->setPosition(Vector3(-82.5,-45.1,35.0+150.0));
|
---|
549 | butterflyNode->scale(1.0/2.0,1.0/2.0,1.0/2.0);
|
---|
550 | butterfly->setCastShadows(true);
|
---|
551 | butterfly->setNormaliseNormals(true);
|
---|
552 |
|
---|
553 | SceneNode *farmNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("farmNode");
|
---|
554 | Entity *farm = mSceneMgr->createEntity("farm","farm.mesh");
|
---|
555 | farm->setCastShadows(true);
|
---|
556 | farm->setNormaliseNormals(true);
|
---|
557 |
|
---|
558 | Entity *cow = mSceneMgr->createEntity("cow","cow.mesh");
|
---|
559 | cow->setCastShadows(true);
|
---|
560 | farmNode->attachObject(farm);
|
---|
561 | SceneNode *cowNode = farmNode->createChildSceneNode("cowNode");
|
---|
562 | cowNode->attachObject(cow);
|
---|
563 | cowNode->translate(Vector3(-9.1,7,3.5));
|
---|
564 | farmNode->scale(Vector3(150,150,150));
|
---|
565 | Vector3 positionFarm = Vector3(0.0,200.0,-2200);
|
---|
566 | farmNode->setPosition(positionFarm);
|
---|
567 |
|
---|
568 | mCamera->setFOVy(Radian(Degree(60.0)));
|
---|
569 | mCamera->setPosition(Vector3(44.8621, -2.74644, 282.558));
|
---|
570 | mCamera->setOrientation(Quaternion(0.9296, 0.09672, 0.345428, -0.05414));
|
---|
571 |
|
---|
572 | if (grassEnabled)
|
---|
573 | {
|
---|
574 | mGrass = new Grass();
|
---|
575 | mGrass->setGrassShadowReceiver(false);
|
---|
576 | mGrass->setGrassScaleRandomRangeMax(Vector3(1.0,1.0,1.0));
|
---|
577 | mGrass->setGrassScaleRandomRangeMin(Vector3(1.0,0.75,1.0));
|
---|
578 | mGrass->setGrassHeight(50.0);
|
---|
579 | mGrass->setGrassWidth(40.0);
|
---|
580 | mGrass->setGrassFrequency(40);
|
---|
581 | mGrass->setGrassInterFrequency(30);
|
---|
582 | mGrass->setGrassMaterial("Examples/GrassBlades");
|
---|
583 | mGrass->setGrassMeshName("grassblades");
|
---|
584 | mGrass->setSceneManager(mSceneMgr);
|
---|
585 | mGrass->setGrassHeightPosition(-100);
|
---|
586 | mGrass->setGrassLandscapeSizeX(6000);
|
---|
587 | mGrass->setGrassLandscapeSizeZ(6000);
|
---|
588 | mGrass->initGrass();
|
---|
589 | }
|
---|
590 |
|
---|
591 | SceneNode *targetNode = mSceneMgr->getRootSceneNode()->createChildSceneNode("targetNode");
|
---|
592 | targetNode->setPosition(Vector3(0.0,0.0,0.0));
|
---|
593 | SceneNode *targetNodeFrontTrees = mSceneMgr->getRootSceneNode()->createChildSceneNode("targetNodeFrontTrees");
|
---|
594 | targetNodeFrontTrees->setPosition(Vector3(0.0,0.0,200.0));
|
---|
595 |
|
---|
596 | ////// Main character
|
---|
597 | //OgreCharacter *ogre = new OgreCharacter ("Character", mSceneMgr);
|
---|
598 | //ExtendedCamera *exCamera = new ExtendedCamera ("ExtendedCamera", mSceneMgr, mCamera);
|
---|
599 |
|
---|
600 | //mFrameListener = new SampleListener (mWindow, mCamera);
|
---|
601 | //static_cast<SampleListener *>(mFrameListener)->setCharacter (ogre);
|
---|
602 | //static_cast<SampleListener *>(mFrameListener)->setExtendedCamera (exCamera);
|
---|
603 | }
|
---|
604 |
|
---|
605 | // // Create new frame listener
|
---|
606 | void createFrameListener(void)
|
---|
607 | {
|
---|
608 | mFrameListener= new SkyPlaneListener(mWindow, mCamera, mSceneMgr);
|
---|
609 | static_cast<SkyPlaneListener *>(mFrameListener)->setGrass(mGrass);
|
---|
610 |
|
---|
611 | static_cast<SkyPlaneListener *>(mFrameListener)->setLightComposite(mLightComposite);
|
---|
612 | mRoot->addFrameListener(mFrameListener);
|
---|
613 | }
|
---|
614 |
|
---|
615 | //void createFrameListener(void)
|
---|
616 | //{
|
---|
617 | // mRoot->addFrameListener(mFrameListener);
|
---|
618 | //}
|
---|
619 |
|
---|
620 | };
|
---|