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