OpenGL grease pencil render
authorCampbell Barton <ideasman42@gmail.com>
Mon, 9 Nov 2009 08:03:43 +0000 (08:03 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 9 Nov 2009 08:03:43 +0000 (08:03 +0000)
Algorith: needed to add some functions since offscreen render doesn't have a context pointer
 - draw_gpencil_3dview_ext
 - gpencil_data_get_active_v3d

source/blender/editors/gpencil/drawgpencil.c
source/blender/editors/gpencil/gpencil_edit.c
source/blender/editors/include/ED_gpencil.h
source/blender/editors/space_view3d/view3d_draw.c

index 81ee23787174391775d3420da6083ad6d01b0946..dcd57efa926668d08c14b2346f113c1e4b8a605c 100644 (file)
@@ -744,22 +744,27 @@ void draw_gpencil_2dview (bContext *C, short onlyv2d)
 /* draw grease-pencil sketches to specified 3d-view assuming that matrices are already set correctly 
  * Note: this gets called twice - first time with only3d=1 to draw 3d-strokes, second time with only3d=0 for screen-aligned strokes
  */
-void draw_gpencil_3dview (bContext *C, short only3d)
+void draw_gpencil_3dview_ext (Scene *scene, ARegion *ar, short only3d)
 {
-       ARegion *ar= CTX_wm_region(C);
-       Scene *scene= CTX_data_scene(C);
        bGPdata *gpd;
        int dflag = 0;
-       
+
        /* check that we have grease-pencil stuff to draw */
-       gpd= gpencil_data_get_active(C); // XXX
-       if (gpd == NULL) return;
-       
+       gpd= gpencil_data_get_active_v3d(scene); // XXX
+       if(gpd == NULL) return;
+
        /* draw it! */
        if (only3d) dflag |= (GP_DRAWDATA_ONLY3D|GP_DRAWDATA_NOSTATUS);
        gp_draw_data(gpd, 0, 0, ar->winx, ar->winy, CFRA, dflag);
 }
 
+void draw_gpencil_3dview (bContext *C, short only3d)
+{
+       ARegion *ar= CTX_wm_region(C);
+       Scene *scene= CTX_data_scene(C);
+       draw_gpencil_3dview_ext(scene, ar, only3d);
+}
+
 /* draw grease-pencil sketches to opengl render window assuming that matrices are already set correctly */
 // XXX porting note, ogl render will probably be a window with one 3d region
 void draw_gpencil_oglrender (bContext *C)
index 8cf1affa8c6da9b149c2dcdeb9cc456e56f9f7f0..6b76c48e1bf0532d06d364d0f7e432d26ebf3b42 100644 (file)
@@ -155,6 +155,13 @@ bGPdata *gpencil_data_get_active (bContext *C)
        return (gpd_ptr) ? *(gpd_ptr) : NULL;
 }
 
+/* needed for offscreen rendering */
+bGPdata *gpencil_data_get_active_v3d (Scene *scene)
+{
+       bGPdata *gpd= scene->basact ? scene->basact->object->gpd : NULL;
+       return gpd ? gpd : scene->gpd;
+}
+
 /* ************************************************ */
 /* Panel Operators */
 
index ff95f8ce6eb005b28aeab3e885f5c7455ef281a5..31c8e93c683303eb61278d19d33a83480d516291 100644 (file)
@@ -59,6 +59,7 @@ typedef struct tGPspoint {
 
 struct bGPdata **gpencil_data_get_pointers(struct bContext *C, struct PointerRNA *ptr);
 struct bGPdata *gpencil_data_get_active(struct bContext *C);
+struct bGPdata *gpencil_data_get_active_v3d(struct Scene *scene); /* for offscreen rendering */
 
 /* ----------- Grease Pencil Operators ----------------- */
 
@@ -71,6 +72,7 @@ void ED_operatortypes_gpencil(void);
 void draw_gpencil_2dimage(struct bContext *C, struct ImBuf *ibuf);
 void draw_gpencil_2dview(struct bContext *C, short onlyv2d);
 void draw_gpencil_3dview(struct bContext *C, short only3d);
+void draw_gpencil_3dview_ext(struct Scene *scene, struct ARegion *ar, short only3d);
 void draw_gpencil_oglrender(struct bContext *C);
 
 void gpencil_panel_standard(const struct bContext *C, struct Panel *pa);
index 64ea574b0117efe394778191de24700f30c5a5ec..247800c30771681a05134f48a320032a035e9e16 100644 (file)
@@ -2009,6 +2009,14 @@ void ED_view3d_draw_offscreen(Scene *scene, View3D *v3d, ARegion *ar, int winx,
                glDisable(GL_DEPTH_TEST);
        }
 
+       /* draw grease-pencil stuff */
+       draw_gpencil_3dview_ext(scene, ar, 1);
+
+       ED_region_pixelspace(ar);
+
+       /* draw grease-pencil stuff - needed to get paint-buffer shown too (since it's 2D) */
+       draw_gpencil_3dview_ext(scene, ar, 0);
+
        GPU_free_images();
 
        /* restore size */