Blender  V2.59
BLI_graph.h
Go to the documentation of this file.
00001 #ifndef BLI_GRAPH_H_
00002 #define BLI_GRAPH_H_
00003 
00008 #include "DNA_listBase.h"
00009 
00010 struct BGraph;
00011 struct BNode;
00012 struct BArc;
00013 
00014 struct RadialArc;
00015 
00016 typedef void (*FreeArc)(struct BArc*);
00017 typedef void (*FreeNode)(struct BNode*);
00018 typedef void (*RadialSymmetry)(struct BNode* root_node, struct RadialArc* ring, int total);
00019 typedef void (*AxialSymmetry)(struct BNode* root_node, struct BNode* node1, struct BNode* node2, struct BArc* arc1, struct BArc* arc2);
00020 
00021 /* IF YOU MODIFY THOSE TYPES, YOU NEED TO UPDATE ALL THOSE THAT "INHERIT" FROM THEM
00022  * 
00023  * RigGraph, ReebGraph
00024  * 
00025  * */
00026 
00027 typedef struct BGraph {
00028         ListBase        arcs;
00029         ListBase        nodes;
00030         
00031         float length;
00032         
00033         /* function pointer to deal with custom fonctionnality */
00034         FreeArc                 free_arc;
00035         FreeNode                free_node;
00036         RadialSymmetry  radial_symmetry;
00037         AxialSymmetry   axial_symmetry;
00038 } BGraph;
00039 
00040 typedef struct BNode {
00041         void *next, *prev;
00042         float p[3];
00043         int flag;
00044 
00045         int degree;
00046         struct BArc **arcs;
00047         
00048         int subgraph_index;
00049 
00050         int symmetry_level;
00051         int symmetry_flag;
00052         float symmetry_axis[3];
00053 } BNode;
00054 
00055 typedef struct BArc {
00056         void *next, *prev;
00057         struct BNode *head, *tail;
00058         int flag;
00059 
00060         float length;
00061 
00062         int symmetry_level;
00063         int symmetry_group;
00064         int symmetry_flag;
00065 } BArc;
00066 
00067 struct BArcIterator;
00068 
00069 void* IT_head(void* iter);
00070 void* IT_tail(void* iter);
00071 void* IT_peek(void* iter, int n);
00072 void* IT_next(void* iter);
00073 void* IT_nextN(void* iter, int n);
00074 void* IT_previous(void* iter);
00075 int   IT_stopped(void* iter);
00076 
00077 typedef void* (*HeadFct)(void* iter);
00078 typedef void* (*TailFct)(void* iter);
00079 typedef void* (*PeekFct)(void* iter, int n);
00080 typedef void* (*NextFct)(void* iter);
00081 typedef void* (*NextNFct)(void* iter, int n);
00082 typedef void* (*PreviousFct)(void* iter);
00083 typedef int   (*StoppedFct)(void* iter);
00084 
00085 typedef struct BArcIterator {
00086         HeadFct         head;
00087         TailFct         tail;
00088         PeekFct         peek;
00089         NextFct         next;
00090         NextNFct        nextN;
00091         PreviousFct     previous;
00092         StoppedFct      stopped;
00093         
00094         float *p, *no;
00095         float size;
00096         
00097         int length;
00098         int index;
00099 } BArcIterator;
00100 
00101 /* Helper structure for radial symmetry */
00102 typedef struct RadialArc
00103 {
00104         struct BArc *arc; 
00105         float n[3]; /* normalized vector joining the nodes of the arc */
00106 } RadialArc;
00107 
00108 BNode *BLI_otherNode(BArc *arc, BNode *node);
00109 
00110 void BLI_freeNode(BGraph *graph, BNode *node);
00111 void BLI_removeNode(BGraph *graph, BNode *node);
00112 
00113 void BLI_removeArc(BGraph *graph, BArc *arc);
00114 
00115 void BLI_flagNodes(BGraph *graph, int flag);
00116 void BLI_flagArcs(BGraph *graph, int flag);
00117 
00118 int BLI_hasAdjacencyList(BGraph *rg);
00119 void BLI_buildAdjacencyList(BGraph *rg);
00120 void BLI_rebuildAdjacencyList(BGraph* rg);
00121 void BLI_rebuildAdjacencyListForNode(BGraph* rg, BNode *node);
00122 void BLI_freeAdjacencyList(BGraph *rg);
00123 
00124 int BLI_FlagSubgraphs(BGraph *graph);
00125 void BLI_ReflagSubgraph(BGraph *graph, int old_subgraph, int new_subgraph);
00126 
00127 #define SHAPE_RADIX 10 /* each shape level is encoded this base */
00128 
00129 int BLI_subtreeShape(BGraph *graph, BNode *node, BArc *rootArc, int include_root);
00130 float BLI_subtreeLength(BNode *node);
00131 void BLI_calcGraphLength(BGraph *graph);
00132 
00133 void BLI_replaceNode(BGraph *graph, BNode *node_src, BNode *node_replaced);
00134 void BLI_replaceNodeInArc(BGraph *graph, BArc *arc, BNode *node_src, BNode *node_replaced);
00135 void BLI_removeDoubleNodes(BGraph *graph, float limit);
00136 BNode * BLI_FindNodeByPosition(BGraph *graph, float *p, float limit);
00137 
00138 BArc * BLI_findConnectedArc(BGraph *graph, BArc *arc, BNode *v);
00139 
00140 int     BLI_isGraphCyclic(BGraph *graph);
00141 
00142 /*------------ Symmetry handling ------------*/
00143 void BLI_markdownSymmetry(BGraph *graph, BNode *root_node, float limit);
00144 
00145 void BLI_mirrorAlongAxis(float v[3], float center[3], float axis[3]);
00146 
00147 /* BNode symmetry flags */
00148 #define SYM_TOPOLOGICAL 1
00149 #define SYM_PHYSICAL    2
00150 
00151 /* the following two are exclusive */
00152 #define SYM_AXIAL               4
00153 #define SYM_RADIAL              8
00154 
00155 /* BArc symmetry flags
00156  * 
00157  * axial symetry sides */
00158 #define SYM_SIDE_POSITIVE               1
00159 #define SYM_SIDE_NEGATIVE               2
00160 /* Anything higher is the order in radial symmetry */
00161 #define SYM_SIDE_RADIAL                 3
00162 
00163 #endif /*BLI_GRAPH_H_*/