[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [32387] trunk/blender/source/gameengine/ BlenderRoutines: patch [#24178] bge.render. makeScreeshot - with help from Campbell(ideasman42)

Dalai Felinto dfelinto at gmail.com
Sat Oct 9 15:46:34 CEST 2010


Revision: 32387
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=32387
Author:   dfelinto
Date:     2010-10-09 15:46:34 +0200 (Sat, 09 Oct 2010)

Log Message:
-----------
patch [#24178] bge.render.makeScreeshot - with help from Campbell(ideasman42)
This patch brings back the old functionality from Blender 2.49.
However we are forcing the format to be PNG only (as we had previously on blenderplayer).

Note: If letterboxing is on, we are recording only the camera area of the canvas (cool hein?).
Note2: I have a feeling that this is faster than what we had in 2.49 (which was really slow imo). Maybe it could be even faster if we disable PNG compression. Maybe an option for the future.

* patch finalized and committed as part of the BlenderPRO 2010 - BGE development workshop :) *

Modified Paths:
--------------
    trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
    trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h

Modified: trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2010-10-09 10:45:25 UTC (rev 32386)
+++ trunk/blender/source/gameengine/BlenderRoutines/BL_KetsjiEmbedStart.cpp	2010-10-09 13:46:34 UTC (rev 32387)
@@ -425,7 +425,7 @@
 				ketsjiengine->SetAnimFrameRate(FPS);
 				
 				// the mainloop
-				printf("\nBlender Game Engine Started\n\n");
+				printf("\nBlender Game Engine Started\n");
 				while (!exitrequested)
 				{
 					// first check if we want to exit
@@ -472,7 +472,7 @@
 					}
 					
 				}
-				printf("\nBlender Game Engine Finished\n\n");
+				printf("Blender Game Engine Finished\n");
 				exitstring = ketsjiengine->GetExitString();
 
 

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp	2010-10-09 10:45:25 UTC (rev 32386)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderCanvas.cpp	2010-10-09 13:46:34 UTC (rev 32387)
@@ -203,5 +203,11 @@
 
 void KX_BlenderCanvas::MakeScreenShot(const char* filename)
 {
-//	BL_MakeScreenShot(m_ar, filename);
+	ScrArea area_dummy= {0};
+	area_dummy.totrct.xmin = m_frame_rect.GetLeft();
+	area_dummy.totrct.xmax = m_frame_rect.GetRight();
+	area_dummy.totrct.ymin = m_frame_rect.GetBottom();
+	area_dummy.totrct.ymax = m_frame_rect.GetTop();
+
+	BL_MakeScreenShot(&area_dummy, filename);
 }

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp	2010-10-09 10:45:25 UTC (rev 32386)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.cpp	2010-10-09 13:46:34 UTC (rev 32387)
@@ -49,6 +49,8 @@
 
 #include "GL/glew.h"
 
+#include "MEM_guardedalloc.h"
+
 #include "BL_Material.h" // MAXTEX
 
 /* Data types encoding the game world: */
@@ -68,7 +70,11 @@
 #include "BKE_bmfont.h"
 #include "BKE_image.h"
 
+#include "BLI_path_util.h"
+
 extern "C" {
+#include "IMB_imbuf_types.h"
+#include "IMB_imbuf.h"
 #include "WM_api.h"
 #include "WM_types.h"
 #include "wm_event_system.h"
@@ -206,18 +212,53 @@
 }
 #define MAX_FILE_LENGTH 512
 
+/* get shot from frontbuffer sort of a copy from screendump.c */
+static unsigned int *screenshot(ScrArea *curarea, int *dumpsx, int *dumpsy)
+{
+	int x=0, y=0;
+	unsigned int *dumprect= NULL;
+	
+	x= curarea->totrct.xmin;
+	y= curarea->totrct.ymin;
+	*dumpsx= curarea->totrct.xmax-x;
+	*dumpsy= curarea->totrct.ymax-y;
 
-void BL_MakeScreenShot(struct ARegion *ar, const char* filename)
+	if (*dumpsx && *dumpsy) {
+		
+		dumprect= (unsigned int *)MEM_mallocN(sizeof(int) * (*dumpsx) * (*dumpsy), "dumprect");
+		glReadBuffer(GL_FRONT);
+		glReadPixels(x, y, *dumpsx, *dumpsy, GL_RGBA, GL_UNSIGNED_BYTE, dumprect);
+		glFinish();
+		glReadBuffer(GL_BACK);
+	}
+
+	return dumprect;
+}
+
+/* based on screendump.c::screenshot_exec */
+void BL_MakeScreenShot(ScrArea *curarea, const char* filename)
 {
-	char copyfilename[MAX_FILE_LENGTH];
-	strcpy(copyfilename,filename);
+	char path[MAX_FILE_LENGTH];
+	strcpy(path,filename);
 
-	// filename read - only
+	unsigned int *dumprect;
+	int dumpsx, dumpsy;
 	
-	  /* XXX will need to change at some point */
-	//XXX BIF_screendump(0);
+	dumprect= screenshot(curarea, &dumpsx, &dumpsy);
+	if(dumprect) {
+		ImBuf *ibuf;
+		BLI_path_abs(path, G.sce);
+		/* BKE_add_image_extension() checks for if extension was already set */
+		BKE_add_image_extension(path, R_PNG); /* scene->r.imtype */
+		ibuf= IMB_allocImBuf(dumpsx, dumpsy, 24, 0, 0);
+		ibuf->rect= dumprect;
+		ibuf->ftype= PNG;
 
-	// write+read filename
-	//XXX write_screendump((char*) copyfilename);
+		IMB_saveiff(ibuf, path, IB_rect);
+
+		ibuf->rect= NULL;
+		IMB_freeImBuf(ibuf);
+		MEM_freeN(dumprect);
+	}
 }
 

Modified: trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h
===================================================================
--- trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h	2010-10-09 10:45:25 UTC (rev 32386)
+++ trunk/blender/source/gameengine/BlenderRoutines/KX_BlenderGL.h	2010-10-09 13:46:34 UTC (rev 32387)
@@ -41,7 +41,7 @@
 
 void	BL_warp_pointer(struct wmWindow *win,int x,int y);
 
-void	BL_MakeScreenShot(struct ARegion *ar, const char* filename);
+void	BL_MakeScreenShot(struct ScrArea *curarea, const char* filename);
 
 void	BL_HideMouse(struct wmWindow *win);
 void	BL_NormalMouse(struct wmWindow *win);





More information about the Bf-blender-cvs mailing list