void initVariables() { cam.setOrthoGraphicProjection((bool)str2num<int>(parameters.find("OrthographicMode"))); drawInfo = (bool)util::str2num<int>(parameters.find("DrawInfo")); //cam.setOrthoGraphicProjection(orthoMode); cerr << "COMPUTED IOD=" << interoculardistance << endl; trial.init(parameters); stimulusTime=util::str2num<double>(parameters.find("StimulusTime")); trialTimer.start(); trial.next(); interoculardistance = str2num<double>(parameters.find("IOD"))*trial.getCurrent().at("IODFactor"); int textureResolution = util::str2num<int>(parameters.find("TextureResolution")); int maxTextureResolutionZ = (int) std::ceil(textureResolution*util::str2num<double>(parameters.find("MaxCurvatureZ"))); // allocate the texture memory if (parameters.find("UsePolkaDots")=="1") { surface.resize(textureResolution,textureResolution, maxTextureResolutionZ); surface.initializeSurfaceShaders(VolumetricSurfaceIntersection::SurfaceParabolicCylinder); } updateStimulus(trial.getCurrent().at("CurvatureZ")); CurvatureZ=0.0; }
/** * @brief initRendering */ void initRendering() { glShadeModel(GL_SMOOTH); glEnable(GL_MULTISAMPLE); glEnable(GL_DEPTH_TEST); glEnable (GL_BLEND); glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glClearColor(0.0,0.0,0.0,1.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glTranslatef(0,0,eyeDistance); int nspheres=500; int minRadius=15; int maxRadius=50; glewInit(); surface.resize(iWidth,iHeight,iDepth*3); surface.fillVolumeWithSpheres(nspheres,minRadius,maxRadius); surface.initializeTexture(); surface.initializeSurfaceShaders(VolumetricSurfaceIntersection::SurfaceParabolicCylinder); surface.parabolicCylinderSurface.curvature=1.0; surface.parabolicCylinderSurface.centerX=surface.parabolicCylinderSurface.centerY=surface.parabolicCylinderSurface.centerZ=0.0; surface.parabolaSurface.curvature=1.0; surface.coneSurface.c=1.0; surface.ellipsoidSurface.axisX=1.0; surface.ellipsoidSurface.axisY=1.0; surface.ellipsoidSurface.axisZ=1.0; surface.ellipticCylinderSurface.axisX=1.0; surface.ellipticCylinderSurface.height=1.0; surface.ellipticCylinderSurface.axisZ=1.0; getGLerrors(); }
/** * @brief drawStimulus */ void drawStimulus() { double radiusX = util::str2num<double>(parameters.find("RadiusX")); glPushMatrix(); glLoadIdentity(); glTranslated(0,0,focalDistance); //if (horizontal) glRotated(90,0,0,1); glScaled(radiusX,radiusX,radiusX); //glRotated(90,0,1,0); //for lateral debug mode if ( parameters.find("UsePolkaDots")=="1") surface.draw(); glPopMatrix(); glPushAttrib(GL_ALL_ATTRIB_BITS); glDisable(GL_TEXTURE_3D); glPushMatrix(); glLoadIdentity(); glTranslated(0,0,focalDistance+0.02); // if ( horizontal ) glRotated(90,0,0,1); glScaled(radiusX,radiusX,radiusX); //glRotated(90,0,1,0); //for lateral debug mode if (parameters.find("AddRandomNoise")=="1") { stimDrawerRed.draw(); //stimDrawerBlack.draw(); } glPopMatrix(); glPopAttrib(); }
/** * @brief updateStimulus * @param CurvatureZ */ void updateStimulus(double CurvatureZ) { double radiusX = util::str2num<double>(parameters.find("RadiusX")); double noiseDensity = util::str2num<double>(parameters.find("RandomNoiseDensity")); int nRandomDots = mathcommon::getParaboloidArea(radiusX,CurvatureZ)*noiseDensity; parabolicCylinderPoints.setNpoints(nRandomDots); parabolicCylinderPoints.setCurvature(CurvatureZ); parabolicCylinderPoints.setFluffiness(0.0); parabolicCylinderPoints.compute(); stimDrawerBlack.setSpheres(false); stimDrawerRed.setSpheres(false); stimDrawerRed.setStimulus(¶bolicCylinderPoints); stimDrawerBlack.setStimulus(¶bolicCylinderPoints); float randomDotsSize = util::str2num<float>(parameters.find("RandomDotsSize")); if (parameters.find("DotsColor")=="RedAndBlack") { stimDrawerRed.initList(¶bolicCylinderPoints,glRed,randomDotsSize); parabolicCylinderPoints.compute(); stimDrawerBlack.initList(¶bolicCylinderPoints,glBlack,randomDotsSize); surface.setUniformColor(glRed); } else { stimDrawerRed.initList(¶bolicCylinderPoints,glWhite,randomDotsSize); parabolicCylinderPoints.compute(); stimDrawerBlack.initList(¶bolicCylinderPoints,glWhite,randomDotsSize); surface.setUniformColor(glWhite); } if ( parameters.find("UsePolkaDots")=="1" ) { int nSpheres = util::str2num<int>(parameters.find("TotalPolkaDots")); int dotsRadiusMin = util::str2num<int>(parameters.find("PolkaDotsRadiusMin")); int dotsRadiusMax = util::str2num<int>(parameters.find("PolkaDotsRadiusMax")); int textureResolution = util::str2num<int>(parameters.find("TextureResolution")); //surface.fillVolumeWithSpheres2(nSpheres,nSpheres,nSpheres*util::str2num<double>(parameters.find("MaxCurvatureZ")),dotsRadiusMin,dotsRadiusMax); surface.fillVolumeWithSpheres(nSpheres,dotsRadiusMin ,dotsRadiusMax); surface.initializeTexture(); surface.parabolicCylinderSurface.curvature=CurvatureZ; //surface.setUniformColor(glWhite); } }
/** * @brief handleKeypress * @param key * @param x * @param y */ void handleKeypress(unsigned char key, int x, int y) { switch (key) { case 'q': //Escape key { exit(0); break; } case ' ': { surface.fillVolumeWithSpheres(1500,5,10); surface.initializeTexture(); break; } case '+': { eyeDistance+=0.5; break; } case '-': { eyeDistance-=0.5; break; } case 'a': { surface.parabolaSurface.curvature+=0.01; surface.parabolicCylinderSurface.curvature+=0.01; break; } case 'z': { surface.parabolaSurface.curvature-=0.01; surface.parabolicCylinderSurface.curvature-=0.01; break; } } }
/** * @brief drawThings */ void drawThings() { GLText text(width,height,glWhite); text.init(width,height,glWhite); text.enterTextInputMode(); text.draw("C= "+util::stringify(surface.parabolaSurface.curvature)); text.leaveTextInputMode(); glPushMatrix(); glLoadIdentity(); glTranslated(0,0,eyeDistance); glScaled(10,10,10); arcball.applyRotationMatrix(); surface.draw(); glPopMatrix(); getGLerrors(); }