Program Listing for File Object3D.hpp

Return to documentation for file (gui/Demeter/Renderer/Object3D.hpp)

#pragma once

#include <unordered_map>

#include "Camera.hpp"
#include "Mesh.hpp"

struct Object3D {
private:
  std::unordered_map<std::string, size_t> _idMap;
  std::vector<std::unique_ptr<Mesh>> _meshArr;

  // parsing data
  std::vector<glm::vec3> positions;
  std::vector<glm::vec2> texCoords;
  std::vector<glm::vec3> normals;

  std::string currentName = "default";
  std::unique_ptr<std::vector<Vertex>> meshVertices = std::
    make_unique<std::vector<Vertex>>();
  std::unique_ptr<std::vector<unsigned int>> meshIndices = std::
    make_unique<std::vector<unsigned int>>();

  std::unordered_map<std::string, unsigned int> uniqueVertexMap;
  unsigned int index = 0;

  [[nodiscard]] bool HandleSubObject(std::istringstream &ss);

  void HandleVertex(std::istringstream &ss);

  void HandleVertexTexture(std::istringstream &ss);

  void HandleVertexNormal(std::istringstream &ss);

  void HandleFace(std::istringstream &ss);

  [[nodiscard]] bool
  ParseLine(const std::string &prefix, std::istringstream &ss);

public:
  glm::mat4 modelMatrix = glm::mat4(1.0);  // NOLINT

  Object3D() = default;

  [[nodiscard]] bool Init(const std::string &path);

  void Draw(ShaderProgram &shader, Camera &camera) const;

  void SetTexture(size_t meshID, std::shared_ptr<Texture> t);

  void SetPosition(const glm::vec3 &pos)
  {
    modelMatrix = glm::translate(modelMatrix, pos);
  }

  void Translate(const glm::vec3 &pos)
  {
    modelMatrix = glm::translate(modelMatrix, pos);
  }

  void SetRotation(float angle, const glm::vec3 &axis)
  {
    modelMatrix = glm::rotate(modelMatrix, glm::radians(angle), axis);
  }

  void SetScale(const glm::vec3 &scale)
  {
    modelMatrix = glm::scale(modelMatrix, scale);
  }
};