render obj file
This commit is contained in:
@@ -1,16 +1,85 @@
|
||||
#include "pch.hpp"
|
||||
|
||||
#include "Object.h"
|
||||
#include "utils/Objects/Body.h"
|
||||
|
||||
namespace Archimedes {
|
||||
|
||||
Body readOBJ(std::string path, Shader shader) {
|
||||
|
||||
std::ifstream file(path);
|
||||
|
||||
if(!file.is_open()) return Body();
|
||||
|
||||
std::string s;
|
||||
|
||||
std::vector<float> verticies;
|
||||
std::vector<unsigned int> indicies;
|
||||
|
||||
unsigned int i = 0;
|
||||
unsigned int j = 0;
|
||||
|
||||
float point;
|
||||
unsigned int idx;
|
||||
|
||||
while(!file.eof()) {
|
||||
getline(file, s, ' ');
|
||||
|
||||
//std::cout << "\nline start: " << s << std::endl;
|
||||
|
||||
if(s == "v") {
|
||||
file >> point;
|
||||
verticies.push_back(point);
|
||||
//std::cout << "point1: " << point << std::endl;
|
||||
|
||||
file >> point;
|
||||
verticies.push_back(point);
|
||||
//std::cout << "point2: " << point << std::endl;
|
||||
|
||||
file >> point;
|
||||
verticies.push_back(point);
|
||||
//std::cout << "point3: " << point << std::endl;
|
||||
|
||||
//std::cout << "index: " << j << std::endl;
|
||||
|
||||
getline(file, s);
|
||||
//file.ignore();
|
||||
} else if(s == "f") {
|
||||
|
||||
file >> idx;
|
||||
indicies.push_back(--idx);
|
||||
file.ignore(5, ' ');
|
||||
|
||||
file >> idx;
|
||||
indicies.push_back(--idx);
|
||||
file.ignore(5, ' ');
|
||||
|
||||
file >> idx;
|
||||
indicies.push_back(--idx);
|
||||
getline(file, s);
|
||||
|
||||
} else {
|
||||
getline(file, s);
|
||||
}
|
||||
}
|
||||
|
||||
file.close();
|
||||
|
||||
return Body(
|
||||
VertexBuffer(verticies),
|
||||
IndexArray(indicies),
|
||||
VertexLayout(),
|
||||
shader
|
||||
);
|
||||
}
|
||||
|
||||
using json = nlohmann::json;
|
||||
|
||||
class JObject {
|
||||
|
||||
public:
|
||||
JObject(std::string path) {
|
||||
JObject() {}
|
||||
|
||||
void load(std::string path) {
|
||||
std::ifstream file(path);
|
||||
if (!file.is_open()) goodJSON = false;
|
||||
document = json::parse(file);
|
||||
@@ -25,9 +94,41 @@ namespace Archimedes {
|
||||
|
||||
bool isValid() const { return goodJSON; }
|
||||
|
||||
std::vector<Object> buildObjects() {
|
||||
Body createCircle(json& element, std::string name) {
|
||||
std::vector<float> v;
|
||||
std::vector<unsigned int> i;
|
||||
|
||||
std::vector<Object> v;
|
||||
for(int it = 0; it < resolution; it++) {
|
||||
v.push_back(glm::cos(2.0f * glm::pi<float>() / resolution));
|
||||
v.push_back(glm::sin(2.0f * glm::pi<float>() / resolution));
|
||||
v.push_back(0.0f);
|
||||
|
||||
i.push_back(it);
|
||||
}
|
||||
|
||||
return Body(
|
||||
VertexBuffer(v),
|
||||
IndexArray(i),
|
||||
VertexLayout(),
|
||||
shader
|
||||
);
|
||||
}
|
||||
|
||||
Body createRect(json& element, std::string name) {
|
||||
return Body();
|
||||
}
|
||||
|
||||
Body createPoly(json& element, std::string name) {
|
||||
return Body();
|
||||
}
|
||||
|
||||
Body createText(json& element, std::string name) {
|
||||
return Body();
|
||||
}
|
||||
|
||||
std::vector<Body> buildObjects() {
|
||||
|
||||
std::vector<Body> v;
|
||||
|
||||
|
||||
for (json::const_iterator it = templates.cbegin(); it != templates.cend(); it++)
|
||||
@@ -35,7 +136,9 @@ namespace Archimedes {
|
||||
json element = *it;
|
||||
std::string name = element["name"];
|
||||
std::string type = element["type"];
|
||||
if (type == "CIRCLE") {}
|
||||
if (type == "CIRCLE") {
|
||||
objectMap[name] = createCircle(element, name);
|
||||
}
|
||||
if (type == "SQUARE") {}
|
||||
if (type == "RECTANGLE") {}
|
||||
if (type == "POLYGON") {}
|
||||
@@ -47,8 +150,16 @@ namespace Archimedes {
|
||||
|
||||
private:
|
||||
|
||||
std::unordered_map<std::string, Body> objectMap;
|
||||
|
||||
std::unordered_map<std::string, Body> templateMap;
|
||||
|
||||
bool goodJSON = true;
|
||||
|
||||
Shader shader;
|
||||
|
||||
unsigned int resolution = 50;
|
||||
|
||||
json document, templates, objects, setup, cameras, lights, actions;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
|
||||
|
||||
#include "Sandbox.h"
|
||||
|
||||
#include "JObject.h"
|
||||
|
||||
|
||||
Sandbox::Sandbox(Archimedes::App* a, void* h) : Archimedes::Module(a, h) {
|
||||
@@ -56,101 +56,74 @@ void Sandbox::onLoad() {
|
||||
|
||||
window->getRenderer()->useShader(cubeShader);
|
||||
|
||||
cube = Archimedes::RenderTarget(
|
||||
Archimedes::VertexBuffer(vertices, 24 * sizeof(float)),
|
||||
Archimedes::IndexArray(indices, 36),
|
||||
cube = Archimedes::Body(
|
||||
Archimedes::VertexBuffer(vertices),
|
||||
Archimedes::IndexArray(indices),
|
||||
Archimedes::VertexLayout(),
|
||||
cubeShader
|
||||
);
|
||||
|
||||
window->getRenderer()->setupRenderTarget(cube);
|
||||
window->getRenderer()->setupRenderTarget(cube.getMesh());
|
||||
|
||||
grid = Archimedes::RenderTarget(
|
||||
Archimedes::VertexBuffer(gridVertices, 12 * sizeof(float)),
|
||||
Archimedes::IndexArray(gridIndices, 6),
|
||||
grid = Archimedes::Body(
|
||||
Archimedes::VertexBuffer(gridVertices),
|
||||
Archimedes::IndexArray(gridIndices),
|
||||
Archimedes::VertexLayout(),
|
||||
cubeShader
|
||||
);
|
||||
|
||||
window->getRenderer()->setupRenderTarget(grid);
|
||||
window->getRenderer()->setupRenderTarget(grid.getMesh());
|
||||
|
||||
|
||||
int w, h;
|
||||
window->getSize(w, h);
|
||||
app->emitEvent(new Archimedes::ResizeWindowEvent(w, h));
|
||||
|
||||
hexagon = Archimedes::readOBJ("/home/nathan/Projects/tests/buildzone/hexagon_pad.obj", cubeShader);
|
||||
|
||||
window->getRenderer()->setupRenderTarget(hexagon.getMesh());
|
||||
|
||||
|
||||
hexagon.scaleTo(0.01f);
|
||||
}
|
||||
|
||||
void Sandbox::run() {
|
||||
|
||||
static float scale = 1.0f;
|
||||
static float scale = 1.0f, scalePrev = 1.0f;
|
||||
|
||||
static glm::vec3 pos(0), rot(0);
|
||||
static glm::vec3 posPrev(0), rotPrev(0);
|
||||
|
||||
static glm::vec4 color = { 0.4f, 0.0f, 0.3f, 1.0f };
|
||||
|
||||
static glm::vec3 camPos(0.0f, 0.0f, 3.0f), camRot(0.0f, glm::pi<float>(), 0.0f);
|
||||
|
||||
static glm::mat4 orthoCamera, perspCamera, cameraTransform;
|
||||
|
||||
/*
|
||||
cameraTransform = glm::mat4(1.0f);
|
||||
cameraTransform = glm::translate(cameraTransform, camPos);
|
||||
cameraTransform = glm::rotate(cameraTransform, camRot.x, glm::vec3(1.0f, 0.0f, 0.0f));
|
||||
cameraTransform = glm::rotate(cameraTransform, camRot.y, glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
cameraTransform = glm::rotate(cameraTransform, camRot.z, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||
*/
|
||||
static glm::mat4 orthoMat, perspMat, cameraTransform;
|
||||
|
||||
cameraTransform = glm::lookAt(
|
||||
camPos,
|
||||
camPos + glm::normalize(glm::vec3(glm::sin(camRot.y) * glm::cos(camRot.x), glm::sin(camRot.x), glm::cos(camRot.y) * glm::cos(camRot.x))),
|
||||
glm::vec3(0.0f, 1.0f, 0.0f)
|
||||
);
|
||||
/*
|
||||
cameraTransform = glm::lookAt(
|
||||
camPos,
|
||||
glm::vec3(0.0f, 0.0f, 0.0f),
|
||||
glm::vec3(0.0f, 1.0f, 0.0f)
|
||||
);
|
||||
*/
|
||||
|
||||
int w, h;
|
||||
window->getSize(w, h);
|
||||
|
||||
orthoCamera = glm::ortho(-(float)w / 2.0f, (float)w / 2.0f, -(float)h / 2.0f, (float)h / 2.0f, 0.1f, 100.0f)
|
||||
* cameraTransform;
|
||||
orthoMat = glm::ortho(-(float)w / 2.0f, (float)w / 2.0f, -(float)h / 2.0f, (float)h / 2.0f, 0.1f, 100.0f);
|
||||
|
||||
perspCamera = glm::perspective(glm::radians(45.0f), (float)w/(float)h, 0.1f, 100.0f)
|
||||
* cameraTransform;
|
||||
perspMat = glm::perspective(glm::radians(45.0f), (float)w/(float)h, 0.1f, 100.0f);
|
||||
|
||||
glm::mat4& cubeTransform = cube.transform;
|
||||
//glm::mat4& gridTransform = grid.transform;
|
||||
|
||||
cubeTransform = glm::mat4(1.0f);
|
||||
cubeTransform = glm::translate(cubeTransform, pos);
|
||||
cubeTransform = glm::rotate(cubeTransform, rot.x, glm::vec3(1.0f, 0.0f, 0.0f));
|
||||
cubeTransform = glm::rotate(cubeTransform, rot.y, glm::vec3(0.0f, 1.0f, 0.0f));
|
||||
cubeTransform = glm::rotate(cubeTransform, rot.z, glm::vec3(0.0f, 0.0f, 1.0f));
|
||||
cubeTransform = glm::scale(cubeTransform, glm::vec3(scale));
|
||||
|
||||
pos = cube.moveRel(pos - posPrev);
|
||||
rot = cube.rotateRel(rot - rotPrev);
|
||||
scale = cube.scaleRel(scale / scalePrev);
|
||||
|
||||
//gridTransform = glm::mat4(1.0f);
|
||||
//gridTransform = glm::scale(gridTransform, glm::vec3(800.0f));
|
||||
|
||||
|
||||
//cubeTransform = orthoCamera * cubeTransform;
|
||||
cubeTransform = perspCamera * cubeTransform;
|
||||
|
||||
//gridTransform = orthoCamera * gridTransform;
|
||||
|
||||
/*
|
||||
cubeTransform = glm::perspective(glm::radians(45.0f), (float)w/(float)h, 0.1f, 100.0f)
|
||||
* glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 1.0f, 0.0f))
|
||||
* cubeTransform;
|
||||
*/
|
||||
|
||||
|
||||
//window->getRenderer()->draw(grid);
|
||||
window->getRenderer()->draw(cube, color, Archimedes::Renderer::RenderMode::Triangles);
|
||||
posPrev = pos;
|
||||
rotPrev = rot;
|
||||
scalePrev = scale;
|
||||
|
||||
//window->getRenderer()->draw(grid.getMesh(), grid.getTransform(), cameraTransform, perspMat, glm::vec4(0.7f));
|
||||
//window->getRenderer()->draw(cube.getMesh(), cube.getTransform(), cameraTransform, perspMat, color, Archimedes::Renderer::RenderMode::Triangles);
|
||||
window->getRenderer()->draw(hexagon.getMesh(), hexagon.getTransform(), cameraTransform, perspMat, color);
|
||||
|
||||
|
||||
{
|
||||
@@ -161,10 +134,10 @@ void Sandbox::run() {
|
||||
|
||||
ImGui::Text("Pick a clear color!");
|
||||
|
||||
ImGui::SliderFloat("r", &clearColor.r, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("g", &clearColor.g, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("b", &clearColor.b, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("a", &clearColor.a, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("clear r", &clearColor.r, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("clear g", &clearColor.g, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("clear b", &clearColor.b, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("clear a", &clearColor.a, 0.0f, 1.0f);
|
||||
|
||||
ImGui::Text("Properties");
|
||||
|
||||
@@ -178,20 +151,20 @@ void Sandbox::run() {
|
||||
ImGui::SliderFloat("y", &pos.y, -10.0f, 10.0f);
|
||||
ImGui::SliderFloat("z", &pos.z, -10.0f, 10.0f);
|
||||
|
||||
ImGui::SliderFloat("cube r", &color.r, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("cube g", &color.g, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("cube b", &color.b, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("cube a", &color.a, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("r", &color.r, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("g", &color.g, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("b", &color.b, 0.0f, 1.0f);
|
||||
ImGui::SliderFloat("a", &color.a, 0.0f, 1.0f);
|
||||
|
||||
ImGui::Text("Camera Properties");
|
||||
|
||||
ImGui::SliderFloat("c_pitch", &camRot.x, -glm::pi<float>(), glm::pi<float>());
|
||||
ImGui::SliderFloat("c_yaw", &camRot.y, 0, 2 * glm::pi<float>());
|
||||
ImGui::SliderFloat("c_roll", &camRot.z, -glm::pi<float>(), glm::pi<float>());
|
||||
ImGui::SliderFloat("cam pitch", &camRot.x, -glm::pi<float>(), glm::pi<float>());
|
||||
ImGui::SliderFloat("cam yaw", &camRot.y, 0, 2 * glm::pi<float>());
|
||||
ImGui::SliderFloat("cam roll", &camRot.z, -glm::pi<float>(), glm::pi<float>());
|
||||
|
||||
ImGui::SliderFloat("c_x", &camPos.x, -10.0f, 10.0f);
|
||||
ImGui::SliderFloat("c_y", &camPos.y, -10.0f, 10.0f);
|
||||
ImGui::SliderFloat("c_z", &camPos.z, -10.0f, 10.0f);
|
||||
ImGui::SliderFloat("cam x", &camPos.x, -10.0f, 10.0f);
|
||||
ImGui::SliderFloat("cam y", &camPos.y, -10.0f, 10.0f);
|
||||
ImGui::SliderFloat("cam z", &camPos.z, -10.0f, 10.0f);
|
||||
|
||||
|
||||
if(ImGui::Button("Reset Window Size")) {
|
||||
@@ -209,23 +182,32 @@ bool Sandbox::onEvent(const Archimedes::Event& e) {
|
||||
|
||||
unsigned int type = app->getEventType(e);
|
||||
|
||||
ImGuiIO& io = ImGui::GetIO(); (void)io;
|
||||
|
||||
if(type == app->getEventType(Archimedes::KeyPressedWindowEvent())) {
|
||||
if(type == app->getEventType(Archimedes::KeyPressedWindowEvent()) && !io.WantCaptureKeyboard) {
|
||||
|
||||
return false;
|
||||
} else if(type == app->getEventType(Archimedes::KeyReleasedWindowEvent())) {
|
||||
} else if(type == app->getEventType(Archimedes::KeyReleasedWindowEvent()) && !io.WantCaptureKeyboard) {
|
||||
|
||||
return false;
|
||||
} else if(type == app->getEventType(Archimedes::MouseButtonPressedWindowEvent())) {
|
||||
} else if(type == app->getEventType(Archimedes::MouseButtonPressedWindowEvent()) && !io.WantCaptureMouse) {
|
||||
|
||||
return false;
|
||||
} else if(type == app->getEventType(Archimedes::MouseButtonReleasedWindowEvent())) {
|
||||
} else if(type == app->getEventType(Archimedes::MouseButtonReleasedWindowEvent()) && !io.WantCaptureMouse) {
|
||||
|
||||
return false;
|
||||
} else if(type == app->getEventType(Archimedes::ScrollWindowEvent())) {
|
||||
} else if(type == app->getEventType(Archimedes::ScrollWindowEvent()) && !io.WantCaptureMouse) {
|
||||
|
||||
return false;
|
||||
} else if(type == app->getEventType(Archimedes::MouseMovedWindowEvent())) {
|
||||
Archimedes::ScrollWindowEvent event = (Archimedes::ScrollWindowEvent&) e;
|
||||
|
||||
//cube.rotateRel(glm::vec3(glm::pi<float>() * event.dy / 50.0f, 0.0f, 0.0f));
|
||||
|
||||
//cube.rotateRel(glm::vec3(0.0f, glm::pi<float>() * event.dx / 50.0f, 0.0f));
|
||||
|
||||
hexagon.scaleAdd(0.001f * event.dy);
|
||||
|
||||
return true;
|
||||
} else if(type == app->getEventType(Archimedes::MouseMovedWindowEvent()) && !io.WantCaptureMouse) {
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -6,6 +6,9 @@
|
||||
#include "modules/WindowModule/WindowModule.h"
|
||||
#include "modules/ImguiModule/ImguiModule.h"
|
||||
|
||||
#include "utils/Objects/Body.h"
|
||||
#include "utils/Objects/Camera.h"
|
||||
|
||||
class Sandbox : public Archimedes::Module {
|
||||
|
||||
public:
|
||||
@@ -28,17 +31,19 @@ class Sandbox : public Archimedes::Module {
|
||||
std::string cubeVS = "#version 330 core\n"
|
||||
"layout (location = 0) in vec3 aPos;\n"
|
||||
"uniform mat4 model;\n"
|
||||
"uniform uvec2 res;\n"
|
||||
"uniform mat4 view;\n"
|
||||
"uniform mat4 proj;\n"
|
||||
"uniform vec4 color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
" gl_Position = model * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
|
||||
" gl_Position = proj * view * model * vec4(aPos.x, aPos.y, aPos.z, 1.0);\n"
|
||||
"}\0";
|
||||
|
||||
std::string cubeFS = "#version 330 core\n"
|
||||
"out vec4 FragColor;\n"
|
||||
"uniform mat4 model;\n"
|
||||
"uniform uvec2 res;\n"
|
||||
"uniform mat4 view;\n"
|
||||
"uniform mat4 proj;\n"
|
||||
"uniform vec4 color;\n"
|
||||
"void main()\n"
|
||||
"{\n"
|
||||
@@ -47,16 +52,16 @@ class Sandbox : public Archimedes::Module {
|
||||
|
||||
|
||||
Archimedes::Shader cubeShader, gridShader;
|
||||
Archimedes::RenderTarget cube, grid;
|
||||
Archimedes::Body cube, grid, hexagon;
|
||||
|
||||
float gridVertices[24] = {
|
||||
std::vector<float> gridVertices = {
|
||||
-1.0f, 0.0f, 1.0f,
|
||||
1.0f, 0.0f, 1.0f,
|
||||
1.0f, 0.0f, -1.0f,
|
||||
-1.0f, 0.0f, -1.0f,
|
||||
};
|
||||
|
||||
unsigned int gridIndices[6] = {
|
||||
std::vector<unsigned int> gridIndices = {
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
@@ -65,7 +70,7 @@ class Sandbox : public Archimedes::Module {
|
||||
0
|
||||
};
|
||||
|
||||
float vertices[24] = {
|
||||
std::vector<float> vertices = {
|
||||
-0.5f, -0.5f, 0.5f,
|
||||
0.5f, -0.5f, 0.5f,
|
||||
0.5f, 0.5f, 0.5f,
|
||||
@@ -79,7 +84,7 @@ class Sandbox : public Archimedes::Module {
|
||||
|
||||
};
|
||||
|
||||
unsigned int indices[36] = {
|
||||
std::vector<unsigned int> indices = {
|
||||
0,
|
||||
1,
|
||||
2,
|
||||
|
||||
Reference in New Issue
Block a user