BIMviewer

Форк
0
/
ThreeDMode.js 
177 строк · 5.6 Кб
1
import {Controller} from "../Controller.js";
2
import {math} from "@xeokit/xeokit-sdk/dist/xeokit-sdk.es.js";
3

4
const tempVec3a = math.vec3();
5

6
/** @private */
7
class ThreeDMode extends Controller {
8

9
    constructor(parent, cfg) {
10

11
        super(parent, cfg);
12

13
        if (!cfg.buttonElement) {
14
            throw "Missing config: buttonElement";
15
        }
16

17
        this._saveOrthoActive = null;
18
        this._buttonElement = cfg.buttonElement;
19

20
        this._cameraControlNavModeMediator = cfg.cameraControlNavModeMediator;
21

22
        this._active = false;
23

24
        this.on("enabled", (enabled) => {
25
            if (!enabled) {
26
                this._buttonElement.classList.add("disabled");
27
            } else {
28
                this._buttonElement.classList.remove("disabled");
29
            }
30
        });
31

32
        this._buttonElement.addEventListener("click", (event) => {
33
            if (this.getEnabled()) {
34
                this.bimViewer._sectionTool.hideControl();
35
                this.setActive(!this.getActive(), () => { // Animated
36
                });
37
            }
38
            event.preventDefault();
39
        });
40

41
        this.bimViewer.on("reset", () => {
42
            this.setActive(true, () => { // Animated
43
            });
44
        });
45
    }
46

47
    setEnabled(enabled) {
48
        super.setEnabled(enabled);
49
        this._saveOrthoActive = this.bimViewer._orthoMode.getActive();
50
    }
51

52
    setActive(active, done) {
53
        if (this._active === active) {
54
            if (done) {
55
                done();
56
            }
57
            return;
58
        }
59
        this._active = active;
60
        if (active) {
61
            this._buttonElement.classList.add("active");
62
            if (done) {
63
                this._enterThreeDMode(() => {
64
                    this.fire("active", this._active);
65
                    done();
66
                });
67
            } else {
68
                this._enterThreeDMode();
69
                this.fire("active", this._active);
70
            }
71
        } else {
72
            this._buttonElement.classList.remove("active");
73
            if (done) {
74
                this._exitThreeDMode(() => {
75
                    this.fire("active", this._active);
76
                    done();
77
                });
78
            } else {
79
                this._exitThreeDMode();
80
                this.fire("active", this._active);
81
            }
82
        }
83
    }
84

85
    _enterThreeDMode(done) {
86

87
        const viewer = this.viewer;
88
        const scene = viewer.scene;
89
        const aabb = scene.getAABB(scene.visibleObjectIds);
90
        const diag = math.getAABB3Diag(aabb);
91
        const center = math.getAABB3Center(aabb, tempVec3a);
92
        const dist = Math.abs(diag / Math.tan(65.0 / 2));     // TODO: fovy match with CameraFlight
93
        const camera = scene.camera;
94
        const dir = (camera.yUp) ? [-1, -1, -1] : [1, 1, 1];
95
        const up = (camera.yUp) ? [-1, 1, -1] : [-1, 1, 1];
96

97
        viewer.cameraControl.pivotPos = center;
98

99
        this.bimViewer._navCubeMode.setActive(true);
100
        this.bimViewer._firstPersonMode.setEnabled(true);
101
        this._cameraControlNavModeMediator.setThreeDModeActive(true);
102
        this.bimViewer._sectionTool.setEnabled(true);
103
        this.bimViewer._orthoMode.setEnabled(true);
104

105
        if (done) {
106
            viewer.cameraFlight.flyTo({
107
                look: center,
108
                eye: [center[0] - (dist * dir[0]), center[1] - (dist * dir[1]), center[2] - (dist * dir[2])],
109
                up: up,
110
                orthoScale: diag * 1.3,
111
                duration: 1,
112
                projection: this._saveOrthoActive ? "ortho" : "perspective"
113
            }, () => {
114
                done();
115
            });
116
        } else {
117
            viewer.cameraFlight.jumpTo({
118
                look: center,
119
                eye: [center[0] - (dist * dir[0]), center[1] - (dist * dir[1]), center[2] - (dist * dir[2])],
120
                up: up,
121
                orthoScale: diag * 1.3,
122
                projection: this._saveOrthoActive ? "ortho" : "perspective"
123
            });
124
        }
125
    }
126

127
    _exitThreeDMode(done) {
128

129
        const viewer = this.viewer;
130
        const scene = viewer.scene;
131
        const camera = scene.camera;
132
        const aabb = scene.getAABB(scene.visibleObjectIds);
133
        const look2 = math.getAABB3Center(aabb);
134
        const diag = math.getAABB3Diag(aabb);
135
        const fitFOV = 45; // fitFOV;
136
        const sca = Math.abs(diag / Math.tan(fitFOV * math.DEGTORAD));
137
        const orthoScale2 = diag * 1.3;
138
        const eye2 = tempVec3a;
139

140
        eye2[0] = look2[0] + (camera.worldUp[0] * sca);
141
        eye2[1] = look2[1] + (camera.worldUp[1] * sca);
142
        eye2[2] = look2[2] + (camera.worldUp[2] * sca);
143

144
        const up2 = math.mulVec3Scalar(camera.worldForward, -1, []);
145

146
        this.bimViewer._sectionTool.setActive(false);
147
        this.bimViewer._firstPersonMode.setEnabled(false);
148

149
        this._saveOrthoActive = this.bimViewer._orthoMode.getActive();
150
         this.bimViewer._orthoMode.setEnabled(false);
151

152
        this._cameraControlNavModeMediator.setThreeDModeActive(false);
153

154
        if (done) {
155
            viewer.cameraFlight.flyTo({
156
                eye: eye2,
157
                look: look2,
158
                up: up2,
159
                orthoScale: orthoScale2,
160
                projection: "ortho"
161
            }, () => {
162
                this.bimViewer._navCubeMode.setActive(false);
163
            });
164
        } else {
165
            viewer.cameraFlight.jumpTo({
166
                eye: eye2,
167
                look: look2,
168
                up: up2,
169
                orthoScale: orthoScale2,
170
                projection: "ortho"
171
            });
172
            this.bimViewer._navCubeMode.setActive(false);
173
        }
174
    }
175
}
176

177
export {ThreeDMode};

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.