1#ifndef DANDELION_PLATFORM_GL_HPP
2#define DANDELION_PLATFORM_GL_HPP
44template<
typename DataType>
76 void draw(GLenum mode,
int first, std::size_t count);
95template<
typename T, std::
size_t size>
116 template<
typename... Ts>
125 void update(
size_t index,
const Eigen::Vector3f& value);
170template<std::
size_t size>
193 template<
typename... Ts>
214 std::vector<unsigned int>
data;
237 const Eigen::Vector3f& K_ambient = Eigen::Vector3f(1.0f, 1.0f, 1.0f),
238 const Eigen::Vector3f& K_diffuse = Eigen::Vector3f(0.5f, 0.5f, 0.5f),
239 const Eigen::Vector3f& K_specular = Eigen::Vector3f(0.0f, 0.0f, 0.0f),
276 Eigen::Vector3f
vertex(
size_t index)
const;
278 Eigen::Vector3f
normal(
size_t index)
const;
280 std::array<size_t, 2>
edge(
size_t index)
const;
282 std::array<size_t, 3>
face(
size_t index)
const;
299 const Shader& shader,
unsigned int element_flags,
bool face_shading =
true,
350 void add_arrow(
const Eigen::Vector3f& from,
const Eigen::Vector3f& to);
352 void update_arrow(
size_t index,
const Eigen::Vector3f& from,
const Eigen::Vector3f& to);
354 void add_AABB(
const Eigen::Vector3f& p_min,
const Eigen::Vector3f& p_max);
380template<
typename DataType>
383 if constexpr (std::is_same_v<DataType, char>) {
385 }
else if constexpr (std::is_same_v<DataType, unsigned char>) {
386 return GL_UNSIGNED_BYTE;
387 }
else if constexpr (std::is_same_v<DataType, int>) {
389 }
else if constexpr (std::is_same_v<DataType, unsigned int>) {
390 return GL_UNSIGNED_INT;
391 }
else if constexpr (std::is_same_v<DataType, float>) {
393 }
else if constexpr (std::is_same_v<DataType, double>) {
402template<
typename T, std::
size_t size>
409template<
typename T, std::
size_t size>
414 other.descriptor = 0;
417template<
typename T, std::
size_t size>
425template<
typename T, std::
size_t size>
426template<
typename... Ts>
430 (std::is_same_v<
decltype(values), T> && ...),
431 "ArrayBuffer: all values to be appended must have the same type as T"
434 sizeof...(values) == size,
435 "ArrayBuffer: number of values to be appended must be same as size per vertex"
437 (this->
data.push_back(values), ...);
440template<
typename T, std::
size_t size>
443 const GLintptr offset = index * 3 *
sizeof(float);
444 data[index * 3] = value.x();
445 data[index * 3 + 1] = value.y();
446 data[index * 3 + 2] = value.z();
448 glBufferSubData(GL_ARRAY_BUFFER, offset, 3 *
sizeof(
float), value.data());
451template<
typename T, std::
size_t size>
454 return this->
data.size() / size;
457template<
typename T, std::
size_t size>
460 glBindBuffer(GL_ARRAY_BUFFER, this->
descriptor);
463template<
typename T, std::
size_t size>
466 glBindBuffer(GL_ARRAY_BUFFER, 0);
469template<
typename T, std::
size_t size>
473 glVertexAttribPointer(
474 this->
layout_location, size, data_type, GL_FALSE, size *
sizeof(T), (
void*)0
479template<
typename T, std::
size_t size>
485template<
typename T, std::
size_t size>
489 glBufferData(GL_ARRAY_BUFFER,
sizeof(T) * this->
data.size(), this->data.data(), this->usage);
495template<std::
size_t size>
501template<std::
size_t size>
505 other.descriptor = 0;
508template<std::
size_t size>
516template<std::
size_t size>
519 return this->
data.size() / size;
522template<std::
size_t size>
523template<
typename... Ts>
527 (std::is_same_v<
decltype(values),
unsigned int> && ...),
528 "ElementArrayBuffer: all values to be appended must be unsigned int"
531 sizeof...(values) == size,
532 "ElementArrayBuffer: number of values to be appended must be as same as size per vertex"
534 (this->
data.push_back(values), ...);
537template<std::
size_t size>
540 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, this->
descriptor);
543template<std::
size_t size>
546 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
549template<std::
size_t size>
554 GL_ELEMENT_ARRAY_BUFFER,
sizeof(
unsigned int) * this->
data.size(), this->data.data(),
对 GLSL Shader 的简单封装。
定义 shader.hpp:24
所有对 OpenGL 的封装类型和工具函数均在此命名空间中。
定义 gl.hpp:30
这个文件定义了一些和渲染(离线渲染或场景预览)相关的常量、枚举等。
对 OpenGL 数组缓冲 (Array Buffer) 的封装。
定义 gl.hpp:97
ArrayBuffer(GLenum buffer_usage, unsigned int layout_location)
定义 gl.hpp:403
void update(size_t index, const Eigen::Vector3f &value)
更新指定位置的 3 个 float 数据,仅限 T = float 时使用,否则行为未定义。
定义 gl.hpp:441
ArrayBuffer(const ArrayBuffer &other)=delete
void specify_vertex_attribute()
定义 gl.hpp:470
unsigned int layout_location
定义 gl.hpp:151
void append(Ts... values)
定义 gl.hpp:427
void release()
定义 gl.hpp:464
~ArrayBuffer()
定义 gl.hpp:418
unsigned int usage
定义 gl.hpp:147
void disable()
定义 gl.hpp:480
std::vector< T > data
定义 gl.hpp:153
std::size_t count() const
定义 gl.hpp:452
ArrayBuffer & operator=(ArrayBuffer &other)=delete
void to_gpu()
定义 gl.hpp:486
unsigned int descriptor
定义 gl.hpp:142
对 OpenGL 索引数组缓冲 (Element Array Buffer) 的封装。
定义 gl.hpp:172
ElementArrayBuffer(const ElementArrayBuffer &other)=delete
std::size_t count() const
定义 gl.hpp:517
unsigned int descriptor
定义 gl.hpp:205
ElementArrayBuffer(unsigned int buffer_usage)
构造一个 EBO 对象。
定义 gl.hpp:496
void append(Ts... values)
定义 gl.hpp:524
ElementArrayBuffer & operator=(ElementArrayBuffer &other)=delete
std::vector< unsigned int > data
内存中的索引数据副本。
定义 gl.hpp:214
unsigned int usage
定义 gl.hpp:207
void release()
定义 gl.hpp:544
void to_gpu()
定义 gl.hpp:550
~ElementArrayBuffer()
调用 glDeleteBuffers 销毁该 EBO。
定义 gl.hpp:509
void to_gpu()
定义 gl.cpp:284
void add_line_segment(const Eigen::Vector3f &a, const Eigen::Vector3f &b)
定义 gl.cpp:204
void add_AABB(const Eigen::Vector3f &p_min, const Eigen::Vector3f &p_max)
定义 gl.cpp:248
void render(const Shader &shader)
渲染该线条集。
定义 gl.cpp:292
Eigen::Vector3f line_color
定义 gl.hpp:368
void update_arrow(size_t index, const Eigen::Vector3f &from, const Eigen::Vector3f &to)
定义 gl.cpp:235
void add_arrow(const Eigen::Vector3f &from, const Eigen::Vector3f &to)
定义 gl.cpp:220
void clear()
定义 gl.cpp:278
LineSet(const std::string &name, Eigen::Vector3f color=GL::Mesh::default_wireframe_color)
构造一个 LineSet 对象以绘制线条。
LineSet(const LineSet &other)=delete
Eigen::Vector3f diffuse
定义 gl.hpp:245
float shininess
定义 gl.hpp:249
Eigen::Vector3f specular
定义 gl.hpp:247
Material(const Eigen::Vector3f &K_ambient=Eigen::Vector3f(1.0f, 1.0f, 1.0f), const Eigen::Vector3f &K_diffuse=Eigen::Vector3f(0.5f, 0.5f, 0.5f), const Eigen::Vector3f &K_specular=Eigen::Vector3f(0.0f, 0.0f, 0.0f), float shininess=5.0f)
构造一个材质对象。
定义 gl.cpp:51
Eigen::Vector3f ambient
定义 gl.hpp:243
static const Eigen::Vector3f default_face_color
定义 gl.hpp:312
std::array< size_t, 3 > face(size_t index) const
定义 gl.cpp:112
Material material
定义 gl.hpp:323
void render(const Shader &shader, unsigned int element_flags, bool face_shading=true, const Eigen::Vector3f &global_color=default_wireframe_color)
渲染这个 mesh。
定义 gl.cpp:137
void clear()
定义 gl.cpp:117
static constexpr unsigned int vertices_flag
定义 gl.hpp:304
Mesh(const Mesh &other)=delete
static constexpr unsigned int faces_flag
定义 gl.hpp:308
static const Eigen::Vector3f highlight_wireframe_color
定义 gl.hpp:314
static constexpr unsigned int edges_flag
定义 gl.hpp:306
Eigen::Vector3f normal(size_t index) const
定义 gl.cpp:102
void to_gpu()
定义 gl.cpp:125
Eigen::Vector3f vertex(size_t index) const
定义 gl.cpp:97
static const Eigen::Vector3f default_wireframe_color
定义 gl.hpp:310
static const Eigen::Vector3f highlight_face_color
定义 gl.hpp:316
std::array< size_t, 2 > edge(size_t index) const
定义 gl.cpp:107
对 OpenGL 顶点数组对象 (Vertex Array Object) 的封装。
定义 gl.hpp:56
~VertexArrayObject()
定义 gl.cpp:27
VertexArrayObject()
定义 gl.cpp:17
unsigned int descriptor
定义 gl.hpp:79
void release()
定义 gl.cpp:39
void draw(GLenum mode, int first, std::size_t count)
定义 gl.cpp:44