From ca82cd628be4b8d99ecd9ebfd0b66fe853518be4 Mon Sep 17 00:00:00 2001 From: w1z7ard Date: Mon, 30 Jun 2008 03:58:35 +0000 Subject: [PATCH] added warp and comp parameters git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/trunk@1079 6778bc44-b910-0410-a7a0-be141de4315d --- src/projectM-engine/BuiltinParams.cpp | 20 +++- src/projectM-engine/BuiltinParams.hpp | 3 + src/projectM-engine/CustomWave.cpp | 2 +- src/projectM-engine/Eval.hpp | 2 +- src/projectM-engine/Parser.cpp | 139 ++++++++++++++++++++------ src/projectM-engine/Parser.hpp | 13 ++- 6 files changed, 142 insertions(+), 37 deletions(-) diff --git a/src/projectM-engine/BuiltinParams.cpp b/src/projectM-engine/BuiltinParams.cpp index baa14a76c..fc937031a 100644 --- a/src/projectM-engine/BuiltinParams.cpp +++ b/src/projectM-engine/BuiltinParams.cpp @@ -15,11 +15,11 @@ BuiltinParams::BuiltinParams() {} BuiltinParams::BuiltinParams(const PresetInputs & presetInputs, PresetOutputs & presetOutputs) { - int ret; + int ret; if ((ret = init_builtin_param_db(presetInputs, presetOutputs)) != PROJECTM_SUCCESS) { std::cout << "failed to allocate builtin parameter database with error " << ret << std::endl;; - throw ret; + throw ret; } } @@ -193,6 +193,20 @@ std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower); } + +int BuiltinParams::load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags) { + + /* Creates a new parameter of type string */ + Param * param = Param::new_param_string(name.c_str(), flags, engine_val); + + if (insert_builtin_param( param ) < 0) + { + delete param; + return PROJECTM_ERROR; + } + return PROJECTM_SUCCESS; +} + /* Loads a boolean parameter */ int BuiltinParams::load_builtin_param_bool(const std:: string & name, void * engine_val, short int flags, int init_val, const std::string &alt_name) @@ -391,6 +405,8 @@ int BuiltinParams::load_all_builtin_param(const PresetInputs & presetInputs, Pre load_builtin_param_float("q7", (void*)&presetOutputs.q7, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); load_builtin_param_float("q8", (void*)&presetOutputs.q8, NULL, P_FLAG_PER_PIXEL |P_FLAG_QVAR, 0, MAX_DOUBLE_SIZE, -MAX_DOUBLE_SIZE, ""); + //param = Param::new_param_string ( "imageurl", P_FLAG_NONE, &this->imageUrl); + /* variables added in 1.04 */ load_builtin_param_int("meshx", (void*)&presetInputs.gx, P_FLAG_READONLY, 32, 96, 8, ""); load_builtin_param_int("meshy", (void*)&presetInputs.gy, P_FLAG_READONLY, 24, 72, 6, ""); diff --git a/src/projectM-engine/BuiltinParams.hpp b/src/projectM-engine/BuiltinParams.hpp index b0c943e56..2bef58c27 100644 --- a/src/projectM-engine/BuiltinParams.hpp +++ b/src/projectM-engine/BuiltinParams.hpp @@ -63,6 +63,9 @@ public: int lower_bound, const std::string & alt_name ); int load_builtin_param_bool( const std::string & name, void *engine_val, short int flags, int init_val, const std::string & alt_name ); + + int load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags); + int insert_builtin_param( Param *param ); template diff --git a/src/projectM-engine/CustomWave.cpp b/src/projectM-engine/CustomWave.cpp index 5c919ad58..a9931ee5f 100755 --- a/src/projectM-engine/CustomWave.cpp +++ b/src/projectM-engine/CustomWave.cpp @@ -534,7 +534,7 @@ void CustomWave::evalInitConds() ColoredPoint CustomWave::PerPoint(ColoredPoint p, const WaveformContext context) { - r_mesh[context.sample_int] = r; + r_mesh[context.sample_int] = r; g_mesh[context.sample_int] = g; b_mesh[context.sample_int] = b; a_mesh[context.sample_int] = a; diff --git a/src/projectM-engine/Eval.hpp b/src/projectM-engine/Eval.hpp index 6bbe2493f..c59820818 100755 --- a/src/projectM-engine/Eval.hpp +++ b/src/projectM-engine/Eval.hpp @@ -36,7 +36,7 @@ #include "Func.hpp" #include "Param.hpp" -//#define EVAL_DEBUG 2 +#define EVAL_DEBUG 0 //#define EVAL_DEBUG_DOUBLE 2 #define VAL_T 1 diff --git a/src/projectM-engine/Parser.cpp b/src/projectM-engine/Parser.cpp index b73d897bc..d06ac0359 100755 --- a/src/projectM-engine/Parser.cpp +++ b/src/projectM-engine/Parser.cpp @@ -206,12 +206,6 @@ token_t Parser::parseToken(std::istream & fs, char * string) } - // if (fs && fs.get() == '\n') { - // line_mode = UNSET_LINE_MODE; - // return tEOL; - // } else if (fs) - //fs.unget(); - break; } @@ -237,24 +231,11 @@ token_t Parser::parseToken(std::istream & fs, char * string) break; default: - if (string != NULL) - { - /// @bug remove this nonsense - if (c == '\r') - { - std::cerr << "R" << std::endl; - abort(); - } - if (c == '\b') - { - std::cerr << "B" << std::endl; - abort(); - } string[i] = tolower(c); //string[i+1] = 0; //std::cerr << "string is \n\"" << string << "\"" << std::endl; } - } + } @@ -455,13 +436,25 @@ int Parser::parse_line(std::istream & fs, Preset * preset) } else fs.unget(); - // if (z == 2) -// ; - // return PROJECTM_PARSE_ERROR; - //else - // fs.unget(); + /* CASE: WARP CODE */ + if (!strncmp(eqn_string, WARP_STRING, WARP_STRING_LENGTH)) + { + std::cout << "parsing warp string block\n" << std::endl; + parse_string_block(fs, &preset->presetOutputs().shader.warp); + return PROJECTM_SUCCESS; + } + + + /* CASE: COMPOSITE CODE */ + if (!strncmp(eqn_string, COMPOSITE_STRING, COMPOSITE_STRING_LENGTH)) + { + std::cout << "parsing composite string block\n" << std::endl; + parse_string_block(fs, &preset->presetOutputs().shader.composite); + return PROJECTM_SUCCESS; + } + /* CASE: PER FRAME INIT EQUATION */ if (!strncmp(eqn_string, PER_FRAME_INIT_STRING, PER_FRAME_INIT_STRING_LENGTH)) { @@ -1488,7 +1481,7 @@ InitCond * Parser::parse_init_cond(std::istream & fs, char * name, Preset * pre /* At this point, a parameter has been created or was found in the database. */ - if (PARSE_DEBUG) printf("parse_init_cond: parsing initial condition value... (LINE %d)\n", line_count); + if (PARSE_DEBUG) printf("parsed_init_cond: parsing initial condition value... (LINE %d)\n", line_count); /* integer value (boolean is an integer in C) */ if ( (param->type == P_TYPE_BOOL)) @@ -1539,7 +1532,18 @@ InitCond * Parser::parse_init_cond(std::istream & fs, char * name, Preset * pre return init_cond; } -/* Parses a per frame init equation, not sure if this works right now */ + +void Parser::parse_string_block(std::istream & fs, std::string * out_string) { + + char name[MAX_TOKEN_SIZE]; + token_t token; + + readStringUntil(fs, out_string); + + std::cout << "out_string:\n " << *out_string << "\n" << std::endl; + +} + InitCond * Parser::parse_per_frame_init_eqn(std::istream & fs, Preset * preset, std::map * database) { @@ -1636,6 +1640,83 @@ InitCond * Parser::parse_per_frame_init_eqn(std::istream & fs, Preset * preset, return init_cond; } + +void Parser::readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround) { + + int string_line_buffer_index = 0; + char c; + + + /* Loop until a delimiter is found, or the maximum string size is found */ + while (true) + { + + if (!fs || fs.eof()) + c = EOF; + else + c = fs.get(); + + /* Now interpret the character */ + switch (c) + { + case '\n': + line_count++; + if (wrapAround) + { + std::ostringstream buffer; + + // if (PARSE_DEBUG) std::cerr << "token wrap! line " << line_count << std::endl; + while (c != '=') + { + + if (!fs || fs.eof()) + { + line_count = 1; + line_mode = UNSET_LINE_MODE; + // if (PARSE_DEBUG) std::cerr << "token wrap: end of file" << std::endl; + return; + } + + else { + c = fs.get(); + if ( c != '=') + buffer << c; + } + + } + + + if (!wrapsToNextLine(buffer.str())) { + wrapAround = false; + int buf_size = (int)buffer.str().length(); + // <= to also remove equal sign parsing from stream + for (int k = 0; k <= buf_size; k++) { + if (fs) + fs.unget(); + else + abort(); + } + return; + } + + break; + } + return; + case EOF: + line_count = 1; + return; + default: + + if (out_buffer != NULL) + { + out_buffer->push_back(c); + } + } + + } + + +} int Parser::parse_wavecode(char * token, std::istream & fs, Preset * preset) { @@ -2090,10 +2171,6 @@ int Parser::parse_wave_helper(std::istream & fs, Preset * preset, int id, char /* Insert the equation in the per frame equation tree */ custom_wave->per_frame_init_eqn_tree.insert(std::make_pair(init_cond->param->name,init_cond)); - { - if (PARSE_DEBUG) printf("parse_wave_helper: failed to update string buffer (LINE %d)\n", line_count); - return PROJECTM_FAILURE; - } line_mode = CUSTOM_WAVE_PER_FRAME_INIT_LINE_MODE; init_cond->evaluate(true); return PROJECTM_SUCCESS; diff --git a/src/projectM-engine/Parser.hpp b/src/projectM-engine/Parser.hpp index 80996d24f..9d299f437 100755 --- a/src/projectM-engine/Parser.hpp +++ b/src/projectM-engine/Parser.hpp @@ -28,8 +28,8 @@ #ifndef _PARSER_H #define _PARSER_H +//#define PARSE_DEBUG 2 #define PARSE_DEBUG 0 -//#define PARSE_DEBUG 0 #include @@ -63,6 +63,13 @@ #define SHAPECODE_STRING "shapecode_" #define SHAPECODE_STRING_LENGTH 10 + +#define WARP_STRING "warp_" +#define WARP_STRING_LENGTH 5 + +#define COMPOSITE_STRING "comp_" +#define COMPOSITE_STRING_LENGTH 5 + #define SHAPE_STRING "shape_" #define SHAPE_STRING_LENGTH 6 @@ -166,10 +173,12 @@ public: static int parse_shapecode(char * eqn_string, std::istream & fs, Preset * preset); static int parse_shapecode_prefix(char * token, int * id, char ** var_string); + static void parse_string_block(std::istream & fs, std::string * out_string); + static int parse_wave(char * eqn_string, std::istream & fs, Preset * preset); static int parse_shape(char * eqn_string, std::istream & fs, Preset * preset); static int parse_shape_prefix(char * token, int * id, char ** eqn_string); - + static void readStringUntil(std::istream & fs, std::string * out_buffer, bool wrapAround = true) ; static int update_string_buffer(char * buffer, int * index); static int string_to_float(char * string, float * float_ptr); static int parse_shape_per_frame_init_eqn(std::istream & fs, CustomShape * custom_shape, Preset * preset);