296 lines
6.6 KiB
C
296 lines
6.6 KiB
C
/**
|
|
* $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 *****
|
|
*/
|
|
|
|
#ifdef WITH_VERSE
|
|
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "MEM_guardedalloc.h"
|
|
|
|
#include "mydevice.h"
|
|
|
|
#include "DNA_object_types.h"
|
|
#include "DNA_mesh_types.h"
|
|
|
|
#include "BKE_global.h"
|
|
#include "BKE_blender.h"
|
|
|
|
#include "BIF_verse.h"
|
|
#include "BIF_space.h"
|
|
#include "BIF_interface.h"
|
|
|
|
extern ListBase session_list;
|
|
extern ListBase server_list;
|
|
|
|
/*
|
|
* this function creates popup menu with all active VerseSessions
|
|
* it return pointer at selected VerseSession, if no VerseSession
|
|
* is selected, then NULL is returned
|
|
*/
|
|
VerseSession *session_menu(void)
|
|
{
|
|
struct VerseSession *session;
|
|
char session_number[10];
|
|
short i=1, num=1;
|
|
char session_address_list[1024]; /* pupmenu business */
|
|
|
|
session_number[0] = '\0';
|
|
session_address_list[0] = '\0';
|
|
|
|
strcat(session_address_list, "Session list %t");
|
|
|
|
session = session_list.first;
|
|
|
|
while(session){
|
|
strcat(session_address_list, "| ");
|
|
strcat(session_address_list, session->address);
|
|
strcat(session_address_list, " %x");
|
|
sprintf(session_number, "%d", num);
|
|
strcat(session_address_list, session_number);
|
|
num++;
|
|
session = session->next;
|
|
}
|
|
|
|
printf("session list: %s\n", session_address_list);
|
|
num = pupmenu(session_address_list);
|
|
|
|
if(num==-1) return NULL;
|
|
|
|
session = session_list.first;
|
|
|
|
while(session) {
|
|
if(i==num) return session;
|
|
i++;
|
|
session = session->next;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/*
|
|
* returns name of verse client (it is used as avatar's name)
|
|
*/
|
|
char *verse_client_name(void)
|
|
{
|
|
char *client_name;
|
|
char blender_version[5];
|
|
short name_lenght = 14;
|
|
|
|
#ifndef WIN32
|
|
char *hostname;
|
|
hostname = getenv("HOSTNAME");
|
|
if(hostname) name_lenght += strlen(hostname);
|
|
#endif
|
|
|
|
client_name = (char*)MEM_mallocN(sizeof(char)*name_lenght, "verse client name");
|
|
client_name[0] = '\0';
|
|
|
|
strcat(client_name, "blender_");
|
|
blender_version[0] = '\0';
|
|
sprintf(blender_version, "%d", BLENDER_VERSION);
|
|
strcat(client_name, blender_version);
|
|
|
|
#ifndef WIN32
|
|
/* add at the end of the client name hostname */
|
|
if(hostname) {
|
|
strcat(client_name, ":");
|
|
strcat(client_name, hostname);
|
|
}
|
|
#endif
|
|
|
|
return client_name;
|
|
}
|
|
|
|
/*===========================================================
|
|
*
|
|
* functions executed after calling callback functions
|
|
*
|
|
============================================================*/
|
|
|
|
/*
|
|
* this function is called, when some tag was changed or new tag was created
|
|
*/
|
|
void post_tag_change(VTag *vtag)
|
|
{
|
|
printf("\tnew tag %s was created or changed\n", vtag->name);
|
|
}
|
|
|
|
/*
|
|
* this function is called, when verse taggroup was created
|
|
*/
|
|
void post_taggroup_create(VTagGroup *vtaggroup)
|
|
{
|
|
printf("\tnew taggroup %s was created\n", vtaggroup->name);
|
|
}
|
|
|
|
/*
|
|
* this function is called after creating of new VerseNode
|
|
*/
|
|
void post_node_create(VNode *vnode)
|
|
{
|
|
struct VerseSession *session = vnode->session;
|
|
|
|
if((session->flag & VERSE_AUTOSUBSCRIBE) && (vnode->owner_id != VN_OWNER_MINE)) {
|
|
if(vnode->type == V_NT_OBJECT) {
|
|
create_object_from_verse_node(vnode);
|
|
}
|
|
else if(vnode->type == V_NT_GEOMETRY) {
|
|
create_mesh_from_geom_node(vnode);;
|
|
}
|
|
}
|
|
|
|
allqueue(REDRAWOOPS, 0);
|
|
}
|
|
|
|
/*
|
|
* this function is called after destroying of VerseNode
|
|
*/
|
|
void post_node_destroy(VNode *vnode)
|
|
{
|
|
allqueue(REDRAWOOPS, 0);
|
|
|
|
/* TODO: destroy bindings between vnode and blender data structures */
|
|
}
|
|
|
|
/*
|
|
* this function is calles after renaming of VerseNode by verse_server
|
|
*/
|
|
void post_node_name_set(VNode *vnode)
|
|
{
|
|
/* if VerseNode has coresponding blender data structure, then
|
|
* change ID name of data structure */
|
|
if(vnode->type==V_NT_OBJECT) {
|
|
struct Object *ob;
|
|
ob = (Object*)((VObjectData*)vnode->data)->object;
|
|
if(ob) {
|
|
char *str;
|
|
str = (char*)malloc(sizeof(char)*(strlen(vnode->name)+3));
|
|
str[0] = '\0';
|
|
strcat(str, "OB");
|
|
strcat(str, vnode->name);
|
|
strncpy(ob->id.name, str, 23);
|
|
printf("\tob->id.name: %s\n", ob->id.name);
|
|
free(str);
|
|
}
|
|
}
|
|
else if(vnode->type==V_NT_GEOMETRY) {
|
|
struct Mesh *me;
|
|
|
|
me = (Mesh*)((VGeomData*)vnode->data)->mesh;
|
|
if(me) {
|
|
char *str;
|
|
str = (char*)malloc(sizeof(char)*(strlen(vnode->name)+3));
|
|
str[0] = '\0';
|
|
strcat(str, "ME");
|
|
strcat(str, vnode->name);
|
|
strncpy(me->id.name, str, 23);
|
|
printf("\tme->id.name: %s\n", me->id.name);
|
|
free(str);
|
|
}
|
|
}
|
|
|
|
allqueue(REDRAWALL, 0);
|
|
}
|
|
|
|
/*
|
|
* this function is called after acception connection with verse server
|
|
*/
|
|
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);
|
|
}
|
|
|
|
/*
|
|
* this function is called, when connestion with verse server is ended/terminated/etc.
|
|
*/
|
|
void post_connect_terminated(VerseSession *session)
|
|
{
|
|
VerseServer *server;
|
|
server = server_list.first;
|
|
while(server) {
|
|
if(strcmp(server->ip, session->address)==0) {
|
|
server->flag = 0;
|
|
server->session=NULL;
|
|
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;
|
|
|
|
allqueue(REDRAWOOPS, 0);
|
|
}
|
|
|
|
/*
|
|
* if connection wasn't accepted, then free VerseSession
|
|
* and print warning message with popupmenu
|
|
*/
|
|
void post_connect_update(VerseSession *session)
|
|
{
|
|
if(session->flag & VERSE_CONNECTING) {
|
|
session->counter++;
|
|
if(session->counter > MAX_UNCONNECTED_EVENTS) {
|
|
char *str;
|
|
/* popup menu*/
|
|
str = malloc(sizeof(char)*(strlen(session->address)+35));
|
|
str[0]='\0';
|
|
strcat(str, "Error%t|No response from server: ");
|
|
strcat(str, session->address);
|
|
pupmenu(str);
|
|
free(str);
|
|
|
|
session->flag = 0;
|
|
session->counter = 0;
|
|
session->post_connect_terminated(session);
|
|
free_verse_session(session);
|
|
}
|
|
}
|
|
}
|
|
|
|
#endif
|
|
|