diff --git a/WebGL/Build/WebGL.data b/WebGL/Build/WebGL.data index 206a0c8..c32267e 100644 Binary files a/WebGL/Build/WebGL.data and b/WebGL/Build/WebGL.data differ diff --git a/WebGL/Build/WebGL.framework.js b/WebGL/Build/WebGL.framework.js index db6b538..ec0a63a 100644 --- a/WebGL/Build/WebGL.framework.js +++ b/WebGL/Build/WebGL.framework.js @@ -1159,26 +1159,26 @@ var tempDouble; var tempI64; var ASM_CONSTS = { - 4093944: function() { + 4107288: function() { Module["emscripten_get_now_backup"] = performance.now; }, - 4093999: function($0) { + 4107343: function($0) { performance.now = function() { return $0; }; }, - 4094047: function($0) { + 4107391: function($0) { performance.now = function() { return $0; }; }, - 4094095: function() { + 4107439: function() { performance.now = Module["emscripten_get_now_backup"]; }, - 4094150: function() { + 4107494: function() { return Module.webglContextAttributes.premultipliedAlpha; }, - 4094211: function() { + 4107555: function() { return Module.webglContextAttributes.preserveDrawingBuffer; } }; @@ -2711,6 +2711,252 @@ function _JS_UnityEngineShouldQuit() { return !!Module.shouldQuit; } +var videoInstances = {}; + +var jsSupportedVideoFormats = []; + +var jsUnsupportedVideoFormats = []; + +function _JS_Video_CanPlayFormat(format) { + format = UTF8ToString(format); + if (jsSupportedVideoFormats.indexOf(format) != -1) return true; + if (jsUnsupportedVideoFormats.indexOf(format) != -1) return false; + var video = document.createElement("video"); + var canPlay = video.canPlayType(format); + if (canPlay) jsSupportedVideoFormats.push(format); else jsUnsupportedVideoFormats.push(format); + return !!canPlay; +} + +var videoInstanceIdCounter = 0; + +function jsVideoEnded() { + if (this.onendedCallback) { + dynCall_vi(this.onendedCallback, this.onendedRef); + } +} + +var hasSRGBATextures = null; + +function _JS_Video_Create(url) { + var str = UTF8ToString(url); + var video = document.createElement("video"); + video.style.display = "none"; + video.src = str; + video.muted = true; + video.setAttribute("muted", ""); + video.setAttribute("playsinline", ""); + video.crossOrigin = "anonymous"; + videoInstances[++videoInstanceIdCounter] = video; + if (hasSRGBATextures == null) hasSRGBATextures = Module.SystemInfo.browser == "Chrome" || Module.SystemInfo.browser == "Edge"; + return videoInstanceIdCounter; +} + +var jsVideoPendingBlockedVideos = {}; + +function jsVideoPlayPendingBlockedVideo(video) { + jsVideoPendingBlockedVideos[video].play().then(function() { + jsVideoRemovePendingBlockedVideo(video); + }); +} + +function jsVideoAttemptToPlayBlockedVideos() { + for (var i in jsVideoPendingBlockedVideos) { + if (jsVideoPendingBlockedVideos.hasOwnProperty(i)) jsVideoPlayPendingBlockedVideo(i); + } +} + +function jsVideoRemovePendingBlockedVideo(video) { + delete jsVideoPendingBlockedVideos[video]; + if (Object.keys(jsVideoPendingBlockedVideos).length == 0) { + window.removeEventListener("mousedown", jsVideoAttemptToPlayBlockedVideos); + } +} + +function _JS_Video_Destroy(video) { + var v = videoInstances[video]; + if (v.loopEndPollInterval) { + clearInterval(v.loopEndPollInterval); + } + jsVideoRemovePendingBlockedVideo(video); + v.src = ""; + delete v.onendedCallback; + v.onended = v.onerror = v.oncanplay = v.onseeked = null; + delete videoInstances[video]; +} + +function _JS_Video_Duration(video) { + return videoInstances[video].duration; +} + +function _JS_Video_EnableAudioTrack(video, trackIndex, enabled) { + var v = videoInstances[video]; + if (!v.enabledTracks) v.enabledTracks = []; + while (v.enabledTracks.length <= trackIndex) v.enabledTracks.push(true); + v.enabledTracks[trackIndex] = enabled; + var tracks = v.audioTracks; + if (!tracks) return; + var track = tracks[trackIndex]; + if (track) track.enabled = enabled ? true : false; +} + +function _JS_Video_GetAudioLanguageCode(video, trackIndex) { + var tracks = videoInstances[video].audioTracks; + if (!tracks) return ""; + var track = tracks[trackIndex]; + return track ? track.language : ""; +} + +function _JS_Video_GetNumAudioTracks(video) { + var tracks = videoInstances[video].audioTracks; + return tracks ? tracks.length : 1; +} + +function _JS_Video_Height(video) { + return videoInstances[video].videoHeight; +} + +function _JS_Video_IsPlaying(video) { + var v = videoInstances[video]; + return !v.paused && !v.ended; +} + +function _JS_Video_IsReady(video) { + var v = videoInstances[video]; + var targetReadyState = /(iPhone|iPad)/i.test(navigator.userAgent) ? v.HAVE_METADATA : v.HAVE_ENOUGH_DATA; + if (!v.isReady && v.readyState >= targetReadyState) v.isReady = true; + return v.isReady; +} + +function _JS_Video_Pause(video) { + var v = videoInstances[video]; + v.pause(); + jsVideoRemovePendingBlockedVideo(video); + if (v.loopEndPollInterval) { + clearInterval(v.loopEndPollInterval); + } +} + +function _JS_Video_SetLoop(video, loop) { + var v = videoInstances[video]; + if (v.loopEndPollInterval) { + clearInterval(v.loopEndPollInterval); + } + v.loop = loop; + if (loop) { + v.loopEndPollInterval = setInterval(function() { + if (v.currentTime < v.lastSeenPlaybackTime) { + jsVideoEnded.apply(v); + } + v.lastSeenPlaybackTime = v.currentTime; + }, 1e3 / 30); + v.lastSeenPlaybackTime = v.currentTime; + v.onended = null; + } else { + v.onended = jsVideoEnded; + } +} + +function jsVideoAllAudioTracksAreDisabled(v) { + if (!v.enabledTracks) return false; + for (var i = 0; i < v.enabledTracks.length; ++i) { + if (v.enabledTracks[i]) return false; + } + return true; +} + +function jsVideoAddPendingBlockedVideo(video, v) { + if (Object.keys(jsVideoPendingBlockedVideos).length == 0) window.addEventListener("mousedown", jsVideoAttemptToPlayBlockedVideos); + jsVideoPendingBlockedVideos[video] = v; +} + +function _JS_Video_Play(video, muted) { + var v = videoInstances[video]; + v.muted = muted || jsVideoAllAudioTracksAreDisabled(v); + var promise = v.play(); + if (promise) promise.catch(function(e) { + if (e.name == "NotAllowedError") jsVideoAddPendingBlockedVideo(video, v); + }); + _JS_Video_SetLoop(video, v.loop); +} + +function _JS_Video_Seek(video, time) { + var v = videoInstances[video]; + v.lastSeenPlaybackTime = v.currentTime = time; +} + +function _JS_Video_SetEndedHandler(video, ref, onended) { + var v = videoInstances[video]; + v.onendedCallback = onended; + v.onendedRef = ref; +} + +function _JS_Video_SetErrorHandler(video, ref, onerror) { + videoInstances[video].onerror = function(evt) { + dynCall_vii(onerror, ref, evt.target.error.code); + }; +} + +function _JS_Video_SetMute(video, muted) { + var v = videoInstances[video]; + v.muted = muted || jsVideoAllAudioTracksAreDisabled(v); +} + +function _JS_Video_SetPlaybackRate(video, rate) { + videoInstances[video].playbackRate = rate; +} + +function _JS_Video_SetReadyHandler(video, ref, onready) { + videoInstances[video].oncanplay = function() { + dynCall_vi(onready, ref); + }; +} + +function _JS_Video_SetSeekedOnceHandler(video, ref, onseeked) { + videoInstances[video].onseeked = function() { + dynCall_vi(onseeked, ref); + }; +} + +function _JS_Video_SetVolume(video, volume) { + videoInstances[video].volume = volume; +} + +function _JS_Video_Time(video) { + return videoInstances[video].currentTime; +} + +function _JS_Video_UpdateToTexture(video, tex, adjustToLinearspace) { + var v = videoInstances[video]; + if (!(v.videoWidth > 0 && v.videoHeight > 0)) return false; + if (v.lastUpdateTextureTime === v.currentTime) return false; + v.lastUpdateTextureTime = v.currentTime; + GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, true); + var internalFormat = adjustToLinearspace ? hasSRGBATextures ? GLctx.SRGB8_ALPHA8 : GLctx.SRGB8 : GLctx.RGBA; + var format = adjustToLinearspace ? hasSRGBATextures ? GLctx.RGBA : GLctx.RGB : GLctx.RGBA; + if (v.previousUploadedWidth != v.videoWidth || v.previousUploadedHeight != v.videoHeight) { + GLctx.deleteTexture(GL.textures[tex]); + var t = GLctx.createTexture(); + t.name = tex; + GL.textures[tex] = t; + GLctx.bindTexture(GLctx.TEXTURE_2D, t); + GLctx.texParameteri(GLctx.TEXTURE_2D, GLctx.TEXTURE_WRAP_S, GLctx.CLAMP_TO_EDGE); + GLctx.texParameteri(GLctx.TEXTURE_2D, GLctx.TEXTURE_WRAP_T, GLctx.CLAMP_TO_EDGE); + GLctx.texParameteri(GLctx.TEXTURE_2D, GLctx.TEXTURE_MIN_FILTER, GLctx.LINEAR); + GLctx.texImage2D(GLctx.TEXTURE_2D, 0, internalFormat, format, GLctx.UNSIGNED_BYTE, v); + v.previousUploadedWidth = v.videoWidth; + v.previousUploadedHeight = v.videoHeight; + } else { + GLctx.bindTexture(GLctx.TEXTURE_2D, GL.textures[tex]); + GLctx.texImage2D(GLctx.TEXTURE_2D, 0, internalFormat, format, GLctx.UNSIGNED_BYTE, v); + } + GLctx.pixelStorei(GLctx.UNPACK_FLIP_Y_WEBGL, false); + return true; +} + +function _JS_Video_Width(video) { + return videoInstances[video].videoWidth; +} + var wr = { requests: {}, responses: {}, @@ -13358,6 +13604,30 @@ var asmLibraryArg = { "JS_SystemInfo_HasWebGL": _JS_SystemInfo_HasWebGL, "JS_SystemInfo_IsMobile": _JS_SystemInfo_IsMobile, "JS_UnityEngineShouldQuit": _JS_UnityEngineShouldQuit, + "JS_Video_CanPlayFormat": _JS_Video_CanPlayFormat, + "JS_Video_Create": _JS_Video_Create, + "JS_Video_Destroy": _JS_Video_Destroy, + "JS_Video_Duration": _JS_Video_Duration, + "JS_Video_EnableAudioTrack": _JS_Video_EnableAudioTrack, + "JS_Video_GetAudioLanguageCode": _JS_Video_GetAudioLanguageCode, + "JS_Video_GetNumAudioTracks": _JS_Video_GetNumAudioTracks, + "JS_Video_Height": _JS_Video_Height, + "JS_Video_IsPlaying": _JS_Video_IsPlaying, + "JS_Video_IsReady": _JS_Video_IsReady, + "JS_Video_Pause": _JS_Video_Pause, + "JS_Video_Play": _JS_Video_Play, + "JS_Video_Seek": _JS_Video_Seek, + "JS_Video_SetEndedHandler": _JS_Video_SetEndedHandler, + "JS_Video_SetErrorHandler": _JS_Video_SetErrorHandler, + "JS_Video_SetLoop": _JS_Video_SetLoop, + "JS_Video_SetMute": _JS_Video_SetMute, + "JS_Video_SetPlaybackRate": _JS_Video_SetPlaybackRate, + "JS_Video_SetReadyHandler": _JS_Video_SetReadyHandler, + "JS_Video_SetSeekedOnceHandler": _JS_Video_SetSeekedOnceHandler, + "JS_Video_SetVolume": _JS_Video_SetVolume, + "JS_Video_Time": _JS_Video_Time, + "JS_Video_UpdateToTexture": _JS_Video_UpdateToTexture, + "JS_Video_Width": _JS_Video_Width, "JS_WebRequest_Abort": _JS_WebRequest_Abort, "JS_WebRequest_Create": _JS_WebRequest_Create, "JS_WebRequest_GetResponseMetaData": _JS_WebRequest_GetResponseMetaData, @@ -14266,6 +14536,8 @@ var dynCall_fiifii = Module["dynCall_fiifii"] = createExportWrapper("dynCall_fii var dynCall_iifffi = Module["dynCall_iifffi"] = createExportWrapper("dynCall_iifffi"); +var dynCall_viidi = Module["dynCall_viidi"] = createExportWrapper("dynCall_viidi"); + var dynCall_viiidii = Module["dynCall_viiidii"] = createExportWrapper("dynCall_viiidii"); var dynCall_ijiiiiiiiii = Module["dynCall_ijiiiiiiiii"] = createExportWrapper("dynCall_ijiiiiiiiii"); @@ -14306,8 +14578,6 @@ var dynCall_fdi = Module["dynCall_fdi"] = createExportWrapper("dynCall_fdi"); var dynCall_jjiiii = Module["dynCall_jjiiii"] = createExportWrapper("dynCall_jjiiii"); -var dynCall_viidi = Module["dynCall_viidi"] = createExportWrapper("dynCall_viidi"); - var dynCall_ddi = Module["dynCall_ddi"] = createExportWrapper("dynCall_ddi"); var dynCall_vidiii = Module["dynCall_vidiii"] = createExportWrapper("dynCall_vidiii"); @@ -14676,6 +14946,8 @@ var dynCall_iiiiiifffiiifiii = Module["dynCall_iiiiiifffiiifiii"] = createExport var dynCall_fiiiif = Module["dynCall_fiiiif"] = createExportWrapper("dynCall_fiiiif"); +var dynCall_vidd = Module["dynCall_vidd"] = createExportWrapper("dynCall_vidd"); + var dynCall_iiiiiff = Module["dynCall_iiiiiff"] = createExportWrapper("dynCall_iiiiiff"); var dynCall_viid = Module["dynCall_viid"] = createExportWrapper("dynCall_viid"); diff --git a/WebGL/Build/WebGL.wasm b/WebGL/Build/WebGL.wasm index a820dad..a64460b 100644 Binary files a/WebGL/Build/WebGL.wasm and b/WebGL/Build/WebGL.wasm differ