208 lines
5.0 KiB
C++
208 lines
5.0 KiB
C++
/*
|
|
* ***** BEGIN GPL LICENSE BLOCK *****
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License
|
|
* along with this program; if not, write to the Free Software Foundation,
|
|
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
* Contributor(s): Martin Poirier
|
|
*
|
|
* ***** END GPL LICENSE BLOCK *****
|
|
*/
|
|
|
|
/** \file blender/editors/armature/reeb.h
|
|
* \ingroup edarmature
|
|
*/
|
|
|
|
|
|
#ifndef __REEB_H__
|
|
#define __REEB_H__
|
|
|
|
#define WITH_BF_REEB
|
|
|
|
#include "DNA_listBase.h"
|
|
|
|
#include "BLI_graph.h"
|
|
|
|
struct GHash;
|
|
struct EdgeHash;
|
|
struct ReebArc;
|
|
struct ReebEdge;
|
|
struct ReebNode;
|
|
|
|
typedef struct ReebGraph {
|
|
ListBase arcs;
|
|
ListBase nodes;
|
|
|
|
float length;
|
|
|
|
FreeArc free_arc;
|
|
FreeNode free_node;
|
|
RadialSymmetry radial_symmetry;
|
|
AxialSymmetry axial_symmetry;
|
|
/*********************************/
|
|
|
|
int resolution;
|
|
int totnodes;
|
|
struct EdgeHash *emap;
|
|
int multi_level;
|
|
struct ReebGraph *link_up; /* for multi resolution filtering, points to higher levels */
|
|
} ReebGraph;
|
|
|
|
typedef struct EmbedBucket {
|
|
float val;
|
|
int nv;
|
|
float p[3];
|
|
float no[3]; /* if non-null, normal of the bucket */
|
|
} EmbedBucket;
|
|
|
|
typedef struct ReebNode {
|
|
void *next, *prev;
|
|
float p[3];
|
|
int flag;
|
|
|
|
int degree;
|
|
struct ReebArc **arcs;
|
|
|
|
int subgraph_index;
|
|
|
|
int symmetry_level;
|
|
int symmetry_flag;
|
|
float symmetry_axis[3];
|
|
/*********************************/
|
|
|
|
float no[3];
|
|
|
|
int index;
|
|
float weight;
|
|
int multi_level;
|
|
struct ReebNode *link_down; /* for multi resolution filtering, points to lower levels, if present */
|
|
struct ReebNode *link_up;
|
|
} ReebNode;
|
|
|
|
typedef struct ReebEdge {
|
|
struct ReebEdge *next, *prev;
|
|
struct ReebArc *arc;
|
|
struct ReebNode *v1, *v2;
|
|
struct ReebEdge *nextEdge;
|
|
int flag;
|
|
} ReebEdge;
|
|
|
|
typedef struct ReebArc {
|
|
void *next, *prev;
|
|
struct ReebNode *head, *tail;
|
|
int flag;
|
|
|
|
float length;
|
|
|
|
int symmetry_level;
|
|
int symmetry_group;
|
|
int symmetry_flag;
|
|
/*********************************/
|
|
|
|
ListBase edges;
|
|
int bcount;
|
|
struct EmbedBucket *buckets;
|
|
|
|
struct GHash *faces;
|
|
float angle;
|
|
struct ReebArc *link_up; /* for multi resolution filtering, points to higher levels */
|
|
} ReebArc;
|
|
|
|
typedef struct ReebArcIterator {
|
|
HeadFct head;
|
|
TailFct tail;
|
|
PeekFct peek;
|
|
NextFct next;
|
|
NextNFct nextN;
|
|
PreviousFct previous;
|
|
StoppedFct stopped;
|
|
|
|
float *p, *no;
|
|
float size;
|
|
|
|
int length;
|
|
int index;
|
|
/*********************************/
|
|
struct ReebArc *arc;
|
|
int start;
|
|
int end;
|
|
int stride;
|
|
} ReebArcIterator;
|
|
|
|
#if 0
|
|
struct EditMesh;
|
|
struct EdgeIndex;
|
|
|
|
int weightToHarmonic(struct EditMesh *em, struct EdgeIndex *indexed_edges);
|
|
int weightFromDistance(struct EditMesh *em, struct EdgeIndex *indexed_edges);
|
|
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(struct EditMesh *em, int index);
|
|
void renormalizeWeight(struct EditMesh *em, float newmax);
|
|
|
|
ReebGraph *generateReebGraph(struct EditMesh *me, int subdivisions);
|
|
#endif
|
|
|
|
ReebGraph *newReebGraph(void);
|
|
|
|
void initArcIterator(BArcIterator *iter, struct ReebArc *arc, struct ReebNode *head);
|
|
void initArcIterator2(BArcIterator *iter, struct ReebArc *arc, int start, int end);
|
|
void initArcIteratorStart(BArcIterator *iter, struct ReebArc *arc, struct ReebNode *head, int start);
|
|
|
|
/* Filtering */
|
|
void filterNullReebGraph(ReebGraph *rg);
|
|
int filterSmartReebGraph(ReebGraph *rg, float threshold);
|
|
|
|
/* Post-Build processing */
|
|
void repositionNodes(ReebGraph *rg);
|
|
void postprocessGraph(ReebGraph *rg, char mode);
|
|
void removeNormalNodes(ReebGraph *rg);
|
|
|
|
void sortNodes(ReebGraph *rg);
|
|
void sortArcs(ReebGraph *rg);
|
|
|
|
/*------------ Sanity check ------------*/
|
|
void verifyBuckets(ReebGraph *rg);
|
|
void verifyFaces(ReebGraph *rg);
|
|
void verifyArcs(ReebGraph *rg);
|
|
void verifyNodeDegree(ReebGraph *rg);
|
|
|
|
/*********************** PUBLIC *********************************/
|
|
|
|
#define REEB_MAX_MULTI_LEVEL 10
|
|
|
|
struct bContext;
|
|
|
|
ReebGraph *BIF_ReebGraphFromEditMesh(void);
|
|
ReebGraph *BIF_ReebGraphMultiFromEditMesh(struct bContext *C);
|
|
void BIF_flagMultiArcs(ReebGraph *rg, int flag);
|
|
|
|
void BIF_GlobalReebGraphFromEditMesh(void);
|
|
void BIF_GlobalReebFree(void);
|
|
|
|
ReebNode *BIF_otherNodeFromIndex(ReebArc *arc, ReebNode *node);
|
|
ReebNode *BIF_NodeFromIndex(ReebArc *arc, ReebNode *node);
|
|
ReebNode *BIF_lowestLevelNode(ReebNode *node);
|
|
|
|
ReebGraph *BIF_graphForMultiNode(ReebGraph *rg, ReebNode *node);
|
|
|
|
void REEB_freeGraph(ReebGraph *rg);
|
|
void REEB_freeArc(BArc *barc);
|
|
void REEB_exportGraph(ReebGraph *rg, int count);
|
|
void REEB_draw(void);
|
|
|
|
|
|
#endif /*__REEB_H__*/
|