aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html
diff options
context:
space:
mode:
Diffstat (limited to 'libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html')
-rw-r--r--libraries/irrlicht-1.8/examples/02.Quake3Map/tutorial.html362
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 &lt;irrlicht.h&gt;<br>#include &lt;iostream&gt;<br></pre></td> 41 <td> <pre>#include &lt;irrlicht.h&gt;<br>#include &lt;iostream&gt;<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, &quot;Irrlicht.lib&quot;)</pre> </td> 63 <td> <pre>#pragma comment(lib, &quot;Irrlicht.lib&quot;)</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(&quot;Please select the driver you want for this example:\n&quot;\<br> &quot; (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n&quot;\<br> &quot; (d) Software Renderer\n (e) Apfelbaum Software Renderer\n&quot;\<br> &quot; (f) NullDevice\n (otherKey) exit\n\n&quot;);<br> 81 <td> <pre>// ask user for driver<br><br>video::E_DRIVER_TYPE driverType = video::EDT_DIRECT3D9;<br><br>printf(&quot;Please select the driver you want for this example:\n&quot;\<br> &quot; (a) Direct3D 9.0c\n (b) Direct3D 8.1\n (c) OpenGL 1.5\n&quot;\<br> &quot; (d) Software Renderer\n (e) Apfelbaum Software Renderer\n&quot;\<br> &quot; (f) NullDevice\n (otherKey) exit\n\n&quot;);<br>
82char i;<br>std::cin &gt;&gt; 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&lt;s32&gt;(640, 480));<br><br>if (device == 0)<br> return 1;</pre></td> 82char i;<br>std::cin &gt;&gt; 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&lt;s32&gt;(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-&gt;getVideoDriver() and device-&gt;getSceneManager().</p> 86 not always have to write device-&gt;getVideoDriver() and device-&gt;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-&gt;getVideoDriver(); 89 <td> <pre>video::IVideoDriver* driver = device-&gt;getVideoDriver();
90scene::ISceneManager* smgr = device-&gt;getSceneManager();</pre> </td> 90scene::ISceneManager* smgr = device-&gt;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-&gt;getFileSystem()-&gt;addZipFileArchive(&quot;../../media/map-20kdm2.pk3&quot;);</pre> </td> 99 <td> <pre>device-&gt;getFileSystem()-&gt;addZipFileArchive(&quot;../../media/map-20kdm2.pk3&quot;);</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 &quot;first frame&quot; of the &quot;animation&quot;, which 106 so we get the &quot;first frame&quot; of the &quot;animation&quot;, 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-&gt;getMesh(&quot;20kdm2.bsp&quot;);<br>scene::ISceneNode* node = 0; 117 <td> <pre>scene::IAnimatedMesh* mesh = smgr-&gt;getMesh(&quot;20kdm2.bsp&quot;);<br>scene::ISceneNode* node = 0;
118 118
119if (mesh)<br> node = smgr-&gt;addOctTreeSceneNode(mesh-&gt;getMesh(0));</pre> </td> 119if (mesh)<br> node = smgr-&gt;addOctTreeSceneNode(mesh-&gt;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-&gt;setPosition(core::vector3df(-1300,-144,-1249));</pre> </td> 126 <td> <pre>if (node)<br> node-&gt;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-&gt;addCameraSceneNodeFPS();</pre> </td> 139 <td> <pre>smgr-&gt;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-&gt;getCursorControl()-&gt;setVisible(false);</pre> </td> 145 <td> <pre>device-&gt;getCursorControl()-&gt;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-&gt;isWindowActive())' line is optional, but prevents the 150 'if (device-&gt;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-&gt;run()) 156 <pre>while(device-&gt;run())
157{ 157{
158 driver-&gt;beginScene(true, true, video::SColor(0,200,200,200)); 158 driver-&gt;beginScene(true, true, video::SColor(0,200,200,200));
159 smgr-&gt;drawAll(); 159 smgr-&gt;drawAll();
160 driver-&gt;endScene();</pre> 160 driver-&gt;endScene();</pre>
161 <pre> int fps = driver-&gt;getFPS();</pre> 161 <pre> int fps = driver-&gt;getFPS();</pre>
162 <pre> if (lastFPS != fps) 162 <pre> if (lastFPS != fps)
163 { 163 {
164 core::stringw str = L&quot;Irrlicht Engine - Quake 3 Map example [&quot;;<br> str += driver-&gt;getName();<br> str += &quot;] FPS:&quot;;<br> str += fps;<br> device-&gt;setWindowCaption(str.c_str());<br> lastFPS = fps; 164 core::stringw str = L&quot;Irrlicht Engine - Quake 3 Map example [&quot;;<br> str += driver-&gt;getName();<br> str += &quot;] FPS:&quot;;<br> str += fps;<br> device-&gt;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-&gt;drop();<br> return 0;<br>}</pre> </td> 172 <td> <pre> device-&gt;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>&nbsp;</p> 178<p>&nbsp;</p>
179<p>&nbsp;</p> 179<p>&nbsp;</p>
180</body> 180</body>
181</html> 181</html>