git-svn-id: svn://db.shs.com.ru/libs@627 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-11-22 20:22:30 +00:00
parent 09248aae34
commit e65ee56ee4
21 changed files with 527 additions and 208 deletions

View File

@@ -28,25 +28,22 @@ using namespace QGLEngineShaders;
Renderer::Renderer(QGLView * view_): RendererBase(view_),
fbo_selection(view_, 4),
fbo_ds (view_, 5, true , GL_RGBA16F),
fbo_out (view_, 3, false, GL_RGBA16F),
fbo_hsmall (view_, 1, false, GL_RGB16F ),
rend_mat(this), rend_service(this) {
rend_mat(this), rend_service(this), rend_selection(this) {
quad = Primitive::plane(2., 2.);
sel_frame = quad->clone();
cam_light = new Light();
cam_light->intensity = 0.75;
cam_light->setName("Camera_Light");
line_thick_ = 2.;
id_hover = 0;
shader_files[srSelectionFill ] = "selection.glsl";
shader_files[srSelectionHalo ] = "selection_halo.glsl";
shader_files[srSelectionApply] = "selection_apply.glsl";
shader_files[srSelectionFrame] = "selection_frame.glsl";
shader_files[srService] = "service.glsl";
shader_files[srServiceFill ] = "service_fill.glsl";
shader_files[srServiceFrame] = "service_frame.glsl";
shader_files[srGeometryPass] = "ds_geom.glsl";
shader_files[srLightingPass] = "ds_light.glsl";
@@ -70,13 +67,11 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
<< ShaderPair("dof", &shader_dof);*/
exposure_ = 1.;
edit_mode = need_init_shaders = is_camera_light = true;
proc_sel_pbo = false;
}
Renderer::~Renderer() {
delete quad;
delete sel_frame;
delete cam_light;
qDeleteAll(shaders.values());
}
@@ -86,6 +81,7 @@ void Renderer::init(int width, int height) {
resize(width, height);
rend_mat.init(width, height);
rend_service.init(width, height);
rend_selection.init(width, height);
initQuad(quad);
initTextureArrays();
need_init_shaders = true;
@@ -95,12 +91,10 @@ void Renderer::init(int width, int height) {
void Renderer::resize(int width, int height) {
rend_mat.resize(width, height);
rend_service.resize(width, height);
fbo_selection.enablePixelBuffer();
fbo_selection.resize(width, height);
rend_selection.resize(width, height);
fbo_ds .resize(width, height);
fbo_out .resize(width, height);
fbo_hsmall .resize(width / 16, height / 16);
line_thick_ = lineThickness() + 1.;
}
@@ -139,28 +133,6 @@ void Renderer::releaseShader() {
}
void Renderer::generateObjectsID(Scene & scene) {
ids.clear();
QMapIterator<Mesh*, QList<ObjectBase*> > it(scene.geometries_used);
while (it.hasNext()) {
it.next();
foreach (ObjectBase * o, it.value()) {
uint id = qHash(o);
ids[id] = o;
o->id_ = id;
}
}
}
void Renderer::fillSelectionsBuffer(const QList<ObjectBase *> & ol) {
cur_selections_.resize(ol.size());
for (int i = 0; i < ol.size(); ++i) {
cur_selections_[i] = (ol[i]->isSelected(true) ? 1 : 0);
}
}
void Renderer::fillObjectsBuffer(const QList<ObjectBase *> & ol, RenderPass pass) {
cur_objects_.resize(ol.size());
for (int i = 0; i < ol.size(); ++i) {
@@ -195,94 +167,14 @@ void Renderer::renderObjects(Scene & scene, RenderPass pass) {
}
if (mesh->selected_changed && edit_mode) {
mesh->selected_changed = false;
fillSelectionsBuffer(it.value());
mesh->loadSelections(f, cur_selections_);
rend_selection.fillSelectionsBuffer(it.value());
mesh->loadSelections(f, rend_selection.cur_selections_);
}
mesh->draw(f, it.value().size());
}
}
void Renderer::renderSelection(Scene & scene) {
QOpenGLShaderProgram * prog = 0;
if (bindShader(srSelectionFill, &prog)) {
view->hov_objects.clear();
id_hover = 0;
if (fbo_selection.queriedPoints() > 0) {
if (fbo_selection.queriedPoints() == 1) {
id_hover = fbo_selection.getPoint();
view->hov_objects.resize(1);
view->hov_objects[0] = ids.value(id_hover);
//qDebug() << id_hover;
} else {
QVector<uint> points = fbo_selection.getPoints();
QSet<uint> ids_hover;
foreach (uint i, points)
ids_hover << i;
view->hov_objects.clear();
foreach (uint i, ids_hover)
view->hov_objects << ids.value(i);
//qDebug() << ids_hover;
}
}
fbo_selection.bind();
fbo_selection.setWriteBuffers();
glEnableDepth();
glClearFramebuffer(QColor(0,0,0,0));
setUniformCamera(prog, view->camera());
renderObjects(scene, rpSelection);
//mouse_rect = fbo_selection.rect();
if (mouse_rect.isNull())
fbo_selection.queryPoint(0, mouse_pos);
else
fbo_selection.queryPoints(0, mouse_rect);
//qDebug() << id_hover;
fbo_selection.bindColorTextures();
fbo_selection.setWriteBuffers();
if (!view->hoverHalo_ && !view->selectionHalo_)
glClearFramebuffer(QColor(0,0,0,0), false);
else {
bindShader(srSelectionHalo, &prog);
setUniformHalo(prog, "hover" , view->hoverHaloColor() , view->hoverHaloFillAlpha());
setUniformHalo(prog, "selection", view->selectionHaloColor(), view->selectionHaloFillAlpha());
prog->setUniformValue("has_hover" , view->hoverHalo_ && (id_hover > 0) ? 1.f : 0.f);
prog->setUniformValue("has_selection", view->selectionHalo_ ? 1.f : 0.f);
prog->setUniformValue("fb_hover" , (int)sbrSrcHover);
prog->setUniformValue("fb_selection", (int)sbrSrcSelect);
prog->setUniformValue("hover_id", QVector4D(float( id_hover & 0xFF) / 255.f,
float((id_hover >> 8 ) & 0xFF) / 255.f,
float((id_hover >> 16) & 0xFF) / 255.f,
float((id_hover >> 24) & 0xFF) / 255.f));
renderQuad(prog, quad, view->camera());
}
fbo_selection.release();
}
}
void Renderer::renderSelectionFrame() {
QOpenGLShaderProgram * prog = 0;
if (bindShader(srSelectionFrame, &prog)) {
QMatrix4x4 mat;
double mrx = mouse_rect.x(), mrw = mouse_rect.width() , vw = view->width();
double mry = mouse_rect.y(), mrh = mouse_rect.height(), vh = view->height();
mat.translate(-1. + (mrw + mrx*2) / vw, 1. - (mrh + mry*2) / vh, 0.);
mat.scale(mrw / vw, mrh / vh, 0.);
initQuad(sel_frame, mat);
prog->setUniformValue("size", QVector2D(mrw / vw, mrh / vh));
prog->setUniformValue("thickness", line_thick_);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
renderQuad(prog, sel_frame);
glDisable(GL_BLEND);
}
}
void Renderer::renderScene() {
initShaders();
QOpenGLExtraFunctions * f = view;
@@ -295,7 +187,7 @@ void Renderer::renderScene() {
if (scene_changed || scene.need_reload_materials) {
if (scene.need_reload_materials)
maps_hash = 0;
generateObjectsID(scene);
rend_selection.generateObjectsID(scene);
reloadMaterials(scene);
if (edit_mode)
recreateMaterialThumbnails();
@@ -321,7 +213,7 @@ void Renderer::renderScene() {
/// selection
if (edit_mode) {
renderSelection(scene);
rend_selection.renderSelection(scene);
}
/// geometry pass
@@ -362,20 +254,8 @@ void Renderer::renderScene() {
/// apply hovers and selection frame
if (edit_mode) {
if (bindShader(srSelectionApply, &prog)) {
fbo_selection.bindColorTextures();
fbo_out.bindColorTexture(0);
prog->setUniformValue("fb_out" , 0);
prog->setUniformValue("fb_hover" , (int)sbrHovered );
prog->setUniformValue("fb_select", (int)sbrSelected);
renderQuad(prog, quad, cam);
if (!mouse_rect.isNull()) {
renderSelectionFrame();
}
rend_service.renderService();
}
rend_selection.drawSelection(fbo_out);
rend_service.renderService();
} else {
fbo_out.blit(0, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
}