[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