]>
Dogcows Code - chaz/yoink/blob - src/Main.cc
2 /*] Copyright (c) 2009-2010, Charles McGarvey [**************************
3 **] All rights reserved.
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.
10 **************************************************************************/
12 #include <cstdlib> // atexit, getenv
16 #include <unistd.h> // access
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>
25 #include "ErrorHandler.hh"
26 #include "GameLayer.hh"
28 #include "TitleLayer.hh"
36 Main::Main(Mf::Settings
& settings
, Mf::Video
& video
) :
37 Mf::View(settings
, video
)
39 Mf::Dispatch
& dispatch
= Mf::Dispatch::global();
40 mNewContextDispatch
= dispatch
.addTarget("video.newcontext",
41 boost::bind(&Main::setupGL
));
44 addChild(TitleLayer::alloc());
48 void Main::update(Mf::Scalar t
, Mf::Scalar dt
)
50 if (children().size() == 0)
52 Mf::logWarning("main view has no children");
57 Mf::View::update(t
, dt
);
60 void Main::draw(Mf::Scalar alpha
) const
62 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
);
64 glMatrixMode(GL_PROJECTION
);
67 glMatrixMode(GL_MODELVIEW
);
70 Mf::View::draw(alpha
);
73 bool Main::handleEvent(const Mf::Event
& event
)
75 if (Mf::View::handleEvent(event
)) return true;
80 if (event
.key
.keysym
.sym
== SDLK_f
)
84 else if (event
.key
.keysym
.sym
== SDLK_l
)
86 video().toggleCursorGrab();
87 video().toggleCursorVisible();
92 glViewport(0, 0, event
.resize
.w
, event
.resize
.h
);
104 std::string
Main::getSearchPath()
106 // Add search paths; they should be searched in this order:
107 // 1. YOINK_DATADIR (environment)
108 // 2. YOINK_DATADIR (configure)
112 char* dataDir
= getenv("YOINK_DATADIR");
118 path
+= YOINK_DATADIR
;
123 std::string
Main::getConfigPath()
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)
129 // 4. YOINKRC (environment)
131 std::string
path("yoinkrc");
132 Mf::Resource::getPath(path
);
135 path
+= ":/etc/yoinkrc";
137 path
+= ":$HOME/.yoinkrc";
139 char* configFile
= getenv("YOINKRC");
152 glEnable(GL_TEXTURE_2D
);
153 glEnable(GL_DEPTH_TEST
);
155 glEnable(GL_LINE_SMOOTH
);
156 glEnable(GL_POLYGON_SMOOTH
);
157 glShadeModel(GL_SMOOTH
);
159 //glEnable(GL_BLEND);
160 //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
161 glEnable(GL_ALPHA_TEST
);
162 glAlphaFunc(GL_GREATER
, 0.0);
164 glClearColor(0.0, 0.0, 0.0, 1.0);
166 //glMatrixMode(GL_PROJECTION);
168 //Mf::Scalar ratio = Mf::core.getVideo()->getWidth() /
169 //Mf::core.getVideo()->getHeight();
170 //gluPerspective(60.0, ratio, 1.0, 250.0);
172 //glMatrixMode(GL_MODELVIEW);
176 void Main::printUsage()
178 std::cout
<< "Usage: "
179 << PACKAGE
" [-h|--help] [-i|--info] [OPTION=VALUE]..."
181 << "The alien-smashing action game." << std::endl
183 << "Options:" << std::endl
184 << " -h, --help" << std::endl
185 << " show this help and exit" << std::endl
186 << " -i, --info" << std::endl
187 << " show version and build information" << std::endl
188 << " detail=1|2|3" << std::endl
189 << " the level of detail of game scenes" << std::endl
190 << " fullscreen=true|false" << std::endl
191 << " if true, uses the entire display" << std::endl
192 << " framerate=num" << std::endl
193 << " number of frames to draw per second" << std::endl
195 << "See documentation for more options." << std::endl
;
198 void Main::printInfo(int argc
, char* argv
[])
204 assets
.assign(YOINK_DATADIR
);
205 int accessible
= access(assets
.c_str(), R_OK
);
206 if (accessible
!= 0) assets
+= " (no access)";
208 char* temp
= getenv("YOINK_DATADIR");
212 accessible
= access(temp
, R_OK
);
213 if (accessible
!= 0) datadir
+= " (no access)";
216 temp
= getenv("YOINKRC");
220 accessible
= access(temp
, R_OK
);
221 if (accessible
!= 0) config
+= " (no access)";
224 std::cout
<< " Executable: " << argv
[0] << std::endl
225 << " Version: "VERSION
<< std::endl
226 << " Built: " << COMPILE_TIME
<< std::endl
227 << " Compiler: "COMPILER_STRING
<< std::endl
228 << " Assets: " << assets
<< std::endl
234 #ifndef USE_DOUBLE_PRECISION
237 << "double-precision "
242 #ifndef PROFILING_ENABLED
253 << "threads" << std::endl
254 << " YOINKRC: " << config
<< std::endl
255 << "YOINK_DATADIR: " << datadir
<< std::endl
;
261 std::cout
<< std::endl
<< PACKAGE_STRING
<< std::endl
262 << "Compiled " << __TIME__
" " __DATE__
<< std::endl
263 << "Send patches and bug reports to <"
264 PACKAGE_BUGREPORT
<< ">." << std::endl
<< std::endl
;
269 std::cout
<< std::endl
<< "Goodbye..." << std::endl
<< std::endl
;
273 int main(int argc
, char* argv
[])
277 std::string
arg(argv
[1]);
278 if (arg
== "-h" || arg
== "--help")
283 else if (arg
== "-i" || arg
== "--info")
285 Main::printInfo(argc
, argv
);
293 Mf::Resource::addSearchPaths(Main::getSearchPath());
295 Mf::Settings
settings(argc
, argv
, Main::getConfigPath());
297 Mf::Log::Level logLevel
= Mf::Log::INFO
;
298 settings
.get("loglevel", logLevel
);
299 Mf::Log::setLevel(logLevel
);
303 Mf::Video::Attributes
attributes(settings
);
304 attributes
.caption
= PACKAGE_STRING
;
305 attributes
.icon
= Mf::Resource::getPath(PACKAGE
".png");
307 Mf::Video
video(attributes
);
308 Main
mainView(settings
, video
);
313 catch (const Mf::Error
& error
)
315 Mf::ModalDialog
dialog(Mf::ModalDialog::CRITICAL
,
316 PACKAGE_STRING
, "Unhandled Exception",
317 getErrorString(error
));
This page took 0.045209 seconds and 4 git commands to generate.