@@ -17,6 +17,7 @@ const TextCostumeSkin = require('./TextCostumeSkin');
17
17
const EffectTransform = require ( './EffectTransform' ) ;
18
18
const CanvasMeasurementProvider = require ( './util/canvas-measurement-provider' ) ;
19
19
const log = require ( './util/log' ) ;
20
+ const runtime = window . vm . runtime ; // Quite lengthy to do it this way, but oh well.
20
21
21
22
const __isTouchingDrawablesPoint = twgl . v3 . create ( ) ;
22
23
const __candidatesBounds = new Rectangle ( ) ;
@@ -2260,6 +2261,9 @@ class RenderWebGL extends EventEmitter {
2260
2261
const gl = this . _gl ;
2261
2262
let currentShader = null ;
2262
2263
2264
+ const halfNativeSizeX = this . _nativeSize [ 0 ] / 2 ;
2265
+ const halfNativeSizeY = this . _nativeSize [ 1 ] / 2 ;
2266
+
2263
2267
const framebufferSpaceScaleDiffers = (
2264
2268
'framebufferWidth' in opts && 'framebufferHeight' in opts &&
2265
2269
opts . framebufferWidth !== this . _nativeSize [ 0 ] && opts . framebufferHeight !== this . _nativeSize [ 1 ]
@@ -2273,7 +2277,26 @@ class RenderWebGL extends EventEmitter {
2273
2277
if ( opts . filter && ! opts . filter ( drawableID ) ) continue ;
2274
2278
2275
2279
const drawable = this . _allDrawables [ drawableID ] ;
2276
- /** @todo check if drawable is inside the viewport before anything else */
2280
+
2281
+ const uniforms = { } ;
2282
+ const renderOffscreen = runtime . runtimeOptions . oobRendering ;
2283
+ if ( ! renderOffscreen ) {
2284
+ if ( drawMode === ShaderManager . DRAW_MODE . default && drawable . skin ) {
2285
+ // If rotationCenterDirty or skinScaleDirty is dirty, then set _calculateTransform first
2286
+ // because _rotationAdjusted and _skinScale needs to call _calculateTransform before using
2287
+ let uniformHasBeenSet = false ;
2288
+ if ( drawable . transformBeforeCheckViewport ( ) ) {
2289
+ Object . assign ( uniforms , drawable . getUniforms ( ) ) ;
2290
+ uniformHasBeenSet = true ;
2291
+ }
2292
+
2293
+ if ( ! drawable . inViewport ( halfNativeSizeX , halfNativeSizeY ) ) continue ;
2294
+ // If unconfirm was not set before
2295
+ if ( ! uniformHasBeenSet ) Object . assign ( uniforms , drawable . getUniforms ( ) ) ;
2296
+ } else {
2297
+ Object . assign ( uniforms , drawable . getUniforms ( ) ) ;
2298
+ }
2299
+ }
2277
2300
2278
2301
// Hidden drawables (e.g., by a "hide" block) are not drawn unless
2279
2302
// the ignoreVisibility flag is used (e.g. for stamping or touchingColor).
@@ -2294,8 +2317,6 @@ class RenderWebGL extends EventEmitter {
2294
2317
// Skip private skins, if requested.
2295
2318
if ( opts . skipPrivateSkins && drawable . skin . private ) continue ;
2296
2319
2297
- const uniforms = { } ;
2298
-
2299
2320
let effectBits = drawable . enabledEffects ;
2300
2321
effectBits &= Object . prototype . hasOwnProperty . call ( opts , 'effectMask' ) ? opts . effectMask : effectBits ;
2301
2322
const newShader = this . _shaderManager . getShader ( drawMode , effectBits ) ;
@@ -2314,9 +2335,13 @@ class RenderWebGL extends EventEmitter {
2314
2335
} ) ;
2315
2336
}
2316
2337
2317
- Object . assign ( uniforms ,
2318
- drawable . skin . getUniforms ( drawableScale ) ,
2319
- drawable . getUniforms ( ) ) ;
2338
+ if ( renderOffscreen ) {
2339
+ Object . assign ( uniforms ,
2340
+ drawable . skin . getUniforms ( drawableScale ) ,
2341
+ drawable . getUniforms ( ) ) ;
2342
+ } else {
2343
+ Object . assign ( uniforms , drawable . getUniforms ( ) ) ;
2344
+ }
2320
2345
2321
2346
// Apply extra uniforms after the Drawable's, to allow overwriting.
2322
2347
if ( opts . extraUniforms ) {
0 commit comments