Skip to content

Commit e5d6bca

Browse files
authored
[Fix] Supporting pass specific mesh-instance parameters as they are used by the Editor (playcanvas#2411)
1 parent e129194 commit e5d6bca

File tree

2 files changed

+18
-8
lines changed

2 files changed

+18
-8
lines changed

src/scene/forward-renderer.js

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1334,6 +1334,7 @@ Object.assign(ForwardRenderer.prototype, {
13341334
var style;
13351335
var settings;
13361336
var visibleList, visibleLength;
1337+
var passFlag = 1 << SHADER_SHADOW;
13371338

13381339
for (i = 0; i < lights.length; i++) {
13391340
light = lights[i];
@@ -1475,7 +1476,7 @@ Object.assign(ForwardRenderer.prototype, {
14751476
material.setParameters(device);
14761477

14771478
// Uniforms II (shadow): meshInstance overrides
1478-
meshInstance.setParameters(device);
1479+
meshInstance.setParameters(device, passFlag);
14791480
}
14801481

14811482
// set shader
@@ -1674,6 +1675,8 @@ Object.assign(ForwardRenderer.prototype, {
16741675
var vrDisplay = camera.vrDisplay;
16751676
var lightHash = layer ? layer._lightHash : 0;
16761677

1678+
var passFlag = 1 << pass;
1679+
16771680
// #ifdef PROFILER
16781681
var forwardStartTime = now();
16791682
// #endif
@@ -1822,7 +1825,7 @@ Object.assign(ForwardRenderer.prototype, {
18221825
}
18231826

18241827
// Uniforms II: meshInstance overrides
1825-
drawCall.setParameters(device);
1828+
drawCall.setParameters(device, passFlag);
18261829

18271830
this.setVertexBuffers(device, mesh);
18281831
this.setMorphing(device, drawCall.morphInstance);

src/scene/mesh-instance.js

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -457,8 +457,11 @@ Object.assign(MeshInstance.prototype, {
457457
* if set on Material this mesh instance uses for rendering.
458458
* @param {string} name - The name of the parameter to set.
459459
* @param {number|number[]|pc.Texture} data - The value for the specified parameter.
460+
* @param {number} [passFlags] - Mask describing which passes the material should be included in.
460461
*/
461-
setParameter: function (name, data) {
462+
setParameter: function (name, data, passFlags) {
463+
464+
if (passFlags === undefined) passFlags = -524285; // All bits set except 2 - 18 range
462465

463466
if (data === undefined && typeof name === 'object') {
464467
var uniformObject = name;
@@ -475,10 +478,12 @@ Object.assign(MeshInstance.prototype, {
475478
var param = this.parameters[name];
476479
if (param) {
477480
param.data = data;
481+
param.passFlags = passFlags;
478482
} else {
479483
this.parameters[name] = {
480484
scopeId: null,
481-
data: data
485+
data: data,
486+
passFlags: passFlags
482487
};
483488
}
484489
},
@@ -496,14 +501,16 @@ Object.assign(MeshInstance.prototype, {
496501
},
497502

498503
// used to apply parameters from this mesh instance into scope of uniforms, called internally by forward-renderer
499-
setParameters: function (device) {
504+
setParameters: function (device, passFlag) {
500505
var parameter, parameters = this.parameters;
501506
for (var paramName in parameters) {
502507
parameter = parameters[paramName];
503-
if (!parameter.scopeId) {
504-
parameter.scopeId = device.scope.resolve(paramName);
508+
if (parameter.passFlags & passFlag) {
509+
if (!parameter.scopeId) {
510+
parameter.scopeId = device.scope.resolve(paramName);
511+
}
512+
parameter.scopeId.setValue(parameter.data);
505513
}
506-
parameter.scopeId.setValue(parameter.data);
507514
}
508515
}
509516
});

0 commit comments

Comments
 (0)