/** * $Id$ * * ***** 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * Contributor(s): Jiri Hnidek. * * ***** END GPL LICENSE BLOCK ***** */ /* #define WITH_VERSE */ #ifndef BKE_VERSE_H #define BKE_VERSE_H #include "DNA_listBase.h" #include "BLI_dynamiclist.h" #include "verse.h" #include "verse_ms.h" struct VNode; struct VerseEdge; /* * Verse Edge Hash (similar to edit edge hash) */ #define VEDHASHSIZE (512*512) #define VEDHASH(a, b) ((a1 is 3D bitmap */ /* blender internals */ uint16 t_width; /* = (width/VN_B_TILE_SIZE + 1)*VN_B_TILE_SIZE */ uint16 t_height; /* = (height/VN_B_TILE_SIZE + 1)*VN_B_TILE_SIZE */ void *image; /* pointer at image */ /* client dependent methods */ void (*post_bitmap_dimension_set)(struct VNode *vnode); void (*post_bitmap_layer_create)(struct VBitmapLayer *vblayer); void (*post_bitmap_layer_destroy)(struct VBitmapLayer *vblayer); void (*post_bitmap_tile_set)(struct VBitmapLayer *vblayer, unsigned int xs, unsigned int ys); }VBitmapData; /* * data of geometry node */ typedef struct VGeomData { struct DynamicList layers; /* dynamic list with access array of Layers */ struct VLink *vlink; /* pointer at VerseLink connecting object node and geom node */ struct ListBase queue; /* queue of our layers waiting for receiving from verse server */ void *mesh; /* pointer at Mesh (object node) */ void *editmesh; /* pointer at EditMesh (edit mode) */ struct HashVerseEdge *hash; /* verse edge hash */ struct ListBase edges; /* list of fake verse edges */ /* client dependent methods */ void (*post_vertex_create)(struct VerseVert *vvert); void (*post_vertex_set_xyz)(struct VerseVert *vvert); void (*post_vertex_delete)(struct VerseVert *vvert); void (*post_vertex_free_constraint)(struct VerseVert *vvert); void (*post_polygon_create)(struct VerseFace *vface); void (*post_polygon_set_corner)(struct VerseFace *vface); void (*post_polygon_delete)(struct VerseFace *vface); void (*post_polygon_free_constraint)(struct VerseFace *vface); void (*post_geometry_free_constraint)(struct VNode *vnode); void (*post_polygon_set_uint8)(struct VerseFace *vface); } VGeomData; /* * data of object node */ typedef struct VObjectData { struct DynamicList links; /* dynamic list with access array of links between other nodes */ struct ListBase queue; /* queue of links waiting for sending and receiving from verse server */ float pos[3]; /* position of object VerseNode */ float quat[4]; /* rotation of object VerseNode stored in quat */ float scale[3]; /* scale of object VerseNode */ void *object; /* pointer at object */ short flag; /* flag: POS_RECEIVE_READY, ROT_RECEIVE_READY. SCALE_RECEIVE_READY */ /* client dependent methods */ /* void (*post_transform)(struct VNode *vnode);*/ void (*post_transform_pos)(struct VNode *vnode); void (*post_transform_rot)(struct VNode *vnode); void (*post_transform_scale)(struct VNode *vnode); void (*post_object_free_constraint)(struct VNode *vnode); } VObjectData; /* * Verse Tag */ typedef struct VTag { struct VTag *next, *prev; /* verse data*/ struct VTagGroup *vtaggroup; /* pointer at Verse Tag Group */ uint16 id; /* id of this tag */ char *name; /* name of this tag*/ VNTagType type; /* type: VN_TAG_BOOLEAN, VN_TAG_UINT32, VN_TAG_REAL64, VN_TAG_REAL64_VEC3, VN_TAG_LINK, VN_TAG_ANIMATION, VN_TAG_BLOB */ VNTag *tag; /* pointer at value (enum: vboolean, vuint32, vreal64, vstring, vreal64_vec3, vlink, vanimation, vblob)*/ /* blender internals */ void *value; /* pointer at blender value */ } VTag; /* * Verse Tag Group (verse tags are grouped in tag groups) */ typedef struct VTagGroup { struct VTagGroup *next, *prev; /* verse data*/ struct VNode *vnode; /* pointer at Verse Node */ uint16 id; /* id of this tag group */ char *name; /* name of this tag group */ /* blender internals */ struct DynamicList tags; /* dynamic list with access array containing tags */ struct ListBase queue; /* list of tags waiting for receiving from verse server */ /* client dependent methods */ void (*post_tag_change)(struct VTag *vatg); void (*post_taggroup_create)(struct VTagGroup *vtaggroup); } VTagGroup; /* * Verse Method Group */ typedef struct VMethodGroup { struct VMethodGroup *next, *prev; uint16 group_id; char name[16]; struct ListBase methods; } VMethodGroup; /* * Verse Method */ typedef struct VMethod { struct VMethod *next, *prev; uint16 id; char name[500]; uint8 param_count; VNOParamType *param_type; char **param_name; } VMethod; /* * Verse Node */ typedef struct VNode { struct VNode *next, *prev; /* verse data*/ struct VerseSession *session; /* session pointer */ VNodeID id; /* node id */ VNodeID owner_id; /* owner's id of this node */ char *name; /* name of this node */ uint32 type; /* type of node (V_NT_OBJECT, V_NT_GEOMETRY, V_NT_BITMAP) */ /* blender internals */ char flag; /* flags: NODE_SENT, NODE_RECEIVED, NODE_DELTED, NODE_OBSOLETE */ struct DynamicList taggroups; /* dynamic list with access array of taggroups */ struct ListBase methodgroups; /* method groups */ struct ListBase queue; /* list of taggroups waiting for receiving from verse server */ void *data; /* generic pointer at some data (VObjectData, VGeomData, ...) */ int counter; /* counter of verse link pointing at this vnode (vlink->target) */ /* client dependent methods */ void (*post_node_create)(struct VNode *vnode); void (*post_node_destroy)(struct VNode *vnode); void (*post_node_name_set)(struct VNode *vnode); #ifdef VERSECHAT /* verse chat */ int chat_flag; /* CHAT_LOGGED, CHAT_NOTLOGGED */ #endif } VNode; /* * Verse Session: verse client can be connected to several verse servers * it is neccessary to store some information about each session */ typedef struct VerseSession { struct VerseSession *next, *prev; /* verse data */ VSession *vsession; /* pointer at VSeesion (verse.h) */ uint32 avatar; /* id of avatar */ char *address; /* string containg IP/domain name of verse server and number of port */ void *connection; /* no clue */ uint8 *host_id; /* no clue */ /* blender internals */ short flag; /* flag: VERSE_CONNECTING, VERSE_CONNECTED */ DynamicList nodes; /* list of verse nodes */ ListBase queue; /* list of nodes waiting for sending to verse server */ unsigned int counter; /* count of events, when connection wasn't accepted */ /* client dependent methods */ void (*post_connect_accept)(struct VerseSession *session); void (*post_connect_terminated)(struct VerseSession *session); void (*post_connect_update)(struct VerseSession *session); } VerseSession; typedef struct VerseServer { struct VerseServer *next, *prev; char *name; /* human-readable server name */ char *ip; /* string containing IP/domain name of verse server and number of port */ short flag; /* flag: VERSE_CONNECTING, VERSE_CONNECTED */ struct VerseSession *session; /* pointer to related session */ } VerseServer; /* * list of post callback functions */ typedef struct PostCallbackFunction { void (*function)(void *arg); void *param; } PostCallbackFunction; /* VerseSession->flag */ #define VERSE_CONNECTING 1 #define VERSE_CONNECTED 2 #define VERSE_AUTOSUBSCRIBE 4 /* max VerseSession->counter value */ #define MAX_UNCONNECTED_EVENTS 100 /* VNode flags */ #define NODE_SENT 1 #define NODE_RECEIVED 2 #define NODE_DELTED 4 #define NODE_OBSOLETE 8 #ifdef VERSECHAT #define CHAT_NOTLOGGED 0 #define CHAT_LOGGED 1 #endif /* VLayer flags */ #define LAYER_SENT 1 #define LAYER_RECEIVED 2 #define LAYER_DELETED 4 #define LAYER_OBSOLETE 8 /* VLink->flag */ #define LINK_SEND_READY 1 /* VObjectData->flag */ #define POS_RECEIVE_READY 1 #define ROT_RECEIVE_READY 2 #define SCALE_RECEIVE_READY 4 #define POS_SEND_READY 8 #define ROT_SEND_READY 16 #define SCALE_SEND_READY 32 /* VLayer->content */ #define VERTEX_LAYER 0 #define POLYGON_LAYER 1 /* VerseVert->flag */ #define VERT_DELETED 1 /* vertex delete command was received from verse server */ #define VERT_RECEIVED 2 /* VerseVert was received from verse server (is not in sending queue) */ #define VERT_LOCKED 4 /* VerseVert is ready to send local position to verse server */ #define VERT_POS_OBSOLETE 8 /* position of vertex was changed during sending to verse server */ #define VERT_OBSOLETE 16 /* vertex delete command was sent to verse server; it means, that * no information related to this vertex shoudln't be sent to verse * until verse vertex is completely deleted ... then this vertex id * can be reused again for new vertex */ /* VerseFace->flag */ #define FACE_SEND_READY 1 /* VerseFace is ready for sending to verse server */ #define FACE_RECEIVED 2 /* VerseFace was received from verse server */ #define FACE_SENT 4 /* VerseFace was sent to verse server and we expect receiving from verse server */ #define FACE_DELETED 8 /* delete command was sent to verse server */ #define FACE_CHANGED 16 /* VerseFace was only changed not created */ #define FACE_OBSOLETE 32 /* VerseFace was changed during sending to verse server */ /* Queue type */ #define VERSE_NODE 1 #define VERSE_LINK 2 #define VERSE_LAYER 3 #define VERSE_VERT 4 #define VERSE_FACE 5 #define VERSE_TAG 6 #define VERSE_TAG_GROUP 7 #define VERSE_VERT_UINT32 8 #define VERSE_VERT_REAL32 9 #define VERSE_VERT_VEC_REAL32 10 #define VERSE_FACE_UINT8 11 #define VERSE_FACE_UINT32 12 #define VERSE_FACE_REAL32 13 #define VERSE_FACE_QUAT_UINT32 14 #define VERSE_FACE_QUAT_REAL32 15 /* Verse Bitmap Layer flags */ #define VBLAYER_SUBSCRIBED 1 /* function prototypes */ /* functions from verse_session.c */ void set_verse_session_callbacks(void); struct VerseSession *versesession_from_vsession(VSession *vsession); struct VerseSession *current_verse_session(void); struct VerseSession *create_verse_session(const char *name, const char *pass, const char *address, uint8 *expected_key); void free_verse_session(struct VerseSession *session); void b_verse_update(void); void b_verse_ms_get(void); void b_verse_connect(char *address); void end_verse_session(struct VerseSession *session); void end_all_verse_sessions(void); /* functions from verse_node.c */ void send_verse_tag(struct VTag *vtag); void send_verse_taggroup(struct VTagGroup *vtaggroup); void send_verse_node(struct VNode *vnode); void free_verse_node_data(struct VNode *vnode); void free_verse_node(struct VNode *vnode); struct VNode* lookup_vnode(VerseSession *session, VNodeID node_id); struct VNode* create_verse_node(VerseSession *session, VNodeID node_id, uint8 type, VNodeID owner_id); void set_node_callbacks(void); /* functions from verse_object_node.c */ struct VLink *find_unsent_parent_vlink(struct VerseSession *session, struct VNode *vnode); struct VLink *find_unsent_child_vlink(struct VerseSession *session, struct VNode *vnode); struct VLink *create_verse_link(VerseSession *session, struct VNode *source, struct VNode *target, uint16 link_id, uint32 target_id, const char *label); void send_verse_object_position(struct VNode *vnode); void send_verse_object_rotation(struct VNode *vnode); void send_verse_object_scale(struct VNode *vnode); void send_verse_link(struct VLink *vlink); void free_object_data(struct VNode *vnode); void set_object_callbacks(void); struct VObjectData *create_object_data(void); /* functions from verse_method.c */ void free_verse_methodgroup(VMethodGroup *vmg); #ifdef VERSECHAT void send_say(const char *chan, const char *utter); void send_login(struct VNode *vnode); void send_logout(struct VNode *vnode); void send_join(struct VNode *vnode, const char *chan); void send_leave(struct VNode *vnode, const char *chan); #endif void set_method_callbacks(void); /* functions from verse_geometry_node.c */ struct VerseFace* create_verse_face(struct VLayer *vlayer, uint32 polygon_id, uint32 v0, uint32 v1, uint32 v2, uint32 v3); struct VerseVert* create_verse_vertex(struct VLayer *vlayer, uint32 vertex_id, real32 x, real32 y, real32 z); struct VLayer *create_verse_layer(struct VNode *vnode, VLayerID layer_id, const char *name, VNGLayerType type, uint32 def_integer, real64 def_real); struct VGeomData *create_geometry_data(void); void send_verse_layer(struct VLayer *vlayer); void send_verse_face_corner_quat_real32(struct quat_real32_item *item, short type); void send_verse_face_corner_quat_uint32(struct quat_uint32_item *item, short type); void send_verse_face_real32(struct real32_item *item, short type); void send_verse_face_uint32(struct uint32_item *item, short type); void send_verse_face_uint8(struct uint8_item *item, short type); void send_verse_vert_vec_real32(struct vec_real32_item *item, short type); void send_verse_vert_real32(struct real32_item *item, short type); void send_verse_vert_uint32(struct uint32_item *item, short type); void send_verse_vertex_delete(struct VerseVert *vvert); void send_verse_vertex(struct VerseVert *vvert); void send_verse_face_delete(struct VerseFace *vface); void destroy_geometry(struct VNode *vnode); struct VLayer* find_verse_layer_type(struct VGeomData *geom, short content); void add_item_to_send_queue(struct ListBase *lb, void *item, short type); void free_geom_data(struct VNode *vnode); void set_geometry_callbacks(void); /* functions prototypes from verse_bitmap.c */ void set_bitmap_callbacks(void); void free_bitmap_layer_data(struct VBitmapLayer *vblayer); struct VBitmapLayer *create_bitmap_layer(struct VNode *vnode, VLayerID layer_id, const char *name, VNBLayerType type); void free_bitmap_node_data(struct VNode *vnode); struct VBitmapData *create_bitmap_data(void); #endif