[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19080] branches/blender2.5/blender/source /blender/editors: Animation Editors: Drawing stuff

Joshua Leung aligorith at gmail.com
Sun Feb 22 10:30:24 CET 2009


Revision: 19080
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19080
Author:   aligorith
Date:     2009-02-22 10:30:18 +0100 (Sun, 22 Feb 2009)

Log Message:
-----------
Animation Editors: Drawing stuff

* Added basic panels (Info, Drivers - where applicable, Modifiers) for editing active F-Curve/driver in Graph Editor. The buttons layouts here are really really rough, and have only got a few buttons to be sufficient for debugging purposes. Unfortunately, I don't have time to tweak these nicely now. 

* Fixed indention errors with Action Groups used in Material actions

* Changing mode in the Graph Editor now recalculates colours

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c
    branches/blender2.5/blender/source/blender/editors/space_action/action_draw.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c
    branches/blender2.5/blender/source/blender/editors/space_graph/graph_header.c

Modified: branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c	2009-02-22 05:55:37 UTC (rev 19079)
+++ branches/blender2.5/blender/source/blender/editors/animation/anim_channels.c	2009-02-22 09:30:18 UTC (rev 19080)
@@ -1249,8 +1249,18 @@
 		case ANIMTYPE_FCURVE: 
 		{
 			FCurve *fcu= (FCurve *)ale->data;
-			short offset= (ac->datatype != ANIMCONT_ACTION)? 18 : 0;
+			short offset;
 			
+			if (ac->datatype != ANIMCONT_ACTION) {
+				/* for now, special case for materials */
+				if (ale->ownertype == ANIMTYPE_DSMAT)
+					offset= 21;
+				else
+					offset= 18;
+			}
+			else
+				offset = 0;
+			
 			if (x >= (ACHANNEL_NAMEWIDTH-ACHANNEL_BUTTON_WIDTH)) {
 				/* toggle protection */
 				fcu->flag ^= FCURVE_PROTECTED;

Modified: branches/blender2.5/blender/source/blender/editors/space_action/action_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_action/action_draw.c	2009-02-22 05:55:37 UTC (rev 19079)
+++ branches/blender2.5/blender/source/blender/editors/space_action/action_draw.c	2009-02-22 09:30:18 UTC (rev 19080)
@@ -630,7 +630,15 @@
 					indent= 0;
 					special= -1;
 					
-					offset= (ac->datatype == ANIMCONT_DOPESHEET) ? 16 : 0;
+					if (ale->id) {
+						/* special exception for materials */
+						if (GS(ale->id->name) == ID_MA) 
+							offset= 25;
+						else
+							offset= 14;
+					}
+					else
+						offset= 0;
 					
 					/* only show expand if there are any channels */
 					if (agrp->channels.first) {
@@ -658,21 +666,17 @@
 					group= (fcu->grp) ? 1 : 0;
 					grp= fcu->grp;
 					
-					switch (ale->ownertype) {
-						case ANIMTYPE_NONE:	/* no owner */
-						case ANIMTYPE_FCURVE: 
-							offset= 0;
-							break;
-							
-						case ANIMTYPE_DSMAT: /* for now, this is special case for materials */
+					if (ale->id) {
+						/* special exception for materials */
+						if (GS(ale->id->name) == ID_MA) {
 							offset= 21;
 							indent= 1;
-							break;
-							
-						default:
+						}
+						else
 							offset= 14;
-							break;
 					}
+					else
+						offset= 0;
 					
 					if (fcu->flag & FCURVE_MUTED)
 						mute = ICON_MUTE_IPO_ON;

Modified: branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c	2009-02-22 05:55:37 UTC (rev 19079)
+++ branches/blender2.5/blender/source/blender/editors/space_graph/graph_buttons.c	2009-02-22 09:30:18 UTC (rev 19080)
@@ -79,10 +79,13 @@
 #include "graph_intern.h"	// own include
 
 
-/* ******************* view3d space & buttons ************** */
+/* ******************* graph editor space & buttons ************** */
+
 #define B_NOP		1
 #define B_REDR		2
 
+/* -------------- */
+
 static void do_graph_region_buttons(bContext *C, void *arg, int event)
 {
 	//Scene *scene= CTX_data_scene(C);
@@ -95,34 +98,156 @@
 	//WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
 }
 
-
-static void graph_panel_properties(const bContext *C, ARegion *ar, short cntrl, bAnimListElem *ale)	// GRAPH_HANDLER_SETTINGS
+static void graph_panel_properties(const bContext *C, ARegion *ar, short cntrl, bAnimListElem *ale)	
 {
+	FCurve *fcu= (FCurve *)ale->data;
 	uiBlock *block;
 	char name[128];
 
 	block= uiBeginBlock(C, ar, "graph_panel_properties", UI_EMBOSS, UI_HELV);
-	if(uiNewPanel(C, ar, block, "Properties", "Graph", 340, 30, 318, 254)==0) return;
+	if (uiNewPanel(C, ar, block, "Properties", "Graph", 340, 30, 318, 254)==0) return;
 	uiBlockSetHandleFunc(block, do_graph_region_buttons, NULL);
 
 	/* to force height */
 	uiNewPanelHeight(block, 204);
 
-	// XXX testing buttons
+	/* Info - Active F-Curve */
 	uiDefBut(block, LABEL, 1, "Active F-Curve:",					10, 200, 150, 19, NULL, 0.0, 0.0, 0, 0, "");
 	
-	getname_anim_fcurve(name, ale->id, (FCurve *)ale->data);
-	uiDefBut(block, LABEL, 1, name,					30, 180, 300, 19, NULL, 0.0, 0.0, 0, 0, "Name of Active F-Curve");
+	if (ale->id) { 
+		// icon of active blocktype - is this really necessary?
+		int icon= geticon_anim_blocktype(GS(ale->id->name));
+		
+		// xxx type of icon-but is currently "LABEL", as that one is plain...
+		uiDefIconBut(block, LABEL, 1, icon, 10, 180, 20, 19, NULL, 0, 0, 0, 0, "ID-type that F-Curve belongs to");
+	}
 	
-#if 0
-	uiBlockBeginAlign(block);
-	uiDefButF(block, NUM, B_REDR, "Spacing:",		10, 200, 140, 19, &v3d->grid, 0.001, 100.0, 10, 0, "Set the distance between grid lines");
-	uiDefButS(block, NUM, B_REDR, "Lines:",		10, 180, 140, 19, &v3d->gridlines, 0.0, 100.0, 100, 0, "Set the number of grid lines in perspective view");
-	uiDefButS(block, NUM, B_REDR, "Divisions:",		10, 160, 140, 19, &v3d->gridsubdiv, 1.0, 100.0, 100, 0, "Set the number of grid lines");
-	uiBlockEndAlign(block);
-#endif
+	getname_anim_fcurve(name, ale->id, fcu);
+	uiDefBut(block, LABEL, 1, name,	30, 180, 300, 19, NULL, 0.0, 0.0, 0, 0, "Name of Active F-Curve");
+	
+	/* TODO: the following settings could be added here
+	 *	- F-Curve coloring mode - mode selector + color selector
+	 *	- Access details (ID-block + RNA-Path + Array Index)
+	 *	- ...
+	 */
 }
 
+/* -------------- */
+
+#define B_IPO_DEPCHANGE 	10
+
+static void do_graph_region_driver_buttons(bContext *C, void *arg, int event)
+{
+	Scene *scene= CTX_data_scene(C);
+	
+	switch(event) {
+		case B_IPO_DEPCHANGE:
+		{
+			/* rebuild depsgraph for the new deps */
+			DAG_scene_sort(scene);
+			
+			/* TODO: which one? we need some way of sending these updates since curves from non-active ob could be being edited */
+			//DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+			//DAG_object_flush_update(scene, ob, OB_RECALC_OB);
+		}
+			break;
+	}
+	
+	/* default for now */
+	//WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
+}
+
+static void graph_panel_drivers(const bContext *C, ARegion *ar, short cntrl, bAnimListElem *ale)	
+{
+	FCurve *fcu= (FCurve *)ale->data;
+	ChannelDriver *driver= fcu->driver;
+	uiBlock *block;
+	uiBut *but;
+	int len;
+
+	block= uiBeginBlock(C, ar, "graph_panel_drivers", UI_EMBOSS, UI_HELV);
+	if (uiNewPanel(C, ar, block, "Drivers", "Graph", 340, 30, 318, 254)==0) return;
+	uiBlockSetHandleFunc(block, do_graph_region_driver_buttons, NULL);
+
+	/* to force height */
+	uiNewPanelHeight(block, 204);
+	
+	/* type */
+	uiDefBut(block, LABEL, 1, "Type:",					10, 200, 120, 20, NULL, 0.0, 0.0, 0, 0, "");
+	uiDefButI(block, MENU, B_IPO_DEPCHANGE,
+					"Driver Type%t|Transform Channel%x0|Scripted Expression%x1|Rotational Difference%x2", 
+					130,200,180,20, &driver->type, 0, 0, 0, 0, "Driver type");
+					
+	/* buttons to draw depends on type of driver */
+	if (driver->type == DRIVER_TYPE_PYTHON) { /* PyDriver */
+		uiDefBut(block, TEX, B_REDR, "Expr: ", 10,160,300,20, driver->expression, 0, 255, 0, 0, "One-liner Python Expression to use as Scripted Expression");
+		
+		if (driver->flag & DRIVER_FLAG_INVALID) {
+			uiDefIconBut(block, LABEL, 1, ICON_ERROR, 10, 140, 20, 19, NULL, 0, 0, 0, 0, "");
+			uiDefBut(block, LABEL, 0, "Error: invalid Python expression",
+					30,140,230,19, NULL, 0, 0, 0, 0, "");
+		}
+	}
+	else { /* Channel or RotDiff - RotDiff just has extra settings */
+		/* Driver Object */
+		but= uiDefBut(block, TEX, B_IPO_DEPCHANGE, "OB: ",	10,160,150,20, driver->id->name+2, 0.0, 21.0, 0, 0, "Object that controls this Driver.");
+		uiButSetFunc(but, test_idbutton_cb, driver->id->name, NULL);
+		
+		// XXX should we hide these technical details?
+		if (driver->id) {
+			/* Array Index */
+			// XXX ideally this is grouped with the path, but that can get quite long...
+			uiDefButI(block, NUM, B_IPO_DEPCHANGE, "Index: ", 170,160,140,20, &driver->array_index, 0, INT_MAX, 0, 0, "Index to the specific property used as Driver if applicable.");
+			
+			/* RNA-Path - allocate if non-existant */
+			if (driver->rna_path == NULL) {
+				driver->rna_path= MEM_callocN(256, "Driver RNA-Path");
+				len= 255;
+			}
+			else
+				len= strlen(driver->rna_path);
+			uiDefBut(block, TEX, B_IPO_DEPCHANGE, "Path: ", 10,130,300,20, driver->rna_path, 0, len, 0, 0, "RNA Path (from Driver Object) to property used as Driver.");
+		}
+		
+		/* for rotational difference, show second target... */
+		if (driver->type == DRIVER_TYPE_ROTDIFF) {
+			// TODO...
+		}
+	}
+}
+
+/* -------------- */
+
+static void do_graph_region_modifier_buttons(bContext *C, void *arg, int event)
+{
+	//Scene *scene= CTX_data_scene(C);
+	
+	switch(event) {
+
+	}
+	
+	/* default for now */
+	//WM_event_add_notifier(C, NC_OBJECT|ND_TRANSFORM, ob);
+}
+
+static void graph_panel_modifiers(const bContext *C, ARegion *ar, short cntrl, bAnimListElem *ale)	
+{
+	//FCurve *fcu= (FCurve *)ale->data;
+	//FModifier *fcm;
+	uiBlock *block;
+
+	block= uiBeginBlock(C, ar, "graph_panel_modifiers", UI_EMBOSS, UI_HELV);
+	if (uiNewPanel(C, ar, block, "Modifiers", "Graph", 340, 30, 318, 254)==0) return;
+	uiBlockSetHandleFunc(block, do_graph_region_modifier_buttons, NULL);
+
+	/* to force height */
+	uiNewPanelHeight(block, 204); // XXX variable height!
+	
+	
+}
+
+/* -------------- */
+
 /* Find 'active' F-Curve. It must be editable, since that's the purpose of these buttons (subject to change).  
  * We return the 'wrapper' since it contains valuable context info (about hierarchy), which will need to be freed 
  * when the caller is done with it.
@@ -169,13 +294,16 @@
 	if (ale == NULL) 
 		return;	
 		
-		// XXX temp panel for testing
+	/* for now, the properties panel displays info about the selected channels */
 	graph_panel_properties(C, ar, 0, ale);
 	
 	/* driver settings for active F-Curve (only for 'Drivers' mode) */
-	if (sipo->mode == SIPO_MODE_DRIVERS) {
-		//graph_panel_drivers(C, ar, 0);
-	}
+	if (sipo->mode == SIPO_MODE_DRIVERS)
+		graph_panel_drivers(C, ar, 0, ale);
+	
+	/* modifiers */
+	graph_panel_modifiers(C, ar, 0, ale);
+	
 
 	uiDrawPanels(C, 1);		/* 1 = align */
 	uiMatchPanelsView2d(ar); /* sets v2d->totrct */

Modified: branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_graph/graph_draw.c	2009-02-22 05:55:37 UTC (rev 19079)

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list