git-svn-id: svn://db.shs.com.ru/libs@636 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -45,9 +45,10 @@ Renderer::Renderer(QGLView * view_): RendererBase(view_),
|
||||
shader_files[srServiceFill ] = "service_fill.glsl";
|
||||
shader_files[srServiceFrame] = "service_frame.glsl";
|
||||
|
||||
shader_files[srGeometryPass] = "ds_geom.glsl";
|
||||
shader_files[srLightingPass] = "ds_light.glsl";
|
||||
shader_files[srFinalPass ] = "ds_final.glsl";
|
||||
shader_files[srGeometryPass ] = "ds_geom.glsl";
|
||||
shader_files[srLightOmniPass] = "ds_light.glsl"; shader_defines[srLightOmniPass] << "FIRST_PASS";
|
||||
shader_files[srLightSpotPass] = "ds_light.glsl"; shader_defines[srLightSpotPass] << "SPOT";
|
||||
shader_files[srFinalPass ] = "ds_final.glsl";
|
||||
|
||||
/*shaders << ShaderPair("FXAA", &shader_fxaa)
|
||||
<< ShaderPair("dsl_pass_0", &shader_ds_0)
|
||||
@@ -102,9 +103,12 @@ void Renderer::reloadShaders() {
|
||||
QMapIterator<ShaderRole, QString> it(shader_files);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
loadShadersMulti(shaders[it.key()], "shaders/" + it.value());
|
||||
loadShadersMulti(shaders[it.key()], "shaders/" + it.value(), shader_defines.value(it.key()));
|
||||
}
|
||||
need_init_shaders = true;
|
||||
view->scene()->setLightsChanged();
|
||||
view->scene()->setTreeStructChanged();
|
||||
view->scene()->setMaterialsChanged();
|
||||
}
|
||||
|
||||
|
||||
@@ -122,9 +126,12 @@ void Renderer::initShaders() {
|
||||
if (!need_init_shaders) return;
|
||||
need_init_shaders = false;
|
||||
initUniformBuffer(shaders.value(srGeometryPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
|
||||
initUniformBuffer(shaders.value(srLightingPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
|
||||
initUniformBuffer(shaders.value(srLightingPass), &buffer_lights , bpLightParameters, "QGLLightParameterData");
|
||||
initUniformBuffer(shaders.value(srLightingPass), &buffer_lights_pos, bpLightPositions , "QGLLightPositionData" );
|
||||
initUniformBuffer(shaders.value(srLightOmniPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
|
||||
initUniformBuffer(shaders.value(srLightOmniPass), &buffer_lights , bpLightParameters, "QGLLightParameterData");
|
||||
initUniformBuffer(shaders.value(srLightOmniPass), &buffer_lights_pos, bpLightPositions , "QGLLightPositionData" );
|
||||
initUniformBuffer(shaders.value(srLightSpotPass), &buffer_materials , bpMaterials , "QGLMaterialData" );
|
||||
initUniformBuffer(shaders.value(srLightSpotPass), &buffer_lights , bpLightParameters, "QGLLightParameterData");
|
||||
initUniformBuffer(shaders.value(srLightSpotPass), &buffer_lights_pos, bpLightPositions , "QGLLightPositionData" );
|
||||
}
|
||||
|
||||
|
||||
@@ -167,7 +174,7 @@ void Renderer::renderObjects(Scene & scene, RenderPass pass) {
|
||||
}
|
||||
if (mesh->selected_changed && edit_mode) {
|
||||
mesh->selected_changed = false;
|
||||
rend_selection.fillSelectionsBuffer(it.value());
|
||||
fillSelectionsBuffer(rend_selection.cur_selections_, it.value());
|
||||
mesh->loadSelections(f, rend_selection.cur_selections_);
|
||||
}
|
||||
mesh->draw(f, it.value().size());
|
||||
@@ -200,16 +207,16 @@ void Renderer::renderScene() {
|
||||
}
|
||||
|
||||
/// lights
|
||||
QList<Light*> ll = scene.lights_used;
|
||||
QMap<int, QList<Light*>> ll = scene.lights_used;
|
||||
if (is_camera_light) {
|
||||
ll << cam_light;
|
||||
ll[Light::Omni] << cam_light;
|
||||
cam_light->setPos(cam->pos());
|
||||
}
|
||||
if (scene.lights_changed) {
|
||||
scene.lights_changed = false;
|
||||
reloadLightsParameters(ll);
|
||||
}
|
||||
reloadLightsPositions(ll, cam);
|
||||
reloadLightsPositions(cam);
|
||||
|
||||
/// selection
|
||||
if (edit_mode) {
|
||||
@@ -233,31 +240,35 @@ void Renderer::renderScene() {
|
||||
fbo_ds.bindColorTextures();
|
||||
fbo_ds.bindDepthTexture(5);
|
||||
fbo_out.bind();
|
||||
if (bindShader(srLightingPass, &prog)) {
|
||||
setUniformCamera(prog, cam);
|
||||
setUniformViewCorners(prog, cam);
|
||||
for (int i = 0; i < 5; ++i)
|
||||
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
|
||||
prog->setUniformValue("tex_d", 5);
|
||||
prog->setUniformValue("lights_count", ll.size());
|
||||
glClearFramebuffer(view->backColor(), false);
|
||||
renderQuad(prog, quad, cam);
|
||||
/*QVector<float> _fb = fbo_out.grabF(0);
|
||||
if (!_fb.isEmpty()) {
|
||||
double sum = 0.;
|
||||
foreach (float f, _fb) sum += f;
|
||||
sum /= _fb.size();
|
||||
qDebug() << "sum =" << sum;
|
||||
}*/
|
||||
int ri = 1, wi = 0;
|
||||
typedef QPair<Renderer::ShaderRole, Light::Type> PassPair;
|
||||
QVector<PassPair> passes;
|
||||
passes << PassPair(srLightOmniPass, Light::Omni) << PassPair(srLightSpotPass, Light::Cone);
|
||||
foreach (PassPair pass, passes) {
|
||||
if (bindShader(pass.first, &prog)) {
|
||||
setUniformCamera(prog, cam);
|
||||
setUniformViewCorners(prog, cam);
|
||||
for (int i = 0; i < 5; ++i)
|
||||
prog->setUniformValue(QString("tex_%1").arg(i).toLatin1().constData(), i);
|
||||
prog->setUniformValue("tex_d", 5);
|
||||
prog->setUniformValue("lights_start", lights_start[pass.second]);
|
||||
prog->setUniformValue("lights_count", ll[pass.second].size());
|
||||
prog->setUniformValue("tex_sum", 7);
|
||||
fbo_out.setWriteBuffer(wi);
|
||||
fbo_out.bindColorTexture(ri, 7);
|
||||
glClearFramebuffer(Qt::black, false);
|
||||
renderQuad(prog, quad, cam);
|
||||
piSwap(ri, wi);
|
||||
}
|
||||
}
|
||||
fbo_out.release();
|
||||
|
||||
/// apply hovers and selection frame
|
||||
if (edit_mode) {
|
||||
rend_selection.drawSelection(fbo_out);
|
||||
rend_selection.drawSelection(fbo_out, ri);
|
||||
rend_service.renderService();
|
||||
} else {
|
||||
fbo_out.blit(0, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
|
||||
fbo_out.blit(ri, 0, 0, fbo_out.rect(), QRect(QPoint(), view->size()));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user