| 132 | } |
| 133 | |
| 134 | void draw() |
| 135 | { |
| 136 | glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); |
| 137 | |
| 138 | const auto side = std::min<int>(g_size.x, g_size.y); |
| 139 | glViewport((g_size.x - side) / 2, (g_size.y - side) / 2, side, side); |
| 140 | |
| 141 | const auto t_elapsed = std::chrono::high_resolution_clock::now() - g_startTime; |
| 142 | g_startTime = std::chrono::high_resolution_clock::now(); |
| 143 | |
| 144 | auto drawBuffer = g_vertexBuffer1; |
| 145 | auto writeBuffer = g_vertexBuffer2; |
| 146 | |
| 147 | g_vao->bind(); |
| 148 | |
| 149 | g_transformFeedbackProgram->setUniform("deltaT", static_cast<float>(t_elapsed.count()) * float(std::nano::num) / float(std::nano::den)); |
| 150 | |
| 151 | g_vao->binding(0)->setBuffer(drawBuffer, 0, sizeof(glm::vec4)); |
| 152 | |
| 153 | g_transformFeedback->bind(); |
| 154 | writeBuffer->bindBase(GL_TRANSFORM_FEEDBACK_BUFFER, 0); |
| 155 | |
| 156 | glEnable(GL_RASTERIZER_DISCARD); |
| 157 | |
| 158 | g_transformFeedbackProgram->use(); |
| 159 | g_transformFeedback->begin(GL_TRIANGLES); |
| 160 | g_vao->drawArrays(GL_TRIANGLES, 0, 6); |
| 161 | g_transformFeedback->end(); |
| 162 | glDisable(GL_RASTERIZER_DISCARD); |
| 163 | |
| 164 | g_transformFeedback->unbind(); |
| 165 | |
| 166 | g_vao->binding(0)->setBuffer(writeBuffer, 0, sizeof(glm::vec4)); |
| 167 | |
| 168 | g_shaderProgram->use(); |
| 169 | g_transformFeedback->draw(GL_TRIANGLE_STRIP); |
| 170 | g_shaderProgram->release(); |
| 171 | |
| 172 | g_vao->unbind(); |
| 173 | |
| 174 | std::swap(g_vertexBuffer1, g_vertexBuffer2); |
| 175 | } |
| 176 | |
| 177 | |
| 178 | void error(int errnum, const char * errmsg) |