diff --git a/contrib/mobile/drawContext.cpp b/contrib/mobile/drawContext.cpp index ea30ee420a58eff5cd6133be7f40a53d7e41aaf9..7dd3f863d9cc5e650c080703b218d5f37f0729cd 100644 --- a/contrib/mobile/drawContext.cpp +++ b/contrib/mobile/drawContext.cpp @@ -628,7 +628,8 @@ void drawContext::drawView() OrthofFromGModel(); glMatrixMode(GL_MODELVIEW); - // fill the background + + // draw the background glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); if(CTX::instance()->bgGradient){ glPushMatrix(); @@ -656,10 +657,73 @@ void drawContext::drawView() } checkGlError("Draw background"); + // init lights + glPushMatrix(); glLoadIdentity(); glScalef(_scale[0], _scale[1], _scale[2]); glTranslatef(_translate[0], _translate[1], _translate[2]); + for(int i = 0; i < 6; i++) { + if(CTX::instance()->light[i]) { + GLfloat position[4] = { + (GLfloat)CTX::instance()->lightPosition[i][0], + (GLfloat)CTX::instance()->lightPosition[i][1], + (GLfloat)CTX::instance()->lightPosition[i][2], + (GLfloat)CTX::instance()->lightPosition[i][3] + }; + glLightfv((GLenum)(GL_LIGHT0 + i), GL_POSITION, position); + GLfloat r = (GLfloat)(CTX::instance()->unpackRed + (CTX::instance()->color.ambientLight[i]) / 255.); + GLfloat g = (GLfloat)(CTX::instance()->unpackGreen + (CTX::instance()->color.ambientLight[i]) / 255.); + GLfloat b = (GLfloat)(CTX::instance()->unpackBlue + (CTX::instance()->color.ambientLight[i]) / 255.); + GLfloat ambient[4] = {r, g, b, 1.0F}; + glLightfv((GLenum)(GL_LIGHT0 + i), GL_AMBIENT, ambient); + r = (GLfloat)(CTX::instance()->unpackRed + (CTX::instance()->color.diffuseLight[i]) / 255.); + g = (GLfloat)(CTX::instance()->unpackGreen + (CTX::instance()->color.diffuseLight[i]) / 255.); + b = (GLfloat)(CTX::instance()->unpackBlue + (CTX::instance()->color.diffuseLight[i]) / 255.); + GLfloat diffuse[4] = {r, g, b, 1.0F}; + glLightfv((GLenum)(GL_LIGHT0 + i), GL_DIFFUSE, diffuse); + r = (GLfloat)(CTX::instance()->unpackRed + (CTX::instance()->color.specularLight[i]) / 255.); + g = (GLfloat)(CTX::instance()->unpackGreen + (CTX::instance()->color.specularLight[i]) / 255.); + b = (GLfloat)(CTX::instance()->unpackBlue + (CTX::instance()->color.specularLight[i]) / 255.); + GLfloat specular[4] = {r, g, b, 1.0F}; + glLightfv((GLenum)(GL_LIGHT0 + i), GL_SPECULAR, specular); + glEnable((GLenum)(GL_LIGHT0 + i)); + } + else{ + glDisable((GLenum)(GL_LIGHT0 + i)); + } + } + glPopMatrix(); + // ambient and diffuse material colors track glColor automatically + //glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE); + glEnable(GL_COLOR_MATERIAL); + // "white"-only specular material reflection color + GLfloat spec[4] = {(GLfloat)CTX::instance()->shine, + (GLfloat)CTX::instance()->shine, + (GLfloat)CTX::instance()->shine, 1.0F}; + glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, spec); + // specular exponent in [0,128] (larger means more "focused" + // reflection) + glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, + (GLfloat)CTX::instance()->shineExponent); + glShadeModel(GL_SMOOTH); + glEnable(GL_RESCALE_NORMAL); + glLightModelf(GL_LIGHT_MODEL_TWO_SIDE, 1.); + glDisable(GL_LIGHTING); + checkGlError("Initialize lights"); + // init position + glLoadIdentity(); + glScalef(_scale[0], _scale[1], _scale[2]); + glTranslatef(_translate[0], _translate[1], _translate[2]); if(CTX::instance()->rotationCenterCg) glTranslatef(CTX::instance()->cg[0], CTX::instance()->cg[1], @@ -668,10 +732,8 @@ void drawContext::drawView() glTranslatef(CTX::instance()->rotationCenter[0], CTX::instance()->rotationCenter[1], CTX::instance()->rotationCenter[2]); - buildRotationMatrix(); glMultMatrixf(_rotatef); - if(CTX::instance()->rotationCenterCg) glTranslatef(-CTX::instance()->cg[0], -CTX::instance()->cg[1], @@ -680,24 +742,19 @@ void drawContext::drawView() glTranslatef(-CTX::instance()->rotationCenter[0], -CTX::instance()->rotationCenter[1], -CTX::instance()->rotationCenter[2]); - checkGlError("Initialize position"); + // draw everything glEnable(GL_DEPTH_TEST); - - drawMesh(); - checkGlError("Draw mesh"); - drawGeom(); - checkGlError("Draw geometry"); - drawPost(); - checkGlError("Draw post-pro"); + drawMesh(); checkGlError("Draw mesh"); + drawGeom(); checkGlError("Draw geometry"); + glEnable(GL_LIGHTING); + drawPost(); checkGlError("Draw post-pro"); + glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); - drawScale(); - checkGlError("Draw scales"); - drawAxes(); - checkGlError("Draw axes"); - drawText2d(); - checkGlError("Draw text2d"); + drawScale(); checkGlError("Draw scales"); + drawAxes(); checkGlError("Draw axes"); + drawText2d(); checkGlError("Draw text2d"); } std::vector<std::string> commandToVector(const std::string cmd)