diff --git a/include/ACGL/OpenGL/Controller.hh b/include/ACGL/OpenGL/Controller.hh index cd239520f09cdb184c646a01f1a9bd1d65dd6abb..e8660eeb6eb827b29ae778bc56dcb1b8e5e364ac 100644 --- a/include/ACGL/OpenGL/Controller.hh +++ b/include/ACGL/OpenGL/Controller.hh @@ -28,6 +28,7 @@ #include #include #include +#include #include #include diff --git a/include/ACGL/OpenGL/Controller/StateControl.hh b/include/ACGL/OpenGL/Controller/StateControl.hh index b24b6de76ac145aa898a6549d7e27f3086a979c7..4f1ba66af676d5ee2465bdda7f713b688b1c50e0 100644 --- a/include/ACGL/OpenGL/Controller/StateControl.hh +++ b/include/ACGL/OpenGL/Controller/StateControl.hh @@ -24,11 +24,11 @@ public: StateControl( const ConstSharedVertexBufferObject& _vertexBufferObject, const ConstSharedFrameBufferObject& _frameBufferObject, - const ConstSharedShaderProgram& _shaderProgram, + const ConstSharedShaderProgramObject& _shaderProgramObject, const ConstSharedViewport& _viewport) : mpVertexBufferObject(_vertexBufferObject), mpFrameBufferObject(_frameBufferObject), - mpShaderProgram(_shaderProgram), + mpShaderProgramObject(_shaderProgramObject), mpViewport(_viewport) {} virtual ~StateControl(void) {} @@ -37,10 +37,10 @@ public: // ============================================================================================ GETTERS \/ // ==================================================================================================== \/ public: - inline StateControl& vertexBuffer (const ConstSharedVertexBufferObject& _vertexBufferObject) { mpVertexBufferObject = _vertexBufferObject; return *this; } - inline StateControl& frameBuffer (const ConstSharedFrameBufferObject& _frameBufferObject) { mpFrameBufferObject = _frameBufferObject; return *this; } - inline StateControl& shaderProgram (const ConstSharedShaderProgram& _shaderProgram) { mpShaderProgram = _shaderProgram; return *this; } - inline StateControl& viewport (const ConstSharedViewport& _viewport) { mpViewport = _viewport; return *this; } + inline StateControl& vertexBufferObject (const ConstSharedVertexBufferObject& _vertexBufferObject) { mpVertexBufferObject = _vertexBufferObject; return *this; } + inline StateControl& frameBufferObject (const ConstSharedFrameBufferObject& _frameBufferObject) { mpFrameBufferObject = _frameBufferObject; return *this; } + inline StateControl& shaderProgramObject (const ConstSharedShaderProgramObject& _shaderProgramObject) { mpShaderProgramObject = _shaderProgramObject; return *this; } + inline StateControl& viewport (const ConstSharedViewport& _viewport) { mpViewport = _viewport; return *this; } // ===================================================================================================== \/ // ============================================================================================ OVERRIDE \/ @@ -48,7 +48,7 @@ public: public: virtual SharedState create(void) { - SharedState state(new State(mpVertexBufferObject, mpFrameBufferObject, mpShaderProgram, mpViewport)); + SharedState state(new State(mpVertexBufferObject, mpFrameBufferObject, mpShaderProgramObject, mpViewport)); return state; } @@ -57,10 +57,10 @@ public: // ============================================================================================ FIELDS \/ // =================================================================================================== \/ protected: - ConstSharedVertexBufferObject mpVertexBufferObject; - ConstSharedFrameBufferObject mpFrameBufferObject; - ConstSharedShaderProgram mpShaderProgram; - ConstSharedViewport mpViewport; + ConstSharedVertexBufferObject mpVertexBufferObject; + ConstSharedFrameBufferObject mpFrameBufferObject; + ConstSharedShaderProgramObject mpShaderProgramObject; + ConstSharedViewport mpViewport; }; } // OpenGL diff --git a/include/ACGL/OpenGL/Controller/UniformControl.hh b/include/ACGL/OpenGL/Controller/UniformControl.hh new file mode 100644 index 0000000000000000000000000000000000000000..2ae24922505a23a5cb81e0408575fea74553f813 --- /dev/null +++ b/include/ACGL/OpenGL/Controller/UniformControl.hh @@ -0,0 +1,67 @@ +//////////////////////////////////////////////////////////////////////////////// +// Copyright (c) 2011, Computer Graphics Group RWTH Aachen University // +// All rights reserved. // +//////////////////////////////////////////////////////////////////////////////// + +#ifndef ACGL_OPENGL_CONTROLLER_UNIFORMCONTROL_HH +#define ACGL_OPENGL_CONTROLLER_UNIFORMCONTROL_HH + +#include + +#include +#include +#include + +namespace ACGL{ +namespace OpenGL{ + +template +class UniformControl : public Resource::BasicCreateController +{ + // ========================================================================================================= \/ + // ============================================================================================ CONSTRUCTORS \/ + // ========================================================================================================= \/ +public: + UniformControl(const typename UNIFORM::DATA_TYPE& _value) + : mValue(_value) + {} + virtual ~UniformControl() {} + + // ==================================================================================================== \/ + // ============================================================================================ METHODS \/ + // ==================================================================================================== \/ +public: + inline UniformControl& value (const typename UNIFORM::DATA_TYPE& _value) { mValue = _value; return *this; } + + // ===================================================================================================== \/ + // ============================================================================================ OVERRIDE \/ + // ===================================================================================================== \/ +public: + virtual std::tr1::shared_ptr create(void) + { + std::tr1::shared_ptr uniform(new UNIFORM()); + uniform->setValue(mValue); + return uniform; + } + + // =================================================================================================== \/ + // ============================================================================================ FIELDS \/ + // =================================================================================================== \/ +protected: + typename UNIFORM::DATA_TYPE mValue; +}; + +typedef UniformControl Uniform1iControl; +typedef UniformControl Uniform1fControl; +typedef UniformControl Uniform2fControl; +typedef UniformControl Uniform3fControl; +typedef UniformControl Uniform4fControl; +typedef UniformControl UniformMatrix2fControl; +typedef UniformControl UniformMatrix3fControl; +typedef UniformControl UniformMatrix4fControl; +typedef UniformControl UniformTextureControl; + +} // OpenGL +} // ACGL + +#endif // ACGL_OPENGL_CONTROLLER_ARRAYBUFFERCONTROL_HH diff --git a/include/ACGL/OpenGL/Objects/Shader.hh b/include/ACGL/OpenGL/Objects/Shader.hh index a81f82c52f1bcb2629594973190eb30c4442258f..e38868573d0af23a1868ad5875eba4e8606e5323 100644 --- a/include/ACGL/OpenGL/Objects/Shader.hh +++ b/include/ACGL/OpenGL/Objects/Shader.hh @@ -26,8 +26,8 @@ class Shader // ============================================================================================ TYPEDEFS \/ // ===================================================================================================== \/ public: - typedef std::vector AttributeVec; - typedef std::vector FragmentDataVec; + typedef std::vector AttributeNameVec; + typedef std::vector FragmentDataNameVec; // ========================================================================================================= \/ // ============================================================================================ CONSTRUCTORS \/ @@ -53,8 +53,9 @@ public: inline GLuint getContext (void) const { return mContext; } inline GLenum getType (void) const { return mType; } - inline const std::vector& getAttributes() const { return mAttributes; } - inline const std::vector& getFragmentData() const { return mFragmentData; } + inline const std::vector& getAttributeNames (void) const { return mAttributeNames; } + inline const std::vector& getFragmentDataNames (void) const { return mFragmentDataNames; } + // ==================================================================================================== \/ // ============================================================================================ METHODS \/ // ==================================================================================================== \/ @@ -69,10 +70,10 @@ protected: // ============================================================================================ FIELDS \/ // =================================================================================================== \/ protected: - GLuint mContext; - GLenum mType; - AttributeVec mAttributes; - FragmentDataVec mFragmentData; + GLuint mContext; + GLenum mType; + AttributeNameVec mAttributeNames; + FragmentDataNameVec mFragmentDataNames; }; ACGL_SHARED_TYPEDEF(Shader) diff --git a/include/ACGL/OpenGL/Objects/State.hh b/include/ACGL/OpenGL/Objects/State.hh index 8f3a6327e33b516bd4759d4ab8fdec25d7ec00bd..be8c9e38d8d8cd14cba80aa74be27a24ec5a37c5 100644 --- a/include/ACGL/OpenGL/Objects/State.hh +++ b/include/ACGL/OpenGL/Objects/State.hh @@ -18,7 +18,7 @@ #include #include -#include +#include #include namespace ACGL{ @@ -54,13 +54,13 @@ private: // ============================================================================================ CONSTRUCTORS \/ // ========================================================================================================= \/ public: - State(ConstSharedVertexBufferObject _VertexBufferObject, - ConstSharedFrameBufferObject _FrameBufferObject, - ConstSharedShaderProgram _shaderProgram, + State(ConstSharedVertexBufferObject _vertexBufferObject, + ConstSharedFrameBufferObject _frameBufferObject, + ConstSharedShaderProgramObject _shaderProgram, ConstSharedViewport _viewport) - : mpVertexBufferObject(_VertexBufferObject), - mpFrameBufferObject(_FrameBufferObject), - mpShaderProgram(_shaderProgram), + : mpVertexBufferObject(_vertexBufferObject), + mpFrameBufferObject(_frameBufferObject), + mpShaderProgramObject(_shaderProgram), mpViewport(_viewport), mAttributeMappings(), mFragmentDataMappings(), @@ -81,18 +81,20 @@ public: public: inline ConstSharedVertexBufferObject getVertexBufferObject (void) const { return mpVertexBufferObject; } inline ConstSharedFrameBufferObject getFrameBufferObject (void) const { return mpFrameBufferObject; } - inline ConstSharedShaderProgram getShaderProgram (void) const { return mpShaderProgram; } + inline ConstSharedShaderProgramObject getShaderProgramObject (void) const { return mpShaderProgramObject; } inline ConstSharedViewport getViewport (void) const { return mpViewport; } // ==================================================================================================== \/ // ============================================================================================ METHODS \/ // ==================================================================================================== \/ public: - void useViewport (void); - void enableVertexBufferObject (void); - void bindFrameBufferObject (void); - void disableVertexBufferObject (void); - void updateMappings (void); + void updateMappings (void); + + void useViewport (void) const; + void useShaderProgramObject (void) const; + void bindFrameBufferObject (void) const; + void enableVertexBufferObject (void) const; + void disableVertexBufferObject (void) const; inline void validate (void) const { @@ -100,14 +102,15 @@ public: mpVertexBufferObject->validate(); } - inline void draw(void) + inline void draw(void) const { mpVertexBufferObject->draw(); } - inline void render(void) + inline void render(void) const { useViewport(); + useShaderProgramObject(); bindFrameBufferObject(); enableVertexBufferObject(); draw(); @@ -120,8 +123,8 @@ public: protected: ConstSharedVertexBufferObject mpVertexBufferObject; ConstSharedFrameBufferObject mpFrameBufferObject; - ConstSharedShaderProgram mpShaderProgram; - ConstSharedViewport mpViewport; + ConstSharedShaderProgramObject mpShaderProgramObject; + ConstSharedViewport mpViewport; AttributeMappingVec mAttributeMappings; FragmentDataMappingVec mFragmentDataMappings; diff --git a/include/ACGL/OpenGL/Objects/Uniform.hh b/include/ACGL/OpenGL/Objects/Uniform.hh index 6038ed01c0cc69d30040852fae7e513a5867e3b8..500d56bf473fcd2763d966a5ba488454f8979449 100644 --- a/include/ACGL/OpenGL/Objects/Uniform.hh +++ b/include/ACGL/OpenGL/Objects/Uniform.hh @@ -36,6 +36,12 @@ ACGL_SHARED_TYPEDEF(Uniform) template class UniformData { + // ===================================================================================================== \/ + // ============================================================================================ TYPEDEFS \/ + // ===================================================================================================== \/ +public: + typedef T DATA_TYPE; + // ========================================================================================================= \/ // ============================================================================================ CONSTRUCTORS \/ // ========================================================================================================= \/ diff --git a/src/ACGL/OpenGL/Objects/Shader.cc b/src/ACGL/OpenGL/Objects/Shader.cc index cef5a8a5927a7a433de735748768ac8a08833c31..7016575e40b6a2b5d90ec7a2d5681238b0f0ce51 100644 --- a/src/ACGL/OpenGL/Objects/Shader.cc +++ b/src/ACGL/OpenGL/Objects/Shader.cc @@ -46,7 +46,8 @@ bool Shader::setSource(const std::string& _source) std::istringstream stream(_source); std::string line = ""; - mAttributes.clear(); + mAttributeNames.clear(); + mFragmentDataNames.clear(); while (stream.good()) { @@ -62,7 +63,7 @@ bool Shader::setSource(const std::string& _source) std::vector tokensOfToken = StringOperations::split(tokens[2], ';'); if(tokensOfToken.size() > 0) { - mAttributes.push_back(tokensOfToken[0]); + mAttributeNames.push_back(tokensOfToken[0]); } } } @@ -77,7 +78,7 @@ bool Shader::setSource(const std::string& _source) std::vector tokensOfToken = StringOperations::split(tokens[2], ';'); if(tokensOfToken.size() > 0) { - mFragmentData.push_back(tokensOfToken[0]); + mFragmentDataNames.push_back(tokensOfToken[0]); } } } diff --git a/src/ACGL/OpenGL/Objects/ShaderProgram.cc b/src/ACGL/OpenGL/Objects/ShaderProgram.cc index 6775b5b12e96fdc2ea03c6176a4745d67703aedd..03d070596a3e8e7b6fc58fe0055407b460b6bd1b 100644 --- a/src/ACGL/OpenGL/Objects/ShaderProgram.cc +++ b/src/ACGL/OpenGL/Objects/ShaderProgram.cc @@ -14,10 +14,9 @@ void ShaderProgram::bindAttributeLocations() const { for (ConstSharedShaderVec::size_type i = 0; i < mShaders.size(); ++i) { - const Shader::AttributeVec& attribs = mShaders[i]->getAttributes(); - for (Shader::AttributeVec::size_type k = 0; k < attribs.size(); ++k) + for (Shader::AttributeNameVec::size_type k = 0; k < mShaders[i]->getAttributeNames().size(); ++k) { - glBindAttribLocation(mContext, k, attribs[k].c_str()); + glBindAttribLocation(mContext, k, mShaders[i]->getAttributeNames()[k].c_str()); } } } @@ -26,10 +25,9 @@ void ShaderProgram::bindFragmentDataLocations() const { for (ConstSharedShaderVec::size_type i = 0; i < mShaders.size(); ++i) { - const Shader::FragmentDataVec& fragData = mShaders[i]->getFragmentData(); - for (Shader::FragmentDataVec::size_type k = 0; k < fragData.size(); ++k) + for (Shader::FragmentDataNameVec::size_type k = 0; k < mShaders[i]->getFragmentDataNames().size(); ++k) { - glBindFragDataLocation(mContext, k, fragData[k].c_str()); + glBindFragDataLocation(mContext, k, mShaders[i]->getFragmentDataNames()[k].c_str()); } } } diff --git a/src/ACGL/OpenGL/Objects/State.cc b/src/ACGL/OpenGL/Objects/State.cc index f0a67a0907f7b912d2401fdf797a46f3c6fa1137..24a491d3d020f2c63440ab81c14d9518ec171165 100644 --- a/src/ACGL/OpenGL/Objects/State.cc +++ b/src/ACGL/OpenGL/Objects/State.cc @@ -14,18 +14,65 @@ using namespace ACGL::Base; using namespace ACGL::Utils; using namespace ACGL::OpenGL; -void State::useViewport() +void State::updateMappings (void) +{ + ShaderProgram::ConstSharedShaderVec shaders = mpShaderProgramObject->getShaderProgram()->getShaders(); + + for(ShaderProgram::ConstSharedShaderVec::size_type shader = 0; shader < shaders.size(); shader++) + { + for(Shader::AttributeNameVec::size_type k = 0; k < shaders[shader]->getAttributeNames().size(); k++) + { + AttributeMapping mapping; + mapping.shaderProgramAttributeLocation = mpShaderProgramObject->getShaderProgram()->getAttributeLocation(shaders[shader]->getAttributeNames()[k]); + mapping.vertexBufferObjectAttribute = mpVertexBufferObject->getAttributeIndexByName(shaders[shader]->getAttributeNames()[k]); + mapping.arrayBufferID = mpVertexBufferObject->getArrayBufferIDByAttributeIndex(mapping.vertexBufferObjectAttribute); + + bool inserted = false; + for (AttributeMappingVec::iterator it = mAttributeMappings.begin(); it < mAttributeMappings.end() && !inserted; it++) + { + if((*it).arrayBufferID > mapping.arrayBufferID) + { + mAttributeMappings.insert(it, mapping); + inserted = true; + } + } + + if(!inserted) + mAttributeMappings.push_back(mapping); + } + + for(Shader::FragmentDataNameVec::size_type k = 0; k < shaders[shader]->getFragmentDataNames().size(); k++) + { + FragmentDataMapping mapping; + mapping.shaderProgramFragmentDataLocation = mpShaderProgramObject->getShaderProgram()->getFragmentDataLocation(shaders[shader]->getFragmentDataNames()[k]); + mapping.frameBufferObjectColorAttachment = mpFrameBufferObject->getColorAttachmentIndexByName(shaders[shader]->getFragmentDataNames()[k]); + + mFragmentDataMappings.push_back(mapping); + } + } + + mpBuffers = new GLuint[mFragmentDataMappings.size()]; + for(FragmentDataMappingVec::size_type k = 0; k < mFragmentDataMappings.size(); k++) + mpBuffers[k] = GL_COLOR_ATTACHMENT0 + mFragmentDataMappings[k].frameBufferObjectColorAttachment; +} + +void State::useViewport (void) const { mpViewport->use(); } -void State::bindFrameBufferObject() +void State::useShaderProgramObject (void) const +{ + mpShaderProgramObject->use(); +} + +void State::bindFrameBufferObject (void) const { mpFrameBufferObject->bind(); glDrawBuffers(mFragmentDataMappings.size(), mpBuffers); } -void State::enableVertexBufferObject() +void State::enableVertexBufferObject (void) const { if(mpVertexBufferObject->getElementArrayBuffer()) mpVertexBufferObject->getElementArrayBuffer()->bind(); @@ -45,7 +92,7 @@ void State::enableVertexBufferObject() } } -void State::disableVertexBufferObject() +void State::disableVertexBufferObject (void) const { int currentArrayBufferID = -1; for(AttributeMappingVec::size_type k = 0; k < mAttributeMappings.size(); k++) @@ -59,49 +106,3 @@ void State::disableVertexBufferObject() openGLRareError(); } } - -void State::updateMappings (void) -{ - ShaderProgram::ConstSharedShaderVec shaders = mpShaderProgram->getShaders(); - - for(ShaderProgram::ConstSharedShaderVec::size_type shader = 0; shader < shaders.size(); shader++) - { - const Shader::AttributeVec& attributeVec = shaders[shader]->getAttributes(); - - for(Shader::AttributeVec::size_type k = 0; k < attributeVec.size(); k++) - { - AttributeMapping mapping; - mapping.shaderProgramAttributeLocation = mpShaderProgram->getAttributeLocation(attributeVec[k]); - mapping.vertexBufferObjectAttribute = mpVertexBufferObject->getAttributeIndexByName(attributeVec[k]); - mapping.arrayBufferID = mpVertexBufferObject->getArrayBufferIDByAttributeIndex(mapping.vertexBufferObjectAttribute); - - bool inserted = false; - for (AttributeMappingVec::iterator it = mAttributeMappings.begin(); it < mAttributeMappings.end() && !inserted; it++) - { - if((*it).arrayBufferID > mapping.arrayBufferID) - { - mAttributeMappings.insert(it, mapping); - inserted = true; - } - } - - if(!inserted) - mAttributeMappings.push_back(mapping); - } - - const Shader::FragmentDataVec& fragmentDataVec = shaders[shader]->getFragmentData(); - - for(Shader::FragmentDataVec::size_type k = 0; k < fragmentDataVec.size(); k++) - { - FragmentDataMapping mapping; - mapping.shaderProgramFragmentDataLocation = mpShaderProgram->getFragmentDataLocation(fragmentDataVec[k]); - mapping.frameBufferObjectColorAttachment = mpFrameBufferObject->getColorAttachmentIndexByName(fragmentDataVec[k]); - - mFragmentDataMappings.push_back(mapping); - } - } - - mpBuffers = new GLuint[mFragmentDataMappings.size()]; - for(FragmentDataMappingVec::size_type k = 0; k < mFragmentDataMappings.size(); k++) - mpBuffers[k] = GL_COLOR_ATTACHMENT0 + mFragmentDataMappings[k].frameBufferObjectColorAttachment; -}