void Mol::Draw(){ glPushMatrix(); glScalef(1/r,1/r,1/r); glTranslatef(-px,-py,-pz); float x[4][4], scalef; glGetFloatv(GL_MODELVIEW_MATRIX, &(x[0][0])); glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 0, scalef=extractCurrentScaleFactor(x),0,0,0 ); /* glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 6, 1.0 / ( scalef*scalef) , 0,0,0 );*/ /* printf("ScaleFactor= %f, ShadowScaleFactor= %f\n", scalef, shadowScaleFactor );*/ glEnable(GL_VERTEX_PROGRAM_ARB); glEnable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); moltextureCanvas.SetAsTexture(); if (cgSettings.P_shadowstrenght>0) { ShadowMap::GetCurrentPVMatrix(); ShadowMap::FeedParameters(); } for (int i=0; i<3; i++) glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, i, x[i][0],x[i][1],x[i][2],0 ); glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 6, mol.PredictAO(),0,0,0 ); if (draw_balls) { if (draw_wireframe_balls) { glDisable(GL_FRAGMENT_PROGRAM_ARB); for (int i=0; i<atom.size(); i++) { glColor3f(0,0,1); glBegin(GL_LINE_LOOP); atom[i].Draw(); glEnd(); } } else { glEnable(GL_VERTEX_PROGRAM_ARB); glEnable(GL_FRAGMENT_PROGRAM_ARB); //if (DL_atoms==666) glGenD glBegin(GL_QUADS); for (int i=0; i<atom.size(); i++) atom[i].Draw(); glEnd(); glDisable(GL_VERTEX_PROGRAM_ARB); glDisable(GL_FRAGMENT_PROGRAM_ARB); } } if (draw_sticks) if (sticks) { glEnable(GL_VERTEX_PROGRAM_ARB); glEnable(GL_FRAGMENT_PROGRAM_ARB); cgSettings.BindStickShaders(); ShadowMap::FeedParameters(); for (int i=0; i<3; i++) glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, i, x[i][0],x[i][1],x[i][2],0 ); /* glProgramEnvParameter4fARB(GL_FRAGMENT_PROGRAM_ARB, 6, 1.0 / ( scalef*scalef) , stick_radius,1.0 / ( scalef) ,0 );*/ glEnable(GL_TEXTURE_2D); glProgramEnvParameter4fARB(GL_VERTEX_PROGRAM_ARB, 0, scalef, stick_radius,stick_radius*2,0 ); glColor3f(1,1,1); if (draw_wireframe_sticks) { glDisable(GL_FRAGMENT_PROGRAM_ARB); for (int i=0; i<bond.size(); i++) { glColor3f(0,0.6,0.3); glBegin(GL_LINE_LOOP); bond[i].Draw(); glEnd(); } } else { glBegin(GL_QUADS); for (int i=0; i<bond.size(); i++) bond[i].Draw(); glEnd(); } cgSettings.BindShaders(); } glPopMatrix(); }