From b000a8f1ac1391c4ca150054b86415feb6338df9 Mon Sep 17 00:00:00 2001 From: bobarna <barnabas.borcsok@gmail.com> Date: Sun, 29 Nov 2020 01:56:32 +0100 Subject: [PATCH] obj reading and display successfull, but buggy --- renders/rename_png_to_bmp.py | 2 +- src/geometries/Geometry.h | 2 +- src/geometries/ObjGeometry.cpp | 27 +++++++++++++++++++++++---- src/geometries/ObjGeometry.h | 14 +++++++++++++- src/geometries/PBDSimulation.cpp | 4 ++-- src/geometries/VertexData.cpp | 8 ++++++++ src/geometries/VertexData.h | 2 ++ src/objects/HeadObject.h | 1 + src/rendering/Camera.cpp | 2 +- src/rendering/Scene.cpp | 21 +++++++++++---------- src/utils/OBJReader.cpp | 15 ++++----------- src/utils/OBJReader.h | 4 ++-- 12 files changed, 69 insertions(+), 33 deletions(-) diff --git a/renders/rename_png_to_bmp.py b/renders/rename_png_to_bmp.py index a97bea9..617b192 100755 --- a/renders/rename_png_to_bmp.py +++ b/renders/rename_png_to_bmp.py @@ -11,5 +11,5 @@ for path in pathlib.Path(".").iterdir(): old_extension = path.suffix directory = path.parent new_name = old_name + ".bmp" - + path.rename(pathlib.Path(directory, new_name)) diff --git a/src/geometries/Geometry.h b/src/geometries/Geometry.h index 7ff995b..be4a452 100644 --- a/src/geometries/Geometry.h +++ b/src/geometries/Geometry.h @@ -16,7 +16,7 @@ public: virtual void Draw() = 0; - virtual VertexData GetVertexDataByUV(float u, float v) {throw std::bad_exception();}; + virtual VertexData GetVertexDataByUV(float u, float v) { throw std::bad_exception(); }; ~Geometry(); }; diff --git a/src/geometries/ObjGeometry.cpp b/src/geometries/ObjGeometry.cpp index 0ca8111..c48fbe3 100644 --- a/src/geometries/ObjGeometry.cpp +++ b/src/geometries/ObjGeometry.cpp @@ -1,5 +1,24 @@ -// -// Created by bobarna on 2020. 11. 29.. -// - #include "ObjGeometry.h" + +ObjGeometry::ObjGeometry(const std::string &objPath) : + Geometry(), + objReader(objPath, vtxData) { + Initialize(); +} + +void ObjGeometry::Initialize() { + glBufferData(GL_ARRAY_BUFFER, sizeof(VertexData)*vtxData.size(), &vtxData[0], GL_STATIC_DRAW); + // Enable the vertex attribute arrays + glEnableVertexAttribArray(0); // attribute array 0 = POSITION + glEnableVertexAttribArray(1); // attribute array 1 = NORMAL + glEnableVertexAttribArray(2); // attribute array 2 = TEXCOORD0 + // attribute array, components/attribute, component type, normalize?, stride, offset + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (void *) offsetof(VertexData, position)); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(VertexData), (void *) offsetof(VertexData, normal)); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(VertexData), (void *) offsetof(VertexData, texcoord)); +} + +void ObjGeometry::Draw() { + glBindVertexArray(vao); + glDrawArrays(GL_TRIANGLES, 0, vtxData.size()); +} \ No newline at end of file diff --git a/src/geometries/ObjGeometry.h b/src/geometries/ObjGeometry.h index e650247..c34b803 100644 --- a/src/geometries/ObjGeometry.h +++ b/src/geometries/ObjGeometry.h @@ -2,8 +2,20 @@ #define BRAVE2_OBJGEOMETRY_H -class ObjGeometry { +#include "../utils/math.h" +#include "../utils/OBJReader.h" +#include "../objects/Object.h" +class ObjGeometry : public Geometry { + std::string objPath; + OBJReader objReader; +public: + //TODO read every data from OBJ file + ObjGeometry(const std::string &objPath); + + void Initialize(); + + void Draw() override; }; diff --git a/src/geometries/PBDSimulation.cpp b/src/geometries/PBDSimulation.cpp index 8e6dd78..1ce44f6 100644 --- a/src/geometries/PBDSimulation.cpp +++ b/src/geometries/PBDSimulation.cpp @@ -33,7 +33,7 @@ void PBDSimulation::propagateHead() { float currU = dis(gen); float currV = dis(gen); VertexData currPos = head->GetVertexDataByUV(currU, currV); - while(currPos.normal.y < .0f){ + while (currPos.normal.y < .0f) { currU = dis(gen); currV = dis(gen); currPos = head->GetVertexDataByUV(currU, currV); @@ -44,7 +44,7 @@ void PBDSimulation::propagateHead() { #endif vec3 color = util::getRandomRGBColorAround(vec3(222.0f, 101.0f, 32.0f), vec3(40.0f, 20.0f, 20.0f)); - strands.emplace_back(CreateStrand(nrSegments, lSeg, currPos.position * vec3(1,-1,1), color)); + strands.emplace_back(CreateStrand(nrSegments, lSeg, currPos.position * vec3(1, -1, 1), color)); } } diff --git a/src/geometries/VertexData.cpp b/src/geometries/VertexData.cpp index da8b209..9f8afec 100644 --- a/src/geometries/VertexData.cpp +++ b/src/geometries/VertexData.cpp @@ -3,3 +3,11 @@ std::ostream &operator<<(std::ostream &out, const VertexData &vD) { return out << vD.texcoord << " -> P: " << vD.position << " N: " << vD.normal; } + +VertexData::VertexData(vec3 p, vec3 n, vec2 uv) : + position(p), normal(n), texcoord(uv) { + +} + +VertexData::VertexData() { +} diff --git a/src/geometries/VertexData.h b/src/geometries/VertexData.h index 8bdfc9f..e808702 100644 --- a/src/geometries/VertexData.h +++ b/src/geometries/VertexData.h @@ -6,6 +6,8 @@ struct VertexData { vec3 position, normal; vec2 texcoord; + VertexData(); + VertexData(vec3 p, vec3 n, vec2 uv); }; std::ostream &operator<<(std::ostream &out, const VertexData &vD); diff --git a/src/objects/HeadObject.h b/src/objects/HeadObject.h index e5f901b..f5a22ac 100644 --- a/src/objects/HeadObject.h +++ b/src/objects/HeadObject.h @@ -6,6 +6,7 @@ class HeadObject : public Object { public: HeadObject(Shader *_shader, Geometry *_geometry, Material *_material, Texture *_texture); + VertexData GetVertexDataByUV(float u, float v); }; diff --git a/src/rendering/Camera.cpp b/src/rendering/Camera.cpp index 9c3677d..ea2f1ce 100644 --- a/src/rendering/Camera.cpp +++ b/src/rendering/Camera.cpp @@ -31,7 +31,7 @@ mat4 Camera::P() const { } void Camera::Translate(vec3 dir) { - vec3 forward = dir * vec3(0,0,1.f); + vec3 forward = dir * vec3(0, 0, 1.f); wEye = normalize(wEye + dir) * length(wEye) + forward; } diff --git a/src/rendering/Scene.cpp b/src/rendering/Scene.cpp index d09d161..d6d5bca 100644 --- a/src/rendering/Scene.cpp +++ b/src/rendering/Scene.cpp @@ -3,6 +3,7 @@ #include "../geometries/ParamSurface.h" #include "shaders/PhongShader.h" #include "../utils/OBJReader.h" +#include "../geometries/ObjGeometry.h" Scene::Scene(int w, int h) : camera(vec3(0, -.15f, .5), // Camera position (wEye) vec3(0, -.15f, 0), // wLookat @@ -11,19 +12,11 @@ Scene::Scene(int w, int h) : camera(vec3(0, -.15f, .5), // Camera position (wEye } - void Scene::Build() { size_t nrSims = 200; size_t nrSegments = 30; float lSeg = 0.025f; - std::vector<vec3> objVertices; - std::vector<vec2> objUvs; - std::vector<vec3> objNormals; - std::string objPath = "data/sphere.obj"; - OBJReader objReader(objPath, objVertices, objUvs, objNormals); - - Shader *basicShader = new BasicShader(); basicShader->Bind(camera.getState()); @@ -42,11 +35,19 @@ void Scene::Build() { auto headObject = new HeadObject(phongShader, sphere, headMaterial, headTexture); headObject->Scale(vec3(.15, .1, .1)); - objects.push_back(headObject); +// objects.push_back(headObject); auto PBDSim = new PBDSimulation(headObject, nrSims, nrSegments, lSeg); auto simulationObject = new HairSimObject(headObject, basicShader, PBDSim); - sims.push_back(simulationObject); +// sims.push_back(simulationObject); + + auto testObject = + new Object(phongShader, + new ObjGeometry("../data/test.obj"), + headMaterial, + headTexture); + + objects.push_back(testObject); // Lights lights.resize(3); diff --git a/src/utils/OBJReader.cpp b/src/utils/OBJReader.cpp index 680ea6f..e102360 100644 --- a/src/utils/OBJReader.cpp +++ b/src/utils/OBJReader.cpp @@ -1,7 +1,6 @@ #include "OBJReader.h" -OBJReader::OBJReader(const std::string &filePath, std::vector<vec3> &out_vertices, std::vector<vec2> &out_uvs, - std::vector<vec3> &out_normals) : is(filePath) { +OBJReader::OBJReader(const std::string &filePath, std::vector<VertexData> &out_vtxData) : is(filePath) { if (!is) { std::cerr << "Can't open OBJ file: " << filePath << std::endl; @@ -9,17 +8,12 @@ OBJReader::OBJReader(const std::string &filePath, std::vector<vec3> &out_vertice } readData(); - if (is.fail()) - std::cerr << filePath << std::endl; + for (auto curr: out_vtxData) + std::cout << curr << std::endl; for (unsigned int i : vertexIndices) - out_vertices.push_back(temp_vertices[i - 1]); + out_vtxData.emplace_back(temp_vertices[i - 1], temp_normals[i - 1], temp_uvs[i - 1]); - for (unsigned int i : uvIndices) - out_uvs.push_back(temp_uvs[i - 1]); - - for (unsigned int i : normalIndices) - out_normals.push_back(temp_normals[i - 1]); } @@ -48,7 +42,6 @@ void OBJReader::readData() { std::getline(is, lineType); // output rest of the line std::cerr << " " << lineType << std::endl; - is.setstate(std::iostream::failbit); } } } diff --git a/src/utils/OBJReader.h b/src/utils/OBJReader.h index 7027743..73b66ea 100644 --- a/src/utils/OBJReader.h +++ b/src/utils/OBJReader.h @@ -5,6 +5,7 @@ #include <vector> #include <fstream> #include "math.h" +#include "../geometries/VertexData.h" class OBJReader { std::vector<unsigned int> vertexIndices, uvIndices, normalIndices; @@ -15,8 +16,7 @@ class OBJReader { std::ifstream is; public: - OBJReader(const std::string &filePath, std::vector<vec3> &vertices, std::vector<vec2> &uvs, - std::vector<vec3> &normals); + OBJReader(const std::string &filePath, std::vector<VertexData>& out_vtxData); void readData(); -- GitLab