diff --git a/qglengine/renderer.cpp b/qglengine/renderer.cpp index 31783b4..2bd4dc2 100644 --- a/qglengine/renderer.cpp +++ b/qglengine/renderer.cpp @@ -44,6 +44,7 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_), shader_files[srServiceFill ] = "service_fill.glsl"; shader_files[srServiceFrame] = "service_frame.glsl"; + shader_files[srServiceLine ] = "service_line.glsl"; shader_files[srGeometryPass ] = "ds_geom.glsl"; shader_files[srLightOmniPass] = "ds_light.glsl"; diff --git a/qglengine/renderer.h b/qglengine/renderer.h index f79f072..cd1107b 100644 --- a/qglengine/renderer.h +++ b/qglengine/renderer.h @@ -49,6 +49,7 @@ class Renderer: public RendererBase { // Service srServiceFill, srServiceFrame, + srServiceLine, // Deferred shading srGeometryPass, diff --git a/qglengine/renderer_service.cpp b/qglengine/renderer_service.cpp index b306ef4..b0ec725 100644 --- a/qglengine/renderer_service.cpp +++ b/qglengine/renderer_service.cpp @@ -193,26 +193,31 @@ void RendererService::fillSpotObjects() { Object o; cur_objects.clear(); cur_aims.clear(); - cur_lines.clear(); - double scl = 1.; + QVector & lv (line_mesh_f->vertices ()); + QVector & ln (line_mesh_f->normals ()); + QVector & lt (line_mesh_f->texcoords ()); + QVector< Vector2i> & lind(line_mesh_f->indicesLines()); + lv.clear(); foreach (Light * l, ll) { QMatrix4x4 m; - m = invariantSizeMatrix(l->worldPos(), &scl) * parentRotationMatrix(l); + m = invariantSizeMatrix(l->worldPos()) * parentRotationMatrix(l); m.transposed().copyDataTo(o.modelmatrix); o.object_id = l->id_; cur_objects << o; - QMatrix4x4 sm; - sm.scale(1, 1, l->distance() / scl); - m = m * sm; - m.transposed().copyDataTo(o.modelmatrix); - //cur_lines << o; + lv << l->worldPos() << l->worldAim(); m = invariantSizeMatrix(l->worldAim()); m.transposed().copyDataTo(o.modelmatrix); o.object_id = l->id_ + 1; cur_aims << o; } + ln.resize(lv.size()); + lt.resize(lv.size()); + lind.resize(lv.size() / 2); + for (int i = 0; i < lind.size(); ++i) { + lind[i] = Vector2i(i*2, i*2 + 1); + } } @@ -348,12 +353,6 @@ void RendererService::drawLightsFrame(QColor color) { box_mesh_f->loadSelections(v, rs.cur_selections_); box_mesh_f->draw(v, cur_aims.size()); - setObjectsColor(cur_lines, color); - line_mesh_f->loadObjects(v, cur_lines); - r->fillSelectionsBuffer(rs.cur_selections_, light2objectList(v->scene_->lights_used.value(Light::Cone))); - line_mesh_f->loadSelections(v, rs.cur_selections_); - line_mesh_f->draw(v, cur_lines.size()); - } @@ -372,12 +371,11 @@ void RendererService::renderService() { f->glEnable(GL_MULTISAMPLE); glEnableDepth(); f->glClear(GL_DEPTH_BUFFER_BIT); + glDisable(GL_CULL_FACE); if (r->bindShader(Renderer::srServiceFrame, &prog)) { prog->setUniformValue("qgl_ProjMatrix", r->view->camera()->projectionMatrix(r->view->aspect)); /// lights - //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glDisable(GL_CULL_FACE); r->setUniformCamera(prog, r->view->camera()); prog->setUniformValue("line_width", 2.f); @@ -387,10 +385,16 @@ void RendererService::renderService() { prog->setUniformValue("z_offset", -1.E-2f); drawLightsFrame(Qt::black); - glEnable(GL_CULL_FACE); - //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - } + if (r->bindShader(Renderer::srServiceLine, &prog)) { + //glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + r->setUniformCamera(prog, r->view->camera()); + line_object.color = QColor2QVector(Qt::white); + line_mesh_f->loadObject(f, line_object); + line_mesh_f->draw(f, 1); + //glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + } + glEnable(GL_CULL_FACE); if (r->bindShader(Renderer::srServiceFill, &prog)) { r->setUniformCamera(prog, r->view->camera()); diff --git a/qglengine/renderer_service.h b/qglengine/renderer_service.h index 5da273a..92c3644 100644 --- a/qglengine/renderer_service.h +++ b/qglengine/renderer_service.h @@ -91,7 +91,8 @@ private: QVector3D selection_center; QVector mat_xyz, mat_ms2; QVector color_xyz, color_ms2; - QVector cur_objects, cur_aims, cur_lines; + QVector cur_objects, cur_aims; + QGLEngineShaders::Object line_object; Camera * axis_camera; QSize axis_viewport; HandleAction current_action; diff --git a/qglengine/shaders/service_line.glsl b/qglengine/shaders/service_line.glsl new file mode 100644 index 0000000..2cfec5d --- /dev/null +++ b/qglengine/shaders/service_line.glsl @@ -0,0 +1,17 @@ +// vert // + +out vec4 object_color; + +void main(void) { + gl_Position = qgl_ftransform(); + object_color = qgl_ObjectColor; +} + + +// frag // + +in vec4 object_color; + +void main(void) { + qgl_FragColor = object_color; +}