@eturnity/eturnity_3d 8.7.0 → 8.10.1-EPDM-12535.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.
Files changed (32) hide show
  1. package/package.json +4 -3
  2. package/src/Overlay/ImageOverlay.js +7 -135
  3. package/src/Overlay/Overlay.js +116 -14
  4. package/src/Overlay/OverlayFactory.js +3 -0
  5. package/src/Overlay/OverlayLayer.js +6 -0
  6. package/src/Overlay/ThreeDModelOverlay.js +12 -120
  7. package/src/Overlay/YearlySunShadingOverlay.js +362 -0
  8. package/src/helper/render/imageOverlay.js +23 -9
  9. package/src/helper/render/moduleField.js +12 -2
  10. package/src/helper/render/overlay.js +60 -5
  11. package/src/helper/render/projectionMaterial.js +2 -0
  12. package/src/helper/render/roof.js +0 -1
  13. package/src/helper/render/shadingMaterial/ShadingImageGenerator.js +241 -0
  14. package/src/helper/render/shadingMaterial/helper.js +109 -0
  15. package/src/helper/render/shadingMaterial/yearlySunShaderMaterial.js +366 -0
  16. package/src/helper/renderMixin.js +17 -0
  17. package/src/store/hydrateData.js +3 -1
  18. package/dist/assets/images/panels/longiSolarLR4_60HPH_350M.png +0 -0
  19. package/dist/assets/images/panels/longiSolarLR4_60HPH_370M.png +0 -0
  20. package/dist/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw copy.png +0 -0
  21. package/dist/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
  22. package/dist/assets/images/panels/uv.png +0 -0
  23. package/dist/assets/panels/longiSolarLR4_60HPH_350M.png +0 -0
  24. package/dist/assets/panels/longiSolarLR4_60HPH_370M.png +0 -0
  25. package/dist/assets/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
  26. package/dist/assets/panels/uv.png +0 -0
  27. package/dist/assets/theme.js +0 -43
  28. package/dist/assets/vue.svg +0 -1
  29. package/dist/main.es.js +0 -43662
  30. package/dist/main.umd.js +0 -3542
  31. package/dist/style.css +0 -1
  32. package/dist/vite.svg +0 -1
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@eturnity/eturnity_3d",
3
3
  "private": false,
4
- "version": "8.7.0",
4
+ "version": "8.10.1-EPDM-12535.0",
5
5
  "files": [
6
6
  "dist",
7
7
  "src"
@@ -12,10 +12,11 @@
12
12
  "dev": "vite",
13
13
  "build": "vite build",
14
14
  "lint": "eslint --ext .js,.vue --ignore-path .gitignore --fix src`",
15
- "prettier": "prettier --write \"**/*.{js,vue}\""
15
+ "prettier": "prettier --write \"**/*.{js,vue}\"",
16
+ "merge-remote-master": "node scripts/merge-remote-master.js"
16
17
  },
17
18
  "dependencies": {
18
- "@eturnity/eturnity_maths": "8.7.0",
19
+ "@eturnity/eturnity_maths": "8.10.1-EPDM-12535.0",
19
20
  "@originjs/vite-plugin-commonjs": "1.0.3",
20
21
  "core-js": "3.30.2",
21
22
  "cors": "2.8.5",
@@ -9,7 +9,6 @@ import {
9
9
  normalize2DVector,
10
10
  vectorLength2D,
11
11
  } from '@eturnity/eturnity_maths'
12
- let Paper
13
12
  export default class ImageOverlay extends Overlay {
14
13
  constructor(overlay, emit) {
15
14
  super(overlay, emit)
@@ -42,15 +41,6 @@ export default class ImageOverlay extends Overlay {
42
41
  this.isReadyCallback = []
43
42
  })
44
43
  }
45
- onLoad() {
46
- return new Promise((resolve) => {
47
- if (this.isReady) {
48
- resolve(this)
49
- } else {
50
- this.isReadyCallback.push(resolve)
51
- }
52
- })
53
- }
54
44
  async initialiseImage(url) {
55
45
  const img = new Image()
56
46
  img.crossOrigin = 'Anonymous'
@@ -120,7 +110,7 @@ export default class ImageOverlay extends Overlay {
120
110
  this.emit('overlay-scale-updated', { id: this.id })
121
111
  }
122
112
  renderOnPaperJS(paperJSComponent) {
123
- Paper = paperJSComponent.paperScope
113
+ this.Paper = paperJSComponent.paperScope
124
114
  if (!this.isReady || !this.isActive || !this.corners) {
125
115
  return
126
116
  }
@@ -140,15 +130,9 @@ export default class ImageOverlay extends Overlay {
140
130
  paperJSComponent.clearPath(group.children[0])
141
131
  group.insertChild(0, imageOverlayPath)
142
132
  }
143
- handles = this.renderImageOverlayHandles(
144
- corners,
145
- isRotationHandleVisible,
146
- group.children[1]
147
- )
148
133
  this.applyRasterToCorners(imageOverlayPath, corners)
149
- group.visible = true
150
134
  } else {
151
- group = new Paper.Group()
135
+ group = new this.Paper.Group()
152
136
  imageOverlayPath = this.loadImageOverlay(this.url, corners)
153
137
 
154
138
  handles = this.renderImageOverlayHandles(corners, isRotationHandleVisible)
@@ -160,21 +144,23 @@ export default class ImageOverlay extends Overlay {
160
144
  group.type = 'imageOverlays'
161
145
  group.pathId = this.id
162
146
  group.overlayId = this.id
163
- group.visible = true
164
147
  paperJSComponent.paths.imageOverlays[this.id] = group
165
148
  }
149
+ group.visible = true
166
150
  imageOverlayPath.opacity = this.opacity
167
151
  handles.visible = isRotationHandleVisible
168
152
  }
169
153
  loadImageOverlay(url, corners) {
170
154
  let rasterImageOverlay = this.img
171
- ? new Paper.Raster(this.img)
172
- : new Paper.Raster({
155
+ ? new this.Paper.Raster(this.img)
156
+ : new this.Paper.Raster({
173
157
  source: url,
174
158
  crossOrigin: 'Anonymous',
175
159
  })
160
+ rasterImageOverlay.visible = false
176
161
  rasterImageOverlay.onLoad = () => {
177
162
  this.applyRasterToCorners(rasterImageOverlay, corners)
163
+ rasterImageOverlay.visible = true
178
164
  }
179
165
  rasterImageOverlay.data.angle = 0
180
166
  rasterImageOverlay.data.type = 'imageOverlayRaster'
@@ -182,120 +168,6 @@ export default class ImageOverlay extends Overlay {
182
168
  rasterImageOverlay.data.url = url
183
169
  return rasterImageOverlay
184
170
  }
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
- }
299
171
  renderOnThreeJS(threeJSComponent) {}
300
172
  serializeSettings() {
301
173
  return {
@@ -1,5 +1,6 @@
1
1
  import { v4 as uuidv4 } from 'uuid'
2
2
  import Item from '../Item/Item'
3
+ import { layerColors } from '../config'
3
4
  import {
4
5
  multiplyVector,
5
6
  addVector,
@@ -7,6 +8,7 @@ import {
7
8
  substractVector,
8
9
  getDistanceBetweenPoints,
9
10
  getAngleInDegFromCanvasVector,
11
+ vectorLength2D,
10
12
  } from '@eturnity/eturnity_maths'
11
13
  import {
12
14
  updateBufferRoofGeometry,
@@ -14,6 +16,7 @@ import {
14
16
  } from '../helper/render/geometryHandler'
15
17
  import * as THREE from 'three'
16
18
  import ProjectedMaterial from '../helper/projectedMaterial'
19
+
17
20
  export default class Overlay extends Item {
18
21
  constructor(overlay, emit) {
19
22
  super(emit)
@@ -21,6 +24,7 @@ export default class Overlay extends Item {
21
24
  ? overlay.layouting_overlay_uuid.toString()
22
25
  : uuidv4()
23
26
  this.actionsAvailable.push('setOpacity')
27
+ this.hasToBeSavedInBE = true
24
28
  this.isActive = overlay.is_active
25
29
  this.isReady = false
26
30
  this.resources = overlay.resources
@@ -54,6 +58,16 @@ export default class Overlay extends Item {
54
58
  this.overlayProjectionCamera.up.set(0, 1, 0)
55
59
  this.isSelected = false
56
60
  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
+ })
57
71
  }
58
72
  getCenter() {
59
73
  let center = multiplyVector(
@@ -133,17 +147,67 @@ export default class Overlay extends Item {
133
147
  this.corners = newCorners
134
148
  this.emit('item-updated', this)
135
149
  }
150
+ loadImageOverlay(url, corners) {
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, corners)
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
+ }
136
196
  async getProjectionMaterial() {
137
- if (!this.isReady || !this.corners) {
197
+ if (!this.isReady || !this.isActive || !this.corners) {
138
198
  return null
139
199
  }
140
200
  const url = this.imageUrl
141
201
  return new Promise((resolve) => {
142
- if (this.imageOverlayProjectionMaterial) {
202
+ if (
203
+ this.imageOverlayProjectionMaterial &&
204
+ this.version == this.imageOverlayProjectionMaterial.userData.version
205
+ ) {
143
206
  const cameraChanged = this.setImageOverlayCameraPosition()
144
207
  if (cameraChanged) {
145
208
  this.imageOverlayProjectionMaterial.userData.version++
146
209
  }
210
+ this.imageOverlayProjectionMaterial.userData.version = this.version
147
211
  this.imageOverlayProjectionMaterial.opacity = this.opacity
148
212
  resolve(this.imageOverlayProjectionMaterial)
149
213
  return
@@ -164,14 +228,15 @@ export default class Overlay extends Item {
164
228
 
165
229
  imageOverlayProjectionMaterial.userData = {}
166
230
  imageOverlayProjectionMaterial.userData.type = 'overlayMaterial'
231
+ imageOverlayProjectionMaterial.userData.overlayType = this.type
167
232
  imageOverlayProjectionMaterial.userData.version = 0
168
- imageOverlayProjectionMaterial.priority = 30
233
+ imageOverlayProjectionMaterial.priority =
234
+ this.projectionMaterialPriority
169
235
  imageOverlayProjectionMaterial.userData.url = url
170
236
  imageOverlayProjectionMaterial.opacity = this.opacity
171
237
  this.imageOverlayProjectionMaterial = imageOverlayProjectionMaterial
172
238
  resolve(imageOverlayProjectionMaterial)
173
239
  }
174
-
175
240
  if (this.img) {
176
241
  callback(new THREE.Texture(this.img))
177
242
  } else {
@@ -198,7 +263,7 @@ export default class Overlay extends Item {
198
263
  setImageOverlayCameraPosition() {
199
264
  let cameraChanged = false
200
265
  const boxCenter = multiplyVector(
201
- 0.5,
266
+ 0.0005,
202
267
  addVector(this.corners[0], this.corners[2])
203
268
  )
204
269
  boxCenter.z = 0
@@ -229,21 +294,61 @@ export default class Overlay extends Item {
229
294
  this.overlayProjectionCamera.rotation.set(0, 0, (zAngle * Math.PI) / 180)
230
295
  const CAMERA_HEIGHT_OFFSET = 50
231
296
  if (
232
- this.overlayProjectionCamera.position.x != boxCenter.x / 1000 ||
233
- this.overlayProjectionCamera.position.y != boxCenter.y / 1000 ||
297
+ this.overlayProjectionCamera.position.x != boxCenter.x ||
298
+ this.overlayProjectionCamera.position.y != boxCenter.y ||
234
299
  this.overlayProjectionCamera.position.z !=
235
- boxCenter.z / 1000 + CAMERA_HEIGHT_OFFSET
300
+ boxCenter.z + CAMERA_HEIGHT_OFFSET
236
301
  ) {
237
302
  cameraChanged = true
238
303
  }
239
304
  this.overlayProjectionCamera.position.set(
240
- boxCenter.x / 1000,
241
- boxCenter.y / 1000,
242
- boxCenter.z / 1000 + CAMERA_HEIGHT_OFFSET
305
+ boxCenter.x,
306
+ boxCenter.y,
307
+ boxCenter.z + CAMERA_HEIGHT_OFFSET
243
308
  )
244
309
  this.overlayProjectionCamera.updateProjectionMatrix()
245
310
  return cameraChanged
246
311
  }
312
+ renderImageOverlayHandles(corners, rotateHandleVisible, group = null) {
313
+ let circleHandle
314
+ let hasPaths = !!group
315
+ let handles = group || new this.Paper.Group()
316
+ //rotation handle
317
+ let center = multiplyVector(0.5, addVector(corners[0], corners[2]))
318
+
319
+ let radius = vectorLength2D(substractVector(center, corners[0])) - 10
320
+ if (!hasPaths) {
321
+ circleHandle = new this.Paper.Path.Circle(center, radius)
322
+ circleHandle.fillColor = layerColors.imageOverlayHandle.fillColor
323
+ circleHandle.strokeWidth = layerColors.imageOverlayHandle.strokeWidth
324
+ circleHandle.strokeColor = layerColors.imageOverlayHandle.strokeColor
325
+ circleHandle.data.type = 'imageOverlayRotateHandle'
326
+ circleHandle.data.overlayId = this.id
327
+ circleHandle.radius = radius
328
+ handles.addChild(circleHandle)
329
+ } else {
330
+ circleHandle = handles.children[0]
331
+ let ratio = radius / circleHandle.radius
332
+ circleHandle.transform(new this.Paper.Matrix(ratio, 0, 0, ratio, 0, 0))
333
+ circleHandle.position = center
334
+ circleHandle.radius = radius
335
+ }
336
+
337
+ circleHandle.visible = rotateHandleVisible
338
+ return handles
339
+ }
340
+ createCanvas() {
341
+ const canvas = document.createElement('canvas')
342
+ canvas.width = this.canvasWidth
343
+ canvas.height = this.canvasHeight
344
+ canvas.style.position = 'fixed'
345
+ canvas.style.top = '100px'
346
+ canvas.style.left = '50px'
347
+ canvas.style.zIndex = 0
348
+ return canvas
349
+ }
350
+ renderOnPaperJS(paperJSComponent) {}
351
+ renderOnThreeJS(threeJSComponent) {}
247
352
  serialize() {
248
353
  const serializedOverlay = {
249
354
  layouting_overlay_uuid: this.id,
@@ -259,9 +364,6 @@ export default class Overlay extends Item {
259
364
  }
260
365
  return serializedOverlay
261
366
  }
262
-
263
- renderOnPaperJS(paperJSComponent) {}
264
- renderOnThreeJS(threeJSComponent) {}
265
367
  serializeSettings() {
266
368
  return {}
267
369
  }
@@ -1,6 +1,7 @@
1
1
  import Overlay from './Overlay'
2
2
  import GLBOverlay from './GLBOverlay'
3
3
  import ImageOverlay from './ImageOverlay'
4
+ import YearlySunShadingOverlay from './YearlySunShadingOverlay'
4
5
 
5
6
  const OverlayFactory = {
6
7
  createOverlay(serializedOverlay, emit, origin = { lat: null, lng: null }) {
@@ -9,6 +10,8 @@ const OverlayFactory = {
9
10
  overlayInstance = new GLBOverlay(serializedOverlay, emit, origin)
10
11
  } else if (serializedOverlay.type == 'image_overlay') {
11
12
  overlayInstance = new ImageOverlay(serializedOverlay, emit)
13
+ } else if (serializedOverlay.type == 'yearly_sun_shading') {
14
+ overlayInstance = new YearlySunShadingOverlay(serializedOverlay, emit)
12
15
  } else {
13
16
  overlayInstance = new Overlay(serializedOverlay, emit)
14
17
  }
@@ -12,6 +12,12 @@ 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
+ }
15
21
  addOrUpdateSerializedItems(
16
22
  serializedOverlays,
17
23
  origin = { lat: null, lng: null }