diff options
author | Nathan Letwory <nathan@letworyinteractive.com> | 2006-10-12 15:53:50 +0400 |
---|---|---|
committer | Nathan Letwory <nathan@letworyinteractive.com> | 2006-10-12 15:53:50 +0400 |
commit | b2a8417fce8d231188ee75062804be4d471c57be (patch) | |
tree | 86d163d10a0f486fc203e0c95619c6f2b06aa6b1 /source | |
parent | 86e192ea40ececcade256e528c557d9018751cb8 (diff) |
Add Verse master-server functionality
* added two files from verse-master
* server list is available in outliner (new mode "Verse Servers")
* verse sessions are now also in new mode "Verse Sessions" in outliner
* fixed drawing of verse sessions and their nodes
* in user preferences System & OpenGL master-server ip setting (default master.uni-verse.org)
* in File>Verse entry "Get Servers" to get server list or
* RMB on "Available Verse Servers" in outliner to "Refresh" server list
Enjoy :)
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenkernel/BKE_verse.h | 9 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/verse_session.c | 129 | ||||
-rw-r--r-- | source/blender/include/BIF_verse.h | 1 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_ID.h | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_space_types.h | 2 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_userdef_types.h | 1 | ||||
-rw-r--r-- | source/blender/src/header_info.c | 5 | ||||
-rw-r--r-- | source/blender/src/header_oops.c | 10 | ||||
-rw-r--r-- | source/blender/src/outliner.c | 94 | ||||
-rw-r--r-- | source/blender/src/space.c | 8 | ||||
-rw-r--r-- | source/blender/src/usiblender.c | 6 | ||||
-rw-r--r-- | source/blender/src/verse_common.c | 27 |
12 files changed, 269 insertions, 25 deletions
diff --git a/source/blender/blenkernel/BKE_verse.h b/source/blender/blenkernel/BKE_verse.h index 00a6bdd4e60..932a11f2f94 100644 --- a/source/blender/blenkernel/BKE_verse.h +++ b/source/blender/blenkernel/BKE_verse.h @@ -34,6 +34,7 @@ #include "BLI_dynamiclist.h" #include "verse.h" +#include "verse_ms.h" struct VNode; @@ -322,6 +323,13 @@ typedef struct VNode { void (*post_node_name_set)(struct VNode *vnode); } VNode; +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 */ +} VerseServer; + /* * Verse Session: verse client can be connected to several verse servers * it is neccessary to store some information about each session @@ -438,6 +446,7 @@ 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_vers_ms_get(void); void b_verse_connect(char *address); void end_verse_session(struct VerseSession *session, char free); void end_all_verse_sessions(void); diff --git a/source/blender/blenkernel/intern/verse_session.c b/source/blender/blenkernel/intern/verse_session.c index e6f16a93239..d4b4a0b0fa7 100644 --- a/source/blender/blenkernel/intern/verse_session.c +++ b/source/blender/blenkernel/intern/verse_session.c @@ -34,6 +34,7 @@ #include "DNA_mesh_types.h" /* temp */ #include "DNA_listBase.h" #include "DNA_screen_types.h" +#include "DNA_userdef_types.h" #include "BLI_dynamiclist.h" #include "BLI_blenlib.h" @@ -43,15 +44,88 @@ #include "BKE_global.h" #include "BKE_verse.h" -#include "verse.h" - struct ListBase session_list={NULL, NULL}; +struct ListBase server_list={NULL, NULL}; + +static cb_ping_registered = 0; /* list of static function prototypes */ static void cb_connect_terminate(const char *address, const char *bye); static void cb_connect_accept(void *user_data, uint32 avatar, void *address, void *connection, const uint8 *host_id); static void set_all_callbacks(void); static void free_verse_session_data(struct VerseSession *session); +static void add_verse_server(VMSServer *server); +static void check_connection_state(struct VerseServer *server); + +static void check_connection_state(struct VerseServer *server) +{ + struct VerseSession *session; + session = session_list.first; + while(session) { + if(strcmp(server->ip,session->address)==0) { + server->flag = session->flag; + return; + } + session = session->next; + } +} +/* + * add verse server to server_list. Prevents duplicate + * entries + */ +static void add_verse_server(VMSServer *server) +{ + struct VerseServer *iter, *niter; + VerseServer *newserver; + const char *name = verse_ms_field_value(server, "DE"); + iter = server_list.first; + + while(iter) { + niter = iter->next; + if(strcmp(iter->ip, server->ip)==0) { + return; + } + iter = niter; + } + + newserver = (VerseServer *)MEM_mallocN(sizeof(VerseServer), "VerseServer"); + newserver->ip = (char *)MEM_mallocN(sizeof(char)*(strlen(server->ip)+1), "VerseServer ip"); + strcpy(newserver->ip, server->ip); + + if(name) { + newserver->name = (char *)MEM_mallocN(sizeof(char)*(strlen(name)+strlen(newserver->ip)+4), "VerseServer name"); + strcpy(newserver->name, name); + strcat(newserver->name, " ("); + strcat(newserver->name, newserver->ip); + strcat(newserver->name, ")"); + } + + newserver->flag = 0; + check_connection_state(newserver); + + printf("Adding new verse server: %s at %s\n", newserver->name, newserver->ip); + + BLI_addtail(&server_list, newserver); + post_server_add(); +} + +/* + * callback function for ping + */ +static void cb_ping(void *user, const char *address, const char *message) +{ + VMSServer **servers = verse_ms_list_parse(message); + if(servers != NULL) + { + int i, j; + + for(i = 0; servers[i] != NULL; i++) + { + add_verse_server(servers[i]); + } + free(servers); + } +} /* * callback function for connection terminated @@ -83,6 +157,7 @@ static void cb_connect_accept( const uint8 *host_id) { struct VerseSession *session = (VerseSession*)current_verse_session(); + struct VerseServer *server = server_list.first; uint32 i, mask=0; if(!session) return; @@ -90,6 +165,14 @@ static void cb_connect_accept( session->flag |= VERSE_CONNECTED; session->flag &= ~VERSE_CONNECTING; + while(server) { + if(strcmp(session->address, server->ip)==0) { + server->flag |= VERSE_CONNECTED; + server->flag &= ~VERSE_CONNECTING; + } + server = server->next; + } + printf("\tBlender was connected to verse server: %s\n", (char*)address); printf("\tVerseSession->counter: %d\n", session->counter); @@ -111,6 +194,7 @@ void set_verse_session_callbacks(void) verse_callback_set(verse_send_connect_accept, cb_connect_accept, NULL); /* connection was terminated */ verse_callback_set(verse_send_connect_terminate, cb_connect_terminate, NULL); + } /* @@ -151,6 +235,9 @@ void b_verse_update(void) } session = next_session; } + if(cb_ping_registered>0) { + verse_callback_update(10); + } } /* @@ -298,8 +385,27 @@ void end_verse_session(VerseSession *session, char free) if(free) free_verse_session(session); } +void free_all_servers(void) +{ + VerseServer *server, *nextserver; + + server = server_list.first; + + while(server) { + nextserver = server->next; + BLI_remlink(&server_list, server); + MEM_freeN(server->name); + MEM_freeN(server->ip); + MEM_freeN(server); + server = nextserver; + } + + BLI_freelistN(&server_list); +} + /* * end connection to all verse hosts (servers) ... free all VerseSessions + * free all VerseServers */ void end_all_verse_sessions(void) { @@ -314,6 +420,25 @@ void end_all_verse_sessions(void) } BLI_freelistN(&session_list); + + free_all_servers(); +} + +/* + * do a get from ms + */ +void b_verse_ms_get(void) +{ + if(cb_ping_registered==0) { + /* handle ping messages (for master server) */ + verse_callback_set(verse_send_ping, cb_ping, NULL); + add_screenhandler(G.curscreen, SCREEN_HANDLER_VERSE, 1); + cb_ping_registered++; + } + free_all_servers(); + + verse_ms_get_send(U.versemaster, VERSE_MS_FIELD_DESCRIPTION, NULL); + verse_callback_update(10); } /* diff --git a/source/blender/include/BIF_verse.h b/source/blender/include/BIF_verse.h index 7dada3f3986..74eed5e6b57 100644 --- a/source/blender/include/BIF_verse.h +++ b/source/blender/include/BIF_verse.h @@ -120,6 +120,7 @@ void post_node_name_set(struct VNode *vnode); void post_connect_accept(struct VerseSession *session); void post_connect_terminated(struct VerseSession *session); void post_connect_update(struct VerseSession *session); +void post_server_add(void); /* verse_image.c */ diff --git a/source/blender/makesdna/DNA_ID.h b/source/blender/makesdna/DNA_ID.h index 847f7123150..d11b6ad567e 100644 --- a/source/blender/makesdna/DNA_ID.h +++ b/source/blender/makesdna/DNA_ID.h @@ -143,6 +143,8 @@ typedef struct Library { /*#ifdef WITH_VERSE*/ #define ID_VS MAKE_ID2('V', 'S') /* fake id for VerseSession, needed for outliner */ #define ID_VN MAKE_ID2('V', 'N') /* fake id for VerseNode, needed for outliner */ +#define ID_MS MAKE_ID2('M', 'S') /* fake id for VerseServer root entry, needed for outliner */ +#define ID_SS MAKE_ID2('S', 'S') /* fake id for VerseServer entry, needed for ountliner */ /*#endif*/ diff --git a/source/blender/makesdna/DNA_space_types.h b/source/blender/makesdna/DNA_space_types.h index 6f21eb86f56..d5f50529ca9 100644 --- a/source/blender/makesdna/DNA_space_types.h +++ b/source/blender/makesdna/DNA_space_types.h @@ -527,6 +527,8 @@ typedef struct SpaceImaSel { #define SO_SAME_TYPE 5 #define SO_GROUPS 6 #define SO_LIBRARIES 7 +#define SO_VERSE_SESSION 8 +#define SO_VERSE_MS 9 /* SpaceOops->storeflag */ #define SO_TREESTORE_CLEANUP 1 diff --git a/source/blender/makesdna/DNA_userdef_types.h b/source/blender/makesdna/DNA_userdef_types.h index 6a73f9a6674..936321dd312 100644 --- a/source/blender/makesdna/DNA_userdef_types.h +++ b/source/blender/makesdna/DNA_userdef_types.h @@ -172,6 +172,7 @@ typedef struct UserDef { short obcenter_dia; short rvisize; /* rotating view icon size */ short rvibright; /* rotating view icon brightness */ + char versemaster[160]; short pad1; } UserDef; diff --git a/source/blender/src/header_info.c b/source/blender/src/header_info.c index 6ab3f8fee69..f96bd8b7b2b 100644 --- a/source/blender/src/header_info.c +++ b/source/blender/src/header_info.c @@ -773,6 +773,10 @@ static void do_verse_filemenu(void *arg, int event) printf("Disconnecting all sessions!\n"); end_all_verse_sessions(); break; + case 4: + printf("sending get to master server\n"); + b_verse_ms_get(); + break; } } @@ -799,6 +803,7 @@ static uiBlock *verse_filemenu(void *unusedargs) } } + uiDefIconTextBut(block, BUTM, 1, ICON_BLANK1, "Get Servers", 0, yco-=20, menuwidth, 19, NULL, 0.0, 0.0, 1, 4, ""); uiBlockSetDirection(block, UI_RIGHT); uiTextBoundsBlock(block, 60); diff --git a/source/blender/src/header_oops.c b/source/blender/src/header_oops.c index 98dbced9dbd..c4ebda76eae 100644 --- a/source/blender/src/header_oops.c +++ b/source/blender/src/header_oops.c @@ -477,10 +477,18 @@ void oops_buttons(void) } #endif else { - if(G.main->library.first) + if(G.main->library.first) +#ifdef WITH_VERSE + uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Verse Servers %x9|Verse Sessions %x8|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4", xco, 0, 100, 20, &soops->outlinevis, 0, 0, 0, 0, ""); +#else uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Libraries %x7|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4", xco, 0, 100, 20, &soops->outlinevis, 0, 0, 0, 0, ""); +#endif /* WITH_VERSE */ else +#ifdef WITH_VERSE + uiDefButS(block, MENU, B_REDR, "Outliner Display%t|Verse Servers %x9|Verse Sessions %x8|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4", xco, 0, 100, 20, &soops->outlinevis, 0, 0, 0, 0, ""); +#else uiDefButS(block, MENU, B_REDR, "Outliner Display%t|All Scenes %x0|Current Scene %x1|Visible Layers %x2|Groups %x6|Same Types %x5|Selected %x3|Active %x4", xco, 0, 100, 20, &soops->outlinevis, 0, 0, 0, 0, ""); +#endif /* WITH_VERSE */ } /* always do as last */ diff --git a/source/blender/src/outliner.c b/source/blender/src/outliner.c index f9e9e06e99f..40fb31fcbf7 100644 --- a/source/blender/src/outliner.c +++ b/source/blender/src/outliner.c @@ -124,6 +124,7 @@ #ifdef WITH_VERSE extern ListBase session_list; +extern ListBase server_list; #endif /* ******************** PERSISTANT DATA ***************** */ @@ -724,6 +725,16 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i te->directdata = (void*)session; te->idcode = ID_VS; } + else if(type==ID_MS) { + te->name = "Available Verse Servers"; + te->idcode = ID_MS; + } + else if(type==ID_SS) { + struct VerseServer *server = (VerseServer *)idv; + te->name = server->name; + te->directdata = (void *)server; + te->idcode = ID_SS; + } else if(type==ID_VN) { struct VNode *vnode = (VNode*)idv; te->name = vnode->name; @@ -888,31 +899,44 @@ static void outliner_build_tree(SpaceOops *soops) } outliner_make_hierarchy(soops, &soops->tree); } - else { - ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0); - if(ten) ten->directdata= BASACT; - } - #ifdef WITH_VERSE - /* add all session to the "root" of hierarchy */ - for(session=session_list.first; session; session = session->next) { - struct VNode *vnode; - if(session->flag & VERSE_CONNECTED) { - te= outliner_add_element(soops, &soops->tree, session, NULL, ID_VS, 0); - /* add all object nodes as childreen of session */ - for(vnode=session->nodes.lb.first; vnode; vnode=vnode->next) { - if(vnode->type==V_NT_OBJECT) { - ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); - ten->directdata= vnode; - } - else if(vnode->type==V_NT_BITMAP) { - ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); - ten->directdata= vnode; + else if(soops->outlinevis == SO_VERSE_SESSION) { + /* add all session to the "root" of hierarchy */ + for(session=session_list.first; session; session = session->next) { + struct VNode *vnode; + if(session->flag & VERSE_CONNECTED) { + te= outliner_add_element(soops, &soops->tree, session, NULL, ID_VS, 0); + /* add all object nodes as childreen of session */ + for(vnode=session->nodes.lb.first; vnode; vnode=vnode->next) { + if(vnode->type==V_NT_OBJECT) { + ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); + ten->directdata= vnode; + } + else if(vnode->type==V_NT_BITMAP) { + ten= outliner_add_element(soops, &te->subtree, vnode, te, ID_VN, 0); + ten->directdata= vnode; + } } } } } + else if(soops->outlinevis == SO_VERSE_MS) { + te= outliner_add_element(soops, &soops->tree, "MS", NULL, ID_MS, 0); + if(server_list.first!=NULL) { + struct VerseServer *server; + /* add one main entry to root of hierarchy */ + for(server=server_list.first; server; server=server->next) { + ten= outliner_add_element(soops, &te->subtree, server, te, ID_SS, 0); + ten->directdata= server; + } + } + } #endif + else { + ten= outliner_add_element(soops, &soops->tree, OBACT, NULL, 0, 0); + if(ten) ten->directdata= BASACT; + } + outliner_sort(soops, &soops->tree); } @@ -1643,6 +1667,30 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even break; } } + else if(te->idcode==ID_MS) { + event = pupmenu("Verse Master Server %t| Refresh %x1"); + b_verse_ms_get(); + } + else if(te->idcode==ID_SS) { + struct VerseServer *vserver = (VerseServer*)te->directdata; + + if(!(vserver->flag & VERSE_CONNECTING) && !(vserver->flag & VERSE_CONNECTED)) { + event = pupmenu("VerseServer %t| Connect %x1"); + } else if((vserver->flag & VERSE_CONNECTING) && !(vserver->flag & VERSE_CONNECTED)) { + event = pupmenu("VerseServer %t| Connecting... %x2"); + } else if(!(vserver->flag & VERSE_CONNECTING) && (vserver->flag & VERSE_CONNECTED)) { + event = pupmenu("VerseServer %t| Connected %x3"); + } + switch(event) { + case 1: + b_verse_connect(vserver->ip); + vserver->flag |= VERSE_CONNECTING; + break; + case 2: + case 3: + break; + } + } } else { #endif @@ -2330,6 +2378,8 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem, TreeElemen BIF_icon_draw(x, y, ICON_WPAINT_DEHLT); break; #ifdef WITH_VERSE case ID_VS: + case ID_MS: + case ID_SS: BIF_icon_draw(x, y, ICON_VERSE); break; case ID_VN: BIF_icon_draw(x, y, ICON_VERSE); break; @@ -2492,7 +2542,7 @@ static void outliner_draw_tree_element(SpaceOops *soops, TreeElement *te, int st /* open/close icon, only when sublevels, except for scene */ if(te->subtree.first || te->idcode==ID_SCE) { int icon_x; - if(tselem->type==0 && (te->idcode==ID_OB || te->idcode==ID_SCE)) + if((tselem->type==0 && (te->idcode==ID_OB || te->idcode==ID_SCE)) || te->idcode==ID_VN || te->idcode==ID_VS || te->idcode==ID_MS || te->idcode==ID_SS) icon_x = startx; else icon_x = startx+5; @@ -2583,7 +2633,7 @@ static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx, tselem= TREESTORE(te); /* horizontal line? */ - if(tselem->type==0 && (te->idcode==ID_OB || te->idcode==ID_SCE)) + if((tselem->type==0 && (te->idcode==ID_OB || te->idcode==ID_SCE)) || ELEM4(te->idcode,ID_VS,ID_VN,ID_MS,ID_SS)) glRecti(startx, *starty, startx+OL_X, *starty-1); *starty-= OL_H; @@ -2596,7 +2646,7 @@ static void outliner_draw_hierarchy(SpaceOops *soops, ListBase *lb, int startx, te= lb->last; if(te->parent || lb->first!=lb->last) { tselem= TREESTORE(te); - if(tselem->type==0 && te->idcode==ID_OB) { + if((tselem->type==0 && te->idcode==ID_OB) || ELEM4(te->idcode,ID_VS,ID_VN,ID_MS,ID_SS)) { glRecti(startx, y1+OL_H, startx+1, y2); } diff --git a/source/blender/src/space.c b/source/blender/src/space.c index ccf80c3e910..1971452d2fe 100644 --- a/source/blender/src/space.c +++ b/source/blender/src/space.c @@ -3015,6 +3015,14 @@ void drawinfospace(ScrArea *sa, void *spacedata) } } else if (U.userpref == 4) { /* system & opengl */ + +#ifdef WITH_VERSE + uiDefBut(block, TEX, 0, "Verse Master: ", + (xpos+edgsp),y3label+buth+5,mpref*2,buth, + U.versemaster, 1.0, 63.0, 0, 0, + "The Verse Master-server IP"); +#endif + uiDefBut(block, LABEL,0,"Solid OpenGL light:", xpos+edgsp, y3label, mpref, buth, 0, 0, 0, 0, 0, ""); diff --git a/source/blender/src/usiblender.c b/source/blender/src/usiblender.c index f2a36ca3086..6782a3f0c6a 100644 --- a/source/blender/src/usiblender.c +++ b/source/blender/src/usiblender.c @@ -352,6 +352,12 @@ static void init_userdef_file(void) refresh_interface_font(); +#ifdef WITH_VERSE + if(strlen(U.versemaster)<1) { + strcpy(U.versemaster, "master.uni-verse.org"); + } +#endif + } #ifdef WITH_VERSE diff --git a/source/blender/src/verse_common.c b/source/blender/src/verse_common.c index ec1ee8cf024..4e8cf10746d 100644 --- a/source/blender/src/verse_common.c +++ b/source/blender/src/verse_common.c @@ -45,6 +45,7 @@ #include "BIF_interface.h" extern ListBase session_list; +extern ListBase server_list; /* * this function creates popup menu with all active VerseSessions @@ -221,10 +222,26 @@ void post_node_name_set(VNode *vnode) */ void post_connect_accept(VerseSession *session) { + VerseServer *server; + G.f |= G_VERSE_CONNECTED; session->counter = 0; + server = server_list.first; + while(server) { + if(strcmp(server->ip, session->address)==0) { + server->flag = session->flag; + break; + } + server = server->next; + } + + allqueue(REDRAWOOPS, 0); +} + +void post_server_add(void) +{ allqueue(REDRAWOOPS, 0); } @@ -233,6 +250,16 @@ void post_connect_accept(VerseSession *session) */ void post_connect_terminated(VerseSession *session) { + VerseServer *server; + server = server_list.first; + while(server) { + if(strcmp(server->ip, session->address)==0) { + server->flag = 0; + break; + } + server = server->next; + } + /* if it is last session, then no other will exist ... set Global flag */ if((session->prev==NULL) && (session->next==NULL)) G.f &= ~G_VERSE_CONNECTED; |