aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/src/others/irrlicht-1.8.1/examples/02.Quake3Map/tutorial.html
diff options
context:
space:
mode:
Diffstat (limited to 'src/others/irrlicht-1.8.1/examples/02.Quake3Map/tutorial.html')
-rw-r--r--src/others/irrlicht-1.8.1/examples/02.Quake3Map/tutorial.html181
1 files changed, 181 insertions, 0 deletions
diff --git a/src/others/irrlicht-1.8.1/examples/02.Quake3Map/tutorial.html b/src/others/irrlicht-1.8.1/examples/02.Quake3Map/tutorial.html
new file mode 100644
index 0000000..1858b86
--- /dev/null
+++ b/src/others/irrlicht-1.8.1/examples/02.Quake3Map/tutorial.html
@@ -0,0 +1,181 @@
1<html>
2<head>
3<title>Irrlicht Engine Tutorial</title>
4<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5</head>
6
7<body bgcolor="#FFFFFF" leftmargin="0" topmargin="0" marginwidth="0" marginheight="0">
8<br>
9<table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
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>
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>
14 </tr>
15 <tr bgcolor="#eeeeff">
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
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
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>
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>
24 </p>
25 </div></td>
26 </tr>
27</table>
28<br>
29<table width="95%" border="0" cellspacing="0" cellpadding="2" align="center">
30 <tr>
31 <td bgcolor="#666699"> <div align="center"><b><font color="#000000"></font></b></div>
32 <font color="#FFFFFF"><b>Lets start!</b></font></td>
33 </tr>
34 <tr>
35 <td height="90" bgcolor="#eeeeff" valign="top"> <div align="left">
36 <p>Lets start like the HelloWorld example: We include the irrlicht header
37 files and an additional file to be able<br>
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">
40 <tr>
41 <td> <pre>#include &lt;irrlicht.h&gt;<br>#include &lt;iostream&gt;<br></pre></td>
42 </tr>
43 </table>
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::
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>
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'
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
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">
54 <tr>
55 <td> <pre>using namespace irr;</pre> </td>
56 </tr>
57 </table>
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,
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">
62 <tr>
63 <td> <pre>#pragma comment(lib, &quot;Irrlicht.lib&quot;)</pre> </td>
64 </tr>
65 </table>
66
67 </div>
68 <p>Ok, lets start. Again, we use the main() method as start, not the WinMain(),
69 because its shorter to write.</p>
70 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
71 <tr>
72 <td> <pre>int main()<br>{</pre> </td>
73 </tr>
74 </table>
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
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>
79 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
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>
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>
84 </table>
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>
87 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
88 <tr>
89 <td> <pre>video::IVideoDriver* driver = device-&gt;getVideoDriver();
90scene::ISceneManager* smgr = device-&gt;getSceneManager();</pre> </td>
91 </tr>
92 </table>
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
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>
97 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
98 <tr>
99 <td> <pre>device-&gt;getFileSystem()-&gt;addZipFileArchive(&quot;../../media/map-20kdm2.pk3&quot;);</pre> </td>
100 </tr>
101 </table>
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,
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>
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().
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,
110 which would draw always the complete geometry of the mesh, without optimization.
111 Try it out: Write addAnimatedMeshSceneNode instead of addOctTreeSceneNode
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
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">
116 <tr>
117 <td> <pre>scene::IAnimatedMesh* mesh = smgr-&gt;getMesh(&quot;20kdm2.bsp&quot;);<br>scene::ISceneNode* node = 0;
118
119if (mesh)<br> node = smgr-&gt;addOctTreeSceneNode(mesh-&gt;getMesh(0));</pre> </td>
120 </tr>
121 </table>
122 <p>Because the level was modelled not around the origin (0,0,0), we translate
123 the whole level a little bit.</p>
124 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
125 <tr>
126 <td> <pre>if (node)<br> node-&gt;setPosition(core::vector3df(-1300,-144,-1249));</pre> </td>
127 </tr>
128 </table>
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
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,
133 Zoom with both buttons pressed,<br>
134 translate with right mouse button pressed. This could be created with
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>
137 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
138 <tr>
139 <td> <pre>smgr-&gt;addCameraSceneNodeFPS();</pre> </td>
140 </tr>
141 </table>
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">
144 <tr>
145 <td> <pre>device-&gt;getCursorControl()-&gt;setVisible(false);</pre> </td>
146 </tr>
147 </table>
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
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
152 when other program are active.</p>
153 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
154 <tr>
155 <td> <pre>int lastFPS = -1;</pre>
156 <pre>while(device-&gt;run())
157{
158 driver-&gt;beginScene(true, true, video::SColor(0,200,200,200));
159 smgr-&gt;drawAll();
160 driver-&gt;endScene();</pre>
161 <pre> int fps = driver-&gt;getFPS();</pre>
162 <pre> if (lastFPS != fps)
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;
165 }
166}</pre> </td>
167 </tr>
168 </table>
169 <p>In the end, delete the Irrlicht device.</p>
170 <table width="95%" border="0" cellspacing="2" cellpadding="0" bgcolor="#CCCCCC" align="center">
171 <tr>
172 <td> <pre> device-&gt;drop();<br> return 0;<br>}</pre> </td>
173 </tr>
174 </table>
175 <p>That's it. Compile and play around with the program. </p></td>
176 </tr>
177</table>
178<p>&nbsp;</p>
179<p>&nbsp;</p>
180</body>
181</html>