git-svn-id: svn://db.shs.com.ru/libs@46 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -153,41 +153,41 @@ void GLRendererBase::applyFilteringParameters() {
|
||||
|
||||
|
||||
void GLRendererBase::renderObjects(int pass, int light_pass, void * shaders, bool textures, bool light, bool fog) {
|
||||
RenderingParameters rp;
|
||||
rp.pass = pass;
|
||||
rp.light_pass = light_pass;
|
||||
rp.shaders = shaders;
|
||||
rp.textures = textures;
|
||||
rp.light = rp.prev_light = light;
|
||||
rp.fog = rp.prev_fog = fog;
|
||||
rp.view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
|
||||
rp.proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
|
||||
RenderingParameters rpl;
|
||||
rpl.pass = pass;
|
||||
rpl.light_pass = light_pass;
|
||||
rpl.shaders = shaders;
|
||||
rpl.textures = textures;
|
||||
rpl.light = rpl.prev_light = light;
|
||||
rpl.fog = rpl.prev_fog = fog;
|
||||
rpl.view_matrix = rp.view_matrix;
|
||||
rpl.proj_matrix = rp.proj_matrix;
|
||||
//qDebug() << "view:" << rp.view_matrix;
|
||||
for (int i = 0; i < 32; ++i) rp.prev_tex[i] = 0;
|
||||
setupTextures(view.objects_, rp, true);
|
||||
glSetLightEnabled(rp.prev_light);
|
||||
glSetFogEnabled(rp.prev_fog);
|
||||
glSetCapEnabled(GL_TEXTURE_2D, rp.textures);
|
||||
for (int i = 0; i < 32; ++i) rpl.prev_tex[i] = 0;
|
||||
setupTextures(view.objects_, rpl, true);
|
||||
glSetLightEnabled(rpl.prev_light);
|
||||
glSetFogEnabled(rpl.prev_fog);
|
||||
glSetCapEnabled(GL_TEXTURE_2D, rpl.textures);
|
||||
glSetCapEnabled(GL_BLEND, pass == GLObjectBase::Transparent);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
glDisable(GL_TEXTURE_CUBE_MAP);
|
||||
glPushMatrix();
|
||||
renderSingleObject(view.objects_, rp);
|
||||
renderSingleObject(view.objects_, rpl);
|
||||
glPopMatrix();
|
||||
}
|
||||
|
||||
|
||||
void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters & rp) {
|
||||
void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters & rpl) {
|
||||
if (!o.isInit())
|
||||
o.init();
|
||||
if (!o.isTexturesLoaded())
|
||||
o.loadTextures();
|
||||
if (!o.visible_) return;
|
||||
if (rp.pass == o.pass_) {
|
||||
if (rpl.pass == o.pass_) {
|
||||
Material & mat(o.material_);
|
||||
QMatrix4x4 curview = rp.view_matrix * o.itransform_;
|
||||
setupTextures(o, rp, false);
|
||||
mat.apply((QGLShaderProgram*)rp.shaders);
|
||||
QMatrix4x4 curview = rpl.view_matrix * o.itransform_;
|
||||
setupTextures(o, rpl, false);
|
||||
mat.apply((QGLShaderProgram*)rpl.shaders);
|
||||
glSetPolygonMode(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_);
|
||||
@@ -199,7 +199,7 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters &
|
||||
if (!mat.map_reflection.isEmpty()) mat.map_reflection.bind();
|
||||
else glDisable(GL_TEXTURE_CUBE_MAP);
|
||||
} else glDisable(GL_TEXTURE_CUBE_MAP);
|
||||
if (rp.light_pass > 0) glDisable(GL_TEXTURE_CUBE_MAP);
|
||||
if (rpl.light_pass > 0) glDisable(GL_TEXTURE_CUBE_MAP);
|
||||
GLfloat gm[16], bc[4] = {mat.reflectivity, mat.reflectivity, mat.reflectivity, mat.reflectivity};
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);
|
||||
glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_INTERPOLATE);
|
||||
@@ -213,15 +213,46 @@ void GLRendererBase::renderSingleObject(GLObjectBase & o, RenderingParameters &
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
glActiveTextureChannel(0);
|
||||
}
|
||||
if (rp.shaders) {
|
||||
if (rpl.shaders) {
|
||||
//qDebug() << o.name() << curview << curview.determinant();
|
||||
setUniformMatrices((QGLShaderProgram*)rp.shaders, rp.proj_matrix, curview);
|
||||
setUniformMatrices((QGLShaderProgram*)rpl.shaders, rpl.proj_matrix, curview);
|
||||
} else {
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
setGLMatrix(curview);
|
||||
}
|
||||
o.draw((QGLShaderProgram*)rp.shaders);
|
||||
o.draw((QGLShaderProgram*)rpl.shaders);
|
||||
}
|
||||
foreach (GLObjectBase * i, o.children_)
|
||||
renderSingleObject(*i, rp);
|
||||
renderSingleObject(*i, rpl);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
void GLRendererBase::RenderingParameters::prepare() {
|
||||
proj_matrix = getGLMatrix(GL_PROJECTION_MATRIX);
|
||||
view_matrix = getGLMatrix(GL_MODELVIEW_MATRIX);
|
||||
viewproj_matrix = proj_matrix * view_matrix;
|
||||
normal_matrix = view_matrix.normalMatrix();
|
||||
proj_matrix_i = proj_matrix.inverted();
|
||||
view_matrix_i = view_matrix.inverted();
|
||||
viewproj_matrix_i = viewproj_matrix.inverted();
|
||||
}
|
||||
|
||||
|
||||
void GLRendererBase::RenderingParameters::setUniform(QGLShaderProgram * prog) {
|
||||
if (!prog) return;
|
||||
prog->setUniformValue("qgl_ModelViewMatrix", view_matrix);
|
||||
prog->setUniformValue("qgl_ProjectionMatrix", proj_matrix);
|
||||
prog->setUniformValue("qgl_ModelViewProjectionMatrix", viewproj_matrix);
|
||||
prog->setUniformValue("qgl_NormalMatrix", normal_matrix);
|
||||
prog->setUniformValue("qgl_ModelViewMatrixInverse", view_matrix_i);
|
||||
prog->setUniformValue("qgl_ProjectionMatrixInverse", proj_matrix_i);
|
||||
prog->setUniformValue("qgl_ModelViewProjectionMatrixInverse", viewproj_matrix_i);
|
||||
prog->setUniformValue("qgl_ModelViewMatrixTranspose", view_matrix.transposed());
|
||||
prog->setUniformValue("qgl_ProjectionMatrixTranspose", proj_matrix.transposed());
|
||||
prog->setUniformValue("qgl_ModelViewProjectionMatrixTranspose", viewproj_matrix.transposed());
|
||||
prog->setUniformValue("qgl_ModelViewMatrixInverseTranspose", view_matrix_i.transposed());
|
||||
prog->setUniformValue("qgl_ProjectionMatrixInverseTranspose", proj_matrix_i.transposed());
|
||||
prog->setUniformValue("qgl_ModelViewProjectionMatrixInverseTranspose", viewproj_matrix_i.transposed());
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user