AnimEngine
Geometry.hpp
1 #pragma once
2 #ifndef KJY_OBJECT_ORIENTED_OPENGL_GEOMETRY_HPP_
3 #define KJY_OBJECT_ORIENTED_OPENGL_GEOMETRY_HPP_
4 #include "../OOOGL_Core.hpp"
5 #include "../GLobjects/VertexArrayObject.hpp"
6 #include <glm/glm.hpp>
7 #include <vector>
8 
9 
10 namespace OOOGL{
11 
12 
13 
14 class VertexGeometry : public ObjectTag{
15  public:
16  VertexGeometry() {
17  vertex_array_object.linkArrayBuffer(0, vertex_position_buffer);
18  sync_status_ = GpuSyncStatus::GPU_CURRENT;
19  }
20 
21  VertexGeometry(const std::vector<glm::vec3>& vertices, const std::vector<GLuint> elements, bool skip_gpu_upload = false, bool skip_measurement = false) {
22  cpu_vertex_buffer_ = vertices;
23  cpu_element_buffers_.emplace_back(elements);
24  if(!skip_gpu_upload) uploadToGpu();
25  vertex_array_object.linkArrayBuffer(msPositionAttrIndex, vertex_position_buffer);
26  linkElementBuffers();
27  sync_status_ = GpuSyncStatus::GPU_CURRENT;
28  }
29 
30  static const GLuint msPositionAttrIndex; // = 0;
31 
32  virtual void autoSetupForDraw();
33  virtual void autoCleanupAfterDraw();
34 
35  virtual const glm::vec3& getMinPoint() {return(min_point_);}
36  virtual const glm::vec3& getMaxPoint() {return(max_point_);}
37 
38  virtual void normalize();
39  virtual void uploadToGpu();
40  virtual GpuSyncStatus getSyncStatus() const {return(sync_status_);}
41 
42  virtual const std::vector<glm::vec3>& getVertices() const {return(cpu_vertex_buffer_);}
43  virtual std::vector<glm::vec3>& getMutableVertices() {return(cpu_vertex_buffer_); sync_status_ = GpuSyncStatus::GPU_STALE; measurement_current_ = false;}
44  virtual void replaceVertices(const std::vector<glm::vec3>& new_buffer) {cpu_vertex_buffer_ = new_buffer; sync_status_ = GpuSyncStatus::GPU_STALE; measurement_current_ = false;}
45 
46  virtual size_t numElementBuffers() const {return(cpu_element_buffers_.size());}
47  virtual const std::vector<GLuint>& getElements(size_t index) const {_assert_element_index_inbounds_(index); return(cpu_element_buffers_[index]);}
48  virtual std::vector<GLuint>& getMutableElements(size_t index) {_assert_element_index_inbounds_(index); return(cpu_element_buffers_[index]); sync_status_ = GpuSyncStatus::GPU_STALE; measurement_current_ = false;}
49  virtual void replaceElements(size_t index, const std::vector<GLuint>& new_buffer) {_assert_element_index_inbounds_(index); cpu_element_buffers_[index] = new_buffer; sync_status_ = GpuSyncStatus::GPU_STALE; measurement_current_ = false;}
50  virtual void addElements(const std::vector<GLuint>& new_buffer, bool auto_add_element_array_buffer = true) {
51  cpu_element_buffers_.emplace_back(new_buffer);
52  if(auto_add_element_array_buffer){
53  vertex_elements_buffers_.emplace_back();
54  }
55  sync_status_ = GpuSyncStatus::GPU_STALE; measurement_current_ = false;
56  }
57  virtual ElementArrayBuffer getElementArrayBuffer(size_t index) {_assert_element_index_inbounds_(index); return(vertex_elements_buffers_[index]);}
58  virtual void replaceElementArrayBuffer(size_t index, const ElementArrayBuffer& buffer){_assert_element_index_inbounds_(index);vertex_elements_buffers_[index] = buffer;}
59 
60  CommonVertexFormatVAO vertex_array_object;
61  ArrayBuffer vertex_position_buffer;
62 
63  protected:
64 
65  virtual void updateMeasurement();
66  virtual void linkElementBuffers();
67 
68  virtual void _startGpuUpload();
69  virtual void _uploadData();
70  virtual void _finishGpuUpload();
71 
72  void _measure_min_max_(const std::vector<glm::vec3>& vertices, glm::vec3* min_point, glm::vec3* max_point);
73  void _normalize_vertices(std::vector<glm::vec3>& vertices, const glm::vec3& min, const glm::vec3& max);
74 
75  bool measurement_current_ = false;
76  GpuSyncStatus sync_status_ = GpuSyncStatus::GPU_UNINITIALIZED;
77 
78  std::vector<glm::vec3> cpu_vertex_buffer_;
79  std::vector<std::vector<GLuint>> cpu_element_buffers_;
80  std::vector<ElementArrayBuffer> vertex_elements_buffers_;
81 
82  glm::vec3 min_point_ = glm::vec3(0.0);
83  glm::vec3 max_point_ = glm::vec3(0.0);
84 
85  private:
86  inline void _assert_element_index_inbounds_(size_t index) const {if(index >= cpu_element_buffers_.size()) throw GenericIndexOutOfBoundsException(index, "VertexGeometry element buffers");}
87 };
88 
90  public:
91  TriangleMesh();
92 
94  const std::vector<glm::vec3>& vertices, const std::vector<GLuint> elements,
95  const std::vector<glm::vec3>& normals, const std::vector<glm::vec2>& texcoords,
96  bool skip_gpu_upload = false);
97 
98  static const GLuint msNormalAttrIndex; // = 1;
99  static const GLuint msTexCoordAttrIndex; // = 2;
100 
101  virtual void autoSetupForDraw() override;
102  virtual void autoCleanupAfterDraw() override;
103 
104  virtual const std::vector<glm::vec3>& getNormals() const {return(cpu_normals_buffer_);}
105  virtual std::vector<glm::vec3>& getMutableNormals() {return(cpu_normals_buffer_); sync_status_ = GpuSyncStatus::GPU_STALE; }
106  virtual void replaceNormals(const std::vector<glm::vec3>& new_buffer) {cpu_normals_buffer_ = new_buffer; sync_status_ = GpuSyncStatus::GPU_STALE; }
108  virtual bool areNormalsEnabled() const { return(mNormalsEnabled); }
110  virtual void disableNormals() {mNormalsEnabled = false;}
112  virtual void enableNormals() {mNormalsEnabled = true;}
113 
114  virtual const std::vector<glm::vec2>& getTextureCoords() const {return(cpu_texture_coords_);}
115  virtual std::vector<glm::vec2>& getMutableTextureCoords() {return(cpu_texture_coords_); sync_status_ = GpuSyncStatus::GPU_STALE; }
116  virtual void replaceTextureCoords(const std::vector<glm::vec2>& new_buffer) {cpu_texture_coords_ = new_buffer; sync_status_ = GpuSyncStatus::GPU_STALE; }
118  virtual bool areTextureCoordsEnabled() const { return(mCoordsEnabled); }
120  virtual void disableTextureCoords() {mCoordsEnabled = false;}
122  virtual void enableTextureCoords() {mCoordsEnabled = true;}
123 
124 
125  ArrayBuffer vertex_normals_buffer;
126  ArrayBuffer vertex_coordinate_buffer;
127 
128  protected:
129 
130  virtual void _uploadData() override;
131 
132  std::vector<glm::vec3> cpu_normals_buffer_;
133  bool mNormalsEnabled = true;
134  std::vector<glm::vec2> cpu_texture_coords_;
135  bool mCoordsEnabled = true;
136 
137 };
138 
139 
140 struct TriangleMeshAggregate : public std::vector<TriangleMesh>{
141  using base_vector = std::vector<TriangleMesh>;
142  using size_type = base_vector::size_type;
143  using value_type = base_vector::value_type;
144  using allocator_type = base_vector::allocator_type;
145  TriangleMeshAggregate() : base_vector() {}
146  TriangleMeshAggregate(size_type n, const allocator_type& alloc = allocator_type()) : base_vector(n, alloc) {}
147  TriangleMeshAggregate(size_type n, const value_type& value, const allocator_type& alloc = allocator_type()) : base_vector(n, value, alloc) {}
148  TriangleMeshAggregate(std::initializer_list<TriangleMesh> init, const allocator_type& alloc = allocator_type()) : base_vector(init, alloc) {}
149 };
150 
151 }
152 
153 
154 #endif
Definition: Buffers.hpp:142
virtual bool areNormalsEnabled() const
Check if the vertex normals attribute is enabled.
Definition: Geometry.hpp:108
Definition: OOOGL_Core.hpp:133
Definition: Geometry.hpp:89
virtual void enableTextureCoords()
Disable the vertex normal attribute during auto setup.
Definition: Geometry.hpp:122
virtual bool areTextureCoordsEnabled() const
Check if the vertex normals attribute is enabled.
Definition: Geometry.hpp:118
virtual void disableTextureCoords()
Disable the vertex normal attribute during auto setup.
Definition: Geometry.hpp:120
Definition: OOOGL_Core.hpp:170
Definition: Geometry.hpp:140
virtual void enableNormals()
Disable the vertex normal attribute during auto setup.
Definition: Geometry.hpp:112
Definition: Core_Utilities.cpp:3
Definition: VertexArrayObject.hpp:80
Definition: Buffers.hpp:106
virtual void disableNormals()
Disable the vertex normal attribute during auto setup.
Definition: Geometry.hpp:110
Definition: Geometry.hpp:14