X-Git-Url: http://git.mutantstargoat.com/user/nuclear/?a=blobdiff_plain;f=src%2F3dengfx%2Fsrc%2Fdsys%2Fcmd.cpp;fp=src%2F3dengfx%2Fsrc%2Fdsys%2Fcmd.cpp;h=c99ff277ddb376e0b8b4d107cfd3da62851c9540;hb=6e23259dbabaeb1711a2a5ca25b9cb421f693759;hp=0000000000000000000000000000000000000000;hpb=fe068fa879814784c45e0cb2e65dac489e8f5594;p=summerhack diff --git a/src/3dengfx/src/dsys/cmd.cpp b/src/3dengfx/src/dsys/cmd.cpp new file mode 100644 index 0000000..c99ff27 --- /dev/null +++ b/src/3dengfx/src/dsys/cmd.cpp @@ -0,0 +1,171 @@ +/* +This file is part of 3dengfx demosystem. + +Copyright (c) 2004, 2005 John Tsiombikas + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +*/ + +/* demosystem script controlled commands + * + * Author: John Tsiombikas 2005 + */ + +#include +#include "cmd.hpp" +#include "script.h" +#include "dsys.hpp" +#include "part.hpp" +#include "fx.hpp" +#include "common/err_msg.h" + +using namespace dsys; +using namespace cmd; + +// command handler prototypes +static bool start_part(const char *pname, const char **args); +static bool end_part(const char *pname, const char **args); +static bool rename_part(const char *pname, const char **args); +static bool set_render_target(const char *pname, const char **args); +static bool set_clear(const char *pname, const char **args); +static bool end(const char *unused, const char **args); +static bool effect(const char *fxname, const char **args); + +static bool (*ftbl[64])(const char*, const char**); + +void cmd::register_commands() { + ftbl[CMD_START_PART] = start_part; + ftbl[CMD_END_PART] = end_part; + ftbl[CMD_RENAME_PART] = rename_part; + ftbl[CMD_SET_RTARGET] = set_render_target; + ftbl[CMD_SET_CLEAR] = set_clear; + ftbl[CMD_END] = end; + ftbl[CMD_FX] = effect; +} + +bool cmd::command(CommandType cmd_id, const char *pname, const char **args) { + assert(ftbl[cmd_id]); + + return ftbl[cmd_id](pname, args); +} + +static bool start_part(const char *pname, const char **args) { + Part *part = get_part(pname); + if(part) { + info("start_part(%s)", pname); + start_part(part); + return true; + } + return false; +} + +static bool end_part(const char *pname, const char **args) { + Part *part = get_part(pname); + if(part) { + info("end_part(%s)", pname); + stop_part(part); + return true; + } + return false; +} + +static bool rename_part(const char *pname, const char **args) { + Part *part = get_part(pname); + if(part && args[0]) { + info("rename_part(%s, %s)", pname, args[0]); + remove_part(part); + part->set_name(args[0]); + add_part(part); + return true; + } + return false; +} + +static bool set_render_target(const char *pname, const char **args) { + Part *part = get_part(pname); + if(part && args[0]) { + int tnum; + + // check for valid render target specifier (fb, t0, t1, t2, t3) + if(!strcmp(args[0], "fb")) { + tnum = (int)RT_FB; + } else { + if(args[0][0] != 't' || !isdigit(args[0][1]) || args[0][2] || + (tnum = atoi(args[0]+1)) < 0 || tnum > 3) { + return false; + } + } + + info("set_rtarg(%s, %s)", pname, args[0]); + part->set_target((RenderTarget)tnum); + return true; + } + return false; +} + +static bool set_clear(const char *pname, const char **args) { + Part *part = get_part(pname); + if(part && args[0]) { + bool enable; + if(!strcmp(args[0], "true")) { + enable = true; + } else if(!strcmp(args[0], "false")) { + enable = false; + } else { + return false; + } + + info("set_clear(%s, %s)", pname, enable ? "true" : "false"); + part->set_clear(enable); + return true; + } + return false; +} + +static bool end(const char *unused, const char **args) { + if(unused && *unused) return false; + + info("end"); + end_demo(); + return true; +} + +static bool effect(const char *fxname, const char **args) { + ImageFx *fx; + + if(!strcmp(fxname, "neg")) { + fx = new FxNegative; + } else if(!strcmp(fxname, "flash")) { + fx = new FxFlash; + } else if(!strcmp(fxname, "overlay")) { + fx = new FxOverlay; + } else if(!strcmp(fxname, "fade")) { + fx = new FxFade; + } else { + error("unknown effect: %s, ignoring", fxname); + return false; + } + + if(!fx->parse_script_args(args)) { + error("fx(%s): invalid syntax", fxname); + delete fx; + return false; + } + + info("fx(%s)", fxname); + add_image_fx(fx); + + return true; +}