diff --git a/Dengine.vcxproj b/Dengine.vcxproj
index d471d3e..2458456 100644
--- a/Dengine.vcxproj
+++ b/Dengine.vcxproj
@@ -126,6 +126,7 @@
+
diff --git a/Dengine.vcxproj.filters b/Dengine.vcxproj.filters
index e816c49..423e795 100644
--- a/Dengine.vcxproj.filters
+++ b/Dengine.vcxproj.filters
@@ -54,6 +54,9 @@
Source Files
+
+ Source Files
+
diff --git a/data/shaders/default.frag.glsl b/data/shaders/default.frag.glsl
index 892dba5..e69de29 100644
--- a/data/shaders/default.frag.glsl
+++ b/data/shaders/default.frag.glsl
@@ -1,12 +0,0 @@
-#version 330 core
-in vec3 OurColor;
-in vec2 TexCoord;
-
-out vec4 color;
-
-uniform sampler2D ourTexture1;
-
-void main()
-{
- color = texture(ourTexture1, TexCoord);
-}
\ No newline at end of file
diff --git a/data/shaders/default.vert.glsl b/data/shaders/default.vert.glsl
index 6221268..0232502 100644
--- a/data/shaders/default.vert.glsl
+++ b/data/shaders/default.vert.glsl
@@ -1,19 +1,9 @@
#version 330 core
+layout(location = 0) in vec4 data; // (vec2)pos, (vec2)texCoord
-layout (location = 0) in vec3 position;
-layout (location = 1) in vec3 color;
-layout (location = 2) in vec2 texCoord;
-
-out vec3 OurColor;
-out vec2 TexCoord;
-
-uniform mat4 model;
-uniform mat4 view;
uniform mat4 projection;
void main()
{
- gl_Position = projection * view * model * vec4(position, 1.0f);
- OurColor = color;
- TexCoord = texCoord;
+ gl_Position = projection * vec4(data.xy, 0.0f, 1.0f);
}
diff --git a/data/shaders/default_no_tex.frag.glsl b/data/shaders/default_no_tex.frag.glsl
new file mode 100644
index 0000000..1771648
--- /dev/null
+++ b/data/shaders/default_no_tex.frag.glsl
@@ -0,0 +1,8 @@
+#version 330 core
+out vec4 color;
+uniform vec4 spriteColor;
+
+void main()
+{
+ color = spriteColor;
+}
diff --git a/data/shaders/default_no_tex.vert.glsl b/data/shaders/default_no_tex.vert.glsl
new file mode 100644
index 0000000..0232502
--- /dev/null
+++ b/data/shaders/default_no_tex.vert.glsl
@@ -0,0 +1,9 @@
+#version 330 core
+layout(location = 0) in vec4 data; // (vec2)pos, (vec2)texCoord
+
+uniform mat4 projection;
+
+void main()
+{
+ gl_Position = projection * vec4(data.xy, 0.0f, 1.0f);
+}
diff --git a/data/shaders/sprite.frag.glsl b/data/shaders/default_tex.frag.glsl
similarity index 100%
rename from data/shaders/sprite.frag.glsl
rename to data/shaders/default_tex.frag.glsl
diff --git a/data/shaders/sprite.vert.glsl b/data/shaders/default_tex.vert.glsl
similarity index 100%
rename from data/shaders/sprite.vert.glsl
rename to data/shaders/default_tex.vert.glsl
diff --git a/src/AssetManager.c b/src/AssetManager.c
index 54eb151..ab40e9d 100644
--- a/src/AssetManager.c
+++ b/src/AssetManager.c
@@ -918,40 +918,42 @@ INTERNAL GLuint createShaderFromPath(MemoryArena_ *arena, const char *const path
return result;
}
-INTERNAL i32 shaderLoadProgram(Shader *const shader, const GLuint vertexShader,
+INTERNAL u32 shaderLoadProgram(const GLuint vertexShader,
const GLuint fragmentShader)
{
- shader->id = glCreateProgram();
- glAttachShader(shader->id, vertexShader);
- glAttachShader(shader->id, fragmentShader);
- glLinkProgram(shader->id);
+ u32 result = glCreateProgram();
+ glAttachShader(result, vertexShader);
+ glAttachShader(result, fragmentShader);
+ glLinkProgram(result);
+ GL_CHECK_ERROR();
glDeleteShader(fragmentShader);
glDeleteShader(vertexShader);
+ GL_CHECK_ERROR();
GLint success;
GLchar infoLog[512];
- glGetProgramiv(shader->id, GL_LINK_STATUS, &success);
- if (!success)
+ glGetProgramiv(result, GL_LINK_STATUS, &success);
+ GL_CHECK_ERROR();
+ if (result == 0)
{
- glGetProgramInfoLog(shader->id, 512, NULL, infoLog);
+ glGetProgramInfoLog(result, 512, NULL, infoLog);
printf("glLinkProgram failed: %s\n", infoLog);
- return -1;
+ ASSERT(TRUE);
}
+ GL_CHECK_ERROR();
- return 0;
+ return result;
}
-Shader *const asset_getShader(AssetManager *assetManager,
- const enum ShaderList type)
+u32 asset_getShader(AssetManager *assetManager, const enum ShaderList type)
{
- if (type < shaderlist_count)
- return &assetManager->shaders[type];
+ if (type < shaderlist_count) return assetManager->shaders[type];
#ifdef DENGINE_DEBUG
ASSERT(INVALID_CODE_PATH);
#endif
- return NULL;
+ return -1;
}
const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena_ *arena,
@@ -963,12 +965,10 @@ const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena_ *arena,
GLuint fragmentShader =
createShaderFromPath(arena, fragmentPath, GL_FRAGMENT_SHADER);
- Shader shader;
- i32 result = shaderLoadProgram(&shader, vertexShader, fragmentShader);
- if (result)
- return result;
+ u32 shaderId = shaderLoadProgram(vertexShader, fragmentShader);
+ if (shaderId == 0) return -1;
- assetManager->shaders[type] = shader;
+ assetManager->shaders[type] = shaderId;
return 0;
}
diff --git a/src/Asteroid.c b/src/Asteroid.c
index c0e0c2e..b8895ea 100644
--- a/src/Asteroid.c
+++ b/src/Asteroid.c
@@ -32,9 +32,13 @@ void initAssetManager(GameState *state)
*tex = texture_gen(1, 1, 4, CAST(u8 *)(&bitmap));
/* Load shaders */
- asset_loadShaderFiles(assetManager, arena, "data/shaders/sprite.vert.glsl",
- "data/shaders/sprite.frag.glsl",
- shaderlist_sprite);
+ asset_loadShaderFiles(
+ assetManager, arena, "data/shaders/default_tex.vert.glsl",
+ "data/shaders/default_tex.frag.glsl", shaderlist_default);
+
+ asset_loadShaderFiles(
+ assetManager, arena, "data/shaders/default_no_tex.vert.glsl",
+ "data/shaders/default_no_tex.frag.glsl", shaderlist_default_no_tex);
i32 result =
asset_loadTTFont(assetManager, arena, "C:/Windows/Fonts/Arialbd.ttf");
@@ -52,12 +56,19 @@ void initRenderer(GameState *state, v2 windowSize) {
// NOTE(doyle): Value to map a screen coordinate to NDC coordinate
renderer->vertexNdcFactor =
V2(1.0f / renderer->size.w, 1.0f / renderer->size.h);
- renderer->shader = asset_getShader(assetManager, shaderlist_sprite);
- shader_use(renderer->shader);
const mat4 projection =
mat4_ortho(0.0f, renderer->size.w, 0.0f, renderer->size.h, 0.0f, 1.0f);
- shader_uniformSetMat4fv(renderer->shader, "projection", projection);
+ for (i32 i = 0; i < shaderlist_count; i++)
+ {
+ renderer->shaderList[i] = asset_getShader(assetManager, i);
+ shader_use(renderer->shaderList[i]);
+ shader_uniformSetMat4fv(renderer->shaderList[i], "projection",
+ projection);
+ GL_CHECK_ERROR();
+ }
+
+ renderer->activeShaderId = renderer->shaderList[shaderlist_default];
GL_CHECK_ERROR();
/* Create buffers */
diff --git a/src/Renderer.c b/src/Renderer.c
index 6065576..e15ea6e 100644
--- a/src/Renderer.c
+++ b/src/Renderer.c
@@ -285,12 +285,23 @@ createDefaultTexQuad(Renderer *renderer, RenderTex *renderTex)
INTERNAL void renderGLBufferedData(Renderer *renderer, RenderGroup *group)
{
ASSERT(group->mode < rendermode_invalid);
- /* Load transformation matrix */
- shader_use(renderer->shader);
- GL_CHECK_ERROR();
+
+ u32 drawMethod = GL_TRIANGLE_STRIP;
+ if (group->flags & renderflag_wireframe)
+ {
+ drawMethod = GL_LINE_LOOP;
+ renderer->activeShaderId =
+ renderer->shaderList[shaderlist_default_no_tex];
+ }
+ else
+ {
+ renderer->activeShaderId = renderer->shaderList[shaderlist_default];
+ }
+
+ shader_use(renderer->activeShaderId);
/* Set color modulation value */
- shader_uniformSetVec4f(renderer->shader, "spriteColor",
+ shader_uniformSetVec4f(renderer->activeShaderId, "spriteColor",
group->color);
GL_CHECK_ERROR();
@@ -299,17 +310,10 @@ INTERNAL void renderGLBufferedData(Renderer *renderer, RenderGroup *group)
{
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, tex->id);
- shader_uniformSet1i(renderer->shader, "tex", 0);
+ shader_uniformSet1i(renderer->activeShaderId, "tex", 0);
}
glBindVertexArray(renderer->vao[group->mode]);
-
- u32 drawMethod = GL_TRIANGLE_STRIP;
- if (group->flags & renderflag_wireframe)
- {
- drawMethod = GL_LINE_LOOP;
- }
-
glDrawArrays(drawMethod, 0, renderer->numVertexesInVbo);
GL_CHECK_ERROR();
debug_countIncrement(debugcount_drawArrays);
diff --git a/src/Shader.c b/src/Shader.c
index f0a4715..f9e2d08 100644
--- a/src/Shader.c
+++ b/src/Shader.c
@@ -1,25 +1,27 @@
#include "Dengine/Shader.h"
-void shader_uniformSet1i(Shader *const shader, const GLchar *name,
+void shader_uniformSet1i(u32 shaderId, const GLchar *name,
const GLuint data)
{
- GLint uniformLoc = glGetUniformLocation(shader->id, name);
+ GLint uniformLoc = glGetUniformLocation(shaderId, name);
glUniform1i(uniformLoc, data);
}
-void shader_uniformSetMat4fv(Shader *const shader, const GLchar *name,
+void shader_uniformSetMat4fv(u32 shaderId, const GLchar *name,
mat4 data)
{
- GLint uniformLoc = glGetUniformLocation(shader->id, name);
+ GLint uniformLoc = glGetUniformLocation(shaderId, name);
+ GL_CHECK_ERROR();
glUniformMatrix4fv(uniformLoc, 1, GL_FALSE, data.e[0]);
+ GL_CHECK_ERROR();
}
-void shader_uniformSetVec4f(Shader *const shader, const GLchar *name,
+void shader_uniformSetVec4f(u32 shaderId, const GLchar *name,
v4 data)
{
- GLint uniformLoc = glGetUniformLocation(shader->id, name);
+ GLint uniformLoc = glGetUniformLocation(shaderId, name);
glUniform4f(uniformLoc, data.e[0], data.e[1], data.e[2], data.e[3]);
}
-void shader_use(const Shader *const shader) { glUseProgram(shader->id); }
+void shader_use(u32 shaderId) { glUseProgram(shaderId); }
diff --git a/src/include/Dengine/AssetManager.h b/src/include/Dengine/AssetManager.h
index 12b3636..193a7a9 100644
--- a/src/include/Dengine/AssetManager.h
+++ b/src/include/Dengine/AssetManager.h
@@ -18,7 +18,7 @@ typedef struct AssetManager
HashTable audio;
/* Primitive Array */
- Shader shaders[2];
+ u32 shaders[shaderlist_count];
Font font;
} AssetManager;
@@ -72,7 +72,7 @@ const i32 asset_loadXmlFile(AssetManager *const assetManager,
MemoryArena_ *const arena,
const PlatformFileRead *const fileRead);
-Shader *const asset_getShader(AssetManager *assetManager, const enum ShaderList type);
+u32 asset_getShader(AssetManager *assetManager, const enum ShaderList type);
const i32 asset_loadShaderFiles(AssetManager *assetManager, MemoryArena_ *arena,
const char *const vertexPath,
const char *const fragmentPath,
diff --git a/src/include/Dengine/Assets.h b/src/include/Dengine/Assets.h
index f07635b..f27137b 100644
--- a/src/include/Dengine/Assets.h
+++ b/src/include/Dengine/Assets.h
@@ -44,7 +44,8 @@ typedef struct XmlNode
enum ShaderList
{
- shaderlist_sprite,
+ shaderlist_default,
+ shaderlist_default_no_tex,
shaderlist_count,
};
diff --git a/src/include/Dengine/Renderer.h b/src/include/Dengine/Renderer.h
index d8c12f2..c65a60f 100644
--- a/src/include/Dengine/Renderer.h
+++ b/src/include/Dengine/Renderer.h
@@ -3,6 +3,7 @@
#include "Dengine/Common.h"
#include "Dengine/Math.h"
+#include "Dengine/Assets.h"
/* Forward Declaration */
typedef struct AssetManager AssetManager;
@@ -57,7 +58,8 @@ typedef struct RenderGroup
typedef struct Renderer
{
- Shader *shader;
+ u32 shaderList[shaderlist_count];
+ u32 activeShaderId;
u32 vao[rendermode_count];
u32 vbo[rendermode_count];
diff --git a/src/include/Dengine/Shader.h b/src/include/Dengine/Shader.h
index e587ce2..8b99611 100644
--- a/src/include/Dengine/Shader.h
+++ b/src/include/Dengine/Shader.h
@@ -4,18 +4,13 @@
#include "Dengine/Math.h"
#include "Dengine/OpenGL.h"
-typedef struct Shader
-{
- GLuint id;
-} Shader;
-
-void shader_uniformSet1i(Shader *const shader, const GLchar *name,
+void shader_uniformSet1i(u32 shaderId, const GLchar *name,
const GLuint data);
-void shader_uniformSetMat4fv(Shader *const shader, const GLchar *name,
+void shader_uniformSetMat4fv(u32 shaderId, const GLchar *name,
mat4 data);
-void shader_uniformSetVec4f(Shader *const shader, const GLchar *name,
+void shader_uniformSetVec4f(u32 shaderId, const GLchar *name,
v4 data);
-void shader_use(const Shader *const shader);
+void shader_use(u32 shaderId);
#endif