mirror of
https://github.com/projectM-visualizer/projectm.git
synced 2026-03-30 03:03:53 +00:00
Merge pull request #61 from mbellew/parameterexpr_cleanup
ParameterExpr cleanup
This commit is contained in:
@ -104,7 +104,7 @@ protected:
|
||||
Term term;
|
||||
public:
|
||||
ParameterExpr( int _type, Term *_term ) : Expr(PARAMETER), term(*_term) {}
|
||||
float eval(int mesh_i, int mesh_j );
|
||||
float eval(int mesh_i, int mesh_j ) = 0;
|
||||
std::ostream& to_string(std::ostream& out)
|
||||
{
|
||||
out << term.param->name;
|
||||
@ -116,56 +116,57 @@ class BoolParameterExpr : public ParameterExpr
|
||||
{
|
||||
public:
|
||||
BoolParameterExpr( int _type, Term *_term ) : ParameterExpr(_type,_term) {}
|
||||
float eval ( int mesh_i, int mesh_j ) { return ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) ); }
|
||||
float eval ( int mesh_i, int mesh_j )
|
||||
{
|
||||
assert( term.param->type == P_TYPE_BOOL );
|
||||
return ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) );
|
||||
}
|
||||
};
|
||||
class IntParameterExpr : public ParameterExpr
|
||||
{
|
||||
public:
|
||||
IntParameterExpr( int _type, Term *_term ) : ParameterExpr(_type,_term) {}
|
||||
float eval ( int mesh_i, int mesh_j ) { return ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) ); }
|
||||
float eval ( int mesh_i, int mesh_j )
|
||||
{
|
||||
assert( term.param->type == P_TYPE_INT );
|
||||
return ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) );
|
||||
}
|
||||
};
|
||||
class FloatParameterExpr : public ParameterExpr
|
||||
{
|
||||
public:
|
||||
FloatParameterExpr( int _type, Term *_term ) : ParameterExpr(_type,_term) {}
|
||||
float eval ( int mesh_i, int mesh_j ) { return ( * ( ( float* ) ( term.param->engine_val ) ) ); }
|
||||
float eval ( int mesh_i, int mesh_j );
|
||||
};
|
||||
|
||||
/* Evaluates a value expression */
|
||||
float ParameterExpr::eval ( int mesh_i, int mesh_j )
|
||||
/* TODO optimize FloatParameterExpr::eval() further.
|
||||
// - flag "never matrix" parameters
|
||||
// - always pass in 2d matrix. instead of using (i, -1) for 1d matrix, we could just use (0, i) and avoid check
|
||||
// - instead of using matrix_flag to give "copy on write" behavior, maybe pre-copy from engine_val to matrix[]
|
||||
*/
|
||||
float FloatParameterExpr::eval ( int mesh_i, int mesh_j )
|
||||
{
|
||||
switch ( term.param->type )
|
||||
assert( term.param->type == P_TYPE_DOUBLE );
|
||||
if ( term.param->matrix_flag | ( term.param->flags & P_FLAG_ALWAYS_MATRIX ) )
|
||||
{
|
||||
case P_TYPE_BOOL:
|
||||
return ( float ) ( * ( ( bool* ) ( term.param->engine_val ) ) );
|
||||
case P_TYPE_INT:
|
||||
return ( float ) ( * ( ( int* ) ( term.param->engine_val ) ) );
|
||||
case P_TYPE_DOUBLE:
|
||||
if ( term.param->matrix_flag | ( term.param->flags & P_FLAG_ALWAYS_MATRIX ) )
|
||||
/* Sanity check the matrix is there... */
|
||||
assert ( term.param->matrix != NULL );
|
||||
|
||||
/// @slow boolean check could be expensive in this critical (and common) step of evaluation
|
||||
if ( mesh_i >= 0 )
|
||||
{
|
||||
if ( mesh_j >= 0 )
|
||||
{
|
||||
|
||||
/* Sanity check the matrix is there... */
|
||||
assert ( term.param->matrix != NULL );
|
||||
|
||||
/// @slow boolean check could be expensive in this critical (and common) step of evaluation
|
||||
if ( mesh_i >= 0 )
|
||||
{
|
||||
if ( mesh_j >= 0 )
|
||||
{
|
||||
return ( ( ( float** ) term.param->matrix ) [mesh_i][mesh_j] );
|
||||
}
|
||||
else
|
||||
{
|
||||
return ( ( ( float* ) term.param->matrix ) [mesh_i] );
|
||||
}
|
||||
}
|
||||
//assert(mesh_i >=0);
|
||||
return ( ( ( float** ) term.param->matrix ) [mesh_i][mesh_j] );
|
||||
}
|
||||
//std::cout << term.param->name << ": " << (*((float*)term.param->engine_val)) << std::endl;
|
||||
return * ( ( float* ) ( term.param->engine_val ) );
|
||||
default:
|
||||
return EVAL_ERROR;
|
||||
else
|
||||
{
|
||||
return ( ( ( float* ) term.param->matrix ) [mesh_i] );
|
||||
}
|
||||
}
|
||||
//assert(mesh_i >=0);
|
||||
}
|
||||
//std::cout << term.param->name << ": " << (*((float*)term.param->engine_val)) << std::endl;
|
||||
return * ( ( float* ) ( term.param->engine_val ) );
|
||||
}
|
||||
|
||||
|
||||
@ -375,9 +376,6 @@ Expr * Expr::param_to_expr ( Param * param )
|
||||
case P_TYPE_INT:
|
||||
return new IntParameterExpr( PARAM_TERM_T, &term );
|
||||
case P_TYPE_DOUBLE:
|
||||
// TODO are these flags constant??? can I check them now?
|
||||
if ( param->matrix_flag | ( param->flags & P_FLAG_ALWAYS_MATRIX ) )
|
||||
return new ParameterExpr( PARAM_TERM_T, &term );
|
||||
return new FloatParameterExpr( PARAM_TERM_T, &term );
|
||||
}
|
||||
return NULL;
|
||||
|
||||
@ -188,21 +188,23 @@ void projectMSDL::resize(unsigned int width_, unsigned int height_) {
|
||||
void projectMSDL::pollEvent() {
|
||||
SDL_Event evt;
|
||||
|
||||
SDL_PollEvent(&evt);
|
||||
switch (evt.type) {
|
||||
case SDL_WINDOWEVENT:
|
||||
switch (evt.window.event) {
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
resize(evt.window.data1, evt.window.data2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
keyHandler(&evt);
|
||||
break;
|
||||
case SDL_QUIT:
|
||||
done = true;
|
||||
break;
|
||||
while (SDL_PollEvent(&evt))
|
||||
{
|
||||
switch (evt.type) {
|
||||
case SDL_WINDOWEVENT:
|
||||
switch (evt.window.event) {
|
||||
case SDL_WINDOWEVENT_RESIZED:
|
||||
resize(evt.window.data1, evt.window.data2);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_KEYDOWN:
|
||||
keyHandler(&evt);
|
||||
break;
|
||||
case SDL_QUIT:
|
||||
done = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user