unityController - Utility メソッド

このセクションには、サンプルに役立つすべての関数が含まれていますが、Genvid API の関数は含まれていません。

popularityToText

popularityToText(popularity)

popularityToText メソッドは popularity 値をテキスト値に変換します。

        // Convert popularity value to popularity text
        popularityToText(popularity) {
            let hearts = ["💔", "♡", "♥", "💕"];
            let levels = [0.1, 1.0, 5.0];
            for (let i = 0; i < hearts.length; ++i) {
                if (popularity < levels[i]) {
                    return hearts[i];
                }
            }
            return hearts[levels.length];
        }

removeFromArray

removeFromArray(arr, item)

removeFromArray メソッドは、パラメータとして送信された配列から値を削除します。

        // Removes all instances of @item in @arr, returning true if the element was removed.
        removeFromArray(arr, item) {
            let removedSomething = false;
            for (let i = arr.length - 1; i >= 0; i--) {
                if (arr[i] === item) {
                    arr.splice(i, 1);
                    removedSomething = true;
                }
            }
            return removedSomething;
        }

makeCircleZ

makeCircleZ(dst: number[], x: number, y: number, z: number, r: number, c: genvidMath.IVec4)

makeCircleZ メソッドは、半径 r および色 c の座標 x、y、z を中心とする平面 XY 上に円を準備します。この値はすべて、メソッドにパラメータとして送信されます。このメソッドは、各 WebGL の輪の適切な場所を取得するために使用します。

        // Utility routine preparing a circle on the XY-plane
        // centered at {x,y,z}, of radius r and color c.
        makeCircleZ(dst: number[], x: number, y: number, z: number, r: number, c: genvidMath.IVec4) {
            dst.push(
                // X   Y   Z     U    V      R    G    B    A
                x - r, y - r, z, 0.0, 0.0, c.x, c.y, c.z, c.w,
                x + r, y - r, z, 1.0, 0.0, c.x, c.y, c.z, c.w,
                x + r, y + r, z, 1.0, 1.0, c.x, c.y, c.z, c.w,
                x - r, y + r, z, 0.0, 1.0, c.x, c.y, c.z, c.w
            );
        }

projectWithRadius

projectWithRadius(mat: genvidMath.IMat4, pos_3d: genvidMath.IVec3, rad_3d: number): [genvidMath.IVec3, number]

projectWithRadius メソッドは、viewProjection 行列を使用して、位置 3D を中心とする半径 3D を変換します。このメソッドは、クリックした時の輪のヒットボックスを確定するために使用します。

        // Converts a @rad_3d around a 3D position @pos_3d using the viewProjection matrix @mat.
        // Returns an array [pos_2d, rad_2d].
        projectWithRadius(mat: genvidMath.IMat4, pos_3d: genvidMath.IVec3, rad_3d: number): [genvidMath.IVec3, number] {
            // There might be a more mathematically sound solution to this,
            // but I've decided to use the shotgun approach and just project
            // 8 positions (add/sub radius to every dimension), and keep
            // the one which yields the largest 2D distance.
            let pos_2d = genvidMath.projectPosition(mat, pos_3d);
            let rad_sq_2d = 0;
            let offsets = [
                genvidMath.vec3(rad_3d, 0, 0),
                genvidMath.vec3(-rad_3d, 0, 0),
                genvidMath.vec3(0, rad_3d, 0),
                genvidMath.vec3(0, -rad_3d, 0),
                genvidMath.vec3(0, 0, rad_3d),
                genvidMath.vec3(0, 0, -rad_3d),
            ];
            for (let i = 0; i < offsets.length; ++i) {
                let off = offsets[i];
                let n_pos_3d = genvidMath.add3D(pos_3d, off);
                let n_pos_2d = genvidMath.projectPosition(mat, n_pos_3d);
                let n_rad_sq_2d = genvidMath.lengthSq2D(genvidMath.sub2D(pos_2d, n_pos_2d));
                rad_sq_2d = Math.max(rad_sq_2d, n_rad_sq_2d);
            }
            return [pos_2d, Math.sqrt(rad_sq_2d)];
        }

center_at

center_at(html_element: HTMLElement, pos_2d: genvidMath.IVec2, offset_pixels: genvidMath.IVec2)

center_at メソッドは、送信された位置 2D を中心とする HTML 要素の位置を変更します。このメソッドは、各オブジェクト上に表示された名前 div 要素を移動させるために使用します。

        // Change the HTML element position to be at the center of the pos 2d sent
        center_at(html_element: HTMLElement, pos_2d: genvidMath.IVec2, offset_pixels: genvidMath.IVec2) {

            // Convert from [-1, 1] range to [0, 1].
            let vh = genvidMath.vec2(0.5, 0.5);
            let pos_2d_n = genvidMath.mad2D(pos_2d, vh, vh);

            // Convert from [0, 1] range to [0, w].
            let p = html_element.parentElement;
            let p_size = genvidMath.vec2(p.clientWidth, p.clientHeight);
            let pos_in_parent = genvidMath.mul2D(pos_2d_n, p_size);

            // Adjust for centering element.
            let e_size = genvidMath.vec2(html_element.clientWidth, html_element.clientHeight);
            let e_offset = genvidMath.muls2D(e_size, -0.5);
            let pos_centered = genvidMath.add2D(pos_in_parent, e_offset);

            // Apply user offset.
            let pos_final = genvidMath.sub2D(pos_centered, offset_pixels);
            $(html_element).css({ left: pos_final.x, bottom: pos_final.y, position: "absolute", "z-index": "1100" });
        }

preN

preN(str: string, n: number): string

preN メソッドは、文字列に空白を追加します。このメソッドは、Genvid オーバーレイ上のデータを適切に表示するために使用します。

        // Widens a string to at least n characters, prefixing with spaces.
        private preN(str: string, n: number): string {
            let s: number = str.length;
            if (s < n) {
                str = " ".repeat(n - s) + str;
            }
            return str;
        }

convertMatrix

convertMatrix(rawmat)

convertMatrix メソッドは、数値の配列を 4x4 の genvidMath 行列 (Genvid Math 4x4 Matrix) に変換します。ゲームから送信されたデータは数値の配列として受け取るため、適切な行列形式を使用する必要がある処理を行う場合に、このメソッドを使用します。

        // Convert a 4x4 matrix from the format used by Unity (16 labeled scalars) into a GenvidMath.mat4 instance.
        convertMatrix(rawmat) {
            return genvidMath.mat4(
                genvidMath.vec4(rawmat.e00, rawmat.e01, rawmat.e02, rawmat.e03),
                genvidMath.vec4(rawmat.e10, rawmat.e11, rawmat.e12, rawmat.e13),
                genvidMath.vec4(rawmat.e20, rawmat.e21, rawmat.e22, rawmat.e23),
                genvidMath.vec4(rawmat.e30, rawmat.e31, rawmat.e32, rawmat.e33)
            );
        }

findOrCreateTagDiv

findOrCreateTagDiv(cube: IGameDataCube): HTMLElement

findOrCreateTagDiv メソッドは、オブジェクトと一緒に移動する、オブジェクトの名前を表示する div を検索または作成します。

        // Find or create the div needed for the moving name on the overlay
        findOrCreateTagDiv(cube: IGameDataCube): HTMLElement {
            let elem_id: string = "cube_tag_" + cube.name;
            let elem: HTMLElement = <HTMLDivElement>document.querySelector("#" + elem_id);
            if (elem == null) {
                elem = document.createElement("div");
                elem.id = elem_id;
                elem.textContent = cube.name;
                elem.classList.add("tag");

                let parent: HTMLElement = <HTMLDivElement>document.querySelector("#video_overlay");
                parent.appendChild(elem);

                elem.addEventListener("click", (_event) => { this.setSelection(elem.textContent); this.onSelect(elem.textContent, false); }, false);
            }
            return elem;
        }

msToDuration

msToDuration(duration: number): string

msToDuration メソッドは、ミリ秒を日、時間、分、秒に変換します。

        // Method used to convert ms to specific duration
        private msToDuration(duration: number): string {
            let res = "";
            if (duration < 0) {
                res += "-";
                duration = -duration;
            }
            let second = 1000;
            let minute = second * 60;
            let hour = minute * 60;
            let day = hour * 24;
            let started = false;
            if (duration > day) {
                started = true;
                let rest = duration % day;
                let days = (duration - rest) / day;
                duration = rest;
                res += `${days}:`;
            }
            if (started || duration > hour) {
                started = true;
                let rest = duration % hour;
                let hours = (duration - rest) / hour;
                duration = rest;
                if (hours < 10) {
                    res += "0";
                }
                res += `${hours}:`;
            }
            if (started || duration > minute) {
                started = true;
                let rest = duration % minute;
                let minutes = (duration - rest) / minute;
                duration = rest;
                if (minutes < 10) {
                    res += "0";
                }
                res += `${minutes}:`;
            }
            if (started || duration > second) {
                let rest = duration % second;
                let seconds = (duration - rest) / second;
                duration = rest;
                if (seconds < 10) {
                    res += "0";
                }
                res += `${seconds}.`;
            } else {
                res += "0.";
            }
            if (duration < 100) {
                res += "0";
            }
            if (duration < 10) {
                res += "0";
            }
            return res + `${duration}`;
        }

checkFullScreen

checkFullScreen(): boolean

checkFullScreen メソッドは、現在の全画面ステータスを戻します。

        checkFullScreen(): boolean {
            let doc = <any>document;
            return doc.fullscreenElement || doc.webkitFullscreenElement || doc.mozFullScreenElement || doc.msFullscreenElement;
        }