pool allocation. not working. not sure why. will travel back in time...
This commit is contained in:
56
src/body.cpp
56
src/body.cpp
@@ -2,7 +2,6 @@
|
||||
#include <glad/glad.h>
|
||||
#include <map>
|
||||
#include <string>
|
||||
#include <optional>
|
||||
|
||||
#include "util.hpp"
|
||||
#include "body.hpp"
|
||||
@@ -17,29 +16,24 @@ enum class ParserState {
|
||||
FACE_SKIP,
|
||||
};
|
||||
|
||||
static map<string, pair<vector<float>, vector<int>>> cache;
|
||||
static map<string, ObjData> cache;
|
||||
|
||||
optional<pair<vector<float>, vector<int>>> _parse_obj(const char* obj_filepath);
|
||||
bool _parse_obj(ObjData* data, const char* obj_filepath);
|
||||
|
||||
bool load_body(Body* out_body, const char* obj_filepath) {
|
||||
vector<float> verts;
|
||||
vector<int> faces;
|
||||
|
||||
ObjData data;
|
||||
if (auto it = cache.find(obj_filepath); it != cache.end()) {
|
||||
verts = it->second.first;
|
||||
faces = it->second.second;
|
||||
} else if (auto pair = _parse_obj(obj_filepath); pair.has_value()) {
|
||||
verts = pair.value().first;
|
||||
faces = pair.value().second;
|
||||
cache[obj_filepath] = pair.value();
|
||||
data = it->second;
|
||||
} else if (_parse_obj(&data, obj_filepath)) {
|
||||
cache[obj_filepath] = data;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
|
||||
// Need a good validation check here. This is a stand in.
|
||||
if (verts.size() == 0 || faces.size() == 0) {
|
||||
printf(
|
||||
"Obj file appears incomplete or corrupted. Num verts %zu. Num Faces %zu.\n", verts.size(), faces.size());
|
||||
if (data.verts_len == 0 || data.faces_len == 0) {
|
||||
printf("Obj file appears incomplete or corrupted. Num verts %d. Num Faces %d.\n", data.verts_len,
|
||||
data.faces_len);
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -55,22 +49,15 @@ bool load_body(Body* out_body, const char* obj_filepath) {
|
||||
glBindVertexArray(vao);
|
||||
|
||||
glBindBuffer(GL_ARRAY_BUFFER, vbo);
|
||||
glBufferData(GL_ARRAY_BUFFER, verts.size() * sizeof(float), &verts[0], GL_STATIC_DRAW);
|
||||
glBufferData(GL_ARRAY_BUFFER, data.verts_len * sizeof(float), data.verts, GL_STATIC_DRAW);
|
||||
|
||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, faces.size() * sizeof(int), &faces[0], GL_STATIC_DRAW);
|
||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, data.faces_len * sizeof(int), &data.faces, GL_STATIC_DRAW);
|
||||
|
||||
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
|
||||
glEnableVertexAttribArray(0);
|
||||
|
||||
out_body->pose = glm::mat4(1);
|
||||
out_body->ebo = ebo;
|
||||
out_body->vao = vao;
|
||||
out_body->vbo = vbo;
|
||||
out_body->shader = 0;
|
||||
out_body->verts = verts;
|
||||
out_body->faces = faces;
|
||||
|
||||
*out_body = { .pose = glm::mat4(1), .ebo = ebo, .vao = vao, .vbo = vbo, .shader = 0, .data = data };
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -79,7 +66,7 @@ void draw_body(const Body& b) {
|
||||
set_uniform(b.shader, "global_t", glm::scale(b.pose, glm::vec3(b.scale)));
|
||||
set_uniform(b.shader, "color", b.color);
|
||||
glBindVertexArray(b.vao);
|
||||
glDrawElements(GL_TRIANGLES, b.faces.size(), GL_UNSIGNED_INT, 0);
|
||||
glDrawElements(GL_TRIANGLES, b.data.faces_len, GL_UNSIGNED_INT, 0);
|
||||
}
|
||||
|
||||
void create_new_sphere(Body* b, float scale) {
|
||||
@@ -87,7 +74,8 @@ void create_new_sphere(Body* b, float scale) {
|
||||
b->scale = scale;
|
||||
}
|
||||
|
||||
optional<pair<vector<float>, vector<int>>> _parse_obj(const char* obj_filepath) {
|
||||
// I need to write a good obj file parser at some point. This is basically garbage
|
||||
bool _parse_obj(ObjData* data, const char* obj_filepath) {
|
||||
string source;
|
||||
if (!read_file(&source, obj_filepath)) {
|
||||
return {};
|
||||
@@ -103,8 +91,11 @@ optional<pair<vector<float>, vector<int>>> _parse_obj(const char* obj_filepath)
|
||||
}
|
||||
}
|
||||
|
||||
vector<float> verts;
|
||||
vector<int> faces;
|
||||
float* verts = (float*)malloc(sizeof(float) * num_verts * 3);
|
||||
int* faces = (int*)malloc(sizeof(int) * num_faces * 3);
|
||||
|
||||
int vert_i = 0;
|
||||
int face_i = 0;
|
||||
|
||||
// Get ready for the parsing loop
|
||||
ParserState state = ParserState::PREFIX;
|
||||
@@ -123,14 +114,14 @@ optional<pair<vector<float>, vector<int>>> _parse_obj(const char* obj_filepath)
|
||||
break;
|
||||
case ParserState::VERTEX:
|
||||
if (iswspace(source[i])) {
|
||||
verts.push_back(atof(&source[start]));
|
||||
verts[vert_i++] = atof(&source[start]);
|
||||
start = i + 1;
|
||||
}
|
||||
break;
|
||||
case ParserState::FACE:
|
||||
if (source[i] == '/') {
|
||||
state = ParserState::FACE_SKIP;
|
||||
faces.push_back(atoi(&source[start]) - 1);
|
||||
faces[face_i++] = atoi(&source[start]) - 1;
|
||||
}
|
||||
break;
|
||||
case ParserState::FACE_SKIP:
|
||||
@@ -144,4 +135,7 @@ optional<pair<vector<float>, vector<int>>> _parse_obj(const char* obj_filepath)
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
*data = { .verts = verts, .verts_len = vert_i, .faces = faces, .faces_len = face_i };
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user