/*
* Copyright 2010 Inalogic® Inc.
*
* This program 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 or 3.0
* of the License.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranties of
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the applicable version of the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of both the GNU Lesser General Public
* License along with this program. If not, see
*
* Authored by: Jay Taoko
*
*/
#ifndef RENDERINGPIPE_H
#define RENDERINGPIPE_H
#include "GLResource.h"
namespace nux
{
//! Graphics wraping modes
/*!
Defines the wraping modes of TexCoordXForm.
The values are matched to OpenGL wraping modes.
@sa TexCoordXForm.
*/
typedef enum
{
TEXWRAP_UNKNOWN = 0,
TEXWRAP_REPEAT,
TEXWRAP_CLAMP,
TEXWRAP_CLAMP_TO_EDGE,
TEXWRAP_CLAMP_TO_BORDER,
TEXWRAP_MIRRORED_REPEAT,
TEXWRAP_MIRROR_CLAMP_EXT,
TEXWRAP_MIRROR_CLAMP_TO_EDGE_EXT,
TEXWRAP_MIRROR_CLAMP_TO_BORDER_EXT,
} TexWrap;
//! Graphics filtering modes
/*!
Defines the filtering modes of TexCoordXForm.
The values are matched to openGL filtering modes.
@sa TexCoordXForm.
*/
typedef enum
{
TEXFILTER_UNKNOWN = 0,
TEXFILTER_LINEAR,
TEXFILTER_NEAREST,
TEXFILTER_NEAREST_MIPMAP_NEAREST,
TEXFILTER_LINEAR_MIPMAP_NEAREST,
TEXFILTER_NEAREST_MIPMAP_LINEAR,
TEXFILTER_LINEAR_MIPMAP_LINEAR,
} TexFilter;
//! Graphics blend modes
/*!
Defines the blending modes.
The values are matched to openGL blending modes.
*/
typedef enum
{
ROPBLEND_UNKNOWN = 0,
ROPBLEND_ZERO,
ROPBLEND_ONE,
ROPBLEND_SRC_COLOR,
ROPBLEND_ONE_MINUS_SRC_COLOR,
ROPBLEND_DST_COLOR,
ROPBLEND_ONE_MINUS_DST_COLOR,
ROPBLEND_SRC_ALPHA,
ROPBLEND_ONE_MINUS_SRC_ALPHA,
ROPBLEND_DST_ALPHA,
ROPBLEND_ONE_MINUS_DST_ALPHA,
ROPBLEND_CONSTANT_COLOR,
ROPBLEND_ONE_MINUS_CONSTANT_COLOR,
ROPBLEND_CONSTANT_ALPHA,
ROPBLEND_ONE_MINUS_CONSTANT_ALPHA,
ROPBLEND_SRC_ALPHA_SATURATE,
} RopBlend;
//! Texture parameter and coordinate computation class.
/*!
Defines the texture coordinate computation, wrapping and filtering modes
*/
class TexCoordXForm
{
public:
//! Texture coordinates computation mode
typedef enum
{
OFFSET_SCALE_COORD, //!< Texture coordinates are scaled and offset.
OFFSET_COORD, //!< Textures coordinates are offset. The scaling factor between the texture size and the quad size is preserved.
NORMALIZED_COORD, //!< Provided normalized texture coordinates in u0, v0, u1, v1
UNNORMALIZED_COORD, //!< Provided un-normalized texture coordinates in u0, v0, u1, v1
FIXED_COORD, //!< Provided fix coordinates in u0, v0, u1, v1
} TexCoordType;
TexCoordXForm();
void SetTexCoordType(TexCoordType tex_coord_type);
void FlipUCoord(bool b);
void FlipVCoord(bool b);
void FlipUVCoord(bool flip_u, bool flip_v);
void SetFilter(TexFilter min_fliter, TexFilter mag_filter);
void SetWrap(TexWrap u_wrap, TexWrap v_wrap);
//! Texture coordinates are computed automatically by following the TexCoordType policy or provided by the user
float u0, v0, u1, v1;
float uscale;
float vscale;
float uoffset;
float voffset;
TexWrap uwrap;
TexWrap vwrap;
TexFilter min_filter;
TexFilter mag_filter;
bool flip_u_coord;
bool flip_v_coord;
TexCoordType m_tex_coord_type;
};
//! Compute texture coordinates and wrapping mode according to TexCoordXForm
/*!
@param quad_width Quad width.
@param quad_height Quad height.
@param tex Device texture.
@param texxform Texture coordinates computation mode.
*/
void QRP_Compute_Texture_Coord(int quad_width, int quad_height, ObjectPtr tex, TexCoordXForm &texxform);
}
#endif // RENDERINGPIPE_H