void ShadowMapSample::updateShadowMap() { mDepthFbo.bindFramebuffer(); glPolygonOffset( 1.0f, 1.0f ); glEnable( GL_POLYGON_OFFSET_FILL ); glClear( GL_DEPTH_BUFFER_BIT ); glPushAttrib( GL_VIEWPORT_BIT ); glViewport( 0, 0, SHADOW_MAP_RESOLUTION, SHADOW_MAP_RESOLUTION ); gl::pushMatrices(); mLight->setShadowRenderMatrices(); mBackboard.draw(); mTorus.draw(); gl::drawCube( vec3::zero(), vec3( 1, 1, 1 ) ); gl::popMatrices(); glPopAttrib(); glDisable( GL_POLYGON_OFFSET_FILL ); mDepthFbo.unbindFramebuffer(); }
/* * @Description: drawing all objects in scene here * @param: none * @return: none */ void Base_ThreeD_ProjectApp::drawTestObjects() { //glColor3f(1.0, 0.2, 0.2); gl::pushMatrices(); glTranslatef(-2.0f, -1.0f, 0.0f); glRotated(90.0f, 1, 0, 0); mTorus.draw(); gl::popMatrices(); //glColor3f(0.4, 1.0, 0.2); gl::pushMatrices(); glTranslatef(0.0f, -1.35f, 0.0f); mBoard.draw(); gl::popMatrices(); //glColor3f(0.8, 0.5, 0.2); gl::pushMatrices(); glTranslatef(0.4f, -0.3f, 0.5f); glScalef(2.0f, 2.0f, 2.0f); mBox.draw(); gl::popMatrices(); //glColor3f(0.3, 0.5, 0.9); gl::pushMatrices(); glTranslatef(0.1f, -0.56f, -1.25f); mSphere.draw(); gl::popMatrices(); }
void ShadowMapSample::draw() { gl::clear(); gl::enableDepthWrite(); glEnable( GL_LIGHTING ); updateShadowMap(); gl::enableDepthRead(); glEnable( GL_TEXTURE_2D ); mDepthFbo.bindDepthTexture(); mShader.bind(); mShader.uniform( "shadowTransMatrix", mLight->getShadowTransformationMatrix( *mCamera ) ); if( mLookThroughCamera ) gl::setMatrices( *mCamera ); else gl::setMatrices( mLight->getShadowCamera() ); mLight->update( *mCamera ); glPushMatrix(); mBackboard.draw(); mTorus.draw(); gl::drawCube( vec3::zero(), vec3( 1, 1, 1 ) ); glPopMatrix(); mShader.unbind(); mDepthFbo.unbindTexture(); // Draw the lighting frustum unless we're looking through it if( mLookThroughCamera ) { glDisable( GL_LIGHTING ); glColor3f( 1.0f, 1.0f, 0.1f ); gl::drawFrustum( mLight->getShadowCamera() ); } if( mDrawDepthMap ) { // there are faster ways to achieve this, but this is a handy way to see the depth map gl::setMatricesWindow( getWindowSize() ); Surface32f shadowMapSurface( mDepthFbo.getDepthTexture() ); ip::hdrNormalize( &shadowMapSurface ); gl::color( Color::white() ); gl::draw( gl::Texture( shadowMapSurface ), Rectf( 0, 0, 128, 128 ) ); } }
void ShadowMapSample::setup() { glPolygonOffset( 1.0f, 1.0f ); glEnable( GL_LIGHTING ); glEnable( GL_DEPTH_TEST ); mPaused = false; mLookThroughCamera = true; mDrawDepthMap = false; mCamera = new CameraPersp( getWindowWidth(), getWindowHeight(), 45.0f ); mCamera->lookAt( vec3( 5, 5, 5 ), vec3( 0, 0, 0 ) ); mCamera->setPerspective( 45.0f, getWindowAspectRatio(), 0.1f, 100.0f ); mLight = new gl::Light( gl::Light::POINT, 0 ); mLight->lookAt( vec3( 1, 5, 1 ), vec3( 0, 0, 0 ) ); mLight->setAmbient( Color( 0.3f, 0.3f, 0.3f ) ); mLight->setDiffuse( Color( 0.5f, 0.5f, 0.5f ) ); mLight->setSpecular( Color( 0.5f, 0.5f, 0.5f ) ); mLight->setShadowParams( 60.0f, 0.5f, 8.0f ); mLight->update( *mCamera ); mLight->enable(); gl::Material torusMaterial; torusMaterial.setSpecular( BLUE ); torusMaterial.setDiffuse( BLUE ); torusMaterial.setAmbient( Color( 0.1f, 0.1f, 0.1f ) ); torusMaterial.setShininess( 25.0f ); gl::Material backboardMaterial; backboardMaterial.setAmbient( RED ); backboardMaterial.setDiffuse( RED ); backboardMaterial.setShininess( 1.0f ); initShadowMap(); mTorus = gl::DisplayList( GL_COMPILE ); mTorus.newList(); gl::drawTorus( 1.0f, 0.3f, 32, 64 ); mTorus.endList(); mTorus.setMaterial( torusMaterial ); mBackboard = gl::DisplayList( GL_COMPILE ); mBackboard.newList(); gl::drawCube( vec3( 0.0f, -2.5f, 0.0f ), vec3( 5.0f, 0.1f, 5.0f ) ); mBackboard.endList(); mBackboard.setMaterial( backboardMaterial ); mShader = gl::GlslProg( loadResource( RES_SHADOWMAP_VERT ), loadResource( RES_SHADOWMAP_FRAG ) ); mShader.bind(); mShader.uniform( "depthTexture", 0 ); }
void RodSoundApp::setup() { // std::cout << solveBEM(constants::radius) << "\n\n"; // std::cout << "Expected:\n" << -constants::pi * constants::radius * constants::radius * Mat2e::Identity() << "\n\n"; // Setup scene cam.setPerspective(40.0, getWindowAspectRatio(), 0.1, 1000.0); cam.lookAt(eyePos, targetPos, Vec3c(0.0, 1.0, 0.0)); // Setup rendering stuff spheredl = new gl::DisplayList(GL_COMPILE); spheredl->newList(); gl::drawSphere(Vec3c::zero(), constants::radius); spheredl->endList(); cylinderdl = new gl::DisplayList(GL_COMPILE); cylinderdl->newList(); gl::drawCylinder(constants::radius, constants::radius, 1.0); cylinderdl->endList(); l = new gl::Light(gl::Light::POINT, 0); try { rodTex = loadImage(loadResource(RES_SIM_YARN_TEX)); } catch (ImageIoException e) { std::cerr << "Error loading textures: " << e.what(); exit(1); } // Load and compile shaders try { diffuseProg = gl::GlslProg(loadResource(RES_SIM_VERT_GLSL), loadResource(RES_SIM_FRAG_GLSL)); rodProg = gl::GlslProg(loadResource(RES_SIM_VERT_TEX_GLSL), loadResource(RES_SIM_FRAG_TEX_GLSL)); } catch (gl::GlslProgCompileExc e) { std::cerr << "Error compiling GLSL program: " << e.what(); exit(1); } catch (ResourceLoadExc e) { std::cerr << "Error loading shaders: " << e.what(); exit(1); } floor.appendVertex(Vec3c(-100.0, 0.0, -100.0)); floor.appendNormal(Vec3c(0.0, 1.0, 0.0)); floor.appendTexCoord(Vec2c(-12.0, -12.0)); floor.appendVertex(Vec3c(100.0, 0.0, -100.0)); floor.appendNormal(Vec3c(0.0, 1.0, 0.0)); floor.appendTexCoord(Vec2c(12.0, -12.0)); floor.appendVertex(Vec3c(100.0, 0.0, 100.0)); floor.appendNormal(Vec3c(0.0, 1.0, 0.0)); floor.appendTexCoord(Vec2c(12.0, 12.0)); floor.appendVertex(Vec3c(-100.0, 0.0, 100.0)); floor.appendNormal(Vec3c(0.0, 1.0, 0.0)); floor.appendTexCoord(Vec2c(-12.0, 12.0)); floor.appendTriangle(0, 1, 2); floor.appendTriangle(0, 3, 2); ci::Surface s(4, 4, false); auto iter = s.getIter(); do { do { Vec2i pos = iter.getPos(); unsigned char val = pos.x > 0 && pos.x < 3 && pos.y > 0 && pos.y < 3 ? 100 : 150; iter.r() = iter.g() = iter.b() = val; } while (iter.pixel()); } while (iter.line()); floorTex = gl::Texture(s); floorTex.setMagFilter(GL_NEAREST); floorTex.setWrap(GL_REPEAT, GL_REPEAT); // Load the rod loadDefaultRod(50); // loadRodFile(""); loadStdEnergies(); PROFILER_START("Total"); }
void RodSoundApp::draw() { while (running && // app::getElapsedSeconds() - tAtLastDraw < 1.0/app::getFrameRate() && fe.nextTimestep(c) > 1.0 / (real) SampleRate) { update(); } tAtLastDraw = app::getElapsedSeconds(); PROFILER_START("Draw"); // Clear out the window with grey gl::clear(Color(0.45, 0.45, 0.5)); // Enable alpha blending and depth testing gl::enableAlphaBlending(); gl::enableDepthRead(true); gl::enableDepthWrite(true); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Draw framerate counter gl::setMatricesWindow(getWindowSize()); std::stringstream ss; ss << getAverageFps(); gl::drawStringRight(ss.str(), Vec2c(getWindowWidth()-toPixels(10), getWindowHeight()-toPixels(20)), Color(0.0, 0.0, 0.0), Font("Arial", toPixels(12))); // Set projection/modelview matrices gl::setMatrices(cam); // Draw the rod and the normal of the bishop frame for(int i=0; i<r->numEdges(); i++) { Vec3c p0 = EtoC(r->cur().POS(i)); Vec3c p1 = EtoC(r->cur().POS(i+1)); gl::drawLine(p0, p1); gl::color(1.0, 1.0, 0.0); gl::lineWidth(1.0); Vec3c u = EtoC(r->cur().u[i]); gl::drawLine((p0+p1)/2.0, (p0+p1)/2.0+u*(p1-p0).length()*2.0); } m.apply(); l->setDiffuse(Color::white()); l->setAmbient(Color::white()); l->setPosition(Vec3c(0.0, 50.0, 0.0)); l->enable(); diffuseProg.bind(); for (int i=0; i<r->numCPs(); i++) { gl::pushModelView(); gl::translate(EtoC(r->cur().POS(i))); spheredl->draw(); gl::popModelView(); } diffuseProg.unbind(); rodProg.bind(); floorTex.enableAndBind(); gl::draw(floor); floorTex.disable(); rodProg.unbind(); // Draw rod edges rodProg.bind(); rodTex.enableAndBind(); for (int i=0; i<r->numEdges(); i++) { gl::pushModelView(); Vec3c v = EtoC(r->cur().edge(i).normalized()); gl::translate(EtoC(r->cur().POS(i))); Quaternion<real> q(Vec3c(0.0, 1.0, 0.0), v); real angle = acos(std::max((real)-1.0, std::min((real)1.0, (q*Vec3c(-1.0, 0.0, 0.0)).dot(EtoC(r->cur().u[i]))))); if ((q*Vec3c(-1.0, 0.0, 0.0)).dot(EtoC(r->cur().v(i))) > 0.0) angle = -angle; gl::rotate(Quaternion<real>(v, angle)); gl::rotate(q); gl::rotate(Vec3c(0.0, r->cur().rot(i)*180.0/constants::pi, 0.0)); gl::scale(1.0, r->cur().edgeLength(i), 1.0); cylinderdl->draw(); gl::popModelView(); } rodTex.unbind(); rodProg.unbind(); for (RodEnergy* e : energies) { e->draw(c.timestep()); } integrator->draw(); fe.record(c); PROFILER_STOP("Draw"); }
void ShadowMapSample::update() { if( ! mPaused ) mTorus.getModelMatrix().rotate( vec3( 1.0f, 1.0f, 1.0f ).normalized(), 0.05f ); }
/* * @Description: setup function ( more aesthetic as could be in constructor here ) * @param: none * @return: none */ void Base_ThreeD_ProjectApp::setup() { RENDER_MODE = 3; glEnable( GL_LIGHTING ); glEnable( GL_DEPTH_TEST ); glEnable(GL_RESCALE_NORMAL); //important if things are being scaled as OpenGL also scales normals ( for proper lighting they need to be normalized ) mParams = params::InterfaceGl( "3D_Scene_Base", Vec2i( 225, 125 ) ); mParams.addParam( "Framerate", &mCurrFramerate, "", true ); mParams.addParam( "Eye Distance", &mCameraDistance, "min=-100.0 max=-5.0 step=1.0 keyIncr== keyDecr=-"); mParams.addParam( "Lighting On", &mLightingOn, "key=l"); mParams.addParam( "Show/Hide Params", &mShowParams, "key=x"); mParams.addSeparator(); mCurrFramerate = 0.0f; mLightingOn = true; mViewFromLight = false; mShowParams = true; //create camera mCameraDistance = CAM_POSITION_INIT.z; mEye = Vec3f(CAM_POSITION_INIT.x, CAM_POSITION_INIT.y, CAM_POSITION_INIT.z); mCenter = Vec3f::zero(); mUp = Vec3f::yAxis(); mCam = new CameraPersp( getWindowWidth(), getWindowHeight(), 180.0f ); mCam->lookAt(mEye, mCenter, mUp); mCam->setPerspective( 45.0f, getWindowAspectRatio(), 1.0f, 50.0f ); gl::setMatrices( *mCam ); //create light mLight = new gl::Light( gl::Light::DIRECTIONAL, 0 ); mLight->lookAt( Vec3f(LIGHT_POSITION_INIT.x, LIGHT_POSITION_INIT.y * -1, LIGHT_POSITION_INIT.z), Vec3f( 0, 0, 0 ) ); mLight->setAmbient( Color( 1.0f, 1.0f, 1.0f ) ); mLight->setDiffuse( Color( 1.0f, 1.0f, 1.0f ) ); mLight->setSpecular( Color( 1.0f, 1.0f, 1.0f ) ); mLight->setShadowParams( 100.0f, 1.0f, 20.0f ); mLight->update( *mCam ); mLight->enable(); //create light ref mLightRef = new gl::Light( gl::Light::DIRECTIONAL, 0 ); mLightRef->lookAt( LIGHT_POSITION_INIT, Vec3f( 0, 0, 0 ) ); mLightRef->setShadowParams( 100.0f, 1.0f, 20.0f ); //DEBUG Test objects ci::ColorA pink( CM_RGB, 0.84f, 0.49f, 0.50f, 1.0f ); ci::ColorA green( CM_RGB, 0.39f, 0.78f, 0.64f, 1.0f ); ci::ColorA blue( CM_RGB, 0.32f, 0.59f, 0.81f, 1.0f ); ci::ColorA orange( CM_RGB, 0.77f, 0.35f, 0.35f, 1.0f ); gl::Material torusMaterial; torusMaterial.setSpecular( ColorA( 1.0, 1.0, 1.0, 1.0 ) ); torusMaterial.setDiffuse( pink ); torusMaterial.setAmbient( ColorA( 0.3, 0.3, 0.3, 1.0 ) ); torusMaterial.setShininess( 25.0f ); gl::Material boardMaterial; boardMaterial.setSpecular( ColorA( 0.0, 0.0, 0.0, 0.0 ) ); boardMaterial.setAmbient( ColorA( 0.3, 0.3, 0.3, 1.0 ) ); boardMaterial.setDiffuse( green ); boardMaterial.setShininess( 0.0f ); gl::Material boxMaterial; boxMaterial.setSpecular( ColorA( 0.0, 0.0, 0.0, 0.0 ) ); boxMaterial.setAmbient( ColorA( 0.3, 0.3, 0.3, 1.0 ) ); boxMaterial.setDiffuse( blue ); boxMaterial.setShininess( 0.0f ); gl::Material sphereMaterial; sphereMaterial.setSpecular( ColorA( 1.0, 1.0, 1.0, 1.0 ) ); sphereMaterial.setAmbient( ColorA( 0.3, 0.3, 0.3, 1.0 ) ); sphereMaterial.setDiffuse( orange ) ; sphereMaterial.setShininess( 35.0f ); //using DisplayLists for simplicity but highly recommend to use VBO's for serious work ( as DisplayLists will be deprecated soon ... and speed difference in now negligible ) mTorus = gl::DisplayList( GL_COMPILE ); mTorus.newList(); gl::drawTorus( 1.0f, 0.3f, 32, 64 ); mTorus.endList(); mTorus.setMaterial( torusMaterial ); mBoard = gl::DisplayList( GL_COMPILE ); mBoard.newList(); gl::drawCube( Vec3f( 0.0f, 0.0f, 0.0f ), Vec3f( 10.0f, 0.1f, 10.0f ) ); mBoard.endList(); mBoard.setMaterial( boardMaterial ); mBox = gl::DisplayList( GL_COMPILE ); mBox.newList(); gl::drawCube( Vec3f( 0.0f, 0.0f, 0.0f ), Vec3f( 1.0f, 1.0f, 1.0f ) ); mBox.endList(); mBox.setMaterial( boxMaterial ); mSphere = gl::DisplayList( GL_COMPILE ); mSphere.newList(); gl::drawSphere( Vec3f::zero(), 0.8f, 30 ); mSphere.endList(); mSphere.setMaterial( sphereMaterial ); //noise texture required for SSAO calculations mRandomNoise = gl::Texture( loadImage( loadResource( NOISE_SAMPLER ) ) ); initFBOs(); initShaders(); }