[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [16732] branches/harmonic-skeleton/source/ blender: Keep persistent results for retargeting.

Martin Poirier theeth at yahoo.com
Thu Sep 25 22:29:15 CEST 2008


Revision: 16732
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=16732
Author:   theeth
Date:     2008-09-25 22:29:15 +0200 (Thu, 25 Sep 2008)

Log Message:
-----------
Keep persistent results for retargeting. Easier weight adjustement.

Will have to do a second pass tomorrow to fix some leftovers.

Modified Paths:
--------------
    branches/harmonic-skeleton/source/blender/blenlib/BLI_threads.h
    branches/harmonic-skeleton/source/blender/blenlib/intern/threads.c
    branches/harmonic-skeleton/source/blender/include/BIF_editarmature.h
    branches/harmonic-skeleton/source/blender/src/autoarmature.c
    branches/harmonic-skeleton/source/blender/src/buttons_editing.c
    branches/harmonic-skeleton/source/blender/src/usiblender.c

Modified: branches/harmonic-skeleton/source/blender/blenlib/BLI_threads.h
===================================================================
--- branches/harmonic-skeleton/source/blender/blenlib/BLI_threads.h	2008-09-25 18:36:34 UTC (rev 16731)
+++ branches/harmonic-skeleton/source/blender/blenlib/BLI_threads.h	2008-09-25 20:29:15 UTC (rev 16732)
@@ -45,6 +45,7 @@
 void	BLI_insert_thread	(struct ListBase *threadbase, void *callerdata);
 void	BLI_remove_thread	(struct ListBase *threadbase, void *callerdata);
 void	BLI_remove_thread_index(struct ListBase *threadbase, int index);
+void	BLI_remove_threads(struct ListBase *threadbase);
 void	BLI_end_threads		(struct ListBase *threadbase);
 
 void	BLI_lock_thread		(int type);

Modified: branches/harmonic-skeleton/source/blender/blenlib/intern/threads.c
===================================================================
--- branches/harmonic-skeleton/source/blender/blenlib/intern/threads.c	2008-09-25 18:36:34 UTC (rev 16731)
+++ branches/harmonic-skeleton/source/blender/blenlib/intern/threads.c	2008-09-25 20:29:15 UTC (rev 16732)
@@ -216,6 +216,20 @@
 	}
 }
 
+void BLI_remove_threads(ListBase *threadbase)
+{
+	ThreadSlot *tslot;
+	
+	for(tslot = threadbase->first; tslot; tslot = tslot->next) {
+		if (tslot->avail == 0) {
+			tslot->callerdata = NULL;
+			pthread_join(tslot->pthread, NULL);
+			tslot->avail = 1;
+			break;
+		}
+	}
+}
+
 void BLI_end_threads(ListBase *threadbase)
 {
 	ThreadSlot *tslot;
@@ -336,7 +350,7 @@
 
 void BLI_end_worker(ThreadedWorker *worker)
 {
-	BLI_end_threads(&worker->threadbase);
+	BLI_remove_threads(&worker->threadbase);
 }
 
 void BLI_destroy_worker(ThreadedWorker *worker)

Modified: branches/harmonic-skeleton/source/blender/include/BIF_editarmature.h
===================================================================
--- branches/harmonic-skeleton/source/blender/include/BIF_editarmature.h	2008-09-25 18:36:34 UTC (rev 16731)
+++ branches/harmonic-skeleton/source/blender/include/BIF_editarmature.h	2008-09-25 20:29:15 UTC (rev 16732)
@@ -148,6 +148,9 @@
 
 /* from autoarmature */
 void BIF_retargetArmature();
+void BIF_adjustRetarget();
+void BIF_freeRetarget();
+
 struct ReebArc;
 float calcVariance(struct ReebArc *arc, int start, int end, float v0[3], float n[3]);
 float calcDistance(struct ReebArc *arc, int start, int end, float head[3], float tail[3]);

Modified: branches/harmonic-skeleton/source/blender/src/autoarmature.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/autoarmature.c	2008-09-25 18:36:34 UTC (rev 16731)
+++ branches/harmonic-skeleton/source/blender/src/autoarmature.c	2008-09-25 20:29:15 UTC (rev 16732)
@@ -96,7 +96,7 @@
 	struct RigNode *head;
 	ReebGraph *link_mesh;
 	
-	ListBase *editbones;
+	ListBase editbones;
 	
 	ListBase controls;
 	struct ThreadedWorker *worker;
@@ -197,6 +197,9 @@
 	ARC_USED = 2
 } ArcUsageFlags;
 
+
+RigGraph *GLOBAL_RIGG = NULL;
+
 /*******************************************************************************************************/
 
 void *exec_retargetArctoArc(void *param);
@@ -291,6 +294,12 @@
 	BNode *node;
 	BArc *arc;
 	
+#ifdef USE_THREADS
+	BLI_destroy_worker(((RigGraph*)rg)->worker);
+#endif
+	
+	REEB_freeGraph(((RigGraph*)rg)->link_mesh);
+	
 	for (arc = rg->arcs.first; arc; arc = arc->next)
 	{
 		RIG_freeRigArc(arc);
@@ -299,7 +308,7 @@
 	
 	for (node = rg->nodes.first; node; node = node->next)
 	{
-		BLI_freeNode((BGraph*)rg, (BNode*)node);
+		BLI_freeNode(rg, (BNode*)node);
 	}
 	BLI_freelistN(&rg->nodes);
 	
@@ -308,7 +317,7 @@
 	BLI_ghash_free(((RigGraph*)rg)->bones_map, NULL, NULL);
 	BLI_ghash_free(((RigGraph*)rg)->controls_map, NULL, NULL);
 	
-	BLI_freelistN(((RigGraph*)rg)->editbones);
+	BLI_freelistN(&((RigGraph*)rg)->editbones);
 	
 	MEM_freeN(rg);
 }
@@ -1244,21 +1253,21 @@
 
 /*******************************************************************************************************/
 
-static RigGraph *armatureToGraph(Object *ob, ListBase *list)
+static RigGraph *armatureToGraph(Object *ob, bArmature *arm)
 {
 	EditBone *ebone;
 	RigGraph *rg;
  	
 	rg = newRigGraph();
 	
-	rg->editbones = list;	
+	make_boneList(&rg->editbones, &arm->bonebase, NULL);
 	rg->ob = ob;
 
 	/* Do the rotations */
-	for (ebone = list->first; ebone; ebone=ebone->next){
+	for (ebone = rg->editbones.first; ebone; ebone=ebone->next){
 		if (ebone->parent == NULL)
 		{
-			RIG_arcFromBoneChain(rg, list, ebone, NULL);
+			RIG_arcFromBoneChain(rg, &rg->editbones, ebone, NULL);
 		}
 	}
 	
@@ -1334,7 +1343,7 @@
 		int total = 0;
 		int boneStart = iter.start;
 		
-		parent = add_editbonetolist("Bone", rigg->editbones);
+		parent = add_editbonetolist("Bone", &rigg->editbones);
 		parent->flag = BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
 		VECCOPY(parent->head, head->p);
 		
@@ -1383,7 +1392,7 @@
 			{
 				VECCOPY(parent->tail, btail);
 
-				child = add_editbonetolist("Bone", rigg->editbones);
+				child = add_editbonetolist("Bone", &rigg->editbones);
 				VECCOPY(child->head, parent->tail);
 				child->parent = parent;
 				child->flag |= BONE_CONNECTED|BONE_SELECTED|BONE_TIPSEL|BONE_ROOTSEL;
@@ -2797,6 +2806,28 @@
 	}
 }
 
+static void adjustGraphs(RigGraph *rigg)
+{
+	RigArc *arc;
+	
+	for (arc = rigg->arcs.first; arc; arc = arc->next)
+	{
+		if (arc->link_mesh)
+		{
+			retargetArctoArc(rigg, arc, arc->head);
+		}
+	}
+
+#ifdef USE_THREADS
+	BLI_end_worker(rigg->worker);
+#endif
+
+	/* Turn the list into an armature */
+	editbones_to_armature(&rigg->editbones, rigg->ob);
+	
+	BIF_undo_push("Retarget Skeleton");
+}
+
 static void retargetGraphs(RigGraph *rigg)
 {
 	ReebGraph *reebg = rigg->link_mesh;
@@ -2816,14 +2847,15 @@
 	
 	//generateMissingArcs(rigg);
 	
-	/* Turn the list into an armature */
-	editbones_to_armature(rigg->editbones, rigg->ob);
-	
 #ifdef USE_THREADS
-	BLI_destroy_worker(rigg->worker);
+	BLI_end_worker(rigg->worker);
 #endif
+
+	/* Turn the list into an armature */
+	editbones_to_armature(&rigg->editbones, rigg->ob);
 }
 
+
 void BIF_retargetArmature()
 {
 	Object *ob;
@@ -2851,18 +2883,16 @@
 			if (ob->type==OB_ARMATURE)
 			{
 				RigGraph *rigg;
-				ListBase  list;
 				bArmature *arm;
 			 	
 				arm = ob->data;
 			
 				/* Put the armature into editmode */
-				list.first= list.last = NULL;
-				make_boneList(&list, &arm->bonebase, NULL);
+				
 			
 				start_time = PIL_check_seconds_timer();
 	
-				rigg = armatureToGraph(ob, &list);
+				rigg = armatureToGraph(ob, arm);
 				
 				end_time = PIL_check_seconds_timer();
 				rig_time = end_time - start_time;
@@ -2882,12 +2912,14 @@
 				end_time = PIL_check_seconds_timer();
 				retarget_time = end_time - start_time;
 
-				RIG_freeRigGraph((BGraph*)rigg);
+				BIF_freeRetarget();
+				
+				GLOBAL_RIGG = rigg;
+				
+				break; /* only one armature at a time */
 			}
 		}
 	}
-
-	REEB_freeGraph(reebg);
 	
 	gend_time = PIL_check_seconds_timer();
 
@@ -2902,7 +2934,22 @@
 	
 	BIF_undo_push("Retarget Skeleton");
 	
-	exit_editmode(EM_FREEDATA|EM_FREEUNDO|EM_WAITCURSOR); // freedata, and undo
-
 	allqueue(REDRAWVIEW3D, 0);
 }
+
+void BIF_adjustRetarget()
+{
+	if (GLOBAL_RIGG)
+	{
+		adjustGraphs(GLOBAL_RIGG);
+	}
+}
+
+void BIF_freeRetarget()
+{
+	if (GLOBAL_RIGG)
+	{
+		RIG_freeRigGraph((BGraph*)GLOBAL_RIGG);
+		GLOBAL_RIGG = NULL;
+	}
+}

Modified: branches/harmonic-skeleton/source/blender/src/buttons_editing.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/buttons_editing.c	2008-09-25 18:36:34 UTC (rev 16731)
+++ branches/harmonic-skeleton/source/blender/src/buttons_editing.c	2008-09-25 20:29:15 UTC (rev 16732)
@@ -5010,6 +5010,16 @@
 	allqueue(REDRAWVIEW3D, 0);
 }
 
+static void skgen_rigadjust(void *arg1, void *arg2)
+{
+	BIF_adjustRetarget();
+}
+
+static void skgen_rigfree(void *arg1, void *arg2)
+{
+	BIF_freeRetarget();
+}
+
 static void skgen_graph_block(uiBlock *block)
 {
 	uiBlockBeginAlign(block);
@@ -5062,12 +5072,17 @@
 static void editing_panel_mesh_skgen_retarget(Object *ob, Mesh *me)
 {
 	uiBlock *block;
+	uiBut *but;
 
 	block= uiNewBlock(&curarea->uiblocks, "editing_panel_mesh_skgen_retarget", UI_EMBOSS, UI_HELV, curarea->win);
 	uiNewPanelTabbed("Mesh Tools More", "Skgen");
 	if(uiNewPanel(curarea, block, "Retarget", "Editing", 960, 0, 318, 204)==0) return;
 	
-	uiDefBut(block, BUT, B_RETARGET_SKELETON, "Retarget Skeleton",			1025,170,250,19, 0, 0, 0, 0, 0, "Retarget Selected Armature to this Mesh");
+	uiDefBut(block, BUT, B_RETARGET_SKELETON, "Retarget Skeleton",	1025,170,100,19, 0, 0, 0, 0, 0, "Retarget Selected Armature to this Mesh");
+	but = uiDefBut(block, BUT, B_DIFF, "Adjust",					1125,170,100,19, 0, 0, 0, 0, 0, "Adjust Retarget using new weights");
+	uiButSetFunc(but, skgen_rigadjust, NULL, NULL);
+	but = uiDefBut(block, BUT, B_DIFF, "Free",						1225,170,50,19, 0, 0, 0, 0, 0, "Free Retarget structure");
+	uiButSetFunc(but, skgen_rigfree, NULL, NULL);
 
 	skgen_graph_block(block);
 

Modified: branches/harmonic-skeleton/source/blender/src/usiblender.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/usiblender.c	2008-09-25 18:36:34 UTC (rev 16731)
+++ branches/harmonic-skeleton/source/blender/src/usiblender.c	2008-09-25 20:29:15 UTC (rev 16732)
@@ -1059,6 +1059,7 @@
 	BIF_clear_tempfiles();
 	
 	BIF_GlobalReebFree();
+	BIF_freeRetarget();
 	
 	tf= G.ttfdata.first;
 	while(tf)





More information about the Bf-blender-cvs mailing list