SimpleFastOpenAtomicVisualiser
Loading...
Searching...
No Matches
console.h
Go to the documentation of this file.
1#ifndef CONSOLE_H
2#define CONSOLE_H
3
4#include <memory>
5#include <vector>
6#include <chrono>
7#include <string>
8#include <sstream>
9#include <iostream>
10
11#include <lua.h>
12#include <LuaNumber.h>
13#include <LuaString.h>
14#include <LuaTable.h>
15#include <LuaArray.h>
16#include <LuaVec.h>
17#include <LuaBool.h>
18#include <visualisationState.h>
19#include <commandLine.h>
20#include <camera.h>
21
34
40
49template <VisualisationStateMember function>
51{
52 LuaExtraSpace * store = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
53 VisualisationState * ptr = store->visualisationState;
54 return ((*ptr).*function)(lua);
55}
56
61typedef int (Camera::*CameraMember)(lua_State * lua);
62
71template <CameraMember function>
73{
74 LuaExtraSpace * store = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
75 Camera * ptr = store->camera;
76 return ((*ptr).*function)(lua);
77}
78
84
93template <CommandLineMember function>
95{
96 LuaExtraSpace * store = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
97 CommandLine * ptr = store->options;
98 return ((*ptr).*function)(lua);
99}
100
108{
109 if (lua_gettop(lua) >= 1 && lua_isstring(lua, 1) && std::string(lua_tostring(lua, 1)) == "help")
110 {
111 lua_writestring("startRecord:\n Arguments: none\n Start video recording.\n");
112 return 0;
113 };
114 LuaExtraSpace * extraSpace = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
115 if (!extraSpace->visualisationState->recording)
116 {
117 extraSpace->visualisationState->toggleRecord(*extraSpace->options);
118 }
119 return 0;
120}
121
129{
130 if (lua_gettop(lua) >= 1 && lua_isstring(lua, 1) && std::string(lua_tostring(lua, 1)) == "help")
131 {
132 lua_writestring("stopRecord:\n Arguments: none\n Stop video recording.\n");
133 return 0;
134 };
135 LuaExtraSpace * extraSpace = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
136 if (extraSpace->visualisationState->recording)
137 {
138 extraSpace->visualisationState->toggleRecord(*extraSpace->options);
139 }
140 return 0;
141}
142
150{
151 if (lua_gettop(lua) >= 1 && lua_isstring(lua, 1) && std::string(lua_tostring(lua, 1)) == "help")
152 {
153 lua_writestring("play:\n Arguments: none\n Play the trajectory.\n");
154 return 0;
155 };
156 LuaExtraSpace * extraSpace = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
157 extraSpace->options->play.value = true;
158 return 0;
159}
160
168{
169 if (lua_gettop(lua) >= 1 && lua_isstring(lua, 1) && std::string(lua_tostring(lua, 1)) == "help")
170 {
171 lua_writestring("exit:\n Arguments: none\n Quit sfoav.\n");
172 return 0;
173 };
174 LuaExtraSpace * extraSpace = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
175 *(extraSpace->exit) = true;
176 return 0;
177}
178
186{
187 if (lua_gettop(lua) >= 1 && lua_isstring(lua, 1) && std::string(lua_tostring(lua, 1)) == "help")
188 {
189 lua_writestring("pause:\n Arguments: none\n Pause the trajectory.\n");
190 return 0;
191 };
192 LuaExtraSpace * extraSpace = *static_cast<LuaExtraSpace**>(lua_getextraspace(lua));
193 extraSpace->options->play.value = false;
194 return 0;
195}
196
201{
202public:
203
209 (
210 VisualisationState * visualisationState,
211 CommandLine * options,
212 Camera * camera
213 )
214 : lastCommandOrProgram(""), lastStatus(false)
215 {
216 lua = luaL_newstate();
217 luaL_openlibs(lua);
218 luaL_requiref(lua,"sfoav",load_sfoavLib,1);
219 extraSpace.visualisationState = visualisationState;
220 extraSpace.options = options;
221 extraSpace.camera = camera;
222 extraSpace.exit = &exit;
223 *static_cast<LuaExtraSpace**>(lua_getextraspace(lua)) = &extraSpace;
224
225 const char * init = R"(
226 function use(module)
227 for k,v in pairs(module) do
228 if not _G[k] then
229 _G[k] = module[k]
230 end
231 end
232 end
233 use(sfoav))";
234 runString(init);
235
236 const char * help = R"(
237 function help(func)
238 if func == sfoav or func == nil then
239 for k,v in pairs(sfoav) do
240 v("help")
241 print("\n")
242 end
243 return
244 end
245 for k,v in pairs(sfoav) do
246 if v == func then
247 func("help")
248 print("\n")
249 return
250 end
251 end
252 end)";
253 runString(help);
254 }
255
257
265 bool runFile(std::string file)
266 {
267 if (luaIsOk())
268 {
269 lastCommandOrProgram = file;
270 lastStatus = luaL_loadfile(lua, file.c_str());
271 lastStatus = lastStatus || lua_pcall(lua, 0, LUA_MULTRET, 0);
272 return handleErrors();
273 }
274 return false;
275 }
276
284 bool runString(std::string program)
285 {
286 if (luaIsOk())
287 {
288 lastCommandOrProgram = program;
289 lastStatus = luaL_dostring(lua,program.c_str());
290 return handleErrors();
291 }
292 return false;
293 }
294
302 bool runString(const char * program)
303 {
304 if (luaIsOk())
305 { lastCommandOrProgram = std::string(program);
306 lastStatus = luaL_dostring(lua,program);
307 return handleErrors();
308 }
309 return false;
310 }
311
312 bool luaIsOk(){ return lua_status(lua) == LUA_OK ? true : false; }
313
319 std::string luaStatus()
320 {
321 int s = lua_status(lua);
322
323 if (s == LUA_OK){return "LUA_OK";}
324
325 std::string status = lastCommandOrProgram + " | ";
326
327 switch(s)
328 {
329 case LUA_YIELD:
330 status += "LUA_YIELD";
331 break;
332 case LUA_ERRRUN:
333 status += "LUA_ERRRUN";
334 break;
335 case LUA_ERRSYNTAX:
336 status += "LUA_ERRSYNTAX";
337 break;
338 case LUA_ERRMEM:
339 status += "LUA_ERRMEM";
340 break;
341 case LUA_ERRERR:
342 status += "LUA_ERRERR";
343 break;
344 default:
345 status += "LUA_STATUS_UNKOWN";
346 break;
347 }
348
349 return status;
350 }
351
352 template <class T>
353 T getGlobal(const char * n)
354 {
355 T value;
356 value.readGlobal(lua, n);
357 return value;
358 }
359
366 bool exitCalled() const { return exit; }
367
368private:
369
370 lua_State * lua;
371 LuaExtraSpace extraSpace;
372
373 std::string lastCommandOrProgram;
374 std::stringstream input;
375 static std::string stackTrace;
376 bool lastStatus;
377 bool exit = false;
378
379 bool handleErrors()
380 {
381 if (lastStatus)
382 {
383 if (lua_isstring(lua, -1)) { std::cerr << lua_tostring(lua, -1) << "\n"; }
384 else { std::cerr << "Exited with error running "+lastCommandOrProgram+"\n"; }
385 return true;
386 }
387 else
388 {
389 return false;
390 }
391 }
392
393 static int load_sfoavLib(lua_State * lua)
394 {
395 luaL_Reg sfoavLib[25] =
396 {
407 {"startRecording", &lua_startRecord},
408 {"stopRecording", &lua_stopRecord},
409 {"play", &lua_play},
410 {"pause", &lua_pause},
416 {"setCameraFieldOfView", &dispatchCamera<&Camera::lua_setCameraFieldOfView>},
417 {"getCameraFieldOfView", &dispatchCamera<&Camera::lua_getCameraFieldOfView>},
418 {"exit", &lua_exit},
421 {NULL, NULL}
422 };
423
425 return 1;
426 }
427};
428
429#endif /* CONSOLE_H */
A 3D projective camera centered on a focus moving on a sphere.
Definition camera.h:30
Lua console.
Definition console.h:201
bool exitCalled() const
If sfoav.exit() has been called.
Definition console.h:366
~Console()
Definition console.h:256
bool runFile(std::string file)
Attempt to run a Lua script from a file on disc.
Definition console.h:265
Console(VisualisationState *visualisationState, CommandLine *options, Camera *camera)
Construct a new Console.
Definition console.h:209
std::string luaStatus()
Convert Lua's status to a std::string.
Definition console.h:319
bool runString(std::string program)
Attempt to run a Lua script from std::string.
Definition console.h:284
T getGlobal(const char *n)
Definition console.h:353
bool luaIsOk()
Definition console.h:312
bool runString(const char *program)
Attempt to run a Lua script from std::string.
Definition console.h:302
glm::vec< L, float, glm::qualifier::highp > vec
Definition commandLine.h:214
int(VisualisationState::* VisualisationStateMember)(lua_State *lua)
A Lua binding in VisualisationState;.
Definition console.h:39
int dispatchCamera(lua_State *lua)
Dispath to a Lua binding of Camera.
Definition console.h:72
int lua_pause(lua_State *lua)
Stop playing frames.
Definition console.h:185
int lua_exit(lua_State *lua)
Exit SFOAV.
Definition console.h:167
int lua_startRecord(lua_State *lua)
Start video recording (if not already recording).
Definition console.h:107
int lua_stopRecord(lua_State *lua)
Stop video recording (if already recording).
Definition console.h:128
int(Camera::* CameraMember)(lua_State *lua)
A Lua binding in Camera;.
Definition console.h:61
int lua_play(lua_State *lua)
Start playing frames.
Definition console.h:149
int(CommandLine::* CommandLineMember)(lua_State *lua)
A Lua binding in CommandLine;.
Definition console.h:83
int dispatchCommandLine(lua_State *lua)
Dispath to a Lua binding of CommandLine.
Definition console.h:94
int dispatchVisualisationState(lua_State *lua)
Dispath to a Lua binding of VisualisationState.
Definition console.h:50
T value
Definition commandLine.h:33
Extract command line arguments.
Definition commandLine.h:240
Argument< bool > play
Definition commandLine.h:380
Store for lua global state. For the console to have access to these classes they must be set into Lua...
Definition console.h:28
bool * exit
Definition console.h:32
CommandLine * options
Definition console.h:30
Camera * camera
Definition console.h:31
VisualisationState * visualisationState
Definition console.h:29
Holds editable data for the visualisation state.
Definition visualisationState.h:34
bool recording
Definition visualisationState.h:132
void toggleRecord(const CommandLine &options)
Toggle recording to video.
Definition visualisationState.h:150