DBool sfShader_loadFromStream(sfShader* shader, DStream* vertexShaderStream, DStream* fragmentShaderStream) { bool success = false; if (vertexShaderStream || fragmentShaderStream) { if (!vertexShaderStream) { // fragment shader only sfmlStream stream(fragmentShaderStream); success = shader->This.loadFromStream(stream, sf::Shader::Fragment); } else if (!fragmentShaderStream) { // vertex shader only sfmlStream stream(vertexShaderStream); success = shader->This.loadFromStream(stream, sf::Shader::Vertex); } else { // vertex + fragment shaders sfmlStream vertexStream(vertexShaderStream); sfmlStream fragmentStream(fragmentShaderStream); success = shader->This.loadFromStream(vertexStream, fragmentStream); } } return success?DTrue:DFalse; }
sfShader* sfShader_createFromStream(sfInputStream* vertexShaderStream, sfInputStream* geometryShaderStream, sfInputStream* fragmentShaderStream) { bool success = false; sfShader* shader = new sfShader; if (vertexShaderStream || geometryShaderStream || fragmentShaderStream) { if (!geometryShaderStream) { if (!vertexShaderStream) { // fragment shader only CallbackStream stream(fragmentShaderStream); success = shader->This.loadFromStream(stream, sf::Shader::Fragment); } else if (!fragmentShaderStream) { // vertex shader only CallbackStream stream(vertexShaderStream); success = shader->This.loadFromStream(stream, sf::Shader::Vertex); } else { // vertex + fragment shaders CallbackStream vertexStream(vertexShaderStream); CallbackStream fragmentStream(fragmentShaderStream); success = shader->This.loadFromStream(vertexStream, fragmentStream); } } else { // vertex + geometry + fragment shaders CallbackStream vertexStream(vertexShaderStream); CallbackStream geometryStream(geometryShaderStream); CallbackStream fragmentStream(fragmentShaderStream); success = shader->This.loadFromStream(vertexStream, geometryStream, fragmentStream); } } if (!success) { delete shader; shader = NULL; } return shader; }