mirror of
https://github.com/minetest/irrlicht.git
synced 2024-11-16 15:30:25 +01:00
c481179825
Add some for newer examples which didn't have those so far. Only updating this once now as some were broken. Next time on release. git-svn-id: svn://svn.code.sf.net/p/irrlicht/code/trunk@6204 dfc29bdd-3216-0410-991c-e03cc46cb475
219 lines
149 KiB
HTML
219 lines
149 KiB
HTML
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
|
|
<html>
|
|
<head>
|
|
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
|
|
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
|
|
<meta name="generator" content="Doxygen 1.8.13"/>
|
|
<meta name="viewport" content="width=device-width, initial-scale=1"/>
|
|
<title>Tutorial 21: Quake3 Explorer</title>
|
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
|
<!-- Wanted to avoid copying .css to each folder, so copied default .css from doxyen in here, kicked out most stuff we don't need for examples and modified some a little bit.
|
|
Target was having a single html in each example folder which is created from the main.cpp files and needs no files besides some images below media folder.
|
|
Feel free to improve :)
|
|
-->
|
|
<style>
|
|
body, table, div, p, dl {
|
|
font: 400 14px/22px;
|
|
}
|
|
body {
|
|
background-color: #F0F0F0;
|
|
color: black;
|
|
margin-left: 5%;
|
|
margin-right: 5%;
|
|
}
|
|
p.reference, p.definition {
|
|
font: 400 14px/22px;
|
|
}
|
|
.title {
|
|
font: 400 14px/28px;
|
|
font-size: 150%;
|
|
font-weight: bold;
|
|
margin: 10px 2px;
|
|
}
|
|
h1, h2, h3, h4, h5, h6 {
|
|
-webkit-transition: text-shadow 0.5s linear;
|
|
-moz-transition: text-shadow 0.5s linear;
|
|
-ms-transition: text-shadow 0.5s linear;
|
|
-o-transition: text-shadow 0.5s linear;
|
|
transition: text-shadow 0.5s linear;
|
|
margin-right: 15px;
|
|
}
|
|
caption {
|
|
font-weight: bold;
|
|
}
|
|
h3.version {
|
|
font-size: 90%;
|
|
text-align: center;
|
|
}
|
|
a {
|
|
color: #3D578C;
|
|
font-weight: normal;
|
|
text-decoration: none;
|
|
}
|
|
.contents a:visited {
|
|
color: #4665A2;
|
|
}
|
|
a:hover {
|
|
text-decoration: underline;
|
|
}
|
|
a.el {
|
|
font-weight: bold;
|
|
}
|
|
a.code, a.code:visited, a.line, a.line:visited {
|
|
color: #4665A2;
|
|
}
|
|
a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited {
|
|
color: #4665A2;
|
|
}
|
|
pre.fragment {
|
|
border: 1px solid #C4CFE5;
|
|
background-color: #FBFCFD;
|
|
padding: 4px 6px;
|
|
margin: 4px 8px 4px 2px;
|
|
overflow: auto;
|
|
word-wrap: break-word;
|
|
font-size: 9pt;
|
|
line-height: 125%;
|
|
font-family: monospace, fixed;
|
|
font-size: 105%;
|
|
}
|
|
div.fragment {
|
|
padding: 0px;
|
|
margin: 4px 8px 4px 2px;
|
|
background-color: #FBFCFD;
|
|
border: 1px solid #C4CFE5;
|
|
}
|
|
div.line {
|
|
font-family: monospace, fixed;
|
|
font-size: 13px;
|
|
min-height: 13px;
|
|
line-height: 1.0;
|
|
text-wrap: unrestricted;
|
|
white-space: -moz-pre-wrap; /* Moz */
|
|
white-space: -pre-wrap; /* Opera 4-6 */
|
|
white-space: -o-pre-wrap; /* Opera 7 */
|
|
white-space: pre-wrap; /* CSS3 */
|
|
word-wrap: break-word; /* IE 5.5+ */
|
|
text-indent: -53px;
|
|
padding-left: 53px;
|
|
padding-bottom: 0px;
|
|
margin: 0px;
|
|
-webkit-transition-property: background-color, box-shadow;
|
|
-webkit-transition-duration: 0.5s;
|
|
-moz-transition-property: background-color, box-shadow;
|
|
-moz-transition-duration: 0.5s;
|
|
-ms-transition-property: background-color, box-shadow;
|
|
-ms-transition-duration: 0.5s;
|
|
-o-transition-property: background-color, box-shadow;
|
|
-o-transition-duration: 0.5s;
|
|
transition-property: background-color, box-shadow;
|
|
transition-duration: 0.5s;
|
|
}
|
|
div.contents {
|
|
margin-top: 10px;
|
|
margin-left: 12px;
|
|
margin-right: 8px;
|
|
}
|
|
div.center {
|
|
text-align: center;
|
|
margin-top: 0px;
|
|
margin-bottom: 0px;
|
|
padding: 0px;
|
|
}
|
|
div.center img {
|
|
border: 0px;
|
|
}
|
|
span.keyword {
|
|
color: #008000
|
|
}
|
|
span.keywordtype {
|
|
color: #604020
|
|
}
|
|
span.keywordflow {
|
|
color: #e08000
|
|
}
|
|
span.comment {
|
|
color: #800000
|
|
}
|
|
span.preprocessor {
|
|
color: #806020
|
|
}
|
|
span.stringliteral {
|
|
color: #002080
|
|
}
|
|
span.charliteral {
|
|
color: #008080
|
|
}
|
|
blockquote {
|
|
background-color: #F7F8FB;
|
|
border-left: 2px solid #9CAFD4;
|
|
margin: 0 24px 0 4px;
|
|
padding: 0 12px 0 16px;
|
|
}
|
|
hr {
|
|
height: 0px;
|
|
border: none;
|
|
border-top: 1px solid #4A6AAA;
|
|
}
|
|
address {
|
|
font-style: normal;
|
|
color: #2A3D61;
|
|
}
|
|
div.header {
|
|
background-image:url('nav_h.png');
|
|
background-repeat:repeat-x;
|
|
background-color: #F9FAFC;
|
|
margin: 0px;
|
|
border-bottom: 1px solid #C4CFE5;
|
|
}
|
|
div.headertitle {
|
|
padding: 5px 5px 5px 10px;
|
|
}
|
|
.image {
|
|
text-align: center;
|
|
}
|
|
.caption {
|
|
font-weight: bold;
|
|
}
|
|
div.zoom {
|
|
border: 1px solid #90A5CE;
|
|
}
|
|
tr.heading h2 {
|
|
margin-top: 12px;
|
|
margin-bottom: 4px;
|
|
}
|
|
</style>
|
|
</head>
|
|
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
|
|
<!--END TITLEAREA-->
|
|
<!-- end header part -->
|
|
<!-- Generated by Doxygen 1.8.13 -->
|
|
</div><!-- top -->
|
|
<div class="header">
|
|
<div class="headertitle">
|
|
<div class="title">Tutorial 21: Quake3 Explorer </div> </div>
|
|
</div><!--header-->
|
|
<div class="contents">
|
|
<div class="textblock"><div class="image">
|
|
<img src="../../media/example_screenshots/021shot.jpg" alt="021shot.jpg"/>
|
|
</div>
|
|
<p>This tutorial shows how to load different Quake 3 maps.</p>
|
|
<p>Features:</p><ul>
|
|
<li>Load BSP Archives at Runtime from the menu</li>
|
|
<li>Load a Map from the menu. Showing with Screenshot</li>
|
|
<li>Set the VideoDriver at runtime from menu</li>
|
|
<li>Adjust GammaLevel at runtime</li>
|
|
<li>Create SceneNodes for the Shaders</li>
|
|
<li>Load EntityList and create Entity SceneNodes</li>
|
|
<li>Create Players with Weapons and with Collision Response</li>
|
|
<li>Play music</li>
|
|
</ul>
|
|
<p>You can download the Quake III Arena demo ( copyright id software ) at the following location: <a href="ftp://ftp.idsoftware.com/idstuff/quake3/win32/q3ademo.exe">ftp://ftp.idsoftware.com/idstuff/quake3/win32/q3ademo.exe</a></p>
|
|
<p>Copyright 2006-2011 Burningwater, Thomas Alten </p><div class="fragment"><div class="line"><span class="preprocessor">#include <irrlicht.h></span></div><div class="line"><span class="preprocessor">#include "driverChoice.h"</span></div><div class="line"><span class="preprocessor">#include "exampleHelper.h"</span></div><div class="line"><span class="preprocessor">#include "q3factory.h"</span></div><div class="line"><span class="preprocessor">#include "sound.h"</span></div></div><!-- fragment --><p> Game Data is used to hold Data which is needed to drive the game </p><div class="fragment"><div class="line"><span class="keyword">struct </span>GameData</div><div class="line">{</div><div class="line"> GameData ( <span class="keyword">const</span> path &startupDir) :</div><div class="line"> retVal(0), StartupDir(startupDir), createExDevice(0), Device(0)</div><div class="line"> {</div><div class="line"> setDefault ();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> setDefault ();</div><div class="line"> s32 save ( <span class="keyword">const</span> path &filename );</div><div class="line"> s32 load ( <span class="keyword">const</span> path &filename );</div><div class="line"></div><div class="line"> s32 debugState;</div><div class="line"> s32 gravityState;</div><div class="line"> s32 flyTroughState;</div><div class="line"> s32 wireFrame;</div><div class="line"> s32 guiActive;</div><div class="line"> s32 guiInputActive;</div><div class="line"> f32 GammaValue;</div><div class="line"> s32 retVal;</div><div class="line"> s32 sound;</div><div class="line"></div><div class="line"> path StartupDir;</div><div class="line"> stringw CurrentMapName;</div><div class="line"> array<path> CurrentArchiveList;</div><div class="line"></div><div class="line"> vector3df PlayerPosition;</div><div class="line"> vector3df PlayerRotation;</div><div class="line"></div><div class="line"> tQ3EntityList Variable;</div><div class="line"></div><div class="line"> Q3LevelLoadParameter loadParam;</div><div class="line"> SIrrlichtCreationParameters deviceParam;</div><div class="line"> funcptr_createDeviceEx createExDevice;</div><div class="line"> IrrlichtDevice *Device;</div><div class="line">};</div></div><!-- fragment --><p> set default settings </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> GameData::setDefault ()</div><div class="line">{</div><div class="line"> debugState = EDS_OFF;</div><div class="line"> gravityState = 1;</div><div class="line"> flyTroughState = 0;</div><div class="line"> wireFrame = 0;</div><div class="line"> guiActive = 1;</div><div class="line"> guiInputActive = 0;</div><div class="line"> GammaValue = 1.f;</div><div class="line"></div><div class="line"> <span class="comment">// default deviceParam;</span></div><div class="line"><span class="preprocessor">#if defined ( _IRR_WINDOWS_ )</span></div><div class="line"> deviceParam.DriverType = EDT_DIRECT3D9;</div><div class="line"><span class="preprocessor">#else</span></div><div class="line"> deviceParam.DriverType = EDT_OPENGL;</div><div class="line"><span class="preprocessor">#endif</span></div><div class="line"> deviceParam.WindowSize.Width = 800;</div><div class="line"> deviceParam.WindowSize.Height = 600;</div><div class="line"> deviceParam.Fullscreen = <span class="keyword">false</span>;</div><div class="line"> deviceParam.Bits = 24;</div><div class="line"> deviceParam.ZBufferBits = 16;</div><div class="line"> deviceParam.Vsync = <span class="keyword">false</span>;</div><div class="line"> deviceParam.AntiAlias = <span class="keyword">false</span>;</div><div class="line"></div><div class="line"> <span class="comment">// default Quake3 loadParam</span></div><div class="line"> loadParam.defaultLightMapMaterial = EMT_LIGHTMAP;</div><div class="line"> loadParam.defaultModulate = EMFN_MODULATE_1X;</div><div class="line"> loadParam.defaultFilter = EMF_ANISOTROPIC_FILTER;</div><div class="line"> loadParam.verbose = 2;</div><div class="line"> loadParam.mergeShaderBuffer = 1; <span class="comment">// merge meshbuffers with same material</span></div><div class="line"> loadParam.cleanUnResolvedMeshes = 1; <span class="comment">// should unresolved meshes be cleaned. otherwise blue texture</span></div><div class="line"> loadParam.loadAllShaders = 1; <span class="comment">// load all scripts in the script directory</span></div><div class="line"> loadParam.loadSkyShader = 0; <span class="comment">// load sky Shader</span></div><div class="line"> loadParam.alpharef = 1;</div><div class="line"></div><div class="line"> sound = 0;</div><div class="line"></div><div class="line"> CurrentMapName = <span class="stringliteral">""</span>;</div><div class="line"> CurrentArchiveList.clear ();</div><div class="line"></div><div class="line"> <span class="keyword">const</span> io::path mediaPath = getExampleMediaPath();</div><div class="line"></div><div class="line"> <span class="comment">// Explorer Media directory</span></div><div class="line"> CurrentArchiveList.push_back ( StartupDir + mediaPath );</div><div class="line"></div><div class="line"> <span class="comment">// Add the original quake3 files before you load your custom map</span></div><div class="line"> <span class="comment">// Most mods are using the original shaders, models&items&weapons</span></div><div class="line"> CurrentArchiveList.push_back(<span class="stringliteral">"/q/baseq3/"</span>);</div><div class="line"></div><div class="line"> CurrentArchiveList.push_back(StartupDir + mediaPath + <span class="stringliteral">"map-20kdm2.pk3"</span>);</div><div class="line">}</div></div><!-- fragment --><p> Load the current game State from a typical quake3 cfg file </p><div class="fragment"><div class="line">s32 GameData::load ( <span class="keyword">const</span> path &filename )</div><div class="line">{</div><div class="line"> <span class="keywordflow">if</span> (!Device)</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"></div><div class="line"> <span class="comment">// the quake3 mesh loader can also handle *.shader and *.cfg file</span></div><div class="line"> IQ3LevelMesh* mesh = (IQ3LevelMesh*) Device->getSceneManager()->getMesh ( filename );</div><div class="line"> <span class="keywordflow">if</span> (!mesh)</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"></div><div class="line"> tQ3EntityList &entityList = mesh->getEntityList ();</div><div class="line"></div><div class="line"> stringc s;</div><div class="line"> u32 pos;</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> ( u32 e = 0; e != entityList.size (); ++e )</div><div class="line"> {</div><div class="line"> <span class="comment">//dumpShader ( s, &entityList[e], false );</span></div><div class="line"> <span class="comment">//printf ( s.c_str () );</span></div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> ( u32 g = 0; g != entityList[e].getGroupSize (); ++g )</div><div class="line"> {</div><div class="line"> <span class="keyword">const</span> SVarGroup *group = entityList[e].getGroup ( g );</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> ( u32 index = 0; index < group->Variable.size (); ++index )</div><div class="line"> {</div><div class="line"> <span class="keyword">const</span> SVariable &v = group->Variable[index];</div><div class="line"> pos = 0;</div><div class="line"> <span class="keywordflow">if</span> ( v.name == <span class="stringliteral">"playerposition"</span> )</div><div class="line"> {</div><div class="line"> PlayerPosition = getAsVector3df ( v.content, pos );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( v.name == <span class="stringliteral">"playerrotation"</span> )</div><div class="line"> {</div><div class="line"> PlayerRotation = getAsVector3df ( v.content, pos );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> 1;</div><div class="line">}</div></div><!-- fragment --><p> Store the current game State in a quake3 configuration file </p><div class="fragment"><div class="line">s32 GameData::save ( <span class="keyword">const</span> path &filename )</div><div class="line">{</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"> <span class="keywordflow">if</span> (!Device)</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"></div><div class="line"> c8 buf[128];</div><div class="line"> u32 i;</div><div class="line"></div><div class="line"> <span class="comment">// Store current Archive for restart</span></div><div class="line"> CurrentArchiveList.clear();</div><div class="line"> IFileSystem *fs = Device->getFileSystem();</div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i != fs->getFileArchiveCount(); ++i )</div><div class="line"> {</div><div class="line"> CurrentArchiveList.push_back ( fs->getFileArchive(i)->getFileList()->getPath() );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Store Player Position and Rotation</span></div><div class="line"> ICameraSceneNode * camera = Device->getSceneManager()->getActiveCamera ();</div><div class="line"> <span class="keywordflow">if</span> ( camera )</div><div class="line"> {</div><div class="line"> PlayerPosition = camera->getPosition ();</div><div class="line"> PlayerRotation = camera->getRotation ();</div><div class="line"> }</div><div class="line"></div><div class="line"> IWriteFile *file = fs->createAndWriteFile ( filename );</div><div class="line"> <span class="keywordflow">if</span> (!file)</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"></div><div class="line"> snprintf_irr ( buf, 128, <span class="stringliteral">"playerposition %.f %.f %.f\nplayerrotation %.f %.f %.f\n"</span>,</div><div class="line"> PlayerPosition.X, PlayerPosition.Z, PlayerPosition.Y,</div><div class="line"> PlayerRotation.X, PlayerRotation.Z, PlayerRotation.Y);</div><div class="line"> file->write ( buf, (s32) strlen ( buf ) );</div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i != fs->getFileArchiveCount(); ++i )</div><div class="line"> {</div><div class="line"> snprintf_irr ( buf, 128, <span class="stringliteral">"archive %s\n"</span>,stringc ( fs->getFileArchive(i)->getFileList()->getPath() ).c_str () );</div><div class="line"> file->write ( buf, (s32) strlen ( buf ) );</div><div class="line"> }</div><div class="line"></div><div class="line"> file->drop ();</div><div class="line"> <span class="keywordflow">return</span> 1;</div><div class="line">}</div></div><!-- fragment --><p> Representing a player </p><div class="fragment"><div class="line"><span class="keyword">struct </span>Q3Player : <span class="keyword">public</span> IAnimationEndCallBack</div><div class="line">{</div><div class="line"> Q3Player ()</div><div class="line"> : Device(0), MapParent(0), Mesh(0), WeaponNode(0), StartPositionCurrent(0)</div><div class="line"> {</div><div class="line"> animation[0] = 0;</div><div class="line"> memset(Anim, 0, <span class="keyword">sizeof</span>(TimeFire)*4);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">virtual</span> <span class="keywordtype">void</span> OnAnimationEnd(IAnimatedMeshSceneNode* node);</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> create ( IrrlichtDevice *device,</div><div class="line"> IQ3LevelMesh* mesh,</div><div class="line"> ISceneNode *mapNode,</div><div class="line"> IMetaTriangleSelector *meta</div><div class="line"> );</div><div class="line"> <span class="keywordtype">void</span> shutdown ();</div><div class="line"> <span class="keywordtype">void</span> setAnim ( <span class="keyword">const</span> c8 *name );</div><div class="line"> <span class="keywordtype">void</span> respawn ();</div><div class="line"> <span class="keywordtype">void</span> setpos ( <span class="keyword">const</span> vector3df &pos, <span class="keyword">const</span> vector3df& rotation );</div><div class="line"></div><div class="line"> ISceneNodeAnimatorCollisionResponse * cam() { <span class="keywordflow">return</span> camCollisionResponse ( Device ); }</div><div class="line"></div><div class="line"> IrrlichtDevice *Device;</div><div class="line"> ISceneNode* MapParent;</div><div class="line"> IQ3LevelMesh* Mesh;</div><div class="line"> IAnimatedMeshSceneNode* WeaponNode;</div><div class="line"> s32 StartPositionCurrent;</div><div class="line"> TimeFire Anim[4];</div><div class="line"> c8 animation[64];</div><div class="line"> c8 buf[64];</div><div class="line">};</div></div><!-- fragment --><p> End player </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> Q3Player::shutdown ()</div><div class="line">{</div><div class="line"> setAnim ( 0 );</div><div class="line"></div><div class="line"> dropElement (WeaponNode);</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( Device )</div><div class="line"> {</div><div class="line"> ICameraSceneNode* camera = Device->getSceneManager()->getActiveCamera();</div><div class="line"> dropElement ( camera );</div><div class="line"> Device = 0;</div><div class="line"> }</div><div class="line"></div><div class="line"> MapParent = 0;</div><div class="line"> Mesh = 0;</div><div class="line">}</div></div><!-- fragment --><p> create a new player </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> Q3Player::create ( IrrlichtDevice *device, IQ3LevelMesh* mesh, ISceneNode *mapNode, IMetaTriangleSelector *meta )</div><div class="line">{</div><div class="line"> setTimeFire ( Anim + 0, 200, FIRED );</div><div class="line"> setTimeFire ( Anim + 1, 5000 );</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (!device)</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"> <span class="comment">// load FPS weapon to Camera</span></div><div class="line"> Device = device;</div><div class="line"> Mesh = mesh;</div><div class="line"> MapParent = mapNode;</div><div class="line"></div><div class="line"> ISceneManager *smgr = device->getSceneManager ();</div><div class="line"> IVideoDriver * driver = device->getVideoDriver();</div><div class="line"></div><div class="line"> ICameraSceneNode* camera = 0;</div><div class="line"></div><div class="line"> core::array<SKeyMap> keyMap;</div><div class="line"> keyMap.set_used(12);</div><div class="line"> keyMap[0].Action = EKA_MOVE_FORWARD;</div><div class="line"> keyMap[0].KeyCode = KEY_UP;</div><div class="line"> keyMap[1].Action = EKA_MOVE_FORWARD;</div><div class="line"> keyMap[1].KeyCode = KEY_KEY_W;</div><div class="line"></div><div class="line"> keyMap[2].Action = EKA_MOVE_BACKWARD;</div><div class="line"> keyMap[2].KeyCode = KEY_DOWN;</div><div class="line"> keyMap[3].Action = EKA_MOVE_BACKWARD;</div><div class="line"> keyMap[3].KeyCode = KEY_KEY_S;</div><div class="line"></div><div class="line"> keyMap[4].Action = EKA_STRAFE_LEFT;</div><div class="line"> keyMap[4].KeyCode = KEY_LEFT;</div><div class="line"> keyMap[5].Action = EKA_STRAFE_LEFT;</div><div class="line"> keyMap[5].KeyCode = KEY_KEY_A;</div><div class="line"></div><div class="line"> keyMap[6].Action = EKA_STRAFE_RIGHT;</div><div class="line"> keyMap[6].KeyCode = KEY_RIGHT;</div><div class="line"> keyMap[7].Action = EKA_STRAFE_RIGHT;</div><div class="line"> keyMap[7].KeyCode = KEY_KEY_D;</div><div class="line"></div><div class="line"> keyMap[8].Action = EKA_JUMP_UP;</div><div class="line"> keyMap[8].KeyCode = KEY_KEY_J;</div><div class="line"></div><div class="line"> keyMap[9].Action = EKA_CROUCH;</div><div class="line"> keyMap[9].KeyCode = KEY_KEY_C;</div><div class="line"></div><div class="line"> keyMap[10].Action = EKA_ROTATE_LEFT;</div><div class="line"> keyMap[10].KeyCode = KEY_KEY_Q;</div><div class="line"></div><div class="line"> keyMap[11].Action = EKA_ROTATE_RIGHT;</div><div class="line"> keyMap[11].KeyCode = KEY_KEY_E;</div><div class="line"></div><div class="line"> camera = smgr->addCameraSceneNodeFPS(0, 100.0f, 0.6f, -1, keyMap.pointer(), keyMap.size(), <span class="keyword">false</span>, 600.f);</div><div class="line"> camera->setName ( <span class="stringliteral">"First Person Camera"</span> );</div><div class="line"> <span class="comment">//camera->setFOV ( 100.f * core::DEGTORAD );</span></div><div class="line"> camera->setFarValue( 20000.f );</div><div class="line"></div><div class="line"> IAnimatedMeshMD2* weaponMesh = (IAnimatedMeshMD2*) smgr->getMesh(<span class="stringliteral">"gun.md2"</span>);</div><div class="line"> <span class="keywordflow">if</span> ( 0 == weaponMesh )</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( weaponMesh->getMeshType() == EAMT_MD2 )</div><div class="line"> {</div><div class="line"> s32 count = weaponMesh->getAnimationCount();</div><div class="line"> <span class="keywordflow">for</span> ( s32 i = 0; i != count; ++i )</div><div class="line"> {</div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"Animation: %s"</span>, weaponMesh->getAnimationName(i) );</div><div class="line"> device->getLogger()->log(buf, ELL_INFORMATION);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> WeaponNode = smgr->addAnimatedMeshSceneNode(</div><div class="line"> weaponMesh,</div><div class="line"> smgr->getActiveCamera(),</div><div class="line"> 10,</div><div class="line"> vector3df( 0, 0, 0),</div><div class="line"> vector3df(-90,-90,90)</div><div class="line"> );</div><div class="line"> WeaponNode->setMaterialFlag(EMF_LIGHTING, <span class="keyword">false</span>);</div><div class="line"> WeaponNode->setMaterialTexture(0, driver->getTexture( <span class="stringliteral">"gun.jpg"</span>));</div><div class="line"> WeaponNode->setLoopMode ( <span class="keyword">false</span> );</div><div class="line"> WeaponNode->setName ( <span class="stringliteral">"tommi the gun man"</span> );</div><div class="line"></div><div class="line"> <span class="comment">//create a collision auto response animator</span></div><div class="line"> ISceneNodeAnimator* anim =</div><div class="line"> smgr->createCollisionResponseAnimator( meta, camera,</div><div class="line"> vector3df(30,45,30),</div><div class="line"> getGravity ( <span class="stringliteral">"earth"</span> ),</div><div class="line"> vector3df(0,40,0),</div><div class="line"> 0.0005f</div><div class="line"> );</div><div class="line"></div><div class="line"> camera->addAnimator( anim );</div><div class="line"> anim->drop();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( meta )</div><div class="line"> {</div><div class="line"> meta->drop ();</div><div class="line"> }</div><div class="line"></div><div class="line"> respawn ();</div><div class="line"> setAnim ( <span class="stringliteral">"idle"</span> );</div><div class="line">}</div></div><!-- fragment --><p> so we need a good starting Position in the level. we can ask the Quake3 Loader for all entities with class_name "info_player_deathmatch" </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> Q3Player::respawn ()</div><div class="line">{</div><div class="line"> <span class="keywordflow">if</span> (!Device)</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"> ICameraSceneNode* camera = Device->getSceneManager()->getActiveCamera();</div><div class="line"></div><div class="line"> Device->getLogger()->log( <span class="stringliteral">"respawn"</span> );</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (StartPositionCurrent >= Q3StartPosition(Mesh, camera,</div><div class="line"> StartPositionCurrent, cam()->getEllipsoidTranslation()))</div><div class="line"> StartPositionCurrent = 0;</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> ++StartPositionCurrent;</div><div class="line">}</div></div><!-- fragment --><p> set Player position from saved coordinates </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> Q3Player::setpos ( <span class="keyword">const</span> vector3df &pos, <span class="keyword">const</span> vector3df &rotation )</div><div class="line">{</div><div class="line"> <span class="keywordflow">if</span> (!Device)</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"> Device->getLogger()->log( <span class="stringliteral">"setpos"</span> );</div><div class="line"></div><div class="line"> ICameraSceneNode* camera = Device->getSceneManager()->getActiveCamera();</div><div class="line"> <span class="keywordflow">if</span> ( camera )</div><div class="line"> {</div><div class="line"> camera->setPosition ( pos );</div><div class="line"> camera->setRotation ( rotation );</div><div class="line"> camera->OnAnimate ( 0 );</div><div class="line"> }</div><div class="line">}</div></div><!-- fragment --><p> set the Animation of the player and weapon </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> Q3Player::setAnim ( <span class="keyword">const</span> c8 *name )</div><div class="line">{</div><div class="line"> <span class="keywordflow">if</span> ( name )</div><div class="line"> {</div><div class="line"> snprintf_irr ( animation, 64, <span class="stringliteral">"%s"</span>, name );</div><div class="line"> <span class="keywordflow">if</span> ( WeaponNode )</div><div class="line"> {</div><div class="line"> WeaponNode->setAnimationEndCallback ( <span class="keyword">this</span> );</div><div class="line"> WeaponNode->setMD2Animation ( animation );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> animation[0] = 0;</div><div class="line"> <span class="keywordflow">if</span> ( WeaponNode )</div><div class="line"> {</div><div class="line"> WeaponNode->setAnimationEndCallback ( 0 );</div><div class="line"> }</div><div class="line"> }</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">// Callback</span></div><div class="line"><span class="keywordtype">void</span> Q3Player::OnAnimationEnd(IAnimatedMeshSceneNode* node)</div><div class="line">{</div><div class="line"> setAnim ( 0 );</div><div class="line">}</div></div><!-- fragment --><p> GUI Elements </p><div class="fragment"><div class="line"><span class="keyword">struct </span>GUI</div><div class="line">{</div><div class="line"> GUI ()</div><div class="line"> {</div><div class="line"> memset ( <span class="keyword">this</span>, 0, <span class="keyword">sizeof</span> ( *<span class="keyword">this</span> ) );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> drop()</div><div class="line"> {</div><div class="line"> dropElement ( Window );</div><div class="line"> dropElement ( Logo );</div><div class="line"> }</div><div class="line"></div><div class="line"> IGUIComboBox* VideoDriver;</div><div class="line"> IGUIComboBox* VideoMode;</div><div class="line"> IGUICheckBox* FullScreen;</div><div class="line"> IGUICheckBox* Bit32;</div><div class="line"> IGUIScrollBar* MultiSample;</div><div class="line"> IGUIButton* SetVideoMode;</div><div class="line"></div><div class="line"> IGUIScrollBar* Tesselation;</div><div class="line"> IGUIScrollBar* Gamma;</div><div class="line"> IGUICheckBox* Collision;</div><div class="line"> IGUICheckBox* Visible_Map;</div><div class="line"> IGUICheckBox* Visible_Shader;</div><div class="line"> IGUICheckBox* Visible_Fog;</div><div class="line"> IGUICheckBox* Visible_Unresolved;</div><div class="line"> IGUICheckBox* Visible_Skydome;</div><div class="line"> IGUIButton* Respawn;</div><div class="line"></div><div class="line"> IGUITable* ArchiveList;</div><div class="line"> IGUIButton* ArchiveAdd;</div><div class="line"> IGUIButton* ArchiveRemove;</div><div class="line"> IGUIFileOpenDialog* ArchiveFileOpen;</div><div class="line"> IGUIButton* ArchiveUp;</div><div class="line"> IGUIButton* ArchiveDown;</div><div class="line"></div><div class="line"> IGUIListBox* MapList;</div><div class="line"> IGUITreeView* SceneTree;</div><div class="line"> IGUIStaticText* StatusLine;</div><div class="line"> IGUIImage* Logo;</div><div class="line"> IGUIWindow* Window;</div><div class="line">};</div></div><!-- fragment --><p> CQuake3EventHandler controls the game </p><div class="fragment"><div class="line"><span class="keyword">class </span>CQuake3EventHandler : <span class="keyword">public</span> IEventReceiver</div><div class="line">{</div><div class="line"><span class="keyword">public</span>:</div><div class="line"></div><div class="line"> CQuake3EventHandler( GameData *gameData );</div><div class="line"> <span class="keyword">virtual</span> ~CQuake3EventHandler ();</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> Animate();</div><div class="line"> <span class="keywordtype">void</span> Render();</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> AddArchive ( <span class="keyword">const</span> path& archiveName );</div><div class="line"> <span class="keywordtype">void</span> LoadMap ( <span class="keyword">const</span> stringw& mapName, s32 collision );</div><div class="line"> <span class="keywordtype">void</span> CreatePlayers();</div><div class="line"> <span class="keywordtype">void</span> AddSky( u32 dome, <span class="keyword">const</span> c8 *texture );</div><div class="line"> Q3Player *GetPlayer ( u32 index ) { <span class="keywordflow">return</span> &Player[index]; }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> CreateGUI();</div><div class="line"> <span class="keywordtype">void</span> SetGUIActive( s32 command);</div><div class="line"></div><div class="line"> <span class="keywordtype">bool</span> OnEvent(<span class="keyword">const</span> SEvent& eve);</div><div class="line"></div><div class="line"></div><div class="line"><span class="keyword">private</span>:</div><div class="line"></div><div class="line"> GameData *Game;</div><div class="line"></div><div class="line"> IQ3LevelMesh* Mesh;</div><div class="line"> ISceneNode* MapParent;</div><div class="line"> ISceneNode* ShaderParent;</div><div class="line"> ISceneNode* ItemParent;</div><div class="line"> ISceneNode* UnresolvedParent;</div><div class="line"> ISceneNode* BulletParent;</div><div class="line"> ISceneNode* FogParent;</div><div class="line"> ISceneNode * SkyNode;</div><div class="line"> IMetaTriangleSelector *Meta;</div><div class="line"></div><div class="line"> c8 buf[256];</div><div class="line"></div><div class="line"> Q3Player Player[2];</div><div class="line"></div><div class="line"> <span class="keyword">struct </span>SParticleImpact</div><div class="line"> {</div><div class="line"> u32 when;</div><div class="line"> vector3df pos;</div><div class="line"> vector3df outVector;</div><div class="line"> };</div><div class="line"> array<SParticleImpact> Impacts;</div><div class="line"> <span class="keywordtype">void</span> useItem( Q3Player * player);</div><div class="line"> <span class="keywordtype">void</span> createParticleImpacts( u32 now );</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> createTextures ();</div><div class="line"> <span class="keywordtype">void</span> addSceneTreeItem( ISceneNode * parent, IGUITreeViewNode* nodeParent);</div><div class="line"></div><div class="line"> GUI gui;</div><div class="line"> <span class="keywordtype">void</span> dropMap ();</div><div class="line">};</div></div><!-- fragment --><p> Constructor </p><div class="fragment"><div class="line">CQuake3EventHandler::CQuake3EventHandler( GameData *game )</div><div class="line">: Game(game), Mesh(0), MapParent(0), ShaderParent(0), ItemParent(0), UnresolvedParent(0),</div><div class="line"> BulletParent(0), FogParent(0), SkyNode(0), Meta(0)</div><div class="line">{</div><div class="line"> buf[0]=0;</div><div class="line"> <span class="comment">// Also use 16 Bit Textures for 16 Bit RenderDevice</span></div><div class="line"> <span class="keywordflow">if</span> ( Game->deviceParam.Bits == 16 )</div><div class="line"> {</div><div class="line"> game->Device->getVideoDriver()->setTextureCreationFlag(ETCF_ALWAYS_16_BIT, <span class="keyword">true</span>);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Quake3 Shader controls Z-Writing</span></div><div class="line"> game->Device->getSceneManager()->getParameters()->setAttribute(scene::ALLOW_ZWRITE_ON_TRANSPARENT, <span class="keyword">true</span>);</div><div class="line"></div><div class="line"> <span class="comment">// create internal textures</span></div><div class="line"> createTextures ();</div><div class="line"></div><div class="line"> sound_init ( game->Device );</div><div class="line"></div><div class="line"> Game->Device->setEventReceiver ( <span class="keyword">this</span> );</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">// destructor</span></div><div class="line">CQuake3EventHandler::~CQuake3EventHandler ()</div><div class="line">{</div><div class="line"> Player[0].shutdown ();</div><div class="line"> sound_shutdown ();</div><div class="line"></div><div class="line"> Game->save( <span class="stringliteral">"explorer.cfg"</span> );</div><div class="line"></div><div class="line"> Game->Device->drop();</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">// create runtime textures smog, fog</span></div><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::createTextures()</div><div class="line">{</div><div class="line"> IVideoDriver * driver = Game->Device->getVideoDriver();</div><div class="line"></div><div class="line"> dimension2du dim(64, 64);</div><div class="line"></div><div class="line"> video::IImage* image;</div><div class="line"> u32 i;</div><div class="line"> u32 x;</div><div class="line"> u32 y;</div><div class="line"> u32 * data;</div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i != 8; ++i )</div><div class="line"> {</div><div class="line"> image = driver->createImage ( video::ECF_A8R8G8B8, dim);</div><div class="line"> data = (u32*) image->getData ();</div><div class="line"> <span class="keywordflow">for</span> ( y = 0; y != dim.Height; ++y )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">for</span> ( x = 0; x != dim.Width; ++x )</div><div class="line"> {</div><div class="line"> data [x] = 0xFFFFFFFF;</div><div class="line"> }</div><div class="line"> data = (u32*) ( (u8*) data + image->getPitch() );</div><div class="line"> }</div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"smoke_%02d"</span>, i );</div><div class="line"> driver->addTexture( buf, image );</div><div class="line"> image->drop ();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// fog</span></div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i != 1; ++i )</div><div class="line"> {</div><div class="line"> image = driver->createImage ( video::ECF_A8R8G8B8, dim);</div><div class="line"> data = (u32*) image->getData ();</div><div class="line"> <span class="keywordflow">for</span> ( y = 0; y != dim.Height; ++y )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">for</span> ( x = 0; x != dim.Width; ++x )</div><div class="line"> {</div><div class="line"> data [x] = 0xFFFFFFFF;</div><div class="line"> }</div><div class="line"> data = (u32*) ( (u8*) data + image->getPitch() );</div><div class="line"> }</div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"fog_%02d"</span>, i );</div><div class="line"> driver->addTexture( buf, image );</div><div class="line"> image->drop ();</div><div class="line"> }</div><div class="line">}</div></div><!-- fragment --><p> create the GUI </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::CreateGUI()</div><div class="line">{</div><div class="line"></div><div class="line"> IGUIEnvironment *env = Game->Device->getGUIEnvironment();</div><div class="line"> IVideoDriver * driver = Game->Device->getVideoDriver();</div><div class="line"></div><div class="line"> gui.drop();</div><div class="line"></div><div class="line"> <span class="comment">// set skin font</span></div><div class="line"> IGUIFont* font = env->getFont(<span class="stringliteral">"fontlucida.png"</span>);</div><div class="line"> <span class="keywordflow">if</span> (font)</div><div class="line"> env->getSkin()->setFont(font);</div><div class="line"> env->getSkin()->setColor ( EGDC_BUTTON_TEXT, video::SColor(240,0xAA,0xAA,0xAA) );</div><div class="line"> env->getSkin()->setColor ( EGDC_3D_HIGH_LIGHT, video::SColor(240,0x22,0x22,0x22) );</div><div class="line"> env->getSkin()->setColor ( EGDC_3D_FACE, video::SColor(240,0x44,0x44,0x44) );</div><div class="line"> env->getSkin()->setColor ( EGDC_EDITABLE, video::SColor(240,0x44,0x44,0x44) );</div><div class="line"> env->getSkin()->setColor ( EGDC_FOCUSED_EDITABLE, video::SColor(240,0x54,0x54,0x54) );</div><div class="line"> env->getSkin()->setColor ( EGDC_WINDOW, video::SColor(240,0x66,0x66,0x66) );</div><div class="line"></div><div class="line"> <span class="comment">// minimal gui size 800x600</span></div><div class="line"> dimension2d<u32> dim ( 800, 600 );</div><div class="line"> dimension2d<u32> vdim ( Game->Device->getVideoDriver()->getScreenSize() );</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( vdim.Height >= dim.Height && vdim.Width >= dim.Width )</div><div class="line"> {</div><div class="line"> <span class="comment">//dim = vdim;</span></div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> }</div><div class="line"></div><div class="line"> gui.Window = env->addWindow ( rect<s32> ( 0, 0, dim.Width, dim.Height ), <span class="keyword">false</span>, L<span class="stringliteral">"Quake3 Explorer"</span> );</div><div class="line"> gui.Window->setToolTipText ( L<span class="stringliteral">"Quake3Explorer. Loads and show various BSP File Format and Shaders."</span> );</div><div class="line"> gui.Window->getCloseButton()->setToolTipText ( L<span class="stringliteral">"Quit Quake3 Explorer"</span> );</div><div class="line"></div><div class="line"> <span class="comment">// add a status line help text</span></div><div class="line"> gui.StatusLine = env->addStaticText( 0, rect<s32>( 5,dim.Height - 30,dim.Width - 5,dim.Height - 10),</div><div class="line"> <span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">true</span></div><div class="line"> );</div><div class="line"></div><div class="line"></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"VideoDriver:"</span>, rect<s32>( dim.Width - 400, 24, dim.Width - 310, 40 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"> gui.VideoDriver = env->addComboBox(rect<s32>( dim.Width - 300, 24, dim.Width - 10, 40 ),gui.Window);</div><div class="line"> gui.VideoDriver->addItem(L<span class="stringliteral">"Direct3D 9.0c"</span>, EDT_DIRECT3D9 );</div><div class="line"> gui.VideoDriver->addItem(L<span class="stringliteral">"OpenGL 1.5"</span>, EDT_OPENGL);</div><div class="line"> gui.VideoDriver->addItem(L<span class="stringliteral">"Software Renderer"</span>, EDT_SOFTWARE);</div><div class="line"> gui.VideoDriver->addItem(L<span class="stringliteral">"Burning's Video (TM) Thomas Alten"</span>, EDT_BURNINGSVIDEO);</div><div class="line"> gui.VideoDriver->setSelected ( gui.VideoDriver->getIndexForItemData ( Game->deviceParam.DriverType ) );</div><div class="line"> gui.VideoDriver->setToolTipText ( L<span class="stringliteral">"Use a VideoDriver"</span> );</div><div class="line"></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"VideoMode:"</span>, rect<s32>( dim.Width - 400, 44, dim.Width - 310, 60 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"> gui.VideoMode = env->addComboBox(rect<s32>( dim.Width - 300, 44, dim.Width - 10, 60 ),gui.Window);</div><div class="line"> gui.VideoMode->setToolTipText ( L<span class="stringliteral">"Supported Screenmodes"</span> );</div><div class="line"> IVideoModeList *modeList = Game->Device->getVideoModeList();</div><div class="line"> <span class="keywordflow">if</span> ( modeList )</div><div class="line"> {</div><div class="line"> s32 i;</div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i != modeList->getVideoModeCount (); ++i )</div><div class="line"> {</div><div class="line"> u16 d = modeList->getVideoModeDepth ( i );</div><div class="line"> <span class="keywordflow">if</span> ( d < 16 )</div><div class="line"> <span class="keywordflow">continue</span>;</div><div class="line"></div><div class="line"> u16 w = modeList->getVideoModeResolution ( i ).Width;</div><div class="line"> u16 h = modeList->getVideoModeResolution ( i ).Height;</div><div class="line"> u32 val = w << 16 | h;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( gui.VideoMode->getIndexForItemData ( val ) >= 0 )</div><div class="line"> <span class="keywordflow">continue</span>;</div><div class="line"></div><div class="line"> f32 aspect = (f32) w / (f32) h;</div><div class="line"> <span class="keyword">const</span> c8 *a = <span class="stringliteral">""</span>;</div><div class="line"> <span class="keywordflow">if</span> ( core::equals ( aspect, 1.3333333333f ) ) a = <span class="stringliteral">"4:3"</span>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( core::equals ( aspect, 1.6666666f ) ) a = <span class="stringliteral">"15:9 widescreen"</span>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( core::equals ( aspect, 1.7777777f ) ) a = <span class="stringliteral">"16:9 widescreen"</span>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( core::equals ( aspect, 1.6f ) ) a = <span class="stringliteral">"16:10 widescreen"</span>;</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( core::equals ( aspect, 2.133333f ) ) a = <span class="stringliteral">"20:9 widescreen"</span>;</div><div class="line"></div><div class="line"> snprintf_irr ( buf, <span class="keyword">sizeof</span> ( buf ), <span class="stringliteral">"%d x %d, %s"</span>,w, h, a );</div><div class="line"> gui.VideoMode->addItem ( stringw ( buf ).c_str(), val );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> gui.VideoMode->setSelected ( gui.VideoMode->getIndexForItemData (</div><div class="line"> Game->deviceParam.WindowSize.Width << 16 |</div><div class="line"> Game->deviceParam.WindowSize.Height ) );</div><div class="line"></div><div class="line"> gui.FullScreen = env->addCheckBox ( Game->deviceParam.Fullscreen, rect<s32>( dim.Width - 400, 64, dim.Width - 300, 80 ), gui.Window,-1, L<span class="stringliteral">"Fullscreen"</span> );</div><div class="line"> gui.FullScreen->setToolTipText ( L<span class="stringliteral">"Set Fullscreen or Window Mode"</span> );</div><div class="line"></div><div class="line"> gui.Bit32 = env->addCheckBox ( Game->deviceParam.Bits == 32, rect<s32>( dim.Width - 300, 64, dim.Width - 240, 80 ), gui.Window,-1, L<span class="stringliteral">"32Bit"</span> );</div><div class="line"> gui.Bit32->setToolTipText ( L<span class="stringliteral">"Use 16 or 32 Bit"</span> );</div><div class="line"></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"MultiSample:"</span>, rect<s32>( dim.Width - 235, 64, dim.Width - 150, 80 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"> gui.MultiSample = env->addScrollBar( <span class="keyword">true</span>, rect<s32>( dim.Width - 150, 64, dim.Width - 70, 80 ), gui.Window,-1 );</div><div class="line"> gui.MultiSample->setMin ( 0 );</div><div class="line"> gui.MultiSample->setMax ( 8 );</div><div class="line"> gui.MultiSample->setSmallStep ( 1 );</div><div class="line"> gui.MultiSample->setLargeStep ( 1 );</div><div class="line"> gui.MultiSample->setPos ( Game->deviceParam.AntiAlias );</div><div class="line"> gui.MultiSample->setToolTipText ( L<span class="stringliteral">"Set the MultiSample (disable, 1x, 2x, 4x, 8x )"</span> );</div><div class="line"></div><div class="line"> gui.SetVideoMode = env->addButton (rect<s32>( dim.Width - 60, 64, dim.Width - 10, 80 ), gui.Window, -1,L<span class="stringliteral">"set"</span> );</div><div class="line"> gui.SetVideoMode->setToolTipText ( L<span class="stringliteral">"Set Video Mode with current values"</span> );</div><div class="line"></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"Gamma:"</span>, rect<s32>( dim.Width - 400, 104, dim.Width - 310, 120 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"> gui.Gamma = env->addScrollBar( <span class="keyword">true</span>, rect<s32>( dim.Width - 300, 104, dim.Width - 10, 120 ), gui.Window,-1 );</div><div class="line"> gui.Gamma->setMin ( 50 );</div><div class="line"> gui.Gamma->setMax ( 350 );</div><div class="line"> gui.Gamma->setSmallStep ( 1 );</div><div class="line"> gui.Gamma->setLargeStep ( 10 );</div><div class="line"> gui.Gamma->setPos ( core::floor32 ( Game->GammaValue * 100.f ) );</div><div class="line"> gui.Gamma->setToolTipText ( L<span class="stringliteral">"Adjust Gamma Ramp ( 0.5 - 3.5)"</span> );</div><div class="line"> Game->Device->setGammaRamp ( Game->GammaValue, Game->GammaValue, Game->GammaValue, 0.f, 0.f );</div><div class="line"></div><div class="line"></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"Tesselation:"</span>, rect<s32>( dim.Width - 400, 124, dim.Width - 310, 140 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"> gui.Tesselation = env->addScrollBar( <span class="keyword">true</span>, rect<s32>( dim.Width - 300, 124, dim.Width - 10, 140 ), gui.Window,-1 );</div><div class="line"> gui.Tesselation->setMin ( 2 );</div><div class="line"> gui.Tesselation->setMax ( 12 );</div><div class="line"> gui.Tesselation->setSmallStep ( 1 );</div><div class="line"> gui.Tesselation->setLargeStep ( 1 );</div><div class="line"> gui.Tesselation->setPos ( Game->loadParam.patchTesselation );</div><div class="line"> gui.Tesselation->setToolTipText ( L<span class="stringliteral">"How smooth should curved surfaces be rendered"</span> );</div><div class="line"></div><div class="line"> gui.Collision = env->addCheckBox ( <span class="keyword">true</span>, rect<s32>( dim.Width - 400, 150, dim.Width - 300, 166 ), gui.Window,-1, L<span class="stringliteral">"Collision"</span> );</div><div class="line"> gui.Collision->setToolTipText ( L<span class="stringliteral">"Set collision on or off ( flythrough ). \nPress F7 on your Keyboard"</span> );</div><div class="line"> gui.Visible_Map = env->addCheckBox ( <span class="keyword">true</span>, rect<s32>( dim.Width - 300, 150, dim.Width - 240, 166 ), gui.Window,-1, L<span class="stringliteral">"Map"</span> );</div><div class="line"> gui.Visible_Map->setToolTipText ( L<span class="stringliteral">"Show or not show the static part the Level. \nPress F3 on your Keyboard"</span> );</div><div class="line"> gui.Visible_Shader = env->addCheckBox ( <span class="keyword">true</span>, rect<s32>( dim.Width - 240, 150, dim.Width - 170, 166 ), gui.Window,-1, L<span class="stringliteral">"Shader"</span> );</div><div class="line"> gui.Visible_Shader->setToolTipText ( L<span class="stringliteral">"Show or not show the Shader Nodes. \nPress F4 on your Keyboard"</span> );</div><div class="line"> gui.Visible_Fog = env->addCheckBox ( <span class="keyword">true</span>, rect<s32>( dim.Width - 170, 150, dim.Width - 110, 166 ), gui.Window,-1, L<span class="stringliteral">"Fog"</span> );</div><div class="line"> gui.Visible_Fog->setToolTipText ( L<span class="stringliteral">"Show or not show the Fog Nodes. \nPress F5 on your Keyboard"</span> );</div><div class="line"> gui.Visible_Unresolved = env->addCheckBox ( <span class="keyword">true</span>, rect<s32>( dim.Width - 110, 150, dim.Width - 10, 166 ), gui.Window,-1, L<span class="stringliteral">"Unresolved"</span> );</div><div class="line"> gui.Visible_Unresolved->setToolTipText ( L<span class="stringliteral">"Show the or not show the Nodes the Engine can't handle. \nPress F6 on your Keyboard"</span> );</div><div class="line"> gui.Visible_Skydome = env->addCheckBox ( <span class="keyword">true</span>, rect<s32>( dim.Width - 110, 180, dim.Width - 10, 196 ), gui.Window,-1, L<span class="stringliteral">"Skydome"</span> );</div><div class="line"> gui.Visible_Skydome->setToolTipText ( L<span class="stringliteral">"Show the or not show the Skydome."</span> );</div><div class="line"></div><div class="line"> <span class="comment">//Respawn = env->addButton ( rect<s32>( dim.Width - 260, 90, dim.Width - 10, 106 ), 0,-1, L"Respawn" );</span></div><div class="line"></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"Archives:"</span>, rect<s32>( 5, dim.Height - 530, dim.Width - 600,dim.Height - 514 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"></div><div class="line"> gui.ArchiveAdd = env->addButton ( rect<s32>( dim.Width - 725, dim.Height - 530, dim.Width - 665, dim.Height - 514 ), gui.Window,-1, L<span class="stringliteral">"add"</span> );</div><div class="line"> gui.ArchiveAdd->setToolTipText ( L<span class="stringliteral">"Add an archive, usually packed zip-archives (*.pk3) to the Filesystem"</span> );</div><div class="line"> gui.ArchiveRemove = env->addButton ( rect<s32>( dim.Width - 660, dim.Height - 530, dim.Width - 600, dim.Height - 514 ), gui.Window,-1, L<span class="stringliteral">"del"</span> );</div><div class="line"> gui.ArchiveRemove->setToolTipText ( L<span class="stringliteral">"Remove the selected archive from the FileSystem."</span> );</div><div class="line"> gui.ArchiveUp = env->addButton ( rect<s32>( dim.Width - 575, dim.Height - 530, dim.Width - 515, dim.Height - 514 ), gui.Window,-1, L<span class="stringliteral">"up"</span> );</div><div class="line"> gui.ArchiveUp->setToolTipText ( L<span class="stringliteral">"Arrange Archive Look-up Hirachy. Move the selected Archive up"</span> );</div><div class="line"> gui.ArchiveDown = env->addButton ( rect<s32>( dim.Width - 510, dim.Height - 530, dim.Width - 440, dim.Height - 514 ), gui.Window,-1, L<span class="stringliteral">"down"</span> );</div><div class="line"> gui.ArchiveDown->setToolTipText ( L<span class="stringliteral">"Arrange Archive Look-up Hirachy. Move the selected Archive down"</span> );</div><div class="line"></div><div class="line"></div><div class="line"> gui.ArchiveList = env->addTable ( rect<s32>( 5,dim.Height - 510, dim.Width - 450,dim.Height - 410 ), gui.Window );</div><div class="line"> gui.ArchiveList->addColumn ( L<span class="stringliteral">"Type"</span>, 0 );</div><div class="line"> gui.ArchiveList->addColumn ( L<span class="stringliteral">"Real File Path"</span>, 1 );</div><div class="line"> gui.ArchiveList->setColumnWidth ( 0, 60 );</div><div class="line"> gui.ArchiveList->setColumnWidth ( 1, 284 );</div><div class="line"> gui.ArchiveList->setToolTipText ( L<span class="stringliteral">"Show the attached Archives"</span> );</div><div class="line"></div><div class="line"></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"Maps:"</span>, rect<s32>( 5, dim.Height - 400, dim.Width - 450,dim.Height - 380 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"> gui.MapList = env->addListBox ( rect<s32>( 5,dim.Height - 380, dim.Width - 450,dim.Height - 40 ), gui.Window, -1, <span class="keyword">true</span> );</div><div class="line"> gui.MapList->setToolTipText ( L<span class="stringliteral">"Show the current Maps in all Archives.\n Double-Click the Map to start the level"</span> );</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">// create a visible Scene Tree</span></div><div class="line"> env->addStaticText ( L<span class="stringliteral">"Scenegraph:"</span>, rect<s32>( dim.Width - 400, dim.Height - 400, dim.Width - 5,dim.Height - 380 ),<span class="keyword">false</span>, <span class="keyword">false</span>, gui.Window, -1, <span class="keyword">false</span> );</div><div class="line"> gui.SceneTree = env->addTreeView( rect<s32>( dim.Width - 400, dim.Height - 380, dim.Width - 5, dim.Height - 40 ),</div><div class="line"> gui.Window, -1, <span class="keyword">true</span>, <span class="keyword">true</span>, <span class="keyword">false</span> );</div><div class="line"> gui.SceneTree->setToolTipText ( L<span class="stringliteral">"Show the current Scenegraph"</span> );</div><div class="line"> gui.SceneTree->getRoot()->clearChildren();</div><div class="line"> addSceneTreeItem ( Game->Device->getSceneManager()->getRootSceneNode(), gui.SceneTree->getRoot() );</div><div class="line"></div><div class="line"></div><div class="line"> IGUIImageList* imageList = env->createImageList( driver->getTexture ( <span class="stringliteral">"iconlist.png"</span> ),</div><div class="line"> dimension2di( 32, 32 ), true );</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( imageList )</div><div class="line"> {</div><div class="line"> gui.SceneTree->setImageList( imageList );</div><div class="line"> imageList->drop ();</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">// load the engine logo</span></div><div class="line"> gui.Logo = env->addImage( driver->getTexture(<span class="stringliteral">"irrlichtlogo3.png"</span>), position2d<s32>(5, 16 ), <span class="keyword">true</span>, 0 );</div><div class="line"> gui.Logo->setToolTipText ( L<span class="stringliteral">"The great Irrlicht Engine"</span> );</div><div class="line"></div><div class="line"> AddArchive ( <span class="stringliteral">""</span> );</div><div class="line">}</div></div><!-- fragment --><p> Add an Archive to the FileSystems and updates the GUI </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::AddArchive ( <span class="keyword">const</span> path& archiveName )</div><div class="line">{</div><div class="line"> IFileSystem *fs = Game->Device->getFileSystem();</div><div class="line"> u32 i;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( archiveName.size () )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> exists = <span class="keyword">false</span>;</div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i != fs->getFileArchiveCount(); ++i )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( fs->getFileArchive(i)->getFileList()->getPath() == archiveName )</div><div class="line"> {</div><div class="line"> exists = <span class="keyword">true</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (!exists)</div><div class="line"> {</div><div class="line"> fs->addFileArchive(archiveName, <span class="keyword">true</span>, <span class="keyword">false</span>);</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// store the current archives in game data</span></div><div class="line"> <span class="comment">// show the attached Archive in proper order</span></div><div class="line"> <span class="keywordflow">if</span> ( gui.ArchiveList )</div><div class="line"> {</div><div class="line"> gui.ArchiveList->clearRows();</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i != fs->getFileArchiveCount(); ++i )</div><div class="line"> {</div><div class="line"> IFileArchive * archive = fs->getFileArchive ( i );</div><div class="line"></div><div class="line"> u32 index = gui.ArchiveList->addRow(i);</div><div class="line"></div><div class="line"> core::stringw typeName;</div><div class="line"> <span class="keywordflow">switch</span>(archive->getType())</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> io::EFAT_ZIP:</div><div class="line"> typeName = <span class="stringliteral">"ZIP"</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> io::EFAT_GZIP:</div><div class="line"> typeName = <span class="stringliteral">"gzip"</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> io::EFAT_FOLDER:</div><div class="line"> typeName = <span class="stringliteral">"Mount"</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> io::EFAT_PAK:</div><div class="line"> typeName = <span class="stringliteral">"PAK"</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> io::EFAT_TAR:</div><div class="line"> typeName = <span class="stringliteral">"TAR"</span>;</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">default</span>:</div><div class="line"> typeName = <span class="stringliteral">"archive"</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> gui.ArchiveList->setCellText ( index, 0, typeName );</div><div class="line"> gui.ArchiveList->setCellText ( index, 1, archive->getFileList()->getPath() );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">// browse the archives for maps</span></div><div class="line"> <span class="keywordflow">if</span> ( gui.MapList )</div><div class="line"> {</div><div class="line"> gui.MapList->clear();</div><div class="line"></div><div class="line"> IGUISpriteBank *bank = Game->Device->getGUIEnvironment()->getSpriteBank(<span class="stringliteral">"sprite_q3map"</span>);</div><div class="line"> <span class="keywordflow">if</span> ( 0 == bank )</div><div class="line"> bank = Game->Device->getGUIEnvironment()->addEmptySpriteBank(<span class="stringliteral">"sprite_q3map"</span>);</div><div class="line"></div><div class="line"> SGUISprite sprite;</div><div class="line"> SGUISpriteFrame frame;</div><div class="line"> core::rect<s32> r;</div><div class="line"></div><div class="line"> bank->getSprites().clear();</div><div class="line"> bank->getPositions().clear ();</div><div class="line"> gui.MapList->setSpriteBank ( bank );</div><div class="line"></div><div class="line"> u32 g = 0;</div><div class="line"> core::stringw s;</div><div class="line"></div><div class="line"> <span class="comment">// browse the attached file system</span></div><div class="line"> fs->setFileListSystem ( FILESYSTEM_VIRTUAL );</div><div class="line"> fs->changeWorkingDirectoryTo ( <span class="stringliteral">"/maps/"</span> );</div><div class="line"> IFileList *fileList = fs->createFileList ();</div><div class="line"> fs->setFileListSystem ( FILESYSTEM_NATIVE );</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> ( i=0; i< fileList->getFileCount(); ++i)</div><div class="line"> {</div><div class="line"> s = fileList->getFullFileName(i);</div><div class="line"> <span class="keywordflow">if</span> ( s.find ( <span class="stringliteral">".bsp"</span> ) >= 0 )</div><div class="line"> {</div><div class="line"> <span class="comment">// get level screenshot. reformat texture to 128x128</span></div><div class="line"> path c ( s );</div><div class="line"> deletePathFromFilename ( c );</div><div class="line"> cutFilenameExtension ( c, c );</div><div class="line"> c = path ( <span class="stringliteral">"levelshots/"</span> ) + c;</div><div class="line"></div><div class="line"> dimension2du dim ( 128, 128 );</div><div class="line"> IVideoDriver * driver = Game->Device->getVideoDriver();</div><div class="line"> IImage* image = 0;</div><div class="line"> ITexture *tex = 0;</div><div class="line"> path filename;</div><div class="line"></div><div class="line"> filename = c + <span class="stringliteral">".jpg"</span>;</div><div class="line"> <span class="keywordflow">if</span> ( fs->existFile ( filename ) )</div><div class="line"> image = driver->createImageFromFile( filename );</div><div class="line"> <span class="keywordflow">if</span> ( 0 == image )</div><div class="line"> {</div><div class="line"> filename = c + <span class="stringliteral">".tga"</span>;</div><div class="line"> <span class="keywordflow">if</span> ( fs->existFile ( filename ) )</div><div class="line"> image = driver->createImageFromFile( filename );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( image )</div><div class="line"> {</div><div class="line"> IImage* filter = driver->createImage ( video::ECF_R8G8B8, dim );</div><div class="line"> image->copyToScalingBoxFilter ( filter, 0 );</div><div class="line"> image->drop ();</div><div class="line"> image = filter;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( image )</div><div class="line"> {</div><div class="line"> tex = driver->addTexture ( filename, image );</div><div class="line"> image->drop ();</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> bank->setTexture ( g, tex );</div><div class="line"></div><div class="line"> r.LowerRightCorner.X = dim.Width;</div><div class="line"> r.LowerRightCorner.Y = dim.Height;</div><div class="line"> gui.MapList->setItemHeight ( r.LowerRightCorner.Y + 4 );</div><div class="line"> frame.rectNumber = bank->getPositions().size();</div><div class="line"> frame.textureNumber = g;</div><div class="line"></div><div class="line"> bank->getPositions().push_back(r);</div><div class="line"></div><div class="line"> sprite.Frames.set_used ( 0 );</div><div class="line"> sprite.Frames.push_back(frame);</div><div class="line"> sprite.frameTime = 0;</div><div class="line"> bank->getSprites().push_back(sprite);</div><div class="line"></div><div class="line"> gui.MapList->addItem ( s.c_str (), g );</div><div class="line"> g += 1;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> fileList->drop ();</div><div class="line"></div><div class="line"> gui.MapList->setSelected ( -1 );</div><div class="line"> IGUIScrollBar * bar = (IGUIScrollBar*)gui.MapList->getElementFromId( 0 );</div><div class="line"> <span class="keywordflow">if</span> ( bar )</div><div class="line"> bar->setPos ( 0 );</div><div class="line"></div><div class="line"> }</div><div class="line"></div><div class="line">}</div></div><!-- fragment --><p> clears the Map in Memory </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::dropMap ()</div><div class="line">{</div><div class="line"> IVideoDriver * driver = Game->Device->getVideoDriver();</div><div class="line"></div><div class="line"> driver->removeAllHardwareBuffers ();</div><div class="line"> driver->removeAllTextures ();</div><div class="line"></div><div class="line"> Player[0].shutdown ();</div><div class="line"></div><div class="line"></div><div class="line"> dropElement ( ItemParent );</div><div class="line"> dropElement ( ShaderParent );</div><div class="line"> dropElement ( UnresolvedParent );</div><div class="line"> dropElement ( FogParent );</div><div class="line"> dropElement ( BulletParent );</div><div class="line"></div><div class="line"></div><div class="line"> Impacts.clear();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( Meta )</div><div class="line"> {</div><div class="line"> Meta = 0;</div><div class="line"> }</div><div class="line"></div><div class="line"> dropElement ( MapParent );</div><div class="line"> dropElement ( SkyNode );</div><div class="line"></div><div class="line"> <span class="comment">// clean out meshes, because textures are invalid</span></div><div class="line"> <span class="comment">// TODO: better texture handling;-)</span></div><div class="line"> IMeshCache *cache = Game->Device->getSceneManager ()->getMeshCache();</div><div class="line"> cache->clear ();</div><div class="line"> Mesh = 0;</div><div class="line">}</div></div><!-- fragment --><p> Load new map </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::LoadMap ( <span class="keyword">const</span> stringw &mapName, s32 collision )</div><div class="line">{</div><div class="line"> <span class="keywordflow">if</span> ( 0 == mapName.size() )</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> dropMap ();</div><div class="line"></div><div class="line"> IFileSystem *fs = Game->Device->getFileSystem();</div><div class="line"> ISceneManager *smgr = Game->Device->getSceneManager ();</div><div class="line"></div><div class="line"> IReadFile* file = fs->createMemoryReadFile(&Game->loadParam,</div><div class="line"> <span class="keyword">sizeof</span>(Game->loadParam), L<span class="stringliteral">"levelparameter.cfg"</span>, <span class="keyword">false</span>);</div><div class="line"></div><div class="line"> <span class="comment">// load cfg file</span></div><div class="line"> smgr->getMesh( file );</div><div class="line"> file->drop ();</div><div class="line"></div><div class="line"> <span class="comment">// load the actual map</span></div><div class="line"> Mesh = (IQ3LevelMesh*) smgr->getMesh(mapName);</div><div class="line"> <span class="keywordflow">if</span> ( 0 == Mesh )</div><div class="line"> <span class="keywordflow">return</span>;</div></div><!-- fragment --><p> add the geometry mesh to the Scene ( polygon & patches ) The Geometry mesh is optimised for faster drawing </p><div class="fragment"><div class="line">IMesh *geometry = Mesh->getMesh(E_Q3_MESH_GEOMETRY);</div><div class="line"><span class="keywordflow">if</span> ( 0 == geometry || geometry->getMeshBufferCount() == 0)</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line">Game->CurrentMapName = mapName;</div><div class="line"></div><div class="line"><span class="comment">//create a collision list</span></div><div class="line">Meta = 0;</div><div class="line"></div><div class="line">ITriangleSelector * selector = 0;</div><div class="line"><span class="keywordflow">if</span> (collision)</div><div class="line"> Meta = smgr->createMetaTriangleSelector();</div><div class="line"></div><div class="line"><span class="comment">//IMeshBuffer *b0 = geometry->getMeshBuffer(0);</span></div><div class="line"><span class="comment">//s32 minimalNodes = b0 ? core::s32_max ( 2048, b0->getVertexCount() / 32 ) : 2048;</span></div><div class="line">s32 minimalNodes = 2048;</div><div class="line"></div><div class="line">MapParent = smgr->addOctreeSceneNode(geometry, 0, -1, minimalNodes);</div><div class="line">MapParent->setName ( mapName );</div><div class="line"><span class="keywordflow">if</span> ( Meta )</div><div class="line">{</div><div class="line"> selector = smgr->createOctreeTriangleSelector( geometry,MapParent, minimalNodes);</div><div class="line"> <span class="comment">//selector = smgr->createTriangleSelector ( geometry, MapParent );</span></div><div class="line"> Meta->addTriangleSelector( selector);</div><div class="line"> selector->drop ();</div><div class="line">}</div><div class="line"></div><div class="line"><span class="comment">// logical parent for the items</span></div><div class="line">ItemParent = smgr->addEmptySceneNode();</div><div class="line"><span class="keywordflow">if</span> ( ItemParent )</div><div class="line"> ItemParent->setName ( <span class="stringliteral">"Item Container"</span> );</div><div class="line"></div><div class="line">ShaderParent = smgr->addEmptySceneNode();</div><div class="line"><span class="keywordflow">if</span> ( ShaderParent )</div><div class="line"> ShaderParent->setName ( <span class="stringliteral">"Shader Container"</span> );</div><div class="line"></div><div class="line">UnresolvedParent = smgr->addEmptySceneNode();</div><div class="line"><span class="keywordflow">if</span> ( UnresolvedParent )</div><div class="line"> UnresolvedParent->setName ( <span class="stringliteral">"Unresolved Container"</span> );</div><div class="line"></div><div class="line">FogParent = smgr->addEmptySceneNode();</div><div class="line"><span class="keywordflow">if</span> ( FogParent )</div><div class="line"> FogParent->setName ( <span class="stringliteral">"Fog Container"</span> );</div><div class="line"></div><div class="line"><span class="comment">// logical parent for the bullets</span></div><div class="line">BulletParent = smgr->addEmptySceneNode();</div><div class="line"><span class="keywordflow">if</span> ( BulletParent )</div><div class="line"> BulletParent->setName ( <span class="stringliteral">"Bullet Container"</span> );</div></div><!-- fragment --><p> now construct SceneNodes for each Shader The Objects are stored in the quake mesh E_Q3_MESH_ITEMS and the Shader ID is stored in the MaterialParameters mostly dark looking skulls and moving lava.. or green flashing tubes? </p><div class="fragment"><div class="line">Q3ShaderFactory ( Game->loadParam, Game->Device, Mesh, E_Q3_MESH_ITEMS,ShaderParent, Meta, <span class="keyword">false</span> );</div><div class="line">Q3ShaderFactory ( Game->loadParam, Game->Device, Mesh, E_Q3_MESH_FOG,FogParent, 0, <span class="keyword">false</span> );</div><div class="line">Q3ShaderFactory ( Game->loadParam, Game->Device, Mesh, E_Q3_MESH_UNRESOLVED,UnresolvedParent, Meta, <span class="keyword">true</span> );</div></div><!-- fragment --><p> Now construct Models from Entity List </p><div class="fragment"><div class="line"> Q3ModelFactory ( Game->loadParam, Game->Device, Mesh, ItemParent, <span class="keyword">false</span> );</div><div class="line">}</div></div><!-- fragment --><p> Adds a SceneNode with an icon to the Scene Tree </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::addSceneTreeItem( ISceneNode * parent, IGUITreeViewNode* nodeParent)</div><div class="line">{</div><div class="line"> IGUITreeViewNode* node;</div><div class="line"> <span class="keywordtype">wchar_t</span> msg[128];</div><div class="line"></div><div class="line"> s32 imageIndex;</div><div class="line"> list<ISceneNode*>::ConstIterator it = parent->getChildren().begin();</div><div class="line"> <span class="keywordflow">for</span> (; it != parent->getChildren().end(); ++it)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">switch</span> ( (*it)->getType () )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> ESNT_Q3SHADER_SCENE_NODE: imageIndex = 0; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_CAMERA: imageIndex = 1; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_EMPTY: imageIndex = 2; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_MESH: imageIndex = 3; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_OCTREE: imageIndex = 3; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_ANIMATED_MESH: imageIndex = 4; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_SKY_BOX: imageIndex = 5; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_BILLBOARD: imageIndex = 6; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_PARTICLE_SYSTEM: imageIndex = 7; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> ESNT_TEXT: imageIndex = 8; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">default</span>:imageIndex = -1; <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( imageIndex < 0 )</div><div class="line"> {</div><div class="line"> swprintf_irr ( msg, 128, L<span class="stringliteral">"%hs,%hs"</span>,</div><div class="line"> Game->Device->getSceneManager ()->getSceneNodeTypeName ( (*it)->getType () ),</div><div class="line"> (*it)->getName()</div><div class="line"> );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> swprintf_irr ( msg, 128, L<span class="stringliteral">"%hs"</span>,(*it)->getName() );</div><div class="line"> }</div><div class="line"></div><div class="line"> node = nodeParent->addChildBack( msg, 0, imageIndex );</div><div class="line"></div><div class="line"> <span class="comment">// Add all Animators</span></div><div class="line"> list<ISceneNodeAnimator*>::ConstIterator ait = (*it)->getAnimators().begin();</div><div class="line"> <span class="keywordflow">for</span> (; ait != (*it)->getAnimators().end(); ++ait)</div><div class="line"> {</div><div class="line"> imageIndex = -1;</div><div class="line"> swprintf_irr ( msg, 128, L<span class="stringliteral">"%hs"</span>,</div><div class="line"> Game->Device->getSceneManager ()->getAnimatorTypeName ( (*ait)->getType () )</div><div class="line"> );</div><div class="line"></div><div class="line"> <span class="keywordflow">switch</span> ( (*ait)->getType () )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> ESNAT_FLY_CIRCLE:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_FLY_STRAIGHT:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_FOLLOW_SPLINE:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_ROTATION:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_TEXTURE:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_DELETION:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_COLLISION_RESPONSE:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_CAMERA_FPS:</div><div class="line"> <span class="keywordflow">case</span> ESNAT_CAMERA_MAYA:</div><div class="line"> <span class="keywordflow">default</span>:</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> node->addChildBack( msg, 0, imageIndex );</div><div class="line"> }</div><div class="line"></div><div class="line"> addSceneTreeItem ( *it, node );</div><div class="line"> }</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">// Adds life!</span></div><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::CreatePlayers()</div><div class="line">{</div><div class="line"> Player[0].create ( Game->Device, Mesh, MapParent, Meta );</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">// Adds a skydome to the scene</span></div><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::AddSky( u32 dome, <span class="keyword">const</span> c8 *texture)</div><div class="line">{</div><div class="line"> ISceneManager *smgr = Game->Device->getSceneManager ();</div><div class="line"> IVideoDriver * driver = Game->Device->getVideoDriver();</div><div class="line"></div><div class="line"> <span class="keywordtype">bool</span> oldMipMapState = driver->getTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS);</div><div class="line"> driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, <span class="keyword">false</span>);</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( 0 == dome )</div><div class="line"> {</div><div class="line"> <span class="comment">// irrlicht order</span></div><div class="line"> <span class="comment">//static const c8*p[] = { "ft", "lf", "bk", "rt", "up", "dn" };</span></div><div class="line"> <span class="comment">// quake3 order</span></div><div class="line"> <span class="keyword">static</span> <span class="keyword">const</span> c8*p[] = { <span class="stringliteral">"ft"</span>, <span class="stringliteral">"rt"</span>, <span class="stringliteral">"bk"</span>, <span class="stringliteral">"lf"</span>, <span class="stringliteral">"up"</span>, <span class="stringliteral">"dn"</span> };</div><div class="line"></div><div class="line"> u32 i = 0;</div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"%s_%s.jpg"</span>, texture, p[i] );</div><div class="line"> SkyNode = smgr->addSkyBoxSceneNode( driver->getTexture ( buf ), 0, 0, 0, 0, 0 );</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (SkyNode)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">for</span> ( i = 0; i < 6; ++i )</div><div class="line"> {</div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"%s_%s.jpg"</span>, texture, p[i] );</div><div class="line"> SkyNode->getMaterial(i).setTexture ( 0, driver->getTexture ( buf ) );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( 1 == dome )</div><div class="line"> {</div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"%s.jpg"</span>, texture );</div><div class="line"> SkyNode = smgr->addSkyDomeSceneNode(</div><div class="line"> driver->getTexture( buf ), 32,32,</div><div class="line"> 1.f, 1.f, 1000.f, 0, 11);</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( 2 == dome )</div><div class="line"> {</div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"%s.jpg"</span>, texture );</div><div class="line"> SkyNode = smgr->addSkyDomeSceneNode(</div><div class="line"> driver->getTexture( buf ), 16,8,</div><div class="line"> 0.95f, 2.f, 1000.f, 0, 11);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (SkyNode)</div><div class="line"> SkyNode->setName(<span class="stringliteral">"Skydome"</span>);</div><div class="line"> <span class="comment">//SkyNode->getMaterial(0).ZBuffer = video::EMDF_DEPTH_LESS_EQUAL;</span></div><div class="line"></div><div class="line"> driver->setTextureCreationFlag(video::ETCF_CREATE_MIP_MAPS, oldMipMapState);</div><div class="line">}</div><div class="line"></div><div class="line"></div><div class="line"><span class="comment">// enable GUI elements</span></div><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::SetGUIActive( s32 command)</div><div class="line">{</div><div class="line"> <span class="keywordtype">bool</span> inputState = <span class="keyword">false</span>;</div><div class="line"></div><div class="line"> ICameraSceneNode * camera = Game->Device->getSceneManager()->getActiveCamera ();</div><div class="line"></div><div class="line"> <span class="keywordflow">switch</span> ( command )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> 0: Game->guiActive = 0; inputState = !Game->guiActive; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> 1: Game->guiActive = 1; inputState = !Game->guiActive;;<span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> 2: Game->guiActive ^= 1; inputState = !Game->guiActive;<span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> 3:</div><div class="line"> <span class="keywordflow">if</span> ( camera )</div><div class="line"> inputState = !camera->isInputReceiverEnabled();</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( camera )</div><div class="line"> {</div><div class="line"> camera->setInputReceiverEnabled ( inputState );</div><div class="line"> Game->Device->getCursorControl()->setVisible( !inputState );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( gui.Window )</div><div class="line"> {</div><div class="line"> gui.Window->setVisible ( Game->guiActive != 0 );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( Game->guiActive &&</div><div class="line"> gui.SceneTree && Game->Device->getGUIEnvironment()->getFocus() != gui.SceneTree</div><div class="line"> )</div><div class="line"> {</div><div class="line"> gui.SceneTree->getRoot()->clearChildren();</div><div class="line"> addSceneTreeItem ( Game->Device->getSceneManager()->getRootSceneNode(), gui.SceneTree->getRoot() );</div><div class="line"> }</div><div class="line"></div><div class="line"> Game->Device->getGUIEnvironment()->setFocus ( Game->guiActive ? gui.Window: 0 );</div><div class="line">}</div></div><!-- fragment --><p> Handle game input </p><div class="fragment"><div class="line"><span class="keywordtype">bool</span> CQuake3EventHandler::OnEvent(<span class="keyword">const</span> SEvent& eve)</div><div class="line">{</div><div class="line"> <span class="keywordflow">if</span> ( eve.EventType == EET_LOG_TEXT_EVENT )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( Game->guiActive && eve.EventType == EET_GUI_EVENT )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.MapList && eve.GUIEvent.EventType == gui::EGET_LISTBOX_SELECTED_AGAIN )</div><div class="line"> {</div><div class="line"> s32 selected = gui.MapList->getSelected();</div><div class="line"> <span class="keywordflow">if</span> ( selected >= 0 )</div><div class="line"> {</div><div class="line"> stringw loadMap = gui.MapList->getListItem ( selected );</div><div class="line"> <span class="keywordflow">if</span> ( 0 == MapParent || loadMap != Game->CurrentMapName )</div><div class="line"> {</div><div class="line"> printf ( <span class="stringliteral">"Loading map %ls\n"</span>, loadMap.c_str() );</div><div class="line"> LoadMap ( loadMap , 1 );</div><div class="line"> <span class="keywordflow">if</span> ( 0 == Game->loadParam.loadSkyShader )</div><div class="line"> {</div><div class="line"> AddSky ( 1, <span class="stringliteral">"skydome2"</span> );</div><div class="line"> }</div><div class="line"> CreatePlayers ();</div><div class="line"> CreateGUI ();</div><div class="line"> SetGUIActive ( 0 );</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.ArchiveRemove && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )</div><div class="line"> {</div><div class="line"> Game->Device->getFileSystem()->removeFileArchive( gui.ArchiveList->getSelected() );</div><div class="line"> Game->CurrentMapName = <span class="stringliteral">""</span>;</div><div class="line"> AddArchive ( <span class="stringliteral">""</span> );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.ArchiveAdd && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( 0 == gui.ArchiveFileOpen )</div><div class="line"> {</div><div class="line"> Game->Device->getFileSystem()->setFileListSystem ( FILESYSTEM_NATIVE );</div><div class="line"> gui.ArchiveFileOpen = Game->Device->getGUIEnvironment()->addFileOpenDialog ( L<span class="stringliteral">"Add Game Archive"</span> , <span class="keyword">false</span>,gui.Window );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.ArchiveFileOpen && eve.GUIEvent.EventType == gui::EGET_FILE_SELECTED )</div><div class="line"> {</div><div class="line"> AddArchive ( gui.ArchiveFileOpen->getFileNameP() );</div><div class="line"> gui.ArchiveFileOpen = 0;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.ArchiveFileOpen && eve.GUIEvent.EventType == gui::EGET_DIRECTORY_SELECTED )</div><div class="line"> {</div><div class="line"> AddArchive ( gui.ArchiveFileOpen->getDirectoryName() );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.ArchiveFileOpen && eve.GUIEvent.EventType == gui::EGET_FILE_CHOOSE_DIALOG_CANCELLED )</div><div class="line"> {</div><div class="line"> gui.ArchiveFileOpen = 0;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( ( eve.GUIEvent.Caller == gui.ArchiveUp || eve.GUIEvent.Caller == gui.ArchiveDown ) &&</div><div class="line"> eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )</div><div class="line"> {</div><div class="line"> s32 rel = eve.GUIEvent.Caller == gui.ArchiveUp ? -1 : 1;</div><div class="line"> <span class="keywordflow">if</span> ( Game->Device->getFileSystem()->moveFileArchive ( gui.ArchiveList->getSelected (), rel ) )</div><div class="line"> {</div><div class="line"> s32 newIndex = core::s32_clamp ( gui.ArchiveList->getSelected() + rel, 0, gui.ArchiveList->getRowCount() - 1 );</div><div class="line"> AddArchive ( <span class="stringliteral">""</span> );</div><div class="line"> gui.ArchiveList->setSelected ( newIndex );</div><div class="line"> Game->CurrentMapName = <span class="stringliteral">""</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.VideoDriver && eve.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED )</div><div class="line"> {</div><div class="line"> Game->deviceParam.DriverType = (E_DRIVER_TYPE) gui.VideoDriver->getItemData ( gui.VideoDriver->getSelected() );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.VideoMode && eve.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED )</div><div class="line"> {</div><div class="line"> u32 val = gui.VideoMode->getItemData ( gui.VideoMode->getSelected() );</div><div class="line"> Game->deviceParam.WindowSize.Width = val >> 16;</div><div class="line"> Game->deviceParam.WindowSize.Height = val & 0xFFFF;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.FullScreen && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )</div><div class="line"> {</div><div class="line"> Game->deviceParam.Fullscreen = gui.FullScreen->isChecked();</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Bit32 && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )</div><div class="line"> {</div><div class="line"> Game->deviceParam.Bits = gui.Bit32->isChecked() ? 32 : 16;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.MultiSample && eve.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED )</div><div class="line"> {</div><div class="line"> Game->deviceParam.AntiAlias = gui.MultiSample->getPos();</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Tesselation && eve.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED )</div><div class="line"> {</div><div class="line"> Game->loadParam.patchTesselation = gui.Tesselation->getPos ();</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Gamma && eve.GUIEvent.EventType == gui::EGET_SCROLL_BAR_CHANGED )</div><div class="line"> {</div><div class="line"> Game->GammaValue = gui.Gamma->getPos () * 0.01f;</div><div class="line"> Game->Device->setGammaRamp ( Game->GammaValue, Game->GammaValue, Game->GammaValue, 0.f, 0.f );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.SetVideoMode && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )</div><div class="line"> {</div><div class="line"> Game->retVal = 2;</div><div class="line"> Game->Device->closeDevice();</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Window && eve.GUIEvent.EventType == gui::EGET_ELEMENT_CLOSED )</div><div class="line"> {</div><div class="line"> Game->Device->closeDevice();</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Collision && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )</div><div class="line"> {</div><div class="line"> <span class="comment">// set fly through active</span></div><div class="line"> Game->flyTroughState ^= 1;</div><div class="line"> Player[0].cam()->setAnimateTarget ( Game->flyTroughState == 0 );</div><div class="line"></div><div class="line"> printf ( <span class="stringliteral">"collision %d\n"</span>, Game->flyTroughState == 0 );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Visible_Map && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> v = gui.Visible_Map->isChecked();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( MapParent )</div><div class="line"> {</div><div class="line"> printf ( <span class="stringliteral">"static node set visible %d\n"</span>,v );</div><div class="line"> MapParent->setVisible ( v );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Visible_Shader && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> v = gui.Visible_Shader->isChecked();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( ShaderParent )</div><div class="line"> {</div><div class="line"> printf ( <span class="stringliteral">"shader node set visible %d\n"</span>,v );</div><div class="line"> ShaderParent->setVisible ( v );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Visible_Skydome && eve.GUIEvent.EventType == gui::EGET_CHECKBOX_CHANGED )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( SkyNode )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> v = !SkyNode->isVisible();</div><div class="line"> printf ( <span class="stringliteral">"skynode set visible %d\n"</span>,v );</div><div class="line"> SkyNode->setVisible ( v );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.GUIEvent.Caller == gui.Respawn && eve.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )</div><div class="line"> {</div><div class="line"> Player[0].respawn ();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// fire</span></div><div class="line"> <span class="keywordflow">if</span> ((eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.Key == KEY_SPACE &&</div><div class="line"> eve.KeyInput.PressedDown == <span class="keyword">false</span>) ||</div><div class="line"> (eve.EventType == EET_MOUSE_INPUT_EVENT && eve.MouseInput.Event == EMIE_LMOUSE_LEFT_UP)</div><div class="line"> )</div><div class="line"> {</div><div class="line"> ICameraSceneNode * camera = Game->Device->getSceneManager()->getActiveCamera ();</div><div class="line"> <span class="keywordflow">if</span> ( camera && camera->isInputReceiverEnabled () )</div><div class="line"> {</div><div class="line"> useItem( Player + 0 );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// gui active</span></div><div class="line"> <span class="keywordflow">if</span> ((eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.Key == KEY_F1 &&</div><div class="line"> eve.KeyInput.PressedDown == <span class="keyword">false</span>) ||</div><div class="line"> (eve.EventType == EET_MOUSE_INPUT_EVENT && eve.MouseInput.Event == EMIE_RMOUSE_LEFT_UP)</div><div class="line"> )</div><div class="line"> {</div><div class="line"> SetGUIActive ( 2 );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// check if user presses the key</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.PressedDown == <span class="keyword">false</span>)</div><div class="line"> {</div><div class="line"> <span class="comment">// Escape toggles camera Input</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.KeyInput.Key == irr::KEY_ESCAPE )</div><div class="line"> {</div><div class="line"> SetGUIActive ( 3 );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F11)</div><div class="line"> {</div><div class="line"> <span class="comment">// screenshot are taken without gamma!</span></div><div class="line"> IImage* image = Game->Device->getVideoDriver()->createScreenShot();</div><div class="line"> <span class="keywordflow">if</span> (image)</div><div class="line"> {</div><div class="line"> core::vector3df pos;</div><div class="line"> core::vector3df rot;</div><div class="line"> ICameraSceneNode * cam = Game->Device->getSceneManager()->getActiveCamera ();</div><div class="line"> <span class="keywordflow">if</span> ( cam )</div><div class="line"> {</div><div class="line"> pos = cam->getPosition ();</div><div class="line"> rot = cam->getRotation ();</div><div class="line"> }</div><div class="line"></div><div class="line"> snprintf_irr(buf, 256, <span class="stringliteral">"%s_%ls_%.0f_%.0f_%.0f_%.0f_%.0f_%.0f.jpg"</span>,</div><div class="line"> DRIVER_TYPE_NAMES_SHORT[Game->Device->getVideoDriver()->getDriverType()],</div><div class="line"> Game->CurrentMapName.c_str(),</div><div class="line"> pos.X, pos.Y, pos.Z,</div><div class="line"> rot.X, rot.Y, rot.Z</div><div class="line"> );</div><div class="line"> path filename ( buf );</div><div class="line"> filename.replace ( <span class="charliteral">'/'</span>, <span class="charliteral">'_'</span> );</div><div class="line"> printf ( <span class="stringliteral">"screenshot : %s\n"</span>, filename.c_str() );</div><div class="line"> Game->Device->getVideoDriver()->writeImageToFile(image, filename, 100 );</div><div class="line"> image->drop();</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F9)</div><div class="line"> {</div><div class="line"> s32 value = EDS_OFF;</div><div class="line"></div><div class="line"> Game->debugState = ( Game->debugState + 1 ) & 3;</div><div class="line"></div><div class="line"> <span class="keywordflow">switch</span> ( Game->debugState )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> 1: value = EDS_NORMALS | EDS_MESH_WIRE_OVERLAY | EDS_BBOX_ALL; <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> 2: value = EDS_NORMALS | EDS_MESH_WIRE_OVERLAY | EDS_SKELETON; <span class="keywordflow">break</span>;</div><div class="line"> }</div></div><!-- fragment --><p> set debug map data on/off debugState = debugState == EDS_OFF ? EDS_NORMALS | EDS_MESH_WIRE_OVERLAY | EDS_BBOX_ALL: EDS_OFF; </p><div class="fragment"><div class="line"> <span class="keywordflow">if</span> ( ItemParent )</div><div class="line"> {</div><div class="line"> list<ISceneNode*>::ConstIterator it = ItemParent->getChildren().begin();</div><div class="line"> <span class="keywordflow">for</span> (; it != ItemParent->getChildren().end(); ++it)</div><div class="line"> {</div><div class="line"> (*it)->setDebugDataVisible ( value );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( ShaderParent )</div><div class="line"> {</div><div class="line"> list<ISceneNode*>::ConstIterator it = ShaderParent->getChildren().begin();</div><div class="line"> <span class="keywordflow">for</span> (; it != ShaderParent->getChildren().end(); ++it)</div><div class="line"> {</div><div class="line"> (*it)->setDebugDataVisible ( value );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( UnresolvedParent )</div><div class="line"> {</div><div class="line"> list<ISceneNode*>::ConstIterator it = UnresolvedParent->getChildren().begin();</div><div class="line"> <span class="keywordflow">for</span> (; it != UnresolvedParent->getChildren().end(); ++it)</div><div class="line"> {</div><div class="line"> (*it)->setDebugDataVisible ( value );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( FogParent )</div><div class="line"> {</div><div class="line"> list<ISceneNode*>::ConstIterator it = FogParent->getChildren().begin();</div><div class="line"> <span class="keywordflow">for</span> (; it != FogParent->getChildren().end(); ++it)</div><div class="line"> {</div><div class="line"> (*it)->setDebugDataVisible ( value );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( SkyNode )</div><div class="line"> {</div><div class="line"> SkyNode->setDebugDataVisible ( value );</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F8)</div><div class="line"> {</div><div class="line"> <span class="comment">// set gravity on/off</span></div><div class="line"> Game->gravityState ^= 1;</div><div class="line"> Player[0].cam()->setGravity ( getGravity ( Game->gravityState ? <span class="stringliteral">"earth"</span> : <span class="stringliteral">"none"</span> ) );</div><div class="line"> printf ( <span class="stringliteral">"gravity %s\n"</span>, Game->gravityState ? <span class="stringliteral">"earth"</span> : <span class="stringliteral">"none"</span> );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F7)</div><div class="line"> {</div><div class="line"> <span class="comment">// set fly through active</span></div><div class="line"> Game->flyTroughState ^= 1;</div><div class="line"> Player[0].cam()->setAnimateTarget ( Game->flyTroughState == 0 );</div><div class="line"> <span class="keywordflow">if</span> ( gui.Collision )</div><div class="line"> gui.Collision->setChecked ( Game->flyTroughState == 0 );</div><div class="line"></div><div class="line"> printf ( <span class="stringliteral">"collision %d\n"</span>, Game->flyTroughState == 0 );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F2)</div><div class="line"> {</div><div class="line"> Player[0].respawn ();</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F3)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( MapParent )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> v = !MapParent->isVisible ();</div><div class="line"> printf ( <span class="stringliteral">"static node set visible %d\n"</span>,v );</div><div class="line"> MapParent->setVisible ( v );</div><div class="line"> <span class="keywordflow">if</span> ( gui.Visible_Map )</div><div class="line"> gui.Visible_Map->setChecked ( v );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F4)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( ShaderParent )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> v = !ShaderParent->isVisible ();</div><div class="line"> printf ( <span class="stringliteral">"shader node set visible %d\n"</span>,v );</div><div class="line"> ShaderParent->setVisible ( v );</div><div class="line"> <span class="keywordflow">if</span> ( gui.Visible_Shader )</div><div class="line"> gui.Visible_Shader->setChecked ( v );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F5)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( FogParent )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> v = !FogParent->isVisible ();</div><div class="line"> printf ( <span class="stringliteral">"fog node set visible %d\n"</span>,v );</div><div class="line"> FogParent->setVisible ( v );</div><div class="line"> <span class="keywordflow">if</span> ( gui.Visible_Fog )</div><div class="line"> gui.Visible_Fog->setChecked ( v );</div><div class="line"> }</div><div class="line"></div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> <span class="keywordflow">if</span> (eve.KeyInput.Key == KEY_F6)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( UnresolvedParent )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> v = !UnresolvedParent->isVisible ();</div><div class="line"> printf ( <span class="stringliteral">"unresolved node set visible %d\n"</span>,v );</div><div class="line"> UnresolvedParent->setVisible ( v );</div><div class="line"> <span class="keywordflow">if</span> ( gui.Visible_Unresolved )</div><div class="line"> gui.Visible_Unresolved->setChecked ( v );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// check if user presses the key C ( for crouch)</span></div><div class="line"> <span class="keywordflow">if</span> ( eve.EventType == EET_KEY_INPUT_EVENT && eve.KeyInput.Key == KEY_KEY_C )</div><div class="line"> {</div><div class="line"> <span class="comment">// crouch</span></div><div class="line"> ISceneNodeAnimatorCollisionResponse *anim = Player[0].cam ();</div><div class="line"> <span class="keywordflow">if</span> ( anim && 0 == Game->flyTroughState )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( <span class="keyword">false</span> == eve.KeyInput.PressedDown )</div><div class="line"> {</div><div class="line"> <span class="comment">// stand up</span></div><div class="line"> anim->setEllipsoidRadius ( vector3df(30,45,30) );</div><div class="line"> anim->setEllipsoidTranslation ( vector3df(0,40,0));</div><div class="line"></div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> <span class="comment">// on your knees</span></div><div class="line"> anim->setEllipsoidRadius ( vector3df(30,20,30) );</div><div class="line"> anim->setEllipsoidTranslation ( vector3df(0,20,0));</div><div class="line"> }</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line">}</div></div><!-- fragment --><p> useItem </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::useItem( Q3Player * player)</div><div class="line">{</div><div class="line"> ISceneManager* smgr = Game->Device->getSceneManager();</div><div class="line"> ICameraSceneNode* camera = smgr->getActiveCamera();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (!camera)</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> SParticleImpact imp;</div><div class="line"> imp.when = 0;</div><div class="line"></div><div class="line"> <span class="comment">// get line of camera</span></div><div class="line"></div><div class="line"> vector3df start = camera->getPosition();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( player->WeaponNode )</div><div class="line"> {</div><div class="line"> start.X += 0.f;</div><div class="line"> start.Y += 0.f;</div><div class="line"> start.Z += 0.f;</div><div class="line"> }</div><div class="line"></div><div class="line"> vector3df end = (camera->getTarget() - start);</div><div class="line"> end.normalize();</div><div class="line"> start += end*20.0f;</div><div class="line"></div><div class="line"> end = start + (end * camera->getFarValue());</div><div class="line"></div><div class="line"> triangle3df triangle;</div><div class="line"> line3d<f32> line(start, end);</div><div class="line"></div><div class="line"> <span class="comment">// get intersection point with map</span></div><div class="line"> scene::ISceneNode* hitNode;</div><div class="line"> <span class="keywordflow">if</span> (smgr->getSceneCollisionManager()->getCollisionPoint(</div><div class="line"> line, Meta, end, triangle,hitNode))</div><div class="line"> {</div><div class="line"> <span class="comment">// collides with wall</span></div><div class="line"> vector3df out = triangle.getNormal();</div><div class="line"> out.setLength(0.03f);</div><div class="line"></div><div class="line"> imp.when = 1;</div><div class="line"> imp.outVector = out;</div><div class="line"> imp.pos = end;</div><div class="line"></div><div class="line"> player->setAnim ( <span class="stringliteral">"pow"</span> );</div><div class="line"> player->Anim[1].next += player->Anim[1].delta;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> <span class="comment">// doesnt collide with wall</span></div><div class="line"> vector3df start = camera->getPosition();</div><div class="line"> <span class="keywordflow">if</span> ( player->WeaponNode )</div><div class="line"> {</div><div class="line"> <span class="comment">//start.X += 10.f;</span></div><div class="line"> <span class="comment">//start.Y += -5.f;</span></div><div class="line"> <span class="comment">//start.Z += 1.f;</span></div><div class="line"> }</div><div class="line"></div><div class="line"> vector3df end = (camera->getTarget() - start);</div><div class="line"> end.normalize();</div><div class="line"> start += end*20.0f;</div><div class="line"> end = start + (end * camera->getFarValue());</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// create fire ball</span></div><div class="line"> ISceneNode* node = 0;</div><div class="line"> node = smgr->addBillboardSceneNode( BulletParent,dimension2d<f32>(10,10), start);</div><div class="line"></div><div class="line"> node->setMaterialFlag(EMF_LIGHTING, <span class="keyword">false</span>);</div><div class="line"> node->setMaterialTexture(0, Game->Device->getVideoDriver()->getTexture(<span class="stringliteral">"fireball.bmp"</span>));</div><div class="line"> node->setMaterialFlag(video::EMF_ZWRITE_ENABLE, <span class="keyword">false</span>);</div><div class="line"> node->setMaterialType(EMT_TRANSPARENT_ADD_COLOR);</div><div class="line"></div><div class="line"> f32 length = (f32)(end - start).getLength();</div><div class="line"> <span class="keyword">const</span> f32 speed = 5.8f;</div><div class="line"> u32 time = (u32)(length / speed);</div><div class="line"></div><div class="line"> ISceneNodeAnimator* anim = 0;</div><div class="line"></div><div class="line"> <span class="comment">// set flight line</span></div><div class="line"></div><div class="line"> anim = smgr->createFlyStraightAnimator(start, end, time);</div><div class="line"> node->addAnimator(anim);</div><div class="line"> anim->drop();</div><div class="line"></div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"bullet: %s on %.1f,%1.f,%1.f"</span>,</div><div class="line"> imp.when ? <span class="stringliteral">"hit"</span> : <span class="stringliteral">"nohit"</span>, end.X, end.Y, end.Z );</div><div class="line"> node->setName ( buf );</div><div class="line"></div><div class="line"></div><div class="line"> anim = smgr->createDeleteAnimator(time);</div><div class="line"> node->addAnimator(anim);</div><div class="line"> anim->drop();</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (imp.when)</div><div class="line"> {</div><div class="line"> <span class="comment">// create impact note</span></div><div class="line"> imp.when = Game->Device->getTimer()->getTime() +</div><div class="line"> (time + (s32) ( ( 1.f + Noiser::get() ) * 250.f ));</div><div class="line"> Impacts.push_back(imp);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// play sound</span></div><div class="line">}</div><div class="line"></div><div class="line"><span class="comment">// rendered when bullets hit something</span></div><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::createParticleImpacts( u32 now )</div><div class="line">{</div><div class="line"> ISceneManager* sm = Game->Device->getSceneManager();</div><div class="line"></div><div class="line"> <span class="keyword">struct </span>smokeLayer</div><div class="line"> {</div><div class="line"> <span class="keyword">const</span> c8 * texture;</div><div class="line"> f32 scale;</div><div class="line"> f32 minparticleSize;</div><div class="line"> f32 maxparticleSize;</div><div class="line"> f32 boxSize;</div><div class="line"> u32 minParticle;</div><div class="line"> u32 maxParticle;</div><div class="line"> u32 fadeout;</div><div class="line"> u32 lifetime;</div><div class="line"> };</div><div class="line"></div><div class="line"> smokeLayer smoke[] =</div><div class="line"> {</div><div class="line"> { <span class="stringliteral">"smoke2.jpg"</span>, 0.4f, 1.5f, 18.f, 20.f, 20, 50, 2000, 10000 },</div><div class="line"> { <span class="stringliteral">"smoke3.jpg"</span>, 0.2f, 1.2f, 15.f, 20.f, 10, 30, 1000, 12000 }</div><div class="line"> };</div><div class="line"></div><div class="line"></div><div class="line"> u32 i;</div><div class="line"> u32 g;</div><div class="line"> s32 factor = 1;</div><div class="line"> <span class="keywordflow">for</span> ( g = 0; g != 2; ++g )</div><div class="line"> {</div><div class="line"> smoke[g].minParticle *= factor;</div><div class="line"> smoke[g].maxParticle *= factor;</div><div class="line"> smoke[g].lifetime *= factor;</div><div class="line"> smoke[g].boxSize *= Noiser::get() * 0.5f;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> ( i=0; i < Impacts.size(); ++i)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> (now < Impacts[i].when)</div><div class="line"> <span class="keywordflow">continue</span>;</div><div class="line"></div><div class="line"> <span class="comment">// create smoke particle system</span></div><div class="line"> IParticleSystemSceneNode* pas = 0;</div><div class="line"></div><div class="line"> <span class="keywordflow">for</span> ( g = 0; g != 2; ++g )</div><div class="line"> {</div><div class="line"> pas = sm->addParticleSystemSceneNode(<span class="keyword">false</span>, BulletParent, -1, Impacts[i].pos);</div><div class="line"></div><div class="line"> snprintf_irr ( buf, 64, <span class="stringliteral">"bullet impact smoke at %.1f,%.1f,%1.f"</span>,</div><div class="line"> Impacts[i].pos.X,Impacts[i].pos.Y,Impacts[i].pos.Z);</div><div class="line"> pas->setName ( buf );</div><div class="line"></div><div class="line"> <span class="comment">// create a flat smoke</span></div><div class="line"> vector3df direction = Impacts[i].outVector;</div><div class="line"> direction *= smoke[g].scale;</div><div class="line"> IParticleEmitter* em = pas->createBoxEmitter(</div><div class="line"> aabbox3d<f32>(-4.f,0.f,-4.f,20.f,smoke[g].minparticleSize,20.f),</div><div class="line"> direction,smoke[g].minParticle, smoke[g].maxParticle,</div><div class="line"> video::SColor(0,0,0,0),video::SColor(0,128,128,128),</div><div class="line"> 250,4000, 60);</div><div class="line"></div><div class="line"> em->setMinStartSize (dimension2d<f32>( smoke[g].minparticleSize, smoke[g].minparticleSize));</div><div class="line"> em->setMaxStartSize (dimension2d<f32>( smoke[g].maxparticleSize, smoke[g].maxparticleSize));</div><div class="line"></div><div class="line"> pas->setEmitter(em);</div><div class="line"> em->drop();</div><div class="line"></div><div class="line"> <span class="comment">// particles get invisible</span></div><div class="line"> IParticleAffector* paf = pas->createFadeOutParticleAffector(</div><div class="line"> video::SColor ( 0, 0, 0, 0 ), smoke[g].fadeout);</div><div class="line"> pas->addAffector(paf);</div><div class="line"> paf->drop();</div><div class="line"></div><div class="line"> <span class="comment">// particle system life time</span></div><div class="line"> ISceneNodeAnimator* anim = sm->createDeleteAnimator( smoke[g].lifetime);</div><div class="line"> pas->addAnimator(anim);</div><div class="line"> anim->drop();</div><div class="line"></div><div class="line"> pas->setMaterialFlag(video::EMF_LIGHTING, <span class="keyword">false</span>);</div><div class="line"> pas->setMaterialFlag(video::EMF_ZWRITE_ENABLE, <span class="keyword">false</span>);</div><div class="line"> pas->setMaterialType(video::EMT_TRANSPARENT_ADD_COLOR );</div><div class="line"> pas->setMaterialTexture(0, Game->Device->getVideoDriver()->getTexture( smoke[g].texture ));</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">// play impact sound</span></div><div class="line"><span class="preprocessor"> #ifdef USE_IRRKLANG</span></div></div><!-- fragment --><p> if (irrKlang) { audio::ISound* sound = irrKlang->play3D(impactSound, Impacts[i].pos, false, false, true);</p>
|
|
<p>if (sound) { adjust max value a bit to make to sound of an impact louder sound->setMinDistance(400); sound->drop(); } } </p><div class="fragment"><div class="line"><span class="preprocessor"> #endif</span></div><div class="line"></div><div class="line"></div><div class="line"> <span class="comment">// delete entry</span></div><div class="line"> Impacts.erase(i);</div><div class="line"> i--;</div><div class="line"> }</div><div class="line">}</div></div><!-- fragment --><p> render </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::Render()</div><div class="line">{</div><div class="line"> IVideoDriver * driver = Game->Device->getVideoDriver();</div><div class="line"> <span class="keywordflow">if</span> ( 0 == driver )</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> <span class="comment">// TODO: This does not work, yet.</span></div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">bool</span> anaglyph=<span class="keyword">false</span>;</div><div class="line"> <span class="keywordflow">if</span> (anaglyph)</div><div class="line"> {</div><div class="line"> scene::ICameraSceneNode* cameraOld = Game->Device->getSceneManager()->getActiveCamera();</div><div class="line"> driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0,0,0,0));</div><div class="line"> driver->getOverrideMaterial().Material.ColorMask = ECP_NONE;</div><div class="line"> driver->getOverrideMaterial().EnableFlags = EMF_COLOR_MASK;</div><div class="line"> driver->getOverrideMaterial().EnablePasses = ESNRP_SKY_BOX +</div><div class="line"> ESNRP_SOLID +</div><div class="line"> ESNRP_TRANSPARENT +</div><div class="line"> ESNRP_TRANSPARENT_EFFECT +</div><div class="line"> ESNRP_SHADOW;</div><div class="line"> Game->Device->getSceneManager()->drawAll();</div><div class="line"> driver->clearBuffers(video::ECBF_DEPTH, video::SColor(255,0,0,0));</div><div class="line"></div><div class="line"> <span class="keyword">const</span> vector3df oldPosition = cameraOld->getPosition();</div><div class="line"> <span class="keyword">const</span> vector3df oldTarget = cameraOld->getTarget();</div><div class="line"> <span class="keyword">const</span> matrix4 startMatrix = cameraOld->getAbsoluteTransformation();</div><div class="line"> <span class="keyword">const</span> vector3df focusPoint = (oldTarget -</div><div class="line"> cameraOld->getAbsolutePosition()).setLength(10000) +</div><div class="line"> cameraOld->getAbsolutePosition() ;</div><div class="line"></div><div class="line"> scene::ICameraSceneNode* camera = cameraOld;<span class="comment">//Game->Device->getSceneManager()->addCameraSceneNode();</span></div><div class="line"></div><div class="line"> <span class="comment">//Left eye...</span></div><div class="line"> vector3df pos;</div><div class="line"> matrix4 move;</div><div class="line"></div><div class="line"> move.setTranslation( vector3df(-1.5f,0.0f,0.0f) );</div><div class="line"> pos=(startMatrix*move).getTranslation();</div><div class="line"></div><div class="line"> driver->getOverrideMaterial().Material.ColorMask = ECP_RED;</div><div class="line"> driver->getOverrideMaterial().EnableFlags = EMF_COLOR_MASK;</div><div class="line"> driver->getOverrideMaterial().EnablePasses =</div><div class="line"> ESNRP_SKY_BOX|ESNRP_SOLID|ESNRP_TRANSPARENT|</div><div class="line"> ESNRP_TRANSPARENT_EFFECT|ESNRP_SHADOW;</div><div class="line"></div><div class="line"> camera->setPosition(pos);</div><div class="line"> camera->setTarget(focusPoint);</div><div class="line"></div><div class="line"> Game->Device->getSceneManager()->drawAll();</div><div class="line"> driver->clearBuffers(video::ECBF_DEPTH, video::SColor(255, 0, 0, 0));</div><div class="line"></div><div class="line"> <span class="comment">//Right eye...</span></div><div class="line"> move.setTranslation( vector3df(1.5f,0.0f,0.0f) );</div><div class="line"> pos=(startMatrix*move).getTranslation();</div><div class="line"></div><div class="line"> driver->getOverrideMaterial().Material.ColorMask = ECP_GREEN + ECP_BLUE;</div><div class="line"> driver->getOverrideMaterial().EnableFlags = EMF_COLOR_MASK;</div><div class="line"> driver->getOverrideMaterial().EnablePasses =</div><div class="line"> ESNRP_SKY_BOX|ESNRP_SOLID|ESNRP_TRANSPARENT|</div><div class="line"> ESNRP_TRANSPARENT_EFFECT|ESNRP_SHADOW;</div><div class="line"></div><div class="line"> camera->setPosition(pos);</div><div class="line"> camera->setTarget(focusPoint);</div><div class="line"></div><div class="line"> Game->Device->getSceneManager()->drawAll();</div><div class="line"></div><div class="line"> driver->getOverrideMaterial().Material.ColorMask=ECP_ALL;</div><div class="line"> driver->getOverrideMaterial().EnableFlags=0;</div><div class="line"> driver->getOverrideMaterial().EnablePasses=0;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (camera != cameraOld)</div><div class="line"> {</div><div class="line"> Game->Device->getSceneManager()->setActiveCamera(cameraOld);</div><div class="line"> camera->remove();</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> camera->setPosition(oldPosition);</div><div class="line"> camera->setTarget(oldTarget);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> driver->beginScene(video::ECBF_COLOR | video::ECBF_DEPTH, SColor(0,0,0,0));</div><div class="line"> Game->Device->getSceneManager()->drawAll();</div><div class="line"> }</div><div class="line"> Game->Device->getGUIEnvironment()->drawAll();</div><div class="line"> driver->endScene();</div><div class="line">}</div></div><!-- fragment --><p> update the generic scene node </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> CQuake3EventHandler::Animate()</div><div class="line">{</div><div class="line"> u32 now = Game->Device->getTimer()->getTime();</div><div class="line"></div><div class="line"> Q3Player * player = Player + 0;</div><div class="line"></div><div class="line"> checkTimeFire ( player->Anim, 4, now );</div><div class="line"></div><div class="line"> <span class="comment">// Query Scene Manager attributes</span></div><div class="line"> <span class="keywordflow">if</span> ( player->Anim[0].flags & FIRED )</div><div class="line"> {</div><div class="line"> <span class="keywordtype">wchar_t</span> msg[128];</div><div class="line"> IVideoDriver * driver = Game->Device->getVideoDriver();</div><div class="line"></div><div class="line"><span class="preprocessor">#ifdef _IRR_SCENEMANAGER_DEBUG</span></div><div class="line"> IAttributes * attr = Game->Device->getSceneManager()->getParameters();</div><div class="line"> swprintf_irr ( msg, 128,</div><div class="line"> L<span class="stringliteral">"Q3 %s [%ls], FPS:%03d Tri:%.03fm Cull %d/%d nodes (%d,%d,%d)"</span>,</div><div class="line"> Game->CurrentMapName.c_str(),</div><div class="line"> driver->getName(),</div><div class="line"> driver->getFPS (),</div><div class="line"> (f32) driver->getPrimitiveCountDrawn( 0 ) * ( 1.f / 1000000.f ),</div><div class="line"> attr->getAttributeAsInt ( <span class="stringliteral">"culled"</span> ),</div><div class="line"> attr->getAttributeAsInt ( <span class="stringliteral">"calls"</span> ),</div><div class="line"> attr->getAttributeAsInt ( <span class="stringliteral">"drawn_solid"</span> ),</div><div class="line"> attr->getAttributeAsInt ( <span class="stringliteral">"drawn_transparent"</span> ),</div><div class="line"> attr->getAttributeAsInt ( <span class="stringliteral">"drawn_transparent_effect"</span> )</div><div class="line"> );</div><div class="line"><span class="preprocessor">#else</span></div><div class="line">swprintf_irr ( msg, 128,</div><div class="line"> L<span class="stringliteral">"Q3 %s [%ls], FPS:%03d Tri:%.03fm"</span>,</div><div class="line"> Game->CurrentMapName.c_str(),</div><div class="line"> driver->getName(),</div><div class="line"> driver->getFPS (),</div><div class="line"> (f32) driver->getPrimitiveCountDrawn( 0 ) * ( 1.f / 1000000.f )</div><div class="line"> );</div><div class="line"><span class="preprocessor">#endif</span></div><div class="line"> Game->Device->setWindowCaption( msg );</div><div class="line"></div><div class="line"> swprintf_irr ( msg, 128,</div><div class="line"> L<span class="stringliteral">"%03d fps, F1 GUI on/off, F2 respawn, F3-F6 toggle Nodes, F7 Collision on/off"</span></div><div class="line"> L<span class="stringliteral">", F8 Gravity on/off, Right Mouse Toggle GUI"</span>,</div><div class="line"> Game->Device->getVideoDriver()->getFPS ()</div><div class="line"> );</div><div class="line"> <span class="keywordflow">if</span> ( gui.StatusLine )</div><div class="line"> gui.StatusLine->setText ( msg );</div><div class="line"> player->Anim[0].flags &= ~FIRED;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// idle..</span></div><div class="line"> <span class="keywordflow">if</span> ( player->Anim[1].flags & FIRED )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( strcmp ( player->animation, <span class="stringliteral">"idle"</span> ) )</div><div class="line"> player->setAnim ( <span class="stringliteral">"idle"</span> );</div><div class="line"></div><div class="line"> player->Anim[1].flags &= ~FIRED;</div><div class="line"> }</div><div class="line"></div><div class="line"> createParticleImpacts ( now );</div><div class="line"></div><div class="line">}</div></div><!-- fragment --><p> The main game states </p><div class="fragment"><div class="line"><span class="keywordtype">void</span> runGame ( GameData *game )</div><div class="line">{</div><div class="line"> <span class="keywordflow">if</span> ( game->retVal >= 3 )</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> game->Device = (*game->createExDevice) ( game->deviceParam );</div><div class="line"> <span class="keywordflow">if</span> ( 0 == game->Device)</div><div class="line"> {</div><div class="line"> <span class="comment">// could not create selected driver.</span></div><div class="line"> game->retVal = 0;</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// create an event receiver based on current game data</span></div><div class="line"> CQuake3EventHandler *eventHandler = <span class="keyword">new</span> CQuake3EventHandler( game );</div><div class="line"></div><div class="line"> <span class="comment">// load stored config</span></div><div class="line"> game->load ( <span class="stringliteral">"explorer.cfg"</span> );</div><div class="line"></div><div class="line"> <span class="comment">// add our media directory and archive to the file system</span></div><div class="line"> <span class="keywordflow">for</span> ( u32 i = 0; i < game->CurrentArchiveList.size(); ++i )</div><div class="line"> {</div><div class="line"> eventHandler->AddArchive ( game->CurrentArchiveList[i] );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Load a Map or startup to the GUI</span></div><div class="line"> <span class="keywordflow">if</span> ( game->CurrentMapName.size () )</div><div class="line"> {</div><div class="line"> eventHandler->LoadMap ( game->CurrentMapName, 1 );</div><div class="line"> <span class="keywordflow">if</span> ( 0 == game->loadParam.loadSkyShader )</div><div class="line"> eventHandler->AddSky ( 1, <span class="stringliteral">"skydome2"</span> );</div><div class="line"> eventHandler->CreatePlayers ();</div><div class="line"> eventHandler->CreateGUI ();</div><div class="line"> eventHandler->SetGUIActive ( 0 );</div><div class="line"></div><div class="line"> <span class="comment">// set player to last position on restart</span></div><div class="line"> <span class="keywordflow">if</span> ( game->retVal == 2 )</div><div class="line"> {</div><div class="line"> eventHandler->GetPlayer( 0 )->setpos ( game->PlayerPosition, game->PlayerRotation );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> <span class="comment">// start up empty</span></div><div class="line"> eventHandler->AddSky ( 1, <span class="stringliteral">"skydome2"</span> );</div><div class="line"> eventHandler->CreatePlayers ();</div><div class="line"> eventHandler->CreateGUI ();</div><div class="line"> eventHandler->SetGUIActive ( 1 );</div><div class="line"> background_music ( <span class="stringliteral">"IrrlichtTheme.ogg"</span> );</div><div class="line"> }</div><div class="line"></div><div class="line"></div><div class="line"> game->retVal = 3;</div><div class="line"> <span class="keywordflow">while</span>( game->Device->run() )</div><div class="line"> {</div><div class="line"> eventHandler->Animate ();</div><div class="line"> eventHandler->Render ();</div><div class="line"> <span class="comment">//if ( !game->Device->isWindowActive() )</span></div><div class="line"> game->Device->yield();</div><div class="line"> }</div><div class="line"></div><div class="line"> game->Device->setGammaRamp ( 1.f, 1.f, 1.f, 0.f, 0.f );</div><div class="line"> <span class="keyword">delete</span> eventHandler;</div><div class="line">}</div><div class="line"></div><div class="line"><span class="preprocessor">#if defined (_IRR_WINDOWS_) && 0</span></div><div class="line"><span class="preprocessor"> #pragma comment(linker, "/subsystem:windows /ENTRY:mainCRTStartup")</span></div><div class="line"><span class="preprocessor">#endif</span></div></div><!-- fragment --><p> The main routine, doing all setup </p><div class="fragment"><div class="line"><span class="keywordtype">int</span> IRRCALLCONV main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span>* argv[])</div><div class="line">{</div><div class="line"> path prgname(argv[0]);</div><div class="line"> GameData game ( deletePathFromPath ( prgname, 1 ) );</div><div class="line"></div><div class="line"> <span class="comment">// dynamically load irrlicht</span></div><div class="line"> <span class="keyword">const</span> c8 * dllName = argc > 1 ? argv[1] : <span class="stringliteral">"irrlicht.dll"</span>;</div><div class="line"> game.createExDevice = load_createDeviceEx ( dllName );</div><div class="line"> <span class="keywordflow">if</span> ( 0 == game.createExDevice )</div><div class="line"> {</div><div class="line"> game.retVal = 3;</div><div class="line"> printf ( <span class="stringliteral">"Could not load %s.\n"</span>, dllName );</div><div class="line"> <span class="keywordflow">return</span> game.retVal; <span class="comment">// could not load dll</span></div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// start without asking for driver</span></div><div class="line"> game.retVal = 1;</div><div class="line"> <span class="keywordflow">do</span></div><div class="line"> {</div><div class="line"> <span class="comment">// if driver could not created, ask for another driver</span></div><div class="line"> <span class="keywordflow">if</span> ( game.retVal == 0 )</div><div class="line"> {</div><div class="line"> game.setDefault ();</div><div class="line"> <span class="comment">// ask user for driver</span></div><div class="line"> game.deviceParam.DriverType=driverChoiceConsole();</div><div class="line"> <span class="keywordflow">if</span> (game.deviceParam.DriverType==video::EDT_COUNT)</div><div class="line"> game.retVal = 3;</div><div class="line"> }</div><div class="line"> runGame ( &game );</div><div class="line"> } <span class="keywordflow">while</span> ( game.retVal < 3 );</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> game.retVal;</div><div class="line">}</div></div><!-- fragment --> </div></div><!-- contents -->
|
|
<!-- HTML footer for doxygen 1.8.13-->
|
|
<!-- start footer part -->
|
|
<p> </p>
|
|
</body>
|
|
</html>
|