-
Notifications
You must be signed in to change notification settings - Fork 3
/
index.js
127 lines (104 loc) · 2.57 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
/* jshint node: true */
'use strict'
var mesh = require('rtc-mesh');
var quickconnect = require('rtc-quickconnect');
var crel = require('crel');
var uuid = require('cuid');
// set this to true to update as moving, scaling, rotating events occur
var canvas;
var dynamicUpdates = false;
// initialise the connection
var qc = quickconnect('http://rtc.io/switchboard', {
// debug: true,
room: 'rtcio-demo-mesh',
iceServers: require('freeice')()
});
// create the shared model
var model = mesh(qc);
function addObject(obj, label) {
// add the object to the canvas
canvas.add(obj);
// tag the object
obj._label = label || uuid();
// add the object into mesh data
model.set(obj._label, obj.toJSON());
}
function checkInit() {
console.log('checking if initialization required');
if (model.get('startrect')) {
return;
}
addObject(new fabric.Text('hello', {
left: 210,
top: 100
}), 'testlabel');
addObject(new fabric.Rect({
left: 200,
top: 200,
fill: 'red',
height: 100,
width: 50
}), 'anotherrect');
addObject(new fabric.Rect({
left: 100,
top: 100,
fill: 'blue',
height: 100,
width: 100
}), 'startrect');
}
function updateState(evt) {
// TODO: debounce
if (evt.target && evt.target._label) {
model.set(evt.target._label, evt.target.toJSON());
}
}
function remoteUpdate(data, clock, srcId) {
var key;
var target;
console.log('captured remote update', arguments);
if (srcId === model.id) {
return;
}
key = data[0];
target = canvas._objects.filter(function(obj) {
return obj._label === key;
})[0];
// if we don't have the target, then add the target
if (! target) {
// use fabric deserialization
fabric.util.enlivenObjects([data[1]], function(objects) {
objects[0]._label = key;
canvas.add(objects[0]);
});
}
else {
target.set(data[1]);
canvas.renderAll();
}
}
model.on('update', remoteUpdate);
model.on('sync', checkInit);
qc.on('roominfo', function(data) {
console.log('room info: ', data);
// if when we join we are the only member, initilaise the canvas
if (data && data.memberCount === 1) {
checkInit();
}
});
document.body.appendChild(crel('canvas', {
id: 'c',
width: window.innerWidth,
height: window.innerHeight
}));
canvas = new fabric.Canvas('c');
canvas.on('object:modified', updateState);
// if dynamic updates are enabled then communicate changes
// as they are happening in the UI
if (dynamicUpdates) {
canvas.on({
'object:moving': updateState,
'object:scaling': updateState,
'object:rotating': updateState
});
}