1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
/**
* projectM -- Milkdrop-esque visualisation SDK
* Copyright (C)2003-2007 projectM Team
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library 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
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
* See 'LICENSE.txt' included within this release
*
*/
/**
* $Id$
*
* Parameter used within a preset
*
* $Log$
*/
#ifndef _PARAM_H
#define _PARAM_H
/* Debug level, zero for none */
#define PARAM_DEBUG 0
#define P_CREATE 1
#define P_NONE 0
#define P_TYPE_BOOL 0
#define P_TYPE_INT 1
#define P_TYPE_DOUBLE 2
#define P_TYPE_STRING 3
#define P_FLAG_NONE 0
#define P_FLAG_READONLY 1
#define P_FLAG_USERDEF (1 << 1)
#define P_FLAG_QVAR (1 << 2)
#define P_FLAG_TVAR (1 << 3)
#define P_FLAG_ALWAYS_MATRIX (1 << 4)
#define P_FLAG_PER_PIXEL (1 << 6)
#define P_FLAG_PER_POINT (1 << 7)
#include "Expr.hpp"
#include "Common.hpp"
#include <cmath>
#include <string>
class InitCond;
class Param;
class Preset;
//#include <map>
/* Parameter Type */
class Param {
public:
std::string name; /* name of the parameter, not necessary but useful neverthless */
short int type; /* parameter number type (int, bool, or float) */
short int flags; /* read, write, user defined, etc */
short int matrix_flag; /* for optimization purposes */
void * engine_val; /* pointer to the engine variable */
void * matrix; /* per pixel / per point matrix for this variable */
CValue default_init_val; /* a default initial condition value */
CValue upper_bound; /* this parameter's upper bound */
CValue lower_bound; /* this parameter's lower bound */
/// Create a new parameter
Param(std::string name, short int type, short int flags,
void * eqn_val, void *matrix,
CValue default_init_val, CValue upper_bound,
CValue lower_bound);
~Param();
/// Create a user defined floating point parameter
Param( std::string name );
static bool is_valid_param_string( const char *string );
void set_param( float val );
static Param *new_param_float( const char *name, short int flags, void *engine_val,
void *matrix, float upper_bound,
float lower_bound,
float init_val );
static Param *new_param_double(const char *name, short int flags, void *engine_val,
void *matrix, double upper_bound,
double lower_bound,
double init_val );
static Param * new_param_int(const char * name, short int flags, void * engine_val,
int upper_bound, int lower_bound, int init_val );
static Param * new_param_bool(const char * name, short int flags, void * engine_val,
bool upper_bound, bool lower_bound, bool init_val );
static Param * new_param_string(const char * name, short int flags, void * engine_val);
};
/* Sets the parameter engine value to value val.
clipping occurs if necessary */
inline void Param::set_param( float val) {
switch (type) {
case P_TYPE_BOOL:
if (val < 0)
*((bool*)engine_val) = false;
else if (val > 0)
*((bool*)engine_val) = true;
else
*((bool*)engine_val) = false;
break;
case P_TYPE_INT:
/* Make sure value is an integer */
val = floor(val);
if (val < lower_bound.int_val)
*((int*)engine_val) = lower_bound.int_val;
else if (val > upper_bound.int_val)
*((int*)engine_val) = upper_bound.int_val;
else
*((int*)engine_val) = (int)val;
break;
case P_TYPE_DOUBLE:
/* Make sure value is an integer */
if (val < lower_bound.float_val)
*((float*)engine_val) = lower_bound.float_val;
else if (val > upper_bound.float_val)
*((float*)engine_val) = upper_bound.float_val;
else
*((float*)engine_val) = val;
break;
default:
abort();
break;
}
return;
}
#endif /** !_PARAM_TYPES_H */
|