300 lines
13 KiB
C++
300 lines
13 KiB
C++
/**
|
|
* @author Edouard DUPIN
|
|
*
|
|
* @copyright 2011, Edouard DUPIN, all right reserved
|
|
*
|
|
* @license BSD v3 (see license file)
|
|
*/
|
|
|
|
#ifndef __EWOL_COMPOSITING_SHAPER_H__
|
|
#define __EWOL_COMPOSITING_SHAPER_H__
|
|
|
|
#include <ewol/debug.h>
|
|
#include <ewol/compositing/Compositing.h>
|
|
#include <ewol/resource/Program.h>
|
|
#include <ewol/resource/ConfigFile.h>
|
|
#include <ewol/resource/ColorFile.h>
|
|
#include <ewol/resource/Image.h>
|
|
#include <ewol/event/Time.h>
|
|
#include <ewol/Padding.h>
|
|
|
|
namespace ewol {
|
|
namespace compositing {
|
|
enum renderMode {
|
|
renderSingleSquare, //!< basic historic render mode
|
|
renderBorder, //!< Render 4 squares for coiner, and renctangle for border, a big rentangle for background and 8 rectangle for the outside part
|
|
renderOneBorder,
|
|
};
|
|
#define SHAPER_NB_MAX_QUAD (5*5)
|
|
#define SHAPER_NB_MAX_TRIANGLE (SHAPER_NB_MAX_QUAD*2)
|
|
#define SHAPER_NB_MAX_VERTEX (SHAPER_NB_MAX_TRIANGLE*3)
|
|
enum shaperPos {
|
|
shaperPosLeft,
|
|
shaperPosRight,
|
|
shaperPosTop,
|
|
shaperPosButtom,
|
|
shaperPosCount,
|
|
};
|
|
/**
|
|
* @brief the Shaper system is a basic theme configuration for every widget, it corespond at a background display described by a pool of files
|
|
*/
|
|
// TODO : load image
|
|
// TODO : Abstaraction between states (call by name and the system greate IDs
|
|
class Shaper : public ewol::Compositing {
|
|
private:
|
|
std::string m_name; //!< Name of the configuration of the shaper.
|
|
// External theme config:
|
|
ewol::object::Shared<ewol::resource::ConfigFile> m_config; //!< pointer on the config file resources
|
|
int32_t m_confIdDisplayExternal; //!< Display external border
|
|
int32_t m_confIdPaddingOut[shaperPosCount]; //!< Padding out property : X-left X-right Y-top Y-buttom
|
|
int32_t m_confIdBorder[shaperPosCount]; //!< border property : X-left X-right Y-top Y-buttom
|
|
int32_t m_confIdPaddingIn[shaperPosCount]; //!< Padding in property : X-left X-right Y-top Y-buttom
|
|
int32_t m_confIdMode; //!< Display mode
|
|
int32_t m_confIdDisplayOutside; //!< Display outside of the shape...
|
|
int32_t m_confIdChangeTime; //!< ConfigFile padding transition time property
|
|
int32_t m_confProgramFile; //!< ConfigFile opengGl program Name
|
|
int32_t m_confColorFile; //!< ConfigFile opengGl color file Name
|
|
int32_t m_confImageFile; //!< ConfigFile opengGl program Name
|
|
// openGL shaders programs:
|
|
ewol::object::Shared<ewol::resource::Program> m_GLprogram; //!< pointer on the opengl display program
|
|
int32_t m_GLPosition; //!< openGL id on the element (vertex buffer)
|
|
int32_t m_GLMatrix; //!< openGL id on the element (transformation matrix)
|
|
int32_t m_GLPropertyPos; //!< openGL id on the element (simple ratio position in the widget : ____/-----\_____ on vec2(X,Y))
|
|
int32_t m_GLStateActivate; //!< openGL id on the element (activate state displayed)
|
|
int32_t m_GLStateOld; //!< openGL id on the element (old state displayed)
|
|
int32_t m_GLStateNew; //!< openGL id on the element (new state displayed)
|
|
int32_t m_GLStateTransition; //!< openGL id on the element (transition ofset [0.0..1.0] )
|
|
int32_t m_GLtexID; //!< openGL id on the element (texture image)
|
|
// For the Image :
|
|
ewol::object::Shared<ewol::resource::TextureFile> m_resourceTexture; //!< texture resources (for the image)
|
|
// internal needed data :
|
|
int32_t m_nextStatusRequested; //!< when status is changing, this represent the next step of it
|
|
vec2 m_propertyOrigin; //!< widget origin
|
|
vec2 m_propertySize; //!< widget size
|
|
vec2 m_propertyInsidePosition; //!< internal subwidget position
|
|
vec2 m_propertyInsideSize; //!< internal subwidget size
|
|
int32_t m_stateActivate; //!< Activate state of the element
|
|
int32_t m_stateOld; //!< previous state
|
|
int32_t m_stateNew; //!< destination state
|
|
float m_stateTransition; //!< working state between 2 states
|
|
vec2 m_coord[SHAPER_NB_MAX_VERTEX]; //!< coordonate of the display ...
|
|
vec2 m_pos[SHAPER_NB_MAX_VERTEX]; //!< podition to display property
|
|
int32_t m_nbVertexToDisplay;
|
|
// color management theme:
|
|
ewol::object::Shared<ewol::resource::ColorFile> m_colorProperty; //!< input resource for color management
|
|
std::vector<ivec2> m_listAssiciatedId; //!< Corellation ID between ColorProperty (Y) and OpenGL Program (X)
|
|
private:
|
|
/**
|
|
* @brief load the openGL program and get all the ID needed
|
|
*/
|
|
void loadProgram();
|
|
/**
|
|
* @brief Un-Load the openGL program and get all the ID needed
|
|
*/
|
|
void unLoadProgram();
|
|
public:
|
|
/**
|
|
* @brief generic constructor
|
|
* @param[in] _shaperName Name of the file that might be loaded
|
|
*/
|
|
Shaper(const std::string& _shaperName="");
|
|
/**
|
|
* @brief generic destructor
|
|
*/
|
|
~Shaper();
|
|
public:
|
|
/**
|
|
* @brief draw All the refistered text in the current element on openGL
|
|
*/
|
|
void draw(bool _disableDepthTest=true);
|
|
/**
|
|
* @brief clear alll tre registered element in the current element
|
|
*/
|
|
void clear();
|
|
/**
|
|
* @brief change the current status in an other
|
|
* @param[in] _newStatusId the next new status requested
|
|
* @return true The widget must call this fuction periodicly (and redraw itself)
|
|
* @return false No need to request the periodic call.
|
|
*/
|
|
bool changeStatusIn(int32_t _newStatusId);
|
|
/**
|
|
* @brief get the current displayed status of the shaper
|
|
* @return The Status Id
|
|
*/
|
|
int32_t getCurrentDisplayedStatus() {
|
|
return m_stateNew;
|
|
};
|
|
/**
|
|
* @brief get the next displayed status of the shaper
|
|
* @return The next status Id (-1 if no status in next)
|
|
*/
|
|
int32_t getNextDisplayedStatus() {
|
|
return m_nextStatusRequested;
|
|
};
|
|
/**
|
|
* @brief get the current trasion status
|
|
* @return value of the transition status (0.0f when no activity)
|
|
*/
|
|
float getTransitionStatus() {
|
|
return m_stateTransition;
|
|
};
|
|
/**
|
|
* @brief Same as the widfget periodic call (this is for change display)
|
|
* @param[in] _event The current time of the call.
|
|
* @return true The widget must call this fuction periodicly (and redraw itself)
|
|
* @return false No need to request the periodic call.
|
|
*/
|
|
bool periodicCall(const ewol::event::Time& _event);
|
|
/**
|
|
* @brief get the padding declared by the user in the config file
|
|
* @return the padding property
|
|
*/
|
|
ewol::Padding getPadding();
|
|
ewol::Padding getPaddingIn();
|
|
ewol::Padding getPaddingOut();
|
|
/**
|
|
* @brief get the padding declared by the user in the config file
|
|
* @return the padding property
|
|
*/
|
|
ewol::Padding getBorder();
|
|
/**
|
|
* @brief change the shaper Source
|
|
* @param[in] _newFile New file of the shaper
|
|
*/
|
|
void setSource(const std::string& _newFile);
|
|
/**
|
|
* @brief get the shaper file Source
|
|
* @return the shapper file name
|
|
*/
|
|
const std::string& getSource() const {
|
|
return m_name;
|
|
};
|
|
/**
|
|
* @brief Sometimes the user declare an image but not allocate the ressources all the time, this is to know it ..
|
|
* @return the validity od the resources.
|
|
*/
|
|
bool hasSources();
|
|
public:
|
|
/**
|
|
* @brief set the shape property:
|
|
*
|
|
* ********************************************************************************
|
|
* * _size *
|
|
* * *
|
|
* * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *
|
|
* * *
|
|
* * | | *
|
|
* * *************************************************** *
|
|
* * | * * | *
|
|
* * * * *
|
|
* * | * * - - - - - - - - - - - - - - - - - - * * | *
|
|
* * * _insideSize * *
|
|
* * | * | | * | *
|
|
* * * * *
|
|
* * | * | | * | *
|
|
* * * * *
|
|
* * | * | | * | *
|
|
* * * * *
|
|
* * | * | | * | *
|
|
* * * * *
|
|
* * | * | | * | *
|
|
* * * * *
|
|
* * | * | | * | *
|
|
* * * _insidePos * *
|
|
* * | * * - - - - - - - - - - - - - - - - - - * * | *
|
|
* * * * *
|
|
* * | *************************************************** | *
|
|
* * *
|
|
* * | | *
|
|
* * *
|
|
* * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - * *
|
|
* * *
|
|
* * *
|
|
* ********************************************************************************
|
|
* _origin
|
|
*
|
|
*
|
|
* @param[in] _origin Origin of the display
|
|
* @param[in] _size Size of the display
|
|
* @param[in] _insidePos Positin of the internal data
|
|
* @param[in] _insideSize Size of the internal data
|
|
*/
|
|
void setShape(const vec2& _origin, const vec2& _size, const vec2& _insidePos, const vec2& _insideSize);
|
|
// @previous
|
|
void setShape(const vec2& _origin, const vec2& _size) {
|
|
ewol::Padding tmp = getPadding();
|
|
setShape(_origin, _size, _origin+vec2(tmp.xLeft(), tmp.yButtom()), _size - vec2(tmp.x(), tmp.y()));
|
|
}
|
|
public:
|
|
/**
|
|
* @brief Get an ID on the color instance element
|
|
* @param[in] _name Name of the element requested
|
|
* @return The Id of the color
|
|
*/
|
|
int32_t requestColor(const std::string& _name) {
|
|
if (m_colorProperty == nullptr) {
|
|
return -1;
|
|
}
|
|
return m_colorProperty->request(_name);
|
|
}
|
|
/**
|
|
* @brief Get The color associated at an ID.
|
|
* @param[in] _id Id of the color
|
|
* @return the reference on the color
|
|
*/
|
|
const etk::Color<float>& getColor(int32_t _id);
|
|
public:
|
|
/**
|
|
* @brief Get an ID on the configuration instance element
|
|
* @param[in] _name Name of the element requested
|
|
* @return The Id of the element
|
|
*/
|
|
int32_t requestConfig(const std::string& _name) {
|
|
if (m_config == nullptr) {
|
|
return -1;
|
|
}
|
|
return m_config->request(_name);
|
|
}
|
|
/**
|
|
* @brief Get The number associated at an ID.
|
|
* @param[in] _id Id of the parameter
|
|
* @return the requested number.
|
|
*/
|
|
double getConfigNumber(int32_t _id) {
|
|
if ( _id == -1
|
|
|| m_config == nullptr) {
|
|
return 0.0;
|
|
}
|
|
return m_config->getNumber(_id);
|
|
}
|
|
public:
|
|
/**
|
|
* @brief Set activate state of the element
|
|
* @param[in] _status New activate status
|
|
*/
|
|
void setActivateState(int32_t _status) {
|
|
m_stateActivate = _status;
|
|
}
|
|
private:
|
|
void addVertexLine(float _yTop,
|
|
float _yButtom,
|
|
float _x1,
|
|
float _x2,
|
|
float _x3,
|
|
float _x4,
|
|
float _x5,
|
|
float _x6,
|
|
float _x7,
|
|
float _x8,
|
|
float _yValTop,
|
|
float _yValButtom,
|
|
const float* _table,
|
|
bool _displayOutside);
|
|
};
|
|
};
|
|
};
|
|
|
|
#endif
|
|
|