• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

iTowns / itowns / 21037980526

15 Jan 2026 04:09PM UTC coverage: 88.185%. First build
21037980526

Pull #2648

github

web-flow
Merge 210d917fb into 3bb2080bc
Pull Request #2648: Dynamic style update for feature meshes

2806 of 3619 branches covered (77.54%)

Branch coverage included in aggregate %.

394 of 429 new or added lines in 4 files covered. (91.84%)

28520 of 31904 relevant lines covered (89.39%)

1232.39 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

62.83
/packages/Main/src/Process/FeatureProcessing.js
1
import LayerUpdateState from 'Layer/LayerUpdateState';
1✔
2
import ObjectRemovalHelper from 'Process/ObjectRemovalHelper';
1✔
3
import handlingError from 'Process/handlerNodeError';
1✔
4
import { Coordinates } from '@itowns/geographic';
1✔
5
import { geoidLayerIsVisible } from 'Layer/GeoidLayer';
1✔
6
import Feature2Mesh from 'Converter/Feature2Mesh';
1✔
7

1✔
8
const coord = new Coordinates('EPSG:4326', 0, 0, 0);
1✔
9

1✔
10
export default {
1✔
11
    update(context, layer, node) {
1✔
12
        if (!node.parent && node.children.length) {
10!
13
            // if node has been removed dispose three.js resource
×
14
            ObjectRemovalHelper.removeChildrenAndCleanupRecursively(layer, node);
×
15
            return;
×
16
        }
×
17
        if (!node.visible) {
10!
18
            return;
×
19
        }
×
20

10✔
21
        if (node.layerUpdateState[layer.id] === undefined) {
10✔
22
            node.layerUpdateState[layer.id] = new LayerUpdateState();
10✔
23
        } else if (!node.layerUpdateState[layer.id].canTryUpdate()) {
10!
24
            // toggle visibility features
×
25
            node.link[layer.id]?.forEach((f) => {
×
26
                f.layer.object3d.add(f);
×
27
                f.meshes.position.z = geoidLayerIsVisible(layer.parent) ? node.geoidHeight : 0;
×
28
                f.meshes.updateMatrixWorld();
×
NEW
29

×
NEW
30
                // update existing features
×
NEW
31
                for (const featureMesh of f.meshes.children) {
×
NEW
32
                    Feature2Mesh.updateStyle(featureMesh, f.collection, layer.style);
×
NEW
33
                }
×
34
            });
×
35
            return;
×
36
        }
×
37

10✔
38
        let extentsDestination = node.getExtentsByProjection(layer.source.crs);
10✔
39
        let zoomDest;
10✔
40
        if (!extentsDestination) {
10!
41
            extentsDestination = [node.extent]; // of type Extent
×
42
            zoomDest = node.level;
×
43
        } else {
10✔
44
            zoomDest = extentsDestination[0].zoom;
10✔
45
        }
10✔
46

10✔
47
        // check if it's tile level is equal to display level layer.
10✔
48
        // TO DO updata at all level asked
10✔
49
        // if ((zoomDest < layer.zoom.min && zoomDest > layer.zoom.max) ||
10✔
50
        if (zoomDest != layer.zoom.min ||
10✔
51
        // check if there's data in extent tile.
10✔
52
            !this.source.extentInsideLimit(node.extent, zoomDest) ||
10✔
53
        // In FileSource case, check if the feature center is in extent tile.
10✔
54
            (layer.source.isFileSource && !node.extent.isPointInside(layer.source.extent.center(coord)))) {
10!
55
        // if not, there's not data to add at this tile.
×
56
            node.layerUpdateState[layer.id].noMoreUpdatePossible();
×
57
            return;
×
58
        }
×
59

10✔
60
        node.layerUpdateState[layer.id].newTry();
10✔
61

10✔
62
        const command = {
10✔
63
            layer,
10✔
64
            extentsSource: extentsDestination,
10✔
65
            view: context.view,
10✔
66
            requester: node,
10✔
67
        };
10✔
68

10✔
69
        return context.scheduler.execute(command).then((featureMeshes) => {
10✔
70
            node.layerUpdateState[layer.id].noMoreUpdatePossible();
8✔
71

8✔
72
            featureMeshes.forEach((featureMesh) => {
8✔
73
                if (featureMesh) {
8✔
74
                    node.link[layer.id] = node.link[layer.id] || [];
8✔
75
                    featureMesh.as(context.view.referenceCrs);
8✔
76
                    featureMesh.meshes.position.z = geoidLayerIsVisible(layer.parent) ? node.geoidHeight : 0;
8!
77
                    featureMesh.updateMatrixWorld();
8✔
78

8✔
79
                    if (layer.onMeshCreated) {
8!
80
                        layer.onMeshCreated(featureMesh, context);
×
81
                    }
×
82

8✔
83
                    if (!node.parent) {
8!
84
                        // TODO: Clean cache needs a refactory, because it isn't really efficient and used
×
85
                        ObjectRemovalHelper.removeChildrenAndCleanupRecursively(layer, featureMesh);
×
86
                    } else {
8✔
87
                        layer.object3d.add(featureMesh);
8✔
88
                        node.link[layer.id].push(featureMesh);
8✔
89
                    }
8✔
90
                    featureMesh.layer = layer;
8✔
91
                } else {
8!
92
                    // TODO: verify if it's possible the featureMesh is undefined.
×
93
                    node.layerUpdateState[layer.id].failure(1, true);
×
94
                }
×
95
            });
8✔
96
        },
10✔
97
        err => handlingError(err, node, layer, node.level, context.view));
10✔
98
    },
10✔
99
};
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc