[Bf-codereview] Extra Anaglyph Modes for BGE (issue 5596044)
dfelinto at gmail.com
dfelinto at gmail.com
Sun Jan 29 08:53:50 CET 2012
Reviewers: bf-codereview_blender.org,
Description:
This patch adds a "glass colour" enum to the Anaglyph stereo interface.
Now Red-Cyan is the default, but it supports too green-magenta (I never
saw one of those but I know they are out there) and red-magenta.
I ordered a red-magenta glass for a project that should arrive next
week.
Once I test this patch with the real thing I will try to push it to a
commit (despite our lovely bcon3 feature freeze status).
As for the patch:
1) it can/should probably initialize anaglyphmode in scene.c
(blenkernel) but the default is 0 (red-cyan) so I don't know if it's
necessary.
2) instead of creating new RAS_ defines I hardcoded the values. I'm one
to point fingers when people do that but it sounds a bit overkill for
this case. Thoughts?
3) I have a version of this patch that supports setting it through
python. It works nice but I may be the only person that needs that
changing in realtime :) so I'm not including this in the patch.
Please review this at http://codereview.appspot.com/5596044/
Affected files:
release/scripts/startup/bl_ui/properties_game.py
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_scene.c
source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
source/gameengine/GamePlayer/ghost/GPG_Application.cpp
source/gameengine/Rasterizer/RAS_IRasterizer.h
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
Index: release/scripts/startup/bl_ui/properties_game.py
===================================================================
--- release/scripts/startup/bl_ui/properties_game.py (revision 43737)
+++ release/scripts/startup/bl_ui/properties_game.py (working copy)
@@ -312,6 +312,8 @@
# stereo:
if stereo_mode == 'STEREO':
layout.prop(gs, "stereo_mode")
+ if gs.stereo_mode == 'ANAGLYPH':
+ layout.prop(gs, "anaglyph_mode")
layout.prop(gs, "stereo_eye_separation")
# dome:
Index: source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp (revision
43737)
+++ source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp (working copy)
@@ -345,6 +345,9 @@
if (scene->gm.stereomode != RAS_IRasterizer::RAS_STEREO_QUADBUFFERED)
rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode)
scene->gm.stereomode);
+ if (scene->gm.stereomode == RAS_IRasterizer::RAS_STEREO_ANAGLYPH)
+ rasterizer->SetAnaglyphColor(scene->gm.anaglyphmode);
+
rasterizer->SetEyeSeparation(scene->gm.eyeseparation);
}
Index: source/gameengine/GamePlayer/ghost/GPG_Application.cpp
===================================================================
--- source/gameengine/GamePlayer/ghost/GPG_Application.cpp (revision 43737)
+++ source/gameengine/GamePlayer/ghost/GPG_Application.cpp (working copy)
@@ -592,7 +592,8 @@
/* Stereo parameters - Eye Separation from the UI - stereomode from the
command-line/UI */
m_rasterizer->SetStereoMode((RAS_IRasterizer::StereoMode) stereoMode);
- m_rasterizer->SetEyeSeparation(m_startScene->gm.eyeseparation);
+ m_rasterizer->SetAnaglyphColor(gm->anaglyphmode);
+ m_rasterizer->SetEyeSeparation(gm->eyeseparation);
if (!m_rasterizer)
goto initFailed;
Index: source/gameengine/Rasterizer/RAS_IRasterizer.h
===================================================================
--- source/gameengine/Rasterizer/RAS_IRasterizer.h (revision 43737)
+++ source/gameengine/Rasterizer/RAS_IRasterizer.h (working copy)
@@ -207,6 +207,10 @@
virtual bool Stereo()=0;
virtual StereoMode GetStereoMode()=0;
virtual bool InterlacedStereo()=0;
+ /**
+ * SetAnaglyphColor will set the anaglyph color (e.g. red-cyan)
+ */
+ virtual void SetAnaglyphColor(const short anaglyphmode)=0;
/**
* Sets which eye buffer subsequent primitives will be rendered to.
*/
Index:
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
===================================================================
---
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
(revision 43737)
+++
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.cpp
(working copy)
@@ -103,6 +103,9 @@
}
hinterlace_mask[32] = 0;
+ /* initialize the anaglyph mode to red-cyan*/
+ SetAnaglyphColor(0);
+
m_prevafvalue = GPU_get_anisotropic();
}
@@ -500,7 +503,41 @@
break;
}
}
-
+
+void RAS_OpenGLRasterizer::SetAnaglyphColor(const short anaglyph_mode)
+{
+ switch(anaglyph_mode) {
+ case 1: // Green-Magenta
+ m_anaglyphleft[0] = GL_FALSE;
+ m_anaglyphleft[1] = GL_TRUE;
+ m_anaglyphleft[2] = GL_FALSE;
+
+ m_anaglyphright[0] = GL_TRUE;
+ m_anaglyphright[1] = GL_FALSE;
+ m_anaglyphright[2] = GL_TRUE;
+ break;
+ case 2: // Magenta-Green
+ m_anaglyphleft[0] = GL_TRUE;
+ m_anaglyphleft[1] = GL_FALSE;
+ m_anaglyphleft[2] = GL_TRUE;
+
+ m_anaglyphright[0] = GL_FALSE;
+ m_anaglyphright[1] = GL_TRUE;
+ m_anaglyphright[2] = GL_FALSE;
+ break;
+ case 0: // Red-Cyan
+ default:
+ m_anaglyphleft[0] = GL_TRUE;
+ m_anaglyphleft[1] = GL_FALSE;
+ m_anaglyphleft[2] = GL_FALSE;
+
+ m_anaglyphright[0] = GL_FALSE;
+ m_anaglyphright[1] = GL_TRUE;
+ m_anaglyphright[2] = GL_TRUE;
+ break;
+ }
+}
+
void RAS_OpenGLRasterizer::SetStereoMode(const StereoMode stereomode)
{
m_stereomode = stereomode;
@@ -535,10 +572,9 @@
case RAS_STEREO_ANAGLYPH:
if (m_curreye == RAS_STEREO_LEFTEYE)
{
- glColorMask(GL_FALSE, GL_TRUE, GL_TRUE, GL_FALSE);
+ glColorMask(m_anaglyphleft[0], m_anaglyphleft[1], m_anaglyphleft[2],
GL_FALSE);
} else {
- //glAccum(GL_LOAD, 1.0);
- glColorMask(GL_TRUE, GL_FALSE, GL_FALSE, GL_FALSE);
+ glColorMask(m_anaglyphright[0], m_anaglyphright[1],
m_anaglyphright[2], GL_FALSE);
ClearDepthBuffer();
}
break;
Index:
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
===================================================================
---
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
(revision 43737)
+++
source/gameengine/Rasterizer/RAS_OpenGLRasterizer/RAS_OpenGLRasterizer.h
(working copy)
@@ -90,6 +90,9 @@
MT_Point3 m_campos;
bool m_camortho;
+ bool m_anaglyphleft [3];
+ bool m_anaglyphright [3];
+
StereoMode m_stereomode;
StereoEye m_curreye;
float m_eyeseparation;
@@ -146,6 +149,7 @@
virtual void EndFrame();
virtual void SetRenderArea();
+ virtual void SetAnaglyphColor(const short anaglyph_mode);
virtual void SetStereoMode(const StereoMode stereomode);
virtual RAS_IRasterizer::StereoMode GetStereoMode();
virtual bool Stereo();
Index: source/blender/makesdna/DNA_scene_types.h
===================================================================
--- source/blender/makesdna/DNA_scene_types.h (revision 43737)
+++ source/blender/makesdna/DNA_scene_types.h (working copy)
@@ -600,6 +600,9 @@
struct GameDome dome;
short stereoflag, stereomode;
float eyeseparation;
+ short anaglyphmode;
+ short pad5[3];
+
RecastData recastData;
@@ -638,6 +641,11 @@
#define STEREO_VINTERLACE 7
//#define STEREO_DOME 8
+/* anaglyph */
+#define ANAGLYPH_REDCYAN 0
+#define ANAGLYPH_GREENMAGENTA 1
+#define ANAGLYPH_MAGENTAGREEN 2
+
/* physicsEngine */
#define WOPHY_NONE 0
#define WOPHY_ENJI 1
Index: source/blender/makesrna/intern/rna_scene.c
===================================================================
--- source/blender/makesrna/intern/rna_scene.c (revision 43737)
+++ source/blender/makesrna/intern/rna_scene.c (working copy)
@@ -2255,6 +2255,12 @@
{STEREO_DOME, "DOME", 0, "Dome", "Enable Dome environment"},
{0, NULL, 0, NULL, NULL}};
+ static EnumPropertyItem anaglyph_items[] ={
+ {ANAGLYPH_REDCYAN, "REDCYAN", 0, "Red-Cyan", ""},
+ {ANAGLYPH_GREENMAGENTA, "GREENMAGENTA", 0, "Green-Magenta", ""},
+ {ANAGLYPH_MAGENTAGREEN, "MAGENTAGREEN", 0, "Magenta-Green", ""},
+ {0, NULL, 0, NULL, NULL}};
+
static EnumPropertyItem physics_engine_items[] = {
{WOPHY_NONE, "NONE", 0, "None", "Don't use a physics engine"},
//{WOPHY_ENJI, "ENJI", 0, "Enji", ""},
@@ -2362,6 +2368,12 @@
"Set the distance between the eyes - the camera
focal length/30 should be fine");
RNA_def_property_update(prop, NC_SCENE, NULL);
+ prop= RNA_def_property(srna, "anaglyph_mode", PROP_ENUM, PROP_NONE);
+ RNA_def_property_enum_sdna(prop, NULL, "anaglyphmode");
+ RNA_def_property_enum_items(prop, anaglyph_items);
+ RNA_def_property_ui_text(prop, "Glass Colors", "");
+ RNA_def_property_update(prop, NC_SCENE, NULL);
+
/* Dome */
prop= RNA_def_property(srna, "dome_mode", PROP_ENUM, PROP_NONE);
RNA_def_property_enum_sdna(prop, NULL, "dome.mode");
More information about the Bf-codereview
mailing list