git-svn-id: svn://db.shs.com.ru/libs@45 a8b55f48-bf90-11e4-a774-851b48703e85
This commit is contained in:
@@ -22,6 +22,8 @@
|
||||
const char qgl_vertex_head[] =
|
||||
"in vec3 _qgl_Vertex;\n"
|
||||
"in vec3 qgl_Normal;\n"
|
||||
"in vec3 qgl_Tangent;\n"
|
||||
"in vec3 qgl_Bitangent;\n"
|
||||
"in vec2 qgl_Texture;\n"
|
||||
"in vec4 qgl_Color;\n"
|
||||
"out vec2 qgl_FragTexture;\n"
|
||||
@@ -65,8 +67,6 @@ const char qgl_structs[] =
|
||||
" sampler2D map;\n"
|
||||
"};\n"
|
||||
"struct QGLMaterial {\n"
|
||||
" float roughness;\n"
|
||||
" float specular;\n"
|
||||
" float transparency;\n"
|
||||
" float reflectivity;\n"
|
||||
" float iof;\n"
|
||||
@@ -75,10 +75,10 @@ const char qgl_structs[] =
|
||||
" vec4 color_specular;\n"
|
||||
" vec4 color_self_illumination;\n"
|
||||
" QGLMap map_diffuse;\n"
|
||||
" QGLMap map_bump;\n"
|
||||
" QGLMap map_normal;\n"
|
||||
" QGLMap map_relief;\n"
|
||||
" QGLMap map_self_illumination;\n"
|
||||
" QGLMap map_roughness;\n"
|
||||
" QGLMap map_specularity;\n"
|
||||
" QGLMap map_specular;\n"
|
||||
"};\n"
|
||||
"uniform QGLLight qgl_AmbientLight;\n"
|
||||
@@ -143,20 +143,22 @@ bool loadShaders(QGLShaderProgram * prog, const QString & name, const QString &
|
||||
void setUniformMatrices(QGLShaderProgram * prog, QMatrix4x4 proj, QMatrix4x4 view) {
|
||||
QMatrix4x4 mvpm = proj * view;
|
||||
QMatrix3x3 nm = view.normalMatrix();
|
||||
//nm.in;
|
||||
prog->setUniformValue("qgl_ModelViewMatrix", view);
|
||||
prog->setUniformValue("qgl_ProjectionMatrix", proj);
|
||||
prog->setUniformValue("qgl_ModelViewProjectionMatrix", mvpm);
|
||||
prog->setUniformValue("qgl_NormalMatrix", nm);
|
||||
//prog->setUniformValue("qgl_BumpMatrix", nm.);
|
||||
prog->setUniformValue("qgl_ModelViewMatrixTranspose", view.transposed());
|
||||
prog->setUniformValue("qgl_ProjectionMatrixTranspose", proj.transposed());
|
||||
prog->setUniformValue("qgl_ModelViewProjectionMatrixTranspose", mvpm.transposed());
|
||||
}
|
||||
|
||||
|
||||
void setUniformMap(QGLShaderProgram * prog, QString map_name, const Map & map, int channel) {
|
||||
void setUniformMap(QGLShaderProgram * prog, QString map_name, const Map & map, int channel, int def_channel) {
|
||||
prog->setUniformValue(("qgl_Material." + map_name + ".offset").toLatin1().constData(), map.color_offset);
|
||||
prog->setUniformValue(("qgl_Material." + map_name + ".amount").toLatin1().constData(), map.color_amount);
|
||||
prog->setUniformValue(("qgl_Material." + map_name + ".map").toLatin1().constData(), map.bitmap_id > 0 ? channel : 6);
|
||||
prog->setUniformValue(("qgl_Material." + map_name + ".map").toLatin1().constData(), map.bitmap_id > 0 ? channel : def_channel);
|
||||
}
|
||||
|
||||
|
||||
@@ -167,8 +169,6 @@ void setUniformMaterial(QGLShaderProgram * prog, const Material & mat) {
|
||||
mat_diffuse[2] = mat.color_diffuse.blueF();
|
||||
mat_diffuse[3] = mat.color_diffuse.alphaF() * (1.f - mat.transparency);
|
||||
glVertexAttrib4f(prog->attributeLocation("qgl_Color"), mat_diffuse[0], mat_diffuse[1], mat_diffuse[2], mat_diffuse[3]);
|
||||
prog->setUniformValue("qgl_Material.roughness", mat.roughness);
|
||||
prog->setUniformValue("qgl_Material.specular", mat.specular);
|
||||
prog->setUniformValue("qgl_Material.transparency", mat.transparency);
|
||||
prog->setUniformValue("qgl_Material.reflectivity", mat.reflectivity);
|
||||
prog->setUniformValue("qgl_Material.iof", mat.iof);
|
||||
@@ -176,19 +176,19 @@ void setUniformMaterial(QGLShaderProgram * prog, const Material & mat) {
|
||||
prog->setUniformValue("qgl_Material.color_diffuse", mat.color_diffuse);
|
||||
prog->setUniformValue("qgl_Material.color_self_illumination", mat.color_self_illumination);
|
||||
prog->setUniformValue("qgl_Material.color_specular", mat.color_specular);
|
||||
setUniformMap(prog, "map_diffuse", mat.map_diffuse, 0);
|
||||
setUniformMap(prog, "map_bump", mat.map_bump, 1);
|
||||
setUniformMap(prog, "map_relief", mat.map_relief, 2);
|
||||
setUniformMap(prog, "map_self_illumination", mat.map_self_illumination, 3);
|
||||
setUniformMap(prog, "map_roughness", mat.map_roughness, 4);
|
||||
setUniformMap(prog, "map_specular", mat.map_specular, 5);
|
||||
setUniformMap(prog, "map_diffuse", mat.map_diffuse, 0, 6);
|
||||
setUniformMap(prog, "map_normal", mat.map_normal, 1, 7);
|
||||
setUniformMap(prog, "map_relief", mat.map_relief, 2, 6);
|
||||
setUniformMap(prog, "map_self_illumination", mat.map_self_illumination, 3, 6);
|
||||
setUniformMap(prog, "map_specularity", mat.map_specularity, 4, 6);
|
||||
setUniformMap(prog, "map_specular", mat.map_specular, 5, 6);
|
||||
|
||||
}
|
||||
|
||||
|
||||
void setUniformLights(QGLShaderProgram * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat) {
|
||||
void setUniformLights(QGLShaderProgram * prog, const QVector<Light*> & lights, const QMatrix4x4 & mat, const QVector4D & dp) {
|
||||
for (int i = 0; i < lights.size(); ++i)
|
||||
setUniformLight(prog, lights[i], QString("qgl_Light[%1]").arg(i), mat);
|
||||
setUniformLight(prog, lights[i], QString("qgl_Light[%1]").arg(i), mat, dp);
|
||||
}
|
||||
/*
|
||||
" vec3 position;\n"
|
||||
@@ -198,9 +198,10 @@ void setUniformLights(QGLShaderProgram * prog, const QVector<Light*> & lights, c
|
||||
" float linearAttenuation;\n"
|
||||
" float quadraticAttenuation;\n"
|
||||
*/
|
||||
void setUniformLight(QGLShaderProgram * prog, Light * light, QString ulightn, const QMatrix4x4 & mat) {
|
||||
QVector4D pos(light->worldPos(), 1.);
|
||||
pos = mat * pos;
|
||||
void setUniformLight(QGLShaderProgram * prog, Light * light, QString ulightn, const QMatrix4x4 & mat, const QVector4D & dp) {
|
||||
QMatrix4x4 m = mat * light->worldTransform();
|
||||
QVector4D pos(0, 0, 0, 1.);
|
||||
pos = m * pos;
|
||||
//qDebug() << "light" << light->name() << ulightn << pos;
|
||||
prog->setUniformValue((ulightn + ".position").toLatin1().constData(), pos);
|
||||
prog->setUniformValue((ulightn + ".intensity").toLatin1().constData(), GLfloat(light->intensity));
|
||||
|
||||
Reference in New Issue
Block a user