import { Vector2, Vector3, Vector4 } from "./GeoMath"; import GLEnv from "./GLEnv"; import Ray from "./Ray"; import DemProvider from "./DemProvider"; import DemBinary from "./DemBinary"; import FlakeRenderObject from "./FlakeRenderObject"; import UpdatedTileArea from "./UpdatedTileArea"; import Entity from "./Entity"; import type { Area } from "./AreaUtil"; import type { PoleInfo } from "./Viewer"; import { StyleFlake } from "./vectile/style_flake"; import type { StyleManager } from "./vectile/style_manager"; /** * 地表形状の管理 */ declare class Globe { readonly glenv: GLEnv; /** * 主要領域の DEM プロバイダ */ readonly dem_provider: DemProvider; private _north_height; private _south_height; get npole_provider(): DemProvider; get spole_provider(): DemProvider; /** * Globe の状態 */ private _status; /** * 準備が整った Belt インスタンス数 */ private _num_ready_belts; /** * Belt の Y 座標の下限 */ private _belt_lower_y; /** * Belt の Y 座標の上限 */ private _belt_upper_y; /** * すべての Belt インスタンス */ private readonly _belts; geo_bbox_visibility: boolean; gocs_bbox_visibility: boolean; private _bbox_target_area_id_max; readonly bbox_target_area_map: Map; private _bbox_target_point_id_max; readonly bbox_target_point_map: Map; /** * @param glenv - WebGL 環境 * @param dem_provider - DEM プロバイダ * @param options - 生成オプション */ constructor(glenv: GLEnv, dem_provider: DemProvider, options?: Option); init(): Promise; /** * Pole を切り替える * * @param pole_info Pole情報 */ setPole(pole_info: PoleInfo): Promise; /** * 領域 0/0/y に対応する `Belt` インスタンスを取得 * * @param y - y 座標 (整数 [_belt_lower_y, _belt_upper_y]) */ private _belt; /** * すべてのリクエストを取り消す */ dispose(): void; /** * Globe 状態を取得 */ get status(): Globe.Status; /** * DEM が更新された領域を取得 */ get dem_area_updated(): UpdatedTileArea; /** * 領域 0/0/0 に対応する基底 Flake を取得 */ get root_flake(): Globe.Flake; /** * 領域 0/0/y に対応する基底 Flake を取得 * * @param y - 領域 0/0/y の y にあたる値 (整数) * * @remarks * * `y` に指定できる範囲は [[getRootYRange]] により取得することがで * きる。 */ getRootFlake(y: number): Globe.Flake; /** * [[getRootFlake]] に指定できる `y` の範囲を取得 * * `this` の有効期間は一定の範囲を返す。 */ getRootYRange(): { lower: number; upper: number; }; /** * 地球全体の標高の範囲を取得 */ getElevationRange(): { min: number; max: number; }; /** * エンティティ情報を更新 * * getRenderObject() の前にエンティティの情報を更新する。 * * @param producers */ putNextEntityProducers(producers: Iterable): void; /** * リクエスト待ちの DEM タイルの個数を取得 * * @return リクエスト待ちの DEM タイルの個数 */ getNumDemWaitingRequests(): number; /** * 正確度が最も高い DEM タイルデータを検索 * * 基底タイル座標 (左上(0, 0)、右下(1, 1)) [xt, yt] の標高データを * 取得することができる、正確度が最も高い DEM タイルデータを検索す * る。 * * サーバーにさらに正確度が高い DEM タイルデータが存在すれば、それ * をリクエストする。 * * @param xt X 座標 (基底タイル座標系) * @param yt Y 座標 (基底タイル座標系) * @return DEM タイルデータ (存在しなければ null) */ findHighestAccuracy(xt: number, yt: number): DemBinary | null; /** * 現行の標高 (複数) を取得 * * 現在メモリーにある最高精度の標高値を一括で取得する。 * * まだ DEM データが存在しない、または経度, 緯度が範囲外の場所は標高を 0 とする。 * * このメソッドは DEM のリクエストは発生しない。また DEM のキャッシュには影響を与えない。 * * 一般的に画面に表示されていない場所は標高の精度が低い。 * * @param num_points 入出力データ数 * @param src_array 入力配列 (経度, 緯度, ...) * @param src_offset 入力データの先頭インデックス * @param src_stride 入力データのストライド * @param dst_array 出力配列 (標高, ...) * @param dst_offset 出力データの先頭インデックス * @param dst_stride 出力データのストライド * @return dst_array * * @see [[Viewer.getExistingElevations]] */ getExistingElevations(num_points: number, src_array: number[], src_offset: number, src_stride: number, dst_array: number[], dst_offset: number, dst_stride: number): number[]; /** * 地表断片とレイの交点までの距離を検索 * * 地球全体 `this` と線分 (`ray.position` を始点とし、そこから * `ray.direction` 方向に `limit` 距離未満にある点) との交点の中で、 * 始点から最も近い交点までの距離を返す。 * * ただし地球全体と線分が交差しないときは `limit` を返す。 * * 事前条件: `this.status` === `Status.READY` * * @param ray - `ray.position` を始点として `ray.direction` 方向に伸びる半直線 * @param limit - この距離までの交点を検索 * * @returns `ray.position` から交点までの距離、ただし交差しなかったときは `limit` */ findRayDistance(ray: Ray, limit: number): number; /** * フレームの最後の処理 */ endFrame(): void; /** * 境界箱表示をするflakeかをチェック * * @param flake Flake インスタンス */ isBboxVisible(flake: Globe.Flake): boolean; } /** * [[Globe]] の生成オプションの型 * * @see [[Globe.constructor]] */ export interface Option { /** * 極地情報 * * @defaultValue [[Viewer.PoleOption]] の既定値 */ pole_info?: PoleInfo; } declare namespace Globe { /** * Globe 状態の列挙型 * * @see [[Globe.status]] */ const enum Status { /** * 準備中 (初期状態) */ NOT_READY = "@@_NOT_READY", /** * 準備完了 */ READY = "@@_READY", /** * 失敗状態 */ FAILED = "@@_FAILED" } /** * 地表断片 */ class Flake implements Area { readonly z: number; readonly x: number; readonly y: number; private _parent; readonly children: [Flake | null, Flake | null, Flake | null, Flake | null]; /** * DEM バイナリ、または取り消しオブジェクト * * - `_dem_state === DemState.LOADED` のとき: `DemBinary` インスタンス * - `_dem_state === DemState.REQUESTED` のとき: 取り消しオブジェクト (`unknown` 型) * - それ以外のとき: `null` */ private _dem_data; private _dem_state; /** エンティティ辞書 */ private _entity_map; private _meshes; private _style_flake; /** * 標高代表値 * * 前回の Za (DemBinary) だだし、標高代表が決定しているときは * `this` である。 * * 初期状態は `null` である。 */ private _prev_Za_dem; /** * 標高代表値 * * 前回の Zr (DemBinary) である。 * * 初期状態は `null` である。 */ private _prev_Zr_dem; private _base_height; private _height_min; private _height_max; private _dem_zlimit; private _gocs_x_min; private _gocs_x_max; private _gocs_y_min; private _gocs_y_max; private _gocs_z_min; private _gocs_z_max; private _aframe; constructor(parent: Flake | null, z: number, x: number, y: number); get globe(): Globe; get bbox_min(): Vector3; get bbox_max(): Vector3; /** * DemBinary インスタンスを取得する。 * * DEM 状態は DemState.LOADED であること。 */ getDemBinary(): DemBinary; /** * DEM 状態が `state` であるかどうかを確認する。 */ isDemState(state: DemState): boolean; /** * 基準の標高 */ get base_height(): number; /** * 最小の標高 */ get height_min(): number; /** * 最大の標高 */ get height_max(): number; /** * 子 Flake を取得または生成 * @param u 子 Flake U 座標 (0 または 1) * @param v 子 Flake V 座標 (0 または 1) * @return 子 Flake インスタンス */ newChild(u: number, v: number): Globe.Flake; /** * レンダリングオブジェクトを検索 * * @param lod 地表詳細レベル (LOD) */ getRenderObject(lod: number, requireBboxMesh: boolean): FlakeRenderObject; /** *this と交差する FlakePrimitiveProducer インスタンスの列挙子を取得 */ getEntityProducers(): Iterable; /** * Flake ツリーに producer を追加 * * 事前条件: * - this._entity_map !== null * - this と this の子孫に producer が存在しない * * @param producer */ addEntityProducer(producer: Entity.FlakePrimitiveProducer): void; /** * Flake ツリーに producer を追加 * * 事前条件: * - producer.getAreaStatus( this ) === Entity.AreaStatus.FULL * - this._entity_map !== null * - this と this の子孫に producer が存在しない * * @param producer */ private _addEntityFullProducer; /** * Flake ツリーから producer を削除 * * 事前条件: * - this._entity_map !== null * 事後条件: * - this と this の子孫に producer が存在しない * * @param producer */ removeEntityProducer(producer: Entity.FlakePrimitiveProducer): void; /** * Flake ツリーの producer を更新 * * 事前条件: * - this._entity_map !== null * * @param producer */ updateEntityProducer(producer: Entity.FlakePrimitiveProducer): void; /** * 地表断片とレイの交点までの距離を検索 * * 地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点の中で、始点から最も近い交点までの距離を返す。 * * ただし地表断片と線分が交差しないときは limit を返す。 * * 事前条件: this.belt.status === Status.READY * * @param ray ray.position を始点として ray.direction 方向に伸びる半直線 * @param limit この距離までの交点を検索 * @return ray.position から交点までの距離、ただし交差しなかったときは limit */ findRayDistance(ray: Ray, limit: number): number; /** * [[StyleFlake]] インスタンスを用意する。 * * 対応する DEM データが存在しないときは `null` を返し、必要なら * DEM データをリクエストする。 */ ensureStyleFlake(style_manager: StyleManager): StyleFlake | null; /** * [[StyleFlake]] のリクエストを取り消してから、`StyleFlake` イン * スタンスを消去する。 * * [[StyleManager.__cancel]] または [[Globe.cancel]] から呼び出される。 */ cancelStyleFlake(): void; /** * 自己と子孫を破棄 */ dispose(): void; /** * 指定した MeshNode インスタンスを削除 */ removeMeshNode(node: MeshNode): void; /** * 削減用の Flake 比較 * @param other 比較対象 * @return 比較値 * @package */ compareForReduce(other: Globe.Flake): number; private _flattenFlakes; private _flattenMeshes; /** * アクセスフレームを更新 * @package */ touch(): void; /** * メッシュノードを取得 * * @param lod 地表詳細レベル (LOD) * @param cu 水平球面分割レベル * @param cv 垂直球面分割レベル * * @return メッシュノード */ private _getMeshNode; /** * メッシュ用の DEM バイナリを取得 * @param lod 地表詳細レベル (LOD) * @return DEM タイルデータ */ private _getMeshDemBinary; /** * 先祖 DEM タイルデータを検索 * * this の (レベルが zlimit またはそれ以下の) 祖先の中で、現在キャッ * シュに存在する最大レベルの DEM タイルデータを検索する。 * * @param zlimit - 先祖レベルの上限 (>= 0, int) * * @returns 先祖 DEM タイルデータ */ private _findNearestDemTile; /** * 地表断片を包含する DEM タイルデータを要求 * * this を包含または this と一致する、ズームレベル ze の DEM タイルをサーバーに要求する。 * * ただしすでにキャッシュにその DEM タイルが存在、または REQUESTED 状態のときは要求しない。 * * FAILED 状態かつ ze > 0 のときは、再帰的に ze - 1 を要求する。 * * 要求が最大数に達しているときは無視する。 * * @param ze - DEM ズームレベル (>= 0, int) */ private _requestAncestorDemTile; /** * カリングするか? * * @param clip_planes - クリップ平面配列 * * @returns 見えないとき `true`, 見えるまたは不明のとき `false` */ isInvisible(clip_planes: Vector4[]): boolean; /** * 領域内で絶対値が最小の緯度に対する余弦 */ private _getCosφ; /** * 標高代表値と境界箱を更新 */ private _estimate; /** * 標高代表値を計算 (Zg < ρ) * * @param zr_dem レベルが Zr の DEM */ private _estimate_low; /** * 標高代表値を計算 (Zg >= ρ && !L(Za)) * * @param za_dem レベルが Za の DEM * @param zr_dem レベルが Zr の DEM */ private _estimate_high; /** * 標高代表値を計算 (Zg >= ρ && L(Za)) * * @param za_dem レベルが Za の DEM */ private _estimate_leaf; /** * α を計算 * * 中間緯度の標高 0 での緯線の長さを示す値 α を計算する。 * * @return α */ private _calcAlpha; /** * 境界箱を更新 (Z == 0) */ private _updateBoundingBox_0; /** * 境界箱を更新 (Z == 1) */ private _updateBoundingBox_1; /** * 境界箱を更新 (Z >= 2) */ private _updateBoundingBox_N; /** * 地表断片とレイの交点までの距離を検索 * * 地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) との交点までの距離を返す。 * * ただし地表断片と線分が交差しないときは limit を返す。 */ private _findQuadRayDistance; /** * 三角形とレイの交点までの距離を検索 * * 三角形 p0, p1, p2 と線分 (ray.position を始点とし、そこから * ray.direction 方向に limit 距離未満にある点) との交点までの距離 * を返す。 * * ただし地表断片と線分が交差しないときは limit を返す。 */ private static _findTriRayDistance; /** * 四隅の位置を取得 * * @param height_src 高さ情報 * @param positions 結果の格納先 * * @returns [左上, 右上, 左下, 右下] */ getQuadPositions(height_src: Flake | number[], positions: [Vector3, Vector3, Vector3, Vector3]): [Vector3, Vector3, Vector3, Vector3]; /** * 地表断片とレイの交点までの距離を検索 * * 地表断片 this と線分 (ray.position を始点とし、そこから ray.direction 方向に limit 距離未満にある点) が交差しないときは true, 交差するまたは不明のとき false を返す。 */ private _cullForRayDistance; /** * エンティティのメッシュを削除 * * @param producer */ private _removeEntityMeshes; /** * エンティティ辞書を取得 */ private _getEntityMap; /** * 球面分割数の係数 */ private static readonly ε; /** * 標高下限係数 */ static readonly Fm = -2; /** * 標高上限係数 */ static readonly Fp = 2; private static readonly πr; private static readonly _temp_ray_1; private static readonly _temp_ray_2; private static readonly _temp_ray_3; private static readonly _temp_ray_4; private static readonly _temp_ray_5; private static readonly _temp_ray_6; private static readonly _temp_ray_7; private static readonly _temp_ray_8; private static readonly _temp_ray_9; private static readonly _temp_ray_10; private static readonly _temp_ray_11; } } /** * メッシュ管理ノード */ declare class MeshNode { private _flake; private _dem; private _dpows; private _aframe; private _base_mesh; private _flake_bbox_info; private _entity_meshes; /** * 初期化 * @param flake 所有者 * @param dem DEM バイナリ * @param dpows 分割指数 */ constructor(flake: Globe.Flake, dem: DemBinary, dpows: [number, number]); _getBboxMesh(): Globe.FlakeBboxMeshInfo; /** * FlakeRenderObject インスタンスを取得 */ getRenderObject(requireBboxMesh: boolean): FlakeRenderObject; /** * 一致するか? * @param dem DEM バイナリ * @param dpows 分割指数 * @return 一致するとき true, 一致しないとき false */ match(dem: DemBinary, dpows: [number, number]): boolean; /** * アクセスフレームを更新 */ touch(): void; /** * ノードを破棄 */ dispose(): void; /** * エンティティのメッシュを削除 * * producer に対応するメッシュが存在すれば削除する。 * * @param producer */ removeEntityMesh(producer: Entity.FlakePrimitiveProducer): void; /** * エンティティのメッシュを取得 * * `producer` に対応するメッシュを取得する。 * * ただし存在しないとき `undefined`, 空メッシュが設定されているとき * は `"CACHED_EMPTY_MESH"` を返す。 */ private _getEntityMesh; /** * エンティティのメッシュを設定 * * `producer` に対応するメッシュを設定する。 * * 空メッシュを設定するときは `mesh` に `"CACHED_EMPTY_MESH"` を指定する。 */ private _setEntityMesh; /** * 境界箱メッシュ情報を作成 */ private createBboxInfo; /** * GOCS座標系における境界箱メッシュを作成 */ private _createGocsBbox; /** * 緯度,経度,高度における境界箱メッシュを作成 */ private _createGeoBbox; } /** * DEM 状態の列挙型 */ export declare const enum DemState { /** * DEM タイルが存在しない */ NONE = "@@_NONE", /** * DEM タイルが存在する */ LOADED = "@@_LOADED", /** * DEM タイルをリクエスト中 */ REQUESTED = "@@_REQUESTED", /** * DEM タイルのリクエストに失敗 */ FAILED = "@@_FAILED" } declare namespace Globe { interface DebugPickInfo { ray?: Ray; distance?: number; trace: Globe.Flake[]; quads: [Vector3, Vector3, Vector3, Vector3][]; } } /** * 可能な Belt の Y 座標の下限 * * 0 または 0 以下の整数 */ export declare const GLOBE_BELT_LOWER_Y = -3; /** * 可能な Belt の Y 座標の上限 * * 0 または 0 以上の整数 */ export declare const GLOBE_BELT_UPPER_Y = 3; declare const Flake: typeof Globe.Flake; export { Flake }; export default Globe; //# sourceMappingURL=Globe.d.ts.map