Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorNathan Letwory <nathan@letworyinteractive.com>2006-10-12 15:53:50 +0400
committerNathan Letwory <nathan@letworyinteractive.com>2006-10-12 15:53:50 +0400
commitb2a8417fce8d231188ee75062804be4d471c57be (patch)
tree86d163d10a0f486fc203e0c95619c6f2b06aa6b1 /source
parent86e192ea40ececcade256e528c557d9018751cb8 (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.h9
-rw-r--r--source/blender/blenkernel/intern/verse_session.c129
-rw-r--r--source/blender/include/BIF_verse.h1
-rw-r--r--source/blender/makesdna/DNA_ID.h2
-rw-r--r--source/blender/makesdna/DNA_space_types.h2
-rw-r--r--source/blender/makesdna/DNA_userdef_types.h1
-rw-r--r--source/blender/src/header_info.c5
-rw-r--r--source/blender/src/header_oops.c10
-rw-r--r--source/blender/src/outliner.c94
-rw-r--r--source/blender/src/space.c8
-rw-r--r--source/blender/src/usiblender.c6
-rw-r--r--source/blender/src/verse_common.c27
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;