@things-factory/scene-visualizer 6.0.1 → 6.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,267 +0,0 @@
1
- /*
2
- * Copyright © HatioLab Inc. All rights reserved.
3
- */
4
- import { Component, Ellipse } from '@hatiolab/things-scene'
5
- import * as THREE from 'three'
6
- import Component3d from './component-3d'
7
- import Object3D from './object3d'
8
-
9
- const STATUS_COLORS = ['#6666ff', '#ccccff', '#ffcccc', '#cc3300']
10
-
11
- const NATURE = {
12
- mutable: false,
13
- resizable: true,
14
- rotatable: true,
15
- properties: [
16
- {
17
- type: 'number',
18
- label: 'z-pos',
19
- name: 'zPos',
20
- property: 'zPos'
21
- },
22
- {
23
- type: 'string',
24
- label: 'location',
25
- name: 'location',
26
- property: 'location'
27
- }
28
- ]
29
- }
30
-
31
- export default class HumiditySensor extends Object3D {
32
- constructor(model, canvasSize, visualizer) {
33
- super(model, canvasSize, visualizer)
34
- this.userData.temperature = model.humidity ? model.humidity[0] : 0
35
- this.userData.humidity = model.humidity ? model.humidity[1] : 0
36
- }
37
-
38
- get cx() {
39
- var { cx = 0 } = this.model
40
- if (!this._cx) this._cx = cx - this._canvasSize.width / 2
41
-
42
- return this._cx
43
- }
44
-
45
- get cy() {
46
- var { cy = 0 } = this.model
47
- if (!this._cy) this._cy = cy - this._canvasSize.height / 2
48
-
49
- return this._cy
50
- }
51
-
52
- get cz() {
53
- var { zPos = 0, rx = 0 } = this.model
54
-
55
- if (!this._cz) this._cz = zPos + rx
56
-
57
- return this._cz
58
- }
59
-
60
- async createObject(canvasSize) {
61
- var { depth, cx, cy, rx, ry, rotation = 0, location } = this.model
62
-
63
- this.type = 'humidity-sensor'
64
-
65
- if (location) this.name = location
66
-
67
- for (var i = 0; i < 3; i++) {
68
- let mesh = this.createSensor(rx * (1 + 0.5 * i), ry * (1 + 0.5 * i), depth * (1 + 0.5 * i), i)
69
- mesh.material.opacity = 0.5 - i * 0.15
70
- }
71
-
72
- if (this._visualizer._heatmap) {
73
- this._visualizer._heatmap.addData({
74
- x: Math.floor(cx),
75
- y: Math.floor(cy),
76
- value: this.userData.temperature
77
- })
78
- this._visualizer.updateHeatmapTexture()
79
- }
80
-
81
- // var self = this
82
- //
83
- // setInterval(function(){
84
- //
85
- // var data = self._visualizer._heatmap._store._data
86
- //
87
- // // var value = self._visualizer._heatmap.getValueAt({x:model.cx, y: model.cy})
88
- // var value = data[model.cx][model.cy]
89
- //
90
- // self._visualizer._heatmap.addData({
91
- // x: model.cx,
92
- // y: model.cy,
93
- // // min: -100,
94
- // // value: -1
95
- // value: (Math.random() * 40 - 10) - value
96
- // })
97
- // self._visualizer._heatmap.repaint()
98
- //
99
- // self._visualizer.render_threed()
100
- // }, 1000)
101
- }
102
-
103
- createSensor(w, h, d, i) {
104
- var isFirst = i === 0
105
-
106
- let geometry = new THREE.SphereBufferGeometry(w, 32, 32)
107
- // let geometry = new THREE.SphereGeometry(w, d, h);
108
- var material
109
- if (isFirst) {
110
- // var texture = new THREE.TextureLoader().load('./images/drop-34055_1280.png')
111
- // texture.repeat.set(1,1)
112
- // // texture.premultiplyAlpha = true
113
- // material = new THREE.MeshStandardMaterial( { color : '#cc3300', side: THREE.FrontSide, wireframe: true, wireframeLinewidth : 1} );
114
- material = new THREE.MeshStandardMaterial({ color: '#cc3300', side: THREE.FrontSide })
115
- // material = new THREE.MeshStandardMaterial( { color : '#74e98a', side: THREE.FrontSide} );
116
- } else {
117
- material = new THREE.MeshStandardMaterial({
118
- color: '#cc3300',
119
- side: THREE.FrontSide,
120
- wireframe: true,
121
- wireframeLinewidth: 1
122
- })
123
- // material = new THREE.MeshStandardMaterial( { color : '#74e98a', side: THREE.FrontSide, wireframe: true, wireframeLinewidth : 1} );
124
- }
125
-
126
- // let material = new THREE.MeshStandardMaterial( { color : '#ff3300', side: THREE.DoubleSide, wireframe: true, wireframeLinewidth : 1} );
127
-
128
- var mesh = new THREE.Mesh(geometry, material)
129
- mesh.material.transparent = true
130
-
131
- if (isFirst) mesh.onmousemove = this.onmousemove
132
- else mesh.raycast = function() {}
133
-
134
- this.add(mesh)
135
-
136
- return mesh
137
- }
138
-
139
- onUserDataChanged() {
140
- super.onUserDataChanged()
141
-
142
- var { cx, cy } = this._model
143
- cx = Math.floor(cx)
144
- cy = Math.floor(cy)
145
-
146
- var temperature = this.userData.temperature
147
-
148
- for (let sphere of this.children) {
149
- var colorIndex = 0
150
- if (temperature < 0) {
151
- colorIndex = 0
152
- } else if (temperature < 10) {
153
- colorIndex = 1
154
- } else if (temperature < 20) {
155
- colorIndex = 2
156
- } else {
157
- colorIndex = 3
158
- }
159
-
160
- sphere.material.color.set(STATUS_COLORS[colorIndex])
161
- }
162
-
163
- if (!this._visualizer._heatmap) return
164
-
165
- var data = this._visualizer._heatmap._store._data
166
-
167
- // var value = self._visualizer._heatmap.getValueAt({x:model.cx, y: model.cy})
168
- var value = data[cx][cy]
169
-
170
- this._visualizer._heatmap.addData({
171
- x: cx,
172
- y: cy,
173
- // min: -100,
174
- // value: -1
175
- value: temperature - value
176
- })
177
- this._visualizer._heatmap.repaint()
178
-
179
- // this._visualizer.render_threed()
180
- this._visualizer.updateHeatmapTexture()
181
- }
182
-
183
- onmousemove(e, visualizer) {
184
- var tooltip = visualizer.tooltip || visualizer._scene2d.getObjectByName('tooltip')
185
-
186
- if (tooltip) {
187
- visualizer._scene2d.remove(tooltip)
188
- visualizer.tooltip = null
189
- visualizer.render_threed()
190
- }
191
-
192
- if (!this.parent.visible) return
193
-
194
- if (!this.parent.userData) this.parent.userData = {}
195
-
196
- var tooltipText = ''
197
-
198
- for (let key in this.parent.userData) {
199
- if (this.parent.userData[key]) tooltipText += key + ': ' + this.parent.userData[key] + '\n'
200
- }
201
-
202
- // tooltipText = 'loc : ' + loc
203
-
204
- // currentLabel.lookAt( camera.position );
205
-
206
- if (tooltipText.length > 0) {
207
- tooltip = visualizer.tooltip = visualizer.makeTextSprite(tooltipText)
208
-
209
- var vector = new THREE.Vector3()
210
- var vector2 = tooltip.getWorldScale().clone()
211
-
212
- var widthMultiplier = vector2.x / visualizer.model.width
213
- var heightMultiplier = vector2.y / visualizer.model.height
214
-
215
- vector.set(visualizer._mouse.x, visualizer._mouse.y, 0.5)
216
- vector2.normalize()
217
-
218
- vector2.x = (vector2.x / 2) * widthMultiplier
219
- vector2.y = (-vector2.y / 2) * heightMultiplier
220
- vector2.z = 0
221
-
222
- vector.add(vector2)
223
-
224
- vector.unproject(visualizer._2dCamera)
225
- tooltip.position.set(vector.x, vector.y, vector.z)
226
- tooltip.name = 'tooltip'
227
-
228
- tooltip.scale.x = tooltip.scale.x * widthMultiplier
229
- tooltip.scale.y = tooltip.scale.y * heightMultiplier
230
-
231
- // tooltip.position.set(this.getWorldPosition().x, this.getWorldPosition().y, this.getWorldPosition().z)
232
- // visualizer._scene3d.add(tooltip)
233
-
234
- visualizer._scene2d.add(tooltip)
235
- visualizer._renderer && visualizer._renderer.render(visualizer._scene2d, visualizer._2dCamera)
236
- visualizer.invalidate()
237
- }
238
- }
239
- }
240
-
241
- export class Sensor extends Ellipse {
242
- is3dish() {
243
- return true
244
- }
245
-
246
- _draw(context) {
247
- var { left, top, width, height } = this.bounds
248
-
249
- context.beginPath()
250
- context.rect(left, top, width, height)
251
-
252
- this.model.fillStyle = {
253
- type: 'pattern',
254
- fitPattern: true,
255
- image:
256
- 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAABBCAYAAACTiffeAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyppVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTMyIDc5LjE1OTI4NCwgMjAxNi8wNC8xOS0xMzoxMzo0MCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTUuNSAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDQ0E1QkUzRTRDMDcxMUU2QkMyRDk3MzlGN0EzMTI2NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDQ0E1QkUzRjRDMDcxMUU2QkMyRDk3MzlGN0EzMTI2NSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjJFQ0Q4QzE5NEI1MjExRTZCQzJEOTczOUY3QTMxMjY1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjJFQ0Q4QzFBNEI1MjExRTZCQzJEOTczOUY3QTMxMjY1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+tgU1kQAAB4pJREFU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'
257
- }
258
- this.drawFill(context)
259
- }
260
-
261
- get nature() {
262
- return NATURE
263
- }
264
- }
265
-
266
- Component.register('humidity-sensor', Sensor)
267
- Component3d.register('humidity-sensor', HumiditySensor)