14514f5e3Sopenharmony_ci/*
24514f5e3Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
34514f5e3Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
44514f5e3Sopenharmony_ci * you may not use this file except in compliance with the License.
54514f5e3Sopenharmony_ci * You may obtain a copy of the License at
64514f5e3Sopenharmony_ci *
74514f5e3Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
84514f5e3Sopenharmony_ci *
94514f5e3Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
104514f5e3Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
114514f5e3Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
124514f5e3Sopenharmony_ci * See the License for the specific language governing permissions and
134514f5e3Sopenharmony_ci * limitations under the License.
144514f5e3Sopenharmony_ci */
154514f5e3Sopenharmony_ci
164514f5e3Sopenharmony_ciimport { CanvasInput } from '../ir/CanvasInput.js';
174514f5e3Sopenharmony_ciimport { X2DFast } from './graphics/X2DFast.js';
184514f5e3Sopenharmony_ciimport { Scr } from './XDefine.js';
194514f5e3Sopenharmony_ciimport { XTools } from './XTools.js';
204514f5e3Sopenharmony_ci
214514f5e3Sopenharmony_ciexport var gl;
224514f5e3Sopenharmony_civar Mouse = {
234514f5e3Sopenharmony_ci  MOUSE_LEFT: 0,
244514f5e3Sopenharmony_ci  MOUSE_RILLER: 1,
254514f5e3Sopenharmony_ci  MOUSE_RIGHT: 2,
264514f5e3Sopenharmony_ci};
274514f5e3Sopenharmony_ci
284514f5e3Sopenharmony_civar MouseEvent = {
294514f5e3Sopenharmony_ci  LEFT_CLICK: 1,
304514f5e3Sopenharmony_ci  LEFT_MOVE: 2,
314514f5e3Sopenharmony_ci  LEFT_RELEASE: 3,
324514f5e3Sopenharmony_ci  RIGHT_CLICK: 4,
334514f5e3Sopenharmony_ci  RIGHT_MOVE: 5,
344514f5e3Sopenharmony_ci  RIGHT_RELEASE: 6,
354514f5e3Sopenharmony_ci};
364514f5e3Sopenharmony_ci
374514f5e3Sopenharmony_cifunction touchStart(e) {
384514f5e3Sopenharmony_ci  document.addEventListener('contextmenu', function (e) {
394514f5e3Sopenharmony_ci    e.preventDefault();
404514f5e3Sopenharmony_ci  });
414514f5e3Sopenharmony_ci  e.preventDefault();
424514f5e3Sopenharmony_ci  GLFrame.pinstance_.callbackProctouch(
434514f5e3Sopenharmony_ci    MouseEvent.LEFT_CLICK,
444514f5e3Sopenharmony_ci    e.touches[0].clientX,
454514f5e3Sopenharmony_ci    e.touches[0].clientY
464514f5e3Sopenharmony_ci  );
474514f5e3Sopenharmony_ci}
484514f5e3Sopenharmony_cifunction touchMove(e) {
494514f5e3Sopenharmony_ci  e.preventDefault();
504514f5e3Sopenharmony_ci  GLFrame.pinstance_.callbackProctouch(
514514f5e3Sopenharmony_ci    MouseEvent.LEFT_MOVE,
524514f5e3Sopenharmony_ci    e.touches[0].clientX,
534514f5e3Sopenharmony_ci    e.touches[0].clientY
544514f5e3Sopenharmony_ci  );
554514f5e3Sopenharmony_ci}
564514f5e3Sopenharmony_cifunction touchEnd(e) {
574514f5e3Sopenharmony_ci  e.preventDefault();
584514f5e3Sopenharmony_ci  GLFrame.pinstance_.callbackProctouch(
594514f5e3Sopenharmony_ci    MouseEvent.LEFT_RELEASE,
604514f5e3Sopenharmony_ci    e.changedTouches[0].clientX,
614514f5e3Sopenharmony_ci    e.changedTouches[0].clientY
624514f5e3Sopenharmony_ci  );
634514f5e3Sopenharmony_ci}
644514f5e3Sopenharmony_ci
654514f5e3Sopenharmony_cifunction mouseDown(e) {
664514f5e3Sopenharmony_ci  e.preventDefault();
674514f5e3Sopenharmony_ci  switch (e.button) {
684514f5e3Sopenharmony_ci    case Mouse.MOUSE_LEFT:
694514f5e3Sopenharmony_ci      GLFrame.pinstance_.callbackProctouch(
704514f5e3Sopenharmony_ci        MouseEvent.LEFT_CLICK,
714514f5e3Sopenharmony_ci        e.offsetX,
724514f5e3Sopenharmony_ci        e.offsetY
734514f5e3Sopenharmony_ci      );
744514f5e3Sopenharmony_ci      break;
754514f5e3Sopenharmony_ci    case Mouse.MOUSE_RIGHT:
764514f5e3Sopenharmony_ci      GLFrame.pinstance_.callbackProctouch(
774514f5e3Sopenharmony_ci        MouseEvent.RIGHT_CLICK,
784514f5e3Sopenharmony_ci        e.offsetX,
794514f5e3Sopenharmony_ci        e.offsetY
804514f5e3Sopenharmony_ci      );
814514f5e3Sopenharmony_ci      break;
824514f5e3Sopenharmony_ci  }
834514f5e3Sopenharmony_ci}
844514f5e3Sopenharmony_cifunction mouseMove(e) {
854514f5e3Sopenharmony_ci  e.preventDefault();
864514f5e3Sopenharmony_ci  GLFrame.pinstance_.callbackProctouch(
874514f5e3Sopenharmony_ci    MouseEvent.LEFT_MOVE,
884514f5e3Sopenharmony_ci    e.offsetX,
894514f5e3Sopenharmony_ci    e.offsetY
904514f5e3Sopenharmony_ci  );
914514f5e3Sopenharmony_ci}
924514f5e3Sopenharmony_cifunction mouseUp(e) {
934514f5e3Sopenharmony_ci  e.preventDefault();
944514f5e3Sopenharmony_ci  switch (e.button) {
954514f5e3Sopenharmony_ci    case Mouse.MOUSE_LEFT:
964514f5e3Sopenharmony_ci      GLFrame.pinstance_.callbackProctouch(
974514f5e3Sopenharmony_ci        MouseEvent.LEFT_RELEASE,
984514f5e3Sopenharmony_ci        e.offsetX,
994514f5e3Sopenharmony_ci        e.offsetY
1004514f5e3Sopenharmony_ci      );
1014514f5e3Sopenharmony_ci      break;
1024514f5e3Sopenharmony_ci    case Mouse.MOUSE_RIGHT:
1034514f5e3Sopenharmony_ci      GLFrame.pinstance_.callbackProctouch(
1044514f5e3Sopenharmony_ci        MouseEvent.RIGHT_RELEASE,
1054514f5e3Sopenharmony_ci        e.offsetX,
1064514f5e3Sopenharmony_ci        e.offsetY
1074514f5e3Sopenharmony_ci      );
1084514f5e3Sopenharmony_ci      break;
1094514f5e3Sopenharmony_ci  }
1104514f5e3Sopenharmony_ci}
1114514f5e3Sopenharmony_cifunction mouseWheel(e) {
1124514f5e3Sopenharmony_ci  e.preventDefault();
1134514f5e3Sopenharmony_ci  if (e.wheelDeltaY > 0) {
1144514f5e3Sopenharmony_ci    GLFrame.pinstance_.callbackProctouch(10, e.clientX, e.clientY);
1154514f5e3Sopenharmony_ci  }
1164514f5e3Sopenharmony_ci  else {
1174514f5e3Sopenharmony_ci    GLFrame.pinstance_.callbackProctouch(11, e.clientX, e.clientY);
1184514f5e3Sopenharmony_ci  }
1194514f5e3Sopenharmony_ci}
1204514f5e3Sopenharmony_ci
1214514f5e3Sopenharmony_cifunction keyUp(e) {
1224514f5e3Sopenharmony_ci  if (!e.ctrlKey) {
1234514f5e3Sopenharmony_ci    XTools.KEY_CTRL = false;
1244514f5e3Sopenharmony_ci  }
1254514f5e3Sopenharmony_ci  if (!e.shiftKey) {
1264514f5e3Sopenharmony_ci    XTools.KEY_SHIFT = false;
1274514f5e3Sopenharmony_ci  }
1284514f5e3Sopenharmony_ci  if (!e.altKey) {
1294514f5e3Sopenharmony_ci    XTools.KEY_ALT = false;
1304514f5e3Sopenharmony_ci  }
1314514f5e3Sopenharmony_ci  e.preventDefault();
1324514f5e3Sopenharmony_ci}
1334514f5e3Sopenharmony_ci
1344514f5e3Sopenharmony_cifunction keyDown(e) {
1354514f5e3Sopenharmony_ci  let ret = '';
1364514f5e3Sopenharmony_ci  if (e.ctrlKey) {
1374514f5e3Sopenharmony_ci    if (ret.length > 0) ret += '+';
1384514f5e3Sopenharmony_ci    ret += 'ctrl';
1394514f5e3Sopenharmony_ci    XTools.KEY_CTRL = true;
1404514f5e3Sopenharmony_ci  }
1414514f5e3Sopenharmony_ci  if (e.shiftKey) {
1424514f5e3Sopenharmony_ci    if (ret.length > 0) ret += '+';
1434514f5e3Sopenharmony_ci    ret += 'shift';
1444514f5e3Sopenharmony_ci    XTools.KEY_SHIFT = true;
1454514f5e3Sopenharmony_ci  }
1464514f5e3Sopenharmony_ci  if (e.altKey) {
1474514f5e3Sopenharmony_ci    if (ret.length > 0) ret += '+';
1484514f5e3Sopenharmony_ci    ret += 'alt';
1494514f5e3Sopenharmony_ci    XTools.KEY_ALT = true;
1504514f5e3Sopenharmony_ci  }
1514514f5e3Sopenharmony_ci  if (ret.length > 0) ret += '+';
1524514f5e3Sopenharmony_ci  ret += e.key;
1534514f5e3Sopenharmony_ci  GLFrame.pinstance_.callbackKey(1, ret);
1544514f5e3Sopenharmony_ci  if (!CanvasInput.FOCUS) {
1554514f5e3Sopenharmony_ci  }
1564514f5e3Sopenharmony_ci  if (ret === 'ctrl+z' || ret === 'ctrl+f' || ret === 'Enter') {
1574514f5e3Sopenharmony_ci    e.preventDefault();
1584514f5e3Sopenharmony_ci  }
1594514f5e3Sopenharmony_ci}
1604514f5e3Sopenharmony_ci
1614514f5e3Sopenharmony_cifunction mainLoop() {
1624514f5e3Sopenharmony_ci  GLFrame.pinstance_.callbackDraw();
1634514f5e3Sopenharmony_ci  window.requestAnimationFrame(mainLoop);
1644514f5e3Sopenharmony_ci}
1654514f5e3Sopenharmony_ci
1664514f5e3Sopenharmony_ciexport class GLFrame {
1674514f5e3Sopenharmony_ci  static gi() {
1684514f5e3Sopenharmony_ci    return GLFrame.pinstance_;
1694514f5e3Sopenharmony_ci  }
1704514f5e3Sopenharmony_ci  constructor() { }
1714514f5e3Sopenharmony_ci
1724514f5e3Sopenharmony_ci  go(cvs, _draw = null, _touch = null, _key = null, _logic = null) {
1734514f5e3Sopenharmony_ci    gl = cvs.getContext('webgl', { premultipliedAlpha: false });
1744514f5e3Sopenharmony_ci
1754514f5e3Sopenharmony_ci    this.pCallbackDraw = _draw;
1764514f5e3Sopenharmony_ci    this.pCallbackTouch = _touch;
1774514f5e3Sopenharmony_ci    this.pCallbackKey = _key;
1784514f5e3Sopenharmony_ci    this.pCallbackLogic = _logic;
1794514f5e3Sopenharmony_ci    this.pCallbackDropfile = null;
1804514f5e3Sopenharmony_ci
1814514f5e3Sopenharmony_ci    cvs.addEventListener('touchstart', touchStart);
1824514f5e3Sopenharmony_ci    cvs.addEventListener('touchmove', touchMove);
1834514f5e3Sopenharmony_ci    cvs.addEventListener('touchend', touchEnd);
1844514f5e3Sopenharmony_ci
1854514f5e3Sopenharmony_ci    cvs.addEventListener('mousedown', mouseDown);
1864514f5e3Sopenharmony_ci    cvs.addEventListener('mousemove', mouseMove);
1874514f5e3Sopenharmony_ci    cvs.addEventListener('mouseup', mouseUp);
1884514f5e3Sopenharmony_ci    cvs.addEventListener('mousewheel', mouseWheel);
1894514f5e3Sopenharmony_ci
1904514f5e3Sopenharmony_ci    cvs.addEventListener('drop', (e) => {
1914514f5e3Sopenharmony_ci      e.preventDefault();
1924514f5e3Sopenharmony_ci      GLFrame.gi().callbackDropfile(e.dataTransfer.files, e.offsetX, e.offsetY);
1934514f5e3Sopenharmony_ci    });
1944514f5e3Sopenharmony_ci    cvs.addEventListener('dragover', (e) => {
1954514f5e3Sopenharmony_ci      e.preventDefault();
1964514f5e3Sopenharmony_ci    });
1974514f5e3Sopenharmony_ci    cvs.addEventListener('dragenter', (e) => {
1984514f5e3Sopenharmony_ci      e.preventDefault();
1994514f5e3Sopenharmony_ci    });
2004514f5e3Sopenharmony_ci    cvs.focus();
2014514f5e3Sopenharmony_ci
2024514f5e3Sopenharmony_ci    document.addEventListener('contextmenu', function (e) {
2034514f5e3Sopenharmony_ci      e.preventDefault();
2044514f5e3Sopenharmony_ci    });
2054514f5e3Sopenharmony_ci
2064514f5e3Sopenharmony_ci
2074514f5e3Sopenharmony_ci    window.addEventListener('keydown', keyDown);
2084514f5e3Sopenharmony_ci    window.addEventListener('keyup', keyUp);
2094514f5e3Sopenharmony_ci    window.requestAnimationFrame(mainLoop);
2104514f5e3Sopenharmony_ci  }
2114514f5e3Sopenharmony_ci  callbackKey(type, code) {
2124514f5e3Sopenharmony_ci    if (this.pCallbackKey !== null) {
2134514f5e3Sopenharmony_ci      this.pCallbackKey(type, code);
2144514f5e3Sopenharmony_ci    }
2154514f5e3Sopenharmony_ci  }
2164514f5e3Sopenharmony_ci  callbackDraw() {
2174514f5e3Sopenharmony_ci    gl.clearColor(1.0, 1.0, 1.0, 1.0);
2184514f5e3Sopenharmony_ci    gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
2194514f5e3Sopenharmony_ci
2204514f5e3Sopenharmony_ci    if (this.pCallbackDraw !== null) {
2214514f5e3Sopenharmony_ci      this.pCallbackDraw();
2224514f5e3Sopenharmony_ci    }
2234514f5e3Sopenharmony_ci  }
2244514f5e3Sopenharmony_ci
2254514f5e3Sopenharmony_ci  callbackProctouch(msg, x, y) {
2264514f5e3Sopenharmony_ci    XTools.MOUSE_POS.x = x;
2274514f5e3Sopenharmony_ci    XTools.MOUSE_POS.y = y;
2284514f5e3Sopenharmony_ci    if (this.pCallbackTouch !== null) {
2294514f5e3Sopenharmony_ci      x = (x * Scr.logicw) / Scr.width;
2304514f5e3Sopenharmony_ci      y = (y * Scr.logich) / Scr.height;
2314514f5e3Sopenharmony_ci      this.pCallbackTouch(msg, x, y);
2324514f5e3Sopenharmony_ci    }
2334514f5e3Sopenharmony_ci  }
2344514f5e3Sopenharmony_ci  callbackDropfile(files, x, y) {
2354514f5e3Sopenharmony_ci    if (this.pCallbackDropfile !== null) {
2364514f5e3Sopenharmony_ci      this.pCallbackDropfile(files, x, y);
2374514f5e3Sopenharmony_ci    }
2384514f5e3Sopenharmony_ci  }
2394514f5e3Sopenharmony_ci  resize() {
2404514f5e3Sopenharmony_ci    gl.viewport(0, 0, Scr.logicw, Scr.logich);
2414514f5e3Sopenharmony_ci    X2DFast.gi().resetMat();
2424514f5e3Sopenharmony_ci  }
2434514f5e3Sopenharmony_ci}
2444514f5e3Sopenharmony_ci
2454514f5e3Sopenharmony_ciGLFrame.pinstance_ = new GLFrame();
246