[Bf-committers] [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 17:44:10 CEST 2010
forgot to say: I took this as an opportunity to remove the extra verbosity
when start/end BGE (cut off the extra \n so it's more compact.
2010/10/9 Dalai Felinto <dfelinto at gmail.com>
> 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);
>
>
> _______________________________________________
> Bf-blender-cvs mailing list
> Bf-blender-cvs at blender.org
> http://lists.blender.org/mailman/listinfo/bf-blender-cvs
>
More information about the Bf-committers
mailing list