75 lines
2.2 KiB
C
75 lines
2.2 KiB
C
|
#include "v4k.h"
|
||
|
|
||
|
#define OSCPACK_C
|
||
|
#define OSCRECV_C
|
||
|
#define OSCSEND_C
|
||
|
#include "oscpack.h"
|
||
|
#include "oscrecv.h"
|
||
|
#include "oscsend.h"
|
||
|
|
||
|
// networked gui, public api
|
||
|
void ui_netconfig(unsigned port);
|
||
|
void ui_netupdate();
|
||
|
|
||
|
// networked gui, private api
|
||
|
static int ui_netsocket = -1, ui_netclient, ui_netserver;
|
||
|
static map(char*,int) ui_netvalues_i;
|
||
|
|
||
|
void ui_netconfig(unsigned port) {
|
||
|
do_once map_init(ui_netvalues_i, less_str, hash_str);
|
||
|
|
||
|
if( ui_netsocket < 0 ) {
|
||
|
ui_netclient = !(tcp_bind("0.0.0.0",va("%d",port+1), 1) >= 0);
|
||
|
ui_netserver = !ui_netclient;
|
||
|
ui_netsocket = ui_netclient ? osc_open("127.0.0.1", va("%d",port)) : osc_listen("0.0.0.0", va("%d",port));
|
||
|
if( ui_netsocket >= 0 ) ui_notify("UI Network config", va("Connected (%s).", ui_netclient ? "client (editor)" : "server (game)"));
|
||
|
if( ui_netsocket >= 0 ) window_title(ui_netclient ? "UI client (editor)" : "UI server (game)");
|
||
|
if( ui_netsocket < 0 ) ui_netclient = ui_netserver = 0;
|
||
|
}
|
||
|
}
|
||
|
void ui_netupdate() {
|
||
|
if( ui_netserver ) {
|
||
|
// map_clear(ui_netvalues_i);
|
||
|
osc_update(ui_netsocket, 16);
|
||
|
}
|
||
|
if( ui_netclient ) {
|
||
|
for each_map_ptr(ui_netvalues_i, char *, name, int, value) {
|
||
|
char msg[4096];
|
||
|
int msglen = osc_pack(msg, va("/%s", *name), "i", *value);
|
||
|
osc_send(ui_netsocket, msg + 4, msglen - 4);
|
||
|
}
|
||
|
// map_clear(ui_netvalues_i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
int ui_netint(const char *name, int *value) {
|
||
|
const osc_message *found = osc_find(va("/%s", name)); // search in reverse order, so newest wins
|
||
|
if( found ) *value = (int)found->v[0].i;
|
||
|
|
||
|
int changed = ui_int(name, value);
|
||
|
if( changed ) *map_find_or_add(ui_netvalues_i, (char*)name, *value) = *value;
|
||
|
|
||
|
return changed;
|
||
|
}
|
||
|
|
||
|
// demo
|
||
|
int main() {
|
||
|
window_create(0.66, WINDOW_SQUARE);
|
||
|
|
||
|
ui_netconfig(1234);
|
||
|
|
||
|
while( window_swap() ) {
|
||
|
|
||
|
ui_netupdate();
|
||
|
|
||
|
static int r = 0, g = 0, b = 0;
|
||
|
if( ui_panel("test1", 0) ) {
|
||
|
ui_netint("Color R", &r); r = clampi(r, 0, 255);
|
||
|
ui_netint("Color G", &g); g = clampi(g, 0, 255);
|
||
|
ui_netint("Color B", &b); b = clampi(b, 0, 255);
|
||
|
ui_panel_end();
|
||
|
}
|
||
|
viewport_color3(vec3(r/255.0,g/255.0,b/255.0));
|
||
|
}
|
||
|
}
|