Commit 05305f7d authored by Robert Menzel's avatar Robert Menzel

ShaderProgramControlFiles can handle complete mapping lists

parent c3a088af
......@@ -25,7 +25,6 @@
#include <ACGL/OpenGL/Controller/RenderBufferControl.hh>
#include <ACGL/OpenGL/Controller/RenderObjectControl.hh>
#include <ACGL/OpenGL/Controller/ShaderControlFile.hh>
#include <ACGL/OpenGL/Controller/ShaderProgramControlAutoFiles.hh>
#include <ACGL/OpenGL/Controller/ShaderProgramControlFiles.hh>
#include <ACGL/OpenGL/Controller/ShaderProgramObjectControl.hh>
#include <ACGL/OpenGL/Controller/TextureDataControlFileFactory.hh>
......
......@@ -21,6 +21,7 @@
#include <ACGL/OpenGL/GL.hh>
#include <vector>
#include <ACGL/OpenGL/Data/LocationMappings.hh>
namespace ACGL{
namespace OpenGL{
......@@ -45,8 +46,8 @@ public:
ShaderProgramControlFiles(const std::string& _fileName, GLenum _type = GL_INVALID_VALUE )
: Resource::FileController<ShaderProgram>(_fileName),
mShaderType(),
mAttributeLocations(),
mFragmentDataLocations()
mAttributeLocations(new LocationMappings),
mFragmentDataLocations(new LocationMappings)
{
if ( _type != GL_INVALID_VALUE ) {
andFile( _fileName, _type );
......@@ -66,6 +67,10 @@ public:
// ============================================================================================ METHODS \/
// ==================================================================================================== \/
public:
//
// Adding files:
//
//! adds a single file, the shader type will be guessed by the ending:
inline ShaderProgramControlFiles& andFile (const std::string &_fileName) { mFileName.push_back( _fileName ); mShaderType.push_back( GL_INVALID_VALUE ); return *this; }
......@@ -76,8 +81,26 @@ public:
//! adds all files begining with the given name, the shader type will be guessed by the ending:
ShaderProgramControlFiles& autoFiles (const std::string &_fileName);
inline ShaderProgramControlFiles& attributeLocation (const std::string &_attributeName) { mAttributeLocations.push_back(_attributeName); return *this; }
inline ShaderProgramControlFiles& fragmentDataLocation (const std::string &_fragmentDataName) { mFragmentDataLocations.push_back(_fragmentDataName); return *this; }
//
// Adding locations:
//
//! adds an attribute location to the next free location number:
inline ShaderProgramControlFiles& attributeLocation (const std::string &_attributeName) { mAttributeLocations->setLocation(_attributeName); return *this; }
//! adds an attribute location to the given location number:
inline ShaderProgramControlFiles& attributeLocation (const std::string &_attributeName, GLuint _location) { mAttributeLocations->setLocation(_attributeName,_location); return *this; }
//! adds a fragment output location to the next free location number:
inline ShaderProgramControlFiles& fragmentDataLocation (const std::string &_fragmentDataName) { mFragmentDataLocations->setLocation(_fragmentDataName); return *this; }
//! adds a fragment output location to the given location number:
inline ShaderProgramControlFiles& fragmentDataLocation (const std::string &_fragmentDataName, GLuint _location) { mFragmentDataLocations->setLocation(_fragmentDataName,_location); return *this; }
//! adds a whole list of mappings
inline ShaderProgramControlFiles& attributeLocations (const SharedLocationMappings &_mapping) { mAttributeLocations->addLocations(_mapping); return *this; }
//! adds a whole list of mappings
inline ShaderProgramControlFiles& fragmentDataLocations(const SharedLocationMappings &_mapping) { mFragmentDataLocations->addLocations(_mapping); return *this; }
// ===================================================================================================== \/
// ============================================================================================ OVERRIDE \/
......@@ -92,8 +115,9 @@ public:
protected:
std::vector<GLenum> mShaderType;
std::vector<std::string> mFileName;
std::vector<std::string> mAttributeLocations;
std::vector<std::string> mFragmentDataLocations;
SharedLocationMappings mAttributeLocations;
SharedLocationMappings mFragmentDataLocations;
private:
// set attribute & fragdata locations prior to shader program linking
......
......@@ -62,6 +62,8 @@ public:
//! Returns the raw location map:
const LocationMap& getLocations() const { return mMappings; }
inline size_t getSize() { return mMappings.size(); }
// ==================================================================================================== \/
// ============================================================================================ SETTERS \/
// ==================================================================================================== \/
......@@ -70,6 +72,13 @@ public:
//! Adds one location:
void setLocation(const std::string& _name, GLuint _location);
//! Adds one location, uses the next free integer as the location
//! this way the locations can get the number of the order they were added (if only this function gets used)
void setLocation(const std::string& _name);
//! adds all given locations:
void addLocations( const ptr::shared_ptr<LocationMappings> &_other );
// ==================================================================================================== \/
// ============================================================================================ METHODS \/
// ==================================================================================================== \/
......@@ -85,7 +94,6 @@ public:
protected:
LocationMap mMappings;
};
ACGL_SMARTPOINTER_TYPEDEFS(LocationMappings)
} // OpenGL
......
......@@ -109,25 +109,20 @@ SharedShaderProgram ShaderProgramControlFiles::create(void)
}
}
setBindings( shaderProgram );
if (shaderProgram->link()) {
return shaderProgram;
if (!shaderProgram->link()) {
return SharedShaderProgram(); // linking failed
}
return SharedShaderProgram(); // linking failed
setBindings( shaderProgram ); // will relink, but needs a linked program :-(
return shaderProgram;
}
void ShaderProgramControlFiles::setBindings(SharedShaderProgram &_shaderProgram)
{
#if (ACGL_OPENGL_VERSION >= 30)
for (std::vector<std::string>::size_type i = 0; i < mAttributeLocations.size(); ++i) {
_shaderProgram->bindAttributeLocation(mAttributeLocations[i], i);
}
for (std::vector<std::string>::size_type i = 0; i < mFragmentDataLocations.size(); ++i) {
_shaderProgram->bindFragmentDataLocation(mFragmentDataLocations[i], i);
}
_shaderProgram->setFragmentDataLocations( mFragmentDataLocations );
_shaderProgram->setAttributeLocations( mAttributeLocations );
#else
if ( (mAttributeLocations.size() > 0) && (mFragmentDataLocations.size() > 0) ) {
if ( (mAttributeLocations.getSize() > 0) && (mFragmentDataLocations.getSize() > 0) ) {
Utils::error() << "can't set explicit attribute/fragdata locations on OpenGL < 3.0 " << std::endl;
}
#endif
......
......@@ -29,9 +29,36 @@ void LocationMappings::setLocation(const std::string& _name, GLuint _location)
ACGL::Utils::warning() << "LocationMappings: Overwriting location mapping for " << _name;
ACGL::Utils::warning() << " (previous value: " << mMappings[_name] << ", new value: " << _location<< ")" << std::endl;
}
//ACGL::Utils::debug() << "setLocation: " << _name << " value: " << _location<< "" << std::endl;
mMappings[_name] = _location;
}
void LocationMappings::setLocation(const std::string& _name)
{
LocationMap::const_iterator end = mMappings.end();
GLuint nextFreeLocation = 0;
// most likely not the fastest way ;-)
LocationMap::const_iterator it = mMappings.begin();
while (it != end) {
if ( it->second == nextFreeLocation ) {
nextFreeLocation++;
it = mMappings.begin();
} else {
++it;
}
}
setLocation( _name, nextFreeLocation );
}
void LocationMappings::addLocations( const SharedLocationMappings &_other )
{
LocationMap::const_iterator end = _other->mMappings.end();
for (LocationMap::const_iterator it = _other->mMappings.begin(); it != end; ++it) {
setLocation( it->first, it->second );
}
}
void LocationMappings::printMapping()
{
......
......@@ -52,6 +52,8 @@ bool ShaderProgram::link() const
void ShaderProgram::setAttributeLocations(ConstSharedLocationMappings _locationMappings)
{
if (!_locationMappings) return;
bool needsRelink = false;
// search through all attributes:
......@@ -82,6 +84,8 @@ void ShaderProgram::setAttributeLocations(ConstSharedLocationMappings _locationM
void ShaderProgram::setFragmentDataLocations(ConstSharedLocationMappings _locationMappings)
{
if (!_locationMappings) return;
bool needsRelink = false;
// search through all color attachments:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment