Editing the modelimporter to allow to create scene graphs
This commit is contained in:
		@ -1,15 +1,15 @@
 | 
			
		||||
#include "Graphics/Buffer.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
int Buffer::getBufferID() {
 | 
			
		||||
int GpuBuffer::getBufferID() {
 | 
			
		||||
	return id;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Buffer::createBuffer() {
 | 
			
		||||
void GpuBuffer::createBuffer() {
 | 
			
		||||
	glGenBuffers(1, (GLuint*) &id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Buffer::setBufferData(void* data, size_t dataSize, bool elementBuffer = false ) {
 | 
			
		||||
void GpuBuffer::setBufferData(void* data, size_t dataSize, bool elementBuffer = false ) {
 | 
			
		||||
	
 | 
			
		||||
	if (elementBuffer) {
 | 
			
		||||
		glBufferData(GL_ELEMENT_ARRAY_BUFFER, dataSize, data, GL_STATIC_DRAW);
 | 
			
		||||
@ -21,7 +21,7 @@ void Buffer::setBufferData(void* data, size_t dataSize, bool elementBuffer = fal
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Buffer::Bind(bool elementBuffer = false ) {
 | 
			
		||||
void GpuBuffer::Bind(bool elementBuffer = false ) {
 | 
			
		||||
	if (elementBuffer) {
 | 
			
		||||
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, id);
 | 
			
		||||
 | 
			
		||||
@ -32,7 +32,7 @@ void Buffer::Bind(bool elementBuffer = false ) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Buffer::Unbind(bool elementBuffer = false) {
 | 
			
		||||
void GpuBuffer::Unbind(bool elementBuffer = false) {
 | 
			
		||||
	if (elementBuffer) {
 | 
			
		||||
		glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
 | 
			
		||||
	}
 | 
			
		||||
@ -42,6 +42,6 @@ void Buffer::Unbind(bool elementBuffer = false) {
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Buffer::Delete() {
 | 
			
		||||
void GpuBuffer::Delete() {
 | 
			
		||||
	glDeleteBuffers(1, (GLuint*) &id);
 | 
			
		||||
}
 | 
			
		||||
@ -1,70 +1,21 @@
 | 
			
		||||
#include "AssetManager/ModelImporter.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
void ModelImporter::ImportFBX(std::string path)
 | 
			
		||||
std::vector<BarinkEngine::Mesh> ModelImporter::Import(const std::string path)
 | 
			
		||||
{
 | 
			
		||||
    //spdlog::warn("ImportFBX not implemented!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ModelImporter::ImportBlend(std::string path)
 | 
			
		||||
{
 | 
			
		||||
    //spdlog::warn("ImportBlend not implemented!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ModelImporter::ImportGLTF(std::string path)
 | 
			
		||||
{
 | 
			
		||||
    //spdlog::warn("ImportGLTF not implemented!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ModelImporter::ImportOBJ(std::string path)
 | 
			
		||||
{
 | 
			
		||||
    //spdlog::warn("ImportOBJ not implemented!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ModelImporter::Import(std::string path)
 | 
			
		||||
{
 | 
			
		||||
    //spdlog::warn("Import not implemented!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<BarinkEngine::Mesh> ModelImporter::Test() {
 | 
			
		||||
   
 | 
			
		||||
    /*
 | 
			
		||||
    spdlog::info("====== Tiny GLTF ======");
 | 
			
		||||
    tinygltf::Model loadedModel;
 | 
			
		||||
    tinygltf::TinyGLTF loader;
 | 
			
		||||
    std::string error;
 | 
			
		||||
    std::string warn;
 | 
			
		||||
    bool ret = loader.LoadASCIIFromFile(&loadedModel, &error, &warn, "./Build/SandboxApplication/Debug/sponza.gltf");
 | 
			
		||||
 | 
			
		||||
    if (!warn.empty())
 | 
			
		||||
        spdlog::warn("TinyGLTF Warning: {}", warn);
 | 
			
		||||
    if (!error.empty())
 | 
			
		||||
        spdlog::error("TinyGLTF Error: {}", error);
 | 
			
		||||
    if (!ret) {
 | 
			
		||||
        spdlog::error("TinyGLTF Error: Failed to parse glTF");
 | 
			
		||||
        exit(-1);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    spdlog::info("Meshes in model: {}", loadedModel.meshes.size());
 | 
			
		||||
    spdlog::info("Primitives in mesh: {}", loadedModel.meshes[0].primitives.size());
 | 
			
		||||
 | 
			
		||||
    */
 | 
			
		||||
    
 | 
			
		||||
   
 | 
			
		||||
    //spdlog::info("======= Assimp ======");
 | 
			
		||||
 | 
			
		||||
    Assimp::Importer importer;
 | 
			
		||||
    const aiScene* scene = importer.ReadFile("build/SandboxApplication/Debug/Models/Cube.obj", aiProcess_Triangulate | aiProcess_FlipUVs);
 | 
			
		||||
    
 | 
			
		||||
    const aiScene* scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_FlipUVs);
 | 
			
		||||
 | 
			
		||||
    aiNode* currentNode = scene->mRootNode;
 | 
			
		||||
 | 
			
		||||
   return processNode(currentNode, scene);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return processNode(currentNode, scene);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::vector<BarinkEngine::Mesh> ModelImporter::processNode(aiNode* node, const aiScene* scene) {
 | 
			
		||||
std::vector<BarinkEngine::Mesh> ModelImporter::processNode(aiNode* node, const aiScene* scene) 
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
    std::vector<BarinkEngine::Mesh> meshes;
 | 
			
		||||
 | 
			
		||||
    for (unsigned int i = 0; i < node->mNumMeshes; i++) {
 | 
			
		||||
        aiMesh* mesh = scene->mMeshes[node->mMeshes[i]];
 | 
			
		||||
        meshes.push_back(processMesh(mesh, scene));
 | 
			
		||||
@ -85,6 +36,20 @@ BarinkEngine::Mesh ModelImporter::processMesh(aiMesh* mesh, const aiScene* scene
 | 
			
		||||
    std::vector<unsigned int> indices;
 | 
			
		||||
    std::vector<BarinkEngine::Vertex> vertices;
 | 
			
		||||
 | 
			
		||||
    ProcessVertices(mesh, vertices);
 | 
			
		||||
    
 | 
			
		||||
    ProcessIndices(mesh, indices);
 | 
			
		||||
 | 
			
		||||
    BarinkEngine::Mesh result;
 | 
			
		||||
    result.vertices = vertices;
 | 
			
		||||
    result.elements = indices;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProcessVertices(aiMesh* mesh, std::vector<BarinkEngine::Vertex>& out_vertices) {
 | 
			
		||||
    // Process vertices
 | 
			
		||||
    for (unsigned int i = 0; i < mesh->mNumVertices; i++) {
 | 
			
		||||
        BarinkEngine::Vertex v{};
 | 
			
		||||
@ -92,9 +57,9 @@ BarinkEngine::Mesh ModelImporter::processMesh(aiMesh* mesh, const aiScene* scene
 | 
			
		||||
        vector.x = mesh->mVertices[i].x;
 | 
			
		||||
        vector.y = mesh->mVertices[i].y;
 | 
			
		||||
        vector.z = mesh->mVertices[i].z;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        v.vertices = vector;
 | 
			
		||||
        
 | 
			
		||||
 | 
			
		||||
        if (mesh->mTextureCoords[0]) {
 | 
			
		||||
 | 
			
		||||
            glm::vec2 texCoord;
 | 
			
		||||
@ -105,29 +70,19 @@ BarinkEngine::Mesh ModelImporter::processMesh(aiMesh* mesh, const aiScene* scene
 | 
			
		||||
            v.uv = texCoord;
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
    
 | 
			
		||||
        vertices.push_back(v);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
        out_vertices.push_back(v);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ProcessIndices(aiMesh* mesh, std::vector<unsigned int>& out_indices) {
 | 
			
		||||
    // Process Indices
 | 
			
		||||
    for (unsigned int i = 0; i < mesh->mNumFaces; i++) {
 | 
			
		||||
        aiFace face = mesh->mFaces[i];
 | 
			
		||||
        if (face.mNumIndices < 3)
 | 
			
		||||
            continue;
 | 
			
		||||
        for (unsigned int j = 0; j < face.mNumIndices; j++) {
 | 
			
		||||
            indices.push_back(face.mIndices[j]);
 | 
			
		||||
            out_indices.push_back(face.mIndices[j]);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    BarinkEngine::Mesh result;
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
    result.vertices = vertices;
 | 
			
		||||
    result.elements = indices;
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    return result;
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
@ -3,60 +3,51 @@
 | 
			
		||||
#include "PerfCounter.h"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
Renderable* Renderable::Load()
 | 
			
		||||
BarinkEngine::Renderable::Renderable()
 | 
			
		||||
{
 | 
			
		||||
    return new Renderable();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Renderable::Renderable()
 | 
			
		||||
{
 | 
			
		||||
    meshes = ModelImporter::Test();
 | 
			
		||||
 | 
			
		||||
    transform.Scale = glm::vec3(1.0f);
 | 
			
		||||
    transform.Rotation = glm::vec3(0.0f, 0.0f, 0.0f);
 | 
			
		||||
    transform.Position = glm::vec3(0.0f, 0.0f, 0.0f);
 | 
			
		||||
 | 
			
		||||
    VAO.Create();
 | 
			
		||||
    VAO.Bind();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    vertexBuffer.createBuffer();
 | 
			
		||||
    vertexBuffer.Bind(false);
 | 
			
		||||
    vertexBuffer.setBufferData(&meshes[0].vertices[0], meshes[0].vertices.size() * sizeof(BarinkEngine::Vertex), false);   
 | 
			
		||||
 | 
			
		||||
    elementBuffer.createBuffer();
 | 
			
		||||
    elementBuffer.Bind(true);
 | 
			
		||||
    elementBuffer.setBufferData(&meshes[0].elements[0], meshes[0].elements.size() * sizeof(unsigned int), true);
 | 
			
		||||
 | 
			
		||||
    VAO.AttachAttribute(0, 3, sizeof(BarinkEngine::Vertex));
 | 
			
		||||
 | 
			
		||||
   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(BarinkEngine::Vertex),(void* )offsetof(BarinkEngine::Vertex, vertices));
 | 
			
		||||
   glEnableVertexAttribArray(1);
 | 
			
		||||
    /*
 | 
			
		||||
    
 | 
			
		||||
   vertexBuffer.Unbind(false);
 | 
			
		||||
        VAO.Create();
 | 
			
		||||
        VAO.Bind();
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
        vertexBuffer.createBuffer();
 | 
			
		||||
        vertexBuffer.Bind(false);
 | 
			
		||||
        vertexBuffer.setBufferData(&meshes[0].vertices[0], meshes[0].vertices.size() * sizeof(BarinkEngine::Vertex), false);   
 | 
			
		||||
 | 
			
		||||
        elementBuffer.createBuffer();
 | 
			
		||||
        elementBuffer.Bind(true);
 | 
			
		||||
        elementBuffer.setBufferData(&meshes[0].elements[0], meshes[0].elements.size() * sizeof(unsigned int), true);
 | 
			
		||||
 | 
			
		||||
        VAO.AttachAttribute(0, 3, sizeof(BarinkEngine::Vertex));
 | 
			
		||||
    
 | 
			
		||||
        glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(BarinkEngine::Vertex),(void* )offsetof(BarinkEngine::Vertex, vertices));
 | 
			
		||||
        glEnableVertexAttribArray(1);
 | 
			
		||||
    
 | 
			
		||||
        //vertexBuffer.Unbind(false);
 | 
			
		||||
  
 | 
			
		||||
   VAO.Unbind();
 | 
			
		||||
 | 
			
		||||
        VAO.Unbind();
 | 
			
		||||
    */
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Renderable::~Renderable()
 | 
			
		||||
BarinkEngine::Renderable::~Renderable()
 | 
			
		||||
{
 | 
			
		||||
    glDeleteBuffers(1, &UV_id);
 | 
			
		||||
   // glDeleteBuffers(1, &UV_id);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void Renderable::Draw()
 | 
			
		||||
{
 | 
			
		||||
    VAO.Bind();
 | 
			
		||||
    elementBuffer.Bind(true);
 | 
			
		||||
// Draw call Example !!
 | 
			
		||||
/*
 | 
			
		||||
        VAO.Bind();
 | 
			
		||||
        elementBuffer.Bind(true);
 | 
			
		||||
 | 
			
		||||
    glActiveTexture(GL_TEXTURE0);
 | 
			
		||||
    glUniform1i(glGetUniformLocation(shader->id, "Texture"), GL_TEXTURE0);
 | 
			
		||||
    texture->Bind();
 | 
			
		||||
        glActiveTexture(GL_TEXTURE0);
 | 
			
		||||
        glUniform1i(glGetUniformLocation(shader->id, "Texture"), GL_TEXTURE0);
 | 
			
		||||
        texture->Bind();
 | 
			
		||||
 | 
			
		||||
    ES->verts = meshes[0].vertices.size();
 | 
			
		||||
    ES->DC++;
 | 
			
		||||
    glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(meshes[0].elements.size()), GL_UNSIGNED_INT, NULL);
 | 
			
		||||
    VAO.Unbind();
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
        ES->verts = meshes[0].vertices.size();
 | 
			
		||||
        ES->DC++;
 | 
			
		||||
        glDrawElements(GL_TRIANGLES, static_cast<unsigned int>(meshes[0].elements.size()), GL_UNSIGNED_INT, NULL);
 | 
			
		||||
        VAO.Unbind();
 | 
			
		||||
    */
 | 
			
		||||
    
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user