1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
|
<!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 22: Material Viewer</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 22: Material Viewer </div> </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><div class="image">
<img src="../../media/022shot.jpg" alt="022shot.jpg"/>
</div>
<p>This example can be used to play around with material settings and watch the results. Only the default non-shader materials are used in here.</p>
<p>You have two nodes to make it easier to see which difference your settings will make. Additionally you have one lightscenenode and you can set the global ambient values. </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"></div><div class="line"><span class="keyword">using namespace </span>irr;</div><div class="line"></div><div class="line"><span class="preprocessor">#ifdef _MSC_VER</span></div><div class="line"><span class="preprocessor">#pragma comment(lib, "Irrlicht.lib")</span></div><div class="line"><span class="preprocessor">#endif</span></div></div><!-- fragment --><p> Variables within the empty namespace are globals which are restricted to this file. </p><div class="fragment"><div class="line"><span class="keyword">namespace</span></div><div class="line">{</div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">wchar_t</span>* <span class="keyword">const</span> DriverTypeNames[] =</div><div class="line"> {</div><div class="line"> L<span class="stringliteral">"NULL"</span>,</div><div class="line"> L<span class="stringliteral">"SOFTWARE"</span>,</div><div class="line"> L<span class="stringliteral">"BURNINGSVIDEO"</span>,</div><div class="line"> L<span class="stringliteral">"DIRECT3D8"</span>,</div><div class="line"> L<span class="stringliteral">"DIRECT3D9"</span>,</div><div class="line"> L<span class="stringliteral">"OPENGL"</span>,</div><div class="line"> 0,</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// For the gui id's</span></div><div class="line"> <span class="keyword">enum</span> EGUI_IDS</div><div class="line"> {</div><div class="line"> GUI_ID_OPEN_TEXTURE = 1,</div><div class="line"> GUI_ID_QUIT,</div><div class="line"> GUI_ID_MAX</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// Name used in texture selection to clear the textures on the node</span></div><div class="line"> <span class="keyword">const</span> core::stringw CLEAR_TEXTURE = L<span class="stringliteral">"CLEAR texture"</span>;</div><div class="line"></div><div class="line"> <span class="comment">// some useful color constants</span></div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_BLACK = video::SColor(255, 0, 0, 0);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_BLUE = video::SColor(255, 0, 0, 255);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_CYAN = video::SColor(255, 0, 255, 255);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_GRAY = video::SColor(255, 128,128, 128);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_GREEN = video::SColor(255, 0, 255, 0);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_MAGENTA = video::SColor(255, 255, 0, 255);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_RED = video::SColor(255, 255, 0, 0);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_YELLOW = video::SColor(255, 255, 255, 0);</div><div class="line"> <span class="keyword">const</span> video::SColor SCOL_WHITE = video::SColor(255, 255, 255, 255);</div><div class="line">}; <span class="comment">// namespace</span></div></div><!-- fragment --><p> Returns a new unique number on each call. </p><div class="fragment"><div class="line">s32 makeUniqueId()</div><div class="line">{</div><div class="line"> <span class="keyword">static</span> <span class="keywordtype">int</span> unique = GUI_ID_MAX;</div><div class="line"> ++unique;</div><div class="line"> <span class="keywordflow">return</span> unique;</div><div class="line">}</div></div><!-- fragment --><p> Find out which vertex-type is needed for the given material type. </p><div class="fragment"><div class="line">video::E_VERTEX_TYPE getVertexTypeForMaterialType(video::E_MATERIAL_TYPE materialType)</div><div class="line">{</div><div class="line"> <span class="keyword">using namespace </span>video;</div><div class="line"></div><div class="line"> <span class="keywordflow">switch</span> ( materialType )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> EMT_SOLID:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_SOLID_2_LAYER:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_LIGHTMAP:</div><div class="line"> <span class="keywordflow">case</span> EMT_LIGHTMAP_ADD:</div><div class="line"> <span class="keywordflow">case</span> EMT_LIGHTMAP_M2:</div><div class="line"> <span class="keywordflow">case</span> EMT_LIGHTMAP_M4:</div><div class="line"> <span class="keywordflow">case</span> EMT_LIGHTMAP_LIGHTING:</div><div class="line"> <span class="keywordflow">case</span> EMT_LIGHTMAP_LIGHTING_M2:</div><div class="line"> <span class="keywordflow">case</span> EMT_LIGHTMAP_LIGHTING_M4:</div><div class="line"> <span class="keywordflow">return</span> EVT_2TCOORDS;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_DETAIL_MAP:</div><div class="line"> <span class="keywordflow">return</span> EVT_2TCOORDS;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_SPHERE_MAP:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_REFLECTION_2_LAYER:</div><div class="line"> <span class="keywordflow">return</span> EVT_2TCOORDS;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_TRANSPARENT_ADD_COLOR:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_TRANSPARENT_ALPHA_CHANNEL:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_TRANSPARENT_ALPHA_CHANNEL_REF:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_TRANSPARENT_VERTEX_ALPHA:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_TRANSPARENT_REFLECTION_2_LAYER:</div><div class="line"> <span class="keywordflow">return</span> EVT_2TCOORDS;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_NORMAL_MAP_SOLID:</div><div class="line"> <span class="keywordflow">case</span> EMT_NORMAL_MAP_TRANSPARENT_ADD_COLOR:</div><div class="line"> <span class="keywordflow">case</span> EMT_NORMAL_MAP_TRANSPARENT_VERTEX_ALPHA:</div><div class="line"> <span class="keywordflow">case</span> EMT_PARALLAX_MAP_SOLID:</div><div class="line"> <span class="keywordflow">case</span> EMT_PARALLAX_MAP_TRANSPARENT_ADD_COLOR:</div><div class="line"> <span class="keywordflow">case</span> EMT_PARALLAX_MAP_TRANSPARENT_VERTEX_ALPHA:</div><div class="line"> <span class="keywordflow">return</span> EVT_TANGENTS;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_ONETEXTURE_BLEND:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> EMT_FORCE_32BIT:</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line"> }</div><div class="line"> <span class="keywordflow">return</span> EVT_STANDARD;</div><div class="line">}</div></div><!-- fragment --><p> Custom GUI-control to edit colorvalues. </p><div class="fragment"><div class="line"><span class="keyword">class </span>CColorControl : <span class="keyword">public</span> gui::IGUIElement</div><div class="line">{</div><div class="line"><span class="keyword">public</span>:</div><div class="line"> <span class="comment">// Constructor</span></div><div class="line"> CColorControl(gui::IGUIEnvironment* guiEnv, <span class="keyword">const</span> core::position2d<s32> & pos, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> *text, IGUIElement* parent, s32 <span class="keywordtype">id</span>=-1 )</div><div class="line"> : gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect< s32 >(pos, pos+core::dimension2d<s32>(80, 75)))</div><div class="line"> , DirtyFlag(true)</div><div class="line"> , ColorStatic(0)</div><div class="line"> , EditAlpha(0)</div><div class="line"> , EditRed(0)</div><div class="line"> , EditGreen(0)</div><div class="line"> , EditBlue(0)</div><div class="line"> {</div><div class="line"> <span class="keyword">using namespace </span>gui;</div><div class="line"> ButtonSetId = makeUniqueId();</div><div class="line"></div><div class="line"> <span class="keyword">const</span> core::rect< s32 > rectControls(0,0,AbsoluteRect.getWidth(),AbsoluteRect.getHeight() );</div><div class="line"> IGUIStaticText * groupElement = guiEnv->addStaticText (L<span class="stringliteral">""</span>, rectControls, <span class="keyword">true</span>, <span class="keyword">false</span>, <span class="keyword">this</span>, -1, <span class="keyword">false</span>);</div><div class="line"> groupElement->setNotClipped(<span class="keyword">true</span>);</div><div class="line"></div><div class="line"> guiEnv->addStaticText (text, core::rect<s32>(0,0,80,15), <span class="keyword">false</span>, <span class="keyword">false</span>, groupElement, -1, <span class="keyword">false</span>);</div><div class="line"></div><div class="line"> EditAlpha = addEditForNumbers(guiEnv, core::position2d<s32>(0,15), L<span class="stringliteral">"a"</span>, -1, groupElement );</div><div class="line"> EditRed = addEditForNumbers(guiEnv, core::position2d<s32>(0,30), L<span class="stringliteral">"r"</span>, -1, groupElement );</div><div class="line"> EditGreen = addEditForNumbers(guiEnv, core::position2d<s32>(0,45), L<span class="stringliteral">"g"</span>, -1, groupElement );</div><div class="line"> EditBlue = addEditForNumbers(guiEnv, core::position2d<s32>(0,60), L<span class="stringliteral">"b"</span>, -1, groupElement );</div><div class="line"></div><div class="line"> ColorStatic = guiEnv->addStaticText (L<span class="stringliteral">""</span>, core::rect<s32>(60,15,80,75), <span class="keyword">true</span>, <span class="keyword">false</span>, groupElement, -1, <span class="keyword">true</span>);</div><div class="line"></div><div class="line"> guiEnv->addButton (core::rect<s32>(60,35,80,50), groupElement, ButtonSetId, L<span class="stringliteral">"set"</span>);</div><div class="line"> SetEditsFromColor(Color);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// event receiver</span></div><div class="line"> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> OnEvent(<span class="keyword">const</span> SEvent &event)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( event.EventType != EET_GUI_EVENT )</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( event.GUIEvent.Caller->getID() == ButtonSetId && <span class="keyword">event</span>.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED )</div><div class="line"> {</div><div class="line"> Color = GetColorFromEdits();</div><div class="line"> SetEditsFromColor(Color);</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">// set the color values</span></div><div class="line"> <span class="keywordtype">void</span> setColor(<span class="keyword">const</span> video::SColor& col)</div><div class="line"> {</div><div class="line"> DirtyFlag = <span class="keyword">true</span>;</div><div class="line"> Color = col;</div><div class="line"> SetEditsFromColor(Color);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// get the color values</span></div><div class="line"> <span class="keyword">const</span> video::SColor& getColor()<span class="keyword"> const</span></div><div class="line"><span class="keyword"> </span>{</div><div class="line"> <span class="keywordflow">return</span> Color;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// To reset the dirty flag</span></div><div class="line"> <span class="keywordtype">void</span> resetDirty()</div><div class="line"> {</div><div class="line"> DirtyFlag = <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// when the color was changed the dirty flag is set</span></div><div class="line"> <span class="keywordtype">bool</span> isDirty()<span class="keyword"> const</span></div><div class="line"><span class="keyword"> </span>{</div><div class="line"> <span class="keywordflow">return</span> DirtyFlag;</div><div class="line"> };</div><div class="line"></div><div class="line"><span class="keyword">protected</span>:</div><div class="line"></div><div class="line"> <span class="comment">// Add a staticbox for a description + an editbox so users can enter numbers</span></div><div class="line"> gui::IGUIEditBox* addEditForNumbers(gui::IGUIEnvironment* guiEnv, <span class="keyword">const</span> core::position2d<s32> & pos, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> *text, s32 <span class="keywordtype">id</span>, gui::IGUIElement * parent)</div><div class="line"> {</div><div class="line"> <span class="keyword">using namespace </span>gui;</div><div class="line"></div><div class="line"> core::rect< s32 > rect(pos, pos+core::dimension2d<s32>(10, 15));</div><div class="line"> guiEnv->addStaticText (text, rect, <span class="keyword">false</span>, <span class="keyword">false</span>, parent, -1, <span class="keyword">false</span>);</div><div class="line"> rect += core::position2d<s32>( 20, 0 );</div><div class="line"> rect.LowerRightCorner.X += 20;</div><div class="line"> gui::IGUIEditBox* edit = guiEnv->addEditBox(L<span class="stringliteral">"0"</span>, rect, <span class="keyword">true</span>, parent, <span class="keywordtype">id</span>);</div><div class="line"> <span class="keywordflow">return</span> edit;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Get the color value from the editfields</span></div><div class="line"> video::SColor GetColorFromEdits()</div><div class="line"> {</div><div class="line"> video::SColor col;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (EditAlpha)</div><div class="line"> {</div><div class="line"> u32 alpha = core::strtoul10(core::stringc(EditAlpha->getText()).c_str());</div><div class="line"> <span class="keywordflow">if</span> (alpha > 255)</div><div class="line"> alpha = 255;</div><div class="line"> col.setAlpha(alpha);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (EditRed)</div><div class="line"> {</div><div class="line"> u32 red = core::strtoul10(core::stringc(EditRed->getText()).c_str());</div><div class="line"> <span class="keywordflow">if</span> (red > 255)</div><div class="line"> red = 255;</div><div class="line"> col.setRed(red);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (EditGreen)</div><div class="line"> {</div><div class="line"> u32 green = core::strtoul10(core::stringc(EditGreen->getText()).c_str());</div><div class="line"> <span class="keywordflow">if</span> (green > 255)</div><div class="line"> green = 255;</div><div class="line"> col.setGreen(green);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> (EditBlue)</div><div class="line"> {</div><div class="line"> u32 blue = core::strtoul10(core::stringc(EditBlue->getText()).c_str());</div><div class="line"> <span class="keywordflow">if</span> (blue > 255)</div><div class="line"> blue = 255;</div><div class="line"> col.setBlue(blue);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> col;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Fill the editfields with the value for the given color</span></div><div class="line"> <span class="keywordtype">void</span> SetEditsFromColor(video::SColor col)</div><div class="line"> {</div><div class="line"> DirtyFlag = <span class="keyword">true</span>;</div><div class="line"> <span class="keywordflow">if</span> ( EditAlpha )</div><div class="line"> EditAlpha->setText( core::stringw(col.getAlpha()).c_str() );</div><div class="line"> <span class="keywordflow">if</span> ( EditRed )</div><div class="line"> EditRed->setText( core::stringw(col.getRed()).c_str() );</div><div class="line"> <span class="keywordflow">if</span> ( EditGreen )</div><div class="line"> EditGreen->setText( core::stringw(col.getGreen()).c_str() );</div><div class="line"> <span class="keywordflow">if</span> ( EditBlue )</div><div class="line"> EditBlue->setText( core::stringw(col.getBlue()).c_str() );</div><div class="line"> <span class="keywordflow">if</span> ( ColorStatic )</div><div class="line"> ColorStatic->setBackgroundColor(col);</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"> <span class="keywordtype">bool</span> DirtyFlag;</div><div class="line"> video::SColor Color;</div><div class="line"> s32 ButtonSetId;</div><div class="line"> gui::IGUIStaticText * ColorStatic;</div><div class="line"> gui::IGUIEditBox * EditAlpha;</div><div class="line"> gui::IGUIEditBox * EditRed;</div><div class="line"> gui::IGUIEditBox * EditGreen;</div><div class="line"> gui::IGUIEditBox * EditBlue;</div><div class="line">};</div></div><!-- fragment --><p> Custom GUI-control for to edit all colors typically used in materials and lights </p><div class="fragment"><div class="line"><span class="keyword">class </span>CAllColorsControl : <span class="keyword">public</span> gui::IGUIElement</div><div class="line">{</div><div class="line"><span class="keyword">public</span>:</div><div class="line"> <span class="comment">// Constructor</span></div><div class="line"> CAllColorsControl(gui::IGUIEnvironment* guiEnv, <span class="keyword">const</span> core::position2d<s32> & pos, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> * description, <span class="keywordtype">bool</span> hasEmissive, IGUIElement* parent, s32 <span class="keywordtype">id</span>=-1)</div><div class="line"> : gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect<s32>(pos,pos+core::dimension2d<s32>(60,250)))</div><div class="line"> , ControlAmbientColor(0), ControlDiffuseColor(0), ControlSpecularColor(0), ControlEmissiveColor(0)</div><div class="line"> {</div><div class="line"> core::rect<s32> rect(0, 0, 60, 15);</div><div class="line"> guiEnv->addStaticText (description, rect, <span class="keyword">false</span>, <span class="keyword">false</span>, <span class="keyword">this</span>, -1, <span class="keyword">false</span>);</div><div class="line"> createColorControls(guiEnv, core::position2d<s32>(0, 15), hasEmissive);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Destructor</span></div><div class="line"> <span class="keyword">virtual</span> ~CAllColorsControl()</div><div class="line"> {</div><div class="line"> ControlAmbientColor->drop();</div><div class="line"> ControlDiffuseColor->drop();</div><div class="line"> <span class="keywordflow">if</span> ( ControlEmissiveColor )</div><div class="line"> ControlEmissiveColor->drop();</div><div class="line"> ControlSpecularColor->drop();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Set the color values to those within the material</span></div><div class="line"> <span class="keywordtype">void</span> setColorsToMaterialColors(<span class="keyword">const</span> video::SMaterial & material)</div><div class="line"> {</div><div class="line"> ControlAmbientColor->setColor(material.AmbientColor);</div><div class="line"> ControlDiffuseColor->setColor(material.DiffuseColor);</div><div class="line"> ControlEmissiveColor->setColor(material.EmissiveColor);</div><div class="line"> ControlSpecularColor->setColor(material.SpecularColor);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Update all changed colors in the material</span></div><div class="line"> <span class="keywordtype">void</span> updateMaterialColors(video::SMaterial & material)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( ControlAmbientColor->isDirty() )</div><div class="line"> material.AmbientColor = ControlAmbientColor->getColor();</div><div class="line"> <span class="keywordflow">if</span> ( ControlDiffuseColor->isDirty() )</div><div class="line"> material.DiffuseColor = ControlDiffuseColor->getColor();</div><div class="line"> <span class="keywordflow">if</span> ( ControlEmissiveColor->isDirty() )</div><div class="line"> material.EmissiveColor = ControlEmissiveColor->getColor();</div><div class="line"> <span class="keywordflow">if</span> ( ControlSpecularColor->isDirty() )</div><div class="line"> material.SpecularColor = ControlSpecularColor->getColor();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Set the color values to those from the light data</span></div><div class="line"> <span class="keywordtype">void</span> setColorsToLightDataColors(<span class="keyword">const</span> video::SLight & lightData)</div><div class="line"> {</div><div class="line"> ControlAmbientColor->setColor(lightData.AmbientColor.toSColor());</div><div class="line"> ControlAmbientColor->setColor(lightData.DiffuseColor.toSColor());</div><div class="line"> ControlAmbientColor->setColor(lightData.SpecularColor.toSColor());</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Update all changed colors in the light data</span></div><div class="line"> <span class="keywordtype">void</span> updateLightColors(video::SLight & lightData)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( ControlAmbientColor->isDirty() )</div><div class="line"> lightData.AmbientColor = video::SColorf( ControlAmbientColor->getColor() );</div><div class="line"> <span class="keywordflow">if</span> ( ControlDiffuseColor->isDirty() )</div><div class="line"> lightData.DiffuseColor = video::SColorf( ControlDiffuseColor->getColor() );</div><div class="line"> <span class="keywordflow">if</span> ( ControlSpecularColor->isDirty() )</div><div class="line"> lightData.SpecularColor = video::SColorf(ControlSpecularColor->getColor() );</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// To reset the dirty flags</span></div><div class="line"> <span class="keywordtype">void</span> resetDirty()</div><div class="line"> {</div><div class="line"> ControlAmbientColor->resetDirty();</div><div class="line"> ControlDiffuseColor->resetDirty();</div><div class="line"> ControlSpecularColor->resetDirty();</div><div class="line"> <span class="keywordflow">if</span> ( ControlEmissiveColor )</div><div class="line"> ControlEmissiveColor->resetDirty();</div><div class="line"> }</div><div class="line"></div><div class="line"><span class="keyword">protected</span>:</div><div class="line"> <span class="keywordtype">void</span> createColorControls(gui::IGUIEnvironment* guiEnv, <span class="keyword">const</span> core::position2d<s32> & pos, <span class="keywordtype">bool</span> hasEmissive)</div><div class="line"> {</div><div class="line"> ControlAmbientColor = <span class="keyword">new</span> CColorControl( guiEnv, pos, L<span class="stringliteral">"ambient"</span>, <span class="keyword">this</span>);</div><div class="line"> ControlDiffuseColor = <span class="keyword">new</span> CColorControl( guiEnv, pos + core::position2d<s32>(0, 75), L<span class="stringliteral">"diffuse"</span>, <span class="keyword">this</span> );</div><div class="line"> ControlSpecularColor = <span class="keyword">new</span> CColorControl( guiEnv, pos + core::position2d<s32>(0, 150), L<span class="stringliteral">"specular"</span>, <span class="keyword">this</span> );</div><div class="line"> <span class="keywordflow">if</span> ( hasEmissive )</div><div class="line"> {</div><div class="line"> ControlEmissiveColor = <span class="keyword">new</span> CColorControl( guiEnv, pos + core::position2d<s32>(0, 225), L<span class="stringliteral">"emissive"</span>, <span class="keyword">this</span> );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"><span class="keyword">private</span>:</div><div class="line"> CColorControl* ControlAmbientColor;</div><div class="line"> CColorControl* ControlDiffuseColor;</div><div class="line"> CColorControl* ControlSpecularColor;</div><div class="line"> CColorControl* ControlEmissiveColor;</div><div class="line">};</div></div><!-- fragment --><p> GUI-Control to offer a selection of available textures. </p><div class="fragment"><div class="line"><span class="keyword">class </span>CTextureControl : <span class="keyword">public</span> gui::IGUIElement</div><div class="line">{</div><div class="line"><span class="keyword">public</span>:</div><div class="line"> CTextureControl(gui::IGUIEnvironment* guiEnv, video::IVideoDriver * driver, <span class="keyword">const</span> core::position2d<s32> & pos, IGUIElement* parent, s32 <span class="keywordtype">id</span>=-1)</div><div class="line"> : gui::IGUIElement(gui::EGUIET_ELEMENT, guiEnv, parent,id, core::rect<s32>(pos,pos+core::dimension2d<s32>(100,15)))</div><div class="line"> , DirtyFlag(true), ComboTexture(0)</div><div class="line"> {</div><div class="line"> core::rect<s32> rectCombo(0, 0, AbsoluteRect.getWidth(),AbsoluteRect.getHeight());</div><div class="line"> ComboTexture = guiEnv->addComboBox (rectCombo, <span class="keyword">this</span>);</div><div class="line"> updateTextures(driver);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> OnEvent(<span class="keyword">const</span> SEvent &event)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( event.EventType != EET_GUI_EVENT )</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( event.GUIEvent.Caller == ComboTexture && event.GUIEvent.EventType == gui::EGET_COMBO_BOX_CHANGED )</div><div class="line"> {</div><div class="line"> DirtyFlag = <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 class="line"></div><div class="line"> <span class="comment">// Workaround for a problem with comboboxes.</span></div><div class="line"> <span class="comment">// We have to get in front when the combobox wants to get in front or combobox-list might be drawn below other elements.</span></div><div class="line"> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> bringToFront(IGUIElement* element)</div><div class="line"> {</div><div class="line"> <span class="keywordtype">bool</span> result = gui::IGUIElement::bringToFront(element);</div><div class="line"> <span class="keywordflow">if</span> ( Parent && element == ComboTexture )</div><div class="line"> result &= Parent->bringToFront(<span class="keyword">this</span>);</div><div class="line"> <span class="keywordflow">return</span> result;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// return selected texturename (if any, otherwise 0)</span></div><div class="line"> <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> * getSelectedTextureName()<span class="keyword"> const</span></div><div class="line"><span class="keyword"> </span>{</div><div class="line"> s32 selected = ComboTexture->getSelected();</div><div class="line"> <span class="keywordflow">if</span> ( selected < 0 )</div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line"> <span class="keywordflow">return</span> ComboTexture->getItem(selected);</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// reset the dirty flag</span></div><div class="line"> <span class="keywordtype">void</span> resetDirty()</div><div class="line"> {</div><div class="line"> DirtyFlag = <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// when the texture was changed the dirty flag is set</span></div><div class="line"> <span class="keywordtype">bool</span> isDirty()<span class="keyword"> const</span></div><div class="line"><span class="keyword"> </span>{</div><div class="line"> <span class="keywordflow">return</span> DirtyFlag;</div><div class="line"> };</div><div class="line"></div><div class="line"> <span class="comment">// Put the names of all currently loaded textures in a combobox</span></div><div class="line"> <span class="keywordtype">void</span> updateTextures(video::IVideoDriver * driver)</div><div class="line"> {</div><div class="line"> s32 oldSelected = ComboTexture->getSelected();</div><div class="line"> s32 selectNew = -1;</div><div class="line"> core::stringw oldTextureName;</div><div class="line"> <span class="keywordflow">if</span> ( oldSelected >= 0 )</div><div class="line"> {</div><div class="line"> oldTextureName = ComboTexture->getItem(oldSelected);</div><div class="line"> }</div><div class="line"> ComboTexture->clear();</div><div class="line"> <span class="keywordflow">for</span> ( u32 i=0; i < driver->getTextureCount(); ++i )</div><div class="line"> {</div><div class="line"> video::ITexture * texture = driver->getTextureByIndex(i);</div><div class="line"> core::stringw name( texture->getName() );</div><div class="line"> ComboTexture->addItem( name.c_str() );</div><div class="line"> <span class="keywordflow">if</span> ( !oldTextureName.empty() && selectNew < 0 && name == oldTextureName )</div><div class="line"> selectNew = i;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// add another name which can be used to clear the texture</span></div><div class="line"> ComboTexture->addItem( CLEAR_TEXTURE.c_str() );</div><div class="line"> <span class="keywordflow">if</span> ( CLEAR_TEXTURE == oldTextureName )</div><div class="line"> selectNew = ComboTexture->getItemCount()-1;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( selectNew >= 0 )</div><div class="line"> ComboTexture->setSelected(selectNew);</div><div class="line"></div><div class="line"> DirtyFlag = <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"><span class="keyword">private</span>:</div><div class="line"> <span class="keywordtype">bool</span> DirtyFlag;</div><div class="line"> gui::IGUIComboBox * ComboTexture;</div><div class="line">};</div></div><!-- fragment --><p> Control which allows setting some of the material values for a meshscenenode </p><div class="fragment"><div class="line"><span class="keyword">struct </span>SMeshNodeControl</div><div class="line">{</div><div class="line"> <span class="comment">// constructor</span></div><div class="line"> SMeshNodeControl()</div><div class="line"> : Initialized(false), Driver(0), MeshManipulator(0), SceneNode(0), SceneNode2T(0), SceneNodeTangents(0)</div><div class="line"> , AllColorsControl(0), ButtonLighting(0), InfoLighting(0), ComboMaterial(0), TextureControl1(0), TextureControl2(0), ControlVertexColors(0)</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"> <span class="keyword">virtual</span> ~SMeshNodeControl()</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( TextureControl1 )</div><div class="line"> TextureControl1->drop();</div><div class="line"> <span class="keywordflow">if</span> ( TextureControl2 )</div><div class="line"> TextureControl2->drop();</div><div class="line"> <span class="keywordflow">if</span> ( ControlVertexColors )</div><div class="line"> ControlVertexColors->drop();</div><div class="line"> <span class="keywordflow">if</span> ( AllColorsControl )</div><div class="line"> AllColorsControl->drop();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> init(scene::IMeshSceneNode* node, IrrlichtDevice * device, <span class="keyword">const</span> core::position2d<s32> & pos, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> * description)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( Initialized || !node || !device) <span class="comment">// initializing twice or with invalid data not allowed</span></div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> Driver = device->getVideoDriver ();</div><div class="line"> gui::IGUIEnvironment* guiEnv = device->getGUIEnvironment();</div><div class="line"> scene::ISceneManager* smgr = device->getSceneManager();</div><div class="line"> MeshManipulator = smgr->getMeshManipulator();</div><div class="line"></div><div class="line"> SceneNode = node;</div><div class="line"> scene::IMeshManipulator * meshManip = smgr->getMeshManipulator();</div><div class="line"></div><div class="line"> scene::IMesh * mesh2T = meshManip->createMeshWith2TCoords(node->getMesh());</div><div class="line"> SceneNode2T = smgr->addMeshSceneNode(mesh2T, 0, -1, SceneNode->getPosition(), SceneNode->getRotation(), SceneNode->getScale() );</div><div class="line"> mesh2T->drop();</div><div class="line"></div><div class="line"> scene::IMesh * meshTangents = meshManip->createMeshWithTangents(node->getMesh(), <span class="keyword">false</span>, <span class="keyword">false</span>, <span class="keyword">false</span>);</div><div class="line"> SceneNodeTangents = smgr->addMeshSceneNode(meshTangents, 0, -1</div><div class="line"> , SceneNode->getPosition(), SceneNode->getRotation(), SceneNode->getScale() );</div><div class="line"> meshTangents->drop();</div><div class="line"></div><div class="line"> video::SMaterial & material = SceneNode->getMaterial(0);</div><div class="line"> material.Lighting = <span class="keyword">true</span>;</div><div class="line"> AllColorsControl = <span class="keyword">new</span> CAllColorsControl(guiEnv, pos, description, <span class="keyword">true</span>, guiEnv->getRootGUIElement());</div><div class="line"> AllColorsControl->setColorsToMaterialColors(material);</div><div class="line"></div><div class="line"> core::rect<s32> rectBtn(pos + core::position2d<s32>(0, 320), core::dimension2d<s32>(60, 15));</div><div class="line"> ButtonLighting = guiEnv->addButton (rectBtn, 0, -1, L<span class="stringliteral">"Lighting"</span>);</div><div class="line"> ButtonLighting->setIsPushButton(<span class="keyword">true</span>);</div><div class="line"> ButtonLighting->setPressed(material.Lighting);</div><div class="line"> core::rect<s32> rectInfo( rectBtn.LowerRightCorner.X, rectBtn.UpperLeftCorner.Y, rectBtn.LowerRightCorner.X+40, rectBtn.UpperLeftCorner.Y+15 );</div><div class="line"> InfoLighting = guiEnv->addStaticText(L<span class="stringliteral">""</span>, rectInfo, <span class="keyword">true</span>, <span class="keyword">false</span> );</div><div class="line"> InfoLighting->setTextAlignment(gui::EGUIA_CENTER, gui::EGUIA_CENTER );</div><div class="line"></div><div class="line"> core::rect<s32> rectCombo(pos.X, rectBtn.LowerRightCorner.Y, pos.X+100, rectBtn.LowerRightCorner.Y+15);</div><div class="line"> ComboMaterial = guiEnv->addComboBox (rectCombo);</div><div class="line"> <span class="keywordflow">for</span> ( <span class="keywordtype">int</span> i=0; i <= (int)video::EMT_ONETEXTURE_BLEND; ++i )</div><div class="line"> {</div><div class="line"> ComboMaterial->addItem( core::stringw(video::sBuiltInMaterialTypeNames[i]).c_str() );</div><div class="line"> }</div><div class="line"> ComboMaterial->setSelected( (s32)material.MaterialType );</div><div class="line"></div><div class="line"> core::position2d<s32> posTex(rectCombo.UpperLeftCorner.X,rectCombo.LowerRightCorner.Y);</div><div class="line"> TextureControl1 = <span class="keyword">new</span> CTextureControl(guiEnv, Driver, posTex, guiEnv->getRootGUIElement());</div><div class="line"> posTex.Y += 15;</div><div class="line"> TextureControl2 = <span class="keyword">new</span> CTextureControl(guiEnv, Driver, posTex, guiEnv->getRootGUIElement());</div><div class="line"></div><div class="line"> core::position2d<s32> posVertexColors( posTex.X, posTex.Y + 15);</div><div class="line"> ControlVertexColors = <span class="keyword">new</span> CColorControl( guiEnv, posVertexColors, L<span class="stringliteral">"Vertex colors"</span>, guiEnv->getRootGUIElement());</div><div class="line"></div><div class="line"> video::S3DVertex * vertices = (video::S3DVertex *)node->getMesh()->getMeshBuffer(0)->getVertices();</div><div class="line"> <span class="keywordflow">if</span> ( vertices )</div><div class="line"> {</div><div class="line"> ControlVertexColors->setColor(vertices[0].Color);</div><div class="line"> }</div><div class="line"></div><div class="line"> Initialized = <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> update()</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( !Initialized )</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> video::SMaterial & material = SceneNode->getMaterial(0);</div><div class="line"> video::SMaterial & material2T = SceneNode2T->getMaterial(0);</div><div class="line"> video::SMaterial & materialTangents = SceneNodeTangents->getMaterial(0);</div><div class="line"></div><div class="line"> s32 selectedMaterial = ComboMaterial->getSelected();</div><div class="line"> <span class="keywordflow">if</span> ( selectedMaterial >= (s32)video::EMT_SOLID && selectedMaterial <= (s32)video::EMT_ONETEXTURE_BLEND)</div><div class="line"> {</div><div class="line"> video::E_VERTEX_TYPE vertexType = getVertexTypeForMaterialType((video::E_MATERIAL_TYPE)selectedMaterial);</div><div class="line"> <span class="keywordflow">switch</span> ( vertexType )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> video::EVT_STANDARD:</div><div class="line"> material.MaterialType = (video::E_MATERIAL_TYPE)selectedMaterial;</div><div class="line"> SceneNode->setVisible(<span class="keyword">true</span>);</div><div class="line"> SceneNode2T->setVisible(<span class="keyword">false</span>);</div><div class="line"> SceneNodeTangents->setVisible(<span class="keyword">false</span>);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> video::EVT_2TCOORDS:</div><div class="line"> material2T.MaterialType = (video::E_MATERIAL_TYPE)selectedMaterial;</div><div class="line"> SceneNode->setVisible(<span class="keyword">false</span>);</div><div class="line"> SceneNode2T->setVisible(<span class="keyword">true</span>);</div><div class="line"> SceneNodeTangents->setVisible(<span class="keyword">false</span>);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> video::EVT_TANGENTS:</div><div class="line"> materialTangents.MaterialType = (video::E_MATERIAL_TYPE)selectedMaterial;</div><div class="line"> SceneNode->setVisible(<span class="keyword">false</span>);</div><div class="line"> SceneNode2T->setVisible(<span class="keyword">false</span>);</div><div class="line"> SceneNodeTangents->setVisible(<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"> updateMaterial(material);</div><div class="line"> updateMaterial(material2T);</div><div class="line"> updateMaterial(materialTangents);</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( ButtonLighting->isPressed() )</div><div class="line"> InfoLighting->setText(L<span class="stringliteral">"on"</span>);</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> InfoLighting->setText(L<span class="stringliteral">"off"</span>);</div><div class="line"></div><div class="line"> AllColorsControl->resetDirty();</div><div class="line"> TextureControl1->resetDirty();</div><div class="line"> TextureControl2->resetDirty();</div><div class="line"> ControlVertexColors->resetDirty();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> updateTextures()</div><div class="line"> {</div><div class="line"> TextureControl1->updateTextures(Driver);</div><div class="line"> TextureControl2->updateTextures(Driver);</div><div class="line"> }</div><div class="line"></div><div class="line"><span class="keyword">protected</span>:</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> updateMaterial(video::SMaterial & material)</div><div class="line"> {</div><div class="line"> AllColorsControl->updateMaterialColors(material);</div><div class="line"> material.Lighting = ButtonLighting->isPressed();</div><div class="line"> <span class="keywordflow">if</span> ( TextureControl1->isDirty() )</div><div class="line"> {</div><div class="line"> material.TextureLayer[0].Texture = Driver->getTexture( io::path(TextureControl1->getSelectedTextureName()) );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">if</span> ( TextureControl2->isDirty() )</div><div class="line"> {</div><div class="line"> material.TextureLayer[1].Texture = Driver->getTexture( io::path(TextureControl2->getSelectedTextureName()) );</div><div class="line"> }</div><div class="line"> <span class="keywordflow">if</span> ( ControlVertexColors->isDirty() )</div><div class="line"> {</div><div class="line"> MeshManipulator->setVertexColors (SceneNode->getMesh(), ControlVertexColors->getColor());</div><div class="line"> MeshManipulator->setVertexColors (SceneNode2T->getMesh(), ControlVertexColors->getColor());</div><div class="line"> MeshManipulator->setVertexColors (SceneNodeTangents->getMesh(), ControlVertexColors->getColor());</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">bool</span> Initialized;</div><div class="line"> video::IVideoDriver * Driver;</div><div class="line"> scene::IMeshManipulator* MeshManipulator;</div><div class="line"> scene::IMeshSceneNode* SceneNode;</div><div class="line"> scene::IMeshSceneNode* SceneNode2T;</div><div class="line"> scene::IMeshSceneNode* SceneNodeTangents;</div><div class="line"> CAllColorsControl* AllColorsControl;</div><div class="line"> gui::IGUIButton * ButtonLighting;</div><div class="line"> gui::IGUIStaticText* InfoLighting;</div><div class="line"> gui::IGUIComboBox * ComboMaterial;</div><div class="line"> CTextureControl* TextureControl1;</div><div class="line"> CTextureControl* TextureControl2;</div><div class="line"> CColorControl* ControlVertexColors;</div><div class="line">};</div></div><!-- fragment --><p> Control to allow setting the color values of a lightscenenode. </p><div class="fragment"><div class="line"><span class="keyword">struct </span>SLightNodeControl</div><div class="line">{</div><div class="line"> <span class="comment">// constructor</span></div><div class="line"> SLightNodeControl() : Initialized(false), SceneNode(0), AllColorsControl(0)</div><div class="line"> {</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keyword">virtual</span> ~SLightNodeControl()</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( AllColorsControl )</div><div class="line"> AllColorsControl->drop();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> init(scene::ILightSceneNode* node, gui::IGUIEnvironment* guiEnv, <span class="keyword">const</span> core::position2d<s32> & pos, <span class="keyword">const</span> <span class="keywordtype">wchar_t</span> * description)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( Initialized || !node || !guiEnv) <span class="comment">// initializing twice or with invalid data not allowed</span></div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"> SceneNode = node;</div><div class="line"> AllColorsControl = <span class="keyword">new</span> CAllColorsControl(guiEnv, pos, description, <span class="keyword">false</span>, guiEnv->getRootGUIElement());</div><div class="line"> <span class="keyword">const</span> video::SLight & lightData = SceneNode->getLightData();</div><div class="line"> AllColorsControl->setColorsToLightDataColors(lightData);</div><div class="line"> Initialized = <span class="keyword">true</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">void</span> update()</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( !Initialized )</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"></div><div class="line"> video::SLight & lightData = SceneNode->getLightData();</div><div class="line"> AllColorsControl->updateLightColors(lightData);</div><div class="line"> }</div><div class="line"></div><div class="line"><span class="keyword">protected</span>:</div><div class="line"> <span class="keywordtype">bool</span> Initialized;</div><div class="line"> scene::ILightSceneNode* SceneNode;</div><div class="line"> CAllColorsControl* AllColorsControl;</div><div class="line">};</div></div><!-- fragment --><p> Application configuration </p><div class="fragment"><div class="line"><span class="keyword">struct </span>SConfig</div><div class="line">{</div><div class="line"> SConfig()</div><div class="line"> : RenderInBackground(true)</div><div class="line"> , DriverType(video::EDT_BURNINGSVIDEO)</div><div class="line"> , ScreenSize(640, 480)</div><div class="line"> {</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="keywordtype">bool</span> RenderInBackground;</div><div class="line"> video::E_DRIVER_TYPE DriverType;</div><div class="line"> core::dimension2d<u32> ScreenSize;</div><div class="line">};</div></div><!-- fragment --><p> Main application class </p><div class="fragment"><div class="line"><span class="keyword">class </span>CApp : <span class="keyword">public</span> IEventReceiver</div><div class="line">{</div><div class="line"> <span class="keyword">friend</span> <span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[]);</div><div class="line"></div><div class="line"><span class="keyword">public</span>:</div><div class="line"> <span class="comment">// constructor</span></div><div class="line"> CApp()</div><div class="line"> : IsRunning(false)</div><div class="line"> , Device(0)</div><div class="line"> , Camera(0)</div><div class="line"> , GlobalAmbient(0)</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"> ~CApp()</div><div class="line"> {</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// stop running - will quit at end of mainloop</span></div><div class="line"> <span class="keywordtype">void</span> stopApp()</div><div class="line"> {</div><div class="line"> IsRunning = <span class="keyword">false</span>;</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Event handler</span></div><div class="line"> <span class="keyword">virtual</span> <span class="keywordtype">bool</span> OnEvent(<span class="keyword">const</span> SEvent &event)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> (event.EventType == EET_GUI_EVENT)</div><div class="line"> {</div><div class="line"> gui::IGUIEnvironment* env = Device->getGUIEnvironment();</div><div class="line"></div><div class="line"> <span class="keywordflow">switch</span>(event.GUIEvent.EventType)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> gui::EGET_MENU_ITEM_SELECTED:</div><div class="line"> {</div><div class="line"> gui::IGUIContextMenu* menu = (gui::IGUIContextMenu*)event.GUIEvent.Caller;</div><div class="line"> s32 <span class="keywordtype">id</span> = menu->getItemCommandId(menu->getSelectedItem());</div><div class="line"></div><div class="line"> <span class="keywordflow">switch</span>(<span class="keywordtype">id</span>)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">case</span> GUI_ID_OPEN_TEXTURE: <span class="comment">// File -> Open Texture</span></div><div class="line"> env->addFileOpenDialog(L<span class="stringliteral">"Please select a texture file to open"</span>);</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> <span class="keywordflow">case</span> GUI_ID_QUIT: <span class="comment">// File -> Quit</span></div><div class="line"> stopApp();</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"> }</div><div class="line"> }</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line"> <span class="keywordflow">case</span> gui::EGET_FILE_SELECTED:</div><div class="line"> {</div><div class="line"> <span class="comment">// load the model file, selected in the file open dialog</span></div><div class="line"> gui::IGUIFileOpenDialog* dialog =</div><div class="line"> (gui::IGUIFileOpenDialog*)event.GUIEvent.Caller;</div><div class="line"> loadTexture(io::path(dialog->getFileName()).c_str());</div><div class="line"> }</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"></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"> }</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="keyword">protected</span>:</div><div class="line"></div><div class="line"> <span class="comment">// Application initialization</span></div><div class="line"> <span class="comment">// returns true when it was successful initialized, otherwise false.</span></div><div class="line"> <span class="keywordtype">bool</span> init(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div><div class="line"> {</div><div class="line"> <span class="comment">// ask user for driver</span></div><div class="line"> Config.DriverType=driverChoiceConsole();</div><div class="line"> <span class="keywordflow">if</span> (Config.DriverType==video::EDT_COUNT)</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"></div><div class="line"> <span class="comment">// create the device with the settings from our config</span></div><div class="line"> Device = createDevice(Config.DriverType, Config.ScreenSize);</div><div class="line"> <span class="keywordflow">if</span> (!Device)</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"> Device->setWindowCaption( DriverTypeNames[Config.DriverType] );</div><div class="line"> Device->setEventReceiver(<span class="keyword">this</span>);</div><div class="line"></div><div class="line"> scene::ISceneManager* smgr = Device->getSceneManager();</div><div class="line"> video::IVideoDriver * driver = Device->getVideoDriver ();</div><div class="line"> gui::IGUIEnvironment* guiEnv = Device->getGUIEnvironment();</div><div class="line"></div><div class="line"> <span class="comment">// set a nicer font</span></div><div class="line"> gui::IGUISkin* skin = guiEnv->getSkin();</div><div class="line"> gui::IGUIFont* font = guiEnv->getFont(<span class="stringliteral">"../../media/fonthaettenschweiler.bmp"</span>);</div><div class="line"> <span class="keywordflow">if</span> (font)</div><div class="line"> skin->setFont(font);</div><div class="line"></div><div class="line"> <span class="comment">// remove some alpha value because it makes those menus harder to read otherwise</span></div><div class="line"> video::SColor col3dHighLight( skin->getColor(gui::EGDC_APP_WORKSPACE) );</div><div class="line"> col3dHighLight.setAlpha(255);</div><div class="line"> video::SColor colHighLight( col3dHighLight );</div><div class="line"> skin->setColor(gui::EGDC_HIGH_LIGHT, colHighLight );</div><div class="line"> skin->setColor(gui::EGDC_3D_HIGH_LIGHT, col3dHighLight );</div><div class="line"></div><div class="line"> <span class="comment">// Add some textures which are useful to test material settings</span></div><div class="line"> createDefaultTextures(driver);</div><div class="line"></div><div class="line"> <span class="comment">// create a menu</span></div><div class="line"> gui::IGUIContextMenu * menuBar = guiEnv->addMenu();</div><div class="line"> menuBar->addItem(L<span class="stringliteral">"File"</span>, -1, <span class="keyword">true</span>, <span class="keyword">true</span>);</div><div class="line"></div><div class="line"> gui::IGUIContextMenu* subMenuFile = menuBar->getSubMenu(0);</div><div class="line"> subMenuFile->addItem(L<span class="stringliteral">"Open texture ..."</span>, GUI_ID_OPEN_TEXTURE);</div><div class="line"> subMenuFile->addSeparator();</div><div class="line"> subMenuFile->addItem(L<span class="stringliteral">"Quit"</span>, GUI_ID_QUIT);</div><div class="line"></div><div class="line"> <span class="comment">// a static camera</span></div><div class="line"> Camera = smgr->addCameraSceneNode (0, core::vector3df(0, 0, 0),</div><div class="line"> core::vector3df(0, 0, 100),</div><div class="line"> -1);</div><div class="line"></div><div class="line"> <span class="comment">// add the nodes which are used to show the materials</span></div><div class="line"> scene::IMeshSceneNode* nodeL = smgr->addCubeSceneNode (30.0f, 0, -1,</div><div class="line"> core::vector3df(-35, 0, 100),</div><div class="line"> core::vector3df(0, 0, 0),</div><div class="line"> core::vector3df(1.0f, 1.0f, 1.0f));</div><div class="line"> NodeLeft.init( nodeL, Device, core::position2d<s32>(10,20), L<span class="stringliteral">"left node"</span> );</div><div class="line"></div><div class="line"> scene::IMeshSceneNode* nodeR = smgr->addCubeSceneNode (30.0f, 0, -1,</div><div class="line"> core::vector3df(35, 0, 100),</div><div class="line"> core::vector3df(0, 0, 0),</div><div class="line"> core::vector3df(1.0f, 1.0f, 1.0f));</div><div class="line"> NodeRight.init( nodeR, Device, core::position2d<s32>(530,20), L<span class="stringliteral">"right node"</span> );</div><div class="line"></div><div class="line"> <span class="comment">// add one light</span></div><div class="line"> scene::ILightSceneNode* nodeLight = smgr->addLightSceneNode(0, core::vector3df(0, 0, 0),</div><div class="line"> video::SColorf(1.0f, 1.0f, 1.0f),</div><div class="line"> 100.0f);</div><div class="line"> LightControl.init(nodeLight, guiEnv, core::position2d<s32>(270,20), L<span class="stringliteral">"light"</span> );</div><div class="line"></div><div class="line"> <span class="comment">// one large cube around everything. That's mainly to make the light more obvious.</span></div><div class="line"> scene::IMeshSceneNode* backgroundCube = smgr->addCubeSceneNode (200.0f, 0, -1, core::vector3df(0, 0, 0),</div><div class="line"> core::vector3df(45, 0, 0),</div><div class="line"> core::vector3df(1.0f, 1.0f, 1.0f));</div><div class="line"> backgroundCube->getMaterial(0).BackfaceCulling = <span class="keyword">false</span>; <span class="comment">// we are within the cube, so we have to disable backface culling to see it</span></div><div class="line"> backgroundCube->getMaterial(0).EmissiveColor.set(255,50,50,50); <span class="comment">// we keep some self lighting to keep texts visible</span></div><div class="line"></div><div class="line"> <span class="comment">// set the ambient light value</span></div><div class="line"> GlobalAmbient = <span class="keyword">new</span> CColorControl( guiEnv, core::position2d<s32>(270, 300), L<span class="stringliteral">"global ambient"</span>, guiEnv->getRootGUIElement());</div><div class="line"> GlobalAmbient->setColor( smgr->getAmbientLight().toSColor() );</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="comment">// Update one frame</span></div><div class="line"> <span class="keywordtype">bool</span> update()</div><div class="line"> {</div><div class="line"> <span class="keyword">using namespace </span>irr;</div><div class="line"></div><div class="line"> video::IVideoDriver* videoDriver = Device->getVideoDriver();</div><div class="line"> <span class="keywordflow">if</span> ( !Device->run() )</div><div class="line"> <span class="keywordflow">return</span> <span class="keyword">false</span>;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( Device->isWindowActive() || Config.RenderInBackground )</div><div class="line"> {</div><div class="line"> gui::IGUIEnvironment* guiEnv = Device->getGUIEnvironment();</div><div class="line"> scene::ISceneManager* smgr = Device->getSceneManager();</div><div class="line"> gui::IGUISkin * skin = guiEnv->getSkin();</div><div class="line"></div><div class="line"> <span class="comment">// update our controls</span></div><div class="line"> NodeLeft.update();</div><div class="line"> NodeRight.update();</div><div class="line"> LightControl.update();</div><div class="line"></div><div class="line"> <span class="comment">// update ambient light settings</span></div><div class="line"> <span class="keywordflow">if</span> ( GlobalAmbient->isDirty() )</div><div class="line"> {</div><div class="line"> smgr->setAmbientLight( GlobalAmbient->getColor() );</div><div class="line"> GlobalAmbient->resetDirty();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// draw everything</span></div><div class="line"> video::SColor bkColor( skin->getColor(gui::EGDC_APP_WORKSPACE) );</div><div class="line"> videoDriver->beginScene(<span class="keyword">true</span>, <span class="keyword">true</span>, bkColor);</div><div class="line"></div><div class="line"> smgr->drawAll();</div><div class="line"> guiEnv->drawAll();</div><div class="line"></div><div class="line"> videoDriver->endScene();</div><div class="line"> }</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="comment">// Run the application. Our main loop.</span></div><div class="line"> <span class="keywordtype">void</span> run()</div><div class="line"> {</div><div class="line"> IsRunning = <span class="keyword">true</span>;</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"></div><div class="line"> <span class="comment">// main application loop</span></div><div class="line"> <span class="keywordflow">while</span>(IsRunning)</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( !update() )</div><div class="line"> <span class="keywordflow">break</span>;</div><div class="line"></div><div class="line"> Device->sleep( 5 );</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Close down the application</span></div><div class="line"> <span class="keywordtype">void</span> quit()</div><div class="line"> {</div><div class="line"> IsRunning = <span class="keyword">false</span>;</div><div class="line"> GlobalAmbient->drop();</div><div class="line"> GlobalAmbient = NULL;</div><div class="line"> <span class="keywordflow">if</span> ( Device )</div><div class="line"> {</div><div class="line"> Device->closeDevice();</div><div class="line"> Device->drop();</div><div class="line"> Device = NULL;</div><div class="line"> }</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Create some useful textures.</span></div><div class="line"> <span class="comment">// Note that the function put readability over speed, you shouldn't use setPixel at runtime but for initialization it's nice.</span></div><div class="line"> <span class="keywordtype">void</span> createDefaultTextures(video::IVideoDriver * driver)</div><div class="line"> {</div><div class="line"> <span class="keyword">const</span> u32 width = 256;</div><div class="line"> <span class="keyword">const</span> u32 height = 256;</div><div class="line"> video::IImage * imageA8R8G8B8 = driver->createImage (video::ECF_A8R8G8B8, core::dimension2d<u32>(width, height));</div><div class="line"> <span class="keywordflow">if</span> ( !imageA8R8G8B8 )</div><div class="line"> <span class="keywordflow">return</span>;</div><div class="line"> <span class="keyword">const</span> u32 pitch = imageA8R8G8B8->getPitch();</div><div class="line"></div><div class="line"> <span class="comment">// some nice square-pattern with 9 typical colors</span></div><div class="line"> <span class="keywordflow">for</span> ( u32 y = 0; y < height; ++ y )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">for</span> ( u32 x = 0; x < pitch; ++x )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( y < height/3 )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( x < width/3 )</div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_BLACK);</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( x < 2*width/3 )</div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_BLUE);</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_CYAN);</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( y < 2*height/3 )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( x < width/3 )</div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_GRAY);</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( x < 2*width/3 )</div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_GREEN);</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_MAGENTA);</div><div class="line"> }</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> {</div><div class="line"> <span class="keywordflow">if</span> ( x < width/3 )</div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_RED);</div><div class="line"> <span class="keywordflow">else</span> <span class="keywordflow">if</span> ( x < 2*width/3 )</div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_YELLOW);</div><div class="line"> <span class="keywordflow">else</span></div><div class="line"> imageA8R8G8B8->setPixel (x, y, SCOL_WHITE);</div><div class="line"> }</div><div class="line"> }</div><div class="line"> }</div><div class="line"> driver->addTexture (io::path(<span class="stringliteral">"CARO_A8R8G8B8"</span>), imageA8R8G8B8);</div><div class="line"></div><div class="line"> <span class="comment">// all white</span></div><div class="line"> imageA8R8G8B8->fill(SCOL_WHITE);</div><div class="line"> driver->addTexture (io::path(<span class="stringliteral">"WHITE_A8R8G8B8"</span>), imageA8R8G8B8);</div><div class="line"></div><div class="line"> <span class="comment">// all black</span></div><div class="line"> imageA8R8G8B8->fill(SCOL_BLACK);</div><div class="line"> driver->addTexture (io::path(<span class="stringliteral">"BLACK_A8R8G8B8"</span>), imageA8R8G8B8);</div><div class="line"></div><div class="line"> <span class="comment">// gray-scale</span></div><div class="line"> <span class="keywordflow">for</span> ( u32 y = 0; y < height; ++ y )</div><div class="line"> {</div><div class="line"> <span class="keywordflow">for</span> ( u32 x = 0; x < pitch; ++x )</div><div class="line"> {</div><div class="line"> imageA8R8G8B8->setPixel (x, y, video::SColor(y, x,x,x) );</div><div class="line"> }</div><div class="line"> }</div><div class="line"> driver->addTexture (io::path(<span class="stringliteral">"GRAYSCALE_A8R8G8B8"</span>), imageA8R8G8B8);</div><div class="line"></div><div class="line"> imageA8R8G8B8->drop();</div><div class="line"> }</div><div class="line"></div><div class="line"> <span class="comment">// Load a texture and make sure nodes know it when more textures are available.</span></div><div class="line"> <span class="keywordtype">void</span> loadTexture(<span class="keyword">const</span> io::path &name)</div><div class="line"> {</div><div class="line"> Device->getVideoDriver()->getTexture(name);</div><div class="line"> NodeLeft.updateTextures();</div><div class="line"> NodeRight.updateTextures();</div><div class="line"> }</div><div class="line"></div><div class="line"><span class="keyword">private</span>:</div><div class="line"> SConfig Config;</div><div class="line"> <span class="keyword">volatile</span> <span class="keywordtype">bool</span> IsRunning;</div><div class="line"> IrrlichtDevice * Device;</div><div class="line"> scene::ICameraSceneNode * Camera;</div><div class="line"> SMeshNodeControl NodeLeft;</div><div class="line"> SMeshNodeControl NodeRight;</div><div class="line"> SLightNodeControl LightControl;</div><div class="line"> CColorControl * GlobalAmbient;</div><div class="line">};</div></div><!-- fragment --><p> A very short main as we do everything else in classes. </p><div class="fragment"><div class="line"><span class="keywordtype">int</span> main(<span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[])</div><div class="line">{</div><div class="line"> CApp APP;</div><div class="line"></div><div class="line"> <span class="keywordflow">if</span> ( !APP.init(argc, argv) )</div><div class="line"> {</div><div class="line"> printf(<span class="stringliteral">"init failed\n"</span>);</div><div class="line"> <span class="keywordflow">return</span> 1;</div><div class="line"> }</div><div class="line"></div><div class="line"> APP.run();</div><div class="line"> APP.quit();</div><div class="line"></div><div class="line"> <span class="keywordflow">return</span> 0;</div><div class="line">}</div></div><!-- fragment --> </div></div><!-- contents -->
<!-- HTML footer for doxygen 1.8.13-->
<!-- start footer part -->
<p> </p>
</body>
</html>
|