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:
Brecht Van Lommel
2008-09-14 00:32:18 +00:00
parent 06be41648f
commit 704fef314a
10 changed files with 146 additions and 96 deletions

View File

@@ -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)

View File

@@ -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;
} }

View File

@@ -629,6 +629,7 @@ int main(int argc, char** argv)
char pathname[160]; char pathname[160];
get_filename(argc, argv, filename); get_filename(argc, argv, filename);
if(filename[0])
make_absolute_filename(filename); make_absolute_filename(filename);
do do

View File

@@ -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());
SetBackGround( firstscene->GetWorldInfo() );
m_rasterizer->BeginFrame(m_drawingmode , m_kxsystem->GetTimeInSeconds()); m_rasterizer->BeginFrame(m_drawingmode , m_kxsystem->GetTimeInSeconds());
m_rendertools->BeginFrame(m_rasterizer); 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,

View File

@@ -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();
}; };

View File

@@ -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);
} }

View File

@@ -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;

View File

@@ -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.
*/ */

View File

@@ -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)
{ {

View File

@@ -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);