#ifndef SHADER_H_
#define SHADER_H_
+#include <vulkan/vulkan.h>
+
#include <vector>
#include <string>
#include <gmath/gmath.h>
-/*
- Shader class
-*/
+class Texture;
-enum SType {
+enum ShaderType {
SDR_UNKNOWN,
SDR_VERTEX,
SDR_FRAGMENT
class Shader {
protected:
- SType type;
+ ShaderType type;
std::string name;
virtual bool create(char *buf, unsigned int bsz, const char *fname) = 0;
public:
-
Shader();
virtual ~Shader() = 0;
- virtual bool load(const char *fname, SType type);
+ virtual bool load(const char *fname, ShaderType type);
virtual void destroy() = 0;
+ virtual ShaderType get_type();
};
/* Shader Program */
-struct Uniform {
- int location;
- std::string name;
- int state_idx;
-};
-
class ShaderProgram {
protected:
Shader *shaders[2];
- std::vector<Uniform> uniforms;
public:
ShaderProgram();
virtual bool use() const = 0;
virtual void destroy() = 0;
virtual void attach_shader(Shader *shader) = 0;
-
- /*
- THIS PART MIGHT NEED SEVERAL CHANGES: on vulkan we set the uniforms
- using descriptor sets. The current design is suitable for OpenGL and
- it *might* have to be rewritten to work with both APIs later
- */
- virtual int get_uniform_location(const char *name) const = 0;
-
- virtual void set_uniformi(int location, int value) = 0;
- virtual void set_uniformi(int location, int x, int y) = 0;
- virtual void set_uniformi(int location, int x, int y, int z) = 0;
- virtual void set_uniformi(int location, int x, int y, int z, int w) = 0;
-
- virtual void set_uniformf(int location, float value) = 0;
- virtual void set_uniformf(int location, float x, float y) = 0;
- virtual void set_uniformf(int location, float x, float y, float z) = 0;
- virtual void set_uniformf(int location, float x, float y, float z, float w) = 0;
-
- virtual void set_uniform_matrix(int location, const Mat4 &mat) = 0;
};
#endif // SHADER_H_