Files
SDBA/tigl.h
2021-05-18 10:33:08 +02:00

149 lines
4.8 KiB
C++

#pragma once
#include <GL/glew.h>
#include <memory>
#include <glm/glm.hpp>
#include <vector>
namespace tigl
{
namespace internal
{
class Shader
{
public:
virtual ~Shader() {};
// Sets the projection matrix
virtual void setProjectionMatrix(const glm::mat4& matrix) = 0;
// Sets the view (camera) matrix
virtual void setViewMatrix(const glm::mat4& matrix) = 0;
// Sets the model matrix
virtual void setModelMatrix(const glm::mat4& matrix) = 0;
// enables the use of the colors set in vertices
virtual void enableColor(bool enabled) = 0;
// enables the use of texture coordinats set in vertices, and uses textures set in texture sampler
virtual void enableTexture(bool enabled) = 0;
// enables the lighting
virtual void enableLighting(bool enabled) = 0;
// sets the number of lights
virtual void setLightCount(int count) = 0;
// sets the light as directional or positional
virtual void setLightDirectional(int lightNr, bool isDirectional) = 0;
// sets the position of the light. If the light is a directional light, the position is interpreted as a direction
virtual void setLightPosition(int lightNr, const glm::vec3& position) = 0;
// sets the ambient color of a light
virtual void setLightAmbient(int lightNr, const glm::vec3& color) = 0;
// sets the diffuse color of a light
virtual void setLightDiffuse(int lightNr, const glm::vec3& color) = 0;
// sets the specular color of a light
virtual void setLightSpecular(int lightNr, const glm::vec3& color) = 0;
// sets the shinyness of the material drawn. Used for specular calculations
virtual void setShinyness(float shinyness) = 0;
// Enables color multiplication. If enabled, all colors (texture and vertex colors) will be multiplied by the color set by the setColorMult method
virtual void enableColorMult(bool enabled) = 0;
// Changes the color that output will be multiplied with when enableColorMult is enabled
virtual void setColorMult(const glm::vec4& color) = 0;
// Enables alpha testing. Will stop rendering everything with a low alpha value
virtual void enableAlphaTest(bool enabled) = 0;
// Enables fog
virtual void enableFog(bool enabled) = 0;
// Sets the fog to linear
virtual void setFogLinear(float begin, float end) = 0;
// Sets the fog to Exponential
virtual void setFogExp(float density) = 0;
// Sets the fog to Exponential
virtual void setFogExp2(float density) = 0;
};
}
// A simple structure to store vertices. Can store positions, normals, colors and texture coordinats
struct Vertex
{
public:
glm::vec3 position;
glm::vec3 normal;
glm::vec4 color;
glm::vec2 texcoord;
// Creates a vertex with a position
static Vertex P(const glm::vec3& position) {
return { position, glm::vec3(0,1,0), glm::vec4(1,1,1,1), glm::vec2(0,0) };
}
// Creates a vertex with a position and a color
static Vertex PC(const glm::vec3& position, const glm::vec4& color) {
return { position, glm::vec3(0,1,0), color, glm::vec2(0,0) };
}
// Creates a vertex with a position and a texture coordinat
static Vertex PT(const glm::vec3& position, const glm::vec2& texcoord) {
return { position, glm::vec3(0,1,0), glm::vec4(1,1,1,1), texcoord };
}
// Creates a vertex with a position and a normal
static Vertex PN(const glm::vec3& position, const glm::vec3& normal) {
return { position, normal, glm::vec4(1,1,1,1), glm::vec2(0,0) };
}
// Creates a vertex with a position, a texture coordinat and a color
static Vertex PTC(const glm::vec3& position, const glm::vec2& texcoord, const glm::vec4 &color) {
return { position, glm::vec3(0,1,0), color, texcoord };
}
// Creates a vertex with a position, color and normal
static Vertex PCN(const glm::vec3& position, const glm::vec4& color, const glm::vec3& normal) {
return { position, normal, color, glm::vec2(0,0) };
}
// Creates a vertex with a position, texture coordinat and normal
static Vertex PTN(const glm::vec3& position, const glm::vec2& texcoord, const glm::vec3& normal) {
return { position, normal, glm::vec4(1,1,1,1), texcoord };
}
// Creates a vertex with a position, color, texture coordinat and normal
static Vertex PCTN(const glm::vec3& position, const glm::vec4& color, const glm::vec2& texcoord, const glm::vec3& normal) {
return { position, normal, color, texcoord };
}
};
// Access point for the shader
extern std::unique_ptr<internal::Shader> shader;
// Call to initialize. Loads the shader
void init();
// Call to start a set of OpenGL primitives
void begin(GLenum shape);
// Adds a single vertex to the set
void addVertex(const Vertex& vertex);
// Finishes and draws the vertices given
void end();
// Draws a full array of vertices
void drawVertices(GLenum shape, const std::vector<Vertex> &vertices);
}