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