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;
|
||||
|
||||
for(me=main->mesh.first; me; me= me->id.next)
|
||||
|
@@ -627,7 +627,7 @@ BL_Material* ConvertMaterial(
|
||||
material->transp = TF_ALPHA;
|
||||
|
||||
// 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 |= (material->mode & TF_ALPHASORT)? ZSORT: 0;
|
||||
}
|
||||
|
@@ -629,6 +629,7 @@ int main(int argc, char** argv)
|
||||
char pathname[160];
|
||||
|
||||
get_filename(argc, argv, filename);
|
||||
if(filename[0])
|
||||
make_absolute_filename(filename);
|
||||
|
||||
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 result = false;
|
||||
|
||||
RAS_Rect vp;
|
||||
KX_Scene* firstscene = *m_scenes.begin();
|
||||
const RAS_FrameSettings &framesettings = firstscene->GetFramingType();
|
||||
|
||||
// set the area used for rendering
|
||||
// set the area used for rendering (stereo can assign only a subset)
|
||||
m_rasterizer->SetRenderArea();
|
||||
|
||||
RAS_FramingManager::ComputeViewport(framesettings, m_canvas->GetDisplayArea(), vp);
|
||||
|
||||
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_rendertools->BeginFrame(m_rasterizer);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return result;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@@ -606,7 +649,7 @@ void KX_KetsjiEngine::Render()
|
||||
);
|
||||
}
|
||||
// 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);
|
||||
@@ -635,9 +678,6 @@ void KX_KetsjiEngine::Render()
|
||||
|
||||
m_rendertools->SetAuxilaryClientInfo(scene);
|
||||
|
||||
//Initialize scene viewport.
|
||||
SetupRenderFrame(scene, cam);
|
||||
|
||||
// do the rendering
|
||||
RenderFrame(scene, cam);
|
||||
}
|
||||
@@ -655,9 +695,6 @@ void KX_KetsjiEngine::Render()
|
||||
|
||||
m_rendertools->SetAuxilaryClientInfo(scene);
|
||||
|
||||
//Initialize scene viewport.
|
||||
SetupRenderFrame(scene, (*it));
|
||||
|
||||
// do the rendering
|
||||
RenderFrame(scene, (*it));
|
||||
}
|
||||
@@ -690,10 +727,6 @@ void KX_KetsjiEngine::Render()
|
||||
//pass the scene, for picking and raycasting (shadows)
|
||||
m_rendertools->SetAuxilaryClientInfo(scene);
|
||||
|
||||
//Initialize scene viewport.
|
||||
//SetupRenderFrame(scene);
|
||||
SetupRenderFrame(scene, cam);
|
||||
|
||||
// do the rendering
|
||||
//RenderFrame(scene);
|
||||
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
|
||||
// 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
|
||||
// so that we are using the latest camera position.
|
||||
|
||||
RAS_Rect viewport;
|
||||
|
||||
if (!cam)
|
||||
return;
|
||||
|
||||
if (cam->GetViewport()) {
|
||||
viewport.SetLeft(cam->GetViewportLeft());
|
||||
viewport.SetBottom(cam->GetViewportBottom());
|
||||
viewport.SetRight(cam->GetViewportRight());
|
||||
viewport.SetTop(cam->GetViewportTop());
|
||||
RAS_Rect userviewport;
|
||||
|
||||
userviewport.SetLeft(cam->GetViewportLeft());
|
||||
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 ) {
|
||||
RAS_FramingManager::ComputeViewport(
|
||||
@@ -880,24 +922,16 @@ void KX_KetsjiEngine::SetupRenderFrame(KX_Scene *scene, KX_Camera* cam)
|
||||
m_canvas->GetDisplayArea(),
|
||||
viewport
|
||||
);
|
||||
|
||||
area = m_canvas->GetDisplayArea();
|
||||
} else {
|
||||
viewport.SetLeft(0);
|
||||
viewport.SetBottom(0);
|
||||
viewport.SetRight(int(m_canvas->GetWidth()));
|
||||
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)
|
||||
@@ -951,6 +985,7 @@ void KX_KetsjiEngine::RenderShadowBuffers(KX_Scene *scene)
|
||||
// update graphics
|
||||
void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
||||
{
|
||||
RAS_Rect viewport, area;
|
||||
float left, right, bottom, top, nearfrust, farfrust, focallength;
|
||||
const float ortho = 100.0;
|
||||
// KX_Camera* cam = scene->GetActiveCamera();
|
||||
@@ -958,6 +993,15 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
||||
if (!cam)
|
||||
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
|
||||
//m_rasterizer->SetAmbient();
|
||||
m_rasterizer->DisplayFog();
|
||||
@@ -985,8 +1029,8 @@ void KX_KetsjiEngine::RenderFrame(KX_Scene* scene, KX_Camera* cam)
|
||||
|
||||
RAS_FramingManager::ComputeFrustum(
|
||||
scene->GetFramingType(),
|
||||
m_canvas->GetDisplayArea(),
|
||||
scene->GetSceneViewport(),
|
||||
area,
|
||||
viewport,
|
||||
lens,
|
||||
nearfrust,
|
||||
farfrust,
|
||||
|
@@ -177,7 +177,7 @@ private:
|
||||
/** Blue component of framing bar color. */
|
||||
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 PostRenderFrame();
|
||||
void RenderDebugProperties();
|
||||
@@ -355,6 +355,7 @@ protected:
|
||||
KX_Scene* CreateScene(const STR_String& scenename);
|
||||
|
||||
bool BeginFrame();
|
||||
void ClearFrame();
|
||||
void EndFrame();
|
||||
};
|
||||
|
||||
|
@@ -130,9 +130,6 @@ void RAS_BucketManager::OrderBuckets(const MT_Transform& cameratrans, BucketList
|
||||
sort(slots.begin(), slots.end(), fronttoback());
|
||||
}
|
||||
|
||||
//static int TOTASLOT = 0;
|
||||
//static int TOTSLOT = 0;
|
||||
|
||||
void RAS_BucketManager::RenderAlphaBuckets(
|
||||
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) {
|
||||
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));
|
||||
//TOTASLOT++;
|
||||
}
|
||||
}
|
||||
|
||||
rasty->SetDepthMask(RAS_IRasterizer::KX_DEPTHMASK_ENABLED);
|
||||
@@ -173,13 +168,14 @@ void RAS_BucketManager::RenderSolidBuckets(
|
||||
|
||||
rendertools->SetClientObject(rasty, mit->m_clientObj);
|
||||
|
||||
while ((*bit)->ActivateMaterial(cameratrans, rasty, rendertools)) {
|
||||
while ((*bit)->ActivateMaterial(cameratrans, rasty, rendertools))
|
||||
(*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
|
||||
vector<sortedmeshslot> slots;
|
||||
vector<sortedmeshslot>::iterator sit;
|
||||
@@ -198,17 +194,12 @@ void RAS_BucketManager::RenderSolidBuckets(
|
||||
void RAS_BucketManager::Renderbuckets(
|
||||
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();
|
||||
|
||||
//TOTASLOT = 0;
|
||||
//TOTSLOT = 0;
|
||||
|
||||
RenderSolidBuckets(cameratrans, rasty, rendertools);
|
||||
RenderAlphaBuckets(cameratrans, rasty, rendertools);
|
||||
|
||||
//printf("total slots = %d = %d + %d\n", TOTSLOT + TOTASLOT, TOTSLOT, TOTASLOT);
|
||||
|
||||
rendertools->SetClientObject(rasty, NULL);
|
||||
}
|
||||
|
||||
|
@@ -109,6 +109,13 @@ public :
|
||||
return m_frame_type;
|
||||
};
|
||||
|
||||
void
|
||||
SetFrameType(
|
||||
RAS_FrameType type
|
||||
) {
|
||||
m_frame_type = type;
|
||||
};
|
||||
|
||||
float
|
||||
BarRed(
|
||||
) const {
|
||||
@@ -141,14 +148,6 @@ public :
|
||||
|
||||
private :
|
||||
|
||||
/**
|
||||
* private to force use of public constructor
|
||||
*/
|
||||
|
||||
RAS_FrameSettings(
|
||||
const RAS_FrameSettings &
|
||||
);
|
||||
|
||||
RAS_FrameType m_frame_type;
|
||||
float m_bar_r;
|
||||
float m_bar_g;
|
||||
|
@@ -168,6 +168,10 @@ public:
|
||||
* BeginFrame is called at the start of each frame.
|
||||
*/
|
||||
virtual bool BeginFrame(int drawingmode, double time)=0;
|
||||
/**
|
||||
* ClearColorBuffer clears the color buffer.
|
||||
*/
|
||||
virtual void ClearColorBuffer()=0;
|
||||
/**
|
||||
* ClearDepthBuffer clears the depth buffer.
|
||||
*/
|
||||
@@ -181,7 +185,8 @@ public:
|
||||
*/
|
||||
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;
|
||||
|
||||
@@ -195,6 +200,7 @@ public:
|
||||
* @return true if stereo mode is enabled.
|
||||
*/
|
||||
virtual bool Stereo()=0;
|
||||
virtual bool InterlacedStereo()=0;
|
||||
/**
|
||||
* Sets which eye buffer subsequent primitives will be rendered to.
|
||||
*/
|
||||
|
@@ -105,8 +105,12 @@ bool RAS_OpenGLRasterizer::Init()
|
||||
m_ambg = 0.0f;
|
||||
m_ambb = 0.0f;
|
||||
|
||||
SetBlendingMode(GPU_BLEND_SOLID);
|
||||
SetFrontFace(true);
|
||||
glDisable(GL_BLEND);
|
||||
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);
|
||||
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
|
||||
@@ -250,22 +254,11 @@ void RAS_OpenGLRasterizer::Exit()
|
||||
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)
|
||||
{
|
||||
m_time = time;
|
||||
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
|
||||
if (m_drawingmode < KX_SOLID)
|
||||
{
|
||||
@@ -278,8 +271,12 @@ bool RAS_OpenGLRasterizer::BeginFrame(int drawingmode, double time)
|
||||
glEnable (GL_CULL_FACE);
|
||||
}
|
||||
|
||||
SetBlendingMode(GPU_BLEND_SOLID);
|
||||
SetFrontFace(true);
|
||||
glDisable(GL_BLEND);
|
||||
glDisable(GL_ALPHA_TEST);
|
||||
m_last_blendmode = GPU_BLEND_SOLID;
|
||||
|
||||
glFrontFace(GL_CCW);
|
||||
m_last_frontface = true;
|
||||
|
||||
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()
|
||||
{
|
||||
@@ -420,6 +423,10 @@ bool RAS_OpenGLRasterizer::Stereo()
|
||||
return true;
|
||||
}
|
||||
|
||||
bool RAS_OpenGLRasterizer::InterlacedStereo()
|
||||
{
|
||||
return m_stereomode == RAS_STEREO_VINTERLACE || m_stereomode == RAS_STEREO_INTERLACED;
|
||||
}
|
||||
|
||||
void RAS_OpenGLRasterizer::SetEye(const StereoEye eye)
|
||||
{
|
||||
|
@@ -88,7 +88,6 @@ class RAS_OpenGLRasterizer : public RAS_IRasterizer
|
||||
float m_focallength;
|
||||
bool m_setfocallength;
|
||||
int m_noOfScanlines;
|
||||
bool InterlacedStereo() const;
|
||||
|
||||
//motion blur
|
||||
int m_motionblur;
|
||||
@@ -131,6 +130,7 @@ public:
|
||||
virtual bool Init();
|
||||
virtual void Exit();
|
||||
virtual bool BeginFrame(int drawingmode, double time);
|
||||
virtual void ClearColorBuffer();
|
||||
virtual void ClearDepthBuffer();
|
||||
virtual void ClearCachingInfo(void);
|
||||
virtual void EndFrame();
|
||||
@@ -138,6 +138,7 @@ public:
|
||||
|
||||
virtual void SetStereoMode(const StereoMode stereomode);
|
||||
virtual bool Stereo();
|
||||
virtual bool InterlacedStereo();
|
||||
virtual void SetEye(const StereoEye eye);
|
||||
virtual StereoEye GetEye();
|
||||
virtual void SetEyeSeparation(const float eyeseparation);
|
||||
|
Reference in New Issue
Block a user