@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.
- package/package.json +4 -3
- package/src/Overlay/ImageOverlay.js +7 -135
- package/src/Overlay/Overlay.js +116 -14
- package/src/Overlay/OverlayFactory.js +3 -0
- package/src/Overlay/OverlayLayer.js +6 -0
- package/src/Overlay/ThreeDModelOverlay.js +12 -120
- package/src/Overlay/YearlySunShadingOverlay.js +362 -0
- package/src/helper/render/imageOverlay.js +23 -9
- package/src/helper/render/moduleField.js +12 -2
- package/src/helper/render/overlay.js +60 -5
- package/src/helper/render/projectionMaterial.js +2 -0
- package/src/helper/render/roof.js +0 -1
- package/src/helper/render/shadingMaterial/ShadingImageGenerator.js +241 -0
- package/src/helper/render/shadingMaterial/helper.js +109 -0
- package/src/helper/render/shadingMaterial/yearlySunShaderMaterial.js +366 -0
- package/src/helper/renderMixin.js +17 -0
- package/src/store/hydrateData.js +3 -1
- package/dist/assets/images/panels/longiSolarLR4_60HPH_350M.png +0 -0
- package/dist/assets/images/panels/longiSolarLR4_60HPH_370M.png +0 -0
- package/dist/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw copy.png +0 -0
- package/dist/assets/images/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
- package/dist/assets/images/panels/uv.png +0 -0
- package/dist/assets/panels/longiSolarLR4_60HPH_350M.png +0 -0
- package/dist/assets/panels/longiSolarLR4_60HPH_370M.png +0 -0
- package/dist/assets/panels/reneSola_Virtus_2_JC320S_24_Bbw.png +0 -0
- package/dist/assets/panels/uv.png +0 -0
- package/dist/assets/theme.js +0 -43
- package/dist/assets/vue.svg +0 -1
- package/dist/main.es.js +0 -43662
- package/dist/main.umd.js +0 -3542
- package/dist/style.css +0 -1
- 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.
|
|
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.
|
|
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 {
|
package/src/Overlay/Overlay.js
CHANGED
|
@@ -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 (
|
|
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 =
|
|
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.
|
|
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
|
|
233
|
-
this.overlayProjectionCamera.position.y != boxCenter.y
|
|
297
|
+
this.overlayProjectionCamera.position.x != boxCenter.x ||
|
|
298
|
+
this.overlayProjectionCamera.position.y != boxCenter.y ||
|
|
234
299
|
this.overlayProjectionCamera.position.z !=
|
|
235
|
-
boxCenter.z
|
|
300
|
+
boxCenter.z + CAMERA_HEIGHT_OFFSET
|
|
236
301
|
) {
|
|
237
302
|
cameraChanged = true
|
|
238
303
|
}
|
|
239
304
|
this.overlayProjectionCamera.position.set(
|
|
240
|
-
boxCenter.x
|
|
241
|
-
boxCenter.y
|
|
242
|
-
boxCenter.z
|
|
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 }
|