[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46639] branches/soc-2011-tomato/source/ blender: Per-track grease pencil data blocks

Sergey Sharybin sergey.vfx at gmail.com
Mon May 14 19:23:37 CEST 2012


Revision: 46639
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46639
Author:   nazgul
Date:     2012-05-14 17:23:37 +0000 (Mon, 14 May 2012)
Log Message:
-----------
Per-track grease pencil data blocks

Added support of tracks to have their own grease pencil datablock.
This is controllable by Clip/Track toggle in Grease Pencil panel
in Clip Editor.

This toggle shows whether grease pencil stroke should go to movie clip's
datablock or to active track. As soon as this toggle is switched to Track,
all further strokes would be added to active track and only strokes which
belongs to active track would be displayed on the screen.

This strokes would be relative to track's position, which means if one
made some strokes to track and started moving it, stokes would be moved
together with track.

Different tracks might share the same grease pencil datablock.

Also hide draw modes which are not supported by space clip.

Initial idea why tracks should have grease pencil datablocks was to
support easy mask creation for tracking. This seemed fastest and
easiest way to achieve mask editing for tracks.

To get mask for specified track there's function BKE_tracking_track_mask_get
which requires MovieTracking structure, track for which mask is creating and
also width and height of current overall frame. it'll return ImBuf with
mask (probably it's more like overkill, because internally it works with
single-channel value buffer and probably that's one should be passing to
libmv).

Probably hacking grease pencil in such way is not ideal solution, but that
part of code might be cleaned up further and it seems to be straightforward
to use grease pencil for such a purpose.

Note: this is commit to tomato branch, not to trunk.

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
    branches/soc-2011-tomato/source/blender/blenkernel/CMakeLists.txt
    branches/soc-2011-tomato/source/blender/blenkernel/SConscript
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
    branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
    branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c
    branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_buttons.c
    branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_edit.c
    branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_paint.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/clip_draw.c
    branches/soc-2011-tomato/source/blender/editors/space_clip/space_clip.c
    branches/soc-2011-tomato/source/blender/makesdna/DNA_space_types.h
    branches/soc-2011-tomato/source/blender/makesdna/DNA_tracking_types.h
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_movieclip.c
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_space.c
    branches/soc-2011-tomato/source/blender/makesrna/intern/rna_tracking.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2012-05-14 16:24:45 UTC (rev 46638)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2012-05-14 17:23:37 UTC (rev 46639)
@@ -77,6 +77,7 @@
 struct ImBuf *BKE_tracking_get_search_imbuf(struct ImBuf *ibuf, struct MovieTrackingTrack *track,
                                             struct MovieTrackingMarker *marker, int margin, int anchored,
                                             float pos[2], int origin[2]);
+struct ImBuf *BKE_tracking_track_mask_get(struct MovieTracking *tracking, struct MovieTrackingTrack *track, int width, int height);
 
 void BKE_track_unique_name(struct ListBase *tracksbase, struct MovieTrackingTrack *track);
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/CMakeLists.txt
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/CMakeLists.txt	2012-05-14 16:24:45 UTC (rev 46638)
+++ branches/soc-2011-tomato/source/blender/blenkernel/CMakeLists.txt	2012-05-14 17:23:37 UTC (rev 46639)
@@ -43,6 +43,7 @@
 	../../../intern/memutil
 	../../../intern/mikktspace
 	../../../intern/opennl/extern
+	../../../intern/raskter
 
 	# XXX - BAD LEVEL CALL WM_api.h
 	../windowmanager

Modified: branches/soc-2011-tomato/source/blender/blenkernel/SConscript
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/SConscript	2012-05-14 16:24:45 UTC (rev 46638)
+++ branches/soc-2011-tomato/source/blender/blenkernel/SConscript	2012-05-14 17:23:37 UTC (rev 46639)
@@ -17,6 +17,7 @@
 incs += ' #/intern/mikktspace'
 incs += ' #/intern/audaspace/intern'
 incs += ' #/intern/ffmpeg'
+incs += ' #/intern/raskter'
 
 incs += ' ' + env['BF_OPENGL_INC']
 incs += ' ' + env['BF_ZLIB_INC']

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2012-05-14 16:24:45 UTC (rev 46638)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2012-05-14 17:23:37 UTC (rev 46639)
@@ -59,6 +59,8 @@
 #include "IMB_imbuf_types.h"
 #include "IMB_imbuf.h"
 
+#include "raskter.h"
+
 #ifdef WITH_LIBMV
 #  include "libmv-capi.h"
 #else
@@ -1263,6 +1265,106 @@
 	return get_area_imbuf(ibuf, track, marker, track->search_min, track->search_max, margin, anchored, pos, origin);
 }
 
+static bGPDlayer *track_mask_gpencil_layer_get(MovieTrackingTrack *track)
+{
+	bGPDlayer *layer;
+
+	if (!track->gpd)
+		return NULL;
+
+	layer = track->gpd->layers.first;
+
+	while (layer) {
+		if (layer->flag & GP_LAYER_ACTIVE)
+			return layer;
+
+		layer = layer->next;
+	}
+
+	return NULL;
+}
+
+static void track_mask_gpencil_layer_rasterize(MovieTracking *tracking, MovieTrackingTrack *track,
+                                               bGPDlayer *layer, ImBuf *ibuf, int width, int height)
+{
+	bGPDframe *frame = layer->frames.first;
+	float *mask;
+	int x, y;
+	float aspy = 1.0f / tracking->camera.pixel_aspect;
+
+	mask = MEM_callocN(ibuf->x * ibuf->y * sizeof(float), "track mask");
+
+	while (frame) {
+		bGPDstroke *stroke = frame->strokes.first;
+
+		while (stroke) {
+			bGPDspoint *stroke_points = stroke->points;
+			float *mask_points, *fp;
+			int i;
+
+			if (stroke->flag & GP_STROKE_2DSPACE) {
+				fp = mask_points = MEM_callocN(2 * stroke->totpoints * sizeof(float),
+				                               "track mask rasterization points");
+
+				for (i = 0; i < stroke->totpoints; i++, fp += 2) {
+					fp[0] = stroke_points[i].x * width / ibuf->x - track->search_min[0];
+					fp[1] = stroke_points[i].y * height * aspy / ibuf->x - track->search_min[1];
+				}
+
+				PLX_raskterize(mask_points, stroke->totpoints, mask, ibuf->x, ibuf->y);
+
+				MEM_freeN(mask_points);
+			}
+
+			stroke = stroke->next;
+		}
+
+		frame = frame->next;
+	}
+
+	for (y = 0; y < ibuf->y; y++) {
+		for (x = 0; x < ibuf->x; x++) {
+			float *pixel = &ibuf->rect_float[4 * (y * ibuf->x + x)];
+			float val = mask[y * ibuf->x + x];
+
+			pixel[0] = val;
+			pixel[1] = val;
+			pixel[2] = val;
+			pixel[3] = 1.0f;
+		}
+	}
+
+	MEM_freeN(mask);
+
+	IMB_rect_from_float(ibuf);
+}
+
+ImBuf *BKE_tracking_track_mask_get(MovieTracking *tracking, MovieTrackingTrack *track, int width, int height)
+{
+	ImBuf *ibuf;
+	bGPDlayer *layer = track_mask_gpencil_layer_get(track);
+	int mask_width, mask_height;
+
+	/* XXX: currently copied from get_area_ibuf */
+	mask_width = (track->search_max[0] - track->search_min[0]) * width;
+	mask_height = (track->search_max[1] - track->search_min[1]) * height;
+
+	mask_width = mask_width | 1;
+	mask_height = mask_height | 1;
+
+	ibuf = IMB_allocImBuf(mask_width, mask_height, 32, IB_rect | IB_rectfloat);
+
+	if (layer) {
+		track_mask_gpencil_layer_rasterize(tracking, track, layer, ibuf, width, height);
+	}
+	else {
+		float white[4] = {1.0f, 1.0f, 1.0f, 1.0f};
+		IMB_rectfill(ibuf, white);
+	}
+
+	return ibuf;
+}
+
 #ifdef WITH_LIBMV
 
 /* Convert from float and byte RGBA to grayscale. Supports different coefficients for RGB. */

Modified: branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2012-05-14 16:24:45 UTC (rev 46638)
+++ branches/soc-2011-tomato/source/blender/blenloader/intern/readfile.c	2012-05-14 17:23:37 UTC (rev 46639)
@@ -6198,7 +6198,7 @@
 	reconstruction->cameras= newdataadr(fd, reconstruction->cameras);
 }
 
-static void direct_link_movieTracks(FileData *fd, ListBase *tracksbase)
+static void direct_link_movieTracks(FileData *fd, MovieClip *clip, ListBase *tracksbase)
 {
 	MovieTrackingTrack *track;
 
@@ -6207,6 +6207,7 @@
 	track= tracksbase->first;
 	while (track) {
 		track->markers= newdataadr(fd, track->markers);
+		track->gpd= newlibadr_us(fd, clip->id.lib, track->gpd);
 
 		track= track->next;
 	}
@@ -6225,7 +6226,7 @@
 	if (fd->movieclipmap) clip->tracking.camera.intrinsics= newmclipadr(fd, clip->tracking.camera.intrinsics);
 	else clip->tracking.camera.intrinsics= NULL;
 
-	direct_link_movieTracks(fd, &tracking->tracks);
+	direct_link_movieTracks(fd, clip, &tracking->tracks);
 	direct_link_movieReconstruction(fd, &tracking->reconstruction);
 
 	clip->tracking.act_track= newdataadr(fd, clip->tracking.act_track);
@@ -6245,7 +6246,7 @@
 
 	object= tracking->objects.first;
 	while (object) {
-		direct_link_movieTracks(fd, &object->tracks);
+		direct_link_movieTracks(fd, clip, &object->tracks);
 		direct_link_movieReconstruction(fd, &object->reconstruction);
 
 		object= object->next;

Modified: branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c	2012-05-14 16:24:45 UTC (rev 46638)
+++ branches/soc-2011-tomato/source/blender/blenloader/intern/writefile.c	2012-05-14 17:23:37 UTC (rev 46639)
@@ -2886,6 +2886,7 @@
 		write_windowmanagers(wd, &mainvar->wm);
 		write_screens  (wd, &mainvar->screen);
 	}
+	write_gpencils (wd, &mainvar->gpencil);
 	write_movieclips (wd, &mainvar->movieclip);
 	write_masks    (wd, &mainvar->mask);
 	write_scenes   (wd, &mainvar->scene);
@@ -2912,7 +2913,6 @@
 	write_nodetrees(wd, &mainvar->nodetree);
 	write_brushes  (wd, &mainvar->brush);
 	write_scripts  (wd, &mainvar->script);
-	write_gpencils (wd, &mainvar->gpencil);
 	write_libraries(wd,  mainvar->next);
 
 	if (write_user_block) {

Modified: branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_buttons.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_buttons.c	2012-05-14 16:24:45 UTC (rev 46638)
+++ branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_buttons.c	2012-05-14 17:23:37 UTC (rev 46639)
@@ -40,6 +40,7 @@
 
 #include "DNA_gpencil_types.h"
 #include "DNA_screen_types.h"
+#include "DNA_space_types.h"
 
 #include "BKE_context.h"
 #include "BKE_global.h"
@@ -236,6 +237,7 @@
 	PointerRNA gpd_ptr;
 	bGPDlayer *gpl;
 	uiLayout *col, *row;
+	SpaceClip *sc= CTX_wm_space_clip(C);
 	short v3d_stroke_opts = STROKE_OPTS_NORMAL;
 	const short is_v3d = CTX_wm_view3d(C) != NULL;
 	
@@ -244,6 +246,16 @@
 	
 	/* draw gpd settings first ------------------------------------- */
 	col = uiLayoutColumn(layout, 0);
+
+	if (sc) {
+		bScreen *screen = CTX_wm_screen(C);
+		PointerRNA sc_ptr;
+
+		RNA_pointer_create(&screen->id, &RNA_SpaceClipEditor, sc, &sc_ptr);
+		row = uiLayoutRow(col, 1);
+		uiItemR(row, &sc_ptr, "grease_pencil_source", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
+	}
+
 	/* current Grease Pencil block */
 	/* TODO: show some info about who owns this? */
 	uiTemplateID(col, C, ctx_ptr, "grease_pencil", "GPENCIL_OT_data_add", NULL, "GPENCIL_OT_data_unlink");
@@ -281,14 +293,17 @@
 	row = uiLayoutRow(col, 1);
 	uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "VIEW", NULL, ICON_NONE);
 	uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "CURSOR", NULL, ICON_NONE);
-	row = uiLayoutRow(col, 1);
-	uiLayoutSetActive(row, v3d_stroke_opts);
-	uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, ICON_NONE);
-	uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, ICON_NONE);
 
-	row = uiLayoutRow(col, 0);
-	uiLayoutSetActive(row, v3d_stroke_opts == STROKE_OPTS_V3D_ON);
-	uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, ICON_NONE);
+	if (sc == NULL) {
+		row = uiLayoutRow(col, 1);
+		uiLayoutSetActive(row, v3d_stroke_opts);
+		uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "SURFACE", NULL, ICON_NONE);
+		uiItemEnumR_string(row, &gpd_ptr, "draw_mode", "STROKE", NULL, ICON_NONE);
+
+		row = uiLayoutRow(col, 0);
+		uiLayoutSetActive(row, v3d_stroke_opts == STROKE_OPTS_V3D_ON);
+		uiItemR(row, &gpd_ptr, "use_stroke_endpoints", 0, NULL, ICON_NONE);
+	}
 }
 
 

Modified: branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_edit.c
===================================================================
--- branches/soc-2011-tomato/source/blender/editors/gpencil/gpencil_edit.c	2012-05-14 16:24:45 UTC (rev 46638)

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list