From 47c5b8ff269c3c365e8bc5adf5c0494bb29abf1f Mon Sep 17 00:00:00 2001 From: Kester Maddock Date: Tue, 10 Aug 2004 11:34:12 +0000 Subject: Fix blenderplayer command line option parsing. Fix stereo rendering in vertex array mode. Added sidebyside & anaglyph stereo modes. --- source/gameengine/Rasterizer/RAS_IRasterizer.h | 18 +-- .../RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp | 137 ++++++++++++--------- .../RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h | 20 ++- .../RAS_VAOpenGLRasterizer.cpp | 11 -- .../RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h | 1 - 5 files changed, 95 insertions(+), 92 deletions(-) (limited to 'source/gameengine/Rasterizer') diff --git a/source/gameengine/Rasterizer/RAS_IRasterizer.h b/source/gameengine/Rasterizer/RAS_IRasterizer.h index 21e47e12050..60edec7ada9 100644 --- a/source/gameengine/Rasterizer/RAS_IRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_IRasterizer.h @@ -61,7 +61,7 @@ public: /** * Drawing types */ - enum { + enum DrawType { KX_BOUNDINGBOX = 1, KX_WIREFRAME, KX_SOLID, @@ -72,7 +72,7 @@ public: /** * Valid SetDepthMask parameters */ - enum { + enum DepthMask { KX_DEPTHMASK_ENABLED =1, KX_DEPTHMASK_DISABLED }; @@ -87,16 +87,18 @@ public: /** * Stereo mode types */ - enum { + enum StereoMode { RAS_STEREO_NOSTEREO = 1, RAS_STEREO_QUADBUFFERED, RAS_STEREO_ABOVEBELOW, - RAS_STEREO_INTERLACED + RAS_STEREO_INTERLACED, + RAS_STEREO_ANAGLYPH, + RAS_STEREO_SIDEBYSIDE }; /** * Render pass identifiers for stereo. */ - enum { + enum StereoEye { RAS_STEREO_LEFTEYE = 1, RAS_STEREO_RIGHTEYE }; @@ -105,7 +107,7 @@ public: * SetDepthMask enables or disables writing a fragment's depth value * to the Z buffer. */ - virtual void SetDepthMask(int depthmask)=0; + virtual void SetDepthMask(DepthMask depthmask)=0; /** * SetMaterial sets the material settings for subsequent primitives * to be rendered with. @@ -145,7 +147,7 @@ public: /** * SetStereoMode will set the stereo mode */ - virtual void SetStereoMode(const int stereomode)=0; + virtual void SetStereoMode(const StereoMode stereomode)=0; /** * Stereo can be used to query if the rasterizer is in stereo mode. * @return true if stereo mode is enabled. @@ -154,7 +156,7 @@ public: /** * Sets which eye buffer subsequent primitives will be rendered to. */ - virtual void SetEye(const int eye)=0; + virtual void SetEye(const StereoEye eye)=0; /** */ virtual void SetEyeSeparation(const float eyeseparation)=0; diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp index 5f09846aa72..1a3f40491f7 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp @@ -55,11 +55,13 @@ RAS_OpenGLRasterizer::RAS_OpenGLRasterizer(RAS_ICanvas* canvas) :RAS_IRasterizer(canvas), m_2DCanvas(canvas), m_fogenabled(false), + m_time(0.0), + m_stereomode(RAS_STEREO_NOSTEREO), + m_curreye(RAS_STEREO_LEFTEYE), m_noOfScanlines(32), m_materialCachingInfo(0) { m_viewmatrix.Identity(); - m_stereomode = RAS_STEREO_NOSTEREO; } @@ -128,7 +130,6 @@ static void Myinit_gl_stuff(void) } glPolygonStipple(patc); - } @@ -144,6 +145,7 @@ bool RAS_OpenGLRasterizer::Init() m_alphaback = 0.0; glClearColor(m_redback,m_greenback,m_blueback,m_alphaback); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glShadeModel(GL_SMOOTH); @@ -257,6 +259,7 @@ void RAS_OpenGLRasterizer::Exit() glEnable(GL_CULL_FACE); glEnable(GL_DEPTH_TEST); glClearDepth(1.0); + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); glClearColor(m_redback, m_greenback, m_blueback, m_alphaback); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glDepthMask (GL_TRUE); @@ -339,29 +342,9 @@ int RAS_OpenGLRasterizer::GetDrawingMode() -void RAS_OpenGLRasterizer::SetDepthMask(int depthmask) +void RAS_OpenGLRasterizer::SetDepthMask(DepthMask depthmask) { - switch (depthmask) - { - case KX_DEPTHMASK_ENABLED: - { - glDepthMask(GL_TRUE); - //glDisable ( GL_ALPHA_TEST ); - break; - }; - case KX_DEPTHMASK_DISABLED: - { - glDepthMask(GL_FALSE); - //glAlphaFunc ( GL_GREATER, 0.0 ) ; - //glEnable ( GL_ALPHA_TEST ) ; - break; - }; - default: - { - //printf("someone made a mistake, RAS_OpenGLRasterizer::SetDepthMask(int depthmask)\n"); - exit(0); - } - } + glDepthMask(depthmask == KX_DEPTHMASK_DISABLED ? GL_FALSE : GL_TRUE); } @@ -380,47 +363,67 @@ void RAS_OpenGLRasterizer::ClearCachingInfo(void) void RAS_OpenGLRasterizer::EndFrame() { + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); m_2DCanvas->EndFrame(); } - void RAS_OpenGLRasterizer::SetRenderArea() { // only above/below stereo method needs viewport adjustment - if(m_stereomode == RAS_STEREO_ABOVEBELOW) - { - switch(m_curreye) - { - case RAS_STEREO_LEFTEYE: - // upper half of window - m_2DCanvas->GetDisplayArea().SetLeft(0); - m_2DCanvas->GetDisplayArea().SetBottom(m_2DCanvas->GetHeight() - - int(m_2DCanvas->GetHeight() - m_noOfScanlines) / 2); - - m_2DCanvas->GetDisplayArea().SetRight(int(m_2DCanvas->GetWidth())); - m_2DCanvas->GetDisplayArea().SetTop(int(m_2DCanvas->GetHeight())); - break; - case RAS_STEREO_RIGHTEYE: - // lower half of window - m_2DCanvas->GetDisplayArea().SetLeft(0); - m_2DCanvas->GetDisplayArea().SetBottom(0); - m_2DCanvas->GetDisplayArea().SetRight(int(m_2DCanvas->GetWidth())); - m_2DCanvas->GetDisplayArea().SetTop(int(m_2DCanvas->GetHeight() - m_noOfScanlines) / 2); - break; - } - } - else + switch (m_stereomode) { - // every available pixel - m_2DCanvas->GetDisplayArea().SetLeft(0); - m_2DCanvas->GetDisplayArea().SetBottom(0); - m_2DCanvas->GetDisplayArea().SetRight(int(m_2DCanvas->GetWidth())); - m_2DCanvas->GetDisplayArea().SetTop(int(m_2DCanvas->GetHeight())); + case RAS_STEREO_ABOVEBELOW: + switch(m_curreye) + { + case RAS_STEREO_LEFTEYE: + // upper half of window + m_2DCanvas->GetDisplayArea().SetLeft(0); + m_2DCanvas->GetDisplayArea().SetBottom(m_2DCanvas->GetHeight() - + int(m_2DCanvas->GetHeight() - m_noOfScanlines) / 2); + + m_2DCanvas->GetDisplayArea().SetRight(int(m_2DCanvas->GetWidth())); + m_2DCanvas->GetDisplayArea().SetTop(int(m_2DCanvas->GetHeight())); + break; + case RAS_STEREO_RIGHTEYE: + // lower half of window + m_2DCanvas->GetDisplayArea().SetLeft(0); + m_2DCanvas->GetDisplayArea().SetBottom(0); + m_2DCanvas->GetDisplayArea().SetRight(int(m_2DCanvas->GetWidth())); + m_2DCanvas->GetDisplayArea().SetTop(int(m_2DCanvas->GetHeight() - m_noOfScanlines) / 2); + break; + } + break; + case RAS_STEREO_SIDEBYSIDE: + switch (m_curreye) + { + case RAS_STEREO_LEFTEYE: + // Left half of window + m_2DCanvas->GetDisplayArea().SetLeft(0); + m_2DCanvas->GetDisplayArea().SetBottom(0); + m_2DCanvas->GetDisplayArea().SetRight(m_2DCanvas->GetWidth()/2); + m_2DCanvas->GetDisplayArea().SetTop(m_2DCanvas->GetHeight()); + break; + case RAS_STEREO_RIGHTEYE: + // Right half of window + m_2DCanvas->GetDisplayArea().SetLeft(m_2DCanvas->GetWidth()/2); + m_2DCanvas->GetDisplayArea().SetBottom(0); + m_2DCanvas->GetDisplayArea().SetRight(m_2DCanvas->GetWidth()); + m_2DCanvas->GetDisplayArea().SetTop(m_2DCanvas->GetHeight()); + break; + } + break; + default: + // every available pixel + m_2DCanvas->GetDisplayArea().SetLeft(0); + m_2DCanvas->GetDisplayArea().SetBottom(0); + m_2DCanvas->GetDisplayArea().SetRight(int(m_2DCanvas->GetWidth())); + m_2DCanvas->GetDisplayArea().SetTop(int(m_2DCanvas->GetHeight())); + break; } } -void RAS_OpenGLRasterizer::SetStereoMode(const int stereomode) +void RAS_OpenGLRasterizer::SetStereoMode(const StereoMode stereomode) { m_stereomode = stereomode; } @@ -436,14 +439,28 @@ bool RAS_OpenGLRasterizer::Stereo() } -void RAS_OpenGLRasterizer::SetEye(int eye) +void RAS_OpenGLRasterizer::SetEye(StereoEye eye) { m_curreye = eye; - if(m_stereomode == RAS_STEREO_QUADBUFFERED) { - if(m_curreye == RAS_STEREO_LEFTEYE) - glDrawBuffer(GL_BACK_LEFT); - else - glDrawBuffer(GL_BACK_RIGHT); + switch (m_stereomode) + { + case RAS_STEREO_QUADBUFFERED: + glDrawBuffer(m_curreye == RAS_STEREO_LEFTEYE ? GL_BACK_LEFT : GL_BACK_RIGHT); + break; + case RAS_STEREO_ANAGLYPH: + if (m_curreye == RAS_STEREO_LEFTEYE) + { + glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE); + m_2DCanvas->ClearBuffer(RAS_ICanvas::COLOR_BUFFER); + glColorMask(GL_FALSE, GL_FALSE, GL_TRUE, GL_FALSE); + } else { + glAccum(GL_LOAD, 1.0); + glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE); + ClearDepthBuffer(); + } + break; + default: + break; } } diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h index 509e4c63c93..4e63697b7ed 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h @@ -65,14 +65,12 @@ class RAS_OpenGLRasterizer : public RAS_IRasterizer float m_blueback; float m_alphaback; - bool m_bEXT_compiled_vertex_array; - double m_time; MT_CmMatrix4x4 m_viewmatrix; MT_Point3 m_campos; - int m_stereomode; - int m_curreye; + StereoMode m_stereomode; + StereoEye m_curreye; float m_eyeseparation; float m_focallength; int m_noOfScanlines; @@ -87,9 +85,7 @@ public: RAS_OpenGLRasterizer(RAS_ICanvas* canv); virtual ~RAS_OpenGLRasterizer(); - - - enum + /*enum DrawType { KX_BOUNDINGBOX = 1, KX_WIREFRAME, @@ -98,12 +94,12 @@ public: KX_TEXTURED }; - enum + enum DepthMask { KX_DEPTHMASK_ENABLED =1, KX_DEPTHMASK_DISABLED, - }; - virtual void SetDepthMask(int depthmask); + };*/ + virtual void SetDepthMask(DepthMask depthmask); virtual void SetMaterial(const RAS_IPolyMaterial& mat); virtual bool Init(); @@ -114,9 +110,9 @@ public: virtual void EndFrame(); virtual void SetRenderArea(); - virtual void SetStereoMode(const int stereomode); + virtual void SetStereoMode(const StereoMode stereomode); virtual bool Stereo(); - virtual void SetEye(const int eye); + virtual void SetEye(const StereoEye eye); virtual void SetEyeSeparation(const float eyeseparation); virtual void SetFocalLength(const float focallength); diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp index f78448d2cc4..f01d76bd8d2 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.cpp @@ -212,14 +212,3 @@ void RAS_VAOpenGLRasterizer::EnableTextures(bool enable) glDisableClientState(GL_TEXTURE_COORD_ARRAY); } -bool RAS_VAOpenGLRasterizer::Stereo() -{ -/* - if(m_stereomode == RAS_STEREO_NOSTEREO) - return false; - else - return true; -*/ - return false; -} - diff --git a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h index 6a44d36277b..d0fd6006ab6 100644 --- a/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h +++ b/source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_VAOpenGLRasterizer.h @@ -43,7 +43,6 @@ public: virtual bool Init(); virtual void Exit(); - virtual bool Stereo(); virtual void SetDrawingMode(int drawingmode); virtual void IndexPrimitives( const vecVertexArray& vertexarrays, -- cgit v1.2.3