78
78
#define DEFAULT_LOGIC_TIC_RATE 60.0
79
79
80
80
81
- KX_KetsjiEngine::CameraRenderData::CameraRenderData (KX_Camera *rendercam, KX_Camera *cullingcam, const RAS_Rect& area, const RAS_Rect& viewport,
82
- RAS_Rasterizer::StereoEye eye)
81
+ KX_KetsjiEngine::CameraRenderData::CameraRenderData (KX_Camera *rendercam, KX_Camera *cullingcam, const RAS_Rect& area,
82
+ const RAS_Rect& viewport, RAS_Rasterizer::StereoMode stereoMode, RAS_Rasterizer::StereoEye eye)
83
83
:m_renderCamera(rendercam),
84
84
m_cullingCamera(cullingcam),
85
85
m_area(area),
86
86
m_viewport(viewport),
87
+ m_stereoMode(stereoMode),
87
88
m_eye(eye)
88
89
{
89
90
m_renderCamera->AddRef ();
@@ -112,6 +113,13 @@ KX_KetsjiEngine::FrameRenderData::FrameRenderData(RAS_Rasterizer::OffScreenType
112
113
{
113
114
}
114
115
116
+ KX_KetsjiEngine::RenderData::RenderData (RAS_Rasterizer::StereoMode stereoMode, bool renderPerEye)
117
+ :m_stereoMode(stereoMode),
118
+ m_renderPerEye(renderPerEye)
119
+ {
120
+ }
121
+
122
+
115
123
const std::string KX_KetsjiEngine::m_profileLabels[tc_numCategories] = {
116
124
" Physics:" , // tc_physics
117
125
" Logic:" , // tc_logic
@@ -466,13 +474,14 @@ void KX_KetsjiEngine::UpdateSuspendedScenes(double framestep)
466
474
}
467
475
468
476
KX_KetsjiEngine::CameraRenderData KX_KetsjiEngine::GetCameraRenderData (KX_Scene *scene, KX_Camera *camera, KX_Camera *overrideCullingCam,
469
- const RAS_Rect& displayArea, RAS_Rasterizer::StereoEye eye, bool usestereo )
477
+ const RAS_Rect& displayArea, RAS_Rasterizer::StereoMode stereoMode, RAS_Rasterizer::StereoEye eye )
470
478
{
471
479
KX_Camera *rendercam;
472
480
/* In case of stereo we must copy the camera because it is used twice with different settings
473
481
* (modelview matrix). This copy use the same transform settings that the original camera
474
482
* and its name is based on with the eye number in addition.
475
483
*/
484
+ const bool usestereo = (stereoMode != RAS_Rasterizer::RAS_STEREO_NOSTEREO);
476
485
if (usestereo) {
477
486
rendercam = new KX_Camera (scene, scene->m_callbacks , *camera->GetCameraData (), true , true );
478
487
rendercam->SetName (" __stereo_" + camera->GetName () + " _" + std::to_string (eye) + " __" );
@@ -498,12 +507,12 @@ KX_KetsjiEngine::CameraRenderData KX_KetsjiEngine::GetCameraRenderData(KX_Scene
498
507
// Compute the area and the viewport based on the current display area and the optional camera viewport.
499
508
GetSceneViewport (scene, rendercam, displayArea, area, viewport);
500
509
// Compute the camera matrices: modelview and projection.
501
- const MT_Matrix4x4 viewmat = m_rasterizer->GetViewMatrix (eye, rendercam->GetWorldToCamera (), rendercam->GetCameraData ()->m_perspective );
502
- const MT_Matrix4x4 projmat = GetCameraProjectionMatrix (scene, rendercam, eye, viewport, area);
510
+ const MT_Matrix4x4 viewmat = m_rasterizer->GetViewMatrix (stereoMode, eye, rendercam->GetWorldToCamera (), rendercam->GetCameraData ()->m_perspective );
511
+ const MT_Matrix4x4 projmat = GetCameraProjectionMatrix (scene, rendercam, stereoMode, eye, viewport, area);
503
512
rendercam->SetModelviewMatrix (viewmat);
504
513
rendercam->SetProjectionMatrix (projmat);
505
514
506
- CameraRenderData cameraData (rendercam, cullingcam, area, viewport, eye);
515
+ CameraRenderData cameraData (rendercam, cullingcam, area, viewport, stereoMode, eye);
507
516
508
517
if (usestereo) {
509
518
rendercam->Release ();
@@ -512,7 +521,7 @@ KX_KetsjiEngine::CameraRenderData KX_KetsjiEngine::GetCameraRenderData(KX_Scene
512
521
return cameraData;
513
522
}
514
523
515
- bool KX_KetsjiEngine::GetFrameRenderData (std::vector<FrameRenderData>& frameDataList )
524
+ KX_KetsjiEngine::RenderData KX_KetsjiEngine::GetRenderData ( )
516
525
{
517
526
const RAS_Rasterizer::StereoMode stereomode = m_rasterizer->GetStereoMode ();
518
527
const bool usestereo = (stereomode != RAS_Rasterizer::RAS_STEREO_NOSTEREO);
@@ -521,6 +530,8 @@ bool KX_KetsjiEngine::GetFrameRenderData(std::vector<FrameRenderData>& frameData
521
530
stereomode == RAS_Rasterizer::RAS_STEREO_VINTERLACE ||
522
531
stereomode == RAS_Rasterizer::RAS_STEREO_ANAGLYPH;
523
532
533
+ RenderData renderData (stereomode, renderpereye);
534
+
524
535
// The number of eyes to manage in case of stereo.
525
536
const unsigned short numeyes = (usestereo) ? 2 : 1 ;
526
537
// The number of frames in case of stereo, could be multiple for interlaced or anaglyph stereo.
@@ -535,7 +546,7 @@ bool KX_KetsjiEngine::GetFrameRenderData(std::vector<FrameRenderData>& frameData
535
546
// Pre-compute the display area used for stereo or normal rendering.
536
547
std::vector<RAS_Rect> displayAreas;
537
548
for (unsigned short eye = 0 ; eye < numeyes; ++eye) {
538
- displayAreas.push_back (m_rasterizer->GetRenderArea (m_canvas, (RAS_Rasterizer::StereoEye)eye));
549
+ displayAreas.push_back (m_rasterizer->GetRenderArea (m_canvas, stereomode, (RAS_Rasterizer::StereoEye)eye));
539
550
}
540
551
541
552
// Prepare override culling camera of each scenes, we don't manage stereo currently.
@@ -548,17 +559,18 @@ bool KX_KetsjiEngine::GetFrameRenderData(std::vector<FrameRenderData>& frameData
548
559
// Compute the area and the viewport based on the current display area and the optional camera viewport.
549
560
GetSceneViewport (scene, overrideCullingCam, displayAreas[RAS_Rasterizer::RAS_STEREO_LEFTEYE], area, viewport);
550
561
// Compute the camera matrices: modelview and projection.
551
- const MT_Matrix4x4 viewmat = m_rasterizer->GetViewMatrix (RAS_Rasterizer::RAS_STEREO_LEFTEYE, overrideCullingCam->GetWorldToCamera (),
552
- overrideCullingCam->GetCameraData ()->m_perspective );
553
- const MT_Matrix4x4 projmat = GetCameraProjectionMatrix (scene, overrideCullingCam, RAS_Rasterizer::RAS_STEREO_LEFTEYE, viewport, area);
562
+ const MT_Matrix4x4 viewmat = m_rasterizer->GetViewMatrix (stereomode, RAS_Rasterizer::RAS_STEREO_LEFTEYE,
563
+ overrideCullingCam->GetWorldToCamera (), overrideCullingCam->GetCameraData ()->m_perspective );
564
+ const MT_Matrix4x4 projmat = GetCameraProjectionMatrix (scene, overrideCullingCam, stereomode,
565
+ RAS_Rasterizer::RAS_STEREO_LEFTEYE, viewport, area);
554
566
overrideCullingCam->SetModelviewMatrix (viewmat);
555
567
overrideCullingCam->SetProjectionMatrix (projmat);
556
568
}
557
569
}
558
570
559
571
for (unsigned short frame = 0 ; frame < numframes; ++frame) {
560
- frameDataList .emplace_back (ofsType[frame]);
561
- FrameRenderData& frameData = frameDataList .back ();
572
+ renderData. m_frameDataList .emplace_back (ofsType[frame]);
573
+ FrameRenderData& frameData = renderData. m_frameDataList .back ();
562
574
563
575
// Get the eyes managed per frame.
564
576
std::vector<RAS_Rasterizer::StereoEye> eyes;
@@ -587,13 +599,14 @@ bool KX_KetsjiEngine::GetFrameRenderData(std::vector<FrameRenderData>& frameData
587
599
}
588
600
589
601
for (RAS_Rasterizer::StereoEye eye : eyes) {
590
- sceneFrameData.m_cameraDataList .push_back (GetCameraRenderData (scene, cam, overrideCullingCam, displayAreas[eye], eye, usestereo));
602
+ sceneFrameData.m_cameraDataList .push_back (GetCameraRenderData (scene, cam, overrideCullingCam, displayAreas[eye],
603
+ stereomode, eye));
591
604
}
592
605
}
593
606
}
594
607
}
595
608
596
- return renderpereye ;
609
+ return renderData ;
597
610
}
598
611
599
612
void KX_KetsjiEngine::Render ()
@@ -609,8 +622,7 @@ void KX_KetsjiEngine::Render()
609
622
scene->RenderTextureRenderers (KX_TextureRendererManager::VIEWPORT_INDEPENDENT, m_rasterizer, nullptr , nullptr , RAS_Rect (), RAS_Rect ());
610
623
}
611
624
612
- std::vector<FrameRenderData> frameDataList;
613
- const bool renderpereye = GetFrameRenderData (frameDataList);
625
+ RenderData renderData = GetRenderData ();
614
626
615
627
// Update all off screen to the current canvas size.
616
628
m_rasterizer->UpdateOffScreens (m_canvas);
@@ -630,7 +642,7 @@ void KX_KetsjiEngine::Render()
630
642
// Used to detect when a camera is the first rendered an then doesn't request a depth clear.
631
643
unsigned short pass = 0 ;
632
644
633
- for (FrameRenderData& frameData : frameDataList ) {
645
+ for (FrameRenderData& frameData : renderData. m_frameDataList ) {
634
646
// Current bound off screen.
635
647
RAS_OffScreen *offScreen = m_rasterizer->GetOffScreen (frameData.m_ofsType );
636
648
offScreen->Bind ();
@@ -686,14 +698,14 @@ void KX_KetsjiEngine::Render()
686
698
m_canvas->SetViewPort (0 , 0 , width, height);
687
699
688
700
// Compositing per eye off screens to screen.
689
- if (renderpereye ) {
690
- RAS_OffScreen *leftofs = m_rasterizer->GetOffScreen (frameDataList [0 ].m_ofsType );
691
- RAS_OffScreen *rightofs = m_rasterizer->GetOffScreen (frameDataList [1 ].m_ofsType );
692
- m_rasterizer->DrawStereoOffScreen (m_canvas, leftofs, rightofs);
701
+ if (renderData. m_renderPerEye ) {
702
+ RAS_OffScreen *leftofs = m_rasterizer->GetOffScreen (renderData. m_frameDataList [0 ].m_ofsType );
703
+ RAS_OffScreen *rightofs = m_rasterizer->GetOffScreen (renderData. m_frameDataList [1 ].m_ofsType );
704
+ m_rasterizer->DrawStereoOffScreen (m_canvas, leftofs, rightofs, renderData. m_stereoMode );
693
705
}
694
706
// Else simply draw the off screen to screen.
695
707
else {
696
- m_rasterizer->DrawOffScreen (m_canvas, m_rasterizer->GetOffScreen (frameDataList [0 ].m_ofsType ));
708
+ m_rasterizer->DrawOffScreen (m_canvas, m_rasterizer->GetOffScreen (renderData. m_frameDataList [0 ].m_ofsType ));
697
709
}
698
710
699
711
EndFrame ();
@@ -872,8 +884,8 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
872
884
}
873
885
}
874
886
875
- MT_Matrix4x4 KX_KetsjiEngine::GetCameraProjectionMatrix (KX_Scene *scene, KX_Camera *cam, RAS_Rasterizer::StereoEye eye ,
876
- const RAS_Rect& viewport, const RAS_Rect& area) const
887
+ MT_Matrix4x4 KX_KetsjiEngine::GetCameraProjectionMatrix (KX_Scene *scene, KX_Camera *cam, RAS_Rasterizer::StereoMode stereoMode ,
888
+ RAS_Rasterizer::StereoEye eye, const RAS_Rect& viewport, const RAS_Rect& area) const
877
889
{
878
890
if (cam->hasValidProjectionMatrix ()) {
879
891
return cam->GetProjectionMatrix ();
@@ -940,8 +952,8 @@ MT_Matrix4x4 KX_KetsjiEngine::GetCameraProjectionMatrix(KX_Scene *scene, KX_Came
940
952
frustum.y1 *= camzoom;
941
953
frustum.y2 *= camzoom;
942
954
}
943
- projmat = m_rasterizer->GetFrustumMatrix (
944
- eye, frustum.x1 , frustum.x2 , frustum.y1 , frustum.y2 , frustum.camnear , frustum.camfar , focallength );
955
+ projmat = m_rasterizer->GetFrustumMatrix (stereoMode, eye, focallength,
956
+ frustum.x1 , frustum.x2 , frustum.y1 , frustum.y2 , frustum.camnear , frustum.camfar );
945
957
}
946
958
}
947
959
@@ -1222,8 +1234,10 @@ void KX_KetsjiEngine::DrawDebugCameraFrustum(KX_Scene *scene, RAS_DebugDraw& deb
1222
1234
1223
1235
for (KX_Camera *cam : scene->GetCameraList ()) {
1224
1236
if (cam != cameraFrameData.m_renderCamera && (m_showCameraFrustum == KX_DebugOption::FORCE || cam->GetShowCameraFrustum ())) {
1225
- const MT_Matrix4x4 viewmat = m_rasterizer->GetViewMatrix (cameraFrameData.m_eye , cam->GetWorldToCamera (), cam->GetCameraData ()->m_perspective );
1226
- const MT_Matrix4x4 projmat = GetCameraProjectionMatrix (scene, cam, cameraFrameData.m_eye , cameraFrameData.m_viewport , cameraFrameData.m_area );
1237
+ const MT_Matrix4x4 viewmat = m_rasterizer->GetViewMatrix (cameraFrameData.m_stereoMode , cameraFrameData.m_eye ,
1238
+ cam->GetWorldToCamera (), cam->GetCameraData ()->m_perspective );
1239
+ const MT_Matrix4x4 projmat = GetCameraProjectionMatrix (scene, cam, cameraFrameData.m_stereoMode , cameraFrameData.m_eye ,
1240
+ cameraFrameData.m_viewport , cameraFrameData.m_area );
1227
1241
debugDraw.DrawCameraFrustum (projmat, viewmat);
1228
1242
}
1229
1243
}
0 commit comments