[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