]>
Dogcows Code - chaz/yoink/blob - src/YoinkApp.cc
2 /*******************************************************************************
4 Copyright (c) 2009, Charles McGarvey
7 Redistribution and use in source and binary forms, with or without
8 modification, are permitted provided that the following conditions are met:
10 * Redistributions of source code must retain the above copyright notice,
11 this list of conditions and the following disclaimer.
12 * Redistributions in binary form must reproduce the above copyright notice,
13 this list of conditions and the following disclaimer in the documentation
14 and/or other materials provided with the distribution.
16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
20 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
21 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
22 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
23 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
24 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
25 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *******************************************************************************/
29 #include <cstdlib> // getenv
33 #include <boost/bind.hpp>
35 #include <Moof/Math.hh>
36 #include <Moof/OpenGL.hh>
37 #include <Moof/Settings.hh>
38 #include <Moof/Timer.hh>
39 #include <Moof/Video.hh>
41 #include "YoinkApp.hh"
48 static std::string
configFiles()
52 char* configFile
= getenv("YOINKRC");
53 char* dataDir
= getenv("YOINK_DATADIR");
57 // if a config file from the environment variable is specified, we want
58 // to load it first so it has precedence
63 // add the colon-delimited paths from configure
64 files
+= YOINK_CONFIGFILES
;
68 // if another data directory is set in the environment, look for a
75 // look in the configured data directory last of all
77 files
+= (dataDir
? dataDir
: YOINK_DATADIR
);
83 static std::string
iconFile()
85 char* dataDir
= getenv("YOINK_DATADIR");
87 // first set up the search paths so we can find the icon and other resources
90 // look first in the data directory specified by the environment
91 Mf::Resource::addSearchPath(dataDir
);
94 // then look in the configured data directory
95 Mf::Resource::addSearchPath(YOINK_DATADIR
);
97 return Mf::Resource::getPathToResource("yoink.png");
101 YoinkApp::YoinkApp(int argc
, char* argv
[]) :
102 Mf::Engine(argc
, argv
, configFiles(), PACKAGE_STRING
, iconFile())
104 Mf::Dispatcher::instance().addHandler("video.context_recreated",
105 boost::bind(&YoinkApp::contextRecreated
, this, _1
), this);
110 someChar
= new Character("RobotTrooper");
111 someChar
->getAnimation().startSequence("Run");
113 font
= new TilemapFont
;
115 Mf::Vector2 coeffs
[4];
116 coeffs
[0] = Mf::Vector2(0.0, 0.0);
117 coeffs
[1] = Mf::Vector2(0.5, 0.0);
118 coeffs
[2] = Mf::Vector2(0.5, 0.0);
119 coeffs
[3] = Mf::Vector2(1.0, 0.0);
120 interp
.init(coeffs
, 1.0, Mf::Interpolator::OSCILLATE
);
122 Mf::Scalar coeff
[2] = {1.0, 0.0};
123 fadeIn
.init(coeff
, 0.5f
);
125 testScene
= new Mf::Scene("Test");
130 YoinkApp::~YoinkApp()
135 Mf::Dispatcher::instance().removeHandler(this);
139 void YoinkApp::setupGL()
141 glEnable(GL_TEXTURE_2D
);
143 //glEnable(GL_CULL_FACE);
144 glEnable(GL_DEPTH_TEST
);
146 glShadeModel(GL_SMOOTH
);
147 //glEnable(GL_POLYGON_SMOOTH);
150 //glGetIntegerv(GL_MAX_TEXTURE_SIZE, &texSize);
151 //std::cout << "texture size: " << texSize << std::endl;
153 //glEnable(GL_BLEND);
154 //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
155 glEnable(GL_ALPHA_TEST
);
156 glAlphaFunc(GL_GREATER
, 0.0);
158 glClearColor(1.0, 0.0, 0.0, 1.0);
160 glMatrixMode(GL_PROJECTION
);
162 gluPerspective(60.0, 1.33333, 1.0, 2500.0);
164 //glLineWidth(10.0f);
167 void YoinkApp::contextRecreated(const Mf::Notification
& note
)
169 // Whenever the context and a new one created, it probably won't contain our
170 // state so we need to set that up again.
175 void YoinkApp::update(Mf::Scalar t
, Mf::Scalar dt
)
181 camera
.update(t
, dt
);
183 someChar
->getAnimation().update(t
, dt
);
191 void YoinkApp::draw(Mf::Scalar alpha
)
194 //meh.random(0.0, 1.0);
195 //static Mf::Vector4 c1(meh);
197 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
199 //Mf::Scalar drawstate = cml::lerp(prevstate, state, alpha);
200 //Mf::Scalar sinstate = std::sin(drawstate);
201 //Mf::Scalar cosstate = std::cos(drawstate);
205 glMatrixMode(GL_MODELVIEW
);
208 glBindTexture(GL_TEXTURE_2D
, 0);
209 //glRotatef(drawstate*15.0f, 0.0, 1.0, 0.0);
210 //glTranslatef(x, y, z);
211 glLoadMatrix(camera
.getTransformation().data());
214 testScene
->draw(alpha
);
220 someChar->getTilemap().bind();
221 glColor3f(1.0, 1.0, 1.0);
223 Mf::Tilemap::Index heroFrame = someChar->getAnimation().getFrame();
225 Mf::Scalar coords[8];
226 someChar->getTilemap().getTileCoords(heroFrame, coords);
229 glTexCoord2f(coords[0], coords[1]);
230 glVertex3f(-1.0, 0.0, 0.0);
231 glTexCoord2f(coords[2], coords[3]);
232 glVertex3f(0.0, 0.0, 0.0);
233 glTexCoord2f(coords[4], coords[5]);
234 glVertex3f(0.0, 1.0, 0.0);
235 glTexCoord2f(coords[6], coords[7]);
236 glVertex3f(-1.0, 1.0, 0.0);
240 someChar->getTilemap().getTileCoords(heroFrame, coords,
241 Mf::Tilemap::REVERSE);
244 glTexCoord2f(coords[0], coords[1]);
245 glVertex3f(0.0, 0.0, 0.0);
246 glTexCoord2f(coords[2], coords[3]);
247 glVertex3f(1.0, 0.0, 0.0);
248 glTexCoord2f(coords[4], coords[5]);
249 glVertex3f(1.0, 1.0, 0.0);
250 glTexCoord2f(coords[6], coords[7]);
251 glVertex3f(0.0, 1.0, 0.0);
254 glColor4f(1.0,0.0,0.0,0.5);
256 glBindTexture(GL_TEXTURE_2D, 0);
257 glColor4v(c1.data());
259 glRectd(-cosstate, -sinstate, sinstate, cosstate);
260 glRectf(0.0f, 0.0f, sinstate, cosstate);
264 font->getTileCoords('c', coords);
267 glTexCoord2f(coords[0], coords[1]);
268 glVertex3f(-1.0, 0.0, 0.0);
269 glTexCoord2f(coords[2], coords[3]);
270 glVertex3f(0.0, 0.0, 0.0);
271 glTexCoord2f(coords[4], coords[5]);
272 glVertex3f(0.0, 1.0, 0.0);
273 glTexCoord2f(coords[6], coords[7]);
274 glVertex3f(-1.0, 1.0, 0.0);
277 font->getTileCoords('h', coords);
280 glTexCoord2f(coords[0], coords[1]);
281 glVertex3f(0.0, 0.0, 0.0);
282 glTexCoord2f(coords[2], coords[3]);
283 glVertex3f(1.0, 0.0, 0.0);
284 glTexCoord2f(coords[4], coords[5]);
285 glVertex3f(1.0, 1.0, 0.0);
286 glTexCoord2f(coords[6], coords[7]);
287 glVertex3f(0.0, 1.0, 0.0);
290 font->getTileCoords('a', coords);
293 glTexCoord2f(coords[0], coords[1]);
294 glVertex3f(-1.0, -1.0, 0.0);
295 glTexCoord2f(coords[2], coords[3]);
296 glVertex3f(0.0, -1.0, 0.0);
297 glTexCoord2f(coords[4], coords[5]);
298 glVertex3f(0.0, 0.0, 0.0);
299 glTexCoord2f(coords[6], coords[7]);
300 glVertex3f(-1.0, 0.0, 0.0);
303 font->getTileCoords('z', coords);
306 glTexCoord2f(coords[0], coords[1]);
307 glVertex3(0.0, -1.0, 0.0);
308 glTexCoord2f(coords[2], coords[3]);
309 glVertex3(1.0, -1.0, 0.0);
310 glTexCoord2f(coords[4], coords[5]);
311 glVertex3(1.0, 0.0, 0.0);
312 glTexCoord2f(coords[6], coords[7]);
313 glVertex3(0.0, 0.0, 0.0);
317 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
318 glDisable(GL_DEPTH_TEST);
320 glBindTexture(GL_TEXTURE_2D, 0);
321 glColor4f(0.0f, 0.0f, 0.0f, 1.0f);
324 glVertex2f(0.0f, 0.0f);
325 glVertex2v(interp.getState(alpha).data());
328 glColor4f(0.0f, 0.0f, 0.0f, fadeIn.getState(alpha));
329 glRectf(-1.0f, -1.0f, 1.0f, 1.0f);
332 glEnable(GL_DEPTH_TEST);*/
335 void YoinkApp::handleEvent(const Mf::Event
& event
)
340 if (event
.key
.keysym
.sym
== SDLK_ESCAPE
)
344 else if (event
.key
.keysym
.sym
== SDLK_f
)
346 getVideo().toggleFull();
348 else if (event
.key
.keysym
.sym
== SDLK_a
)
350 someChar
->getAnimation().startSequence("Punch");
352 else if (event
.key
.keysym
.sym
== SDLK_r
)
354 testScene
->refresh();
356 else if (event
.key
.keysym
.sym
== SDLK_l
)
358 getVideo().toggleCursorGrab();
359 getVideo().toggleCursorVisible();
361 //else if (event.key.keysym.sym == SDLK_RIGHT)
365 //else if (event.key.keysym.sym == SDLK_LEFT)
369 //else if (event.key.keysym.sym == SDLK_UP)
373 //else if (event.key.keysym.sym == SDLK_DOWN)
377 //else if (event.key.keysym.sym == SDLK_PAGEUP)
381 //else if (event.key.keysym.sym == SDLK_PAGEDOWN)
386 case SDL_MOUSEMOTION
:
387 case SDL_MOUSEBUTTONDOWN
:
388 camera
.adjustFromInput(event
);
395 case SDL_VIDEORESIZE
:
396 glViewport(0, 0, event
.resize
.w
, event
.resize
.h
);
398 glMatrixMode(GL_PROJECTION
);
402 gluPerspective(60.0, double(event
.resize
.w
/ event
.resize
.h
), 1.0, 2500.0);
404 glMatrixMode(GL_MODELVIEW
);
410 int main(int argc
, char* argv
[])
412 std::cout
<< PACKAGE_STRING
<< std::endl
413 << "Compiled " << __TIME__
" " __DATE__
<< std::endl
414 << "Send requests, patches, and bug reports to <"
415 PACKAGE_BUGREPORT
<< ">." << std::endl
<< std::endl
;
421 YoinkApp
app(argc
, argv
);
424 catch (Mf::Engine::Exception e
)
426 std::cerr
<< "Unhandled exception: " << e
.what() << std::endl
;
430 std::cout
<< "Goodbye..." << std::endl
;
434 /** vim: set ts=4 sw=4 tw=80: *************************************************/
This page took 0.052423 seconds and 4 git commands to generate.