Skip to content

Commit 21fde64

Browse files
committed
feat: Add material.getShadowMaterial to allow users to customize shadow material
1 parent 8075db3 commit 21fde64

File tree

2 files changed

+30
-6
lines changed

2 files changed

+30
-6
lines changed

src/light/LightShadow.js

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -208,22 +208,28 @@ const LightShadow = Class.create(/** @lends LightShadow.prototype */{
208208
renderer.clear(clearColor);
209209
camera.updateViewProjectionMatrix();
210210
semantic.setCamera(camera);
211-
renderer.forceMaterial = shadowMaterial;
212-
this.renderShadowScene(renderer);
213-
delete renderer.forceMaterial;
211+
this.renderShadowScene(renderer, shadowMaterial);
214212
framebuffer.unbind();
215213
semantic.setCamera(currentCamera);
216214
renderer.viewport();
217215
},
218-
renderShadowScene(renderer) {
216+
renderShadowScene(renderer, shadowMaterial) {
217+
const preForceMaterial = renderer.forceMaterial;
218+
219219
const renderList = renderer.renderList;
220220
renderList.traverse((mesh) => {
221221
if (isNeedRenderMesh(mesh)) {
222+
renderer.forceMaterial = mesh.material.getShadowMaterial(shadowMaterial);
222223
renderer.renderMesh(mesh);
223224
}
224225
}, (instancedMeshes) => {
225-
renderer.renderInstancedMeshes(instancedMeshes.filter(mesh => isNeedRenderMesh(mesh)));
226+
if (instancedMeshes.length) {
227+
renderer.forceMaterial = instancedMeshes[0].material.getShadowMaterial(shadowMaterial);
228+
renderer.renderInstancedMeshes(instancedMeshes.filter(mesh => isNeedRenderMesh(mesh)));
229+
}
226230
});
231+
232+
renderer.forceMaterial = preForceMaterial;
227233
},
228234
showShadowMap() {
229235
this.renderer.on('afterRender', () => {

src/material/Material.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -901,7 +901,25 @@ const Material = Class.create(/** @lends Material.prototype */ {
901901
origin[key] = data[key];
902902
}
903903
}
904-
}
904+
},
905+
906+
/**
907+
* 获取阴影材质,子类可重写
908+
* @param {Material} shadowMaterial 通用阴影材质
909+
* @return {Material}
910+
*/
911+
getShadowMaterial(shadowMaterial) {
912+
if (shadowMaterial.side !== this.side) {
913+
shadowMaterial.side = this.side;
914+
shadowMaterial.isDirty = true;
915+
}
916+
917+
if (shadowMaterial.frontFace !== this.frontFace) {
918+
shadowMaterial.frontFace = this.frontFace;
919+
shadowMaterial.isDirty = true;
920+
}
921+
return shadowMaterial;
922+
},
905923
});
906924

907925
export default Material;

0 commit comments

Comments
 (0)