destroyed global classes; view hierarchy instead
[chaz/yoink] / src / Main.cc
1
2 /*] Copyright (c) 2009-2010, Charles McGarvey [**************************
3 **] All rights reserved.
4 *
5 * vi:ts=4 sw=4 tw=75
6 *
7 * Distributable under the terms and conditions of the 2-clause BSD license;
8 * see the file COPYING for a complete text of the license.
9 *
10 **************************************************************************/
11
12 #include <cstdlib> // atexit, getenv
13 #include <functional>
14 #include <iostream>
15 #include <string>
16 #include <unistd.h> // access
17
18 #include <Moof/Log.hh>
19 #include <Moof/ModalDialog.hh>
20 #include <Moof/OpenGL.hh>
21 #include <Moof/Resource.hh>
22 #include <Moof/Settings.hh>
23 #include <Moof/Video.hh>
24
25 #include "ErrorHandler.hh"
26 #include "GameLayer.hh"
27 #include "Main.hh"
28 #include "TitleLayer.hh"
29
30 #if HAVE_CONFIG_H
31 #include "config.h"
32 #endif
33 #include "version.h"
34
35
36 Main::Main(Mf::Settings& settings, Mf::Video& video) :
37 Mf::View(settings, video)
38 {
39 Mf::Dispatch& dispatch = Mf::Dispatch::global();
40 mNewContextDispatch = dispatch.addTarget("video.newcontext",
41 boost::bind(&Main::setupGL));
42 setupGL();
43
44 addChild(TitleLayer::alloc());
45 }
46
47
48 void Main::update(Mf::Scalar t, Mf::Scalar dt)
49 {
50 if (children().size() == 0)
51 {
52 Mf::logWarning("main view has no children");
53 stop();
54 return;
55 }
56
57 Mf::View::update(t, dt);
58 }
59
60 void Main::draw(Mf::Scalar alpha) const
61 {
62 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
63
64 glMatrixMode(GL_PROJECTION);
65 glLoadIdentity();
66
67 glMatrixMode(GL_MODELVIEW);
68 glLoadIdentity();
69
70 Mf::View::draw(alpha);
71 }
72
73 bool Main::handleEvent(const Mf::Event& event)
74 {
75 if (Mf::View::handleEvent(event)) return true;
76
77 switch (event.type)
78 {
79 case SDL_KEYUP:
80 if (event.key.keysym.sym == SDLK_f)
81 {
82 video().toggleFull();
83 }
84 else if (event.key.keysym.sym == SDLK_l)
85 {
86 video().toggleCursorGrab();
87 video().toggleCursorVisible();
88 }
89 break;
90
91 case SDL_VIDEORESIZE:
92 glViewport(0, 0, event.resize.w, event.resize.h);
93 break;
94
95 case SDL_QUIT:
96 stop();
97 return true;
98 }
99
100 return false;
101 }
102
103
104 std::string Main::getSearchPath()
105 {
106 // Add search paths; they should be searched in this order:
107 // 1. YOINK_DATADIR (environment)
108 // 2. YOINK_DATADIR (configure)
109
110 std::string path;
111
112 char* dataDir = getenv("YOINK_DATADIR");
113 if (dataDir)
114 {
115 path += dataDir;
116 path += ":";
117 }
118 path += YOINK_DATADIR;
119
120 return path;
121 }
122
123 std::string Main::getConfigPath()
124 {
125 // Build the list of config files to search for, in this order:
126 // 1. YOINK_DATADIR/yoinkrc
127 // 2. /etc/yoinkrc (not for Windows)
128 // 3. $HOME/.yoinkrc
129 // 4. YOINKRC (environment)
130
131 std::string path = Mf::Resource::getPath("yoinkrc");
132
133 #if !defined(_WIN32)
134 path += ":/etc/yoinkrc";
135 #endif
136 path += ":$HOME/.yoinkrc";
137
138 char* configFile = getenv("YOINKRC");
139 if (configFile)
140 {
141 path += ":";
142 path += configFile;
143 }
144
145 return path;
146 }
147
148
149 void Main::setupGL()
150 {
151 glEnable(GL_TEXTURE_2D);
152 glEnable(GL_DEPTH_TEST);
153
154 glEnable(GL_LINE_SMOOTH);
155 glEnable(GL_POLYGON_SMOOTH);
156 glShadeModel(GL_SMOOTH);
157
158 //glEnable(GL_BLEND);
159 //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
160 glEnable(GL_ALPHA_TEST);
161 glAlphaFunc(GL_GREATER, 0.0);
162
163 glClearColor(0.0, 0.0, 0.0, 1.0);
164
165 //glMatrixMode(GL_PROJECTION);
166 //glLoadIdentity();
167 //Mf::Scalar ratio = Mf::core.getVideo()->getWidth() /
168 //Mf::core.getVideo()->getHeight();
169 //gluPerspective(60.0, ratio, 1.0, 250.0);
170
171 //glMatrixMode(GL_MODELVIEW);
172 }
173
174
175 void Main::printUsage()
176 {
177 std::cout << "Usage: "
178 << PACKAGE" [-h|--help] [-i|--info] [OPTION=VALUE]..."
179 << std::endl
180 << "The alien-smashing action game." << std::endl
181 << std::endl
182 << "Options:" << std::endl
183 << " -h, --help" << std::endl
184 << " show this help and exit" << std::endl
185 << " -i, --info" << std::endl
186 << " show version and build information" << std::endl
187 << " detail=1|2|3" << std::endl
188 << " the level of detail of game scenes" << std::endl
189 << " fullscreen=true|false" << std::endl
190 << " if true, uses the entire display" << std::endl
191 << " framerate=num" << std::endl
192 << " number of frames to draw per second" << std::endl
193 << std::endl
194 << "See documentation for more options." << std::endl;
195 }
196
197 void Main::printInfo(int argc, char* argv[])
198 {
199 std::string assets;
200 std::string datadir;
201 std::string config;
202
203 assets.assign(YOINK_DATADIR);
204 int accessible = access(assets.c_str(), R_OK);
205 if (accessible != 0) assets += " (no access)";
206
207 char* temp = getenv("YOINK_DATADIR");
208 if (temp)
209 {
210 datadir = temp;
211 accessible = access(temp, R_OK);
212 if (accessible != 0) datadir += " (no access)";
213 }
214
215 temp = getenv("YOINKRC");
216 if (temp)
217 {
218 config = temp;
219 accessible = access(temp, R_OK);
220 if (accessible != 0) config += " (no access)";
221 }
222
223 std::cout << " Executable: " << argv[0] << std::endl
224 << " Version: "VERSION << std::endl
225 << " Built: " << COMPILE_TIME << std::endl
226 << " Compiler: "COMPILER_STRING << std::endl
227 << " Assets: " << assets << std::endl
228 << "Build options: "
229 #ifdef NDEBUG
230 << "-"
231 #endif
232 << "debug "
233 #ifndef USE_DOUBLE_PRECISION
234 << "-"
235 #endif
236 << "double-precision "
237 #ifndef USE_GTK
238 << "-"
239 #endif
240 << "gtk "
241 #ifndef PROFILING_ENABLED
242 << "-"
243 #endif
244 << "profile "
245 #ifndef USE_QT4
246 << "-"
247 #endif
248 << "qt4 "
249 #ifndef USE_THREADS
250 << "-"
251 #endif
252 << "threads" << std::endl
253 << " YOINKRC: " << config << std::endl
254 << "YOINK_DATADIR: " << datadir << std::endl;
255 }
256
257
258 void hello()
259 {
260 std::cout << std::endl << PACKAGE_STRING << std::endl
261 << "Compiled " << __TIME__ " " __DATE__ << std::endl
262 << "Send patches and bug reports to <"
263 PACKAGE_BUGREPORT << ">." << std::endl << std::endl;
264 }
265
266 void goodbye()
267 {
268 std::cout << std::endl << "Goodbye..." << std::endl << std::endl;
269 }
270
271
272 int main(int argc, char* argv[])
273 {
274 if (argc > 1)
275 {
276 std::string arg(argv[1]);
277 if (arg == "-h" || arg == "--help")
278 {
279 Main::printUsage();
280 return 0;
281 }
282 else if (arg == "-i" || arg == "--info")
283 {
284 Main::printInfo(argc, argv);
285 return 0;
286 }
287 }
288
289 hello();
290 atexit(goodbye);
291
292 Mf::Resource::addSearchPaths(Main::getSearchPath());
293
294 Mf::Settings settings(argc, argv, Main::getConfigPath());
295
296 Mf::Log::Level logLevel = Mf::Log::INFO;
297 settings.get("loglevel", logLevel);
298 Mf::Log::setLevel(logLevel);
299
300 try
301 {
302 Mf::Video::Attributes attributes(settings);
303 attributes.caption = PACKAGE_STRING;
304 attributes.icon = Mf::Resource::getPath(PACKAGE".png");
305
306 Mf::Video video(attributes);
307 Main mainView(settings, video);
308
309 mainView.run();
310 return 0;
311 }
312 catch (const Mf::Error& error)
313 {
314 Mf::ModalDialog dialog(Mf::ModalDialog::CRITICAL,
315 PACKAGE_STRING, "Unhandled Exception",
316 getErrorString(error));
317
318 dialog.run();
319 return 1;
320 }
321 }
322
This page took 0.0517 seconds and 5 git commands to generate.