Initial commit: Client Doc docs Server Tools
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
|
||||
let cachedOpenDataContext;
|
||||
let cachedSharedCanvas;
|
||||
|
||||
function getOpenDataContext() {
|
||||
return cachedOpenDataContext || wx.getOpenDataContext();
|
||||
}
|
||||
|
||||
function getSharedCanvas() {
|
||||
return cachedSharedCanvas || getOpenDataContext().canvas;
|
||||
}
|
||||
let timerId;
|
||||
let textureObject = null;
|
||||
let textureId;
|
||||
|
||||
function hookUnityRender() {
|
||||
if (!textureId) {
|
||||
return;
|
||||
}
|
||||
const { GL } = GameGlobal.manager.gameInstance.Module;
|
||||
const gl = GL.currentContext.GLctx;
|
||||
if (!textureObject) {
|
||||
textureObject = gl.createTexture();
|
||||
gl.bindTexture(gl.TEXTURE_2D, textureObject);
|
||||
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, getSharedCanvas());
|
||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR);
|
||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);
|
||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);
|
||||
gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);
|
||||
}
|
||||
else {
|
||||
|
||||
gl.bindTexture(gl.TEXTURE_2D, textureObject);
|
||||
gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, getSharedCanvas());
|
||||
}
|
||||
GL.textures[textureId] = textureObject;
|
||||
timerId = requestAnimationFrame(hookUnityRender);
|
||||
}
|
||||
|
||||
function stopLastRenderLoop() {
|
||||
|
||||
if (typeof timerId !== 'undefined') {
|
||||
cancelAnimationFrame(timerId);
|
||||
}
|
||||
}
|
||||
function startHookUnityRender() {
|
||||
stopLastRenderLoop();
|
||||
hookUnityRender();
|
||||
}
|
||||
function stopHookUnityRender() {
|
||||
stopLastRenderLoop();
|
||||
|
||||
const sharedCanvas = getSharedCanvas();
|
||||
sharedCanvas.width = 1;
|
||||
sharedCanvas.height = 1;
|
||||
|
||||
const { GL } = GameGlobal.manager.gameInstance.Module;
|
||||
const gl = GL.currentContext.GLctx;
|
||||
gl.deleteTexture(textureObject);
|
||||
textureObject = null;
|
||||
}
|
||||
export default {
|
||||
WXDataContextPostMessage(msg) {
|
||||
getOpenDataContext().postMessage(msg);
|
||||
},
|
||||
WXShowOpenData(id, x, y, width, height) {
|
||||
if (width <= 0 || height <= 0) {
|
||||
console.error('[unity-sdk]: WXShowOpenData要求 width 和 height 参数必须大于0');
|
||||
}
|
||||
|
||||
const openDataContext = getOpenDataContext();
|
||||
const sharedCanvas = openDataContext.canvas;
|
||||
sharedCanvas.width = width;
|
||||
sharedCanvas.height = height;
|
||||
openDataContext.postMessage({
|
||||
type: 'WXRender',
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
height,
|
||||
devicePixelRatio: window.devicePixelRatio,
|
||||
});
|
||||
textureId = id;
|
||||
startHookUnityRender();
|
||||
},
|
||||
WXHideOpenData() {
|
||||
getOpenDataContext().postMessage({
|
||||
type: 'WXDestroy',
|
||||
});
|
||||
stopHookUnityRender();
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user