350 lines
13 KiB
C++
350 lines
13 KiB
C++
/**
|
|
@file JCConch.cpp
|
|
@brief
|
|
@author James
|
|
@version 1.0
|
|
@date 2017_11_28
|
|
*/
|
|
|
|
#include "JCConch.h"
|
|
#include <algorithm>
|
|
#include <util/Log.h>
|
|
#include <util/JCCommonMethod.h>
|
|
#include <fileSystem/JCFileSystem.h>
|
|
#include <downloadCache/JCFileSource.h>
|
|
#include <resource/JCFileResManager.h>
|
|
#include "JCConch.h"
|
|
#include "JSWrapper/JSInterface/JSInterface.h"
|
|
#include "JSWrapper/LayaWrap/JSFileReader.h"
|
|
#include "JSWrapper/LayaWrap/JSGlobalExportCFun.h"
|
|
#include "JCScriptRuntime.h"
|
|
#include <downloadMgr/JCDownloadMgr.h>
|
|
#include "JCThreadCmdMgr.h"
|
|
#include "JCSystemConfig.h"
|
|
#include <LayaGL/JCLayaGL.h>
|
|
#include <webglplus/JCWebGLPlus.h>
|
|
#ifdef JS_V8
|
|
#include "JSWrapper/v8debug/debug-agent.h"
|
|
#elif JS_JSVM
|
|
#include "JSWrapper/v8debug/debug-agent.h"
|
|
#endif
|
|
#ifdef ANDROID
|
|
#include "WebSocket/WebSocket.h"
|
|
#include "CToJavaBridge.h"
|
|
#include <dlfcn.h>
|
|
#include <pthread.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
#elif OHOS
|
|
#include "helper/NapiHelper.h"
|
|
#elif __APPLE__
|
|
#include "CToObjectC.h"
|
|
#include "pthread.h"
|
|
#elif _WIN32
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
std::string gRedistPath = "";
|
|
std::string gResourcePath = "";
|
|
#ifdef __APPLE__
|
|
std::string gAssetRootPath = "";
|
|
#endif
|
|
int g_nInnerWidth = 1024;
|
|
int g_nInnerHeight = 768;
|
|
bool g_bGLCanvasSizeChanged = false;
|
|
|
|
|
|
namespace laya
|
|
{
|
|
extern JCWorkerThread* g_DecThread;
|
|
JCConch* JCConch::s_pConch = NULL;
|
|
int64_t JCConch::s_nUpdateTime = 0;
|
|
JCFileSource* JCConch::s_pAssetsFiles = NULL;
|
|
std::shared_ptr<JCConchRender> JCConch::s_pConchRender;
|
|
void _vibrate()
|
|
{
|
|
#ifdef ANDROID
|
|
CToJavaBridge::JavaRet kRet;
|
|
CToJavaBridge::GetInstance()->callMethod(CToJavaBridge::JavaClass.c_str(), "vibrate", kRet);
|
|
#elif OHOS
|
|
NapiHelper::GetInstance()->startVibration(0.1f);
|
|
#endif
|
|
}
|
|
JCConch::JCConch(int nDownloadThreadNum, JS_DEBUG_MODE nJSDebugMode, int nJSDebugPort)
|
|
{
|
|
s_pConch = this;
|
|
#ifdef __APPLE__
|
|
pthread_key_create(&JCWorkerThread::s_tls_curThread, NULL);
|
|
pthread_key_create(&s_tls_curDataThread, NULL);
|
|
|
|
#ifdef JS_JSC
|
|
pthread_key_create(&__TlsData::s_tls_curThread, NULL);
|
|
pthread_key_create(&JSClassMgr::s_tls_curThread, NULL);
|
|
#endif
|
|
#elif _WIN32
|
|
HMODULE libHandle = LoadLibrary("libGLESv2.dll");
|
|
#elif ANDROID
|
|
//void *libhandle = dlopen("libGLESv2.so", RTLD_LAZY);
|
|
#endif
|
|
m_nUrlHistoryPos = -1;
|
|
m_sCachePath = gRedistPath + "appCache";
|
|
g_DecThread = new JCWorkerThread(true);
|
|
g_DecThread->setThreadName("image decode");
|
|
JCDownloadMgr* pdmgr = JCDownloadMgr::getInstance();
|
|
LOGI("download thread num = %d", nDownloadThreadNum);
|
|
pdmgr->init(nDownloadThreadNum);
|
|
m_pFileResMgr = new JCFileResManager(pdmgr);
|
|
JCWebGLPlus::getInstance()->init(g_kSystemConfig.m_nThreadMODE);
|
|
m_pScrpitRuntime = new JCScriptRuntime();
|
|
s_pConchRender.reset(new JCConchRender(m_pFileResMgr,JCWebGLPlus::getInstance()->m_pRArrayBufferManager,m_pScrpitRuntime->m_pRegister,JCWebGLPlus::getInstance()));
|
|
|
|
//------------------------------------------------------------------------------
|
|
//绑定函数
|
|
JCWebGLPlus* pWebGLPlus = JCWebGLPlus::getInstance();
|
|
JCLayaGL* pLayaGL = s_pConchRender->m_pLayaGL;
|
|
pWebGLPlus->uniform1f = std::bind(&JCLayaGL::uniform1f,pLayaGL, std::placeholders::_1, std::placeholders::_2);
|
|
pWebGLPlus->uniform1fv = std::bind(&JCLayaGL::uniform1fv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform1i = std::bind(&JCLayaGL::uniform1i, pLayaGL, std::placeholders::_1, std::placeholders::_2);
|
|
pWebGLPlus->uniform1iv = std::bind(&JCLayaGL::uniform1iv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform2f = std::bind(&JCLayaGL::uniform2f, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform2fv = std::bind(&JCLayaGL::uniform2fv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform2i = std::bind(&JCLayaGL::uniform2i, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform2iv = std::bind(&JCLayaGL::uniform2iv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform3f = std::bind(&JCLayaGL::uniform3f, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,std::placeholders::_4);
|
|
pWebGLPlus->uniform3fv = std::bind(&JCLayaGL::uniform3fv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform3i = std::bind(&JCLayaGL::uniform3i, pLayaGL,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3,std::placeholders::_4);
|
|
pWebGLPlus->uniform3iv = std::bind(&JCLayaGL::uniform3iv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform4f = std::bind(&JCLayaGL::uniform4f, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5);
|
|
pWebGLPlus->uniform4fv = std::bind(&JCLayaGL::uniform4fv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniform4i = std::bind(&JCLayaGL::uniform4i, pLayaGL,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5);
|
|
pWebGLPlus->uniform4iv = std::bind(&JCLayaGL::uniform4iv, pLayaGL, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
|
|
pWebGLPlus->uniformMatrix2fv = std::bind(&JCLayaGL::uniformMatrix2fv, pLayaGL,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);
|
|
pWebGLPlus->uniformMatrix3fv = std::bind(&JCLayaGL::uniformMatrix3fv, pLayaGL,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);
|
|
pWebGLPlus->uniformMatrix4fv = std::bind(&JCLayaGL::uniformMatrix4fv, pLayaGL,std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4);
|
|
pWebGLPlus->activeTexture = std::bind(&JCLayaGL::activeTexture, pLayaGL,std::placeholders::_1);
|
|
pWebGLPlus->bindTexture = std::bind(&JCLayaGL::bindTexture, pLayaGL,std::placeholders::_1, std::placeholders::_2);
|
|
//------------------------------------------------------------------------------
|
|
|
|
m_pAssetsRes = JCConch::s_pAssetsFiles;
|
|
s_pConchRender->setAssetRes(m_pAssetsRes);
|
|
m_strStartJS = "scripts/apploader.js";
|
|
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
|
|
{
|
|
m_pScrpitRuntime->init(m_pFileResMgr, m_pAssetsRes, &m_ThreadCmdMgr);
|
|
m_pFileResMgr->m_pCmdPoster = &m_ThreadCmdMgr;
|
|
}
|
|
else
|
|
{
|
|
m_pScrpitRuntime->init(m_pFileResMgr, m_pAssetsRes, m_pScrpitRuntime);
|
|
m_pFileResMgr->m_pCmdPoster = m_pScrpitRuntime;
|
|
}
|
|
m_nJSDebugMode = nJSDebugMode;
|
|
m_nJSDebugPort = nJSDebugPort;
|
|
#ifdef JS_V8_DEBUGGER
|
|
m_pDbgAgent = NULL;
|
|
if (m_nJSDebugMode != JS_DEBUG_MODE_OFF)
|
|
{
|
|
LOGI("open js debug port at %d", m_nJSDebugPort);
|
|
m_pDbgAgent = new DebuggerAgent("layabox", m_nJSDebugPort);
|
|
m_pScrpitRuntime->m_pDbgAgent = m_pDbgAgent;
|
|
}
|
|
else
|
|
{
|
|
m_pDbgAgent = NULL;
|
|
m_pScrpitRuntime->m_pDbgAgent = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
JCConch::~JCConch()
|
|
{
|
|
s_pConchRender.reset();
|
|
s_pConch = NULL;
|
|
if (m_pScrpitRuntime)
|
|
{
|
|
delete m_pScrpitRuntime;
|
|
m_pScrpitRuntime = NULL;
|
|
}
|
|
#ifdef JS_V8_DEBUGGER
|
|
if (m_pDbgAgent)
|
|
{
|
|
m_pDbgAgent->Shutdown();
|
|
delete m_pDbgAgent;
|
|
m_pDbgAgent = NULL;
|
|
}
|
|
#endif
|
|
}
|
|
void JCConch::onAppStart()
|
|
{
|
|
m_strLocalStoragePath = gRedistPath + "localstorage/";
|
|
try
|
|
{
|
|
fs::create_directories(m_strLocalStoragePath);
|
|
}
|
|
catch (...)
|
|
{
|
|
if (global_onCreateFileError)
|
|
{
|
|
global_onCreateFileError();
|
|
}
|
|
return;
|
|
}
|
|
#ifdef __APPLE__
|
|
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
|
|
{
|
|
m_ThreadCmdMgr.regThread(JCThreadCmdMgr::JS, m_pScrpitRuntime->m_pScriptThread->getWorker());
|
|
}
|
|
//因为iOS界面和渲染是一个线程,所以即使单线程也可以在这启动
|
|
m_pScrpitRuntime->start(m_strStartJS.c_str());
|
|
#else
|
|
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
|
|
{
|
|
m_ThreadCmdMgr.regThread(JCThreadCmdMgr::JS, m_pScrpitRuntime->m_pScriptThread->getWorker());
|
|
m_pScrpitRuntime->start(m_strStartJS.c_str());
|
|
}
|
|
#endif
|
|
}
|
|
void JCConch::reload()
|
|
{
|
|
LOGI("JCConch::reload start...");
|
|
//先通知消息管理器,关闭各个线程之间的post
|
|
m_ThreadCmdMgr.stop();
|
|
#ifdef __APPLE__
|
|
m_pScrpitRuntime->reload();
|
|
m_ThreadCmdMgr.start();
|
|
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
|
|
{
|
|
m_ThreadCmdMgr.regThread(JCThreadCmdMgr::JS, m_pScrpitRuntime->m_pScriptThread->getWorker());
|
|
}
|
|
#else
|
|
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
|
|
{
|
|
m_pScrpitRuntime->reload();
|
|
m_ThreadCmdMgr.start();
|
|
m_ThreadCmdMgr.regThread(JCThreadCmdMgr::JS, m_pScrpitRuntime->m_pScriptThread->getWorker());
|
|
}
|
|
else
|
|
{
|
|
m_pScrpitRuntime->m_bReload = true;
|
|
}
|
|
#endif
|
|
LOGI("JCConch::reload end.");
|
|
}
|
|
void JCConch::delAppRes()
|
|
{
|
|
}
|
|
void JCConch::onClearMemory()
|
|
{
|
|
}
|
|
void JCConch::onAppDestory()
|
|
{
|
|
//先通知消息管理器,关闭各个线程之间的post
|
|
m_ThreadCmdMgr.stop();
|
|
//渲染要继续
|
|
JCConch::s_pConchRender->willExit();
|
|
//关闭解码线程
|
|
delete g_DecThread;
|
|
//如果是单线程 在渲染线程析构了
|
|
if (g_kSystemConfig.m_nThreadMODE == THREAD_MODE_DOUBLE)
|
|
{
|
|
if (m_pScrpitRuntime)
|
|
{
|
|
delete m_pScrpitRuntime;
|
|
m_pScrpitRuntime = NULL;
|
|
}
|
|
}
|
|
//关闭下载线程
|
|
//删除所有的下载任务
|
|
JCDownloadMgr* pNetLoader = JCDownloadMgr::getInstance();
|
|
pNetLoader->stopCurTask();
|
|
pNetLoader->clearAllAsyncTask();
|
|
JCDownloadMgr::delInstance();
|
|
}
|
|
void JCConch::postCmdToMainThread(int nCmd, int nParam1, int nParam2)
|
|
{
|
|
#ifdef __APPLE__
|
|
CToObjectCPostMainThread(nCmd, nParam1, nParam2);
|
|
#else
|
|
m_funcPostMsgToMainThread(nCmd, nParam1, nParam2);
|
|
#endif
|
|
}
|
|
int JCConch::urlHistoryLength()
|
|
{
|
|
return m_vUrlHistory.size();
|
|
}
|
|
void JCConch::urlBack()
|
|
{
|
|
urlGo(-1);
|
|
}
|
|
void JCConch::urlGo(int s)
|
|
{
|
|
#ifdef __APPLE__
|
|
CToObjectCRunStopJSLoop();
|
|
#endif
|
|
int sz = m_vUrlHistory.size();
|
|
m_nUrlHistoryPos += s;
|
|
if (m_nUrlHistoryPos >= sz) m_nUrlHistoryPos = sz - 1;
|
|
if (m_nUrlHistoryPos < 0) m_nUrlHistoryPos = 0;
|
|
if ((size_t)m_nUrlHistoryPos < m_vUrlHistory.size())
|
|
{
|
|
g_kSystemConfig.m_strStartURL = m_vUrlHistory[m_nUrlHistoryPos];
|
|
}
|
|
postCmdToMainThread(CMD_ReloadProcess, 0, 0);
|
|
}
|
|
void JCConch::urlForward()
|
|
{
|
|
urlGo(1);
|
|
}
|
|
void JCConch::urlHistoryPush(const char* sUrl)
|
|
{
|
|
m_nUrlHistoryPos++; //位置
|
|
int nsz = m_nUrlHistoryPos+1; //希望的大小
|
|
m_vUrlHistory.resize(nsz);
|
|
m_vUrlHistory[m_nUrlHistoryPos] = sUrl;
|
|
int sz = m_vUrlHistory.size();
|
|
if (sz>1)
|
|
{
|
|
if (m_vUrlHistory[sz - 1] == m_vUrlHistory[sz - 2])
|
|
{
|
|
m_vUrlHistory.resize(sz - 1);
|
|
m_nUrlHistoryPos--;
|
|
}
|
|
}
|
|
}
|
|
void JCConch::onRunCmdInMainThread(int nCmd, int nParam1, int nParam2)
|
|
{
|
|
switch (nCmd)
|
|
{
|
|
case JCConch::CMD_ActiveProcess:
|
|
break;
|
|
case JCConch::CMD_DeactiveProcess:
|
|
break;
|
|
case JCConch::CMD_CloseProcess:
|
|
break;
|
|
case JCConch::CMD_ReloadProcess:
|
|
reload();
|
|
break;
|
|
case JCConch::CMD_UrlBack:
|
|
urlBack();
|
|
break;
|
|
case JCConch::CMD_UrlForward:
|
|
break;
|
|
case JCConch::CMD_onOrientationChanged:
|
|
break;
|
|
case CMD_ClearRender:
|
|
if(JCConch::s_pConchRender)
|
|
{
|
|
JCConch::s_pConchRender->clearAllData();
|
|
}
|
|
break;
|
|
case CMD_MgrStartThread:
|
|
m_ThreadCmdMgr.start();
|
|
break;
|
|
}
|
|
}
|
|
};
|
|
//------------------------------------------------------------------------------
|
|
|
|
|
|
//-----------------------------END FILE--------------------------------
|