PeriDyno 1.0.0
Loading...
Searching...
No Matches
GLRenderHelper.cpp
Go to the documentation of this file.
1#include "GLRenderHelper.h"
2
6
7#include <glad/glad.h>
8#include <vector>
9
10#include "plane.vert.h"
11#include "plane.frag.h"
12#include "bbox.vert.h"
13#include "bbox.frag.h"
14#include "screen.vert.h"
15#include "background.frag.h"
16
17namespace dyno
18{
20 {
21 public:
23 {
25 PLANE_VERT, sizeof(PLANE_VERT),
26 PLANE_FRAG, sizeof(PLANE_FRAG));
27 mPlane = Mesh::Plane(1.f);
28
29 // create ruler texture
30 const int k = 50;
31 const int w = k * 10 + 1;
32 const int h = k * 10 + 1;
33 std::vector<char> img(w * h, 0);
34 for (int j = 0; j < h; ++j)
35 {
36 for (int i = 0; i < w; ++i)
37 {
38 if (j == 0 || i == 0 || j == (h - 1) || i == (w - 1))
39 img[j * w + i] = 192;
40 else if ((j % k) == 0 || (i % k) == 0)
41 img[j * w + i] = 128;
42 }
43 }
44
45 mRulerTex.minFilter = GL_LINEAR_MIPMAP_LINEAR;
46 mRulerTex.maxFilter = GL_LINEAR;
47 mRulerTex.format = GL_RED;
48 mRulerTex.internalFormat = GL_RED;
49 mRulerTex.type = GL_UNSIGNED_BYTE;
50
51 mRulerTex.create();
52 mRulerTex.load(w, h, img.data());
53 mRulerTex.genMipmap();
54 // set anisotropy
55 glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY, 16);
56
57 mUniformBlock.create(GL_UNIFORM_BUFFER, GL_DYNAMIC_DRAW);
58 }
59
61 {
62 mRulerTex.release();
63
64 mPlane->release();
65 delete mPlane;
66
67 mProgram->release();
68 delete mProgram;
69
70 mUniformBlock.release();
71 }
72
73
74 void draw(const RenderParams& rparams,
75 float planeScale,
76 float rulerScale,
77 dyno::Vec4f planeColor,
78 dyno::Vec4f rulerColor)
79 {
80 mUniformBlock.load((void*)&rparams, sizeof(RenderParams));
81 mUniformBlock.bindBufferBase(0);
82
83 mRulerTex.bind(GL_TEXTURE1);
84
85 glEnable(GL_BLEND);
86 glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
87
88 mProgram->use();
89 mProgram->setFloat("uPlaneScale", planeScale);
90 mProgram->setFloat("uRulerScale", rulerScale);
91 mProgram->setVec4("uPlaneColor", planeColor);
92 mProgram->setVec4("uRulerColor", rulerColor);
93
94 mPlane->draw();
95
96 glDisable(GL_BLEND);
97
99 }
100
101 private:
105
107 };
108
110 {
111 public:
113 {
115 BBOX_VERT, sizeof(BBOX_VERT),
116 BBOX_FRAG, sizeof(BBOX_FRAG));
117
118 mCubeVBO.create(GL_ARRAY_BUFFER, GL_DYNAMIC_DRAW);
119 mCubeVBO.load(0, 8 * 3 * sizeof(float));
120 mCubeVAO.create();
121 mCubeVAO.bindVertexBuffer(&mCubeVBO, 0, 3, GL_FLOAT, 0, 0, 0);
122
123 mUniformBlock.create(GL_UNIFORM_BUFFER, GL_DYNAMIC_DRAW);
124 }
125
127 {
128 mCubeVBO.release();
129 mCubeVAO.release();
130
131 mProgram->release();
132 delete mProgram;
133
134 mUniformBlock.release();
135 }
136
137 void draw(const RenderParams& rparams, Vec3f p0, Vec3f p1, int type)
138 {
139 float vertices[]{
140 p0[0], p0[1], p0[2],
141 p0[0], p0[1], p1[2],
142 p1[0], p0[1], p1[2],
143 p1[0], p0[1], p0[2],
144
145 p0[0], p1[1], p0[2],
146 p0[0], p1[1], p1[2],
147 p1[0], p1[1], p1[2],
148 p1[0], p1[1], p0[2],
149 };
150
151 mUniformBlock.load((void*)&rparams, sizeof(RenderParams));
152 mUniformBlock.bindBufferBase(0);
153
154 mCubeVBO.load(vertices, sizeof(vertices));
155 mCubeVAO.bind();
156 mProgram->use();
157 mProgram->setVec4("uColor", Vec4f(0.75));
158
159 if (true)
160 {
161 const unsigned int indices[]
162 {
163 0, 1, 1, 2, 2, 3, 3, 0,
164 4, 5, 5, 6, 6, 7, 7, 4,
165 0, 4, 1, 5, 2, 6, 3, 7,
166 };
167
168 glEnable(GL_DEPTH_TEST);
169 glEnable(GL_BLEND);
170 glDrawElements(GL_LINES, 24, GL_UNSIGNED_INT, indices);
171 glDisable(GL_BLEND);
172 }
173 else
174 {
175 const unsigned int indices[]
176 {
177 0, 1, 2, 2, 3, 0, // bottom
178 7, 6, 5, 5, 4, 7, // top
179 4, 5, 1, 1, 0, 4, // left
180 3, 2, 6, 6, 7, 3, // right
181 0, 3, 7, 7, 4, 0, // front
182 5, 6, 2, 2, 1, 5, // back
183 };
184 glEnable(GL_CULL_FACE);
185 glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_INT, indices);
186 glDisable(GL_CULL_FACE);
187 }
188
189 mCubeVAO.unbind();
190 glCheckError();
191 }
192
193 private:
197
199 };
200
202 {
203 public:
205 {
206 // create a quad object
209 SCREEN_VERT, sizeof(SCREEN_VERT),
210 BACKGROUND_FRAG, sizeof(BACKGROUND_FRAG));
211 }
212
214 mScreenQuad->release();
215 delete mScreenQuad;
216 mBackgroundProgram->release();
217 delete mBackgroundProgram;
218 }
219
220 void draw(Vec3f color0, Vec3f color1)
221 {
222 // render background
223 mBackgroundProgram->use();
224 mBackgroundProgram->setVec3("uColor0", color0);
225 mBackgroundProgram->setVec3("uColor1", color1);
226 mScreenQuad->draw();
227
228 glClear(GL_DEPTH_BUFFER_BIT);
229 }
230
231 private:
232 // background
235 };
236
237
238
245
252
254 float planeScale, float rulerScale,
255 dyno::Vec4f planeColor, dyno::Vec4f rulerColor)
256 {
257
258 if (mGroundRenderer != NULL)
259 mGroundRenderer->draw(rparams, planeScale, rulerScale, planeColor, rulerColor);
260 }
261
262 void GLRenderHelper::drawBBox(const RenderParams& rparams, Vec3f p0, Vec3f p1, int type)
263 {
264 if (mBBoxRenderer != NULL)
265 mBBoxRenderer->draw(rparams, p0, p1, type);
266 }
267
269 {
270 if (mBackgroundRenderer != NULL)
271 mBackgroundRenderer->draw(color0, color1);
272 }
273}
#define glCheckError()
void draw(const RenderParams &rparams, Vec3f p0, Vec3f p1, int type)
void draw(Vec3f color0, Vec3f color1)
BackgroundRenderer * mBackgroundRenderer
void drawGround(const RenderParams &rparams, float planeScale, float rulerScale=1.f, dyno::Vec4f planeColor={ 0.3, 0.3, 0.3, 0.5 }, dyno::Vec4f rulerColor={ 0.1, 0.1, 0.1, 0.5 })
void drawBBox(const RenderParams &rparams, Vec3f pmin, Vec3f pmax, int type=0)
BBoxRenderer * mBBoxRenderer
GroundRenderer * mGroundRenderer
void drawBackground(Vec3f color0, Vec3f color1)
void draw(const RenderParams &rparams, float planeScale, float rulerScale, dyno::Vec4f planeColor, dyno::Vec4f rulerColor)
static Mesh * Plane(float scale)
Definition Mesh.cpp:156
static Mesh * ScreenQuad()
Definition Mesh.cpp:134
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, 4 > Vec4f
Definition Vector4D.h:86
Vector< float, 3 > Vec3f
Definition Vector3D.h:93