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