Various game engine fixes:
* Fix issue with add transparency mode with blender materials. * Possible fix at frontface flip in the game engine. * Fix color buffering clearing for multiple viewports, it used to clear as if there was one. * Fix for zoom level in user defined viewports, it was based on the full window before, now it is based on the viewport itself. * For user defined viewports, always use Expose instead of Letterbox with bars, the latter doesn't make sense then.
This commit is contained in:
@@ -7762,7 +7762,7 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if(main->versionfile <= 246 && main->subversionfile < 1){
|
if(main->versionfile < 246 || (main->versionfile == 246 && main->subversionfile < 1)) {
|
||||||
Mesh *me;
|
Mesh *me;
|
||||||
|
|
||||||
for(me=main->mesh.first; me; me= me->id.next)
|
for(me=main->mesh.first; me; me= me->id.next)
|
||||||
|
@@ -627,7 +627,7 @@ BL_Material* ConvertMaterial(
|
|||||||
material->transp = TF_ALPHA;
|
material->transp = TF_ALPHA;
|
||||||
|
|
||||||
// always zsort alpha + add
|
// always zsort alpha + add
|
||||||
if((material->transp == TF_ALPHA || texalpha) && (material->transp != TF_CLIP)) {
|
if((material->transp == TF_ALPHA || material->transp == TF_ADD || texalpha) && (material->transp != TF_CLIP)) {
|
||||||
material->ras_mode |= ALPHA;
|
material->ras_mode |= ALPHA;
|
||||||
material->ras_mode |= (material->mode & TF_ALPHASORT)? ZSORT: 0;
|
material->ras_mode |= (material->mode & TF_ALPHASORT)? ZSORT: 0;
|
||||||
}
|
}
|
||||||
|
@@ -629,7 +629,8 @@ int main(int argc, char** argv)
|
|||||||
char pathname[160];
|
char pathname[160];
|
||||||
|
|
||||||
get_filename(argc, argv, filename);
|
get_filename(argc, argv, filename);
|
||||||
make_absolute_filename(filename);
|
if(filename[0])
|
||||||
|
make_absolute_filename(filename);
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
|
@@ -276,30 +276,73 @@ void KX_KetsjiEngine::StartEngine(bool clearIpo)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void KX_KetsjiEngine::ClearFrame()
|
||||||
|
{
|
||||||
|
// clear unless we're drawing overlapping stereo
|
||||||
|
if(m_rasterizer->InterlacedStereo() &&
|
||||||
|
m_rasterizer->GetEye() == RAS_IRasterizer::RAS_STEREO_RIGHTEYE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// clear the viewports with the background color of the first scene
|
||||||
|
bool doclear = false;
|
||||||
|
KX_SceneList::iterator sceneit;
|
||||||
|
RAS_Rect clearvp, area, viewport;
|
||||||
|
|
||||||
|
for (sceneit = m_scenes.begin(); sceneit != m_scenes.end(); sceneit++)
|
||||||
|
{
|
||||||
|
KX_Scene* scene = *sceneit;
|
||||||
|
//const RAS_FrameSettings &framesettings = scene->GetFramingType();
|
||||||
|
list<class KX_Camera*>* cameras = scene->GetCameras();
|
||||||
|
|
||||||
|
list<KX_Camera*>::iterator it;
|
||||||
|
for(it = cameras->begin(); it != cameras->end(); it++)
|
||||||
|
{
|
||||||
|
SetupViewport(scene, (*it), area, viewport);
|
||||||
|
|
||||||
|
if(!doclear) {
|
||||||
|
clearvp = viewport;
|
||||||
|
doclear = true;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if(viewport.GetLeft() < clearvp.GetLeft())
|
||||||
|
clearvp.SetLeft(viewport.GetLeft());
|
||||||
|
if(viewport.GetBottom() < clearvp.GetBottom())
|
||||||
|
clearvp.SetBottom(viewport.GetBottom());
|
||||||
|
if(viewport.GetRight() > clearvp.GetRight())
|
||||||
|
clearvp.SetRight(viewport.GetRight());
|
||||||
|
if(viewport.GetTop() > clearvp.GetTop())
|
||||||
|
clearvp.SetTop(viewport.GetTop());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(doclear) {
|
||||||
|
KX_Scene* firstscene = *m_scenes.begin();
|
||||||
|
SetBackGround(firstscene->GetWorldInfo());
|
||||||
|
|
||||||
|
m_canvas->SetViewPort(clearvp.GetLeft(), clearvp.GetBottom(),
|
||||||
|
clearvp.GetRight(), clearvp.GetTop());
|
||||||
|
m_rasterizer->ClearColorBuffer();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool KX_KetsjiEngine::BeginFrame()
|
bool KX_KetsjiEngine::BeginFrame()
|
||||||
{
|
{
|
||||||
bool result = false;
|
// set the area used for rendering (stereo can assign only a subset)
|
||||||
|
|
||||||
RAS_Rect vp;
|
|
||||||
KX_Scene* firstscene = *m_scenes.begin();
|
|
||||||
const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
|
|
||||||
|
|
||||||
// set the area used for rendering
|
|
||||||
m_rasterizer->SetRenderArea();
|
m_rasterizer->SetRenderArea();
|
||||||
|
|
||||||
RAS_FramingManager::ComputeViewport(framesettings, m_canvas->GetDisplayArea(), vp);
|
|
||||||
|
|
||||||
if (m_canvas->BeginDraw())
|
if (m_canvas->BeginDraw())
|
||||||
{
|
{
|
||||||
result = true;
|
ClearFrame();
|
||||||
|
|
||||||
m_canvas->SetViewPort(vp.GetLeft(), vp.GetBottom(), vp.GetRight(), vp.GetTop());
|
m_rasterizer->BeginFrame(m_drawingmode , m_kxsystem->GetTimeInSeconds());
|
||||||
SetBackGround( firstscene->GetWorldInfo() );
|
m_rendertools->BeginFrame(m_rasterizer);
|
||||||
m_rasterizer->BeginFrame( m_drawingmode , m_kxsystem->GetTimeInSeconds());
|
|
||||||
m_rendertools->BeginFrame( m_rasterizer);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -606,7 +649,7 @@ void KX_KetsjiEngine::Render()
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
// clear the -whole- viewport
|
// clear the -whole- viewport
|
||||||
m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER);
|
m_canvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER|RAS_ICanvas::DEPTH_BUFFER);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
|
m_rasterizer->SetEye(RAS_IRasterizer::RAS_STEREO_LEFTEYE);
|
||||||
@@ -635,9 +678,6 @@ void KX_KetsjiEngine::Render()
|
|||||||
|
|
||||||
m_rendertools->SetAuxilaryClientInfo(scene);
|
m_rendertools->SetAuxilaryClientInfo(scene);
|
||||||
|
|
||||||
//Initialize scene viewport.
|
|
||||||
SetupRenderFrame(scene, cam);
|
|
||||||
|
|
||||||
// do the rendering
|
// do the rendering
|
||||||
RenderFrame(scene, cam);
|
RenderFrame(scene, cam);
|
||||||
}
|
}
|
||||||
@@ -655,9 +695,6 @@ void KX_KetsjiEngine::Render()
|
|||||||
|
|
||||||
m_rendertools->SetAuxilaryClientInfo(scene);
|
m_rendertools->SetAuxilaryClientInfo(scene);
|
||||||
|
|
||||||
//Initialize scene viewport.
|
|
||||||
SetupRenderFrame(scene, (*it));
|
|
||||||
|
|
||||||
// do the rendering
|
// do the rendering
|
||||||
RenderFrame(scene, (*it));
|
RenderFrame(scene, (*it));
|
||||||
}
|
}
|
||||||
@@ -690,10 +727,6 @@ void KX_KetsjiEngine::Render()
|
|||||||
//pass the scene, for picking and raycasting (shadows)
|
//pass the scene, for picking and raycasting (shadows)
|
||||||
m_rendertools->SetAuxilaryClientInfo(scene);
|
m_rendertools->SetAuxilaryClientInfo(scene);
|
||||||
|
|
||||||
//Initialize scene viewport.
|
|
||||||
//SetupRenderFrame(scene);
|
|
||||||
SetupRenderFrame(scene, cam);
|
|
||||||
|
|
||||||
// do the rendering
|
// do the rendering
|
||||||
//RenderFrame(scene);
|
//RenderFrame(scene);
|
||||||
RenderFrame(scene, cam);
|
RenderFrame(scene, cam);
|
||||||
@@ -854,7 +887,7 @@ void KX_KetsjiEngine::SetCameraOverrideViewMatrix(const MT_CmMatrix4x4& mat)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene, KX_Camera* cam)
|
void KX_KetsjiEngine::SetupViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport)
|
||||||
{
|
{
|
||||||
// In this function we make sure the rasterizer settings are upto
|
// In this function we make sure the rasterizer settings are upto
|
||||||
// date. We compute the viewport so that logic
|
// date. We compute the viewport so that logic
|
||||||
@@ -862,17 +895,26 @@ void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene, KX_Camera* cam)
|
|||||||
|
|
||||||
// Note we postpone computation of the projection matrix
|
// Note we postpone computation of the projection matrix
|
||||||
// so that we are using the latest camera position.
|
// so that we are using the latest camera position.
|
||||||
|
|
||||||
RAS_Rect viewport;
|
|
||||||
|
|
||||||
if (!cam)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (cam->GetViewport()) {
|
if (cam->GetViewport()) {
|
||||||
viewport.SetLeft(cam->GetViewportLeft());
|
RAS_Rect userviewport;
|
||||||
viewport.SetBottom(cam->GetViewportBottom());
|
|
||||||
viewport.SetRight(cam->GetViewportRight());
|
userviewport.SetLeft(cam->GetViewportLeft());
|
||||||
viewport.SetTop(cam->GetViewportTop());
|
userviewport.SetBottom(cam->GetViewportBottom());
|
||||||
|
userviewport.SetRight(cam->GetViewportRight());
|
||||||
|
userviewport.SetTop(cam->GetViewportTop());
|
||||||
|
|
||||||
|
// Don't do bars on user specified viewport
|
||||||
|
RAS_FrameSettings settings = scene->GetFramingType();
|
||||||
|
if(settings.FrameType() == RAS_FrameSettings::e_frame_bars)
|
||||||
|
settings.SetFrameType(RAS_FrameSettings::e_frame_extend);
|
||||||
|
|
||||||
|
RAS_FramingManager::ComputeViewport(
|
||||||
|
scene->GetFramingType(),
|
||||||
|
userviewport,
|
||||||
|
viewport
|
||||||
|
);
|
||||||
|
|
||||||
|
area = userviewport;
|
||||||
}
|
}
|
||||||
else if ( m_overrideCam || (scene->GetName() != m_overrideSceneName) || m_overrideCamUseOrtho ) {
|
else if ( m_overrideCam || (scene->GetName() != m_overrideSceneName) || m_overrideCamUseOrtho ) {
|
||||||
RAS_FramingManager::ComputeViewport(
|
RAS_FramingManager::ComputeViewport(
|
||||||
@@ -880,24 +922,16 @@ void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene, KX_Camera* cam)
|
|||||||
m_canvas->GetDisplayArea(),
|
m_canvas->GetDisplayArea(),
|
||||||
viewport
|
viewport
|
||||||
);
|
);
|
||||||
|
|
||||||
|
area = m_canvas->GetDisplayArea();
|
||||||
} else {
|
} else {
|
||||||
viewport.SetLeft(0);
|
viewport.SetLeft(0);
|
||||||
viewport.SetBottom(0);
|
viewport.SetBottom(0);
|
||||||
viewport.SetRight(int(m_canvas->GetWidth()));
|
viewport.SetRight(int(m_canvas->GetWidth()));
|
||||||
viewport.SetTop(int(m_canvas->GetHeight()));
|
viewport.SetTop(int(m_canvas->GetHeight()));
|
||||||
|
|
||||||
|
area = m_canvas->GetDisplayArea();
|
||||||
}
|
}
|
||||||
// store the computed viewport in the scene
|
|
||||||
|
|
||||||
scene->SetSceneViewport(viewport);
|
|
||||||
|
|
||||||
// set the viewport for this frame and scene
|
|
||||||
m_canvas->SetViewPort(
|
|
||||||
viewport.GetLeft(),
|
|
||||||
viewport.GetBottom(),
|
|
||||||
viewport.GetRight(),
|
|
||||||
viewport.GetTop()
|
|
||||||
);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
|
void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
|
||||||
@@ -951,6 +985,7 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
|
|||||||
// update graphics
|
// update graphics
|
||||||
void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
||||||
{
|
{
|
||||||
|
RAS_Rect viewport, area;
|
||||||
float left, right, bottom, top, nearfrust, farfrust, focallength;
|
float left, right, bottom, top, nearfrust, farfrust, focallength;
|
||||||
const float ortho = 100.0;
|
const float ortho = 100.0;
|
||||||
// KX_Camera* cam = scene->GetActiveCamera();
|
// KX_Camera* cam = scene->GetActiveCamera();
|
||||||
@@ -958,6 +993,15 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
|||||||
if (!cam)
|
if (!cam)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
SetupViewport(scene, cam, area, viewport);
|
||||||
|
|
||||||
|
// store the computed viewport in the scene
|
||||||
|
scene->SetSceneViewport(viewport);
|
||||||
|
|
||||||
|
// set the viewport for this frame and scene
|
||||||
|
m_canvas->SetViewPort(viewport.GetLeft(), viewport.GetBottom(),
|
||||||
|
viewport.GetRight(), viewport.GetTop());
|
||||||
|
|
||||||
// see KX_BlenderMaterial::Activate
|
// see KX_BlenderMaterial::Activate
|
||||||
//m_rasterizer->SetAmbient();
|
//m_rasterizer->SetAmbient();
|
||||||
m_rasterizer->DisplayFog();
|
m_rasterizer->DisplayFog();
|
||||||
@@ -985,8 +1029,8 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
|||||||
|
|
||||||
RAS_FramingManager::ComputeFrustum(
|
RAS_FramingManager::ComputeFrustum(
|
||||||
scene->GetFramingType(),
|
scene->GetFramingType(),
|
||||||
m_canvas->GetDisplayArea(),
|
area,
|
||||||
scene->GetSceneViewport(),
|
viewport,
|
||||||
lens,
|
lens,
|
||||||
nearfrust,
|
nearfrust,
|
||||||
farfrust,
|
farfrust,
|
||||||
|
@@ -177,7 +177,7 @@ private:
|
|||||||
/** Blue component of framing bar color. */
|
/** Blue component of framing bar color. */
|
||||||
float m_overrideFrameColorB;
|
float m_overrideFrameColorB;
|
||||||
|
|
||||||
void SetupRenderFrame(KX_Scene *scene, KX_Camera* cam);
|
void SetupViewport(KX_Scene *scene, KX_Camera* cam, RAS_Rect& area, RAS_Rect& viewport);
|
||||||
void RenderFrame(KX_Scene* scene, KX_Camera* cam);
|
void RenderFrame(KX_Scene* scene, KX_Camera* cam);
|
||||||
void PostRenderFrame();
|
void PostRenderFrame();
|
||||||
void RenderDebugProperties();
|
void RenderDebugProperties();
|
||||||
@@ -355,6 +355,7 @@ protected:
|
|||||||
KX_Scene* CreateScene(const STR_String& scenename);
|
KX_Scene* CreateScene(const STR_String& scenename);
|
||||||
|
|
||||||
bool BeginFrame();
|
bool BeginFrame();
|
||||||
|
void ClearFrame();
|
||||||
void EndFrame();
|
void EndFrame();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -130,9 +130,6 @@ void RAS_BucketManager::OrderBuckets(const MT_Transform& cameratrans, BucketList
|
|||||||
sort(slots.begin(), slots.end(), fronttoback());
|
sort(slots.begin(), slots.end(), fronttoback());
|
||||||
}
|
}
|
||||||
|
|
||||||
//static int TOTASLOT = 0;
|
|
||||||
//static int TOTSLOT = 0;
|
|
||||||
|
|
||||||
void RAS_BucketManager::RenderAlphaBuckets(
|
void RAS_BucketManager::RenderAlphaBuckets(
|
||||||
const MT_Transform& cameratrans, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools)
|
const MT_Transform& cameratrans, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools)
|
||||||
{
|
{
|
||||||
@@ -149,10 +146,8 @@ void RAS_BucketManager::RenderAlphaBuckets(
|
|||||||
for(sit=slots.begin(); sit!=slots.end(); ++sit) {
|
for(sit=slots.begin(); sit!=slots.end(); ++sit) {
|
||||||
rendertools->SetClientObject(rasty, sit->m_ms->m_clientObj);
|
rendertools->SetClientObject(rasty, sit->m_ms->m_clientObj);
|
||||||
|
|
||||||
while(sit->m_bucket->ActivateMaterial(cameratrans, rasty, rendertools)) {
|
while(sit->m_bucket->ActivateMaterial(cameratrans, rasty, rendertools))
|
||||||
sit->m_bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *(sit->m_ms));
|
sit->m_bucket->RenderMeshSlot(cameratrans, rasty, rendertools, *(sit->m_ms));
|
||||||
//TOTASLOT++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
|
rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
|
||||||
@@ -173,13 +168,14 @@ void RAS_BucketManager::RenderSolidBuckets(
|
|||||||
|
|
||||||
rendertools->SetClientObject(rasty, mit->m_clientObj);
|
rendertools->SetClientObject(rasty, mit->m_clientObj);
|
||||||
|
|
||||||
while ((*bit)->ActivateMaterial(cameratrans, rasty, rendertools)) {
|
while ((*bit)->ActivateMaterial(cameratrans, rasty, rendertools))
|
||||||
(*bit)->RenderMeshSlot(cameratrans, rasty, rendertools, *mit);
|
(*bit)->RenderMeshSlot(cameratrans, rasty, rendertools, *mit);
|
||||||
//TOTSLOT++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* this code draws meshes order front-to-back instead to reduce overdraw.
|
||||||
|
* it turned out slower due to much material state switching, a more clever
|
||||||
|
* algorithm might do better. */
|
||||||
#if 0
|
#if 0
|
||||||
vector<sortedmeshslot> slots;
|
vector<sortedmeshslot> slots;
|
||||||
vector<sortedmeshslot>::iterator sit;
|
vector<sortedmeshslot>::iterator sit;
|
||||||
@@ -198,17 +194,12 @@ void RAS_BucketManager::RenderSolidBuckets(
|
|||||||
void RAS_BucketManager::Renderbuckets(
|
void RAS_BucketManager::Renderbuckets(
|
||||||
const MT_Transform& cameratrans, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools)
|
const MT_Transform& cameratrans, RAS_IRasterizer* rasty, RAS_IRenderTools* rendertools)
|
||||||
{
|
{
|
||||||
// beginning each frame, clear (texture/material) caching information
|
/* beginning each frame, clear (texture/material) caching information */
|
||||||
rasty->ClearCachingInfo();
|
rasty->ClearCachingInfo();
|
||||||
|
|
||||||
//TOTASLOT = 0;
|
|
||||||
//TOTSLOT = 0;
|
|
||||||
|
|
||||||
RenderSolidBuckets(cameratrans, rasty, rendertools);
|
RenderSolidBuckets(cameratrans, rasty, rendertools);
|
||||||
RenderAlphaBuckets(cameratrans, rasty, rendertools);
|
RenderAlphaBuckets(cameratrans, rasty, rendertools);
|
||||||
|
|
||||||
//printf("total slots = %d = %d + %d\n", TOTSLOT + TOTASLOT, TOTSLOT, TOTASLOT);
|
|
||||||
|
|
||||||
rendertools->SetClientObject(rasty, NULL);
|
rendertools->SetClientObject(rasty, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -109,6 +109,13 @@ public :
|
|||||||
return m_frame_type;
|
return m_frame_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void
|
||||||
|
SetFrameType(
|
||||||
|
RAS_FrameType type
|
||||||
|
) {
|
||||||
|
m_frame_type = type;
|
||||||
|
};
|
||||||
|
|
||||||
float
|
float
|
||||||
BarRed(
|
BarRed(
|
||||||
) const {
|
) const {
|
||||||
@@ -141,14 +148,6 @@ public :
|
|||||||
|
|
||||||
private :
|
private :
|
||||||
|
|
||||||
/**
|
|
||||||
* private to force use of public constructor
|
|
||||||
*/
|
|
||||||
|
|
||||||
RAS_FrameSettings(
|
|
||||||
const RAS_FrameSettings &
|
|
||||||
);
|
|
||||||
|
|
||||||
RAS_FrameType m_frame_type;
|
RAS_FrameType m_frame_type;
|
||||||
float m_bar_r;
|
float m_bar_r;
|
||||||
float m_bar_g;
|
float m_bar_g;
|
||||||
|
@@ -168,6 +168,10 @@ public:
|
|||||||
* BeginFrame is called at the start of each frame.
|
* BeginFrame is called at the start of each frame.
|
||||||
*/
|
*/
|
||||||
virtual bool BeginFrame(int drawingmode, double time)=0;
|
virtual bool BeginFrame(int drawingmode, double time)=0;
|
||||||
|
/**
|
||||||
|
* ClearColorBuffer clears the color buffer.
|
||||||
|
*/
|
||||||
|
virtual void ClearColorBuffer()=0;
|
||||||
/**
|
/**
|
||||||
* ClearDepthBuffer clears the depth buffer.
|
* ClearDepthBuffer clears the depth buffer.
|
||||||
*/
|
*/
|
||||||
@@ -181,7 +185,8 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual void EndFrame()=0;
|
virtual void EndFrame()=0;
|
||||||
/**
|
/**
|
||||||
* SetRenderArea sets the render area from the 2d canvas
|
* SetRenderArea sets the render area from the 2d canvas.
|
||||||
|
* Returns true if only of subset of the canvas is used.
|
||||||
*/
|
*/
|
||||||
virtual void SetRenderArea()=0;
|
virtual void SetRenderArea()=0;
|
||||||
|
|
||||||
@@ -195,6 +200,7 @@ public:
|
|||||||
* @return true if stereo mode is enabled.
|
* @return true if stereo mode is enabled.
|
||||||
*/
|
*/
|
||||||
virtual bool Stereo()=0;
|
virtual bool Stereo()=0;
|
||||||
|
virtual bool InterlacedStereo()=0;
|
||||||
/**
|
/**
|
||||||
* Sets which eye buffer subsequent primitives will be rendered to.
|
* Sets which eye buffer subsequent primitives will be rendered to.
|
||||||
*/
|
*/
|
||||||
|
@@ -105,8 +105,12 @@ bool RAS_OpenGLRasterizer::Init()
|
|||||||
m_ambg = 0.0f;
|
m_ambg = 0.0f;
|
||||||
m_ambb = 0.0f;
|
m_ambb = 0.0f;
|
||||||
|
|
||||||
SetBlendingMode(GPU_BLEND_SOLID);
|
glDisable(GL_BLEND);
|
||||||
SetFrontFace(true);
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
m_last_blendmode = GPU_BLEND_SOLID;
|
||||||
|
|
||||||
|
glFrontFace(GL_CCW);
|
||||||
|
m_last_frontface = true;
|
||||||
|
|
||||||
glClearColor(m_redback,m_greenback,m_blueback,m_alphaback);
|
glClearColor(m_redback,m_greenback,m_blueback,m_alphaback);
|
||||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||||
@@ -250,22 +254,11 @@ void RAS_OpenGLRasterizer::Exit()
|
|||||||
EndFrame();
|
EndFrame();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool RAS_OpenGLRasterizer::InterlacedStereo() const
|
|
||||||
{
|
|
||||||
return m_stereomode == RAS_STEREO_VINTERLACE || m_stereomode == RAS_STEREO_INTERLACED;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool RAS_OpenGLRasterizer::BeginFrame(int drawingmode, double time)
|
bool RAS_OpenGLRasterizer::BeginFrame(int drawingmode, double time)
|
||||||
{
|
{
|
||||||
m_time = time;
|
m_time = time;
|
||||||
m_drawingmode = drawingmode;
|
m_drawingmode = drawingmode;
|
||||||
|
|
||||||
if (!InterlacedStereo() || m_curreye == RAS_STEREO_LEFTEYE)
|
|
||||||
{
|
|
||||||
m_2DCanvas->ClearColor(m_redback,m_greenback,m_blueback,m_alphaback);
|
|
||||||
m_2DCanvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Blender camera routine destroys the settings
|
// Blender camera routine destroys the settings
|
||||||
if (m_drawingmode < KX_SOLID)
|
if (m_drawingmode < KX_SOLID)
|
||||||
{
|
{
|
||||||
@@ -278,8 +271,12 @@ bool RAS_OpenGLRasterizer::BeginFrame(int drawingmode, double time)
|
|||||||
glEnable (GL_CULL_FACE);
|
glEnable (GL_CULL_FACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
SetBlendingMode(GPU_BLEND_SOLID);
|
glDisable(GL_BLEND);
|
||||||
SetFrontFace(true);
|
glDisable(GL_ALPHA_TEST);
|
||||||
|
m_last_blendmode = GPU_BLEND_SOLID;
|
||||||
|
|
||||||
|
glFrontFace(GL_CCW);
|
||||||
|
m_last_frontface = true;
|
||||||
|
|
||||||
glShadeModel(GL_SMOOTH);
|
glShadeModel(GL_SMOOTH);
|
||||||
|
|
||||||
@@ -310,6 +307,12 @@ void RAS_OpenGLRasterizer::SetDepthMask(DepthMask depthmask)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void RAS_OpenGLRasterizer::ClearColorBuffer()
|
||||||
|
{
|
||||||
|
m_2DCanvas->ClearColor(m_redback,m_greenback,m_blueback,m_alphaback);
|
||||||
|
m_2DCanvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void RAS_OpenGLRasterizer::ClearDepthBuffer()
|
void RAS_OpenGLRasterizer::ClearDepthBuffer()
|
||||||
{
|
{
|
||||||
@@ -420,6 +423,10 @@ bool RAS_OpenGLRasterizer::Stereo()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RAS_OpenGLRasterizer::InterlacedStereo()
|
||||||
|
{
|
||||||
|
return m_stereomode == RAS_STEREO_VINTERLACE || m_stereomode == RAS_STEREO_INTERLACED;
|
||||||
|
}
|
||||||
|
|
||||||
void RAS_OpenGLRasterizer::SetEye(const StereoEye eye)
|
void RAS_OpenGLRasterizer::SetEye(const StereoEye eye)
|
||||||
{
|
{
|
||||||
|
@@ -88,7 +88,6 @@ class RAS_OpenGLRasterizer : public RAS_IRasterizer
|
|||||||
float m_focallength;
|
float m_focallength;
|
||||||
bool m_setfocallength;
|
bool m_setfocallength;
|
||||||
int m_noOfScanlines;
|
int m_noOfScanlines;
|
||||||
bool InterlacedStereo() const;
|
|
||||||
|
|
||||||
//motion blur
|
//motion blur
|
||||||
int m_motionblur;
|
int m_motionblur;
|
||||||
@@ -131,6 +130,7 @@ public:
|
|||||||
virtual bool Init();
|
virtual bool Init();
|
||||||
virtual void Exit();
|
virtual void Exit();
|
||||||
virtual bool BeginFrame(int drawingmode, double time);
|
virtual bool BeginFrame(int drawingmode, double time);
|
||||||
|
virtual void ClearColorBuffer();
|
||||||
virtual void ClearDepthBuffer();
|
virtual void ClearDepthBuffer();
|
||||||
virtual void ClearCachingInfo(void);
|
virtual void ClearCachingInfo(void);
|
||||||
virtual void EndFrame();
|
virtual void EndFrame();
|
||||||
@@ -138,6 +138,7 @@ public:
|
|||||||
|
|
||||||
virtual void SetStereoMode(const StereoMode stereomode);
|
virtual void SetStereoMode(const StereoMode stereomode);
|
||||||
virtual bool Stereo();
|
virtual bool Stereo();
|
||||||
|
virtual bool InterlacedStereo();
|
||||||
virtual void SetEye(const StereoEye eye);
|
virtual void SetEye(const StereoEye eye);
|
||||||
virtual StereoEye GetEye();
|
virtual StereoEye GetEye();
|
||||||
virtual void SetEyeSeparation(const float eyeseparation);
|
virtual void SetEyeSeparation(const float eyeseparation);
|
||||||
|
Reference in New Issue
Block a user