Skip to content

Commit 929c042

Browse files
committed
Simplify shader creation functions
1 parent 7b583b1 commit 929c042

File tree

1 file changed

+70
-99
lines changed

1 file changed

+70
-99
lines changed

src/CSFML/Graphics/Shader.cpp

Lines changed: 70 additions & 99 deletions
Original file line numberDiff line numberDiff line change
@@ -37,41 +37,28 @@ sfShader* sfShader_createFromFile(const char* vertexShaderFilename,
3737
const char* geometryShaderFilename,
3838
const char* fragmentShaderFilename)
3939
{
40+
// At least one shader must be provided
41+
if (!(vertexShaderFilename || geometryShaderFilename || fragmentShaderFilename))
42+
return nullptr;
43+
4044
bool success = false;
4145
auto shader = std::make_unique<sfShader>();
42-
if (vertexShaderFilename || geometryShaderFilename || fragmentShaderFilename)
46+
47+
if (!geometryShaderFilename)
4348
{
44-
if (!geometryShaderFilename)
45-
{
46-
if (!vertexShaderFilename)
47-
{
48-
// fragment shader only
49-
success = shader->loadFromFile(fragmentShaderFilename, sf::Shader::Type::Fragment);
50-
}
51-
else if (!fragmentShaderFilename)
52-
{
53-
// vertex shader only
54-
success = shader->loadFromFile(vertexShaderFilename, sf::Shader::Type::Vertex);
55-
}
56-
else
57-
{
58-
// vertex + fragment shaders
59-
success = shader->loadFromFile(vertexShaderFilename, fragmentShaderFilename);
60-
}
61-
}
62-
else
63-
{
64-
if (!vertexShaderFilename && !fragmentShaderFilename)
65-
{
66-
// geometry shader only
67-
success = shader->loadFromFile(geometryShaderFilename, sf::Shader::Type::Geometry);
68-
}
69-
else
70-
{
71-
// vertex + geometry + fragment shaders
72-
success = shader->loadFromFile(vertexShaderFilename, geometryShaderFilename, fragmentShaderFilename);
73-
}
74-
}
49+
if (!vertexShaderFilename) // fragment shader only
50+
success = shader->loadFromFile(fragmentShaderFilename, sf::Shader::Type::Fragment);
51+
else if (!fragmentShaderFilename) // vertex shader only
52+
success = shader->loadFromFile(vertexShaderFilename, sf::Shader::Type::Vertex);
53+
else // vertex + fragment shaders
54+
success = shader->loadFromFile(vertexShaderFilename, fragmentShaderFilename);
55+
}
56+
else
57+
{
58+
if (!vertexShaderFilename && !fragmentShaderFilename) // geometry shader only
59+
success = shader->loadFromFile(geometryShaderFilename, sf::Shader::Type::Geometry);
60+
else // vertex + geometry + fragment shaders
61+
success = shader->loadFromFile(vertexShaderFilename, geometryShaderFilename, fragmentShaderFilename);
7562
}
7663

7764
if (!success)
@@ -84,41 +71,28 @@ sfShader* sfShader_createFromFile(const char* vertexShaderFilename,
8471
////////////////////////////////////////////////////////////
8572
sfShader* sfShader_createFromMemory(const char* vertexShader, const char* geometryShader, const char* fragmentShader)
8673
{
74+
// At least one shader must be provided
75+
if (!(vertexShader || geometryShader || fragmentShader))
76+
return nullptr;
77+
8778
bool success = false;
8879
auto shader = std::make_unique<sfShader>();
89-
if (vertexShader || geometryShader || fragmentShader)
80+
81+
if (!geometryShader)
9082
{
91-
if (!geometryShader)
92-
{
93-
if (!vertexShader)
94-
{
95-
// fragment shader only
96-
success = shader->loadFromMemory(fragmentShader, sf::Shader::Type::Fragment);
97-
}
98-
else if (!fragmentShader)
99-
{
100-
// vertex shader only
101-
success = shader->loadFromMemory(vertexShader, sf::Shader::Type::Vertex);
102-
}
103-
else
104-
{
105-
// vertex + fragment shaders
106-
success = shader->loadFromMemory(vertexShader, fragmentShader);
107-
}
108-
}
109-
else
110-
{
111-
if (!vertexShader && !fragmentShader)
112-
{
113-
// geometry shader only
114-
success = shader->loadFromMemory(geometryShader, sf::Shader::Type::Geometry);
115-
}
116-
else
117-
{
118-
// vertex + geometry + fragment shaders
119-
success = shader->loadFromMemory(vertexShader, geometryShader, fragmentShader);
120-
}
121-
}
83+
if (!vertexShader) // fragment shader only
84+
success = shader->loadFromMemory(fragmentShader, sf::Shader::Type::Fragment);
85+
else if (!fragmentShader) // vertex shader only
86+
success = shader->loadFromMemory(vertexShader, sf::Shader::Type::Vertex);
87+
else // vertex + fragment shaders
88+
success = shader->loadFromMemory(vertexShader, fragmentShader);
89+
}
90+
else
91+
{
92+
if (!vertexShader && !fragmentShader) // geometry shader only
93+
success = shader->loadFromMemory(geometryShader, sf::Shader::Type::Geometry);
94+
else // vertex + geometry + fragment shaders
95+
success = shader->loadFromMemory(vertexShader, geometryShader, fragmentShader);
12296
}
12397

12498
if (!success)
@@ -133,47 +107,44 @@ sfShader* sfShader_createFromStream(sfInputStream* vertexShaderStream,
133107
sfInputStream* geometryShaderStream,
134108
sfInputStream* fragmentShaderStream)
135109
{
110+
// At least one shader must be provided
111+
if (!(vertexShaderStream || geometryShaderStream || fragmentShaderStream))
112+
return nullptr;
113+
136114
bool success = false;
137115
auto shader = std::make_unique<sfShader>();
138-
if (vertexShaderStream || geometryShaderStream || fragmentShaderStream)
116+
117+
if (!geometryShaderStream)
118+
{
119+
if (!vertexShaderStream) // fragment shader only
120+
{
121+
CallbackStream stream(fragmentShaderStream);
122+
success = shader->loadFromStream(stream, sf::Shader::Type::Fragment);
123+
}
124+
else if (!fragmentShaderStream) // vertex shader only
125+
{
126+
CallbackStream stream(vertexShaderStream);
127+
success = shader->loadFromStream(stream, sf::Shader::Type::Vertex);
128+
}
129+
else // vertex + fragment shaders
130+
{
131+
CallbackStream vertexStream(vertexShaderStream);
132+
CallbackStream fragmentStream(fragmentShaderStream);
133+
success = shader->loadFromStream(vertexStream, fragmentStream);
134+
}
135+
}
136+
else
139137
{
140-
if (!geometryShaderStream)
138+
CallbackStream geometryStream(geometryShaderStream);
139+
if (!vertexShaderStream && !fragmentShaderStream) // geometry shader only
141140
{
142-
if (!vertexShaderStream)
143-
{
144-
// fragment shader only
145-
CallbackStream stream(fragmentShaderStream);
146-
success = shader->loadFromStream(stream, sf::Shader::Type::Fragment);
147-
}
148-
else if (!fragmentShaderStream)
149-
{
150-
// vertex shader only
151-
CallbackStream stream(vertexShaderStream);
152-
success = shader->loadFromStream(stream, sf::Shader::Type::Vertex);
153-
}
154-
else
155-
{
156-
// vertex + fragment shaders
157-
CallbackStream vertexStream(vertexShaderStream);
158-
CallbackStream fragmentStream(fragmentShaderStream);
159-
success = shader->loadFromStream(vertexStream, fragmentStream);
160-
}
141+
success = shader->loadFromStream(geometryStream, sf::Shader::Type::Geometry);
161142
}
162-
else
143+
else // vertex + geometry + fragment shaders
163144
{
164-
CallbackStream geometryStream(geometryShaderStream);
165-
if (!vertexShaderStream && !fragmentShaderStream)
166-
{
167-
// geometry shader only
168-
success = shader->loadFromStream(geometryStream, sf::Shader::Type::Geometry);
169-
}
170-
else
171-
{
172-
// vertex + geometry + fragment shaders
173-
CallbackStream vertexStream(vertexShaderStream);
174-
CallbackStream fragmentStream(fragmentShaderStream);
175-
success = shader->loadFromStream(vertexStream, geometryStream, fragmentStream);
176-
}
145+
CallbackStream vertexStream(vertexShaderStream);
146+
CallbackStream fragmentStream(fragmentShaderStream);
147+
success = shader->loadFromStream(vertexStream, geometryStream, fragmentStream);
177148
}
178149
}
179150

0 commit comments

Comments
 (0)