@eturnity/eturnity_3d 8.4.1 → 8.4.3-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 +2 -2
- package/src/Overlay/ImageOverlay.js +7 -135
- package/src/Overlay/Overlay.js +118 -14
- package/src/Overlay/OverlayFactory.js +3 -0
- package/src/Overlay/OverlayLayer.js +6 -0
- package/src/Overlay/ThreeDModelOverlay.js +11 -119
- package/src/Overlay/YearlySunShadingOverlay.js +362 -0
- package/src/components/ThreeCanvasViewer.vue +9 -1
- package/src/helper/render/imageOverlay.js +23 -9
- 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 +245 -0
- package/src/helper/render/shadingMaterial/grids.js +543 -0
- package/src/helper/render/shadingMaterial/gridsOld.js +527 -0
- package/src/helper/render/shadingMaterial/helper.js +109 -0
- package/src/helper/render/shadingMaterial/yearlySunShaderMaterial.js +344 -0
- package/src/helper/renderMixin.js +10 -0
- 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.
|
|
4
|
+
"version": "8.4.3-EPDM-12535.0",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
7
7
|
"src"
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
"prettier": "prettier --write \"**/*.{js,vue}\""
|
|
16
16
|
},
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@eturnity/eturnity_maths": "8.4.
|
|
18
|
+
"@eturnity/eturnity_maths": "8.4.2-EPDM-12535.0",
|
|
19
19
|
"@originjs/vite-plugin-commonjs": "1.0.3",
|
|
20
20
|
"core-js": "3.30.2",
|
|
21
21
|
"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,63 @@ 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
|
+
// Add the canvas to the document body
|
|
349
|
+
document.body.appendChild(canvas)
|
|
350
|
+
return canvas
|
|
351
|
+
}
|
|
352
|
+
renderOnPaperJS(paperJSComponent) {}
|
|
353
|
+
renderOnThreeJS(threeJSComponent) {}
|
|
247
354
|
serialize() {
|
|
248
355
|
const serializedOverlay = {
|
|
249
356
|
layouting_overlay_uuid: this.id,
|
|
@@ -259,9 +366,6 @@ export default class Overlay extends Item {
|
|
|
259
366
|
}
|
|
260
367
|
return serializedOverlay
|
|
261
368
|
}
|
|
262
|
-
|
|
263
|
-
renderOnPaperJS(paperJSComponent) {}
|
|
264
|
-
renderOnThreeJS(threeJSComponent) {}
|
|
265
369
|
serializeSettings() {
|
|
266
370
|
return {}
|
|
267
371
|
}
|
|
@@ -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 }
|
|
@@ -1,23 +1,14 @@
|
|
|
1
1
|
import Overlay from './Overlay'
|
|
2
2
|
import * as THREE from 'three'
|
|
3
|
-
import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'
|
|
4
|
-
import { layerColors } from '../config'
|
|
5
3
|
import {
|
|
6
|
-
getDistanceBetweenPoints,
|
|
7
4
|
addVector,
|
|
8
5
|
multiplyVector,
|
|
9
|
-
substractVector,
|
|
10
|
-
getAngleInDegFromCanvasVector,
|
|
11
|
-
normalize2DVector,
|
|
12
6
|
isInsidePolygon,
|
|
13
7
|
calculateBestFittingPlanePolygon,
|
|
14
8
|
verticalProjectionOnPlane,
|
|
15
|
-
vectorLength2D,
|
|
16
|
-
deltaLatLngToDistance,
|
|
17
9
|
rotateTransformation,
|
|
18
10
|
getStandardDeviation,
|
|
19
11
|
} from '@eturnity/eturnity_maths'
|
|
20
|
-
let Paper
|
|
21
12
|
export default class ThreeDModelOverlay extends Overlay {
|
|
22
13
|
constructor(overlay, emit, origin, loader) {
|
|
23
14
|
super(overlay, emit)
|
|
@@ -44,15 +35,6 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
44
35
|
this.geoLocalisation = this.settings.geoLocalisation
|
|
45
36
|
}
|
|
46
37
|
loadFile() {}
|
|
47
|
-
onLoad() {
|
|
48
|
-
return new Promise((resolve) => {
|
|
49
|
-
if (this.isReady) {
|
|
50
|
-
resolve(this)
|
|
51
|
-
} else {
|
|
52
|
-
this.isReadyCallback.push(resolve)
|
|
53
|
-
}
|
|
54
|
-
})
|
|
55
|
-
}
|
|
56
38
|
set3DObjectMaterialOpacity(obj) {
|
|
57
39
|
obj.children.forEach((child) => {
|
|
58
40
|
this.set3DObjectMaterialOpacity(child, this.opacity)
|
|
@@ -65,7 +47,6 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
65
47
|
if (this.overlayMesh && this.overlayMesh.children.length == 0) {
|
|
66
48
|
this.overlayMesh = await this.loadFile()
|
|
67
49
|
}
|
|
68
|
-
|
|
69
50
|
if (!this.isReady) {
|
|
70
51
|
let waitingBall = threeJSComponent.meshes.overlayMeshes[this.id]
|
|
71
52
|
if (!waitingBall) {
|
|
@@ -126,9 +107,10 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
126
107
|
this.overlayMesh = overlayMesh
|
|
127
108
|
this.overlayMesh.frustumCulled = false
|
|
128
109
|
this.set3DObjectMaterialOpacity(this.overlayMesh)
|
|
110
|
+
return overlayMesh
|
|
129
111
|
}
|
|
130
112
|
renderOnPaperJS(paperJSComponent) {
|
|
131
|
-
Paper = paperJSComponent.paperScope
|
|
113
|
+
this.Paper = paperJSComponent.paperScope
|
|
132
114
|
if (!this.isActive) {
|
|
133
115
|
return
|
|
134
116
|
}
|
|
@@ -139,7 +121,7 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
139
121
|
if (!paperJSComponent.loadingSpinner) {
|
|
140
122
|
return
|
|
141
123
|
}
|
|
142
|
-
group = new Paper.Group()
|
|
124
|
+
group = new this.Paper.Group()
|
|
143
125
|
|
|
144
126
|
group.addChild(this.renderImagePlaceHolder(paperJSComponent))
|
|
145
127
|
group.itemType = 'placeholderOverlays'
|
|
@@ -150,7 +132,7 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
150
132
|
this.placeholderPath = group
|
|
151
133
|
|
|
152
134
|
paperJSComponent.paperLayer['loadingSpinners'].activate()
|
|
153
|
-
Paper.view.onFrame = (event) => this.animatePlaceholder(event)
|
|
135
|
+
this.Paper.view.onFrame = (event) => this.animatePlaceholder(event)
|
|
154
136
|
}
|
|
155
137
|
paperJSComponent.paths.imageOverlays[this.id] = group
|
|
156
138
|
this.hasPlaceholderPath = true
|
|
@@ -187,7 +169,7 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
187
169
|
group.opacity = this.opacity
|
|
188
170
|
group.transparent = this.opacity != 1
|
|
189
171
|
} else {
|
|
190
|
-
group = new Paper.Group()
|
|
172
|
+
group = new this.Paper.Group()
|
|
191
173
|
imageOverlayPath = this.loadImageOverlay(this.imageUrl, corners)
|
|
192
174
|
this.applyRasterToCorners(imageOverlayPath, corners)
|
|
193
175
|
handles = this.renderImageOverlayHandles(corners, isRotationHandleVisible)
|
|
@@ -209,15 +191,15 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
209
191
|
renderImagePlaceHolder(paperJSComponent) {
|
|
210
192
|
const toCanvasRef = paperJSComponent.canvasContext.toCanvasRef
|
|
211
193
|
|
|
212
|
-
const group = new Paper.Group()
|
|
213
|
-
const circle = new Paper.Path.Circle({
|
|
194
|
+
const group = new this.Paper.Group()
|
|
195
|
+
const circle = new this.Paper.Path.Circle({
|
|
214
196
|
center: toCanvasRef({ x: 0, y: 0 }),
|
|
215
197
|
radius: 50,
|
|
216
198
|
fillColor: '#ffffff80',
|
|
217
199
|
})
|
|
218
200
|
circle.radius = 70
|
|
219
201
|
circle.itemData = 'circle'
|
|
220
|
-
const fillRectangle = new Paper.Path()
|
|
202
|
+
const fillRectangle = new this.Paper.Path()
|
|
221
203
|
fillRectangle.fillColor = '#ffffff80'
|
|
222
204
|
fillRectangle.itemType = 'placeholder'
|
|
223
205
|
fillRectangle.itemData = this
|
|
@@ -247,92 +229,16 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
247
229
|
circle.scale(scale)
|
|
248
230
|
circle.radius = newRadius
|
|
249
231
|
}
|
|
250
|
-
loadImageOverlay(url, corners) {
|
|
251
|
-
let rasterImageOverlay = new Paper.Raster({
|
|
252
|
-
source: url,
|
|
253
|
-
crossOrigin: 'Anonymous',
|
|
254
|
-
})
|
|
255
|
-
rasterImageOverlay.visible = false
|
|
256
|
-
rasterImageOverlay.onLoad = () => {
|
|
257
|
-
this.applyRasterToCorners(rasterImageOverlay, corners)
|
|
258
|
-
}
|
|
259
|
-
rasterImageOverlay.data.angle = 0
|
|
260
|
-
rasterImageOverlay.data.type = 'imageOverlayRaster'
|
|
261
|
-
rasterImageOverlay.data.overlayId = this.id
|
|
262
|
-
rasterImageOverlay.data.url = url
|
|
263
|
-
return rasterImageOverlay
|
|
264
|
-
}
|
|
265
|
-
applyRasterToCorners(texture, corners = this.corners) {
|
|
266
|
-
//remove angle of texture
|
|
267
|
-
let textureAngle = texture.angle || 0
|
|
268
|
-
texture.rotate(-textureAngle)
|
|
269
|
-
|
|
270
|
-
//make texture the same size to fit corners
|
|
271
|
-
const textureWidth = texture.bounds.width
|
|
272
|
-
const textureHeight = texture.bounds.height
|
|
273
|
-
const frameWidth = getDistanceBetweenPoints(corners[1], corners[0])
|
|
274
|
-
const frameHeight = getDistanceBetweenPoints(corners[3], corners[0])
|
|
275
|
-
const center = multiplyVector(0.5, addVector(corners[0], corners[2]))
|
|
276
|
-
if (texture.bounds.width) {
|
|
277
|
-
var a = frameWidth / textureWidth
|
|
278
|
-
var b = 0
|
|
279
|
-
var c = 0
|
|
280
|
-
var d = frameHeight / textureHeight
|
|
281
|
-
texture.transform(new Paper.Matrix(a, b, c, d, 0, 0))
|
|
282
|
-
//translate to fit top left corner
|
|
283
|
-
var tx = center.x - texture.bounds.center.x
|
|
284
|
-
var ty = center.y - texture.bounds.center.y
|
|
285
|
-
texture.transform(new Paper.Matrix(1, 0, 0, 1, tx, ty))
|
|
286
|
-
//rotate
|
|
287
|
-
let angle = getAngleInDegFromCanvasVector(
|
|
288
|
-
substractVector(corners[0], corners[3])
|
|
289
|
-
)
|
|
290
|
-
|
|
291
|
-
texture.angle = angle
|
|
292
|
-
texture.rotate(angle)
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
renderImageOverlayHandles(corners, rotateHandleVisible, group = null) {
|
|
296
|
-
let circleHandle
|
|
297
|
-
let hasPaths = !!group
|
|
298
|
-
let handles = group || new Paper.Group()
|
|
299
|
-
let u = normalize2DVector(substractVector(corners[1], corners[0]))
|
|
300
|
-
let v = normalize2DVector(substractVector(corners[0], corners[3]))
|
|
301
|
-
|
|
302
|
-
//rotation handle
|
|
303
|
-
let center = multiplyVector(0.5, addVector(corners[0], corners[2]))
|
|
304
|
-
|
|
305
|
-
let radius = vectorLength2D(substractVector(center, corners[0])) - 10
|
|
306
|
-
if (!hasPaths) {
|
|
307
|
-
circleHandle = new Paper.Path.Circle(center, radius)
|
|
308
|
-
circleHandle.fillColor = layerColors.imageOverlayHandle.fillColor
|
|
309
|
-
circleHandle.strokeWidth = layerColors.imageOverlayHandle.strokeWidth
|
|
310
|
-
circleHandle.strokeColor = layerColors.imageOverlayHandle.strokeColor
|
|
311
|
-
circleHandle.data.type = 'imageOverlayRotateHandle'
|
|
312
|
-
circleHandle.data.overlayId = this.id
|
|
313
|
-
circleHandle.radius = radius
|
|
314
|
-
handles.addChild(circleHandle)
|
|
315
|
-
} else {
|
|
316
|
-
circleHandle = handles.children[0]
|
|
317
|
-
let ratio = radius / circleHandle.radius
|
|
318
|
-
circleHandle.transform(new Paper.Matrix(ratio, 0, 0, ratio, 0, 0))
|
|
319
|
-
circleHandle.position = center
|
|
320
|
-
circleHandle.radius = radius
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
circleHandle.visible = rotateHandleVisible
|
|
324
|
-
return handles
|
|
325
|
-
}
|
|
326
232
|
initialiseCornersAndProjectionCamera() {
|
|
327
233
|
const box = new THREE.Box3().setFromObject(this.overlayMesh)
|
|
328
234
|
const boxSize = box.getSize(new THREE.Vector3())
|
|
329
|
-
this.boxSize = boxSize
|
|
330
235
|
const boxCenter = box.getCenter(new THREE.Vector3())
|
|
236
|
+
this.boxSize = boxSize
|
|
237
|
+
this.boxCenter = boxCenter
|
|
331
238
|
const left = -boxSize.x / 2
|
|
332
239
|
const right = +boxSize.x / 2
|
|
333
240
|
const top = +boxSize.y / 2
|
|
334
241
|
const bottom = -boxSize.y / 2
|
|
335
|
-
this.boxCenter = boxCenter
|
|
336
242
|
const initialCorners = [
|
|
337
243
|
{
|
|
338
244
|
x: 1000 * (boxCenter.x + left),
|
|
@@ -374,9 +280,7 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
374
280
|
1000 // far
|
|
375
281
|
)
|
|
376
282
|
}
|
|
377
|
-
checkGeoLocDataAndOffset() {
|
|
378
|
-
return
|
|
379
|
-
}
|
|
283
|
+
checkGeoLocDataAndOffset() {}
|
|
380
284
|
async initialiseModel() {
|
|
381
285
|
this.overlayMesh = await this.loadFile()
|
|
382
286
|
if (!this.geoLocalisation) {
|
|
@@ -526,18 +430,6 @@ export default class ThreeDModelOverlay extends Overlay {
|
|
|
526
430
|
})
|
|
527
431
|
return newOutlines
|
|
528
432
|
}
|
|
529
|
-
createCanvas() {
|
|
530
|
-
const canvas = document.createElement('canvas')
|
|
531
|
-
canvas.width = this.canvasWidth
|
|
532
|
-
canvas.height = this.canvasHeight
|
|
533
|
-
canvas.style.position = 'fixed'
|
|
534
|
-
canvas.style.top = '100px'
|
|
535
|
-
canvas.style.left = '50px'
|
|
536
|
-
canvas.style.zIndex = 0
|
|
537
|
-
// Add the canvas to the document body
|
|
538
|
-
document.body.appendChild(canvas)
|
|
539
|
-
return canvas
|
|
540
|
-
}
|
|
541
433
|
serializeSettings() {
|
|
542
434
|
return {
|
|
543
435
|
version: this.version,
|