Switched up some stuff with Primitive struct
This commit is contained in:
parent
378bffbbfc
commit
42b93f2a8f
|
@ -56,8 +56,8 @@ private:
|
|||
float m_size;
|
||||
|
||||
public:
|
||||
float& radius() { return m_size; }
|
||||
const float& radius() const { return m_size; }
|
||||
float& size() { return m_size; }
|
||||
const float& size() const { return m_size; }
|
||||
};
|
||||
|
||||
struct RoundedCube : Primitive
|
||||
|
@ -67,8 +67,8 @@ private:
|
|||
float m_radius;
|
||||
|
||||
public:
|
||||
float& radius() { return m_size; }
|
||||
const float& radius() const { return m_size; }
|
||||
float& size() { return m_size; }
|
||||
const float& size() const { return m_size; }
|
||||
|
||||
float& radius() { return m_radius; }
|
||||
const float& radius() const { return m_radius; }
|
||||
|
@ -81,8 +81,8 @@ private:
|
|||
float m_radius;
|
||||
|
||||
public:
|
||||
float& radius() { return m_height; }
|
||||
const float& radius() const { return m_height; }
|
||||
float& height() { return m_height; }
|
||||
const float& height() const { return m_height; }
|
||||
|
||||
float& radius() { return m_radius; }
|
||||
const float& radius() const { return m_radius; }
|
||||
|
@ -95,8 +95,8 @@ private:
|
|||
float m_radius;
|
||||
|
||||
public:
|
||||
float& radius() { return m_height; }
|
||||
const float& radius() const { return m_height; }
|
||||
float& height() { return m_height; }
|
||||
const float& height() const { return m_height; }
|
||||
|
||||
float& radius() { return m_radius; }
|
||||
const float& radius() const { return m_radius; }
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#version 400
|
||||
#version 430
|
||||
|
||||
uniform mat4 P;
|
||||
uniform mat4 V;
|
||||
|
@ -17,6 +17,23 @@ uniform vec3 ks;
|
|||
uniform float smoothing;
|
||||
uniform vec3 sphere_center;
|
||||
|
||||
layout (std430, binding=2) buffer newPrim
|
||||
{
|
||||
vec3 diffuse_color;
|
||||
vec3 specular_color;
|
||||
vec3 ambient_color;
|
||||
vec3 position;
|
||||
|
||||
int specular_exponent;
|
||||
int shape;
|
||||
|
||||
float radius;
|
||||
float height;
|
||||
float inner_radius;
|
||||
float outer_radius;
|
||||
float size
|
||||
}
|
||||
|
||||
out vec4 FragColor;
|
||||
|
||||
struct Torus
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
#version 400
|
||||
#version 430
|
||||
|
||||
layout(location = 0) in vec3 pos_attrib;
|
||||
|
||||
|
|
|
@ -16,12 +16,61 @@
|
|||
#include <glm/gtc/type_ptr.hpp>
|
||||
|
||||
#include <Camera.h>
|
||||
#include <Primitive.h>
|
||||
//#include <Primitive.h>
|
||||
|
||||
float vertices[] = {
|
||||
-0.5f, -0.5f, 0.0f,
|
||||
0.5f, -0.5f, 0.0f,
|
||||
0.0f, 0.5f, 0.0f
|
||||
#define P_SPHERE 0x00;
|
||||
#define P_TORUS 0x01;
|
||||
#define P_CONE 0x02;
|
||||
#define P_CUBE 0x03;
|
||||
#define P_ROUNDED_CUBE 0x04;
|
||||
#define P_CYLINDER 0x05;
|
||||
|
||||
struct Primitive
|
||||
{
|
||||
glm::vec3 diffuse_color = glm::vec3(0.8f);
|
||||
glm::vec3 specular_color = glm::vec3(1.0f);
|
||||
glm::vec3 ambient_color = glm::vec3(0.2f);
|
||||
glm::vec3 position = glm::vec3(0.0f);
|
||||
|
||||
unsigned int specular_exponent = 40;
|
||||
|
||||
unsigned int shape = -1;
|
||||
unsigned int SSBO = -1;
|
||||
unsigned int VBO = -1;
|
||||
unsigned int VAO = -1;
|
||||
|
||||
float radius = -1.f;
|
||||
float height = -1.f;
|
||||
float inner_radius = -1.f;
|
||||
float outer_radius = -1.f;
|
||||
float size = -1.f;
|
||||
|
||||
std::string name = "Primitive";
|
||||
};
|
||||
|
||||
struct Light
|
||||
{
|
||||
glm::vec3 diffuse_color = glm::vec3(0.8f);
|
||||
glm::vec3 specular_color = glm::vec3(1.0f);
|
||||
glm::vec3 ambient_color = glm::vec3(0.2f);
|
||||
glm::vec3 position = glm::vec3(0.0f);
|
||||
};
|
||||
|
||||
struct ScenePrimitives
|
||||
{
|
||||
std::vector<glm::vec3> p_diffuse;
|
||||
std::vector<glm::vec3> p_specular;
|
||||
std::vector<glm::vec3> p_ambient;
|
||||
std::vector<glm::vec3> p_position;
|
||||
|
||||
std::vector<unsigned int> p_spec_exp;
|
||||
std::vector<unsigned int> p_shape;
|
||||
|
||||
std::vector<float> p_radius;
|
||||
std::vector<float> p_height;
|
||||
std::vector<float> p_inner_radius;
|
||||
std::vector<float> p_outer_radius;
|
||||
std::vector<float> p_size;
|
||||
};
|
||||
|
||||
float canvas[] = {
|
||||
|
@ -41,7 +90,7 @@ namespace window
|
|||
|
||||
namespace scene
|
||||
{
|
||||
std::vector<Primitive> prims;
|
||||
//std::vector<Primitive> prims;
|
||||
Camera camera;
|
||||
unsigned int shader = -1;
|
||||
|
||||
|
@ -50,6 +99,25 @@ namespace scene
|
|||
float yaw = -90.f;
|
||||
float pitch = 0.f;
|
||||
|
||||
std::vector<glm::vec3> p_diffuse;
|
||||
std::vector<glm::vec3> p_specular;
|
||||
std::vector<glm::vec3> p_ambient;
|
||||
std::vector<glm::vec3> p_position;
|
||||
std::vector<unsigned int> p_spec_exp;
|
||||
std::vector<unsigned int> p_shape;
|
||||
std::vector<unsigned int> p_VBO;
|
||||
std::vector<unsigned int> p_VAO;
|
||||
std::vector<float> p_radius;
|
||||
std::vector<float> p_height;
|
||||
std::vector<float> p_inner_radius;
|
||||
std::vector<float> p_outer_radius;
|
||||
std::vector<float> p_size;
|
||||
|
||||
std::vector<glm::vec3> l_diffuse;
|
||||
std::vector<glm::vec3> l_specular;
|
||||
std::vector<glm::vec3> l_ambient;
|
||||
std::vector<glm::vec3> l_position;
|
||||
|
||||
glm::vec3 Lp = { 0.f, 1.f, 0.f }; // Light position
|
||||
glm::vec3 La = { 124.0 / 255.0, 114.0 / 255.0, 160.0 / 255.0 }; // Light ambient color
|
||||
glm::vec3 Ld = { 1.f, 1.f, 1.f }; // Light diffuse color
|
||||
|
@ -93,9 +161,29 @@ static char* ReadShaderSource(const char* shaderFile)
|
|||
return NULL;
|
||||
}
|
||||
|
||||
void addPrim(std::vector<Primitive>* p, Primitive newPrim)
|
||||
void AddPrimitive(Primitive newPrim)
|
||||
{
|
||||
p->push_back(newPrim);
|
||||
scene::p_diffuse.push_back(newPrim.diffuse_color);
|
||||
scene::p_specular.push_back(newPrim.specular_color);
|
||||
scene::p_ambient.push_back(newPrim.ambient_color);
|
||||
scene::p_position.push_back(newPrim.position);
|
||||
scene::p_spec_exp.push_back(newPrim.specular_exponent);
|
||||
scene::p_shape.push_back(newPrim.shape);
|
||||
scene::p_VBO.push_back(newPrim.VBO);
|
||||
scene::p_VAO.push_back(newPrim.VAO);
|
||||
scene::p_radius.push_back(newPrim.radius);
|
||||
scene::p_height.push_back(newPrim.height);
|
||||
scene::p_inner_radius.push_back(newPrim.inner_radius);
|
||||
scene::p_outer_radius.push_back(newPrim.outer_radius);
|
||||
scene::p_size.push_back(newPrim.size);
|
||||
}
|
||||
|
||||
void AddLight(Light newLight)
|
||||
{
|
||||
scene::l_diffuse.push_back(newLight.diffuse_color);
|
||||
scene::l_specular.push_back(newLight.specular_color);
|
||||
scene::l_ambient.push_back(newLight.ambient_color);
|
||||
scene::l_position.push_back(newLight.position);
|
||||
}
|
||||
|
||||
static unsigned int CompileShader(unsigned int type, const std::string& source)
|
||||
|
@ -161,6 +249,21 @@ void InitCanvas()
|
|||
|
||||
}
|
||||
|
||||
unsigned int InitPrimitive(Primitive newPrim)
|
||||
{
|
||||
glGenBuffers(1, &newPrim.SSBO);
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, newPrim.SSBO);
|
||||
glBufferData(GL_SHADER_STORAGE_BUFFER, sizeof(newPrim), &newPrim, GL_DYNAMIC_COPY);
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, 0);
|
||||
|
||||
glBindBuffer(GL_SHADER_STORAGE_BUFFER, newPrim.SSBO);
|
||||
GLvoid* p = glMapBuffer(GL_SHADER_STORAGE_BUFFER, GL_WRITE_ONLY);
|
||||
memcpy(p, &newPrim, sizeof(newPrim));
|
||||
glUnmapBuffer(GL_SHADER_STORAGE_BUFFER);
|
||||
|
||||
return newPrim.SSBO;
|
||||
}
|
||||
|
||||
//Draw the ImGui user interface
|
||||
void draw_gui(GLFWwindow* window)
|
||||
{
|
||||
|
@ -249,6 +352,12 @@ void display(GLFWwindow* window)
|
|||
glUniform3fv(sphere_center_loc, 1, glm::value_ptr(scene::sphere_center));
|
||||
}
|
||||
|
||||
int p_diffuse_loc = glGetUniformLocation(scene::shader, "p_diffuse");
|
||||
if (p_diffuse_loc != -1)
|
||||
{
|
||||
glUniform3fv(p_diffuse_loc, size(scene::p_diffuse), glm::value_ptr(scene::p_diffuse[0]));
|
||||
}
|
||||
|
||||
glUniform3fv(glGetUniformLocation(scene::shader, "light_pos"), 1, glm::value_ptr(scene::Lp));
|
||||
glUniform3fv(glGetUniformLocation(scene::shader, "la"), 1, glm::value_ptr(scene::La));
|
||||
glUniform3fv(glGetUniformLocation(scene::shader, "ld"), 1, glm::value_ptr(scene::Ld));
|
||||
|
@ -261,7 +370,7 @@ void display(GLFWwindow* window)
|
|||
|
||||
|
||||
glBindVertexArray(VAO);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, sizeof(vertices) / 3);
|
||||
glDrawArrays(GL_TRIANGLE_STRIP, 0, sizeof(canvas) / 3);
|
||||
|
||||
draw_gui(window);
|
||||
|
||||
|
|
|
@ -1,43 +1 @@
|
|||
#include "Primitive.h"
|
||||
|
||||
struct Primitive {
|
||||
glm::vec3 m_ambientColor;
|
||||
glm::vec3 m_diffuseColor;
|
||||
glm::vec3 m_specularColor;
|
||||
|
||||
glm::vec3 m_position;
|
||||
};
|
||||
|
||||
struct Sphere : public Primitive
|
||||
{
|
||||
float m_radius;
|
||||
};
|
||||
|
||||
struct Torus : public Primitive
|
||||
{
|
||||
float m_outerRadius;
|
||||
float m_innerRadius;
|
||||
};
|
||||
|
||||
struct Cube : public Primitive
|
||||
{
|
||||
float m_size;
|
||||
};
|
||||
|
||||
struct RoundedCube : public Primitive
|
||||
{
|
||||
float m_size;
|
||||
float m_radius;
|
||||
};
|
||||
|
||||
struct Cylinder : public Primitive
|
||||
{
|
||||
float m_height;
|
||||
float m_radius;
|
||||
};
|
||||
|
||||
struct Cone : public Primitive
|
||||
{
|
||||
float m_height;
|
||||
float m_radius;
|
||||
};
|
Loading…
Reference in New Issue