123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504 |
- #ifndef __CCGLPROGRAMSTATE_H__
- #define __CCGLPROGRAMSTATE_H__
- #include <unordered_map>
- #include "base/ccTypes.h"
- #include "base/CCVector.h"
- #include "math/Vec2.h"
- #include "math/Vec3.h"
- #include "math/Vec4.h"
- NS_CC_BEGIN
- class GLProgram;
- class Texture2D;
- struct Uniform;
- struct VertexAttrib;
- class EventListenerCustom;
- class EventCustom;
- class Node;
- class CC_DLL UniformValue
- {
- friend class GLProgram;
- friend class GLProgramState;
- public:
-
- UniformValue();
-
- UniformValue(Uniform *uniform, GLProgram* glprogram);
- UniformValue(const UniformValue& o);
-
- ~UniformValue();
-
- void setFloat(float value);
- void setInt(int value);
- void setFloatv(ssize_t size, const float* pointer);
- void setVec2(const Vec2& value);
- void setVec2v(ssize_t size, const Vec2* pointer);
- void setVec3(const Vec3& value);
- void setVec3v(ssize_t size, const Vec3* pointer);
- void setVec4(const Vec4& value);
- void setVec4v(ssize_t size, const Vec4* pointer);
- void setMat4(const Mat4& value);
-
-
-
- void setCallback(const std::function<void(GLProgram*, Uniform*)> &callback);
-
- CC_DEPRECATED_ATTRIBUTE void setTexture(GLuint textureId, GLuint textureUnit);
-
- void setTexture(Texture2D* texture, GLuint textureUnit);
-
-
- void apply();
- UniformValue& operator=(const UniformValue& o);
- protected:
- enum class Type {
- VALUE,
- POINTER,
- CALLBACK_FN
- };
-
- Uniform* _uniform;
-
- GLProgram* _glprogram;
-
- Type _type;
-
- union U{
- float floatValue;
- int intValue;
- float v2Value[2];
- float v3Value[3];
- float v4Value[4];
- float matrixValue[16];
- struct {
- GLuint textureId;
- GLuint textureUnit;
- Texture2D* texture;
- } tex;
- struct {
- const float* pointer;
- GLsizei size;
- } floatv;
- struct {
- const float* pointer;
- GLsizei size;
- } v2f;
- struct {
- const float* pointer;
- GLsizei size;
- } v3f;
- struct {
- const float* pointer;
- GLsizei size;
- } v4f;
- std::function<void(GLProgram*, Uniform*)> *callback;
- U() { memset( this, 0, sizeof(*this) ); }
- ~U(){}
- U& operator=( const U& other ) {
- memcpy(this, &other, sizeof(*this));
- return *this;
- }
- } _value;
-
- };
- class CC_DLL VertexAttribValue
- {
- friend class GLProgram;
- friend class GLProgramState;
- friend class VertexAttribBinding;
- public:
-
- VertexAttribValue(VertexAttrib *vertexAttrib);
-
- VertexAttribValue();
-
- ~VertexAttribValue();
-
-
- void setPointer(GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLvoid *pointer);
-
- void setCallback(const std::function<void(VertexAttrib*)> &callback);
-
- void apply();
- protected:
- VertexAttrib* _vertexAttrib;
- bool _useCallback;
- bool _enabled;
- union U{
- struct {
- GLint size;
- GLenum type;
- GLboolean normalized;
- GLsizei stride;
- GLvoid *pointer;
- } pointer;
- std::function<void(VertexAttrib*)> *callback;
- U() { memset( this, 0, sizeof(*this) ); }
- ~U(){}
- U& operator=( const U& other ) {
- memcpy(this, &other, sizeof(*this));
- return *this;
- }
- } _value;
- };
- class CC_DLL GLProgramState : public Ref
- {
- friend class GLProgramStateCache;
- public:
-
- static GLProgramState* create(GLProgram* glprogram);
-
- static GLProgramState* getOrCreateWithGLProgram(GLProgram* glprogram);
-
- static GLProgramState* getOrCreateWithGLProgramName(const std::string& glProgramName );
-
- static GLProgramState* getOrCreateWithGLProgramName(const std::string& glProgramName, Texture2D* texture);
-
- static GLProgramState* getOrCreateWithShaders(const std::string& vertexShader, const std::string& fragShader, const std::string& compileTimeDefines);
-
- GLProgramState* clone() const;
-
- void apply(const Mat4& modelView);
-
- void applyGLProgram(const Mat4& modelView);
-
- void applyAttributes(bool applyAttribFlags = true);
-
- void applyUniforms();
-
-
- void setGLProgram(GLProgram* glprogram);
- GLProgram* getGLProgram() const { return _glprogram; }
-
-
-
-
- uint32_t getVertexAttribsFlags() const;
-
- ssize_t getVertexAttribCount() const;
-
- void setVertexAttribCallback(const std::string& name, const std::function<void(VertexAttrib*)> &callback);
- void setVertexAttribPointer(const std::string& name, GLint size, GLenum type, GLboolean normalized, GLsizei stride, GLvoid *pointer);
-
-
-
- ssize_t getUniformCount() const { return _uniforms.size(); }
-
-
- void setUniformInt(const std::string& uniformName, int value);
- void setUniformFloat(const std::string& uniformName, float value);
- void setUniformFloatv(const std::string& uniformName, ssize_t size, const float* pointer);
- void setUniformVec2(const std::string& uniformName, const Vec2& value);
- void setUniformVec2v(const std::string& uniformName, ssize_t size, const Vec2* pointer);
- void setUniformVec3(const std::string& uniformName, const Vec3& value);
- void setUniformVec3v(const std::string& uniformName, ssize_t size, const Vec3* pointer);
- void setUniformVec4(const std::string& uniformName, const Vec4& value);
- void setUniformVec4v(const std::string& uniformName, ssize_t size, const Vec4* pointer);
- void setUniformMat4(const std::string& uniformName, const Mat4& value);
- void setUniformCallback(const std::string& uniformName, const std::function<void(GLProgram*, Uniform*)> &callback);
- void setUniformTexture(const std::string& uniformName, Texture2D *texture);
-
- CC_DEPRECATED_ATTRIBUTE void setUniformTexture(const std::string& uniformName, GLuint textureId);
-
-
-
- void setUniformInt(GLint uniformLocation, int value);
- void setUniformFloat(GLint uniformLocation, float value);
- void setUniformFloatv(GLint uniformLocation, ssize_t size, const float* pointer);
- void setUniformVec2(GLint uniformLocation, const Vec2& value);
- void setUniformVec2v(GLint uniformLocation, ssize_t size, const Vec2* pointer);
- void setUniformVec3(GLint uniformLocation, const Vec3& value);
- void setUniformVec3v(GLint uniformLocation, ssize_t size, const Vec3* pointer);
- void setUniformVec4(GLint uniformLocation, const Vec4& value);
- void setUniformVec4v(GLint uniformLocation, ssize_t size, const Vec4* pointer);
- void setUniformMat4(GLint uniformLocation, const Mat4& value);
- void setUniformCallback(GLint uniformLocation, const std::function<void(GLProgram*, Uniform*)> &callback);
- void setUniformTexture(GLint uniformLocation, Texture2D *texture);
-
- CC_DEPRECATED_ATTRIBUTE void setUniformTexture(GLint uniformLocation, GLuint textureId);
-
-
- Node* getNodeBinding() const;
-
- void setNodeBinding(Node* node);
-
- void applyAutoBinding(const std::string& uniformName, const std::string& autoBinding);
-
- void setParameterAutoBinding(const std::string& uniformName, const std::string& autoBinding);
-
- class CC_DLL AutoBindingResolver
- {
- public:
-
- virtual ~AutoBindingResolver();
-
- virtual bool resolveAutoBinding(GLProgramState* glProgramState, Node* node, const std::string& uniformName, const std::string& autoBinding) = 0;
- protected:
-
- AutoBindingResolver();
- };
- protected:
- GLProgramState();
- virtual ~GLProgramState();
- bool init(GLProgram* program);
- void resetGLProgram();
- void updateUniformsAndAttributes();
- VertexAttribValue* getVertexAttribValue(const std::string& attributeName);
- UniformValue* getUniformValue(const std::string& uniformName);
- UniformValue* getUniformValue(GLint uniformLocation);
- bool _uniformAttributeValueDirty;
- std::unordered_map<std::string, GLint> _uniformsByName;
- std::unordered_map<GLint, UniformValue> _uniforms;
- std::unordered_map<std::string, VertexAttribValue> _attributes;
- std::unordered_map<std::string, int> _boundTextureUnits;
- int _textureUnitIndex;
- uint32_t _vertexAttribsFlags;
- GLProgram* _glprogram;
- Node* _nodeBinding;
-
- std::unordered_map<std::string, std::string> _autoBindings;
-
- static std::vector<AutoBindingResolver*> _customAutoBindingResolvers;
- #if (CC_TARGET_PLATFORM == CC_PLATFORM_ANDROID || CC_TARGET_PLATFORM == CC_PLATFORM_WINRT)
- EventListenerCustom* _backToForegroundlistener;
- #endif
- };
- NS_CC_END
- #endif
|