/** @file JSInput.cpp @brief @author James @version 1.0 @date 2016_5_18 */ #include "JSInput.h" #include #include "../../JSWrapper/LayaWrap/JSInput.h" #include #include "../../JCConch.h" namespace laya { ADDJSCLSINFO(JSInput, JSObjNode); JSInput* JSInput::m_pInstance = NULL; JSInput* JSInput::getInstance() { if (m_pInstance == NULL) { m_pInstance = new JSInput(); } return m_pInstance; } void JSInput::Reset() { } JSInput::JSInput() { m_pCmdPoster = JCScriptRuntime::s_JSRT->m_pPoster; m_bTouchMode = false; m_vInputEvents.reserve( 64 ); m_vInputEventsJS.reserve( 64 ); m_nTouchFrame = 0; } JSInput::~JSInput() { } void JSInput::onDeviceOrientationCallJSFunction(DeviceOrientationEvent e) { JCScriptRuntime::s_JSRT->m_pJSDeviceMotionEvtFunction.Call(e.type,e.ra,e.rb,e.rg); } void JSInput::onDeviceMotionCallJSFunction(DeviceMotionEvent e) { float* t = (float *)JCScriptRuntime::s_JSRT->m_pOtherBufferSharedWidthJS; t[0] = e.ax; t[1] = e.ay; t[2] = e.az; t[3] = e.agx; t[4] = e.agy; t[5] = e.agz; t[6] = e.ra; t[7] = e.rb; t[8] = e.rg; t[9] = e.interval; JCScriptRuntime::s_JSRT->m_pJSDeviceMotionEvtFunction.Call(e.type); } void JSInput::setTouchMode(bool bMode) { m_bTouchMode = bMode; } bool JSInput::getTouchMode() { return m_bTouchMode; } void JSInput::swapCurrentTouchEvent() { m_Lock.lock(); std::swap(m_vInputEvents, m_vInputEventsJS); m_vInputEvents.clear(); m_Lock.unlock(); } void JSInput::onInputCallJSFunction(inputEvent e) { //touch if (e.nType <= E_ONACTION_POINTER_UP) { JCScriptRuntime::s_JSRT->m_pJSTouchEvtFunction.Call(e.nTouchType, e.id, e.type, e.posX, e.posY); } //鼠标 else if (e.nType >= E_ONMOUSEDOWN && e.nType <= E_ONRIGHTMOUSEUP) { JCScriptRuntime::s_JSRT->m_pJSMouseEvtFunction.Call(e.nTouchType, e.type, e.posX, e.posY, e.nWheel); } //键盘 else if (e.nType >= E_ONKEYDOWN && e.nType <= E_ONKEYUP) { int bAlt = e.bAlt ? 1 : 0; int bShift = e.bShift ? 2 : 0; int bCtrl = e.bCtrl ? 4 : 0; JCScriptRuntime::s_JSRT->m_pJSKeyEvtFunction.Call(e.type, e.keyCode, e.keyChar, bAlt&bShift&bCtrl); } else if (e.nType == E_JOYSTICK) { //JCScriptRuntime::s_JSRT->m_JoystickEvtHandler.Call(e.type, e.fTHUMBL_xOffset, e.fTHUMBL_yOffset, e.fTHUMBR_xOffset, e.fTHUMBR_yOffset, e.fLT_Offset, e.fRT_Offset); } } bool JSInput::activeCall(inputEvent e) { if (e.nType > E_TYPE_COUNT) { return false; } if (e.nType <= E_ONACTION_POINTER_UP && m_bTouchMode == true) { TouchEventInfo info = { e.nTouchType,e.id,e.posX,e.posY}; m_Lock.lock(); m_vInputEvents.push_back(info); m_Lock.unlock(); } else { #ifdef WIN32 if (e.nType == E_ONMOUSEDOWN || e.nType == E_ONMOUSEMOVE) { #else if (e.nType == E_ONTOUCHSTART || e.nType == E_ONTOUCHMOVE) { #endif double fTime = tmGetCurms(); #ifdef __APPLE__ if (JCConch::s_pConchRender) JCConch::s_pConchRender->onTouchStart(fTime); #elif ANDROID //如何转到渲染线程?有线程问题但应该影响不大 if (JCConch::s_pConchRender) JCConch::s_pConchRender->onTouchStart(fTime); #elif WIN32 if (JCConch::s_pConchRender) { std::function pFunction = std::bind(&JCConchRender::onTouchStart, JCConch::s_pConchRender, fTime); JCConch::s_pConchRender->m_pRenderThread->post(pFunction); } #endif } std::function pFunction = std::bind(&JSInput::onInputCallJSFunction, this, e); if (JCScriptRuntime::s_JSRT->m_pPoster) { JCScriptRuntime::s_JSRT->m_pPoster->postToJS(pFunction); } } return true; } bool JSInput::activeCall(DeviceMotionEvent e) { if (e.nType > E_TYPE_COUNT) { return false; } std::function pFunction = std::bind(&JSInput::onDeviceMotionCallJSFunction, this, e); if (JCScriptRuntime::s_JSRT->m_pPoster) JCScriptRuntime::s_JSRT->m_pPoster->postToJS(pFunction); return true; } bool JSInput::activeCall(DeviceOrientationEvent e) { std::function pFunction = std::bind(&JSInput::onDeviceOrientationCallJSFunction, this, e); if (JCScriptRuntime::s_JSRT->m_pPoster) JCScriptRuntime::s_JSRT->m_pPoster->postToJS(pFunction); return true; } void JSInput::captureScreenCallBack(char *p_pBuffer, int p_nLen, int p_nW, int p_nH) { std::function pFunction = std::bind(&JSInput::onCaptureScreenCallJSFunction, this, p_pBuffer,p_nLen,p_nW,p_nH); if (JCScriptRuntime::s_JSRT->m_pPoster) JCScriptRuntime::s_JSRT->m_pPoster->postToJS(pFunction); } void JSInput::onCaptureScreenCallJSFunction(char *p_pBuffer, int p_nlen, int p_nW, int p_nH) { #ifdef JS_V8 v8::HandleScope scope(v8::Isolate::GetCurrent()); #endif JsValue ab = createJSAB(p_pBuffer, p_nlen); delete[] p_pBuffer; JCScriptRuntime::s_JSRT->m_pJSOnceOtherEvtFuction.Call(ab, p_nW,p_nH); } void JSInput::exportJS() { } } //------------------------------------------------------------------------------ //-----------------------------END FILE--------------------------------