MCPcopy Create free account
hub / github.com/NVIDIA-RTX/RTXPT / TickCamera

Method TickCamera

Rtxpt/SampleGame/GameScene.cpp:419–477  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

417}
418
419void GameScene::TickCamera(float deltaTime, donut::app::FirstPersonCamera & renderCamera)
420{
421 // in case we're switching from scene camera (renderCamera) to game camera and back, save/restore scene camera
422 if (!m_wasGameCameraActive && CameraActive())
423 {
424 m_sceneCameraLastPos = renderCamera.GetPosition();
425 m_sceneCameraLastDir = renderCamera.GetDir();
426 m_sceneCameraLastUp = renderCamera.GetUp();
427 }
428 if (m_wasGameCameraActive && !CameraActive())
429 {
430 renderCamera.LookTo(m_sceneCameraLastPos, m_sceneCameraLastDir, m_sceneCameraLastUp);
431 }
432 m_wasGameCameraActive = CameraActive();
433
434 if (CameraActive())
435 {
436 // Allow game camera to move in its own reference frame - this should be optional as some props might like to have control of it
437 m_gameCamera.Animate(deltaTime);
438
439 // Move game camera into it's parent (attached) prop's reference frame and apply to global renderCamera
440 {
441 auto attachedProp = m_gameCameraAttached.lock();
442 affine3 transform = affine3::identity();
443 if (attachedProp != nullptr)
444 {
445 // transform = attachedObject->GetRootNode()->GetLocalToWorldTransformFloat(); // we can't do this because these have not yet been updated
446 dm::daffine3 transformD = dm::scaling(attachedProp->GetNode()->GetScaling());
447 transformD *= attachedProp->GetNode()->GetRotation().toAffine();
448 transformD *= dm::translation(attachedProp->GetNode()->GetTranslation());
449 transform = dm::affine3(transformD);
450 }
451
452 renderCamera.LookTo( transform.transformPoint(m_gameCamera.GetPosition()), transform.transformVector(m_gameCamera.GetDir()), transform.transformVector(m_gameCamera.GetUp()));
453 }
454 }
455
456 m_lastRenderCameraPose.SetTransformFromCamera(renderCamera.GetPosition(), renderCamera.GetDir(), renderCamera.GetUp());
457
458 //if (!m_active)
459 // return;
460
461 if (m_camRecEnabled && IsActive())
462 {
463 m_camRecTimeToNextKeyframe = dm::clamp(m_camRecTimeToNextKeyframe-deltaTime, -m_camRecKeyframeStep, m_camRecKeyframeStep);
464
465 if (m_camRecTimeToNextKeyframe <= 0)
466 {
467 game::Pose pose;
468 pose.SetTransformFromCamera(renderCamera.GetPosition(), renderCamera.GetDir(), renderCamera.GetUp());
469 pose.Scaling = { 1,1,1 };
470 pose.KeyTime = m_gameTime;
471
472 m_recordedCameraPoses.push_back(pose);
473
474 m_camRecTimeToNextKeyframe += m_camRecKeyframeStep;
475 }
476 }

Callers 1

AnimateMethod · 0.80

Calls 2

AnimateMethod · 0.45

Tested by

no test coverage detected