[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [15308] branches/harmonic-skeleton/source/ blender: Display graph in 3d view
Martin Poirier
theeth at yahoo.com
Sun Jun 22 19:07:46 CEST 2008
Revision: 15308
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15308
Author: theeth
Date: 2008-06-22 19:06:50 +0200 (Sun, 22 Jun 2008)
Log Message:
-----------
Display graph in 3d view
Modified Paths:
--------------
branches/harmonic-skeleton/source/blender/include/reeb.h
branches/harmonic-skeleton/source/blender/src/buttons_editing.c
branches/harmonic-skeleton/source/blender/src/drawview.c
branches/harmonic-skeleton/source/blender/src/reeb.c
branches/harmonic-skeleton/source/blender/src/usiblender.c
Modified: branches/harmonic-skeleton/source/blender/include/reeb.h
===================================================================
--- branches/harmonic-skeleton/source/blender/include/reeb.h 2008-06-22 15:48:12 UTC (rev 15307)
+++ branches/harmonic-skeleton/source/blender/include/reeb.h 2008-06-22 17:06:50 UTC (rev 15308)
@@ -119,7 +119,7 @@
int weightFromLoc(struct EditMesh *me, int axis);
void weightToVCol(struct EditMesh *em, int index);
void arcToVCol(struct ReebGraph *rg, struct EditMesh *em, int index);
-void angleToVCol(EditMesh *em, int index);
+void angleToVCol(struct EditMesh *em, int index);
void renormalizeWeight(struct EditMesh *em, float newmax);
ReebGraph * generateReebGraph(struct EditMesh *me, int subdivisions);
@@ -155,7 +155,13 @@
/*********************** PUBLIC *********************************/
ReebGraph *BIF_ReebGraphFromEditMesh(void);
+
+void BIF_GlobalReebGraphFromEditMesh(void);
+void BIF_GlobalReebFree(void);
+
void REEB_freeGraph(ReebGraph *rg);
void REEB_exportGraph(ReebGraph *rg, int count);
+void REEB_draw();
+
#endif /*REEB_H_*/
Modified: branches/harmonic-skeleton/source/blender/src/buttons_editing.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/buttons_editing.c 2008-06-22 15:48:12 UTC (rev 15307)
+++ branches/harmonic-skeleton/source/blender/src/buttons_editing.c 2008-06-22 17:06:50 UTC (rev 15308)
@@ -180,6 +180,8 @@
#include "butspace.h" // own module
#include "multires.h"
+#include "reeb.h"
+
static float editbutweight= 1.0;
float editbutvweight= 1;
static int actmcol= 0, acttface= 0, acttface_rnd = 0, actmcol_rnd = 0;
@@ -4992,6 +4994,16 @@
}
}
+static void skgen_graphgen(void *arg1, void *arg2)
+{
+ BIF_GlobalReebGraphFromEditMesh();
+}
+
+static void skgen_graphfree(void *arg1, void *arg2)
+{
+ BIF_GlobalReebFree();
+}
+
static void editing_panel_mesh_skgen_retarget(Object *ob, Mesh *me)
{
uiBlock *block;
@@ -5035,10 +5047,14 @@
uiNewPanelTabbed("Mesh Tools More", "Editing");
if(uiNewPanel(curarea, block, "Skeleton Generator", "Editing", 960, 0, 318, 204)==0) return;
- uiDefBut(block, BUT, B_GEN_SKELETON, "Generate Skeleton", 1025,170,250,19, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
+ uiDefBut(block, BUT, B_GEN_SKELETON, "Generate Skeleton", 1025,170,125,19, 0, 0, 0, 0, 0, "Generate Skeleton from Mesh");
+ but = uiDefBut(block, BUT, B_DIFF, "Generate", 1150,170,65,19, 0, 0, 0, 0, 0, "Generate Graph from Mesh");
+ uiButSetFunc(but, skgen_graphgen, NULL, NULL);
+ but = uiDefBut(block, BUT, B_DIFF, "Free", 1215,170,60,19, 0, 0, 0, 0, 0, "Free Graph from Mesh");
+ uiButSetFunc(but, skgen_graphfree, NULL, NULL);
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_DIFF, "Resolution:", 1025,150,225,19, &G.scene->toolsettings->skgen_resolution,10.0,1000.0, 0, 0, "Specifies the resolution of the graph's embedding");
+ uiDefButS(block, NUM, B_DIFF, "Resolution:", 1025,150,225,19, &G.scene->toolsettings->skgen_resolution,2.0,1000.0, 0, 0, "Specifies the resolution of the graph's embedding");
uiDefButBitS(block, TOG, SKGEN_HARMONIC, B_DIFF, "H", 1250,150, 25,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Apply harmonic smoothing to the weighting");
uiDefButBitS(block, TOG, SKGEN_FILTER_INTERNAL, B_DIFF, "Filter In", 1025,130, 83,19, &G.scene->toolsettings->skgen_options, 0, 0, 0, 0, "Filter internal small arcs from graph");
uiDefButF(block, NUM, B_DIFF, "T:", 1111,130,164,19, &G.scene->toolsettings->skgen_threshold_internal,0.0, 1.0, 10, 0, "Specify the threshold ratio for filtering internal arcs");
Modified: branches/harmonic-skeleton/source/blender/src/drawview.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/drawview.c 2008-06-22 15:48:12 UTC (rev 15307)
+++ branches/harmonic-skeleton/source/blender/src/drawview.c 2008-06-22 17:06:50 UTC (rev 15308)
@@ -159,6 +159,8 @@
#include "RE_pipeline.h" // make_stars
+#include "reeb.h"
+
#include "multires.h"
/* For MULTISAMPLE_ARB #define.
@@ -3145,6 +3147,8 @@
BIF_drawPropCircle(); // only editmode and particles have proportional edit
BIF_drawSnap();
}
+
+ REEB_draw();
if(G.scene->radio) RAD_drawall(v3d->drawtype>=OB_SOLID);
Modified: branches/harmonic-skeleton/source/blender/src/reeb.c
===================================================================
--- branches/harmonic-skeleton/source/blender/src/reeb.c 2008-06-22 15:48:12 UTC (rev 15307)
+++ branches/harmonic-skeleton/source/blender/src/reeb.c 2008-06-22 17:06:50 UTC (rev 15308)
@@ -51,6 +51,7 @@
#include "BIF_interface.h"
#include "BIF_toolbox.h"
#include "BIF_graphics.h"
+#include "BIF_gl.h"
#include "BKE_global.h"
#include "BKE_utildefines.h"
@@ -65,6 +66,9 @@
/* REPLACE WITH NEW ONE IN UTILDEFINES ONCE PATCH IS APPLIED */
#define FTOCHAR(val) (val<=0.0f)? 0 : ((val>(1.0f-0.5f/255.0f))? 255 : (char)((255.0f*val)+0.5f))
+ReebGraph *GLOBAL_RG = NULL;
+ReebGraph *FILTERED_RG = NULL;
+
/*
* Skeleton generation algorithm based on:
* "Harmonic Skeleton for Realistic Character Animation"
@@ -86,10 +90,10 @@
MERGE_APPEND
} MergeDirection;
-int mergeArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1);
-int mergeConnectedArcs(ReebGraph *rg, ReebArc *a0, ReebArc *a1);
+int mergeArcs(ReebGraph *GLOBAL_RG, ReebArc *a0, ReebArc *a1);
+int mergeConnectedArcs(ReebGraph *GLOBAL_RG, ReebArc *a0, ReebArc *a1);
EditEdge * NextEdgeForVert(EditMesh *em, EditVert *v);
-void mergeArcFaces(ReebGraph *rg, ReebArc *aDst, ReebArc *aSrc);
+void mergeArcFaces(ReebGraph *GLOBAL_RG, ReebArc *aDst, ReebArc *aSrc);
void addFacetoArc(ReebArc *arc, EditFace *efa);
void REEB_RadialSymmetry(BNode* root_node, RadialArc* ring, int count);
@@ -243,11 +247,11 @@
arc->length += VecLenf(arc->tail->p, vec1);
}
-void calculateGraphLength(ReebGraph *rg)
+void calculateGraphLength(ReebGraph *GLOBAL_RG)
{
ReebArc *arc;
- for (arc = rg->arcs.first; arc; arc = arc->next)
+ for (arc = GLOBAL_RG->arcs.first; arc; arc = arc->next)
{
calculateArcLength(arc);
}
@@ -294,13 +298,13 @@
MEM_freeN(arc);
}
-void REEB_freeGraph(ReebGraph *rg)
+void REEB_freeGraph(ReebGraph *GLOBAL_RG)
{
ReebArc *arc;
ReebNode *node;
// free nodes
- for( node = rg->nodes.first; node; node = node->next )
+ for( node = GLOBAL_RG->nodes.first; node; node = node->next )
{
// Free adjacency lists
if (node->arcs != NULL)
@@ -308,10 +312,10 @@
MEM_freeN(node->arcs);
}
}
- BLI_freelistN(&rg->nodes);
+ BLI_freelistN(&GLOBAL_RG->nodes);
// free arcs
- arc = rg->arcs.first;
+ arc = GLOBAL_RG->arcs.first;
while( arc )
{
ReebArc *next = arc->next;
@@ -320,23 +324,23 @@
}
// free edge map
- BLI_edgehash_free(rg->emap, NULL);
+ BLI_edgehash_free(GLOBAL_RG->emap, NULL);
- MEM_freeN(rg);
+ MEM_freeN(GLOBAL_RG);
}
-void repositionNodes(ReebGraph *rg)
+void repositionNodes(ReebGraph *GLOBAL_RG)
{
BArc *arc = NULL;
BNode *node = NULL;
// Reset node positions
- for(node = rg->nodes.first; node; node = node->next)
+ for(node = GLOBAL_RG->nodes.first; node; node = node->next)
{
node->p[0] = node->p[1] = node->p[2] = 0;
}
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ for(arc = GLOBAL_RG->arcs.first; arc; arc = arc->next)
{
if (((ReebArc*)arc)->bcount > 0)
{
@@ -353,16 +357,16 @@
}
}
-void verifyNodeDegree(ReebGraph *rg)
+void verifyNodeDegree(ReebGraph *GLOBAL_RG)
{
#ifdef DEBUG_REEB
ReebNode *node = NULL;
ReebArc *arc = NULL;
- for(node = rg->nodes.first; node; node = node->next)
+ for(node = GLOBAL_RG->nodes.first; node; node = node->next)
{
int count = 0;
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ for(arc = GLOBAL_RG->arcs.first; arc; arc = arc->next)
{
if (arc->head == node || arc->tail == node)
{
@@ -377,11 +381,11 @@
#endif
}
-void verifyBuckets(ReebGraph *rg)
+void verifyBuckets(ReebGraph *GLOBAL_RG)
{
#ifdef DEBUG_REEB
ReebArc *arc = NULL;
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ for(arc = GLOBAL_RG->arcs.first; arc; arc = arc->next)
{
ReebNode *head = (ReebNode*)arc->head;
ReebNode *tail = (ReebNode*)arc->tail;
@@ -413,12 +417,12 @@
#endif
}
-void verifyFaces(ReebGraph *rg)
+void verifyFaces(ReebGraph *GLOBAL_RG)
{
#ifdef DEBUG_REEB
int total = 0;
ReebArc *arc = NULL;
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ for(arc = GLOBAL_RG->arcs.first; arc; arc = arc->next)
{
total += BLI_ghash_size(arc->faces);
}
@@ -625,7 +629,7 @@
/****************************************** SMOOTHING **************************************************/
-void postprocessGraph(ReebGraph *rg, char mode)
+void postprocessGraph(ReebGraph *GLOBAL_RG, char mode)
{
ReebArc *arc;
float fac1 = 0, fac2 = 1, fac3 = 0;
@@ -648,7 +652,7 @@
return;
}
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ for(arc = GLOBAL_RG->arcs.first; arc; arc = arc->next)
{
EmbedBucket *buckets = arc->buckets;
int bcount = arc->bcount;
@@ -683,9 +687,9 @@
}
}
-void sortNodes(ReebGraph *rg)
+void sortNodes(ReebGraph *GLOBAL_RG)
{
- BLI_sortlist(&rg->nodes, compareNodesWeight);
+ BLI_sortlist(&GLOBAL_RG->nodes, compareNodesWeight);
}
int compareArcsWeight(void *varc1, void *varc2)
@@ -709,9 +713,9 @@
}
}
-void sortArcs(ReebGraph *rg)
+void sortArcs(ReebGraph *GLOBAL_RG)
{
- BLI_sortlist(&rg->arcs, compareArcsWeight);
+ BLI_sortlist(&GLOBAL_RG->arcs, compareArcsWeight);
}
/****************************************** FILTERING **************************************************/
@@ -745,12 +749,12 @@
}
}
-void filterArc(ReebGraph *rg, ReebNode *newNode, ReebNode *removedNode, ReebArc * srcArc, int merging)
+void filterArc(ReebGraph *GLOBAL_RG, ReebNode *newNode, ReebNode *removedNode, ReebArc * srcArc, int merging)
{
ReebArc *arc = NULL, *nextArc = NULL;
/* first pass, merge buckets for arcs that spawned the two nodes into the source arc*/
- for(arc = rg->arcs.first; arc; arc = arc->next)
+ for(arc = GLOBAL_RG->arcs.first; arc; arc = arc->next)
{
if (arc->head == srcArc->head && arc->tail == srcArc->tail && arc != srcArc)
{
@@ -761,7 +765,7 @@
}
/* second pass, replace removedNode by newNode, remove arcs that are collapsed in a loop */
- arc = rg->arcs.first;
+ arc = GLOBAL_RG->arcs.first;
while(arc)
{
nextArc = arc->next;
@@ -786,7 +790,7 @@
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list