Simplify shader creation functions

This commit is contained in:
Chris Thrasher committed 2024-09-24 15:08:17 -06:00
1 parent 7b583b1aac
commit 1b082ac255
1 file changed
+70 -99
+70 -99
View File
@@ -37,41 +37,28 @@ sfShader* sfShader_createFromFile(const char* vertexShaderFilename,
const char* geometryShaderFilename, const char* geometryShaderFilename,
const char* fragmentShaderFilename) const char* fragmentShaderFilename)
{ {
// At least one shader must be provided
if (!(vertexShaderFilename || geometryShaderFilename || fragmentShaderFilename))
return nullptr;
bool success = false; bool success = false;
auto shader = std::make_unique<sfShader>(); auto shader = std::make_unique<sfShader>();
if (vertexShaderFilename || geometryShaderFilename || fragmentShaderFilename)
if (!geometryShaderFilename)
{ {
if (!geometryShaderFilename) if (!vertexShaderFilename) // fragment shader only
{ success = shader->loadFromFile(fragmentShaderFilename, sf::Shader::Type::Fragment);
if (!vertexShaderFilename) else if (!fragmentShaderFilename) // vertex shader only
{ success = shader->loadFromFile(vertexShaderFilename, sf::Shader::Type::Vertex);
// fragment shader only else // vertex + fragment shaders
success = shader->loadFromFile(fragmentShaderFilename, sf::Shader::Type::Fragment); success = shader->loadFromFile(vertexShaderFilename, fragmentShaderFilename);
} }
else if (!fragmentShaderFilename) else
{ {
// vertex shader only if (!vertexShaderFilename && !fragmentShaderFilename) // geometry shader only
success = shader->loadFromFile(vertexShaderFilename, sf::Shader::Type::Vertex); success = shader->loadFromFile(geometryShaderFilename, sf::Shader::Type::Geometry);
} else // vertex + geometry + fragment shaders
else success = shader->loadFromFile(vertexShaderFilename, geometryShaderFilename, fragmentShaderFilename);
{
// vertex + fragment shaders
success = shader->loadFromFile(vertexShaderFilename, fragmentShaderFilename);
}
}
else
{
if (!vertexShaderFilename && !fragmentShaderFilename)
{
// geometry shader only
success = shader->loadFromFile(geometryShaderFilename, sf::Shader::Type::Geometry);
}
else
{
// vertex + geometry + fragment shaders
success = shader->loadFromFile(vertexShaderFilename, geometryShaderFilename, fragmentShaderFilename);
}
}
} }
if (!success) if (!success)
@@ -84,41 +71,28 @@ sfShader* sfShader_createFromFile(const char* vertexShaderFilename,
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
sfShader* sfShader_createFromMemory(const char* vertexShader, const char* geometryShader, const char* fragmentShader) sfShader* sfShader_createFromMemory(const char* vertexShader, const char* geometryShader, const char* fragmentShader)
{ {
// At least one shader must be provided
if (!(vertexShader || geometryShader || fragmentShader))
return nullptr;
bool success = false; bool success = false;
auto shader = std::make_unique<sfShader>(); auto shader = std::make_unique<sfShader>();
if (vertexShader || geometryShader || fragmentShader)
if (!geometryShader)
{ {
if (!geometryShader) if (!vertexShader) // fragment shader only
{ success = shader->loadFromMemory(fragmentShader, sf::Shader::Type::Fragment);
if (!vertexShader) else if (!fragmentShader) // vertex shader only
{ success = shader->loadFromMemory(vertexShader, sf::Shader::Type::Vertex);
// fragment shader only else // vertex + fragment shaders
success = shader->loadFromMemory(fragmentShader, sf::Shader::Type::Fragment); success = shader->loadFromMemory(vertexShader, fragmentShader);
} }
else if (!fragmentShader) else
{ {
// vertex shader only if (!vertexShader && !fragmentShader) // geometry shader only
success = shader->loadFromMemory(vertexShader, sf::Shader::Type::Vertex); success = shader->loadFromMemory(geometryShader, sf::Shader::Type::Geometry);
} else // vertex + geometry + fragment shaders
else success = shader->loadFromMemory(vertexShader, geometryShader, fragmentShader);
{
// vertex + fragment shaders
success = shader->loadFromMemory(vertexShader, fragmentShader);
}
}
else
{
if (!vertexShader && !fragmentShader)
{
// geometry shader only
success = shader->loadFromMemory(geometryShader, sf::Shader::Type::Geometry);
}
else
{
// vertex + geometry + fragment shaders
success = shader->loadFromMemory(vertexShader, geometryShader, fragmentShader);
}
}
} }
if (!success) if (!success)
@@ -133,47 +107,44 @@ sfShader* sfShader_createFromStream(sfInputStream* vertexShaderStream,
sfInputStream* geometryShaderStream, sfInputStream* geometryShaderStream,
sfInputStream* fragmentShaderStream) sfInputStream* fragmentShaderStream)
{ {
// At least one shader must be provided
if (!(vertexShaderStream || geometryShaderStream || fragmentShaderStream))
return nullptr;
bool success = false; bool success = false;
auto shader = std::make_unique<sfShader>(); auto shader = std::make_unique<sfShader>();
if (vertexShaderStream || geometryShaderStream || fragmentShaderStream)
if (!geometryShaderStream)
{ {
if (!geometryShaderStream) if (!vertexShaderStream) // fragment shader only
{ {
if (!vertexShaderStream) CallbackStream stream(fragmentShaderStream);
{ success = shader->loadFromStream(stream, sf::Shader::Type::Fragment);
// fragment shader only
CallbackStream stream(fragmentShaderStream);
success = shader->loadFromStream(stream, sf::Shader::Type::Fragment);
}
else if (!fragmentShaderStream)
{
// vertex shader only
CallbackStream stream(vertexShaderStream);
success = shader->loadFromStream(stream, sf::Shader::Type::Vertex);
}
else
{
// vertex + fragment shaders
CallbackStream vertexStream(vertexShaderStream);
CallbackStream fragmentStream(fragmentShaderStream);
success = shader->loadFromStream(vertexStream, fragmentStream);
}
} }
else else if (!fragmentShaderStream) // vertex shader only
{ {
CallbackStream geometryStream(geometryShaderStream); CallbackStream stream(vertexShaderStream);
if (!vertexShaderStream && !fragmentShaderStream) success = shader->loadFromStream(stream, sf::Shader::Type::Vertex);
{ }
// geometry shader only else // vertex + fragment shaders
success = shader->loadFromStream(geometryStream, sf::Shader::Type::Geometry); {
} CallbackStream vertexStream(vertexShaderStream);
else CallbackStream fragmentStream(fragmentShaderStream);
{ success = shader->loadFromStream(vertexStream, fragmentStream);
// vertex + geometry + fragment shaders }
CallbackStream vertexStream(vertexShaderStream); }
CallbackStream fragmentStream(fragmentShaderStream); else
success = shader->loadFromStream(vertexStream, geometryStream, fragmentStream); {
} CallbackStream geometryStream(geometryShaderStream);
if (!vertexShaderStream && !fragmentShaderStream) // geometry shader only
{
success = shader->loadFromStream(geometryStream, sf::Shader::Type::Geometry);
}
else // vertex + geometry + fragment shaders
{
CallbackStream vertexStream(vertexShaderStream);
CallbackStream fragmentStream(fragmentShaderStream);
success = shader->loadFromStream(vertexStream, geometryStream, fragmentStream);
} }
} }