void labscale::CreateTiltBoxExperiment() /* Tilt the box back and forth to smooth regolith layer*/ { // Put a box on the floor if (gRun.loadSceneFromFile.empty()) CreateRegolithContainer(); else { if(!LoadSceneFromFile(gRun.loadSceneFromFile)) ncc__error("Failed to load partially filed box.\a\n"); PxActor* theBox = FindNamedActor("the_box"); if (theBox) { ColorActor(theBox,ncc::rgb::rRed); labscale::VIPs.container = theBox->isRigidDynamic(); } } // Adjust camera, grid, display gCamera.pos.x = 0.0; gCamera.pos.y = labscale::reg_box.fillHeight*1.4; gCamera.pos.z = labscale::reg_box.diameter*1.6; gDebug.bXYGridOn = true; // Start the action, tilt action handled in control function labscale::reg_box.bTilt = false; gSim.isRunning=true; gSim.bPause=false; gSim.codeTime = 0.0f; RefreshHUD(); }
void labscale::CreateFillBoxExperiment() /* Put a box on the ground ready to be filled with regolith.*/ { // Put a box on the floor if (gRun.loadSceneFromFile.empty()) CreateRegolithContainer(); else { if(!LoadSceneFromFile(gRun.loadSceneFromFile)) ncc__error("Failed to load partially filed box.\a\n"); PxActor* theBox = FindNamedActor("the_box"); if (theBox) { ColorActor(theBox,ncc::rgb::rRed); labscale::VIPs.container = theBox->isRigidDynamic(); } } // Adjust camera, grid, display gCamera.pos.x = 0.0; gCamera.pos.y = labscale::reg_box.fillHeight*1.4; gCamera.pos.z = labscale::reg_box.diameter*1.6; gDebug.bXYGridOn = true; // Start the action, regolith poured in runtime gSim.isRunning=true; gSim.bPause=false; gSim.codeTime = 0.0f; RefreshHUD(); }
void C_SceneEntity::PostDataUpdate( DataUpdateType_t updateType ) { BaseClass::PostDataUpdate( updateType ); char const *str = GetSceneFileName(); if ( updateType == DATA_UPDATE_CREATED ) { Assert( str && str[ 0 ] ); if ( str && str[ 0 ] ) { LoadSceneFromFile( str ); // Kill everything except flex events Assert( m_pScene ); if ( m_pScene ) { int types[ 2 ]; types[ 0 ] = CChoreoEvent::FLEXANIMATION; types[ 1 ] = CChoreoEvent::EXPRESSION; m_pScene->RemoveEventsExceptTypes( types, 2 ); } SetNextClientThink( CLIENT_THINK_ALWAYS ); } } // Playback state changed... if ( m_bWasPlaying != m_bIsPlayingBack ) { for(int i = 0; i < m_hActorList.Count() ; ++i ) { C_BaseFlex *actor = m_hActorList[ i ].Get(); if ( !actor ) continue; Assert( m_pScene ); if ( m_pScene ) { ClearSceneEvents( m_pScene, false ); if ( m_bIsPlayingBack ) { m_pScene->ResetSimulation(); actor->StartChoreoScene( m_pScene ); } else { m_pScene->ResetSimulation(); actor->RemoveChoreoScene( m_pScene ); } } } } }
void C_SceneEntity::PostDataUpdate( DataUpdateType_t updateType ) { BaseClass::PostDataUpdate( updateType ); char const *str = GetSceneFileName(); char szFilename[MAX_PATH]; if ( str ) { Assert( V_strlen( str ) < MAX_PATH ); V_strcpy( szFilename, str ); } else { szFilename[0] = '\0'; } char szSceneHWM[MAX_PATH]; if ( GetHWMorphSceneFileName( szFilename, szSceneHWM ) ) { V_strcpy( szFilename, szSceneHWM ); } if ( updateType == DATA_UPDATE_CREATED ) { Assert( szFilename && szFilename[ 0 ] ); if ( szFilename && szFilename[ 0 ] ) { LoadSceneFromFile( szFilename ); // Kill everything except flex events Assert( m_pScene ); // Should handle gestures and sequences clientside. if ( m_bMultiplayer ) { if ( m_pScene ) { int types[6]; types[0] = CChoreoEvent::FLEXANIMATION; types[1] = CChoreoEvent::EXPRESSION; types[2] = CChoreoEvent::GESTURE; types[3] = CChoreoEvent::SEQUENCE; types[4] = CChoreoEvent::SPEAK; types[5] = CChoreoEvent::LOOP; m_pScene->RemoveEventsExceptTypes( types, 6 ); } PrefetchAnimBlocks( m_pScene ); } else { if ( m_pScene ) { int types[ 2 ]; types[ 0 ] = CChoreoEvent::FLEXANIMATION; types[ 1 ] = CChoreoEvent::EXPRESSION; m_pScene->RemoveEventsExceptTypes( types, 2 ); } } SetNextClientThink( CLIENT_THINK_ALWAYS ); } } // Playback state changed... if ( m_bWasPlaying != m_bIsPlayingBack ) { for(int i = 0; i < m_hActorList.Count() ; ++i ) { C_BaseFlex *actor = m_hActorList[ i ].Get(); if ( !actor ) continue; Assert( m_pScene ); if ( m_pScene ) { ClearSceneEvents( m_pScene, false ); if ( m_bIsPlayingBack ) { m_pScene->ResetSimulation(); actor->StartChoreoScene( m_pScene ); } else { m_pScene->ResetSimulation(); actor->RemoveChoreoScene( m_pScene ); } } } } }
//----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_SceneEntity::SetupClientOnlyScene( const char *pszFilename, C_BaseFlex *pOwner /* = NULL */, bool bMultiplayer /* = false */ ) { m_bIsPlayingBack = true; m_bMultiplayer = bMultiplayer; m_hOwner = pOwner; m_bClientOnly = true; char szFilename[128]; Assert( V_strlen( pszFilename ) < 128 ); V_strcpy( szFilename, pszFilename ); char szSceneHWM[128]; if ( GetHWMorphSceneFileName( szFilename, szSceneHWM ) ) { V_strcpy( szFilename, szSceneHWM ); } Assert( szFilename && szFilename[ 0 ] ); if ( szFilename && szFilename[ 0 ] ) { LoadSceneFromFile( szFilename ); if (!CommandLine()->FindParm("-hushasserts")) { Assert( m_pScene ); } // Should handle gestures and sequences client side. if ( m_bMultiplayer ) { if ( m_pScene ) { int types[6]; types[0] = CChoreoEvent::FLEXANIMATION; types[1] = CChoreoEvent::EXPRESSION; types[2] = CChoreoEvent::GESTURE; types[3] = CChoreoEvent::SEQUENCE; types[4] = CChoreoEvent::SPEAK; types[5] = CChoreoEvent::LOOP; m_pScene->RemoveEventsExceptTypes( types, 6 ); } PrefetchAnimBlocks( m_pScene ); } else { if ( m_pScene ) { int types[ 2 ]; types[ 0 ] = CChoreoEvent::FLEXANIMATION; types[ 1 ] = CChoreoEvent::EXPRESSION; m_pScene->RemoveEventsExceptTypes( types, 2 ); } } SetNextClientThink( CLIENT_THINK_ALWAYS ); } if ( m_hOwner.Get() ) { if (!CommandLine()->FindParm("-hushasserts")) { Assert( m_pScene ); } if ( m_pScene ) { ClearSceneEvents( m_pScene, false ); if ( m_bIsPlayingBack ) { m_pScene->ResetSimulation(); m_hOwner->StartChoreoScene( m_pScene ); } else { m_pScene->ResetSimulation(); m_hOwner->RemoveChoreoScene( m_pScene ); } // Reset the flex weights when we start a new scene. This is normally done on the player model, but since // we don't have a player here yet - we need to do this! ResetActorFlexesForScene(); } } else { for( int i = 0; i < m_hActorList.Count() ; ++i ) { C_BaseFlex *actor = m_hActorList[ i ].Get(); if ( !actor ) continue; Assert( m_pScene ); if ( m_pScene ) { ClearSceneEvents( m_pScene, false ); if ( m_bIsPlayingBack ) { m_pScene->ResetSimulation(); actor->StartChoreoScene( m_pScene ); } else { m_pScene->ResetSimulation(); actor->RemoveChoreoScene( m_pScene ); } } } } }
// Project namespace functions void labscale::CreatePenetratorExperiment() /* Throw a steel ball at glass regolith; measure penetration depth.*/ { // Load pre-settled regolith or create empty container if (gRun.loadSceneFromFile.empty()) labscale::CreateRegolithContainer(); else { if(!LoadSceneFromFile(gRun.loadSceneFromFile)) ncc__error("Failed to load partially filed box.\a\n"); PxActor* theBox = FindNamedActor("the_box"); if (theBox) { ColorActor(theBox, ncc::rgb::rRed); labscale::VIPs.container = theBox->isRigidDynamic(); } } // Create impactor material (steel, for now) PxMaterial* steel = gPhysX.mPhysics->createMaterial(0.5, 0.5, 0.5); if (!steel) ncc__error("\aPxPhysics::createMaterial() failed!"); PxReal rho = labscale::impactor.materialDensity; // Ready, aim impactor (will fire manually) PxReal radius = labscale::impactor.diameter/2; labscale::impactor.iniSurface = getRegolithSurface(); // target surface in global frame PxReal hLaunch = labscale::impactor.iniSurface + 4*radius; labscale::VIPs.ball1 = CreateRubbleGrain(PxVec3(0,hLaunch,0),eSPHERE_GRAIN,radius,*steel,rho); labscale::VIPs.ball1->setName("impactor"); labscale::VIPs.ball1->setRigidDynamicFlag(PxRigidDynamicFlag::eKINEMATIC, true); ColorActor(labscale::VIPs.ball1, ncc::rgb::gDarkOlive); // Adjust camera, grid, display gCamera.pos.x = 0.0; gCamera.pos.y = labscale::reg_box.fillHeight*1.4; gCamera.pos.z = labscale::reg_box.diameter*1.6; gDebug.bXYGridOn = true; // Start a log if (gRun.outputFrequency) { ostringstream header; header << "# This is the run log of " << gRun.baseName << endl; header << "# Experiment type: HOLSAPPLE1 (" << labscale::eExperimentType << ")" << endl; header << "# Time step used = " << gSim.timeStep << endl; header << "# Top of regolith surface = " << labscale::impactor.iniSurface << endl; header << "# Impactor launch speed = " << labscale::impactor.speed << endl; header << "# Columns are (values in code units, d is penetration depth):" << endl; header << "# [t] [v_y] [d] [x] [y] [z]" << endl; ofstream fbuf(gRun.outFile.c_str(),ios::trunc); if (!fbuf.is_open()) ncc__error("Could not start a log. Experiment aborted.\a\n"); fbuf << header.str() << endl; } // Start the action gSim.isRunning=true; gSim.bPause=false; gSim.codeTime = 0.0f; RefreshHUD(); }
LevelMine::LevelMine(unique_ptr<Game> & game, const unique_ptr<PlayerTransfer> & playerTransfer) : Level(game, playerTransfer) { mName = LevelName::Mine; LoadLocalization("mine.loc"); mPlayer->mYaw.SetTarget(180.0f); LoadSceneFromFile("data/maps/mine.scene"); mPlayer->SetPosition(GetUniqueObject("PlayerPosition")->GetPosition()); Vector3 placePos = GetUniqueObject("PlayerPosition")->GetPosition(); Vector3 playerPos = mPlayer->GetCurrentPosition(); mPlayer->GetHUD()->SetObjective(mLocalization.GetString("objective1")); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note1")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note1Desc"), mLocalization.GetString("note1")); }); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note2")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note2Desc"), mLocalization.GetString("note2")); }); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note3")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note3Desc"), mLocalization.GetString("note3")); }); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note4")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note4Desc"), mLocalization.GetString("note4")); }); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note5")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note5Desc"), mLocalization.GetString("note5")); }); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note6")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note6Desc"), mLocalization.GetString("note6")); }); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note7")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note7Desc"), mLocalization.GetString("note7")); }); AddInteractiveObject("Note", make_shared<InteractiveObject>(GetUniqueObject("Note8")), [this] { mPlayer->GetInventory()->AddReadedNote(mLocalization.GetString("note8Desc"), mLocalization.GetString("note8")); }); mStoneFallZone = GetUniqueObject("StoneFallZone"); mNewLevelZone = GetUniqueObject("NewLevel"); auto soundSystem = mGame->GetEngine()->GetSoundSystem(); soundSystem->SetReverbPreset(ReverbPreset::Cave); AddSound(mMusic = soundSystem->LoadMusic("data/music/chapter2.ogg")); mConcreteWall = GetUniqueObject("ConcreteWall"); mDeathZone = GetUniqueObject("DeadZone"); mDetonator = GetUniqueObject("Detonator"); AddSound(mAlertSound = soundSystem->LoadSound3D("data/sounds/alert.ogg")); mAlertSound->Attach(mDetonator); AddSound(mExplosionSound = soundSystem->LoadSound3D("data/sounds/blast.ogg")); mExplosionSound->SetReferenceDistance(10); mDetonatorActivated = 0; mExplosionFlashAnimator = 0; // Create detonator places AddItemPlace(mDetonatorPlace[0] = make_shared<ItemPlace>(GetUniqueObject("DetonatorPlace1"), Item::Type::Explosives)); AddItemPlace(mDetonatorPlace[1] = make_shared<ItemPlace>(GetUniqueObject("DetonatorPlace2"), Item::Type::Explosives)); AddItemPlace(mDetonatorPlace[2] = make_shared<ItemPlace>(GetUniqueObject("DetonatorPlace3"), Item::Type::Explosives)); AddItemPlace(mDetonatorPlace[3] = make_shared<ItemPlace>(GetUniqueObject("DetonatorPlace4"), Item::Type::Explosives)); mWireModels[0] = GetUniqueObject("WireModel1"); mWireModels[1] = GetUniqueObject("WireModel2"); mWireModels[2] = GetUniqueObject("WireModel3"); mWireModels[3] = GetUniqueObject("WireModel4"); mDetonatorModels[0] = GetUniqueObject("DetonatorModel1"); mDetonatorModels[1] = GetUniqueObject("DetonatorModel2"); mDetonatorModels[2] = GetUniqueObject("DetonatorModel3"); mDetonatorModels[3] = GetUniqueObject("DetonatorModel4"); mExplosivesModels[0] = GetUniqueObject("ExplosivesModel1"); mExplosivesModels[1] = GetUniqueObject("ExplosivesModel2"); mExplosivesModels[2] = GetUniqueObject("ExplosivesModel3"); mExplosivesModels[3] = GetUniqueObject("ExplosivesModel4"); mFindItemsZone = GetUniqueObject("FindItemsZone"); AddAmbientSound(soundSystem->LoadSound3D("data/sounds/ambient/mine/ambientmine1.ogg")); AddAmbientSound(soundSystem->LoadSound3D("data/sounds/ambient/mine/ambientmine2.ogg")); AddAmbientSound(soundSystem->LoadSound3D("data/sounds/ambient/mine/ambientmine3.ogg")); AddAmbientSound(soundSystem->LoadSound3D("data/sounds/ambient/mine/ambientmine4.ogg")); AddAmbientSound(soundSystem->LoadSound3D("data/sounds/ambient/mine/ambientmine5.ogg")); mExplosionTimer = ITimer::Create(); mBeepSoundTimer = ITimer::Create(); mBeepSoundTiming = 1.0f; CreateItems(); mReadyExplosivesCount = 0; MakeLadder("LadderBegin", "LadderEnd", "LadderEnter", "LadderBeginLeavePoint", "LadderEndLeavePoint"); MakeDoor("Door1", 90); MakeDoor("Door3", 90); MakeDoor("DoorToAdministration", 90); MakeDoor("Door6", 90); MakeDoor("DoorToDirectorsOffice", 90); MakeDoor("DoorToResearchFacility", 90); MakeKeypad("Keypad1", "Keypad1Key0", "Keypad1Key1", "Keypad1Key2", "Keypad1Key3", "Keypad1Key4", "Keypad1Key5", "Keypad1Key6", "Keypad1Key7", "Keypad1Key8", "Keypad1Key9", "Keypad1KeyCancel", MakeDoor("StorageDoor", 90), "7854"); MakeKeypad("Keypad2", "Keypad2Key0", "Keypad2Key1", "Keypad2Key2", "Keypad2Key3", "Keypad2Key4", "Keypad2Key5", "Keypad2Key6", "Keypad2Key7", "Keypad2Key8", "Keypad2Key9", "Keypad2KeyCancel", MakeDoor("DoorToResearchFacility", 90), "1689"); MakeKeypad("Keypad3", "Keypad3Key0", "Keypad3Key1", "Keypad3Key2", "Keypad3Key3", "Keypad3Key4", "Keypad3Key5", "Keypad3Key6", "Keypad3Key7", "Keypad3Key8", "Keypad3Key9", "Keypad3KeyCancel", MakeDoor("DoorMedical", 90), "9632"); mMusic->Play(); mStages["ConcreteWallExp"] = false; mStages["FindObjectObjectiveSet"] = false; mStages["FoundObjectsForExplosion"] = false; // create paths const char * ways[] = { "WayA", "WayB", "WayC", "WayD", "WayE", "WayF", "WayG", "WayH", "WayI", "WayJ", "WayK" }; Path p; for(auto w : ways) { p += Path(mScene, w); } p.Get("WayB1")->AddEdge(p.Get("WayA004")); p.Get("WayC1")->AddEdge(p.Get("WayA019")); p.Get("WayD1")->AddEdge(p.Get("WayA019")); p.Get("WayE1")->AddEdge(p.Get("WayA040")); p.Get("WayF1")->AddEdge(p.Get("WayA042")); p.Get("WayF009")->AddEdge(p.Get("WayG1")); p.Get("WayH1")->AddEdge(p.Get("WayA059")); p.Get("WayI1")->AddEdge(p.Get("WayA097")); p.Get("WayJ1")->AddEdge(p.Get("WayA073")); p.Get("WayK1")->AddEdge(p.Get("WayA027")); vector<shared_ptr<GraphVertex>> patrolPoints = { p.Get("WayA1"), p.Get("WayC024"), p.Get("WayB012"), p.Get("WayB012"), p.Get("WayD003"), p.Get("WayK005"), p.Get("WayE006"), p.Get("WayF019"), p.Get("WayG007"), p.Get("WayH010"), p.Get("WayA110"), p.Get("WayI009") }; mEnemy = make_unique<Enemy>(mGame, p.mVertexList, patrolPoints); mEnemy->SetPosition(GetUniqueObject("EnemyPosition")->GetPosition()); mExplosivesDummy[0] = GetUniqueObject("ExplosivesModel5"); mExplosivesDummy[1] = GetUniqueObject("ExplosivesModel6"); mExplosivesDummy[2] = GetUniqueObject("ExplosivesModel7"); mExplosivesDummy[3] = GetUniqueObject("ExplosivesModel8"); mExplodedWall = GetUniqueObject("ConcreteWallExploded"); mExplodedWall->Hide(); mExplosionFlashPosition = GetUniqueObject("ExplosionFlash"); mPlayer->GetInventory()->RemoveItem(Item::Type::Crowbar, 1); DoneInitialization(); }