unityController - Utility メソッド¶
このセクションには、サンプルに役立つすべての関数が含まれていますが、Genvid API の関数は含まれていません。
In This Section
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;
}