// --------------------------------------------------------------------------------------------------------------------------------------------------- // bool ofxAutoReloadedShader::load(string vertName, string fragName, string geomName) { unload(); ofShader::setGeometryOutputCount(geometryOutputCount); ofShader::setGeometryInputType(geometryInputType); ofShader::setGeometryOutputType(geometryOutputType); // hackety hack, clear errors or shader will fail to compile GLuint err = glGetError(); lastTimeCheckMillis = ofGetElapsedTimeMillis(); setMillisBetweenFileCheck( 2 * 1000 ); enableWatchFiles(); loadShaderNextFrame = false; vertexShaderFilename = vertName; fragmentShaderFilename = fragName; geometryShaderFilename = geomName; vertexShaderFile.clear(); fragmentShaderFile.clear(); geometryShaderFile.clear(); vertexShaderFile = ofFile( ofToDataPath( vertexShaderFilename ) ); fragmentShaderFile = ofFile( ofToDataPath( fragmentShaderFilename ) ); geometryShaderFile = ofFile( ofToDataPath( geometryShaderFilename ) ); ofBuffer vertexShaderBuffer = ofBufferFromFile( ofToDataPath( vertexShaderFilename ) ); ofBuffer fragmentShaderBuffer = ofBufferFromFile( ofToDataPath( fragmentShaderFilename ) ); ofBuffer geometryShaderBuffer = ofBufferFromFile( ofToDataPath( geometryShaderFilename ) ); fileChangedTimes.clear(); fileChangedTimes.push_back( getLastModified( vertexShaderFile ) ); fileChangedTimes.push_back( getLastModified( fragmentShaderFile ) ); fileChangedTimes.push_back( getLastModified( geometryShaderFile ) ); if( vertexShaderBuffer.size() > 0 ) { setupShaderFromSource(GL_VERTEX_SHADER, vertexShaderBuffer.getText() ); } if( fragmentShaderBuffer.size() > 0 ) { setupShaderFromSource(GL_FRAGMENT_SHADER, fragmentShaderBuffer.getText()); } #ifndef TARGET_OPENGLES if( geometryShaderBuffer.size() > 0 ) { setupShaderFromSource(GL_GEOMETRY_SHADER_EXT, geometryShaderBuffer.getText()); } #endif bindDefaults(); return linkProgram(); }
bool UIShader::reloadShader(string _fragPath, string _vertPath, string _geomPath){ ofShader::unload(); // hackety hack, clear errors or shader will fail to compile GLuint err = glGetError(); fragFile.clear(); fragFilename = ofToDataPath( _fragPath ); fragFile = ofFile( fragFilename ); fragChangedTimes = getLastModified( fragFile ); ofBuffer fragBuffer = ofBufferFromFile( fragFilename ); if( fragBuffer.size() > 0 ){ setupShaderFromSource(GL_FRAGMENT_SHADER, fragBuffer.getText()); } if (_vertPath != ""){ vertFile.clear(); vertFilename = ofToDataPath(_vertPath); vertFile = ofFile( vertFilename ); vertChangedTimes = getLastModified( vertFile ); ofBuffer vertBuffer = ofBufferFromFile( vertFilename ); if( vertBuffer.size() > 0 ){ setupShaderFromSource(GL_VERTEX_SHADER, vertBuffer.getText()); } bVertex = true; } if (_geomPath != ""){ geomFile.clear(); geomFilename = ofToDataPath(_geomPath); geomFile = ofFile( geomFilename ); geomChangedTimes = getLastModified( geomFile ); ofBuffer geomBuffer = ofBufferFromFile( geomFilename ); if( geomBuffer.size() > 0 ){ setupShaderFromSource(GL_GEOMETRY_SHADER, geomBuffer.getText()); } setGeometryInputType(geomInType); setGeometryOutputType(geomOutType); setGeometryOutputCount(geomOutCount); bGeometry = true; } lastTimeCheckMillis = ofGetElapsedTimeMillis(); if (linkProgram()){ extractUniforms(fragBuffer.getText()); return true; } else { return false; } }
bool ofxShader::setupShaderFromFile(GLenum type, string filename) { ofBuffer buffer; if(ofReadFile(filename, buffer)) { return setupShaderFromSource(type, buffer.getBuffer()); } else { ofLog(OF_LOG_ERROR, "Could not load shader of type " + nameForType(type) + " from file " + filename); return false; } }
//-------------------------------------------------------------- bool ofShader::setupShaderFromFile(GLenum type, string filename) { ofBuffer buffer = ofBufferFromFile(filename); // we need to make absolutely sure to have an absolute path here, so that any #includes // within the shader files have a root directory to traverse from. string absoluteFilePath = ofFilePath::getAbsolutePath(filename, true); string sourceDirectoryPath = ofFilePath::getEnclosingDirectory(absoluteFilePath,false); if(buffer.size()) { return setupShaderFromSource(type, buffer.getText(), sourceDirectoryPath); } else { ofLogError("ofShader") << "setupShaderFromFile(): couldn't load " << nameForType(type) << " shader " << " from \"" << filename << "\""; return false; } }