@eturnity/eturnity_3d 8.10.1-epic-shading.1 → 8.16.0

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.
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eturnity/eturnity_3d",
3
3
  "private": false,
4
- "version": "8.10.1-epic-shading.1",
4
+ "version": "8.16.0",
5
5
  "files": [
6
6
  "dist",
7
7
  "src"
@@ -16,7 +16,7 @@
16
16
  "merge-remote-master": "node scripts/merge-remote-master.js"
17
17
  },
18
18
  "dependencies": {
19
- "@eturnity/eturnity_maths": "8.10.1-epic-shading.0",
19
+ "@eturnity/eturnity_maths": "8.16.0",
20
20
  "@originjs/vite-plugin-commonjs": "1.0.3",
21
21
  "core-js": "3.30.2",
22
22
  "cors": "2.8.5",
@@ -9,6 +9,7 @@ import {
9
9
  normalize2DVector,
10
10
  vectorLength2D,
11
11
  } from '@eturnity/eturnity_maths'
12
+ let Paper
12
13
  export default class ImageOverlay extends Overlay {
13
14
  constructor(overlay, emit) {
14
15
  super(overlay, emit)
@@ -41,6 +42,15 @@ export default class ImageOverlay extends Overlay {
41
42
  this.isReadyCallback = []
42
43
  })
43
44
  }
45
+ onLoad() {
46
+ return new Promise((resolve) => {
47
+ if (this.isReady) {
48
+ resolve(this)
49
+ } else {
50
+ this.isReadyCallback.push(resolve)
51
+ }
52
+ })
53
+ }
44
54
  async initialiseImage(url) {
45
55
  const img = new Image()
46
56
  img.crossOrigin = 'Anonymous'
@@ -110,7 +120,7 @@ export default class ImageOverlay extends Overlay {
110
120
  this.emit('overlay-scale-updated', { id: this.id })
111
121
  }
112
122
  renderOnPaperJS(paperJSComponent) {
113
- this.Paper = paperJSComponent.paperScope
123
+ Paper = paperJSComponent.paperScope
114
124
  if (!this.isReady || !this.isActive || !this.corners) {
115
125
  return
116
126
  }
@@ -121,27 +131,28 @@ export default class ImageOverlay extends Overlay {
121
131
  let handles
122
132
  let isRotationHandleVisible =
123
133
  paperJSComponent.selectedTool == 'selectOverlay' && this.isSelected
124
- const getCorners = () =>
125
- this.corners.map((p) => paperJSComponent.toCanvasRef(p))
126
- let corners = getCorners()
134
+ let corners = this.corners.map((p) => paperJSComponent.toCanvasRef(p))
127
135
  if (group) {
128
136
  if (group.data.url == this.url) {
129
137
  imageOverlayPath = group.children[0]
130
138
  } else {
131
- imageOverlayPath = this.loadImageOverlay(this.url, getCorners)
139
+ imageOverlayPath = this.loadImageOverlay(this.url, corners)
132
140
  paperJSComponent.clearPath(group.children[0])
133
141
  group.insertChild(0, imageOverlayPath)
134
142
  }
135
- this.renderImageOverlayHandles(
143
+ handles = this.renderImageOverlayHandles(
136
144
  corners,
137
145
  isRotationHandleVisible,
138
146
  group.children[1]
139
147
  )
140
148
  this.applyRasterToCorners(imageOverlayPath, corners)
149
+ group.visible = true
141
150
  } else {
142
- group = new this.Paper.Group()
143
- imageOverlayPath = this.loadImageOverlay(this.url, getCorners)
151
+ group = new Paper.Group()
152
+ imageOverlayPath = this.loadImageOverlay(this.url, corners)
153
+
144
154
  handles = this.renderImageOverlayHandles(corners, isRotationHandleVisible)
155
+
145
156
  group.addChild(imageOverlayPath)
146
157
  group.addChild(handles)
147
158
  group.itemType = 'imageOverlays'
@@ -149,23 +160,21 @@ export default class ImageOverlay extends Overlay {
149
160
  group.type = 'imageOverlays'
150
161
  group.pathId = this.id
151
162
  group.overlayId = this.id
163
+ group.visible = true
152
164
  paperJSComponent.paths.imageOverlays[this.id] = group
153
165
  }
154
- group.visible = true
155
166
  imageOverlayPath.opacity = this.opacity
156
- // handles.visible = isRotationHandleVisible
167
+ handles.visible = isRotationHandleVisible
157
168
  }
158
- loadImageOverlay(url, getCorners = () => {}) {
169
+ loadImageOverlay(url, corners) {
159
170
  let rasterImageOverlay = this.img
160
- ? new this.Paper.Raster(this.img)
161
- : new this.Paper.Raster({
171
+ ? new Paper.Raster(this.img)
172
+ : new Paper.Raster({
162
173
  source: url,
163
174
  crossOrigin: 'Anonymous',
164
175
  })
165
- rasterImageOverlay.visible = false
166
176
  rasterImageOverlay.onLoad = () => {
167
- this.applyRasterToCorners(rasterImageOverlay, getCorners())
168
- rasterImageOverlay.visible = true
177
+ this.applyRasterToCorners(rasterImageOverlay, corners)
169
178
  }
170
179
  rasterImageOverlay.data.angle = 0
171
180
  rasterImageOverlay.data.type = 'imageOverlayRaster'
@@ -173,6 +182,120 @@ export default class ImageOverlay extends Overlay {
173
182
  rasterImageOverlay.data.url = url
174
183
  return rasterImageOverlay
175
184
  }
185
+ applyRasterToCorners(texture, corners = this.corners) {
186
+ //remove angle of texture
187
+ let textureAngle = texture.angle || 0
188
+ texture.rotate(-textureAngle)
189
+
190
+ //make texture the same size to fit corners
191
+ const textureWidth = texture.bounds.width
192
+ const textureHeight = texture.bounds.height
193
+ const frameWidth = getDistanceBetweenPoints(corners[1], corners[0])
194
+ const frameHeight = getDistanceBetweenPoints(corners[3], corners[0])
195
+ const center = multiplyVector(0.5, addVector(corners[0], corners[2]))
196
+ if (texture.bounds.width) {
197
+ var a = frameWidth / textureWidth
198
+ var b = 0
199
+ var c = 0
200
+ var d = frameHeight / textureHeight
201
+ texture.transform(new Paper.Matrix(a, b, c, d, 0, 0))
202
+ //translate to fit top left corner
203
+ var tx = center.x - texture.bounds.center.x
204
+ var ty = center.y - texture.bounds.center.y
205
+ texture.transform(new Paper.Matrix(1, 0, 0, 1, tx, ty))
206
+ //rotate
207
+ let angle = getAngleInDegFromCanvasVector(
208
+ substractVector(corners[0], corners[3])
209
+ )
210
+
211
+ texture.angle = angle
212
+ texture.rotate(angle)
213
+ }
214
+ }
215
+ renderImageOverlayHandles(corners, rotateHandleVisible, group = null) {
216
+ let circleHandle
217
+ let hasPaths = !!group
218
+ let handles = group || new Paper.Group()
219
+ let u = normalize2DVector(substractVector(corners[1], corners[0]))
220
+ let v = normalize2DVector(substractVector(corners[0], corners[3]))
221
+
222
+ //rotation handle
223
+ let center = multiplyVector(0.5, addVector(corners[0], corners[2]))
224
+
225
+ let radius = vectorLength2D(substractVector(center, corners[0])) - 10
226
+ if (!hasPaths) {
227
+ circleHandle = new Paper.Path.Circle(center, radius)
228
+ circleHandle.fillColor = layerColors.imageOverlayHandle.fillColor
229
+ circleHandle.strokeWidth = layerColors.imageOverlayHandle.strokeWidth
230
+ circleHandle.strokeColor = layerColors.imageOverlayHandle.strokeColor
231
+ circleHandle.data.type = 'imageOverlayRotateHandle'
232
+ circleHandle.data.overlayId = this.id
233
+ circleHandle.radius = radius
234
+ handles.addChild(circleHandle)
235
+ } else {
236
+ circleHandle = handles.children[0]
237
+ let ratio = radius / circleHandle.radius
238
+ circleHandle.transform(new Paper.Matrix(ratio, 0, 0, ratio, 0, 0))
239
+ circleHandle.position = center
240
+ circleHandle.radius = radius
241
+ }
242
+
243
+ circleHandle.visible = rotateHandleVisible
244
+
245
+ //scale handle
246
+ for (let k = 0; k < 4; k++) {
247
+ let squareSize = 10
248
+ let squareHandleVertices = [
249
+ addVector(
250
+ addVector(corners[k], multiplyVector(squareSize / 2, u)),
251
+ multiplyVector(squareSize / 2, v)
252
+ ),
253
+ addVector(
254
+ addVector(corners[k], multiplyVector(-squareSize / 2, u)),
255
+ multiplyVector(squareSize / 2, v)
256
+ ),
257
+ addVector(
258
+ addVector(corners[k], multiplyVector(-squareSize / 2, u)),
259
+ multiplyVector(-squareSize / 2, v)
260
+ ),
261
+ addVector(
262
+ addVector(corners[k], multiplyVector(squareSize / 2, u)),
263
+ multiplyVector(-squareSize / 2, v)
264
+ ),
265
+ addVector(
266
+ addVector(corners[k], multiplyVector(squareSize / 2, u)),
267
+ multiplyVector(squareSize / 2, v)
268
+ ),
269
+ ]
270
+ let squareHandle
271
+
272
+ if (hasPaths) {
273
+ squareHandle = handles.children[k + 1]
274
+ squareHandle.position = corners[k]
275
+ //squareHandle.rotate()
276
+ for (let index in squareHandleVertices) {
277
+ let vertex = squareHandleVertices[index]
278
+ squareHandle.segments[index].point = vertex
279
+ }
280
+ } else {
281
+ squareHandle = new Paper.Path()
282
+
283
+ for (let vertex of squareHandleVertices) {
284
+ squareHandle.add(vertex)
285
+ }
286
+
287
+ squareHandle.fillColor = layerColors.imageOverlayHandle.fillColor
288
+ squareHandle.strokeWidth = layerColors.imageOverlayHandle.strokeWidth
289
+ squareHandle.strokeColor = layerColors.imageOverlayHandle.strokeColor
290
+ squareHandle.data.type = 'handle'
291
+ squareHandle.data.index = k
292
+
293
+ handles.addChild(squareHandle)
294
+ }
295
+ squareHandle.visible = false
296
+ }
297
+ return handles
298
+ }
176
299
  renderOnThreeJS(threeJSComponent) {}
177
300
  serializeSettings() {
178
301
  return {
@@ -1,6 +1,5 @@
1
1
  import { v4 as uuidv4 } from 'uuid'
2
2
  import Item from '../Item/Item'
3
- import { layerColors } from '../config'
4
3
  import {
5
4
  multiplyVector,
6
5
  addVector,
@@ -8,7 +7,6 @@ import {
8
7
  substractVector,
9
8
  getDistanceBetweenPoints,
10
9
  getAngleInDegFromCanvasVector,
11
- vectorLength2D,
12
10
  } from '@eturnity/eturnity_maths'
13
11
  import {
14
12
  updateBufferRoofGeometry,
@@ -16,7 +14,6 @@ import {
16
14
  } from '../helper/render/geometryHandler'
17
15
  import * as THREE from 'three'
18
16
  import ProjectedMaterial from '../helper/projectedMaterial'
19
-
20
17
  export default class Overlay extends Item {
21
18
  constructor(overlay, emit) {
22
19
  super(emit)
@@ -24,7 +21,6 @@ export default class Overlay extends Item {
24
21
  ? overlay.layouting_overlay_uuid.toString()
25
22
  : uuidv4()
26
23
  this.actionsAvailable.push('setOpacity')
27
- this.hasToBeSavedInBE = true
28
24
  this.isActive = overlay.is_active
29
25
  this.isReady = false
30
26
  this.resources = overlay.resources
@@ -58,16 +54,6 @@ export default class Overlay extends Item {
58
54
  this.overlayProjectionCamera.up.set(0, 1, 0)
59
55
  this.isSelected = false
60
56
  this.isReadyCallback = []
61
- this.projectionMaterialPriority = 30
62
- }
63
- onLoad() {
64
- return new Promise((resolve) => {
65
- if (this.isReady) {
66
- resolve(this)
67
- } else {
68
- this.isReadyCallback.push(resolve)
69
- }
70
- })
71
57
  }
72
58
  getCenter() {
73
59
  let center = multiplyVector(
@@ -147,67 +133,17 @@ export default class Overlay extends Item {
147
133
  this.corners = newCorners
148
134
  this.emit('item-updated', this)
149
135
  }
150
- loadImageOverlay(url, getCorners = () => {}) {
151
- let rasterImageOverlay = new this.Paper.Raster({
152
- source: url,
153
- crossOrigin: 'Anonymous',
154
- })
155
- rasterImageOverlay.visible = false
156
- rasterImageOverlay.onLoad = () => {
157
- this.applyRasterToCorners(rasterImageOverlay, getCorners())
158
- rasterImageOverlay.visible = true
159
- }
160
- rasterImageOverlay.data.angle = 0
161
- rasterImageOverlay.data.type = 'imageOverlayRaster'
162
- rasterImageOverlay.data.overlayId = this.id
163
- rasterImageOverlay.data.url = url
164
- return rasterImageOverlay
165
- }
166
- applyRasterToCorners(texture, corners = this.corners) {
167
- //remove angle of texture
168
- let textureAngle = texture.angle || 0
169
- texture.rotate(-textureAngle)
170
-
171
- //make texture the same size to fit corners
172
- const textureWidth = texture.bounds.width
173
- const textureHeight = texture.bounds.height
174
- const frameWidth = getDistanceBetweenPoints(corners[1], corners[0])
175
- const frameHeight = getDistanceBetweenPoints(corners[3], corners[0])
176
- const center = multiplyVector(0.5, addVector(corners[0], corners[2]))
177
- if (texture.bounds.width) {
178
- var a = frameWidth / textureWidth
179
- var b = 0
180
- var c = 0
181
- var d = frameHeight / textureHeight
182
- texture.transform(new this.Paper.Matrix(a, b, c, d, 0, 0))
183
- //translate to fit top left corner
184
- var tx = center.x - texture.bounds.center.x
185
- var ty = center.y - texture.bounds.center.y
186
- texture.transform(new this.Paper.Matrix(1, 0, 0, 1, tx, ty))
187
- //rotate
188
- let angle = getAngleInDegFromCanvasVector(
189
- substractVector(corners[0], corners[3])
190
- )
191
-
192
- texture.angle = angle
193
- texture.rotate(angle)
194
- }
195
- }
196
136
  async getProjectionMaterial() {
197
- if (!this.isReady || !this.isActive || !this.corners) {
137
+ if (!this.isReady || !this.corners) {
198
138
  return null
199
139
  }
200
140
  const url = this.imageUrl
201
141
  return new Promise((resolve) => {
202
- if (
203
- this.imageOverlayProjectionMaterial &&
204
- this.version == this.imageOverlayProjectionMaterial.userData.version
205
- ) {
142
+ if (this.imageOverlayProjectionMaterial) {
206
143
  const cameraChanged = this.setImageOverlayCameraPosition()
207
144
  if (cameraChanged) {
208
145
  this.imageOverlayProjectionMaterial.userData.version++
209
146
  }
210
- this.imageOverlayProjectionMaterial.userData.version = this.version
211
147
  this.imageOverlayProjectionMaterial.opacity = this.opacity
212
148
  resolve(this.imageOverlayProjectionMaterial)
213
149
  return
@@ -228,15 +164,14 @@ export default class Overlay extends Item {
228
164
 
229
165
  imageOverlayProjectionMaterial.userData = {}
230
166
  imageOverlayProjectionMaterial.userData.type = 'overlayMaterial'
231
- imageOverlayProjectionMaterial.userData.overlayType = this.type
232
167
  imageOverlayProjectionMaterial.userData.version = 0
233
- imageOverlayProjectionMaterial.priority =
234
- this.projectionMaterialPriority
168
+ imageOverlayProjectionMaterial.priority = 30
235
169
  imageOverlayProjectionMaterial.userData.url = url
236
170
  imageOverlayProjectionMaterial.opacity = this.opacity
237
171
  this.imageOverlayProjectionMaterial = imageOverlayProjectionMaterial
238
172
  resolve(imageOverlayProjectionMaterial)
239
173
  }
174
+
240
175
  if (this.img) {
241
176
  callback(new THREE.Texture(this.img))
242
177
  } else {
@@ -263,7 +198,7 @@ export default class Overlay extends Item {
263
198
  setImageOverlayCameraPosition() {
264
199
  let cameraChanged = false
265
200
  const boxCenter = multiplyVector(
266
- 0.0005,
201
+ 0.5,
267
202
  addVector(this.corners[0], this.corners[2])
268
203
  )
269
204
  boxCenter.z = 0
@@ -294,60 +229,21 @@ export default class Overlay extends Item {
294
229
  this.overlayProjectionCamera.rotation.set(0, 0, (zAngle * Math.PI) / 180)
295
230
  const CAMERA_HEIGHT_OFFSET = 50
296
231
  if (
297
- this.overlayProjectionCamera.position.x != boxCenter.x ||
298
- this.overlayProjectionCamera.position.y != boxCenter.y ||
232
+ this.overlayProjectionCamera.position.x != boxCenter.x / 1000 ||
233
+ this.overlayProjectionCamera.position.y != boxCenter.y / 1000 ||
299
234
  this.overlayProjectionCamera.position.z !=
300
- boxCenter.z + CAMERA_HEIGHT_OFFSET
235
+ boxCenter.z / 1000 + CAMERA_HEIGHT_OFFSET
301
236
  ) {
302
237
  cameraChanged = true
303
238
  }
304
239
  this.overlayProjectionCamera.position.set(
305
- boxCenter.x,
306
- boxCenter.y,
307
- boxCenter.z + CAMERA_HEIGHT_OFFSET
240
+ boxCenter.x / 1000,
241
+ boxCenter.y / 1000,
242
+ boxCenter.z / 1000 + CAMERA_HEIGHT_OFFSET
308
243
  )
309
244
  this.overlayProjectionCamera.updateProjectionMatrix()
310
245
  return cameraChanged
311
246
  }
312
- renderImageOverlayHandles(corners, rotateHandleVisible, group = null) {
313
- let circleHandle
314
- const hasPaths = group?.children?.length > 0
315
- const handles = group || new this.Paper.Group()
316
- // rotation handle
317
- const center = multiplyVector(0.5, addVector(corners[0], corners[2]))
318
- const radius = vectorLength2D(substractVector(center, corners[0])) - 10
319
- if (!hasPaths) {
320
- circleHandle = new this.Paper.Path.Circle(center, radius)
321
- circleHandle.fillColor = layerColors.imageOverlayHandle.fillColor
322
- circleHandle.strokeWidth = layerColors.imageOverlayHandle.strokeWidth
323
- circleHandle.strokeColor = layerColors.imageOverlayHandle.strokeColor
324
- circleHandle.data.type = 'imageOverlayRotateHandle'
325
- circleHandle.data.overlayId = this.id
326
- circleHandle.radius = radius
327
- handles.addChild(circleHandle)
328
- } else {
329
- circleHandle = handles.children[0]
330
- let ratio = radius / circleHandle.radius
331
- circleHandle.transform(new this.Paper.Matrix(ratio, 0, 0, ratio, 0, 0))
332
- circleHandle.position = center
333
- circleHandle.radius = radius
334
- }
335
-
336
- circleHandle.visible = rotateHandleVisible
337
- return handles
338
- }
339
- createCanvas() {
340
- const canvas = document.createElement('canvas')
341
- canvas.width = this.canvasWidth
342
- canvas.height = this.canvasHeight
343
- canvas.style.position = 'fixed'
344
- canvas.style.top = '100px'
345
- canvas.style.left = '50px'
346
- canvas.style.zIndex = 0
347
- return canvas
348
- }
349
- renderOnPaperJS(paperJSComponent) {}
350
- renderOnThreeJS(threeJSComponent) {}
351
247
  serialize() {
352
248
  const serializedOverlay = {
353
249
  layouting_overlay_uuid: this.id,
@@ -363,6 +259,9 @@ export default class Overlay extends Item {
363
259
  }
364
260
  return serializedOverlay
365
261
  }
262
+
263
+ renderOnPaperJS(paperJSComponent) {}
264
+ renderOnThreeJS(threeJSComponent) {}
366
265
  serializeSettings() {
367
266
  return {}
368
267
  }
@@ -1,7 +1,6 @@
1
1
  import Overlay from './Overlay'
2
2
  import GLBOverlay from './GLBOverlay'
3
3
  import ImageOverlay from './ImageOverlay'
4
- import YearlySunShadingOverlay from './YearlySunShadingOverlay'
5
4
 
6
5
  const OverlayFactory = {
7
6
  createOverlay(serializedOverlay, emit, origin = { lat: null, lng: null }) {
@@ -10,8 +9,6 @@ const OverlayFactory = {
10
9
  overlayInstance = new GLBOverlay(serializedOverlay, emit, origin)
11
10
  } else if (serializedOverlay.type == 'image_overlay') {
12
11
  overlayInstance = new ImageOverlay(serializedOverlay, emit)
13
- } else if (serializedOverlay.type == 'yearly_sun_shading') {
14
- overlayInstance = new YearlySunShadingOverlay(serializedOverlay, emit)
15
12
  } else {
16
13
  overlayInstance = new Overlay(serializedOverlay, emit)
17
14
  }
@@ -12,12 +12,6 @@ class OverlayLayer extends LayerManager {
12
12
  'overlay-three-loaded'
13
13
  )
14
14
  }
15
- getItemsToSaveInBE() {
16
- return this.items.filter((item) => item.hasToBeSavedInBE)
17
- }
18
- getUserItems() {
19
- return this.items.filter((item) => item.type != 'yearly_sun_shading')
20
- }
21
15
  addOrUpdateSerializedItems(
22
16
  serializedOverlays,
23
17
  origin = { lat: null, lng: null }