Fixed the bug where different source files were referencing a static variable. Turns out static vars are internally linked, which means there was a separate static variable defined for each source. I could have fixed this issue by using extern (see https://stackoverflow.com/questions/10422034/when-to-use-extern-in-c), but instead went with just assigning the shader manually im main. This is becoming very messy and needs a cleanup.
This commit is contained in:
@@ -4,8 +4,6 @@
|
|||||||
#include <glm/glm.hpp>
|
#include <glm/glm.hpp>
|
||||||
#include "util.hpp"
|
#include "util.hpp"
|
||||||
|
|
||||||
static uint shader;
|
|
||||||
|
|
||||||
struct Body {
|
struct Body {
|
||||||
glm::mat4 pose;
|
glm::mat4 pose;
|
||||||
float scale;
|
float scale;
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ bool load_body(Body* out_body, const char* obj_filepath) {
|
|||||||
|
|
||||||
void draw_body(const Body& b) {
|
void draw_body(const Body& b) {
|
||||||
use_shader(b.shader);
|
use_shader(b.shader);
|
||||||
set_uniform(b.shader, "global_t", b.scale*b.pose);
|
set_uniform(b.shader, "global_t", glm::scale(b.pose, glm::vec3(b.scale)));
|
||||||
set_uniform(b.shader, "color", b.color);
|
set_uniform(b.shader, "color", b.color);
|
||||||
glBindVertexArray(b.vao);
|
glBindVertexArray(b.vao);
|
||||||
glDrawElements(GL_TRIANGLES, b.faces.len, GL_UNSIGNED_INT, 0);
|
glDrawElements(GL_TRIANGLES, b.faces.len, GL_UNSIGNED_INT, 0);
|
||||||
@@ -125,7 +125,6 @@ void draw_body(const Body& b) {
|
|||||||
|
|
||||||
void create_new_sphere(Body* b, float scale) {
|
void create_new_sphere(Body* b, float scale) {
|
||||||
assert(load_body(b, "Icosphere.obj"));
|
assert(load_body(b, "Icosphere.obj"));
|
||||||
b->shader = shader;
|
|
||||||
b->scale = scale;
|
b->scale = scale;
|
||||||
b->pose = glm::translate(b->pose, glm::vec3(0, 0, 0));
|
b->pose = glm::translate(b->pose, glm::vec3(0, 0, 0));
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,9 @@ bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|||||||
|
|
||||||
char delim = ',';
|
char delim = ',';
|
||||||
char line[LINE_BUF_SIZE];
|
char line[LINE_BUF_SIZE];
|
||||||
|
// because clang refuses to cooperate with my append implementation and generate the function code...
|
||||||
|
*bodies_out
|
||||||
|
= { (Body*)malloc(sizeof(Body) * 3 * NUM_SPHERES_PER_AXE * 14), 3 * NUM_SPHERES_PER_AXE * 14 };
|
||||||
|
|
||||||
// read in header
|
// read in header
|
||||||
fgets(line, LINE_BUF_SIZE, fp);
|
fgets(line, LINE_BUF_SIZE, fp);
|
||||||
@@ -36,9 +39,9 @@ bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|||||||
for (int camera_i = 0; !feof(fp); camera_i++) {
|
for (int camera_i = 0; !feof(fp); camera_i++) {
|
||||||
|
|
||||||
Array<char*> words = split_str(line, delim);
|
Array<char*> words = split_str(line, delim);
|
||||||
float x = atof(words[0])/100.0f;
|
float x = atof(words[0]);
|
||||||
float y = atof(words[1])/100.0f;
|
float y = atof(words[1]);
|
||||||
float z = atof(words[2])/100.0f;
|
float z = atof(words[2]);
|
||||||
float w = atof(words[3]);
|
float w = atof(words[3]);
|
||||||
float i = atof(words[4]);
|
float i = atof(words[4]);
|
||||||
float j = atof(words[5]);
|
float j = atof(words[5]);
|
||||||
@@ -46,10 +49,6 @@ bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|||||||
|
|
||||||
glm::mat4 pose = glm::translate(quat_to_mat4(glm::quat(w, i, j, k)), glm::vec3(x, y, z));
|
glm::mat4 pose = glm::translate(quat_to_mat4(glm::quat(w, i, j, k)), glm::vec3(x, y, z));
|
||||||
|
|
||||||
// because clang refuses to cooperate with my append implementation and generate the function code...
|
|
||||||
*bodies_out
|
|
||||||
= { (Body*)malloc(sizeof(Body) * 3 * NUM_SPHERES_PER_AXE * 14), 3 * NUM_SPHERES_PER_AXE * 14 };
|
|
||||||
|
|
||||||
// Generate axis spheres
|
// Generate axis spheres
|
||||||
for (int i = 0; i < 3; i++) {
|
for (int i = 0; i < 3; i++) {
|
||||||
for (int j = 0; j < NUM_SPHERES_PER_AXE; j++) {
|
for (int j = 0; j < NUM_SPHERES_PER_AXE; j++) {
|
||||||
@@ -63,11 +62,12 @@ bool parse_poses(Array<Body>* bodies_out, const char* filepath) {
|
|||||||
// Now move the translated pose via the camera's pose
|
// Now move the translated pose via the camera's pose
|
||||||
b.pose = pose * glm::translate(b.pose, trans);
|
b.pose = pose * glm::translate(b.pose, trans);
|
||||||
b.color = glm::vec4(i == 0 ? 1 : 0, i == 1 ? 1 : 0, i == 2 ? 1 : 0, 1);
|
b.color = glm::vec4(i == 0 ? 1 : 0, i == 1 ? 1 : 0, i == 2 ? 1 : 0, 1);
|
||||||
b.scale = 0.2;
|
b.scale = 3;
|
||||||
printf("%d, ", camera_i * 3 * NUM_SPHERES_PER_AXE + i * NUM_SPHERES_PER_AXE + j);
|
printf("%d, ", camera_i * 3 * NUM_SPHERES_PER_AXE + i * NUM_SPHERES_PER_AXE + j);
|
||||||
bodies_out->data[camera_i*3*NUM_SPHERES_PER_AXE + i*NUM_SPHERES_PER_AXE + j] = b;
|
bodies_out->data[camera_i*3*NUM_SPHERES_PER_AXE + i*NUM_SPHERES_PER_AXE + j] = b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
fgets(line, LINE_BUF_SIZE, fp);
|
fgets(line, LINE_BUF_SIZE, fp);
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
31
src/main.cpp
31
src/main.cpp
@@ -39,6 +39,7 @@ static std::vector<std::tuple<char*, Body*, float>>
|
|||||||
camera_bodies; // I would use my array here, but was getting a linking error
|
camera_bodies; // I would use my array here, but was getting a linking error
|
||||||
|
|
||||||
void* process_cin(void* args) {
|
void* process_cin(void* args) {
|
||||||
|
return NULL;
|
||||||
std::string line;
|
std::string line;
|
||||||
while (true) {
|
while (true) {
|
||||||
std::getline(std::cin, line);
|
std::getline(std::cin, line);
|
||||||
@@ -99,17 +100,18 @@ static void cursor_position_callback(GLFWwindow* window, double xpos, double ypo
|
|||||||
prev_cursor_x = xpos;
|
prev_cursor_x = xpos;
|
||||||
prev_cursor_y = ypos;
|
prev_cursor_y = ypos;
|
||||||
|
|
||||||
|
double len = glm::length(camera_loc - focal_point);
|
||||||
|
|
||||||
if (mouse_pressed) {
|
if (mouse_pressed) {
|
||||||
phi += glm::radians(dx * (360 / width)); // * glm::radians(360.0);
|
phi += glm::radians(dx * (360 / width)); // * glm::radians(360.0);
|
||||||
theta += glm::radians(dy * (360 / height)); // * glm::radians(360.0);
|
theta += glm::radians(dy * (360 / height)); // * glm::radians(360.0);
|
||||||
double len = glm::length(camera_loc - focal_point);
|
|
||||||
camera_loc.x = focal_point.x + (len * glm::cos(theta) * glm::cos(-phi));
|
camera_loc.x = focal_point.x + (len * glm::cos(theta) * glm::cos(-phi));
|
||||||
camera_loc.y = focal_point.y + (len * glm::sin(theta));
|
camera_loc.y = focal_point.y + (len * glm::sin(theta));
|
||||||
camera_loc.z = focal_point.z + (-len * glm::cos(theta) * glm::sin(-phi));
|
camera_loc.z = focal_point.z + (-len * glm::cos(theta) * glm::sin(-phi));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scroll_pressed) {
|
if (scroll_pressed) {
|
||||||
glm::vec4 move_vec = -strafe_x * (dx / 100) + strafe_y * (dy / 100);
|
glm::vec4 move_vec = (float)len * (- strafe_x * (dx / 500) + strafe_y * (dy / 500));
|
||||||
focal_point += move_vec;
|
focal_point += move_vec;
|
||||||
camera_loc += move_vec;
|
camera_loc += move_vec;
|
||||||
}
|
}
|
||||||
@@ -141,7 +143,7 @@ bool glfw_setup() {
|
|||||||
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3);
|
||||||
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE);
|
||||||
// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
// glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE);
|
||||||
window = glfwCreateWindow(800, 800, "LearnOpenGL", NULL, NULL);
|
window = glfwCreateWindow(800, 800, "LivePlotter", NULL, NULL);
|
||||||
if (window == NULL) {
|
if (window == NULL) {
|
||||||
printf("Failed to create GLFW window\n");
|
printf("Failed to create GLFW window\n");
|
||||||
glfwTerminate();
|
glfwTerminate();
|
||||||
@@ -171,21 +173,17 @@ int main() {
|
|||||||
|
|
||||||
const char* vertex_filepath = "src/shaders/vertex.glsl";
|
const char* vertex_filepath = "src/shaders/vertex.glsl";
|
||||||
const char* fragment_filepath = "src/shaders/fragment.glsl";
|
const char* fragment_filepath = "src/shaders/fragment.glsl";
|
||||||
|
uint shader;
|
||||||
if (!load_shader(&shader, vertex_filepath, fragment_filepath))
|
if (!load_shader(&shader, vertex_filepath, fragment_filepath))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
// glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
//glClearColor(0.2f, 0.3f, 0.3f, 1.0f);
|
||||||
glClearColor(0, 0, 0, 0);
|
glClearColor(0, 0, 0, 0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer
|
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer
|
||||||
|
|
||||||
glfwSwapBuffers(window); // front buffer is now back
|
glfwSwapBuffers(window); // front buffer is now back
|
||||||
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer again (former front buf)
|
glClear(GL_COLOR_BUFFER_BIT); // Write to back buffer again (former front buf)
|
||||||
|
|
||||||
Body b2;
|
|
||||||
create_new_sphere(&b2);
|
|
||||||
b2.pose = glm::translate(b2.pose, glm::vec3(0, 0, 20));
|
|
||||||
b2.color = glm::vec4(1, 0, 0, 1);
|
|
||||||
|
|
||||||
// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
// glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
|
||||||
// set_uniform(shader, "color", glm::vec4 { sin(time), sin(time + glm::radians(45.0f)), sin(time +
|
// set_uniform(shader, "color", glm::vec4 { sin(time), sin(time + glm::radians(45.0f)), sin(time +
|
||||||
// glm::radians(90.0f)), 1.0 } / 2.0f); time = glfwGetTime();
|
// glm::radians(90.0f)), 1.0 } / 2.0f); time = glfwGetTime();
|
||||||
@@ -193,9 +191,7 @@ int main() {
|
|||||||
glDisable(GL_CULL_FACE);
|
glDisable(GL_CULL_FACE);
|
||||||
glEnable(GL_DEPTH_TEST);
|
glEnable(GL_DEPTH_TEST);
|
||||||
|
|
||||||
glm::mat4 projection_t
|
glm::mat4 projection_t = glm::infinitePerspective(glm::radians(45.0f), (float)width / (float)height, 0.1f);
|
||||||
= glm::perspective(glm::radians(45.0f), (float)width / (float)height, 0.1f, 2000.0f);
|
|
||||||
|
|
||||||
pthread_t thread_id;
|
pthread_t thread_id;
|
||||||
pthread_create(&thread_id, NULL, process_cin, NULL);
|
pthread_create(&thread_id, NULL, process_cin, NULL);
|
||||||
|
|
||||||
@@ -203,6 +199,15 @@ int main() {
|
|||||||
if (!parse_poses(&camera_pose_axes, "poses.csv")) {
|
if (!parse_poses(&camera_pose_axes, "poses.csv")) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
for (int i = 0; i < camera_pose_axes.len; i++) {
|
||||||
|
camera_pose_axes[i].shader = shader;
|
||||||
|
}
|
||||||
|
|
||||||
|
Body b;
|
||||||
|
create_new_sphere(&b);
|
||||||
|
b.pose = glm::mat4(1);
|
||||||
|
b.color = glm::vec4(1, 1, 1, 1);
|
||||||
|
b.shader = shader;
|
||||||
|
|
||||||
while (!glfwWindowShouldClose(window)) {
|
while (!glfwWindowShouldClose(window)) {
|
||||||
process_input();
|
process_input();
|
||||||
@@ -210,7 +215,7 @@ int main() {
|
|||||||
set_uniform(shader, "camera_t", world_to_camera);
|
set_uniform(shader, "camera_t", world_to_camera);
|
||||||
set_uniform(shader, "projection_t", projection_t);
|
set_uniform(shader, "projection_t", projection_t);
|
||||||
|
|
||||||
draw_body(b2);
|
draw_body(b);
|
||||||
|
|
||||||
for (int i = 0; i < camera_pose_axes.len; i++) {
|
for (int i = 0; i < camera_pose_axes.len; i++) {
|
||||||
draw_body(camera_pose_axes[i]);
|
draw_body(camera_pose_axes[i]);
|
||||||
|
|||||||
Reference in New Issue
Block a user