Textures and colors passed to shader via Uniforms

This commit is contained in:
Dane Johnson 2021-01-17 14:36:38 -06:00
parent e243a666f1
commit 5e8d693758
21 changed files with 7960 additions and 16 deletions

View File

@ -37,7 +37,10 @@ swig_add_library(couchlua
target_link_libraries(couchlua ${LUA_LIBRARIES}) target_link_libraries(couchlua ${LUA_LIBRARIES})
target_link_libraries(couch couchlua) target_link_libraries(couch couchlua)
add_subdirectory(thirdparty)
if(WIN32) if(WIN32)
target_link_libraries(couch glfw3dll) target_link_libraries(couch glfw3dll)
target_link_libraries(couch ssp)
set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++") set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
endif(WIN32) endif(WIN32)

BIN
container.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 KiB

View File

@ -3,15 +3,15 @@
Ball::Ball() { Ball::Ball() {
// It's a cube really // It's a cube really
// Front // Front
vertices.push_back(Vertex(1.0f, 1.0f, 1.0f)); vertices.push_back(Vertex(1.0f, 1.0f, 1.0f, 0.0f, 1.0f));
vertices.push_back(Vertex(1.0f, -1.0f, 1.0f)); vertices.push_back(Vertex(1.0f, -1.0f, 1.0f, 0.0f, 0.0f));
vertices.push_back(Vertex(-1.0f, 1.0f, 1.0f)); vertices.push_back(Vertex(-1.0f, 1.0f, 1.0f, 1.0f, 1.0f));
vertices.push_back(Vertex(-1.0f, -1.0f, 1.0f)); vertices.push_back(Vertex(-1.0f, -1.0f, 1.0f, 1.0f, 0.0f));
// Back // Back
vertices.push_back(Vertex(1.0f, 1.0f, -1.0f)); vertices.push_back(Vertex(1.0f, 1.0f, -1.0f, 0.0f, 0.0f));
vertices.push_back(Vertex(1.0f, -1.0f, -1.0f)); vertices.push_back(Vertex(1.0f, -1.0f, -1.0f, 0.0f, 1.0f));
vertices.push_back(Vertex(-1.0f, 1.0f, -1.0f)); vertices.push_back(Vertex(-1.0f, 1.0f, -1.0f, 1.0f, 0.0f));
vertices.push_back(Vertex(-1.0f, -1.0f, -1.0f)); vertices.push_back(Vertex(-1.0f, -1.0f, -1.0f, 1.0f, 1.0f));
//Front //Front
indices.push_back(Index(0, 1, 2)); indices.push_back(Index(0, 1, 2));

View File

@ -2,11 +2,13 @@
#define DRAWABLE_H #define DRAWABLE_H
#include "Node.h" #include "Node.h"
#include "Material.h"
class Drawable : virtual public Node { class Drawable : virtual public Node {
public: public:
virtual bool IsDrawable() const {return true;} virtual bool IsDrawable() const {return true;}
virtual void Draw() = 0; virtual void Draw() = 0;
Material *material;
}; };
#endif /* DRAWABLE_H */ #endif /* DRAWABLE_H */

47
core/Material.cpp Normal file
View File

@ -0,0 +1,47 @@
#include "Material.h"
Color::Color() {
this->r = 0.0f;
this->g = 0.0f;
this->b = 0.0f;
}
Color::Color(cfloat r, cfloat g, cfloat b) {
this->r = r;
this->g = g;
this->b = b;
}
Texture::Texture() {}
Texture Texture::FromFile(const char *filename) {
// Lotta hocus pocus
// https://learnopengl.com/Getting-started/Textures
Texture tex;
glGenTextures(1, &tex.id);
glBindTexture(GL_TEXTURE_2D, tex.id);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_REPEAT);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
int nrChannels;
unsigned char* data = stbi_load(filename, &tex.width, &tex.height, &nrChannels, 0);
if (data) {
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, tex.width, tex.height, 0, GL_RGB, GL_UNSIGNED_BYTE, data);
glGenerateMipmap(GL_TEXTURE_2D);
} else {
std::cout << "Error loading texture file: " << filename << std::endl;
exit(1);
}
stbi_image_free(data);
return tex;
}
Material::Material() {
usesColor = false;
usesTex = false;
}

34
core/Material.h Normal file
View File

@ -0,0 +1,34 @@
#ifndef MATERIAL_H
#define MATERIAL_H
#include <iostream>
#include <stdlib.h>
#include <GL/glew.h>
#include "stb_image.h"
#include "types.h"
struct Color {
cfloat r, g, b;
Color();
Color(cfloat r, cfloat g, cfloat b);
};
class Texture {
public:
int width, height;
Id id;
static Texture FromFile(const char *filename);
Texture();
};
struct Material {
Color color;
bool usesColor;
Texture tex;
bool usesTex;
Material();
};
#endif /* MATERIAL_H */

View File

@ -1,6 +1,12 @@
#include "Mesh.h" #include "Mesh.h"
Mesh::Mesh() {} Mesh::Mesh() {
material = new Material();
}
Mesh::~Mesh() {
delete material;
}
Mesh::Mesh(VertexList vertices, IndexList indices) { Mesh::Mesh(VertexList vertices, IndexList indices) {
this->vertices = vertices; this->vertices = vertices;
@ -24,7 +30,10 @@ void Mesh::SetupMesh() {
// Vertex positions // Vertex positions
glEnableVertexAttribArray(0); glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) 0); glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*) 0);
// TODO normals, uv // Vertex UV
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)(3 * sizeof(float)));
// TODO normals
glBindVertexArray(0); glBindVertexArray(0);
} }

View File

@ -14,6 +14,7 @@ public:
VertexList vertices; VertexList vertices;
IndexList indices; IndexList indices;
Mesh(); Mesh();
~Mesh();
Mesh(VertexList vertices, IndexList indices); Mesh(VertexList vertices, IndexList indices);
virtual void Draw(); virtual void Draw();
virtual void SetupMesh(); virtual void SetupMesh();

View File

@ -67,8 +67,6 @@ Shader::Shader(const char* vertexPath, const char* fragmentPath) {
glDeleteShader(fragment); glDeleteShader(fragment);
} }
void Shader::Use() { void Shader::Use() {
glUseProgram(id); glUseProgram(id);
} }
@ -85,6 +83,23 @@ void Shader::UpdateProjection(Matrix projection) {
glUniformMatrix4fv(glGetUniformLocation(id, "PROJECTION"), 1, GL_FALSE, glm::value_ptr(projection)); glUniformMatrix4fv(glGetUniformLocation(id, "PROJECTION"), 1, GL_FALSE, glm::value_ptr(projection));
} }
void Shader::UpdateColor(bool usesColor) {
glUniform1i(glGetUniformLocation(id, "material.usesColor"), (int) usesColor);
}
void Shader::UpdateColor(bool usesColor, Color color) {
glUniform1i(glGetUniformLocation(id, "material.usesColor"), (int) usesColor);
glUniform3f(glGetUniformLocation(id, "material.color"), color.r, color.g, color.b);
}
void Shader::UpdateTex(bool usesTex) {
glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) usesTex);
}
void Shader::UpdateTex(bool usesTex, Texture tex) {
glUniform1i(glGetUniformLocation(id, "material.usesTex"), (int) usesTex);
glBindTexture(GL_TEXTURE_2D, tex.id);
}
Name Shader::GetName() const { Name Shader::GetName() const {
return "Unnamed Shader"; return "Unnamed Shader";
} }

View File

@ -9,6 +9,7 @@
#include <glm/gtc/type_ptr.hpp> #include <glm/gtc/type_ptr.hpp>
#include "types.h" #include "types.h"
#include "Material.h"
class Shader { class Shader {
public: public:
@ -19,6 +20,10 @@ public:
void UpdateView(Matrix view); void UpdateView(Matrix view);
void UpdateModel(Matrix model); void UpdateModel(Matrix model);
void UpdateProjection(Matrix projection); void UpdateProjection(Matrix projection);
void UpdateColor(bool usesColor);
void UpdateColor(bool usesColor, Color color);
void UpdateTex(bool usesTex);
void UpdateTex(bool usesTex, Texture tex);
virtual Name GetName() const; virtual Name GetName() const;
}; };

View File

@ -4,10 +4,22 @@ Vertex::Vertex() {
x = 0.0f; x = 0.0f;
y = 0.0f; y = 0.0f;
z = 0.0f; z = 0.0f;
u = 0.0f;
v = 0.0f;
} }
Vertex::Vertex(cfloat x, cfloat y, cfloat z) { Vertex::Vertex(cfloat x, cfloat y, cfloat z) {
this->x = x; this->x = x;
this->y = y; this->y = y;
this->z = z; this->z = z;
this->u = 0.0f;
this->v = 0.0f;
}
Vertex::Vertex(cfloat x, cfloat y, cfloat z, cfloat u, cfloat v) {
this->x = x;
this->y = y;
this->z = z;
this->u = u;
this->v = v;
} }

View File

@ -8,7 +8,9 @@
struct Vertex { struct Vertex {
Vertex(); Vertex();
Vertex(cfloat x, cfloat y, cfloat z); Vertex(cfloat x, cfloat y, cfloat z);
Vertex(cfloat x, cfloat y, cfloat z, cfloat u, cfloat v);
cfloat x, y, z; cfloat x, y, z;
cfloat u, v;
}; };
typedef std::vector<Vertex> VertexList; typedef std::vector<Vertex> VertexList;

View File

@ -15,6 +15,10 @@
#include "Node.h" #include "Node.h"
#include "Lua.h" #include "Lua.h"
// Thirdparty Includes
#define STB_IMAGE_IMPLEMENTATION
#include "stb_image.h"
Window *window; Window *window;
const int width = 800; const int width = 800;
@ -33,6 +37,16 @@ void render(Node *curr, Shader *shader, Matrix model) {
shader->UpdateModel(model); shader->UpdateModel(model);
} }
Drawable *drawable = dynamic_cast<Drawable*>(curr); Drawable *drawable = dynamic_cast<Drawable*>(curr);
if (drawable->material->usesColor) {
shader->UpdateColor(true, drawable->material->color);
} else {
shader->UpdateColor(false);
}
if (drawable->material->usesTex) {
shader->UpdateTex(true, drawable->material->tex);
} else {
shader->UpdateTex(false);
}
drawable->Draw(); drawable->Draw();
} }
for (Node *child : curr->children) { for (Node *child : curr->children) {
@ -66,6 +80,7 @@ int main() {
} }
glViewport(0, 0, width, height); glViewport(0, 0, width, height);
glEnable(GL_DEPTH_TEST);
root = Node::GetRoot(); root = Node::GetRoot();
@ -76,7 +91,6 @@ int main() {
FlatShader *shader = new FlatShader(); FlatShader *shader = new FlatShader();
shader->Use(); shader->Use();
shader->UpdateColor(Vector3(0.0f, 1.0f, 0.0f));
Matrix projection = glm::perspective(glm::radians(45.0f), 800.0f/600.0f, 0.1f, 100.0f); Matrix projection = glm::perspective(glm::radians(45.0f), 800.0f/600.0f, 0.1f, 100.0f);
shader->UpdateProjection(projection); shader->UpdateProjection(projection);
@ -90,7 +104,7 @@ int main() {
while(!glfwWindowShouldClose(window)) { while(!glfwWindowShouldClose(window)) {
glClearColor(0.5f, 0.5f, 0.5f, 1.0f); glClearColor(0.5f, 0.5f, 0.5f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
lua->Update(delta); lua->Update(delta);

View File

@ -20,15 +20,23 @@ local cam_rot_y = 0.0
local SPEED = 30 local SPEED = 30
local RED = couch.Color(1.0, 0.0, 0.0)
local BLUE = couch.Color(0.0, 0.0, 1.0)
function init() function init()
camera = couch.Camera() camera = couch.Camera()
camera:MakeCurrent() camera:MakeCurrent()
camera.transform:Translate(0.0, 0.0, 10.0) camera.transform:Translate(0.0, 0.0, 10.0)
ball = couch.Ball() ball = couch.Ball()
ball:SetupMesh() ball:SetupMesh()
ball.material.color = RED
ball.material.usesColor = true
couch.Node.GetRoot().children:Append(ball) couch.Node.GetRoot().children:Append(ball)
ball1 = couch.Ball() ball1 = couch.Ball()
ball1:SetupMesh() ball1:SetupMesh()
ball1.material.tex = couch.Texture.FromFile("container.png")
ball1.material.usesTex = true
print(ball1.material.tex.width, ball1.material.tex.height)
couch.Node.GetRoot().children:Append(ball1) couch.Node.GetRoot().children:Append(ball1)
ball1.transform:Translate(0.0, 3.0, 0.0) ball1.transform:Translate(0.0, 3.0, 0.0)

View File

@ -8,6 +8,7 @@
#include "Transform.h" #include "Transform.h"
#include "Spatial.h" #include "Spatial.h"
#include "Drawable.h" #include "Drawable.h"
#include "Material.h"
#include "Mesh.h" #include "Mesh.h"
#include "Ball.h" #include "Ball.h"
#include "Camera.h" #include "Camera.h"
@ -36,6 +37,7 @@ public:
%include "Spatial.h" %include "Spatial.h"
%include "Transform.h" %include "Transform.h"
%include "Drawable.h" %include "Drawable.h"
%include "Material.h"
%include "Mesh.h" %include "Mesh.h"
%include "Ball.h" %include "Ball.h"
%include "Camera.h" %include "Camera.h"

View File

@ -1,9 +1,24 @@
#version 330 core #version 330 core
uniform vec3 color; in vec2 UV;
out vec4 FragColor; out vec4 FragColor;
struct Material {
vec3 color;
bool usesColor;
sampler2D tex;
bool usesTex;
};
uniform Material material;
void main() { void main() {
FragColor = vec4(color, 1.0); FragColor = vec4(0.0);
if (material.usesColor) {
FragColor += vec4(material.color, 1.0);
}
if (material.usesTex) {
FragColor += texture(material.tex, UV);
}
} }

View File

@ -1,11 +1,15 @@
#version 330 core #version 330 core
layout (location = 0) in vec3 pos; layout (location = 0) in vec3 pos;
layout (location = 1) in vec2 uv;
uniform mat4 MODEL; uniform mat4 MODEL;
uniform mat4 VIEW; uniform mat4 VIEW;
uniform mat4 PROJECTION; uniform mat4 PROJECTION;
out vec2 UV;
void main() { void main() {
gl_Position = PROJECTION * VIEW * MODEL * vec4(pos, 1.0); gl_Position = PROJECTION * VIEW * MODEL * vec4(pos, 1.0);
UV = uv;
} }

7
thirdparty/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1,7 @@
project(Couch)
target_include_directories(couch
PUBLIC stb)
target_include_directories(couchlua
PUBLIC stb)

1
thirdparty/stb/.#CMakeLists.txt vendored Symbolic link
View File

@ -0,0 +1 @@
dane@sweetdee.1314:1610908086

1
thirdparty/stb/CMakeLists.txt vendored Normal file
View File

@ -0,0 +1 @@
Project(stb)

7762
thirdparty/stb/stb_image.h vendored Normal file

File diff suppressed because it is too large Load Diff