nuclear@0: #ifndef UNISTATE_H_ nuclear@0: #define UNISTATE_H_ nuclear@0: nuclear@0: #include "vmath/vmath.h" nuclear@0: nuclear@0: class ShaderProg; nuclear@0: nuclear@0: enum StType { nuclear@0: ST_UNKNOWN, nuclear@0: ST_INT, ST_INT2, ST_INT3, ST_INT4, nuclear@0: ST_FLOAT, ST_FLOAT2, ST_FLOAT3, ST_FLOAT4, nuclear@0: ST_MATRIX3, ST_MATRIX4 nuclear@0: }; nuclear@0: nuclear@0: int add_unistate(const char *name, StType type); nuclear@0: int get_unistate_index(const char *name); nuclear@0: nuclear@0: /** set the uniform state identified by \param sidx by copying nuclear@0: * a number of elements from \param val. If \param count is 0 nuclear@0: * then it's automatically set based on the type of this state item. nuclear@0: * @{ */ nuclear@0: void set_unistate(int sidx, const int *val, int count = 0); nuclear@0: void set_unistate(int sidx, const float *val, int count = 0); nuclear@0: /// @} nuclear@0: nuclear@0: /** get the uniform state identified by \param sidx by copying nuclear@0: * a number of elements into \param val. If \param count is 0 nuclear@0: * then it's automatically set based on the type of this state item. nuclear@0: * @{ */ nuclear@0: void get_unistate(int sidx, int *val, int count = 0); nuclear@0: void get_unistate(int sidx, float *val, int count = 0); nuclear@0: /// @} nuclear@0: nuclear@0: /// convenience versions of set_unistate @{ nuclear@0: void set_unistate(int sidx, int val); nuclear@0: void set_unistate(int sidx, float val); nuclear@0: void set_unistate(int sidx, const Vector2 &vec); nuclear@0: void set_unistate(int sidx, const Vector3 &vec); nuclear@0: void set_unistate(int sidx, const Vector4 &vec); nuclear@0: void set_unistate(int sidx, const Matrix3x3 &mat); nuclear@0: void set_unistate(int sidx, const Matrix4x4 &mat); nuclear@0: /// @} nuclear@0: nuclear@0: /** convenience functions for setting the uniform state by name. nuclear@0: * if the name cannot be found in the current set of uniform state nuclear@0: * items, a new one is created with a type derived from the variant nuclear@0: * of the function that was called (which might not be what you want). nuclear@0: * The index of the state item is returned. nuclear@0: * @{ */ nuclear@0: int set_unistate(const char *name, int *val, int count = 0); nuclear@0: int set_unistate(const char *name, float *val, int count = 0); nuclear@0: int set_unistate(const char *name, int val); nuclear@0: int set_unistate(const char *name, float val); nuclear@0: int set_unistate(const char *name, const Vector2 &vec); nuclear@0: int set_unistate(const char *name, const Vector3 &vec); nuclear@0: int set_unistate(const char *name, const Vector4 &vec); nuclear@0: int set_unistate(const char *name, const Matrix3x3 &mat); nuclear@0: int set_unistate(const char *name, const Matrix4x4 &mat); nuclear@0: /// @} nuclear@0: nuclear@0: /// convenience versions of get_unistate @{ nuclear@0: int get_unistate_int(int sidx); nuclear@0: float get_unistate_float(int sidx); nuclear@0: Vector2 get_unistate_vec2(int sidx); nuclear@0: Vector3 get_unistate_vec3(int sidx); nuclear@0: Vector4 get_unistate_vec4(int sidx); nuclear@0: Matrix3x3 get_unistate_mat3(int sidx); nuclear@0: Matrix4x4 get_unistate_mat4(int sidx); nuclear@0: /// @} nuclear@0: nuclear@0: /// convenience versions of get_unistate for getting the uniform state by name @{ nuclear@0: int get_unistate_int(const char *name); nuclear@0: float get_unistate_float(const char *name); nuclear@0: Vector2 get_unistate_vec2(const char *name); nuclear@0: Vector3 get_unistate_vec3(const char *name); nuclear@0: Vector4 get_unistate_vec4(const char *name); nuclear@0: Matrix3x3 get_unistate_mat3(const char *name); nuclear@0: Matrix4x4 get_unistate_mat4(const char *name); nuclear@0: /// @} nuclear@0: nuclear@0: /** Prepare for rendering by setting up all the state uniforms in the shader sdr. nuclear@0: * If sdr is null, then use the "current" shader as per ShaderProg::current nuclear@0: */ nuclear@0: void setup_unistate(const ShaderProg *sdr = 0); nuclear@0: nuclear@0: bool setup_unistate(int sidx, const ShaderProg *sdr, int loc); nuclear@0: bool setup_unistate(const char *name, const ShaderProg *sdr); nuclear@0: nuclear@0: // special functions for setting the rendering pipeline matrices nuclear@0: void set_world_matrix(const Matrix4x4 &mat); nuclear@0: void set_view_matrix(const Matrix4x4 &mat); nuclear@0: void set_projection_matrix(const Matrix4x4 &mat); nuclear@0: void set_texture_matrix(const Matrix4x4 &mat); nuclear@0: nuclear@0: Matrix4x4 get_world_matrix(); nuclear@0: Matrix4x4 get_view_matrix(); nuclear@0: Matrix4x4 get_projection_matrix(); nuclear@0: Matrix4x4 get_texture_matrix(); nuclear@0: nuclear@0: void setup_gl_matrices(); // this shouldn't be needed in the final code nuclear@0: nuclear@0: // TODO should do a matrix stack at some point ... nuclear@0: nuclear@0: #endif // UNISTATE_H_