diff options
Diffstat (limited to 'libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html')
-rw-r--r-- | libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html | 362 |
1 files changed, 181 insertions, 181 deletions
diff --git a/libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html b/libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html index 1858b86..1b482f2 100644 --- a/libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html +++ b/libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html | |||
@@ -1,181 +1,181 @@ | |||
1 | <html> | 1 | <html> |
2 | <head> | 2 | <head> |
3 | <title>Irrlicht Engine Tutorial</title> | 3 | <title>Irrlicht Engine Tutorial</title> |
4 | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> | 4 | <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> |
5 | </head> | 5 | </head> |
6 | 6 | ||
7 | <body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> | 7 | <body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0"> |
8 | <br> | 8 | <br> |
9 | <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center"> | 9 | <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center"> |
10 | <tr> | 10 | <tr> |
11 | <td bgcolor="#666699" width="10"><b><a href="http://irrlicht.sourceforge.net" target="_blank"><img src="../../media/irrlichtlogo.jpg" width="88" height="31" border="0"></a></b></td> | 11 | <td bgcolor="#666699" width="10"><b><a href="http://irrlicht.sourceforge.net" target="_blank"><img src="../../media/irrlichtlogo.jpg" width="88" height="31" border="0"></a></b></td> |
12 | <td bgcolor="#666699" width="100%"> <div align="center"><b><font color="#FFFFFF"></font></b></div> | 12 | <td bgcolor="#666699" width="100%"> <div align="center"><b><font color="#FFFFFF"></font></b></div> |
13 | <b><font color="#FFFFFF">Tutorial 2.Quake3Map</font></b></td> | 13 | <b><font color="#FFFFFF">Tutorial 2.Quake3Map</font></b></td> |
14 | </tr> | 14 | </tr> |
15 | <tr bgcolor="#eeeeff"> | 15 | <tr bgcolor="#eeeeff"> |
16 | <td height="90" colspan="2"> <div align="left"> | 16 | <td height="90" colspan="2"> <div align="left"> |
17 | <p>This Tutorial shows how to load a Quake 3 map into the engine, create | 17 | <p>This Tutorial shows how to load a Quake 3 map into the engine, create |
18 | a SceneNode for optimizing the speed of rendering and how to create | 18 | a SceneNode for optimizing the speed of rendering and how to create |
19 | a user controlled camera. Please note that you should know the basics | 19 | a user controlled camera. Please note that you should know the basics |
20 | of the engine before starting this tutorial, just take a short look | 20 | of the engine before starting this tutorial, just take a short look |
21 | at the first tutorial, 1.HelloWorld, if you haven't done this yet.<br> | 21 | at the first tutorial, 1.HelloWorld, if you haven't done this yet.<br> |
22 | The result of this example will look like this:</p> | 22 | The result of this example will look like this:</p> |
23 | <p align="center"><img src="../../media/002shot.jpg" width="259" height="202"><br> | 23 | <p align="center"><img src="../../media/002shot.jpg" width="259" height="202"><br> |
24 | </p> | 24 | </p> |
25 | </div></td> | 25 | </div></td> |
26 | </tr> | 26 | </tr> |
27 | </table> | 27 | </table> |
28 | <br> | 28 | <br> |
29 | <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center"> | 29 | <table width="95%" border="0" cellspacing="0" cellpadding="2" align="center"> |
30 | <tr> | 30 | <tr> |
31 | <td bgcolor="#666699"> <div align="center"><b><font color="#000000"></font></b></div> | 31 | <td bgcolor="#666699"> <div align="center"><b><font color="#000000"></font></b></div> |
32 | <font color="#FFFFFF"><b>Lets start!</b></font></td> | 32 | <font color="#FFFFFF"><b>Lets start!</b></font></td> |
33 | </tr> | 33 | </tr> |
34 | <tr> | 34 | <tr> |
35 | <td height="90" bgcolor="#eeeeff" valign="top"> <div align="left"> | 35 | <td height="90" bgcolor="#eeeeff" valign="top"> <div align="left"> |
36 | <p>Lets start like the HelloWorld example: We include the irrlicht header | 36 | <p>Lets start like the HelloWorld example: We include the irrlicht header |
37 | files and an additional file to be able<br> | 37 | files and an additional file to be able<br> |
38 | to ask the user for a driver type using the console.</p> | 38 | to ask the user for a driver type using the console.</p> |
39 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 39 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
40 | <tr> | 40 | <tr> |
41 | <td> <pre>#include <irrlicht.h><br>#include <iostream><br></pre></td> | 41 | <td> <pre>#include <irrlicht.h><br>#include <iostream><br></pre></td> |
42 | </tr> | 42 | </tr> |
43 | </table> | 43 | </table> |
44 | <p>As already written in the HelloWorld example, in the Irrlicht Engine, | 44 | <p>As already written in the HelloWorld example, in the Irrlicht Engine, |
45 | everything can be found in the namespace 'irr'. To get rid of the irr:: | 45 | everything can be found in the namespace 'irr'. To get rid of the irr:: |
46 | in front of the name of every class, we tell the compiler that we use | 46 | in front of the name of every class, we tell the compiler that we use |
47 | that namespace from now on, and we will not have to write that 'irr::'.<br> | 47 | that namespace from now on, and we will not have to write that 'irr::'.<br> |
48 | There are 5 other sub namespaces 'core', 'scene', 'video', 'io' and | 48 | There are 5 other sub namespaces 'core', 'scene', 'video', 'io' and |
49 | 'gui'. Unlike in the HelloWorld example, we do not a 'using namespace' | 49 | 'gui'. Unlike in the HelloWorld example, we do not a 'using namespace' |
50 | for these 5 other namespaces because in this way you will see what can | 50 | for these 5 other namespaces because in this way you will see what can |
51 | be found in which namespace. But if you like, you can also include the | 51 | be found in which namespace. But if you like, you can also include the |
52 | namespaces like in the previous example. Code just like you want to.</p> | 52 | namespaces like in the previous example. Code just like you want to.</p> |
53 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 53 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
54 | <tr> | 54 | <tr> |
55 | <td> <pre>using namespace irr;</pre> </td> | 55 | <td> <pre>using namespace irr;</pre> </td> |
56 | </tr> | 56 | </tr> |
57 | </table> | 57 | </table> |
58 | <p>Again, to be able to use the Irrlicht.DLL file, we need to link with | 58 | <p>Again, to be able to use the Irrlicht.DLL file, we need to link with |
59 | the Irrlicht.lib. We could set this option in the project settings, | 59 | the Irrlicht.lib. We could set this option in the project settings, |
60 | but to make it easy, we use a pragma comment lib:</p> | 60 | but to make it easy, we use a pragma comment lib:</p> |
61 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 61 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
62 | <tr> | 62 | <tr> |
63 | <td> <pre>#pragma comment(lib, "Irrlicht.lib")</pre> </td> | 63 | <td> <pre>#pragma comment(lib, "Irrlicht.lib")</pre> </td> |
64 | </tr> | 64 | </tr> |
65 | </table> | 65 | </table> |
66 | 66 | ||
67 | </div> | 67 | </div> |
68 | <p>Ok, lets start. Again, we use the main() method as start, not the WinMain(), | 68 | <p>Ok, lets start. Again, we use the main() method as start, not the WinMain(), |
69 | because its shorter to write.</p> | 69 | because its shorter to write.</p> |
70 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 70 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
71 | <tr> | 71 | <tr> |
72 | <td> <pre>int main()<br>{</pre> </td> | 72 | <td> <pre>int main()<br>{</pre> </td> |
73 | </tr> | 73 | </tr> |
74 | </table> | 74 | </table> |
75 | <p> Like in the HelloWorld example, we create an IrrlichtDevice with createDevice(). | 75 | <p> Like in the HelloWorld example, we create an IrrlichtDevice with createDevice(). |
76 | The difference now is that we ask the user to select which hardware accelerated | 76 | The difference now is that we ask the user to select which hardware accelerated |
77 | driver to use. The Software device would be too slow to draw a huge Quake | 77 | driver to use. The Software device would be too slow to draw a huge Quake |
78 | 3 map, but just for the fun of it, we make this decision possible too.</p> | 78 | 3 map, but just for the fun of it, we make this decision possible too.</p> |
79 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 79 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
80 | <tr> | 80 | <tr> |
81 | <td> <pre>// ask user for driver<br><br>video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;<br><br>printf("Please select the driver you want for this example:\n"\<br> " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\<br> " (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\<br> " (f) NullDevice\n (otherKey) exit\n\n");<br> | 81 | <td> <pre>// ask user for driver<br><br>video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;<br><br>printf("Please select the driver you want for this example:\n"\<br> " (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n"\<br> " (d) Software Renderer\n (e) Apfelbaum Software Renderer\n"\<br> " (f) NullDevice\n (otherKey) exit\n\n");<br> |
82 | char i;<br>std::cin >> i;<br><br>switch(i)<br>{<br> case 'a': driverType = video::EDT_DIRECT3D9;break;<br> case 'b': driverType = video::EDT_DIRECT3D8;break;<br> case 'c': driverType = video::EDT_OPENGL; break;<br> case 'd': driverType = video::EDT_SOFTWARE; break;<br> case 'e': driverType = video::EDT_BURNINGSVIDEO;break;<br> case 'f': driverType = video::EDT_NULL; break;<br> default: return 1;<br>} <br><br>// create device and exit if creation failed<br><br>IrrlichtDevice *device =<br> createDevice(driverType, core::dimension2d<s32>(640, 480));<br><br>if (device == 0)<br> return 1;</pre></td> | 82 | char i;<br>std::cin >> i;<br><br>switch(i)<br>{<br> case 'a': driverType = video::EDT_DIRECT3D9;break;<br> case 'b': driverType = video::EDT_DIRECT3D8;break;<br> case 'c': driverType = video::EDT_OPENGL; break;<br> case 'd': driverType = video::EDT_SOFTWARE; break;<br> case 'e': driverType = video::EDT_BURNINGSVIDEO;break;<br> case 'f': driverType = video::EDT_NULL; break;<br> default: return 1;<br>} <br><br>// create device and exit if creation failed<br><br>IrrlichtDevice *device =<br> createDevice(driverType, core::dimension2d<s32>(640, 480));<br><br>if (device == 0)<br> return 1;</pre></td> |
83 | </tr> | 83 | </tr> |
84 | </table> | 84 | </table> |
85 | <p>Get a pointer to the video driver and the SceneManager so that we do | 85 | <p>Get a pointer to the video driver and the SceneManager so that we do |
86 | not always have to write device->getVideoDriver() and device->getSceneManager().</p> | 86 | not always have to write device->getVideoDriver() and device->getSceneManager().</p> |
87 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 87 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
88 | <tr> | 88 | <tr> |
89 | <td> <pre>video::IVideoDriver* driver = device->getVideoDriver(); | 89 | <td> <pre>video::IVideoDriver* driver = device->getVideoDriver(); |
90 | scene::ISceneManager* smgr = device->getSceneManager();</pre> </td> | 90 | scene::ISceneManager* smgr = device->getSceneManager();</pre> </td> |
91 | </tr> | 91 | </tr> |
92 | </table> | 92 | </table> |
93 | <p>To display the Quake 3 map, we first need to load it. Quake 3 maps are | 93 | <p>To display the Quake 3 map, we first need to load it. Quake 3 maps are |
94 | packed into .pk3 files wich are nothing other than .zip files. So we add | 94 | packed into .pk3 files wich are nothing other than .zip files. So we add |
95 | the .pk3 file to our FileSystem. After it was added, we are able to read | 95 | the .pk3 file to our FileSystem. After it was added, we are able to read |
96 | from the files in that archive as they would directly be stored on disk.</p> | 96 | from the files in that archive as they would directly be stored on disk.</p> |
97 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 97 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
98 | <tr> | 98 | <tr> |
99 | <td> <pre>device->getFileSystem()->addZipFileArchive("../../media/map-20kdm2.pk3");</pre> </td> | 99 | <td> <pre>device->getFileSystem()->addZipFileArchive("../../media/map-20kdm2.pk3");</pre> </td> |
100 | </tr> | 100 | </tr> |
101 | </table> | 101 | </table> |
102 | <p>Now we can load the mesh by calling getMesh(). We get a pointer returned | 102 | <p>Now we can load the mesh by calling getMesh(). We get a pointer returned |
103 | to a IAnimatedMesh. As you know, Quake 3 maps are not really animated, | 103 | to a IAnimatedMesh. As you know, Quake 3 maps are not really animated, |
104 | they are only a huge chunk of static geometry with some materials attached. | 104 | they are only a huge chunk of static geometry with some materials attached. |
105 | Hence the IAnimated mesh consists of only one frame,<br> | 105 | Hence the IAnimated mesh consists of only one frame,<br> |
106 | so we get the "first frame" of the "animation", which | 106 | so we get the "first frame" of the "animation", which |
107 | is our quake level and create an OctTree scene node with it, using addOctTreeSceneNode(). | 107 | is our quake level and create an OctTree scene node with it, using addOctTreeSceneNode(). |
108 | The OctTree optimizes the scene a little bit, trying to draw only geometry | 108 | The OctTree optimizes the scene a little bit, trying to draw only geometry |
109 | which is currently visible. An alternative to the OctTree would be a AnimatedMeshSceneNode, | 109 | which is currently visible. An alternative to the OctTree would be a AnimatedMeshSceneNode, |
110 | which would draw always the complete geometry of the mesh, without optimization. | 110 | which would draw always the complete geometry of the mesh, without optimization. |
111 | Try it out: Write addAnimatedMeshSceneNode instead of addOctTreeSceneNode | 111 | Try it out: Write addAnimatedMeshSceneNode instead of addOctTreeSceneNode |
112 | and compare the primitives drawed by the video driver. (There is a getPrimitiveCountDrawed() | 112 | and compare the primitives drawed by the video driver. (There is a getPrimitiveCountDrawed() |
113 | method in the IVideoDriver class). Note that this optimization with the | 113 | method in the IVideoDriver class). Note that this optimization with the |
114 | Octree is only useful when drawing huge meshes consiting of lots of geometry.</p> | 114 | Octree is only useful when drawing huge meshes consiting of lots of geometry.</p> |
115 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 115 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
116 | <tr> | 116 | <tr> |
117 | <td> <pre>scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");<br>scene::ISceneNode* node = 0; | 117 | <td> <pre>scene::IAnimatedMesh* mesh = smgr->getMesh("20kdm2.bsp");<br>scene::ISceneNode* node = 0; |
118 | 118 | ||
119 | if (mesh)<br> node = smgr->addOctTreeSceneNode(mesh->getMesh(0));</pre> </td> | 119 | if (mesh)<br> node = smgr->addOctTreeSceneNode(mesh->getMesh(0));</pre> </td> |
120 | </tr> | 120 | </tr> |
121 | </table> | 121 | </table> |
122 | <p>Because the level was modelled not around the origin (0,0,0), we translate | 122 | <p>Because the level was modelled not around the origin (0,0,0), we translate |
123 | the whole level a little bit.</p> | 123 | the whole level a little bit.</p> |
124 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 124 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
125 | <tr> | 125 | <tr> |
126 | <td> <pre>if (node)<br> node->setPosition(core::vector3df(-1300,-144,-1249));</pre> </td> | 126 | <td> <pre>if (node)<br> node->setPosition(core::vector3df(-1300,-144,-1249));</pre> </td> |
127 | </tr> | 127 | </tr> |
128 | </table> | 128 | </table> |
129 | <p>Now we only need a Camera to look at the Quake 3 map. And we want to | 129 | <p>Now we only need a Camera to look at the Quake 3 map. And we want to |
130 | create a user controlled camera. There are some different cameras available | 130 | create a user controlled camera. There are some different cameras available |
131 | in the Irrlicht engine. For example the Maya Camera which can be controlled | 131 | in the Irrlicht engine. For example the Maya Camera which can be controlled |
132 | compareable to the camera in Maya: Rotate with left mouse button pressed, | 132 | compareable to the camera in Maya: Rotate with left mouse button pressed, |
133 | Zoom with both buttons pressed,<br> | 133 | Zoom with both buttons pressed,<br> |
134 | translate with right mouse button pressed. This could be created with | 134 | translate with right mouse button pressed. This could be created with |
135 | addCameraSceneNodeMaya(). But for this example, we want to create a camera | 135 | addCameraSceneNodeMaya(). But for this example, we want to create a camera |
136 | which behaves like the ones in first person shooter games (FPS):</p> | 136 | which behaves like the ones in first person shooter games (FPS):</p> |
137 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 137 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
138 | <tr> | 138 | <tr> |
139 | <td> <pre>smgr->addCameraSceneNodeFPS();</pre> </td> | 139 | <td> <pre>smgr->addCameraSceneNodeFPS();</pre> </td> |
140 | </tr> | 140 | </tr> |
141 | </table> | 141 | </table> |
142 | <p>The mouse cursor needs not to be visible, so we make it invisible. </p> | 142 | <p>The mouse cursor needs not to be visible, so we make it invisible. </p> |
143 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 143 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
144 | <tr> | 144 | <tr> |
145 | <td> <pre>device->getCursorControl()->setVisible(false);</pre> </td> | 145 | <td> <pre>device->getCursorControl()->setVisible(false);</pre> </td> |
146 | </tr> | 146 | </tr> |
147 | </table> | 147 | </table> |
148 | <p>We have done everything, so lets draw it. We also write the current frames | 148 | <p>We have done everything, so lets draw it. We also write the current frames |
149 | per second and the drawn primitives to the caption of the window. The | 149 | per second and the drawn primitives to the caption of the window. The |
150 | 'if (device->isWindowActive())' line is optional, but prevents the | 150 | 'if (device->isWindowActive())' line is optional, but prevents the |
151 | engine render to set the position of the mouse cursor after task switching | 151 | engine render to set the position of the mouse cursor after task switching |
152 | when other program are active.</p> | 152 | when other program are active.</p> |
153 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 153 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
154 | <tr> | 154 | <tr> |
155 | <td> <pre>int lastFPS = -1;</pre> | 155 | <td> <pre>int lastFPS = -1;</pre> |
156 | <pre>while(device->run()) | 156 | <pre>while(device->run()) |
157 | { | 157 | { |
158 | driver->beginScene(true, true, video::SColor(0,200,200,200)); | 158 | driver->beginScene(true, true, video::SColor(0,200,200,200)); |
159 | smgr->drawAll(); | 159 | smgr->drawAll(); |
160 | driver->endScene();</pre> | 160 | driver->endScene();</pre> |
161 | <pre> int fps = driver->getFPS();</pre> | 161 | <pre> int fps = driver->getFPS();</pre> |
162 | <pre> if (lastFPS != fps) | 162 | <pre> if (lastFPS != fps) |
163 | { | 163 | { |
164 | core::stringw str = L"Irrlicht Engine - Quake 3 Map example [";<br> str += driver->getName();<br> str += "] FPS:";<br> str += fps;<br> device->setWindowCaption(str.c_str());<br> lastFPS = fps; | 164 | core::stringw str = L"Irrlicht Engine - Quake 3 Map example [";<br> str += driver->getName();<br> str += "] FPS:";<br> str += fps;<br> device->setWindowCaption(str.c_str());<br> lastFPS = fps; |
165 | } | 165 | } |
166 | }</pre> </td> | 166 | }</pre> </td> |
167 | </tr> | 167 | </tr> |
168 | </table> | 168 | </table> |
169 | <p>In the end, delete the Irrlicht device.</p> | 169 | <p>In the end, delete the Irrlicht device.</p> |
170 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> | 170 | <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center"> |
171 | <tr> | 171 | <tr> |
172 | <td> <pre> device->drop();<br> return 0;<br>}</pre> </td> | 172 | <td> <pre> device->drop();<br> return 0;<br>}</pre> </td> |
173 | </tr> | 173 | </tr> |
174 | </table> | 174 | </table> |
175 | <p>That's it. Compile and play around with the program. </p></td> | 175 | <p>That's it. Compile and play around with the program. </p></td> |
176 | </tr> | 176 | </tr> |
177 | </table> | 177 | </table> |
178 | <p> </p> | 178 | <p> </p> |
179 | <p> </p> | 179 | <p> </p> |
180 | </body> | 180 | </body> |
181 | </html> | 181 | </html> |