More work on the new unwrapper code (orange branch):
[blender.git] / source / blender / src / parametrizer_intern.h
1
2 #ifndef __PARAMETRIZER_INTERN_H__
3 #define __PARAMETRIZER_INTERN_H__
4
5 /* Hash:
6    -----
7    - insert only
8    - elements are all stored in a flat linked list
9 */
10
11 typedef long PHashKey;
12
13 typedef struct PHashLink {
14         struct PHashLink *next;
15         PHashKey key;
16 } PHashLink;
17
18 typedef struct PHash {
19         PHashLink *first;
20         PHashLink **buckets;
21         int size, cursize, cursize_id;
22 } PHash;
23
24 PHash *phash_new(int sizehint);
25 void phash_delete_with_links(PHash *ph);
26 void phash_delete(PHash *ph);
27
28 int phash_size(PHash *ph);
29
30 void phash_insert(PHash *ph, PHashLink *link);
31 PHashLink *phash_lookup(PHash *ph, PHashKey key);
32 PHashLink *phash_next(PHash *ph, PHashKey key, PHashLink *link);
33
34 #if 0
35         #define param_assert(condition)
36         #define param_warning(message);
37 #else
38         #define param_assert(condition) \
39                 if (!(condition)) \
40                         { printf("Assertion %s:%d\n", __FILE__, __LINE__); abort(); }
41         #define param_warning(message) \
42                 { printf("Warning %s:%d: %s\n", __FILE__, __LINE__, message); }
43 #endif
44
45 typedef enum PBool {
46         P_TRUE = 1,
47         P_FALSE = 0
48 } PBool;
49
50 struct PVert;
51 struct PEdge;
52 struct PFace;
53 struct PChart;
54 struct PHandle;
55
56 /* Heap */
57
58 typedef struct PHeapLink {
59         void *ptr;
60         float value;
61         int index;
62 } PHeapLink;
63
64 typedef struct PHeap {
65         unsigned int size;
66         unsigned int bufsize;
67         PHeapLink *links;
68         PHeapLink **tree;
69 } PHeap;
70
71 /* Simplices */
72
73 typedef struct PVert {
74         struct PVertLink {
75                 struct PVert *next;
76                 PHashKey key;
77         } link;
78
79         struct PEdge *edge;
80         float *co;
81         float uv[2];
82         int flag;
83
84         union PVertUnion {
85                 int index; /* lscm matrix index */
86                 float distortion; /* area smoothing */
87         } u;
88 } PVert; 
89
90 typedef struct PEdge {
91         struct PEdgeLink {
92                 struct PEdge *next;
93                 PHashKey key;
94         } link;
95
96         struct PVert *vert;
97         struct PEdge *pair;
98         struct PEdge *next;
99         struct PFace *face;
100         float *orig_uv, old_uv[2];
101         int flag;
102
103         union PEdgeUnion {
104                 PHeapLink *heaplink;
105         } u;
106 } PEdge;
107
108 typedef struct PFace {
109         struct PFaceLink {
110                 struct PFace *next;
111                 PHashKey key;
112         } link;
113
114         struct PEdge *edge;
115         int flag;
116
117         union PFaceUnion {
118                 int chart; /* chart construction */
119                 float area3d; /* stretch */
120         } u;
121 } PFace;
122
123 enum PVertFlag {
124         PVERT_PIN = 1,
125         PVERT_SELECT = 2
126 };
127
128 enum PEdgeFlag {
129         PEDGE_SEAM = 1,
130         PEDGE_VERTEX_SPLIT = 2,
131         PEDGE_PIN = 4,
132         PEDGE_SELECT = 8,
133         PEDGE_DONE = 16,
134         PEDGE_FILLED = 32
135 };
136
137 /* for flipping faces */
138 #define PEDGE_VERTEX_FLAGS (PEDGE_PIN)
139
140 enum PFaceFlag {
141         PFACE_CONNECTED = 1,
142         PFACE_FILLED = 2
143 };
144
145 /* Chart */
146
147 typedef struct PChart {
148         PHash *verts;
149         PHash *edges;
150         PHash *faces;
151
152         union PChartUnion {
153                 struct PChartLscm {
154                         NLContext context;
155                         float *abf_alpha;
156                         PVert *pin1, *pin2;
157                 } lscm;
158                 struct PChartPack {
159                         float rescale, area;
160                         float size[2], trans[2];
161                 } pack;
162         } u;
163
164         int flag;
165         struct PHandle *handle;
166 } PChart;
167
168 enum PChartFlag {
169         PCHART_NOPACK = 1
170 };
171
172 enum PHandleState {
173         PHANDLE_STATE_ALLOCATED,
174         PHANDLE_STATE_CONSTRUCTED,
175         PHANDLE_STATE_LSCM,
176         PHANDLE_STATE_STRETCH,
177 };
178
179 typedef struct PHandle {
180         PChart *construction_chart;
181         PChart **charts;
182         int ncharts;
183         enum PHandleState state;
184         MemArena *arena;
185         PBool implicit;
186         RNG *rng;
187         float blend;
188 } PHandle;
189
190 #endif /*__PARAMETRIZER_INTERN_H__*/
191