summaryrefslogtreecommitdiff
path: root/src/pointerlock.ts
blob: 7bd4dab12d123166add7f970649a222b13363de4 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
module Omni {
    export class PointerLocker {
        hasLock:boolean = false;
        private blocker:HTMLElement = document.getElementById("block");
        private instructions:HTMLElement = document.getElementById("instructions");

        constructor(private onGain:() => void, private onLose:() => void) {
        }

        enable():void {
            let havePointerLock = 'pointerLockElement' in document || 'mozPointerLockElsement' in document || 'webkitPointerLockElement' in document;
            if (!havePointerLock) {
                return;
            }

            document.addEventListener("pointerlockchange", this.onChange, false);
            document.addEventListener("mozpointerlockchange", this.onChange, false);
            document.addEventListener("webkitpointerlockchange", this.onChange, false);

            document.addEventListener("pointerlockerror", this.onError, false);
            document.addEventListener("mozpointerlockerror", this.onError, false);
            document.addEventListener("webkitpointerlockerror", this.onError, false);

            this.blocker.addEventListener("click", this.onClick, false);
        }

        onChange = (event):void => {
            let element = document.body;
            let doc:any = document;

            if (doc.pointerLockElement === element || doc.mozPointerLockElement === element || doc.webkitPointerLockElement === element) {
                //gained
                this.hasLock = true;
                this.hide();
                this.onGain();
            } else {
                //lost
                this.hasLock = false;
                this.show();
                this.onLose();
            }
        };

        onError = (event):void => {

        };

        onClick = (event):void => {
            let element:any = document.body;
            element.requestPointerLock = element.requestPointerLock || element.mozRequestPointerLock || element.webkitRequestPointerLock;
            this.instructions.style.display = "none";

            element.requestPointerLock();
        };

        disable():void {
            document.removeEventListener("pointerlockchange", this.onChange, false);
            document.removeEventListener("mozpointerlockchange", this.onChange, false);
            document.removeEventListener("webkitpointerlockchange", this.onChange, false);

            document.removeEventListener("pointerlockerror", this.onError, false);
            document.removeEventListener("mozpointerlockerror", this.onError, false);
            document.removeEventListener("webkitpointerlockerror", this.onError, false);

            this.blocker.removeEventListener("click", this.onClick, false);
        }

        private hide():void {
            this.blocker.style.display = "none";
        }

        private show():void {
            this.blocker.style.display = '-webkit-box';
            this.blocker.style.display = '-moz-box';
            this.blocker.style.display = 'box';

            this.instructions.style.display = "";
        }
    }
}