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

This commit is contained in:
2015-11-30 21:45:46 +00:00
parent 36ba0a0ba7
commit 5ca76b651b
8 changed files with 42 additions and 17 deletions

View File

@@ -229,18 +229,22 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters &
}
void GLRendererBase::renderShadow(Light * l) {
void GLRendererBase::renderShadow(Light * l, QGLShaderProgram * prog, QMatrix4x4 mat) {
Camera cam;
QVector3D wp = l->worldPos();
cam.setPos(wp);
cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction, 0).toVector3D()));
cam.setAim(wp + (l->worldTransform() * QVector4D(l->direction)).toVector3D());
cam.setDepthStart(view.camera().depthStart());
cam.setDepthEnd(view.camera().depthEnd());
cam.setFOV(l->angle_end / 2.);
cam.apply(1.);
RenderingParameters rpl;
rpl.pass = GLObjectBase::Solid;
rpl.shaders = 0;
rpl.shaders = prog;
rpl.textures = rpl.light = rpl.fog = false;
rpl.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
rpl.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
l->shadow_matrix = mat * (rpl.proj_matrix * rpl.view_matrix);
//glPushMatrix();
renderSingleShadow(view.objects_, rpl);
//glPopMatrix();
@@ -251,11 +255,17 @@ void GLRendererBase::renderSingleShadow(GLObjectBase & o, RenderingParameters &
if (!o.isInit())
o.init();
if (!o.visible_) return;
setGLMatrix(rpl.view_matrix * o.itransform_);
if (rpl.shaders) {
//qDebug() << o.name() << curview << curview.determinant();
setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, rpl.view_matrix * o.itransform_);
} else {
glMatrixMode(GL_MODELVIEW);
setGLMatrix(rpl.view_matrix * o.itransform_);
}
glPolygonMode(GL_FRONT_AND_BACK, o.render_mode != GLObjectBase::View ? o.render_mode : (view.rmode != GLObjectBase::View ? view.rmode : GL_FILL));
glLineWidth(o.line_width > 0. ? o.line_width : view.lineWidth_);
glPointSize(o.line_width > 0. ? o.line_width : view.lineWidth_);
o.draw(0, true);
o.draw((QGLShaderProgram*)rpl.shaders, true);
foreach (GLObjectBase * i, o.children_)
renderSingleShadow(*i, rpl);
}