- support for fake verse edges (subsurf modifier should work now)
[blender.git] / source / blender / blenkernel / BKE_verse.h
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version. The Blender
10  * Foundation also sells licenses for use in proprietary software under
11  * the Blender License.  See http://www.blender.org/BL/ for information
12  * about this.
13  *
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software Foundation,
21  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  *
23  * Contributor(s): Jiri Hnidek.
24  *
25  * ***** END GPL/BL DUAL LICENSE BLOCK *****
26  */
27
28 /* #define WITH_VERSE */
29
30 #ifndef BKE_VERSE_H
31 #define BKE_VERSE_H
32
33 #include "DNA_listBase.h"
34 #include "BLI_dynamiclist.h"
35
36 #include "verse.h"
37 #include "verse_ms.h"
38
39 struct VNode;
40 struct VerseEdge;
41
42 /*
43  * Verse Edge Hash (similar to edit edge hash)
44  */
45 #define VEDHASHSIZE    (512*512)
46 #define VEDHASH(a, b)  ((a<b ? a : b) % VEDHASHSIZE)
47
48 /*
49  * virtual data type (used only for retype)
50  */
51 typedef struct verse_parent {
52         struct verse_parent *next, *prev;
53         VLayerID layer_id;
54         uint32 id;
55 } verse_parent;
56
57 /*
58  * verse data: 4 float value
59  */
60 typedef struct quat_real32_item {
61         struct quat_real32_item *next, *prev;
62         VLayerID layer_id;
63         void *parent;
64         real32 value[4];
65 } quat_real32_item;
66
67 /*
68  * verse data: 4 uint32 values
69  */
70 typedef struct quat_uint32_item {
71         struct quat_uint32_item *next, *prev;
72         VLayerID layer_id;
73         void *parent;
74         uint32 value[4];
75 } quat_uint32_item;
76
77 /*
78  * verse data: 3 float values
79  */
80 typedef struct vec_real32_item {
81         struct vec_real32_item *next, *prev;
82         VLayerID layer_id;
83         void *parent;
84         real32 value[3];
85 } vec_real32_item;
86
87 /*
88  * verse data: float value (weight)
89  */
90 typedef struct real32_item {
91         struct real32_item *next, *prev;
92         VLayerID layer_id;
93         void *parent;
94         real32 value;
95 } real32_item;
96
97 /*
98  * verse data: uint32 value
99  */
100 typedef struct uint32_item {
101         struct uint32_item *next, *prev;
102         VLayerID layer_id;
103         void *parent;
104         uint32 value;
105 } uint32_item;
106
107 /*
108  * verse data: uint8 value
109  */
110 typedef struct uint8_item {
111         struct uint8_item *next, *prev;
112         VLayerID layer_id;
113         void *parent;
114         uint8 value;
115 } uint8_item;
116
117 /*
118  * verse data: vertex
119  */
120 typedef struct VerseVert {
121         struct VerseVert *next, *prev;
122         /* verse data */
123         struct VLayer *vlayer;          /* pointer at VerseLayer */
124         uint32 id;                      /* id of vertex */
125         real32 co[3];                   /* x,y,z-coordinates of vertex */
126         real32 no[3];                   /* normal of vertex */
127         /* blender internals */
128         short flag;                     /* flags: VERT_DELETED, VERT_RECEIVED, etc. */
129         void *vertex;                   /* pointer at EditVert or MVert */
130         int counter;                    /* counter of VerseFaces using this VerseVert */
131         union {
132                 unsigned int index;     /* counter need during transformation to mesh */
133                 struct VerseVert *vvert;
134         } tmp;                          /* pointer at new created verse vert, it is
135                                          * used during duplicating geometry node */     
136         float *cos;                     /* modified coordinates of vertex */
137         float *nos;                     /* modified normal vector */
138 } VerseVert;
139
140 /*
141  * structture used for verse edge hash
142  */
143 typedef struct HashVerseEdge {
144         struct VerseEdge *vedge;
145         struct HashVerseEdge *next;
146 } HashVerseEdge;
147
148 /*
149  * fake verse data: edge
150  */
151 typedef struct VerseEdge {
152         struct VerseEdge *next, *prev;
153         uint32 v0, v1;                  /* indexes of verse vertexes */
154         int counter;                    /* counter of verse faces using this edge */
155         struct HashVerseEdge hash;      /* hash table */
156         union {
157                 unsigned int index;     /* temporary index of edge */
158         } tmp;
159 } VerseEdge;
160
161 /*
162  * verse data: polygon
163  */
164 typedef struct VerseFace {
165         struct VerseFace *next, *prev;
166         /* verse data */
167         struct VLayer *vlayer;          /* pointer at VerseLayer */
168         uint32 id;                      /* id of face */
169         struct VerseVert *vvert0;       /* pointer at 1st VerseVert */
170         struct VerseVert *vvert1;       /* pointer at 2nd VerseVert */
171         struct VerseVert *vvert2;       /* pointer at 3th VerseVert */
172         struct VerseVert *vvert3;       /* pointer at 4th VerseVert */
173         unsigned int v0, v1, v2, v3;    /* indexes of VerseVerts ... needed during receiving */
174         /* blender internals */
175         char flag;                      /* flags: FACE_SEND_READY, FACE_SENT, FACE_RECEIVED, FACE_CHANGED*/
176         short counter;                  /* counter of missed VerseVertexes */
177         void *face;                     /* pointer at EditFace */
178         float no[3];                    /* normal vector */
179         float *nos;                     /* modified normal vector */
180 } VerseFace;
181
182 /*
183  * verse data: layer
184  */
185 typedef struct VLayer {
186         struct VLayer *next, *prev;
187         /* verse data*/
188         struct VNode *vnode;            /* pointer at VerseNode */
189         uint16 id;                      /* id of layer */
190         char *name;                     /* name of layer */
191         VNGLayerType type;              /* type of layer (VN_G_LAYER_VERTEX_XYZ, VN_G_LAYER_POLYGON_CORNER_UINT32) */
192         uint32 def_int;                 /* default integer value */
193         real64 def_real;                /* default float value */
194         /* blender internals */
195         char flag;                      /* flags: LAYER_SENT, LAYER_RECEIVED, LAYER_DELETED, LAYER_OBSOLETE */
196         short content;                  /* type of content (VERTEX_LAYER, POLYGON_LAYER) */
197         struct DynamicList dl;          /* vertexes, polygons, etc. */
198         struct ListBase queue;          /* queue of vertexes, polygons, etc. waiting for sending to verse server */
199         struct ListBase orphans;        /* list of versedata (polygons, etc.), that can be added to the DynamicList
200                                          * due to not received VerseVerts */
201         unsigned int counter;           /* counter of sent items */
202         /* client dependent methods */
203         void (*post_layer_create)(struct VLayer *vlayer);
204         void (*post_layer_destroy)(struct VLayer *vlayer);
205 } VLayer;
206
207 /*
208  * verse data: link
209  */
210 typedef struct VLink{
211         struct VLink *next, *prev;
212         /* verse data */
213         struct VerseSession *session;   /* session pointer */
214         struct VNode *source;           /* object VerseNode "pointing" at some other VerseNode */
215         struct VNode *target;           /* VerseNode linked with some object node */
216         unsigned int id;                /* id of VerseLink */
217         unsigned int target_id;         /* some unknow id */
218         char *label;                    /* name/label of VerseLink */
219         /* blender internals */
220         char flag;                      /* flags: LINK_SEND_READY */
221         /* client dependent methods */
222         void (*post_link_set)(struct VLink *vlink);
223         void (*post_link_destroy)(struct VLink *vlink);
224 } VLink;
225
226 /*
227  * bitmap layer 
228  */
229 typedef struct VBitmapLayer {
230         struct VBitmapLayer *next, *prev;
231         /* verse data */
232         struct VNode *vnode;            /* pointer at Verse Node */
233         VLayerID id;                    /* id of layer */
234         char *name;                     /* name of layer */
235         VNBLayerType type;              /* type of layer (bits per channel) 1, 8, 16, 32, 64 */
236         void *data;                     /* dynamic allocated data */
237         /* blender internals */
238         char flag;
239 } VBitmapLayer;
240
241 /*
242  * data of bitmap node
243  */
244 typedef struct VBitmapData {
245         struct DynamicList layers;      /* dynamic list with access array of bitmap layers */
246         struct ListBase queue;          /* queue of layers waiting for receiving from verse server */
247         uint16 width;                   /* width of all verse layers */
248         uint16 height;                  /* height of all verse layers */
249         uint16 depth;                   /* depth of bitmap 1 is 2D bitmap, >1 is 3D bitmap */
250         /* blender internals */
251         uint16 t_width;                 /* = (width/VN_B_TILE_SIZE + 1)*VN_B_TILE_SIZE */
252         uint16 t_height;                /* = (height/VN_B_TILE_SIZE + 1)*VN_B_TILE_SIZE */
253         void *image;                    /* pointer at image */
254         /* client dependent methods */
255         void (*post_bitmap_dimension_set)(struct VNode *vnode);
256         void (*post_bitmap_layer_create)(struct VBitmapLayer *vblayer);
257         void (*post_bitmap_layer_destroy)(struct VBitmapLayer *vblayer);
258         void (*post_bitmap_tile_set)(struct VBitmapLayer *vblayer, unsigned int xs, unsigned int ys);
259 }VBitmapData;
260
261 /* 
262  * data of geometry node
263  */
264 typedef struct VGeomData {
265         struct DynamicList layers;      /* dynamic list with access array of Layers */
266         struct VLink *vlink;            /* pointer at VerseLink connecting object node and geom node */
267         struct ListBase queue;          /* queue of our layers waiting for receiving from verse server */
268         void *mesh;                     /* pointer at Mesh (object node) */
269         void *editmesh;                 /* pointer at EditMesh (edit mode) */
270         struct HashVerseEdge *hash;     /* verse edge hash */
271         struct ListBase edges;          /* list of fake verse edges */
272         /* client dependent methods */
273         void (*post_vertex_create)(struct VerseVert *vvert);
274         void (*post_vertex_set_xyz)(struct VerseVert *vvert);
275         void (*post_vertex_delete)(struct VerseVert *vvert);
276         void (*post_vertex_free_constraint)(struct VerseVert *vvert);
277         void (*post_polygon_create)(struct VerseFace *vface);
278         void (*post_polygon_set_corner)(struct VerseFace *vface);
279         void (*post_polygon_delete)(struct VerseFace *vface);
280         void (*post_polygon_free_constraint)(struct VerseFace *vface);
281         void (*post_geometry_free_constraint)(struct VNode *vnode);
282         void (*post_polygon_set_uint8)(struct VerseFace *vface);
283 } VGeomData;
284
285 /*
286  * data of object node
287  */
288 typedef struct VObjectData {
289         struct DynamicList links;       /* dynamic list with access array of links between other nodes */
290         struct ListBase queue;          /* queue of links waiting for sending and receiving from verse server */
291         float pos[3];                   /* position of object VerseNode */
292         float quat[4];                  /* rotation of object VerseNode stored in quat */
293         float scale[3];                 /* scale of object VerseNode */
294         void *object;                   /* pointer at object */
295         short flag;                     /* flag: POS_RECEIVE_READY, ROT_RECEIVE_READY. SCALE_RECEIVE_READY */
296         /* client dependent methods */
297 /*      void (*post_transform)(struct VNode *vnode);*/
298         void (*post_transform_pos)(struct VNode *vnode);
299         void (*post_transform_rot)(struct VNode *vnode);
300         void (*post_transform_scale)(struct VNode *vnode);
301         void (*post_object_free_constraint)(struct VNode *vnode);
302 } VObjectData;
303
304 /*
305  * Verse Tag
306  */
307 typedef struct VTag {
308         struct VTag *next, *prev;
309         /* verse data*/
310         struct VTagGroup *vtaggroup;    /* pointer at Verse Tag Group */
311         uint16 id;                      /* id of this tag */
312         char *name;                     /* name of this tag*/
313         VNTagType type;                 /* type: VN_TAG_BOOLEAN, VN_TAG_UINT32, VN_TAG_REAL64, VN_TAG_REAL64_VEC3,
314                                            VN_TAG_LINK, VN_TAG_ANIMATION, VN_TAG_BLOB */
315         VNTag *tag;                     /* pointer at value (enum: vboolean, vuint32, vreal64, vstring,
316                                            vreal64_vec3, vlink, vanimation, vblob)*/
317         /* blender internals */
318         void *value;                    /* pointer at blender value */
319 } VTag;
320
321 /*
322  * Verse Tag Group (verse tags are grouped in tag groups)
323  */
324 typedef struct VTagGroup {
325         struct VTagGroup *next, *prev;
326         /* verse data*/
327         struct VNode *vnode;            /* pointer at Verse Node */
328         uint16 id;                      /* id of this tag group */
329         char *name;                     /* name of this tag group */
330         /* blender internals */
331         struct DynamicList tags;        /* dynamic list with access array containing tags */
332         struct ListBase queue;          /* list of tags waiting for receiving from verse server */
333         /* client dependent methods */
334         void (*post_tag_change)(struct VTag *vatg);
335         void (*post_taggroup_create)(struct VTagGroup *vtaggroup);
336 } VTagGroup;
337
338 /*
339  * Verse Node
340  */
341 typedef struct VNode {
342         struct VNode *next, *prev;
343         /* verse data*/
344         struct VerseSession *session;   /* session pointer */
345         VNodeID id;                     /* node id */
346         VNodeID owner_id;               /* owner's id of this node */
347         char *name;                     /* name of this node */
348         uint32 type;                    /* type of node (V_NT_OBJECT, V_NT_GEOMETRY, V_NT_BITMAP) */
349         /* blender internals */
350         char flag;                      /* flags: NODE_SENT, NODE_RECEIVED, NODE_DELTED, NODE_OBSOLETE */
351         struct DynamicList taggroups;   /* dynamic list with access array of taggroups */
352         struct ListBase queue;          /* list of taggroups waiting for receiving from verse server */
353         void *data;                     /* generic pointer at some data (VObjectData, VGeomData, ...) */
354         int counter;                    /* counter of verse link pointing at this vnode (vlink->target) */
355         /* client dependent methods */
356         void (*post_node_create)(struct VNode *vnode);  
357         void (*post_node_destroy)(struct VNode *vnode);
358         void (*post_node_name_set)(struct VNode *vnode);
359 } VNode;
360
361
362 /*
363  * Verse Session: verse client can be connected to several verse servers
364  * it is neccessary to store some information about each session
365  */
366 typedef struct VerseSession {
367         struct VerseSession *next, *prev;
368         /* verse data */
369         VSession *vsession;             /* pointer at VSeesion (verse.h) */
370         uint32 avatar;                  /* id of avatar */
371         char *address;                  /* string containg IP/domain name of verse server and number of port */
372         void *connection;               /* no clue */
373         uint8 *host_id;                 /* no clue */
374         /* blender internals */
375         short flag;                     /* flag: VERSE_CONNECTING, VERSE_CONNECTED */
376         DynamicList nodes;              /* list of verse nodes */
377         ListBase queue;                 /* list of nodes waiting for sending to verse server */
378         unsigned int counter;           /* count of events, when connection wasn't accepted */
379         /* client dependent methods */
380         void (*post_connect_accept)(struct VerseSession *session);
381         void (*post_connect_terminated)(struct VerseSession *session);
382         void (*post_connect_update)(struct VerseSession *session);
383 } VerseSession;
384
385 typedef struct VerseServer {
386         struct VerseServer *next, *prev;
387         char *name;                     /* human-readable server name */
388         char *ip;                       /* string containing IP/domain name of verse server and number of port */
389         short flag;                     /* flag: VERSE_CONNECTING, VERSE_CONNECTED */
390         struct VerseSession *session;   /* pointer to related session */
391 } VerseServer;
392 /*
393  * list of post callback functions
394  */
395 typedef struct PostCallbackFunction {
396         void (*function)(void *arg);
397         void *param;
398 } PostCallbackFunction;
399
400 /* VerseSession->flag */
401 #define VERSE_CONNECTING        1
402 #define VERSE_CONNECTED         2
403 #define VERSE_AUTOSUBSCRIBE     4
404
405 /* max VerseSession->counter value */
406 #define MAX_UNCONNECTED_EVENTS  100
407
408 /* VNode flags */
409 #define NODE_SENT               1
410 #define NODE_RECEIVED           2
411 #define NODE_DELTED             4
412 #define NODE_OBSOLETE           8
413
414 /* VLayer flags */
415 #define LAYER_SENT              1
416 #define LAYER_RECEIVED          2
417 #define LAYER_DELETED           4
418 #define LAYER_OBSOLETE          8
419
420 /* VLink->flag */
421 #define LINK_SEND_READY         1
422
423 /* VObjectData->flag */
424 #define POS_RECEIVE_READY       1
425 #define ROT_RECEIVE_READY       2
426 #define SCALE_RECEIVE_READY     4
427 #define POS_SEND_READY          8
428 #define ROT_SEND_READY          16
429 #define SCALE_SEND_READY        32
430
431 /* VLayer->content */
432 #define VERTEX_LAYER            0
433 #define POLYGON_LAYER           1
434
435 /* VerseVert->flag */
436 #define VERT_DELETED            1       /* vertex delete command was received from verse server */
437 #define VERT_RECEIVED           2       /* VerseVert was received from verse server (is not in sending queue) */
438 #define VERT_LOCKED             4       /* VerseVert is ready to send local position to verse server */
439 #define VERT_POS_OBSOLETE       8       /* position of vertex was changed during sending to verse server */
440 #define VERT_OBSOLETE           16      /* vertex delete command was sent to verse server; it means, that
441                                          * no information related to this vertex shoudln't be sent to verse
442                                          * until verse vertex is completely deleted ... then this vertex id
443                                          * can be reused again for new vertex */
444
445 /* VerseFace->flag */
446 #define FACE_SEND_READY         1       /* VerseFace is ready for sending to verse server */
447 #define FACE_RECEIVED           2       /* VerseFace was received from verse server */
448 #define FACE_SENT               4       /* VerseFace was sent to verse server and we expect receiving from verse server */
449 #define FACE_DELETED            8       /* delete command was sent to verse server */
450 #define FACE_CHANGED            16      /* VerseFace was only changed not created */
451 #define FACE_OBSOLETE           32      /* VerseFace was changed during sending to verse server */
452
453 /* Queue type */
454 #define VERSE_NODE              1
455 #define VERSE_LINK              2
456 #define VERSE_LAYER             3
457 #define VERSE_VERT              4
458 #define VERSE_FACE              5
459
460 #define VERSE_TAG               6
461 #define VERSE_TAG_GROUP         7
462
463 #define VERSE_VERT_UINT32       8
464 #define VERSE_VERT_REAL32       9
465 #define VERSE_VERT_VEC_REAL32   10
466
467 #define VERSE_FACE_UINT8        11
468 #define VERSE_FACE_UINT32       12
469 #define VERSE_FACE_REAL32       13
470 #define VERSE_FACE_QUAT_UINT32  14
471 #define VERSE_FACE_QUAT_REAL32  15
472
473 /* Verse Bitmap Layer flags */
474 #define VBLAYER_SUBSCRIBED      1
475
476 /* function prototypes */
477
478 /* functions from verse_session.c */
479 void set_verse_session_callbacks(void);
480 struct VerseSession *versesession_from_vsession(VSession *vsession);
481 struct VerseSession *current_verse_session(void);
482 struct VerseSession *create_verse_session(const char *name, const char *pass, const char *address, uint8 *expected_key);
483 void free_verse_session(struct VerseSession *session);
484 void b_verse_update(void);
485 void b_vers_ms_get(void);
486 void b_verse_connect(char *address);
487 void end_verse_session(struct VerseSession *session);
488 void end_all_verse_sessions(void);
489
490 /* functions from verse_node.c */
491 void send_verse_tag(struct VTag *vtag);
492 void send_verse_taggroup(struct VTagGroup *vtaggroup);
493 void send_verse_node(struct VNode *vnode);
494 void free_verse_node_data(struct VNode *vnode);
495 void free_verse_node(struct VNode *vnode);
496 struct VNode* create_verse_node(VerseSession *session, VNodeID node_id, uint8 type, VNodeID owner_id);
497 void set_node_callbacks(void);
498
499 /* functions from verse_object_node.c */
500 struct VLink *find_unsent_parent_vlink(struct VerseSession *session, struct VNode *vnode);
501 struct VLink *find_unsent_child_vlink(struct VerseSession *session, struct VNode *vnode);
502 struct VLink *create_verse_link(VerseSession *session, struct VNode *source, struct VNode *target, uint16 link_id, uint32 target_id, const char *label);
503 void send_verse_object_position(struct VNode *vnode);
504 void send_verse_object_rotation(struct VNode *vnode);
505 void send_verse_object_scale(struct VNode *vnode);
506 void send_verse_link(struct VLink *vlink);
507
508 void free_object_data(struct VNode *vnode);
509 void set_object_callbacks(void);
510 struct VObjectData *create_object_data(void);
511
512 /* functions from verse_geometry_node.c */
513 struct VerseFace* create_verse_face(struct VLayer *vlayer, uint32 polygon_id, uint32 v0, uint32 v1, uint32 v2, uint32 v3);
514 struct VerseVert* create_verse_vertex(struct VLayer *vlayer, uint32 vertex_id, real32 x, real32 y, real32 z);
515 struct VLayer *create_verse_layer(struct VNode *vnode, VLayerID layer_id, const char *name, VNGLayerType type, uint32 def_integer, real64 def_real);
516 struct VGeomData *create_geometry_data(void);
517
518 void send_verse_layer(struct VLayer *vlayer);
519
520 void send_verse_face_corner_quat_real32(struct quat_real32_item *item, short type);
521 void send_verse_face_corner_quat_uint32(struct quat_uint32_item *item, short type);
522 void send_verse_face_real32(struct real32_item *item, short type);
523 void send_verse_face_uint32(struct uint32_item *item, short type);
524 void send_verse_face_uint8(struct uint8_item *item, short type);
525
526 void send_verse_vert_vec_real32(struct vec_real32_item *item, short type);
527 void send_verse_vert_real32(struct real32_item *item, short type);
528 void send_verse_vert_uint32(struct uint32_item *item, short type);
529
530 void send_verse_vertex_delete(struct VerseVert *vvert);
531 void send_verse_vertex(struct VerseVert *vvert);
532 void send_verse_face_delete(struct VerseFace *vface);
533
534 void destroy_geometry(struct VNode *vnode);
535
536 struct VLayer* find_verse_layer_type(struct VGeomData *geom, short content);
537 void add_item_to_send_queue(struct ListBase *lb, void *item, short type);
538 void free_geom_data(struct VNode *vnode);
539 void set_geometry_callbacks(void);
540
541 /* functions prototypes from verse_bitmap.c */
542 void set_bitmap_callbacks(void);
543 void free_bitmap_layer_data(struct VBitmapLayer *vblayer);
544 struct VBitmapLayer *create_bitmap_layer(struct VNode *vnode, VLayerID layer_id, const char *name, VNBLayerType type);
545 void free_bitmap_node_data(struct VNode *vnode);
546 struct VBitmapData *create_bitmap_data(void);
547
548 #endif