Skip to content

Commit 0f86c2f

Browse files
authored
RenderWebGL -- viewport checks
1 parent c0b93cf commit 0f86c2f

File tree

1 file changed

+31
-6
lines changed

1 file changed

+31
-6
lines changed

src/RenderWebGL.js

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ const TextCostumeSkin = require('./TextCostumeSkin');
1717
const EffectTransform = require('./EffectTransform');
1818
const CanvasMeasurementProvider = require('./util/canvas-measurement-provider');
1919
const log = require('./util/log');
20+
const runtime = window.vm.runtime; // Quite lengthy to do it this way, but oh well.
2021

2122
const __isTouchingDrawablesPoint = twgl.v3.create();
2223
const __candidatesBounds = new Rectangle();
@@ -2260,6 +2261,9 @@ class RenderWebGL extends EventEmitter {
22602261
const gl = this._gl;
22612262
let currentShader = null;
22622263

2264+
const halfNativeSizeX = this._nativeSize[0] / 2;
2265+
const halfNativeSizeY = this._nativeSize[1] / 2;
2266+
22632267
const framebufferSpaceScaleDiffers = (
22642268
'framebufferWidth' in opts && 'framebufferHeight' in opts &&
22652269
opts.framebufferWidth !== this._nativeSize[0] && opts.framebufferHeight !== this._nativeSize[1]
@@ -2273,7 +2277,26 @@ class RenderWebGL extends EventEmitter {
22732277
if (opts.filter && !opts.filter(drawableID)) continue;
22742278

22752279
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+
}
22772300

22782301
// Hidden drawables (e.g., by a "hide" block) are not drawn unless
22792302
// the ignoreVisibility flag is used (e.g. for stamping or touchingColor).
@@ -2294,8 +2317,6 @@ class RenderWebGL extends EventEmitter {
22942317
// Skip private skins, if requested.
22952318
if (opts.skipPrivateSkins && drawable.skin.private) continue;
22962319

2297-
const uniforms = {};
2298-
22992320
let effectBits = drawable.enabledEffects;
23002321
effectBits &= Object.prototype.hasOwnProperty.call(opts, 'effectMask') ? opts.effectMask : effectBits;
23012322
const newShader = this._shaderManager.getShader(drawMode, effectBits);
@@ -2314,9 +2335,13 @@ class RenderWebGL extends EventEmitter {
23142335
});
23152336
}
23162337

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+
}
23202345

23212346
// Apply extra uniforms after the Drawable's, to allow overwriting.
23222347
if (opts.extraUniforms) {

0 commit comments

Comments
 (0)