void DemoApp::render() { keyHandler(); GameEngine::update(); h3dutDumpMessages(); }
bool Application::init() { // Initialize engine and open default sound device if( !h3dInit() || !h3dOpenDevice( 0x0 ) ) { h3dutDumpMessages(); return false; } // Set options h3dSetOption( H3DOptions::LoadTextures, 1 ); h3dSetOption( H3DOptions::TexCompression, 0 ); h3dSetOption( H3DOptions::FastAnimation, 0 ); h3dSetOption( H3DOptions::MaxAnisotropy, 4 ); h3dSetOption( H3DOptions::ShadowMapSize, 2048 ); // Add resources // Pipelines _hdrPipeRes = h3dAddResource( H3DResTypes::Pipeline, "pipelines/hdr.pipeline.xml", 0 ); _forwardPipeRes = h3dAddResource( H3DResTypes::Pipeline, "pipelines/forward.pipeline.xml", 0 ); // Overlays _fontMatRes = h3dAddResource( H3DResTypes::Material, "overlays/font.material.xml", 0 ); _panelMatRes = h3dAddResource( H3DResTypes::Material, "overlays/panel.material.xml", 0 ); _logoMatRes = h3dAddResource( H3DResTypes::Material, "overlays/logo.material.xml", 0 ); // Environment H3DRes floorRes = h3dAddResource( H3DResTypes::SceneGraph, "models/tiles/tiles.scene.xml", 0 ); // Knight H3DRes speakerRes = h3dAddResource( H3DResTypes::SceneGraph, "models/speaker/speaker.scene.xml", 0 ); // Music _soundRes = h3dAddResource( RST_SoundResource, "sounds/stringed_disco.ogg", 0 ); // Load resources h3dutLoadResourcesFromDisk( _contentDir.c_str() ); // Add scene nodes // Add camera _cam = h3dAddCameraNode( H3DRootNode, "Camera", _hdrPipeRes ); //h3dSetNodeParamI( _cam, CameraNodeParams::OcclusionCulling, 1 ); // Add listener to the camera H3DNode listener = h3dAddListenerNode( _cam, "Listener" ); h3dSetActiveListener( listener ); // Add floor H3DNode floor = h3dAddNodes( H3DRootNode, floorRes ); h3dSetNodeTransform( floor, 0, -0.125, 0, 0, 0, 0, 1, 1, 1 ); // Add the speakers H3DNode speaker1 = h3dAddNodes( H3DRootNode, speakerRes ); h3dSetNodeTransform( speaker1, -2, 0, -2, 0, 215.0f, 0, 1, 1, 1 ); H3DNode speaker2 = h3dAddNodes( H3DRootNode, speakerRes ); h3dSetNodeTransform( speaker2, 2, 0, -2, 0, 145.0f, 0, 1, 1, 1 ); // Add music to the speakers _sound1 = h3dAddSoundNode( speaker1, "Sound1", _soundRes ); _sound2 = h3dAddSoundNode( speaker2, "Sound2", _soundRes ); // Add light source _light = h3dAddLightNode( H3DRootNode, "Light1", 0, "LIGHTING", "SHADOWMAP" ); h3dSetNodeTransform( _light, 0, 7, 0, -90, 0, 0, 1, 1, 1 ); h3dSetNodeParamF( _light, H3DLight::RadiusF, 0, 30 ); h3dSetNodeParamF( _light, H3DLight::FovF, 0, 90 ); h3dSetNodeParamI( _light, H3DLight::ShadowMapCountI, 1 ); h3dSetNodeParamF( _light, H3DLight::ShadowMapBiasF, 0, 0.01f ); // Set the distance model h3dSetDistanceModel( _distanceModel ); // Set the timer so the light immediately gets a random color _lightTimer = 1.0f; // Customize post processing effects H3DRes matRes = h3dFindResource( H3DResTypes::Material, "pipelines/postHDR.material.xml" ); // hdrParams: exposure, brightpass threshold, brightpass offset (see shader for description) h3dSetMaterialUniform( matRes, "hdrParams", 2.0f, 0.6f, 0.08f, 0 ); // Play the music h3dPlaySound( _sound1 ); h3dPlaySound( _sound2 ); return true; }
void Application::mainLoop( float timeSinceLastFrame ) { keyHandler( timeSinceLastFrame ); // Set camera parameters h3dSetNodeTransform( _cam, _x, _y, _z, _rx ,_ry, 0, 1, 1, 1 ); _lightTimer += timeSinceLastFrame; // Has it gone a second since the light changed color? if( _lightTimer >= 1.0f ) { // Set a random light color switch( rand() % 6 ) { case 0: // Red h3dSetNodeParamF( _light, H3DLight::ColorF3, 0, 1.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 1, 0.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 2, 0.0f ); break; case 1: // Green h3dSetNodeParamF( _light, H3DLight::ColorF3, 0, 0.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 1, 1.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 2, 0.0f ); break; case 2: // Blue h3dSetNodeParamF( _light, H3DLight::ColorF3, 0, 0.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 1, 0.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 2, 1.0f ); break; case 3: // Yellow h3dSetNodeParamF( _light, H3DLight::ColorF3, 0, 1.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 1, 1.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 2, 0.0f ); break; case 4: // Purple h3dSetNodeParamF( _light, H3DLight::ColorF3, 0, 1.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 1, 0.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 2, 1.0f ); break; case 5: // Cyan h3dSetNodeParamF( _light, H3DLight::ColorF3, 0, 0.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 1, 1.0f ); h3dSetNodeParamF( _light, H3DLight::ColorF3, 2, 1.0f ); break; } // Reset the timer _lightTimer = 0.0f; } // Show stats h3dutShowFrameStats( _fontMatRes, _panelMatRes, _statMode ); if( _statMode > 0 ) { displaySoundInfo(); } // Show logo const float ww = (float)h3dGetNodeParamI( _cam, H3DCamera::ViewportWidthI ) / (float)h3dGetNodeParamI( _cam, H3DCamera::ViewportHeightI ); const float ovLogo[] = { ww-0.4f, 0.8f, 0, 1, ww-0.4f, 1, 0, 0, ww, 1, 1, 0, ww, 0.8f, 1, 1 }; h3dShowOverlays( ovLogo, 4, 1.f, 1.f, 1.f, 1.f, _logoMatRes, 0 ); // Render scene h3dRender( _cam ); // Finish rendering of frame h3dFinalizeFrame(); // Remove all overlays h3dClearOverlays(); // Write all mesages to log file h3dutDumpMessages(); }
void TentacleApplication::mainLoop( float fps ) { _curFPS = fps; _timer += 1 / fps; keyHandler(); h3dSetOption( H3DOptions::DebugViewMode, _debugViewMode ? 1.0f : 0.0f ); h3dSetOption( H3DOptions::WireframeMode, _wireframeMode ? 1.0f : 0.0f ); if( !_freeze ) { float tx,ty,tz,foo; h3dGetNodeTransform(_fly,&tx,&ty,&tz,&foo,&foo,&foo,&foo,&foo,&foo); if (!_freezeFly) { // routhly simulates the random fly of a fly if((rand() % 100)>95) { _dx = ((ranf()))/50.0f; _dy = ((ranf()))/50.0f; _dz = ((ranf()))/50.0f; } // change fly position h3dSetNodeTransform( _fly, tx+_dx, ty+_dy, tz+_dz, 0, 0, 0, 0.2f, 0.2f, 0.2f ); if (tx < -4.0) _dx = 0.05f; if (tx > 4.0) _dx = -0.05f; if (ty < 0.0) _dy = 0.05f; if (ty > 6.0) _dy = -0.05f; if (tz < -4.0) _dz = 0.05f; if (tz > 4.0) _dz = -0.05f; h3dGetNodeTransform(_fly,&tx,&ty,&tz,&foo,&foo,&foo,&foo,&foo,&foo); //update constraint position according to fly position _ikConstraint->setPosition(SMRVector3(tx, ty, tz)); } if (!_freezeIK || _ikStep) { //Compute inverse kinematics _currentSolver->process(); // update tentacle's joint (IK) updateTentacle(); _ikStep = false; } } // Set camera parameters h3dSetNodeTransform( _cam, _x, _y, _z, _rx ,_ry, 0, 1, 1, 1 ); if( _showFPS ) { // Avoid updating FPS text every frame to make it readable if( _timer > 0.3f ) { _fpsText.str( "" ); _fpsText << "FPS: " << fixed << setprecision( 2 ) << _curFPS; _timer = 0; } // Show text //h3dutShowText( _fpsText.str().c_str(), 0, 0.95f, 0.03f, 0, _fontMatRes ); } // Show title //h3dutShowText( "Comparing Standard IK algorithms.", 0.0f, 0.90f, 0.03f, 0, _fontMatRes ); // Show IK method //h3dutShowText( _ikMethodString, 0.6f, 0.80f, 0.03f, 0, _fontMatRes ); // Show logo //h3dShowOverlay( 0.7f, 0.2, 0, 0, // 1, 0.2, 1, 0, // 1, 0.6f, 1, 1, // 0.7f, 0.6f, 0, 1, // 7, _invJacMatRes ); // Render scene h3dRender( _cam ); // Remove all overlays h3dClearOverlays(); // Write all mesages to log file h3dutDumpMessages(); }
bool TentacleApplication::init() { // Initialize engine if( !h3dInit() ) { h3dutDumpMessages(); return false; } // Set options h3dSetOption( H3DOptions::LoadTextures, 1 ); h3dSetOption( H3DOptions::TexCompression, 0 ); h3dSetOption( H3DOptions::MaxAnisotropy, 4 ); h3dSetOption( H3DOptions::ShadowMapSize, 2048 ); h3dSetOption( H3DOptions::FastAnimation, 1 ); // Add resources // Pipelines _hdrPipeRes = h3dAddResource( H3DResTypes::Pipeline, "pipelines/hdr.pipeline.xml", 0 ); _forwardPipeRes = h3dAddResource( H3DResTypes::Pipeline, "pipelines/forward.pipeline.xml", 0 ); // Font _fontMatRes = h3dAddResource( H3DResTypes::Material, "overlays/font.material.xml", 0 ); // Logo _logoMatRes = h3dAddResource( H3DResTypes::Material, "overlays/logo.material.xml", 0 ); // invJacXpl //_invJacMatRes = h3dAddResource( H3DResTypes::Material, "materials/invJac.material.xml", 0 ); // Environment H3DRes envRes = h3dAddResource( H3DResTypes::SceneGraph, "models/sphere/sphere.scene.xml", 0 ); // Tentacle H3DRes tentacleRes = h3dAddResource( H3DResTypes::SceneGraph, "models/tentacle.scene.xml", 0 ); // Fly H3DRes flyRes = h3dAddResource( H3DResTypes::SceneGraph, "models/fly.scene.xml", 0 ); _dx = _dy = _dz = 0; // Load resources h3dutLoadResourcesFromDisk( _contentDir.c_str() ); // Add scene nodes // Add camera _cam = h3dAddCameraNode( H3DRootNode, "Camera", _forwardPipeRes ); // Add environment H3DNode env = h3dAddNodes( H3DRootNode, envRes ); h3dSetNodeTransform( env, 0, -20, 0, 0, 0, 0, 20, 20, 20 ); // Add tentacle node _tentacle = h3dAddNodes( H3DRootNode, tentacleRes ); h3dSetNodeTransform( _tentacle, 0, 0, 0, 0, 0, 0.0, 1.0f, 1.0f, 1.0f ); // Create tentacle kinematic chain _tentacleIK = setUpKinematikChain(_tentacle); //cout << _tentacleIK->getEndPosition(_tentacleIK->getNumJoints()-1); //_ikCCDSolver = new SmrCCDSolver(_tentacleIK); //_ikCCDSolver->addConstraintPtr(_ikConstraint); _ikGSMMSolver = new SMRGSMMSolver(_tentacleIK); _ikGSMMSolver->addConstraintPtr(_ikConstraint); _ikInvJacSolver = new SMRInvJacSolver(_tentacleIK); _ikInvJacSolver->addConstraintPtr(_ikConstraint); //delete(_tentacleIK); _currentSolver = _ikInvJacSolver; _ikMethodString = "J pseudo-inverse"; // Add fly node _fly = h3dAddNodes( H3DRootNode, flyRes ); h3dSetNodeTransform( _fly, 0, 4, 0, 0, 0, 0, 0.2f, 0.2f, 0.2f ); // Add light source H3DNode light = h3dAddLightNode( H3DRootNode, "Light1", 0, "LIGHTING", "SHADOWMAP" ); h3dSetNodeTransform( light, 0, 15, 10, -60, 0, 0, 1, 1, 1 ); h3dSetNodeParamF( light, H3DLight::RadiusF,0, 30 ); h3dSetNodeParamF( light, H3DLight::FovF,0, 90 ); h3dSetNodeParamI( light, H3DLight::ShadowMapCountI, 0 ); h3dSetNodeParamF( light, H3DLight::ShadowMapBiasF,0, 0.01f ); h3dSetNodeParamF( light, H3DLight::ColorF3,0, 1.0f ); h3dSetNodeParamF( light, H3DLight::ColorF3,1, 0.8f ); h3dSetNodeParamF( light, H3DLight::ColorF3,2, 0.7f ); // Customize post processing effects H3DNode matRes = h3dFindResource( H3DResTypes::Material, "pipelines/postHDR.material.xml" ); //hdrParams: exposure, brightpass threshold, brightpass offset (see shader for description) h3dSetMaterialUniform( matRes, "hdrParams", 2.5f, 0.5f, 0.08f, 0 ); return true; }