@eturnity/eturnity_3d 6.29.0 → 6.29.2

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.
@@ -0,0 +1,47 @@
1
+ import * as THREE from 'three'
2
+
3
+ export default {
4
+ methods:{
5
+ renderNodes() {
6
+ let geometry
7
+ if (this.meshes.nodeMeshes) {
8
+ geometry = this.meshes.nodeMeshes.geometry
9
+ geometry.attributes.position.needsUpdate = true
10
+ } else {
11
+ geometry = new THREE.BufferGeometry()
12
+ }
13
+ // let geometry = new THREE.SphereGeometry(node3DRadius, 4, 4)
14
+ const vertices = []
15
+ this.nodes
16
+ .filter((node) => node.layer == 'roof')
17
+ .forEach((node) => {
18
+ vertices.push(node.x / 1000, node.y / 1000, node.z / 1000)
19
+ })
20
+
21
+ if (
22
+ geometry.attributes.position &&
23
+ geometry.attributes.position.array.length <= vertices.length
24
+ ) {
25
+ let positions = geometry.attributes.position.array
26
+ for (let k in vertices) {
27
+ positions[k] = vertices[k]
28
+ }
29
+ geometry.setDrawRange(0, vertices.length / 3)
30
+ } else {
31
+ geometry.setAttribute(
32
+ 'position',
33
+ new THREE.Float32BufferAttribute(vertices, 3)
34
+ )
35
+ }
36
+ let material = this.material.node
37
+ const nodeMeshes = new THREE.Points(geometry, material)
38
+ nodeMeshes.userData.version = 0
39
+ nodeMeshes.userData.type = 'nodeMeshes'
40
+ nodeMeshes.userData.meshId = null
41
+ nodeMeshes.userData.polygonId = null
42
+ nodeMeshes.matrixAutoUpdate = false
43
+ this.meshes.nodeMeshes = nodeMeshes
44
+ this.scene.add(nodeMeshes)
45
+ },
46
+ }
47
+ }
@@ -0,0 +1,61 @@
1
+ import * as THREE from 'three'
2
+ import {
3
+ getBufferObstacleGeometry,
4
+ getBufferObstacleSideGeometry,
5
+ } from './geometryHandler'
6
+ import { material } from '../materials'
7
+ export default {
8
+ methods:{
9
+ renderObstacles() {
10
+ this.clearByType('obstacleMeshes')
11
+
12
+ this.roofs.forEach((roofPolygon) => {
13
+ roofPolygon.holes
14
+ .filter((poly) => poly.layer == 'obstacle')
15
+ .forEach((obstaclePolygon) => {
16
+ const geometry = getBufferObstacleGeometry(
17
+ obstaclePolygon,
18
+ roofPolygon
19
+ )
20
+
21
+ const geometrySide = getBufferObstacleSideGeometry(
22
+ obstaclePolygon,
23
+ roofPolygon
24
+ )
25
+ if (geometry && geometrySide) {
26
+ const mesh = new THREE.Mesh(geometry, this.material.roof)
27
+ const meshSide = new THREE.Mesh(geometrySide, material.wall)
28
+ mesh.material=this.material.roof
29
+ if(this.material.roof && this.material.roof.project){
30
+ this.material.roof.project(mesh)
31
+ }else{
32
+ mesh.material=this.material.wall
33
+ }
34
+
35
+ mesh.userData.version = obstaclePolygon.version
36
+ mesh.userData.type = 'obstacleMeshes'
37
+ mesh.userData.meshId = obstaclePolygon.id + '-' + roofPolygon.id + '_top'
38
+ mesh.userData.polygonId = obstaclePolygon.id
39
+ meshSide.userData.version = obstaclePolygon.version
40
+ meshSide.userData.type = 'obstacleMeshes'
41
+ meshSide.userData.meshId = obstaclePolygon.id + '-' + roofPolygon.id + '_side'
42
+ meshSide.userData.polygonId = obstaclePolygon.id
43
+
44
+ mesh.matrixAutoUpdate = false
45
+ meshSide.matrixAutoUpdate = false
46
+ mesh.frustumCulled = false
47
+ meshSide.frustumCulled = false
48
+ this.scene.add(mesh)
49
+ this.scene.add(meshSide)
50
+ this.meshes.obstacleMeshes[
51
+ obstaclePolygon.id + '-' + roofPolygon.id + '_top'
52
+ ] = mesh
53
+ this.meshes.obstacleMeshes[
54
+ obstaclePolygon.id + '-' + roofPolygon.id + '_side'
55
+ ] = meshSide
56
+ }
57
+ })
58
+ })
59
+ },
60
+ }
61
+ }
@@ -0,0 +1,88 @@
1
+ import * as THREE from 'three'
2
+ import {
3
+ getBufferPanelGeometry,
4
+ updateBufferPanelGeometry,
5
+ getBufferPanelSideGeometry,
6
+ updateBufferPanelSideGeometry,
7
+ } from './geometryHandler'
8
+ export default {
9
+ methods:{
10
+ renderPanels() {
11
+ this.clearRemovedOnes('panelsMeshes')
12
+ Object.values(this.meshes.panelsMeshes).forEach((mesh) => {
13
+ //clear UserDeactivatedModules
14
+ if (
15
+ this.polygons.find(
16
+ (poly) =>
17
+ poly.id == mesh.userData.polygonId &&
18
+ poly.layer == 'user_deactivated_panel'
19
+ )
20
+ ) {
21
+ this.clearMesh(mesh)
22
+ }
23
+ //clear panel on moduleField with overriden number of panel
24
+ let panel=this.polygons.find(poly=>mesh.userData.polygonId==poly.id)
25
+ if (
26
+ !panel || panel.moduleField.data.number_of_panels_override
27
+ ) {
28
+ this.clearMesh(mesh)
29
+ }
30
+ })
31
+
32
+ this.panels.forEach((panelPolygon) => {
33
+ //definition of the material
34
+ if(panelPolygon.moduleField.data.number_of_panels_override) return
35
+ let material = this.material.panel['default_'+this.moduleTextureVersionId]
36
+ if (panelPolygon.moduleField.pvData) {
37
+ let pvId = panelPolygon.moduleField.pvData.id
38
+ if (this.material.panel[pvId]) {
39
+ material = this.material.panel[pvId]
40
+ }
41
+ }else if(panelPolygon.moduleField.data){
42
+ let pvId = panelPolygon.moduleField.data.component_id_pv_module
43
+ if (this.material.panel[pvId]) {
44
+ material = this.material.panel[pvId]
45
+ }
46
+ }
47
+
48
+ if (
49
+ !this.meshes.panelsMeshes[panelPolygon.id + '_top'] ||
50
+ !this.meshes.panelsMeshes[panelPolygon.id + '_side']
51
+ ) {
52
+ const geometry = getBufferPanelGeometry(panelPolygon)
53
+ const geometrySide = getBufferPanelSideGeometry(panelPolygon)
54
+
55
+ if (geometry && geometrySide) {
56
+
57
+ const mesh = new THREE.Mesh(geometry, material)
58
+ const meshSide = new THREE.Mesh(geometrySide, this.material.wall)
59
+ mesh.userData.version = panelPolygon.version
60
+ mesh.userData.type = 'panelsMeshes'
61
+ mesh.userData.meshId = panelPolygon.id + '_top'
62
+ mesh.userData.polygonId = panelPolygon.id
63
+ meshSide.userData.version = panelPolygon.version
64
+ meshSide.userData.type = 'panelsMeshes'
65
+ meshSide.userData.meshId = panelPolygon.id + '_side'
66
+ meshSide.userData.polygonId = panelPolygon.id
67
+ geometry.dispose()
68
+ geometrySide.dispose()
69
+ this.scene.add(mesh)
70
+ this.scene.add(meshSide)
71
+ mesh.matrixAutoUpdate = false
72
+ meshSide.matrixAutoUpdate = false
73
+ this.meshes.panelsMeshes[panelPolygon.id + '_top'] = mesh
74
+ this.meshes.panelsMeshes[panelPolygon.id + '_side'] = meshSide
75
+ }
76
+ }else{
77
+ const topMesh=this.meshes.panelsMeshes[panelPolygon.id + '_top']
78
+ const sideMesh=this.meshes.panelsMeshes[panelPolygon.id + '_side']
79
+ if(panelPolygon.version>topMesh.userData.version){
80
+ topMesh.geometry=updateBufferPanelGeometry(panelPolygon,topMesh.geometry)
81
+ sideMesh.geometry=updateBufferPanelSideGeometry(panelPolygon,sideMesh.geometry)
82
+ }
83
+ topMesh.material= material
84
+ }
85
+ })
86
+ },
87
+ }
88
+ }
@@ -0,0 +1,134 @@
1
+ import * as THREE from 'three'
2
+ import {
3
+ maximumGapLimit,
4
+ } from '../../config'
5
+ import {
6
+ getBufferRoofGeometry,
7
+ updateBufferRoofGeometry,
8
+ } from './geometryHandler'
9
+ import { intersectOutlines, verticalProjectionOnPlane } from '@eturnity/eturnity_maths'
10
+
11
+ export default {
12
+ methods:{
13
+ updateRoofGeometry(geometry, roofPolygon) {
14
+ const roofOutline = roofPolygon.outline
15
+ let cropedHolesOutline = roofPolygon.holes
16
+ .filter((h) => h.layer == 'obstacle')
17
+ .map((h) => {
18
+ //let's crop obstacle with roof outline
19
+ const cropedHoleOutline =
20
+ intersectOutlines(h.outline, roofPolygon.outline)[0] || []
21
+ const outline = cropedHoleOutline.map((p) => {
22
+ return {
23
+ x: p.x,
24
+ y: p.y,
25
+ z: verticalProjectionOnPlane(
26
+ p,
27
+ roofPolygon.normalVector,
28
+ roofPolygon.flatOutline[0]
29
+ ).z
30
+ }
31
+ })
32
+ return outline
33
+ })
34
+
35
+ cropedHolesOutline = cropedHolesOutline.filter((outline) => !!outline)
36
+ geometry = updateBufferRoofGeometry(
37
+ roofOutline,
38
+ cropedHolesOutline,
39
+ geometry
40
+ )
41
+
42
+ return geometry
43
+ },
44
+ createRoofGeometry(roofPolygon) {
45
+ const roofOutline = roofPolygon.outline
46
+ let cropedHolesOutline = roofPolygon.holes
47
+ .filter((h) => h.layer == 'obstacle')
48
+ .map((h) => {
49
+ //let's crop obstacle with roof outline
50
+ const cropedHoleOutline =
51
+ intersectOutlines(h.outline, roofPolygon.outline)[0] || []
52
+ const outline = cropedHoleOutline.map((p) => {
53
+ return {
54
+ x: p.x,
55
+ y: p.y,
56
+ z: verticalProjectionOnPlane(
57
+ p,
58
+ roofPolygon.normalVector,
59
+ roofPolygon.flatOutline[0]
60
+ ).z
61
+ }
62
+ })
63
+ return outline
64
+ })
65
+
66
+ cropedHolesOutline = cropedHolesOutline.filter((outline) => !!outline)
67
+ let geometry = getBufferRoofGeometry(roofOutline, cropedHolesOutline)
68
+
69
+ return geometry
70
+ },
71
+ renderRoofs() {
72
+ this.clearRemovedOnes('roofMeshes')
73
+ this.roofs.forEach((roofPolygon) => {
74
+ let mesh
75
+ let geometry
76
+ if (
77
+ this.meshes.roofMeshes[roofPolygon.id] &&
78
+ this.meshes.roofMeshes[roofPolygon.id].userData.version <
79
+ roofPolygon.version
80
+ ) {
81
+ //update mesh
82
+ mesh = this.meshes.roofMeshes[roofPolygon.id]
83
+ geometry = mesh.geometry
84
+ geometry = this.updateRoofGeometry(geometry, roofPolygon)
85
+ mesh.geometry = geometry
86
+ if(this.material.roof){
87
+ mesh.material=this.material.roof
88
+ if(this.material.roof && this.material.roof.project) this.material.roof.project(mesh)
89
+ }
90
+ mesh.frustumCulled = false
91
+ mesh.updateMatrix()
92
+ }
93
+ if (!this.meshes.roofMeshes[roofPolygon.id]) {
94
+ //create
95
+ geometry = this.createRoofGeometry(roofPolygon)
96
+ if (geometry) {
97
+ mesh = new THREE.Mesh(geometry, this.material.roof)
98
+ mesh.userData.version = roofPolygon.version
99
+ mesh.userData.type = 'roofMeshes'
100
+ mesh.userData.meshId = roofPolygon.id
101
+ mesh.userData.polygonId = roofPolygon.id
102
+ mesh.matrixAutoUpdate = false
103
+ this.scene.add(mesh)
104
+ if(this.material.roof){
105
+ mesh.material=this.material.roof
106
+ if(this.material.roof.project) this.material.roof.project(mesh)
107
+ }
108
+ mesh.frustumCulled = false
109
+ this.meshes.roofMeshes[roofPolygon.id] = mesh
110
+ }
111
+ }
112
+ })
113
+ },
114
+ renderFlatRoofs() {
115
+ //this.clearRemovedOnes('flatRoofMeshes')
116
+ this.clearByType('flatRoofMeshes')
117
+ this.roofs.forEach((roofPolygon) => {
118
+ //if(this.meshes.flatRoofMeshes[roofPolygon.id])
119
+ if(roofPolygon.maximumGap < maximumGapLimit) return
120
+ let geometry = getBufferRoofGeometry(roofPolygon.flatOutline)
121
+ if (geometry) {
122
+ const material =this.material.curvedRoof
123
+ const mesh = new THREE.Mesh(geometry, material)
124
+ geometry.dispose()
125
+ geometry = null
126
+ mesh.itemData = roofPolygon
127
+ mesh.frustumCulled = false
128
+ this.scene.add(mesh)
129
+ this.meshes.flatRoofMeshes[roofPolygon.id] = mesh
130
+ }
131
+ })
132
+ },
133
+ }
134
+ }