2008-05-28 16:39:05 +00:00
|
|
|
#ifndef BLI_GRAPH_H_
|
|
|
|
#define BLI_GRAPH_H_
|
|
|
|
|
|
|
|
#include "DNA_listBase.h"
|
|
|
|
|
|
|
|
struct BGraph;
|
|
|
|
struct BNode;
|
|
|
|
struct BArc;
|
|
|
|
|
|
|
|
struct RadialArc;
|
|
|
|
|
|
|
|
typedef void (*FreeArc)(struct BArc*);
|
|
|
|
typedef void (*FreeNode)(struct BNode*);
|
|
|
|
typedef void (*RadialSymmetry)(struct BNode* root_node, struct RadialArc* ring, int total);
|
|
|
|
typedef void (*AxialSymmetry)(struct BNode* root_node, struct BNode* node1, struct BNode* node2, struct BArc* arc1, struct BArc* arc2);
|
|
|
|
|
|
|
|
/* IF YOU MODIFY THOSE TYPES, YOU NEED TO UPDATE ALL THOSE THAT "INHERIT" FROM THEM
|
|
|
|
*
|
|
|
|
* RigGraph, ReebGraph
|
|
|
|
*
|
|
|
|
* */
|
|
|
|
|
|
|
|
typedef struct BGraph {
|
|
|
|
ListBase arcs;
|
|
|
|
ListBase nodes;
|
|
|
|
|
2008-07-10 18:48:27 +00:00
|
|
|
float length;
|
|
|
|
|
2008-05-28 16:39:05 +00:00
|
|
|
/* function pointer to deal with custom fonctionnality */
|
|
|
|
FreeArc free_arc;
|
|
|
|
FreeNode free_node;
|
|
|
|
RadialSymmetry radial_symmetry;
|
|
|
|
AxialSymmetry axial_symmetry;
|
|
|
|
} BGraph;
|
|
|
|
|
|
|
|
typedef struct BNode {
|
|
|
|
void *next, *prev;
|
|
|
|
float p[3];
|
|
|
|
int flag;
|
|
|
|
|
|
|
|
int degree;
|
|
|
|
struct BArc **arcs;
|
|
|
|
|
|
|
|
int symmetry_level;
|
|
|
|
int symmetry_flag;
|
|
|
|
float symmetry_axis[3];
|
|
|
|
} BNode;
|
|
|
|
|
|
|
|
typedef struct BArc {
|
|
|
|
void *next, *prev;
|
|
|
|
struct BNode *head, *tail;
|
|
|
|
int flag;
|
|
|
|
|
|
|
|
float length;
|
|
|
|
|
|
|
|
int symmetry_level;
|
2008-05-30 17:42:02 +00:00
|
|
|
int symmetry_group;
|
2008-05-28 16:39:05 +00:00
|
|
|
int symmetry_flag;
|
|
|
|
} BArc;
|
|
|
|
|
|
|
|
/* Helper structure for radial symmetry */
|
|
|
|
typedef struct RadialArc
|
|
|
|
{
|
|
|
|
struct BArc *arc;
|
|
|
|
float n[3]; /* normalized vector joining the nodes of the arc */
|
|
|
|
} RadialArc;
|
|
|
|
|
|
|
|
BNode *BLI_otherNode(BArc *arc, BNode *node);
|
|
|
|
|
|
|
|
void BLI_freeNode(BGraph *graph, BNode *node);
|
2008-07-05 22:01:46 +00:00
|
|
|
void BLI_removeNode(BGraph *graph, BNode *node);
|
2008-05-28 16:39:05 +00:00
|
|
|
|
|
|
|
void BLI_flagNodes(BGraph *graph, int flag);
|
|
|
|
void BLI_flagArcs(BGraph *graph, int flag);
|
|
|
|
|
|
|
|
int BLI_hasAdjacencyList(BGraph *rg);
|
|
|
|
void BLI_buildAdjacencyList(BGraph *rg);
|
2008-07-02 21:36:45 +00:00
|
|
|
void BLI_rebuildAdjacencyList(BGraph* rg);
|
2008-07-15 21:07:13 +00:00
|
|
|
void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node);
|
2008-06-26 18:15:45 +00:00
|
|
|
void BLI_freeAdjacencyList(BGraph *rg);
|
|
|
|
|
|
|
|
int BLI_FlagSubgraphs(BGraph *graph);
|
2008-05-28 16:39:05 +00:00
|
|
|
|
2008-07-15 19:38:48 +00:00
|
|
|
#define SHAPE_RADIX 10 /* each shape level is encoded this base */
|
|
|
|
|
2008-07-07 20:31:53 +00:00
|
|
|
int BLI_subtreeShape(BNode *node, BArc *rootArc, int include_root);
|
2008-07-10 18:48:27 +00:00
|
|
|
float BLI_subtreeLength(BNode *node, BArc *rootArc);
|
|
|
|
void BLI_calcGraphLength(BGraph *graph);
|
2008-07-07 20:31:53 +00:00
|
|
|
|
2008-05-28 16:39:05 +00:00
|
|
|
void BLI_replaceNode(BGraph *graph, BNode *node_src, BNode *node_replaced);
|
|
|
|
void BLI_removeDoubleNodes(BGraph *graph, float limit);
|
|
|
|
|
|
|
|
BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v);
|
|
|
|
|
|
|
|
int BLI_isGraphCyclic(BGraph *graph);
|
|
|
|
|
|
|
|
/*------------ Symmetry handling ------------*/
|
|
|
|
void BLI_markdownSymmetry(BGraph *graph, BNode *root_node, float limit);
|
|
|
|
|
|
|
|
void BLI_mirrorAlongAxis(float v[3], float center[3], float axis[3]);
|
|
|
|
|
|
|
|
/* BNode symmetry flags */
|
|
|
|
#define SYM_TOPOLOGICAL 1
|
|
|
|
#define SYM_PHYSICAL 2
|
|
|
|
|
|
|
|
/* the following two are exclusive */
|
|
|
|
#define SYM_AXIAL 4
|
|
|
|
#define SYM_RADIAL 8
|
|
|
|
|
|
|
|
/* BArc symmetry flags
|
|
|
|
*
|
|
|
|
* axial symetry sides */
|
|
|
|
#define SYM_SIDE_POSITIVE 1
|
|
|
|
#define SYM_SIDE_NEGATIVE 2
|
2008-05-30 17:42:02 +00:00
|
|
|
/* Anything higher is the order in radial symmetry */
|
2008-05-28 16:39:05 +00:00
|
|
|
|
|
|
|
#endif /*BLI_GRAPH_H_*/
|