PeriDyno 1.0.0
Loading...
Searching...
No Matches
GLWireframeVisualModule.cpp
Go to the documentation of this file.
2
3// opengl
4#include <glad/glad.h>
5#include "GLRenderEngine.h"
6#include "Utility.h"
7
8#include "line.vert.h"
9#include "surface.frag.h"
10#include "line.geom.h"
11
12namespace dyno
13{
15
17 {
18 this->setName("wireframe_renderer");
19 this->varBaseColor()->setValue(Color::Grey21());
20 this->varRadius()->setRange(0.001, 0.01);
21 }
22
24 {
25// edges.clear();
26// vertices.clear();
27
28// mVertexBuffer.release();
29// mIndexBuffer.release();
30 }
31
32
34 {
35 return "Wireframe Visual Module";
36 }
37
39 {
40 mVAO.create();
41
42 mIndexBuffer.create(GL_ELEMENT_ARRAY_BUFFER, GL_STATIC_DRAW);
43 mVertexBuffer.create(GL_ARRAY_BUFFER, GL_STATIC_DRAW);
44
45 mVAO.bindIndexBuffer(&mIndexBuffer);
46 mVAO.bindVertexBuffer(&mVertexBuffer, 0, 3, GL_FLOAT, 0, 0, 0);
47
48 // create shader program
50 LINE_VERT, sizeof(LINE_VERT),
51 SURFACE_FRAG, sizeof(SURFACE_FRAG),
52 LINE_GEOM, sizeof(LINE_GEOM));
53
54 // create shader uniform buffer
55 mUniformBlock.create(GL_UNIFORM_BUFFER, GL_DYNAMIC_DRAW);
56
57 return true;
58 }
59
61 {
62 mShaderProgram->release();
63 delete mShaderProgram;
64
65 mVAO.release();
66 mVertexBuffer.release();
67 mIndexBuffer.release();
68
69 mUniformBlock.release();
70 }
71
72
74 {
75 mNumEdges = mIndexBuffer.count();
76 if (mNumEdges == 0) return;
77
78 mVertexBuffer.updateGL();
79 mIndexBuffer.updateGL();
80 }
81
83 {
84 // copy data
85 auto edgeSet = this->inEdgeSet()->getDataPtr();
86 auto edges = edgeSet->getEdges();
87 auto vertices = edgeSet->getPoints();
88
89 mVertexBuffer.load(vertices);
90 mIndexBuffer.load(edges);
91 }
92
93
95 {
96 if (mNumEdges == 0)
97 return;
98
99 // setup uniform buffer
100 mUniformBlock.load((void*)&rparams, sizeof(RenderParams));
101 mUniformBlock.bindBufferBase(0);
102
103 mShaderProgram->use();
104
105 if (rparams.mode == GLRenderMode::COLOR)
106 {
107 Color c = this->varBaseColor()->getValue();
108 mShaderProgram->setVec3("uBaseColor", Vec3f(c.r, c.g, c.b));
109 mShaderProgram->setFloat("uMetallic", this->varMetallic()->getValue());
110 mShaderProgram->setFloat("uRoughness", this->varRoughness()->getValue());
111 mShaderProgram->setFloat("uAlpha", this->varAlpha()->getValue());
112 }
113 else if (rparams.mode == GLRenderMode::SHADOW)
114 {
115 // cast shadow?
116 }
117 else
118 {
119 printf("Unknown render pass!\n");
120 return;
121 }
122
123 // preserve previous polygon mode
124 int mode;
125 glGetIntegerv(GL_POLYGON_MODE, &mode);
126
127 if (this->varRenderMode()->getDataPtr()->currentKey() == EEdgeMode::LINE)
128 {
129 mShaderProgram->setInt("uEdgeMode", 0);
130 // draw as lines
131 glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
132 glLineWidth(this->varLineWidth()->getData());
133 }
134 else
135 {
136 // draw as cylinders
137 mShaderProgram->setInt("uEdgeMode", 1);
138 mShaderProgram->setFloat("uRadius", this->varRadius()->getValue());
139 }
140
141 mVAO.bindIndexBuffer(&mIndexBuffer);
142 mVAO.bindVertexBuffer(&mVertexBuffer, 0, 3, GL_FLOAT, 0, 0, 0);
143 mVAO.bind();
144
145 glDrawElements(GL_LINES, mNumEdges * 2, GL_UNSIGNED_INT, 0);
146
147 // restore polygon mode
148 glPolygonMode(GL_FRONT_AND_BACK, mode);
149
150 glCheckError();
151 }
152}
#define glCheckError()
#define IMPLEMENT_CLASS(name)
Definition Object.h:79
static Color Grey21()
Definition Color.h:512
float r
Definition Color.h:528
float b
Definition Color.h:530
float g
Definition Color.h:529
virtual void paintGL(const RenderParams &rparams) override
XBuffer< TopologyModule::Edge > mIndexBuffer
std::string caption() override
Return the caption.
void setName(std::string name)
Definition Module.cpp:187
static Program * createProgramSPIRV(const void *vs, size_t vs_len, const void *fs, size_t fs_len, const void *gs=0, size_t gs_len=0)
Definition Shader.cpp:202
This is an implementation of AdditiveCCD based on peridyno.
Definition Array.h:25
Vector< float, 3 > Vec3f
Definition Vector3D.h:93
static const int SHADOW
static const int COLOR