diff options
Diffstat (limited to 'libraries/irrlicht-1.8/examples/Demo/CDemo.cpp')
-rw-r--r-- | libraries/irrlicht-1.8/examples/Demo/CDemo.cpp | 1630 |
1 files changed, 815 insertions, 815 deletions
diff --git a/libraries/irrlicht-1.8/examples/Demo/CDemo.cpp b/libraries/irrlicht-1.8/examples/Demo/CDemo.cpp index 1ce72a9..b22d1f3 100644 --- a/libraries/irrlicht-1.8/examples/Demo/CDemo.cpp +++ b/libraries/irrlicht-1.8/examples/Demo/CDemo.cpp | |||
@@ -1,815 +1,815 @@ | |||
1 | // This is a Demo of the Irrlicht Engine (c) 2005-2009 by N.Gebhardt. | 1 | // This is a Demo of the Irrlicht Engine (c) 2005-2009 by N.Gebhardt. |
2 | // This file is not documented. | 2 | // This file is not documented. |
3 | 3 | ||
4 | #include "CDemo.h" | 4 | #include "CDemo.h" |
5 | 5 | ||
6 | CDemo::CDemo(bool f, bool m, bool s, bool a, bool v, bool fsaa, video::E_DRIVER_TYPE d) | 6 | CDemo::CDemo(bool f, bool m, bool s, bool a, bool v, bool fsaa, video::E_DRIVER_TYPE d) |
7 | : fullscreen(f), music(m), shadows(s), additive(a), vsync(v), aa(fsaa), | 7 | : fullscreen(f), music(m), shadows(s), additive(a), vsync(v), aa(fsaa), |
8 | driverType(d), device(0), | 8 | driverType(d), device(0), |
9 | #ifdef USE_IRRKLANG | 9 | #ifdef USE_IRRKLANG |
10 | irrKlang(0), ballSound(0), impactSound(0), | 10 | irrKlang(0), ballSound(0), impactSound(0), |
11 | #endif | 11 | #endif |
12 | #ifdef USE_SDL_MIXER | 12 | #ifdef USE_SDL_MIXER |
13 | stream(0), ballSound(0), impactSound(0), | 13 | stream(0), ballSound(0), impactSound(0), |
14 | #endif | 14 | #endif |
15 | currentScene(-2), backColor(0), statusText(0), inOutFader(0), | 15 | currentScene(-2), backColor(0), statusText(0), inOutFader(0), |
16 | quakeLevelMesh(0), quakeLevelNode(0), skyboxNode(0), model1(0), model2(0), | 16 | quakeLevelMesh(0), quakeLevelNode(0), skyboxNode(0), model1(0), model2(0), |
17 | campFire(0), metaSelector(0), mapSelector(0), sceneStartTime(0), | 17 | campFire(0), metaSelector(0), mapSelector(0), sceneStartTime(0), |
18 | timeForThisScene(0) | 18 | timeForThisScene(0) |
19 | { | 19 | { |
20 | } | 20 | } |
21 | 21 | ||
22 | 22 | ||
23 | CDemo::~CDemo() | 23 | CDemo::~CDemo() |
24 | { | 24 | { |
25 | if (mapSelector) | 25 | if (mapSelector) |
26 | mapSelector->drop(); | 26 | mapSelector->drop(); |
27 | 27 | ||
28 | if (metaSelector) | 28 | if (metaSelector) |
29 | metaSelector->drop(); | 29 | metaSelector->drop(); |
30 | 30 | ||
31 | #ifdef USE_IRRKLANG | 31 | #ifdef USE_IRRKLANG |
32 | if (irrKlang) | 32 | if (irrKlang) |
33 | irrKlang->drop(); | 33 | irrKlang->drop(); |
34 | #endif | 34 | #endif |
35 | } | 35 | } |
36 | 36 | ||
37 | 37 | ||
38 | void CDemo::run() | 38 | void CDemo::run() |
39 | { | 39 | { |
40 | core::dimension2d<u32> resolution ( 800, 600 ); | 40 | core::dimension2d<u32> resolution ( 800, 600 ); |
41 | 41 | ||
42 | if ( driverType == video::EDT_BURNINGSVIDEO || driverType == video::EDT_SOFTWARE ) | 42 | if ( driverType == video::EDT_BURNINGSVIDEO || driverType == video::EDT_SOFTWARE ) |
43 | { | 43 | { |
44 | resolution.Width = 640; | 44 | resolution.Width = 640; |
45 | resolution.Height = 480; | 45 | resolution.Height = 480; |
46 | } | 46 | } |
47 | 47 | ||
48 | irr::SIrrlichtCreationParameters params; | 48 | irr::SIrrlichtCreationParameters params; |
49 | params.DriverType=driverType; | 49 | params.DriverType=driverType; |
50 | params.WindowSize=resolution; | 50 | params.WindowSize=resolution; |
51 | params.Bits=32; | 51 | params.Bits=32; |
52 | params.Fullscreen=fullscreen; | 52 | params.Fullscreen=fullscreen; |
53 | params.Stencilbuffer=shadows; | 53 | params.Stencilbuffer=shadows; |
54 | params.Vsync=vsync; | 54 | params.Vsync=vsync; |
55 | params.AntiAlias=aa; | 55 | params.AntiAlias=aa; |
56 | params.EventReceiver=this; | 56 | params.EventReceiver=this; |
57 | 57 | ||
58 | device = createDeviceEx(params); | 58 | device = createDeviceEx(params); |
59 | if (!device) | 59 | if (!device) |
60 | return; | 60 | return; |
61 | 61 | ||
62 | if (device->getFileSystem()->existFile("irrlicht.dat")) | 62 | if (device->getFileSystem()->existFile("irrlicht.dat")) |
63 | device->getFileSystem()->addFileArchive("irrlicht.dat"); | 63 | device->getFileSystem()->addFileArchive("irrlicht.dat"); |
64 | else | 64 | else |
65 | device->getFileSystem()->addFileArchive("../../media/irrlicht.dat"); | 65 | device->getFileSystem()->addFileArchive("../../media/irrlicht.dat"); |
66 | if (device->getFileSystem()->existFile("map-20kdm2.pk3")) | 66 | if (device->getFileSystem()->existFile("map-20kdm2.pk3")) |
67 | device->getFileSystem()->addFileArchive("map-20kdm2.pk3"); | 67 | device->getFileSystem()->addFileArchive("map-20kdm2.pk3"); |
68 | else | 68 | else |
69 | device->getFileSystem()->addFileArchive("../../media/map-20kdm2.pk3"); | 69 | device->getFileSystem()->addFileArchive("../../media/map-20kdm2.pk3"); |
70 | 70 | ||
71 | video::IVideoDriver* driver = device->getVideoDriver(); | 71 | video::IVideoDriver* driver = device->getVideoDriver(); |
72 | scene::ISceneManager* smgr = device->getSceneManager(); | 72 | scene::ISceneManager* smgr = device->getSceneManager(); |
73 | gui::IGUIEnvironment* guienv = device->getGUIEnvironment(); | 73 | gui::IGUIEnvironment* guienv = device->getGUIEnvironment(); |
74 | 74 | ||
75 | device->setWindowCaption(L"Irrlicht Engine Demo"); | 75 | device->setWindowCaption(L"Irrlicht Engine Demo"); |
76 | 76 | ||
77 | // set ambient light | 77 | // set ambient light |
78 | smgr->setAmbientLight ( video::SColorf ( 0x00c0c0c0 ) ); | 78 | smgr->setAmbientLight ( video::SColorf ( 0x00c0c0c0 ) ); |
79 | 79 | ||
80 | wchar_t tmp[255]; | 80 | wchar_t tmp[255]; |
81 | 81 | ||
82 | // draw everything | 82 | // draw everything |
83 | 83 | ||
84 | s32 now = 0; | 84 | s32 now = 0; |
85 | s32 lastfps = 0; | 85 | s32 lastfps = 0; |
86 | sceneStartTime = device->getTimer()->getTime(); | 86 | sceneStartTime = device->getTimer()->getTime(); |
87 | while(device->run() && driver) | 87 | while(device->run() && driver) |
88 | { | 88 | { |
89 | if (device->isWindowActive()) | 89 | if (device->isWindowActive()) |
90 | { | 90 | { |
91 | #ifdef USE_IRRKLANG | 91 | #ifdef USE_IRRKLANG |
92 | // update 3D position for sound engine | 92 | // update 3D position for sound engine |
93 | scene::ICameraSceneNode* cam = smgr->getActiveCamera(); | 93 | scene::ICameraSceneNode* cam = smgr->getActiveCamera(); |
94 | if (cam && irrKlang) | 94 | if (cam && irrKlang) |
95 | irrKlang->setListenerPosition(cam->getAbsolutePosition(), cam->getTarget()); | 95 | irrKlang->setListenerPosition(cam->getAbsolutePosition(), cam->getTarget()); |
96 | #endif | 96 | #endif |
97 | 97 | ||
98 | // load next scene if necessary | 98 | // load next scene if necessary |
99 | now = device->getTimer()->getTime(); | 99 | now = device->getTimer()->getTime(); |
100 | if (now - sceneStartTime > timeForThisScene && timeForThisScene!=-1) | 100 | if (now - sceneStartTime > timeForThisScene && timeForThisScene!=-1) |
101 | switchToNextScene(); | 101 | switchToNextScene(); |
102 | 102 | ||
103 | createParticleImpacts(); | 103 | createParticleImpacts(); |
104 | 104 | ||
105 | driver->beginScene(timeForThisScene != -1, true, backColor); | 105 | driver->beginScene(timeForThisScene != -1, true, backColor); |
106 | 106 | ||
107 | smgr->drawAll(); | 107 | smgr->drawAll(); |
108 | guienv->drawAll(); | 108 | guienv->drawAll(); |
109 | driver->endScene(); | 109 | driver->endScene(); |
110 | 110 | ||
111 | // write statistics | 111 | // write statistics |
112 | const s32 nowfps = driver->getFPS(); | 112 | const s32 nowfps = driver->getFPS(); |
113 | 113 | ||
114 | swprintf(tmp, 255, L"%ls fps:%3d triangles:%0.3f mio/s", | 114 | swprintf(tmp, 255, L"%ls fps:%3d triangles:%0.3f mio/s", |
115 | driver->getName(), driver->getFPS(), | 115 | driver->getName(), driver->getFPS(), |
116 | driver->getPrimitiveCountDrawn(1) * (1.f / 1000000.f)); | 116 | driver->getPrimitiveCountDrawn(1) * (1.f / 1000000.f)); |
117 | 117 | ||
118 | statusText->setText(tmp); | 118 | statusText->setText(tmp); |
119 | if ( nowfps != lastfps ) | 119 | if ( nowfps != lastfps ) |
120 | { | 120 | { |
121 | device->setWindowCaption(tmp); | 121 | device->setWindowCaption(tmp); |
122 | lastfps = nowfps; | 122 | lastfps = nowfps; |
123 | } | 123 | } |
124 | } | 124 | } |
125 | } | 125 | } |
126 | 126 | ||
127 | device->drop(); | 127 | device->drop(); |
128 | } | 128 | } |
129 | 129 | ||
130 | 130 | ||
131 | bool CDemo::OnEvent(const SEvent& event) | 131 | bool CDemo::OnEvent(const SEvent& event) |
132 | { | 132 | { |
133 | if (!device) | 133 | if (!device) |
134 | return false; | 134 | return false; |
135 | 135 | ||
136 | if (event.EventType == EET_KEY_INPUT_EVENT && | 136 | if (event.EventType == EET_KEY_INPUT_EVENT && |
137 | event.KeyInput.Key == KEY_ESCAPE && | 137 | event.KeyInput.Key == KEY_ESCAPE && |
138 | event.KeyInput.PressedDown == false) | 138 | event.KeyInput.PressedDown == false) |
139 | { | 139 | { |
140 | // user wants to quit. | 140 | // user wants to quit. |
141 | if (currentScene < 3) | 141 | if (currentScene < 3) |
142 | timeForThisScene = 0; | 142 | timeForThisScene = 0; |
143 | else | 143 | else |
144 | device->closeDevice(); | 144 | device->closeDevice(); |
145 | } | 145 | } |
146 | else | 146 | else |
147 | if (((event.EventType == EET_KEY_INPUT_EVENT && | 147 | if (((event.EventType == EET_KEY_INPUT_EVENT && |
148 | event.KeyInput.Key == KEY_SPACE && | 148 | event.KeyInput.Key == KEY_SPACE && |
149 | event.KeyInput.PressedDown == false) || | 149 | event.KeyInput.PressedDown == false) || |
150 | (event.EventType == EET_MOUSE_INPUT_EVENT && | 150 | (event.EventType == EET_MOUSE_INPUT_EVENT && |
151 | event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)) && | 151 | event.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)) && |
152 | currentScene == 3) | 152 | currentScene == 3) |
153 | { | 153 | { |
154 | // shoot | 154 | // shoot |
155 | shoot(); | 155 | shoot(); |
156 | } | 156 | } |
157 | else | 157 | else |
158 | if (event.EventType == EET_KEY_INPUT_EVENT && | 158 | if (event.EventType == EET_KEY_INPUT_EVENT && |
159 | event.KeyInput.Key == KEY_F9 && | 159 | event.KeyInput.Key == KEY_F9 && |
160 | event.KeyInput.PressedDown == false) | 160 | event.KeyInput.PressedDown == false) |
161 | { | 161 | { |
162 | video::IImage* image = device->getVideoDriver()->createScreenShot(); | 162 | video::IImage* image = device->getVideoDriver()->createScreenShot(); |
163 | if (image) | 163 | if (image) |
164 | { | 164 | { |
165 | device->getVideoDriver()->writeImageToFile(image, "screenshot.bmp"); | 165 | device->getVideoDriver()->writeImageToFile(image, "screenshot.bmp"); |
166 | device->getVideoDriver()->writeImageToFile(image, "screenshot.png"); | 166 | device->getVideoDriver()->writeImageToFile(image, "screenshot.png"); |
167 | device->getVideoDriver()->writeImageToFile(image, "screenshot.tga"); | 167 | device->getVideoDriver()->writeImageToFile(image, "screenshot.tga"); |
168 | device->getVideoDriver()->writeImageToFile(image, "screenshot.ppm"); | 168 | device->getVideoDriver()->writeImageToFile(image, "screenshot.ppm"); |
169 | device->getVideoDriver()->writeImageToFile(image, "screenshot.jpg"); | 169 | device->getVideoDriver()->writeImageToFile(image, "screenshot.jpg"); |
170 | device->getVideoDriver()->writeImageToFile(image, "screenshot.pcx"); | 170 | device->getVideoDriver()->writeImageToFile(image, "screenshot.pcx"); |
171 | image->drop(); | 171 | image->drop(); |
172 | } | 172 | } |
173 | } | 173 | } |
174 | else | 174 | else |
175 | if (device->getSceneManager()->getActiveCamera()) | 175 | if (device->getSceneManager()->getActiveCamera()) |
176 | { | 176 | { |
177 | device->getSceneManager()->getActiveCamera()->OnEvent(event); | 177 | device->getSceneManager()->getActiveCamera()->OnEvent(event); |
178 | return true; | 178 | return true; |
179 | } | 179 | } |
180 | 180 | ||
181 | return false; | 181 | return false; |
182 | } | 182 | } |
183 | 183 | ||
184 | 184 | ||
185 | void CDemo::switchToNextScene() | 185 | void CDemo::switchToNextScene() |
186 | { | 186 | { |
187 | currentScene++; | 187 | currentScene++; |
188 | if (currentScene > 3) | 188 | if (currentScene > 3) |
189 | currentScene = 1; | 189 | currentScene = 1; |
190 | 190 | ||
191 | scene::ISceneManager* sm = device->getSceneManager(); | 191 | scene::ISceneManager* sm = device->getSceneManager(); |
192 | scene::ISceneNodeAnimator* sa = 0; | 192 | scene::ISceneNodeAnimator* sa = 0; |
193 | scene::ICameraSceneNode* camera = 0; | 193 | scene::ICameraSceneNode* camera = 0; |
194 | 194 | ||
195 | camera = sm->getActiveCamera(); | 195 | camera = sm->getActiveCamera(); |
196 | if (camera) | 196 | if (camera) |
197 | { | 197 | { |
198 | sm->setActiveCamera(0); | 198 | sm->setActiveCamera(0); |
199 | camera->remove(); | 199 | camera->remove(); |
200 | camera = 0; | 200 | camera = 0; |
201 | } | 201 | } |
202 | 202 | ||
203 | switch(currentScene) | 203 | switch(currentScene) |
204 | { | 204 | { |
205 | case -1: // loading screen | 205 | case -1: // loading screen |
206 | timeForThisScene = 0; | 206 | timeForThisScene = 0; |
207 | createLoadingScreen(); | 207 | createLoadingScreen(); |
208 | break; | 208 | break; |
209 | 209 | ||
210 | case 0: // load scene | 210 | case 0: // load scene |
211 | timeForThisScene = 0; | 211 | timeForThisScene = 0; |
212 | loadSceneData(); | 212 | loadSceneData(); |
213 | break; | 213 | break; |
214 | 214 | ||
215 | case 1: // panorama camera | 215 | case 1: // panorama camera |
216 | { | 216 | { |
217 | currentScene += 1; | 217 | currentScene += 1; |
218 | //camera = sm->addCameraSceneNode(0, core::vector3df(0,0,0), core::vector3df(-586,708,52)); | 218 | //camera = sm->addCameraSceneNode(0, core::vector3df(0,0,0), core::vector3df(-586,708,52)); |
219 | //camera->setTarget(core::vector3df(0,400,0)); | 219 | //camera->setTarget(core::vector3df(0,400,0)); |
220 | 220 | ||
221 | core::array<core::vector3df> points; | 221 | core::array<core::vector3df> points; |
222 | 222 | ||
223 | points.push_back(core::vector3df(-931.473755f, 138.300003f, 987.279114f)); // -49873 | 223 | points.push_back(core::vector3df(-931.473755f, 138.300003f, 987.279114f)); // -49873 |
224 | points.push_back(core::vector3df(-847.902222f, 136.757553f, 915.792725f)); // -50559 | 224 | points.push_back(core::vector3df(-847.902222f, 136.757553f, 915.792725f)); // -50559 |
225 | points.push_back(core::vector3df(-748.680420f, 152.254501f, 826.418945f)); // -51964 | 225 | points.push_back(core::vector3df(-748.680420f, 152.254501f, 826.418945f)); // -51964 |
226 | points.push_back(core::vector3df(-708.428406f, 213.569580f, 784.466675f)); // -53251 | 226 | points.push_back(core::vector3df(-708.428406f, 213.569580f, 784.466675f)); // -53251 |
227 | points.push_back(core::vector3df(-686.217651f, 288.141174f, 762.965576f)); // -54015 | 227 | points.push_back(core::vector3df(-686.217651f, 288.141174f, 762.965576f)); // -54015 |
228 | points.push_back(core::vector3df(-679.685059f, 365.095612f, 756.551453f)); // -54733 | 228 | points.push_back(core::vector3df(-679.685059f, 365.095612f, 756.551453f)); // -54733 |
229 | points.push_back(core::vector3df(-671.317871f, 447.360107f, 749.394592f)); // -55588 | 229 | points.push_back(core::vector3df(-671.317871f, 447.360107f, 749.394592f)); // -55588 |
230 | points.push_back(core::vector3df(-669.468445f, 583.335632f, 747.711853f)); // -56178 | 230 | points.push_back(core::vector3df(-669.468445f, 583.335632f, 747.711853f)); // -56178 |
231 | points.push_back(core::vector3df(-667.611267f, 727.313232f, 746.018250f)); // -56757 | 231 | points.push_back(core::vector3df(-667.611267f, 727.313232f, 746.018250f)); // -56757 |
232 | points.push_back(core::vector3df(-665.853210f, 862.791931f, 744.436096f)); // -57859 | 232 | points.push_back(core::vector3df(-665.853210f, 862.791931f, 744.436096f)); // -57859 |
233 | points.push_back(core::vector3df(-642.649597f, 1026.047607f, 724.259827f)); // -59705 | 233 | points.push_back(core::vector3df(-642.649597f, 1026.047607f, 724.259827f)); // -59705 |
234 | points.push_back(core::vector3df(-517.793884f, 838.396790f, 490.326050f)); // -60983 | 234 | points.push_back(core::vector3df(-517.793884f, 838.396790f, 490.326050f)); // -60983 |
235 | points.push_back(core::vector3df(-474.387299f, 715.691467f, 344.639984f)); // -61629 | 235 | points.push_back(core::vector3df(-474.387299f, 715.691467f, 344.639984f)); // -61629 |
236 | points.push_back(core::vector3df(-444.600250f, 601.155701f, 180.938095f)); // -62319 | 236 | points.push_back(core::vector3df(-444.600250f, 601.155701f, 180.938095f)); // -62319 |
237 | points.push_back(core::vector3df(-414.808899f, 479.691406f, 4.866660f)); // -63048 | 237 | points.push_back(core::vector3df(-414.808899f, 479.691406f, 4.866660f)); // -63048 |
238 | points.push_back(core::vector3df(-410.418945f, 429.642242f, -134.332687f)); // -63757 | 238 | points.push_back(core::vector3df(-410.418945f, 429.642242f, -134.332687f)); // -63757 |
239 | points.push_back(core::vector3df(-399.837585f, 411.498383f, -349.350983f)); // -64418 | 239 | points.push_back(core::vector3df(-399.837585f, 411.498383f, -349.350983f)); // -64418 |
240 | points.push_back(core::vector3df(-390.756653f, 403.970093f, -524.454407f)); // -65005 | 240 | points.push_back(core::vector3df(-390.756653f, 403.970093f, -524.454407f)); // -65005 |
241 | points.push_back(core::vector3df(-334.864227f, 350.065491f, -732.397400f)); // -65701 | 241 | points.push_back(core::vector3df(-334.864227f, 350.065491f, -732.397400f)); // -65701 |
242 | points.push_back(core::vector3df(-195.253387f, 349.577209f, -812.475891f)); // -66335 | 242 | points.push_back(core::vector3df(-195.253387f, 349.577209f, -812.475891f)); // -66335 |
243 | points.push_back(core::vector3df(16.255573f, 363.743134f, -833.800415f)); // -67170 | 243 | points.push_back(core::vector3df(16.255573f, 363.743134f, -833.800415f)); // -67170 |
244 | points.push_back(core::vector3df(234.940964f, 352.957825f, -820.150696f)); // -67939 | 244 | points.push_back(core::vector3df(234.940964f, 352.957825f, -820.150696f)); // -67939 |
245 | points.push_back(core::vector3df(436.797668f, 349.236450f, -816.914185f)); // -68596 | 245 | points.push_back(core::vector3df(436.797668f, 349.236450f, -816.914185f)); // -68596 |
246 | points.push_back(core::vector3df(575.236206f, 356.244812f, -719.788513f)); // -69166 | 246 | points.push_back(core::vector3df(575.236206f, 356.244812f, -719.788513f)); // -69166 |
247 | points.push_back(core::vector3df(594.131042f, 387.173828f, -609.675598f)); // -69744 | 247 | points.push_back(core::vector3df(594.131042f, 387.173828f, -609.675598f)); // -69744 |
248 | points.push_back(core::vector3df(617.615234f, 412.002899f, -326.174072f)); // -70640 | 248 | points.push_back(core::vector3df(617.615234f, 412.002899f, -326.174072f)); // -70640 |
249 | points.push_back(core::vector3df(606.456848f, 403.221954f, -104.179291f)); // -71390 | 249 | points.push_back(core::vector3df(606.456848f, 403.221954f, -104.179291f)); // -71390 |
250 | points.push_back(core::vector3df(610.958252f, 407.037750f, 117.209778f)); // -72085 | 250 | points.push_back(core::vector3df(610.958252f, 407.037750f, 117.209778f)); // -72085 |
251 | points.push_back(core::vector3df(597.956909f, 395.167877f, 345.942200f)); // -72817 | 251 | points.push_back(core::vector3df(597.956909f, 395.167877f, 345.942200f)); // -72817 |
252 | points.push_back(core::vector3df(587.383118f, 391.444519f, 566.098633f)); // -73477 | 252 | points.push_back(core::vector3df(587.383118f, 391.444519f, 566.098633f)); // -73477 |
253 | points.push_back(core::vector3df(559.572449f, 371.991333f, 777.689453f)); // -74124 | 253 | points.push_back(core::vector3df(559.572449f, 371.991333f, 777.689453f)); // -74124 |
254 | points.push_back(core::vector3df(423.753204f, 329.990051f, 925.859741f)); // -74941 | 254 | points.push_back(core::vector3df(423.753204f, 329.990051f, 925.859741f)); // -74941 |
255 | points.push_back(core::vector3df(247.520050f, 252.818954f, 935.311829f)); // -75651 | 255 | points.push_back(core::vector3df(247.520050f, 252.818954f, 935.311829f)); // -75651 |
256 | points.push_back(core::vector3df(114.756012f, 199.799759f, 805.014160f)); | 256 | points.push_back(core::vector3df(114.756012f, 199.799759f, 805.014160f)); |
257 | points.push_back(core::vector3df(96.783348f, 181.639481f, 648.188110f)); | 257 | points.push_back(core::vector3df(96.783348f, 181.639481f, 648.188110f)); |
258 | points.push_back(core::vector3df(97.865623f, 138.905975f, 484.812561f)); | 258 | points.push_back(core::vector3df(97.865623f, 138.905975f, 484.812561f)); |
259 | points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); | 259 | points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); |
260 | points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); | 260 | points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); |
261 | points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); | 261 | points.push_back(core::vector3df(99.612457f, 102.463669f, 347.603210f)); |
262 | 262 | ||
263 | timeForThisScene = (points.size()-3)* 1000; | 263 | timeForThisScene = (points.size()-3)* 1000; |
264 | 264 | ||
265 | camera = sm->addCameraSceneNode(0, points[0], core::vector3df(0 ,400,0)); | 265 | camera = sm->addCameraSceneNode(0, points[0], core::vector3df(0 ,400,0)); |
266 | //camera->setTarget(core::vector3df(0,400,0)); | 266 | //camera->setTarget(core::vector3df(0,400,0)); |
267 | 267 | ||
268 | sa = sm->createFollowSplineAnimator(device->getTimer()->getTime(), | 268 | sa = sm->createFollowSplineAnimator(device->getTimer()->getTime(), |
269 | points); | 269 | points); |
270 | camera->addAnimator(sa); | 270 | camera->addAnimator(sa); |
271 | sa->drop(); | 271 | sa->drop(); |
272 | 272 | ||
273 | model1->setVisible(false); | 273 | model1->setVisible(false); |
274 | model2->setVisible(false); | 274 | model2->setVisible(false); |
275 | campFire->setVisible(false); | 275 | campFire->setVisible(false); |
276 | inOutFader->fadeIn(7000); | 276 | inOutFader->fadeIn(7000); |
277 | } | 277 | } |
278 | break; | 278 | break; |
279 | 279 | ||
280 | case 2: // down fly anim camera | 280 | case 2: // down fly anim camera |
281 | camera = sm->addCameraSceneNode(0, core::vector3df(100,40,-80), core::vector3df(844,670,-885)); | 281 | camera = sm->addCameraSceneNode(0, core::vector3df(100,40,-80), core::vector3df(844,670,-885)); |
282 | sa = sm->createFlyStraightAnimator(core::vector3df(94, 1002, 127), | 282 | sa = sm->createFlyStraightAnimator(core::vector3df(94, 1002, 127), |
283 | core::vector3df(108, 15, -60), 10000, true); | 283 | core::vector3df(108, 15, -60), 10000, true); |
284 | camera->addAnimator(sa); | 284 | camera->addAnimator(sa); |
285 | timeForThisScene = 9900; | 285 | timeForThisScene = 9900; |
286 | model1->setVisible(true); | 286 | model1->setVisible(true); |
287 | model2->setVisible(false); | 287 | model2->setVisible(false); |
288 | campFire->setVisible(false); | 288 | campFire->setVisible(false); |
289 | sa->drop(); | 289 | sa->drop(); |
290 | break; | 290 | break; |
291 | 291 | ||
292 | case 3: // interactive, go around | 292 | case 3: // interactive, go around |
293 | { | 293 | { |
294 | model1->setVisible(true); | 294 | model1->setVisible(true); |
295 | model2->setVisible(true); | 295 | model2->setVisible(true); |
296 | campFire->setVisible(true); | 296 | campFire->setVisible(true); |
297 | timeForThisScene = -1; | 297 | timeForThisScene = -1; |
298 | 298 | ||
299 | SKeyMap keyMap[9]; | 299 | SKeyMap keyMap[9]; |
300 | keyMap[0].Action = EKA_MOVE_FORWARD; | 300 | keyMap[0].Action = EKA_MOVE_FORWARD; |
301 | keyMap[0].KeyCode = KEY_UP; | 301 | keyMap[0].KeyCode = KEY_UP; |
302 | keyMap[1].Action = EKA_MOVE_FORWARD; | 302 | keyMap[1].Action = EKA_MOVE_FORWARD; |
303 | keyMap[1].KeyCode = KEY_KEY_W; | 303 | keyMap[1].KeyCode = KEY_KEY_W; |
304 | 304 | ||
305 | keyMap[2].Action = EKA_MOVE_BACKWARD; | 305 | keyMap[2].Action = EKA_MOVE_BACKWARD; |
306 | keyMap[2].KeyCode = KEY_DOWN; | 306 | keyMap[2].KeyCode = KEY_DOWN; |
307 | keyMap[3].Action = EKA_MOVE_BACKWARD; | 307 | keyMap[3].Action = EKA_MOVE_BACKWARD; |
308 | keyMap[3].KeyCode = KEY_KEY_S; | 308 | keyMap[3].KeyCode = KEY_KEY_S; |
309 | 309 | ||
310 | keyMap[4].Action = EKA_STRAFE_LEFT; | 310 | keyMap[4].Action = EKA_STRAFE_LEFT; |
311 | keyMap[4].KeyCode = KEY_LEFT; | 311 | keyMap[4].KeyCode = KEY_LEFT; |
312 | keyMap[5].Action = EKA_STRAFE_LEFT; | 312 | keyMap[5].Action = EKA_STRAFE_LEFT; |
313 | keyMap[5].KeyCode = KEY_KEY_A; | 313 | keyMap[5].KeyCode = KEY_KEY_A; |
314 | 314 | ||
315 | keyMap[6].Action = EKA_STRAFE_RIGHT; | 315 | keyMap[6].Action = EKA_STRAFE_RIGHT; |
316 | keyMap[6].KeyCode = KEY_RIGHT; | 316 | keyMap[6].KeyCode = KEY_RIGHT; |
317 | keyMap[7].Action = EKA_STRAFE_RIGHT; | 317 | keyMap[7].Action = EKA_STRAFE_RIGHT; |
318 | keyMap[7].KeyCode = KEY_KEY_D; | 318 | keyMap[7].KeyCode = KEY_KEY_D; |
319 | 319 | ||
320 | keyMap[8].Action = EKA_JUMP_UP; | 320 | keyMap[8].Action = EKA_JUMP_UP; |
321 | keyMap[8].KeyCode = KEY_KEY_J; | 321 | keyMap[8].KeyCode = KEY_KEY_J; |
322 | 322 | ||
323 | camera = sm->addCameraSceneNodeFPS(0, 100.0f, .4f, -1, keyMap, 9, false, 3.f); | 323 | camera = sm->addCameraSceneNodeFPS(0, 100.0f, .4f, -1, keyMap, 9, false, 3.f); |
324 | camera->setPosition(core::vector3df(108,140,-140)); | 324 | camera->setPosition(core::vector3df(108,140,-140)); |
325 | camera->setFarValue(5000.0f); | 325 | camera->setFarValue(5000.0f); |
326 | 326 | ||
327 | scene::ISceneNodeAnimatorCollisionResponse* collider = | 327 | scene::ISceneNodeAnimatorCollisionResponse* collider = |
328 | sm->createCollisionResponseAnimator( | 328 | sm->createCollisionResponseAnimator( |
329 | metaSelector, camera, core::vector3df(25,50,25), | 329 | metaSelector, camera, core::vector3df(25,50,25), |
330 | core::vector3df(0, quakeLevelMesh ? -10.f : 0.0f,0), | 330 | core::vector3df(0, quakeLevelMesh ? -10.f : 0.0f,0), |
331 | core::vector3df(0,45,0), 0.005f); | 331 | core::vector3df(0,45,0), 0.005f); |
332 | 332 | ||
333 | camera->addAnimator(collider); | 333 | camera->addAnimator(collider); |
334 | collider->drop(); | 334 | collider->drop(); |
335 | } | 335 | } |
336 | break; | 336 | break; |
337 | } | 337 | } |
338 | 338 | ||
339 | sceneStartTime = device->getTimer()->getTime(); | 339 | sceneStartTime = device->getTimer()->getTime(); |
340 | } | 340 | } |
341 | 341 | ||
342 | 342 | ||
343 | void CDemo::loadSceneData() | 343 | void CDemo::loadSceneData() |
344 | { | 344 | { |
345 | // load quake level | 345 | // load quake level |
346 | 346 | ||
347 | video::IVideoDriver* driver = device->getVideoDriver(); | 347 | video::IVideoDriver* driver = device->getVideoDriver(); |
348 | scene::ISceneManager* sm = device->getSceneManager(); | 348 | scene::ISceneManager* sm = device->getSceneManager(); |
349 | 349 | ||
350 | // Quake3 Shader controls Z-Writing | 350 | // Quake3 Shader controls Z-Writing |
351 | sm->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); | 351 | sm->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, true); |
352 | 352 | ||
353 | quakeLevelMesh = (scene::IQ3LevelMesh*) sm->getMesh("maps/20kdm2.bsp"); | 353 | quakeLevelMesh = (scene::IQ3LevelMesh*) sm->getMesh("maps/20kdm2.bsp"); |
354 | 354 | ||
355 | if (quakeLevelMesh) | 355 | if (quakeLevelMesh) |
356 | { | 356 | { |
357 | u32 i; | 357 | u32 i; |
358 | 358 | ||
359 | //move all quake level meshes (non-realtime) | 359 | //move all quake level meshes (non-realtime) |
360 | core::matrix4 m; | 360 | core::matrix4 m; |
361 | m.setTranslation(core::vector3df(-1300,-70,-1249)); | 361 | m.setTranslation(core::vector3df(-1300,-70,-1249)); |
362 | 362 | ||
363 | for ( i = 0; i != scene::quake3::E_Q3_MESH_SIZE; ++i ) | 363 | for ( i = 0; i != scene::quake3::E_Q3_MESH_SIZE; ++i ) |
364 | sm->getMeshManipulator()->transform(quakeLevelMesh->getMesh(i), m); | 364 | sm->getMeshManipulator()->transform(quakeLevelMesh->getMesh(i), m); |
365 | 365 | ||
366 | quakeLevelNode = sm->addOctreeSceneNode( | 366 | quakeLevelNode = sm->addOctreeSceneNode( |
367 | quakeLevelMesh->getMesh( scene::quake3::E_Q3_MESH_GEOMETRY)); | 367 | quakeLevelMesh->getMesh( scene::quake3::E_Q3_MESH_GEOMETRY)); |
368 | if (quakeLevelNode) | 368 | if (quakeLevelNode) |
369 | { | 369 | { |
370 | //quakeLevelNode->setPosition(core::vector3df(-1300,-70,-1249)); | 370 | //quakeLevelNode->setPosition(core::vector3df(-1300,-70,-1249)); |
371 | quakeLevelNode->setVisible(true); | 371 | quakeLevelNode->setVisible(true); |
372 | 372 | ||
373 | // create map triangle selector | 373 | // create map triangle selector |
374 | mapSelector = sm->createOctreeTriangleSelector(quakeLevelMesh->getMesh(0), | 374 | mapSelector = sm->createOctreeTriangleSelector(quakeLevelMesh->getMesh(0), |
375 | quakeLevelNode, 128); | 375 | quakeLevelNode, 128); |
376 | 376 | ||
377 | // if not using shader and no gamma it's better to use more lighting, because | 377 | // if not using shader and no gamma it's better to use more lighting, because |
378 | // quake3 level are usually dark | 378 | // quake3 level are usually dark |
379 | quakeLevelNode->setMaterialType ( video::EMT_LIGHTMAP_M4 ); | 379 | quakeLevelNode->setMaterialType ( video::EMT_LIGHTMAP_M4 ); |
380 | 380 | ||
381 | // set additive blending if wanted | 381 | // set additive blending if wanted |
382 | if (additive) | 382 | if (additive) |
383 | quakeLevelNode->setMaterialType(video::EMT_LIGHTMAP_ADD); | 383 | quakeLevelNode->setMaterialType(video::EMT_LIGHTMAP_ADD); |
384 | } | 384 | } |
385 | 385 | ||
386 | // the additional mesh can be quite huge and is unoptimized | 386 | // the additional mesh can be quite huge and is unoptimized |
387 | scene::IMesh * additional_mesh = quakeLevelMesh->getMesh ( scene::quake3::E_Q3_MESH_ITEMS ); | 387 | scene::IMesh * additional_mesh = quakeLevelMesh->getMesh ( scene::quake3::E_Q3_MESH_ITEMS ); |
388 | 388 | ||
389 | for ( i = 0; i!= additional_mesh->getMeshBufferCount (); ++i ) | 389 | for ( i = 0; i!= additional_mesh->getMeshBufferCount (); ++i ) |
390 | { | 390 | { |
391 | scene::IMeshBuffer *meshBuffer = additional_mesh->getMeshBuffer ( i ); | 391 | scene::IMeshBuffer *meshBuffer = additional_mesh->getMeshBuffer ( i ); |
392 | const video::SMaterial &material = meshBuffer->getMaterial(); | 392 | const video::SMaterial &material = meshBuffer->getMaterial(); |
393 | 393 | ||
394 | //! The ShaderIndex is stored in the material parameter | 394 | //! The ShaderIndex is stored in the material parameter |
395 | s32 shaderIndex = (s32) material.MaterialTypeParam2; | 395 | s32 shaderIndex = (s32) material.MaterialTypeParam2; |
396 | 396 | ||
397 | // the meshbuffer can be rendered without additional support, or it has no shader | 397 | // the meshbuffer can be rendered without additional support, or it has no shader |
398 | const scene::quake3::IShader *shader = quakeLevelMesh->getShader ( shaderIndex ); | 398 | const scene::quake3::IShader *shader = quakeLevelMesh->getShader ( shaderIndex ); |
399 | if ( 0 == shader ) | 399 | if ( 0 == shader ) |
400 | { | 400 | { |
401 | continue; | 401 | continue; |
402 | } | 402 | } |
403 | // Now add the MeshBuffer(s) with the current Shader to the Manager | 403 | // Now add the MeshBuffer(s) with the current Shader to the Manager |
404 | sm->addQuake3SceneNode ( meshBuffer, shader ); | 404 | sm->addQuake3SceneNode ( meshBuffer, shader ); |
405 | } | 405 | } |
406 | } | 406 | } |
407 | 407 | ||
408 | // load sydney model and create 2 instances | 408 | // load sydney model and create 2 instances |
409 | 409 | ||
410 | scene::IAnimatedMesh* mesh = 0; | 410 | scene::IAnimatedMesh* mesh = 0; |
411 | mesh = sm->getMesh("../../media/sydney.md2"); | 411 | mesh = sm->getMesh("../../media/sydney.md2"); |
412 | if (mesh) | 412 | if (mesh) |
413 | { | 413 | { |
414 | model1 = sm->addAnimatedMeshSceneNode(mesh); | 414 | model1 = sm->addAnimatedMeshSceneNode(mesh); |
415 | if (model1) | 415 | if (model1) |
416 | { | 416 | { |
417 | model1->setMaterialTexture(0, driver->getTexture("../../media/spheremap.jpg")); | 417 | model1->setMaterialTexture(0, driver->getTexture("../../media/spheremap.jpg")); |
418 | model1->setPosition(core::vector3df(100,40,-80)); | 418 | model1->setPosition(core::vector3df(100,40,-80)); |
419 | model1->setScale(core::vector3df(2,2,2)); | 419 | model1->setScale(core::vector3df(2,2,2)); |
420 | model1->setMD2Animation(scene::EMAT_STAND); | 420 | model1->setMD2Animation(scene::EMAT_STAND); |
421 | model1->setMaterialFlag(video::EMF_LIGHTING, false); | 421 | model1->setMaterialFlag(video::EMF_LIGHTING, false); |
422 | model1->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); | 422 | model1->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); |
423 | model1->setMaterialType(video::EMT_SPHERE_MAP); | 423 | model1->setMaterialType(video::EMT_SPHERE_MAP); |
424 | model1->addShadowVolumeSceneNode(); | 424 | model1->addShadowVolumeSceneNode(); |
425 | } | 425 | } |
426 | 426 | ||
427 | model2 = sm->addAnimatedMeshSceneNode(mesh); | 427 | model2 = sm->addAnimatedMeshSceneNode(mesh); |
428 | if (model2) | 428 | if (model2) |
429 | { | 429 | { |
430 | model2->setPosition(core::vector3df(180,15,-60)); | 430 | model2->setPosition(core::vector3df(180,15,-60)); |
431 | model2->setScale(core::vector3df(2,2,2)); | 431 | model2->setScale(core::vector3df(2,2,2)); |
432 | model2->setMD2Animation(scene::EMAT_RUN); | 432 | model2->setMD2Animation(scene::EMAT_RUN); |
433 | model2->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/sydney.bmp")); | 433 | model2->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/sydney.bmp")); |
434 | model2->setMaterialFlag(video::EMF_LIGHTING, true); | 434 | model2->setMaterialFlag(video::EMF_LIGHTING, true); |
435 | model2->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); | 435 | model2->setMaterialFlag(video::EMF_NORMALIZE_NORMALS, true); |
436 | model2->addShadowVolumeSceneNode(); | 436 | model2->addShadowVolumeSceneNode(); |
437 | } | 437 | } |
438 | } | 438 | } |
439 | 439 | ||
440 | scene::ISceneNodeAnimator* anim = 0; | 440 | scene::ISceneNodeAnimator* anim = 0; |
441 | 441 | ||
442 | // create sky box | 442 | // create sky box |
443 | driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); | 443 | driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, false); |
444 | skyboxNode = sm->addSkyBoxSceneNode( | 444 | skyboxNode = sm->addSkyBoxSceneNode( |
445 | driver->getTexture("../../media/irrlicht2_up.jpg"), | 445 | driver->getTexture("../../media/irrlicht2_up.jpg"), |
446 | driver->getTexture("../../media/irrlicht2_dn.jpg"), | 446 | driver->getTexture("../../media/irrlicht2_dn.jpg"), |
447 | driver->getTexture("../../media/irrlicht2_lf.jpg"), | 447 | driver->getTexture("../../media/irrlicht2_lf.jpg"), |
448 | driver->getTexture("../../media/irrlicht2_rt.jpg"), | 448 | driver->getTexture("../../media/irrlicht2_rt.jpg"), |
449 | driver->getTexture("../../media/irrlicht2_ft.jpg"), | 449 | driver->getTexture("../../media/irrlicht2_ft.jpg"), |
450 | driver->getTexture("../../media/irrlicht2_bk.jpg")); | 450 | driver->getTexture("../../media/irrlicht2_bk.jpg")); |
451 | driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true); | 451 | driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, true); |
452 | 452 | ||
453 | // create walk-between-portals animation | 453 | // create walk-between-portals animation |
454 | 454 | ||
455 | core::vector3df waypoint[2]; | 455 | core::vector3df waypoint[2]; |
456 | waypoint[0].set(-150,40,100); | 456 | waypoint[0].set(-150,40,100); |
457 | waypoint[1].set(350,40,100); | 457 | waypoint[1].set(350,40,100); |
458 | 458 | ||
459 | if (model2) | 459 | if (model2) |
460 | { | 460 | { |
461 | anim = device->getSceneManager()->createFlyStraightAnimator( | 461 | anim = device->getSceneManager()->createFlyStraightAnimator( |
462 | waypoint[0], waypoint[1], 2000, true); | 462 | waypoint[0], waypoint[1], 2000, true); |
463 | model2->addAnimator(anim); | 463 | model2->addAnimator(anim); |
464 | anim->drop(); | 464 | anim->drop(); |
465 | } | 465 | } |
466 | 466 | ||
467 | // create animation for portals; | 467 | // create animation for portals; |
468 | 468 | ||
469 | core::array<video::ITexture*> textures; | 469 | core::array<video::ITexture*> textures; |
470 | for (s32 g=1; g<8; ++g) | 470 | for (s32 g=1; g<8; ++g) |
471 | { | 471 | { |
472 | core::stringc tmp("../../media/portal"); | 472 | core::stringc tmp("../../media/portal"); |
473 | tmp += g; | 473 | tmp += g; |
474 | tmp += ".bmp"; | 474 | tmp += ".bmp"; |
475 | video::ITexture* t = driver->getTexture( tmp ); | 475 | video::ITexture* t = driver->getTexture( tmp ); |
476 | textures.push_back(t); | 476 | textures.push_back(t); |
477 | } | 477 | } |
478 | 478 | ||
479 | anim = sm->createTextureAnimator(textures, 100); | 479 | anim = sm->createTextureAnimator(textures, 100); |
480 | 480 | ||
481 | // create portals | 481 | // create portals |
482 | 482 | ||
483 | scene::IBillboardSceneNode* bill = 0; | 483 | scene::IBillboardSceneNode* bill = 0; |
484 | 484 | ||
485 | for (int r=0; r<2; ++r) | 485 | for (int r=0; r<2; ++r) |
486 | { | 486 | { |
487 | bill = sm->addBillboardSceneNode(0, core::dimension2d<f32>(100,100), | 487 | bill = sm->addBillboardSceneNode(0, core::dimension2d<f32>(100,100), |
488 | waypoint[r]+ core::vector3df(0,20,0)); | 488 | waypoint[r]+ core::vector3df(0,20,0)); |
489 | bill->setMaterialFlag(video::EMF_LIGHTING, false); | 489 | bill->setMaterialFlag(video::EMF_LIGHTING, false); |
490 | bill->setMaterialTexture(0, driver->getTexture("../../media/portal1.bmp")); | 490 | bill->setMaterialTexture(0, driver->getTexture("../../media/portal1.bmp")); |
491 | bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); | 491 | bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); |
492 | bill->addAnimator(anim); | 492 | bill->addAnimator(anim); |
493 | } | 493 | } |
494 | 494 | ||
495 | anim->drop(); | 495 | anim->drop(); |
496 | 496 | ||
497 | // create cirlce flying dynamic light with transparent billboard attached | 497 | // create cirlce flying dynamic light with transparent billboard attached |
498 | 498 | ||
499 | scene::ILightSceneNode* light = 0; | 499 | scene::ILightSceneNode* light = 0; |
500 | 500 | ||
501 | light = sm->addLightSceneNode(0, | 501 | light = sm->addLightSceneNode(0, |
502 | core::vector3df(0,0,0), video::SColorf(1.0f, 1.0f, 1.f, 1.0f), 500.f); | 502 | core::vector3df(0,0,0), video::SColorf(1.0f, 1.0f, 1.f, 1.0f), 500.f); |
503 | 503 | ||
504 | anim = sm->createFlyCircleAnimator( | 504 | anim = sm->createFlyCircleAnimator( |
505 | core::vector3df(100,150,80), 80.0f, 0.0005f); | 505 | core::vector3df(100,150,80), 80.0f, 0.0005f); |
506 | 506 | ||
507 | light->addAnimator(anim); | 507 | light->addAnimator(anim); |
508 | anim->drop(); | 508 | anim->drop(); |
509 | 509 | ||
510 | bill = device->getSceneManager()->addBillboardSceneNode( | 510 | bill = device->getSceneManager()->addBillboardSceneNode( |
511 | light, core::dimension2d<f32>(40,40)); | 511 | light, core::dimension2d<f32>(40,40)); |
512 | bill->setMaterialFlag(video::EMF_LIGHTING, false); | 512 | bill->setMaterialFlag(video::EMF_LIGHTING, false); |
513 | bill->setMaterialTexture(0, driver->getTexture("../../media/particlewhite.bmp")); | 513 | bill->setMaterialTexture(0, driver->getTexture("../../media/particlewhite.bmp")); |
514 | bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); | 514 | bill->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); |
515 | 515 | ||
516 | // create meta triangle selector with all triangles selectors in it. | 516 | // create meta triangle selector with all triangles selectors in it. |
517 | metaSelector = sm->createMetaTriangleSelector(); | 517 | metaSelector = sm->createMetaTriangleSelector(); |
518 | metaSelector->addTriangleSelector(mapSelector); | 518 | metaSelector->addTriangleSelector(mapSelector); |
519 | 519 | ||
520 | // create camp fire | 520 | // create camp fire |
521 | 521 | ||
522 | campFire = sm->addParticleSystemSceneNode(false); | 522 | campFire = sm->addParticleSystemSceneNode(false); |
523 | campFire->setPosition(core::vector3df(100,120,600)); | 523 | campFire->setPosition(core::vector3df(100,120,600)); |
524 | campFire->setScale(core::vector3df(2,2,2)); | 524 | campFire->setScale(core::vector3df(2,2,2)); |
525 | 525 | ||
526 | scene::IParticleEmitter* em = campFire->createBoxEmitter( | 526 | scene::IParticleEmitter* em = campFire->createBoxEmitter( |
527 | core::aabbox3d<f32>(-7,0,-7,7,1,7), | 527 | core::aabbox3d<f32>(-7,0,-7,7,1,7), |
528 | core::vector3df(0.0f,0.06f,0.0f), | 528 | core::vector3df(0.0f,0.06f,0.0f), |
529 | 80,100, video::SColor(1,255,255,255),video::SColor(1,255,255,255), 800,2000); | 529 | 80,100, video::SColor(1,255,255,255),video::SColor(1,255,255,255), 800,2000); |
530 | 530 | ||
531 | em->setMinStartSize(core::dimension2d<f32>(20.0f, 10.0f)); | 531 | em->setMinStartSize(core::dimension2d<f32>(20.0f, 10.0f)); |
532 | em->setMaxStartSize(core::dimension2d<f32>(20.0f, 10.0f)); | 532 | em->setMaxStartSize(core::dimension2d<f32>(20.0f, 10.0f)); |
533 | campFire->setEmitter(em); | 533 | campFire->setEmitter(em); |
534 | em->drop(); | 534 | em->drop(); |
535 | 535 | ||
536 | scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector(); | 536 | scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector(); |
537 | campFire->addAffector(paf); | 537 | campFire->addAffector(paf); |
538 | paf->drop(); | 538 | paf->drop(); |
539 | 539 | ||
540 | campFire->setMaterialFlag(video::EMF_LIGHTING, false); | 540 | campFire->setMaterialFlag(video::EMF_LIGHTING, false); |
541 | campFire->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); | 541 | campFire->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); |
542 | campFire->setMaterialTexture(0, driver->getTexture("../../media/fireball.bmp")); | 542 | campFire->setMaterialTexture(0, driver->getTexture("../../media/fireball.bmp")); |
543 | campFire->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); | 543 | campFire->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); |
544 | 544 | ||
545 | // load music | 545 | // load music |
546 | 546 | ||
547 | #ifdef USE_IRRKLANG | 547 | #ifdef USE_IRRKLANG |
548 | if (music) | 548 | if (music) |
549 | startIrrKlang(); | 549 | startIrrKlang(); |
550 | #endif | 550 | #endif |
551 | #ifdef USE_SDL_MIXER | 551 | #ifdef USE_SDL_MIXER |
552 | if (music) | 552 | if (music) |
553 | startSound(); | 553 | startSound(); |
554 | #endif | 554 | #endif |
555 | } | 555 | } |
556 | 556 | ||
557 | 557 | ||
558 | void CDemo::createLoadingScreen() | 558 | void CDemo::createLoadingScreen() |
559 | { | 559 | { |
560 | core::dimension2d<u32> size = device->getVideoDriver()->getScreenSize(); | 560 | core::dimension2d<u32> size = device->getVideoDriver()->getScreenSize(); |
561 | 561 | ||
562 | device->getCursorControl()->setVisible(false); | 562 | device->getCursorControl()->setVisible(false); |
563 | 563 | ||
564 | // setup loading screen | 564 | // setup loading screen |
565 | 565 | ||
566 | backColor.set(255,90,90,156); | 566 | backColor.set(255,90,90,156); |
567 | 567 | ||
568 | // create in fader | 568 | // create in fader |
569 | 569 | ||
570 | inOutFader = device->getGUIEnvironment()->addInOutFader(); | 570 | inOutFader = device->getGUIEnvironment()->addInOutFader(); |
571 | inOutFader->setColor(backColor, video::SColor ( 0, 230, 230, 230 )); | 571 | inOutFader->setColor(backColor, video::SColor ( 0, 230, 230, 230 )); |
572 | 572 | ||
573 | // irrlicht logo | 573 | // irrlicht logo |
574 | device->getGUIEnvironment()->addImage(device->getVideoDriver()->getTexture("../../media/irrlichtlogo2.png"), | 574 | device->getGUIEnvironment()->addImage(device->getVideoDriver()->getTexture("../../media/irrlichtlogo2.png"), |
575 | core::position2d<s32>(5,5)); | 575 | core::position2d<s32>(5,5)); |
576 | 576 | ||
577 | // loading text | 577 | // loading text |
578 | 578 | ||
579 | const int lwidth = size.Width - 20; | 579 | const int lwidth = size.Width - 20; |
580 | const int lheight = 16; | 580 | const int lheight = 16; |
581 | 581 | ||
582 | core::rect<int> pos(10, size.Height-lheight-10, 10+lwidth, size.Height-10); | 582 | core::rect<int> pos(10, size.Height-lheight-10, 10+lwidth, size.Height-10); |
583 | 583 | ||
584 | device->getGUIEnvironment()->addImage(pos); | 584 | device->getGUIEnvironment()->addImage(pos); |
585 | statusText = device->getGUIEnvironment()->addStaticText(L"Loading...", pos, true); | 585 | statusText = device->getGUIEnvironment()->addStaticText(L"Loading...", pos, true); |
586 | statusText->setOverrideColor(video::SColor(255,205,200,200)); | 586 | statusText->setOverrideColor(video::SColor(255,205,200,200)); |
587 | 587 | ||
588 | // load bigger font | 588 | // load bigger font |
589 | 589 | ||
590 | device->getGUIEnvironment()->getSkin()->setFont( | 590 | device->getGUIEnvironment()->getSkin()->setFont( |
591 | device->getGUIEnvironment()->getFont("../../media/fonthaettenschweiler.bmp")); | 591 | device->getGUIEnvironment()->getFont("../../media/fonthaettenschweiler.bmp")); |
592 | 592 | ||
593 | // set new font color | 593 | // set new font color |
594 | 594 | ||
595 | device->getGUIEnvironment()->getSkin()->setColor(gui::EGDC_BUTTON_TEXT, | 595 | device->getGUIEnvironment()->getSkin()->setColor(gui::EGDC_BUTTON_TEXT, |
596 | video::SColor(255,100,100,100)); | 596 | video::SColor(255,100,100,100)); |
597 | } | 597 | } |
598 | 598 | ||
599 | 599 | ||
600 | void CDemo::shoot() | 600 | void CDemo::shoot() |
601 | { | 601 | { |
602 | scene::ISceneManager* sm = device->getSceneManager(); | 602 | scene::ISceneManager* sm = device->getSceneManager(); |
603 | scene::ICameraSceneNode* camera = sm->getActiveCamera(); | 603 | scene::ICameraSceneNode* camera = sm->getActiveCamera(); |
604 | 604 | ||
605 | if (!camera || !mapSelector) | 605 | if (!camera || !mapSelector) |
606 | return; | 606 | return; |
607 | 607 | ||
608 | SParticleImpact imp; | 608 | SParticleImpact imp; |
609 | imp.when = 0; | 609 | imp.when = 0; |
610 | 610 | ||
611 | // get line of camera | 611 | // get line of camera |
612 | 612 | ||
613 | core::vector3df start = camera->getPosition(); | 613 | core::vector3df start = camera->getPosition(); |
614 | core::vector3df end = (camera->getTarget() - start); | 614 | core::vector3df end = (camera->getTarget() - start); |
615 | end.normalize(); | 615 | end.normalize(); |
616 | start += end*8.0f; | 616 | start += end*8.0f; |
617 | end = start + (end * camera->getFarValue()); | 617 | end = start + (end * camera->getFarValue()); |
618 | 618 | ||
619 | core::triangle3df triangle; | 619 | core::triangle3df triangle; |
620 | 620 | ||
621 | core::line3d<f32> line(start, end); | 621 | core::line3d<f32> line(start, end); |
622 | 622 | ||
623 | // get intersection point with map | 623 | // get intersection point with map |
624 | scene::ISceneNode* hitNode; | 624 | scene::ISceneNode* hitNode; |
625 | if (sm->getSceneCollisionManager()->getCollisionPoint( | 625 | if (sm->getSceneCollisionManager()->getCollisionPoint( |
626 | line, mapSelector, end, triangle, hitNode)) | 626 | line, mapSelector, end, triangle, hitNode)) |
627 | { | 627 | { |
628 | // collides with wall | 628 | // collides with wall |
629 | core::vector3df out = triangle.getNormal(); | 629 | core::vector3df out = triangle.getNormal(); |
630 | out.setLength(0.03f); | 630 | out.setLength(0.03f); |
631 | 631 | ||
632 | imp.when = 1; | 632 | imp.when = 1; |
633 | imp.outVector = out; | 633 | imp.outVector = out; |
634 | imp.pos = end; | 634 | imp.pos = end; |
635 | } | 635 | } |
636 | else | 636 | else |
637 | { | 637 | { |
638 | // doesnt collide with wall | 638 | // doesnt collide with wall |
639 | core::vector3df start = camera->getPosition(); | 639 | core::vector3df start = camera->getPosition(); |
640 | core::vector3df end = (camera->getTarget() - start); | 640 | core::vector3df end = (camera->getTarget() - start); |
641 | end.normalize(); | 641 | end.normalize(); |
642 | start += end*8.0f; | 642 | start += end*8.0f; |
643 | end = start + (end * camera->getFarValue()); | 643 | end = start + (end * camera->getFarValue()); |
644 | } | 644 | } |
645 | 645 | ||
646 | // create fire ball | 646 | // create fire ball |
647 | scene::ISceneNode* node = 0; | 647 | scene::ISceneNode* node = 0; |
648 | node = sm->addBillboardSceneNode(0, | 648 | node = sm->addBillboardSceneNode(0, |
649 | core::dimension2d<f32>(25,25), start); | 649 | core::dimension2d<f32>(25,25), start); |
650 | 650 | ||
651 | node->setMaterialFlag(video::EMF_LIGHTING, false); | 651 | node->setMaterialFlag(video::EMF_LIGHTING, false); |
652 | node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/fireball.bmp")); | 652 | node->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/fireball.bmp")); |
653 | node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); | 653 | node->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); |
654 | 654 | ||
655 | f32 length = (f32)(end - start).getLength(); | 655 | f32 length = (f32)(end - start).getLength(); |
656 | const f32 speed = 0.6f; | 656 | const f32 speed = 0.6f; |
657 | u32 time = (u32)(length / speed); | 657 | u32 time = (u32)(length / speed); |
658 | 658 | ||
659 | scene::ISceneNodeAnimator* anim = 0; | 659 | scene::ISceneNodeAnimator* anim = 0; |
660 | 660 | ||
661 | // set flight line | 661 | // set flight line |
662 | 662 | ||
663 | anim = sm->createFlyStraightAnimator(start, end, time); | 663 | anim = sm->createFlyStraightAnimator(start, end, time); |
664 | node->addAnimator(anim); | 664 | node->addAnimator(anim); |
665 | anim->drop(); | 665 | anim->drop(); |
666 | 666 | ||
667 | anim = sm->createDeleteAnimator(time); | 667 | anim = sm->createDeleteAnimator(time); |
668 | node->addAnimator(anim); | 668 | node->addAnimator(anim); |
669 | anim->drop(); | 669 | anim->drop(); |
670 | 670 | ||
671 | if (imp.when) | 671 | if (imp.when) |
672 | { | 672 | { |
673 | // create impact note | 673 | // create impact note |
674 | imp.when = device->getTimer()->getTime() + (time - 100); | 674 | imp.when = device->getTimer()->getTime() + (time - 100); |
675 | Impacts.push_back(imp); | 675 | Impacts.push_back(imp); |
676 | } | 676 | } |
677 | 677 | ||
678 | // play sound | 678 | // play sound |
679 | #ifdef USE_IRRKLANG | 679 | #ifdef USE_IRRKLANG |
680 | if (ballSound) | 680 | if (ballSound) |
681 | irrKlang->play2D(ballSound); | 681 | irrKlang->play2D(ballSound); |
682 | #endif | 682 | #endif |
683 | #ifdef USE_SDL_MIXER | 683 | #ifdef USE_SDL_MIXER |
684 | if (ballSound) | 684 | if (ballSound) |
685 | playSound(ballSound); | 685 | playSound(ballSound); |
686 | #endif | 686 | #endif |
687 | } | 687 | } |
688 | 688 | ||
689 | 689 | ||
690 | void CDemo::createParticleImpacts() | 690 | void CDemo::createParticleImpacts() |
691 | { | 691 | { |
692 | u32 now = device->getTimer()->getTime(); | 692 | u32 now = device->getTimer()->getTime(); |
693 | scene::ISceneManager* sm = device->getSceneManager(); | 693 | scene::ISceneManager* sm = device->getSceneManager(); |
694 | 694 | ||
695 | for (s32 i=0; i<(s32)Impacts.size(); ++i) | 695 | for (s32 i=0; i<(s32)Impacts.size(); ++i) |
696 | if (now > Impacts[i].when) | 696 | if (now > Impacts[i].when) |
697 | { | 697 | { |
698 | // create smoke particle system | 698 | // create smoke particle system |
699 | scene::IParticleSystemSceneNode* pas = 0; | 699 | scene::IParticleSystemSceneNode* pas = 0; |
700 | 700 | ||
701 | pas = sm->addParticleSystemSceneNode(false, 0, -1, Impacts[i].pos); | 701 | pas = sm->addParticleSystemSceneNode(false, 0, -1, Impacts[i].pos); |
702 | 702 | ||
703 | pas->setParticleSize(core::dimension2d<f32>(10.0f, 10.0f)); | 703 | pas->setParticleSize(core::dimension2d<f32>(10.0f, 10.0f)); |
704 | 704 | ||
705 | scene::IParticleEmitter* em = pas->createBoxEmitter( | 705 | scene::IParticleEmitter* em = pas->createBoxEmitter( |
706 | core::aabbox3d<f32>(-5,-5,-5,5,5,5), | 706 | core::aabbox3d<f32>(-5,-5,-5,5,5,5), |
707 | Impacts[i].outVector, 20,40, video::SColor(50,255,255,255),video::SColor(50,255,255,255), | 707 | Impacts[i].outVector, 20,40, video::SColor(50,255,255,255),video::SColor(50,255,255,255), |
708 | 1200,1600, 20); | 708 | 1200,1600, 20); |
709 | 709 | ||
710 | pas->setEmitter(em); | 710 | pas->setEmitter(em); |
711 | em->drop(); | 711 | em->drop(); |
712 | 712 | ||
713 | scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector(); | 713 | scene::IParticleAffector* paf = campFire->createFadeOutParticleAffector(); |
714 | pas->addAffector(paf); | 714 | pas->addAffector(paf); |
715 | paf->drop(); | 715 | paf->drop(); |
716 | 716 | ||
717 | pas->setMaterialFlag(video::EMF_LIGHTING, false); | 717 | pas->setMaterialFlag(video::EMF_LIGHTING, false); |
718 | pas->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); | 718 | pas->setMaterialFlag(video::EMF_ZWRITE_ENABLE, false); |
719 | pas->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/smoke.bmp")); | 719 | pas->setMaterialTexture(0, device->getVideoDriver()->getTexture("../../media/smoke.bmp")); |
720 | pas->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); | 720 | pas->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR); |
721 | 721 | ||
722 | scene::ISceneNodeAnimator* anim = sm->createDeleteAnimator(2000); | 722 | scene::ISceneNodeAnimator* anim = sm->createDeleteAnimator(2000); |
723 | pas->addAnimator(anim); | 723 | pas->addAnimator(anim); |
724 | anim->drop(); | 724 | anim->drop(); |
725 | 725 | ||
726 | // play impact sound | 726 | // play impact sound |
727 | #ifdef USE_IRRKLANG | 727 | #ifdef USE_IRRKLANG |
728 | if (irrKlang) | 728 | if (irrKlang) |
729 | { | 729 | { |
730 | irrklang::ISound* sound = | 730 | irrklang::ISound* sound = |
731 | irrKlang->play3D(impactSound, Impacts[i].pos, false, false, true); | 731 | irrKlang->play3D(impactSound, Impacts[i].pos, false, false, true); |
732 | 732 | ||
733 | if (sound) | 733 | if (sound) |
734 | { | 734 | { |
735 | // adjust max value a bit to make to sound of an impact louder | 735 | // adjust max value a bit to make to sound of an impact louder |
736 | sound->setMinDistance(400); | 736 | sound->setMinDistance(400); |
737 | sound->drop(); | 737 | sound->drop(); |
738 | } | 738 | } |
739 | } | 739 | } |
740 | #endif | 740 | #endif |
741 | 741 | ||
742 | #ifdef USE_SDL_MIXER | 742 | #ifdef USE_SDL_MIXER |
743 | if (impactSound) | 743 | if (impactSound) |
744 | playSound(impactSound); | 744 | playSound(impactSound); |
745 | #endif | 745 | #endif |
746 | 746 | ||
747 | // delete entry | 747 | // delete entry |
748 | Impacts.erase(i); | 748 | Impacts.erase(i); |
749 | i--; | 749 | i--; |
750 | } | 750 | } |
751 | } | 751 | } |
752 | 752 | ||
753 | 753 | ||
754 | #ifdef USE_IRRKLANG | 754 | #ifdef USE_IRRKLANG |
755 | void CDemo::startIrrKlang() | 755 | void CDemo::startIrrKlang() |
756 | { | 756 | { |
757 | irrKlang = irrklang::createIrrKlangDevice(); | 757 | irrKlang = irrklang::createIrrKlangDevice(); |
758 | 758 | ||
759 | if (!irrKlang) | 759 | if (!irrKlang) |
760 | return; | 760 | return; |
761 | 761 | ||
762 | // play music | 762 | // play music |
763 | 763 | ||
764 | irrklang::ISound* snd = irrKlang->play2D("../../media/IrrlichtTheme.ogg", true, false, true); | 764 | irrklang::ISound* snd = irrKlang->play2D("../../media/IrrlichtTheme.ogg", true, false, true); |
765 | if ( !snd ) | 765 | if ( !snd ) |
766 | snd = irrKlang->play2D("IrrlichtTheme.ogg", true, false, true); | 766 | snd = irrKlang->play2D("IrrlichtTheme.ogg", true, false, true); |
767 | 767 | ||
768 | if (snd) | 768 | if (snd) |
769 | { | 769 | { |
770 | snd->setVolume(0.5f); // 50% volume | 770 | snd->setVolume(0.5f); // 50% volume |
771 | snd->drop(); | 771 | snd->drop(); |
772 | } | 772 | } |
773 | 773 | ||
774 | // preload both sound effects | 774 | // preload both sound effects |
775 | 775 | ||
776 | ballSound = irrKlang->getSoundSource("../../media/ball.wav"); | 776 | ballSound = irrKlang->getSoundSource("../../media/ball.wav"); |
777 | impactSound = irrKlang->getSoundSource("../../media/impact.wav"); | 777 | impactSound = irrKlang->getSoundSource("../../media/impact.wav"); |
778 | } | 778 | } |
779 | #endif | 779 | #endif |
780 | 780 | ||
781 | 781 | ||
782 | #ifdef USE_SDL_MIXER | 782 | #ifdef USE_SDL_MIXER |
783 | void CDemo::startSound() | 783 | void CDemo::startSound() |
784 | { | 784 | { |
785 | stream = NULL; | 785 | stream = NULL; |
786 | ballSound = NULL; | 786 | ballSound = NULL; |
787 | impactSound = NULL; | 787 | impactSound = NULL; |
788 | 788 | ||
789 | SDL_Init(SDL_INIT_AUDIO); | 789 | SDL_Init(SDL_INIT_AUDIO); |
790 | 790 | ||
791 | if (Mix_OpenAudio(22050, AUDIO_S16, 2, 128)) | 791 | if (Mix_OpenAudio(22050, AUDIO_S16, 2, 128)) |
792 | return; | 792 | return; |
793 | 793 | ||
794 | stream = Mix_LoadMUS("../../media/IrrlichtTheme.ogg"); | 794 | stream = Mix_LoadMUS("../../media/IrrlichtTheme.ogg"); |
795 | if (stream) | 795 | if (stream) |
796 | Mix_PlayMusic(stream, -1); | 796 | Mix_PlayMusic(stream, -1); |
797 | 797 | ||
798 | ballSound = Mix_LoadWAV("../../media/ball.wav"); | 798 | ballSound = Mix_LoadWAV("../../media/ball.wav"); |
799 | impactSound = Mix_LoadWAV("../../media/impact.wav"); | 799 | impactSound = Mix_LoadWAV("../../media/impact.wav"); |
800 | } | 800 | } |
801 | 801 | ||
802 | void CDemo::playSound(Mix_Chunk *sample) | 802 | void CDemo::playSound(Mix_Chunk *sample) |
803 | { | 803 | { |
804 | if (sample) | 804 | if (sample) |
805 | Mix_PlayChannel(-1, sample, 0); | 805 | Mix_PlayChannel(-1, sample, 0); |
806 | } | 806 | } |
807 | 807 | ||
808 | void CDemo::pollSound(void) | 808 | void CDemo::pollSound(void) |
809 | { | 809 | { |
810 | SDL_Event event; | 810 | SDL_Event event; |
811 | 811 | ||
812 | while (SDL_PollEvent(&event)) | 812 | while (SDL_PollEvent(&event)) |
813 | ; | 813 | ; |
814 | } | 814 | } |
815 | #endif | 815 | #endif |