Skip to content

Commit 6185bfb

Browse files
authored
Fix material clone name (#2576)
* fix: material name clone bug
1 parent 2cd5b85 commit 6185bfb

13 files changed

+29
-15
lines changed

packages/core/src/Entity.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,7 @@ export class Entity extends EngineObject {
251251
*/
252252
constructor(engine: Engine, name?: string, ...components: ComponentConstructor[]) {
253253
super(engine);
254-
this.name = name ?? "New Entity";
254+
this.name = name ?? "Entity";
255255
for (let i = 0, n = components.length; i < n; i++) {
256256
this.addComponent(components[i]);
257257
}

packages/core/src/Renderer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -486,7 +486,7 @@ export class Renderer extends Component implements IComponentCustomClone {
486486

487487
private _createInstanceMaterial(material: Material, index: number): Material {
488488
const insMaterial: Material = material.clone();
489-
insMaterial.name = insMaterial.name + "(Instance)";
489+
insMaterial.name = material.name + "(Instance)";
490490
this._addResourceReferCount(material, -1);
491491
this._addResourceReferCount(insMaterial, 1);
492492
this._materialsInstanced[index] = true;

packages/core/src/material/BaseMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -220,7 +220,7 @@ export class BaseMaterial extends Material {
220220
*/
221221
override clone(): BaseMaterial {
222222
const dest = new BaseMaterial(this._engine, this.shader);
223-
this.cloneTo(dest);
223+
this._cloneToAndModifyName(dest);
224224
return dest;
225225
}
226226

packages/core/src/material/BlinnPhongMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -177,7 +177,7 @@ export class BlinnPhongMaterial extends BaseMaterial {
177177

178178
override clone(): BlinnPhongMaterial {
179179
var dest: BlinnPhongMaterial = new BlinnPhongMaterial(this._engine);
180-
this.cloneTo(dest);
180+
this._cloneToAndModifyName(dest);
181181
return dest;
182182
}
183183
}

packages/core/src/material/Material.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -84,14 +84,15 @@ export class Material extends ReferResource implements IClone {
8484
constructor(engine: Engine, shader: Shader) {
8585
super(engine);
8686
this.shader = shader;
87+
this.name = shader.name;
8788
}
8889

8990
/**
9091
* Clone and return the instance.
9192
*/
9293
clone(): Material {
9394
const dest = new Material(this._engine, this.shader);
94-
this.cloneTo(dest);
95+
this._cloneToAndModifyName(dest);
9596
return dest;
9697
}
9798

@@ -112,6 +113,11 @@ export class Material extends ReferResource implements IClone {
112113
this._shader._addReferCount(value);
113114
}
114115

116+
protected _cloneToAndModifyName(target: Material): void {
117+
this.cloneTo(target);
118+
target.name = this.name + "(Clone)";
119+
}
120+
115121
/**
116122
* @override
117123
*/

packages/core/src/material/PBRMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -484,7 +484,7 @@ export class PBRMaterial extends PBRBaseMaterial {
484484
*/
485485
override clone(): PBRMaterial {
486486
const dest = new PBRMaterial(this._engine);
487-
this.cloneTo(dest);
487+
this._cloneToAndModifyName(dest);
488488
return dest;
489489
}
490490

packages/core/src/material/PBRSpecularMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ export class PBRSpecularMaterial extends PBRBaseMaterial {
7575
*/
7676
override clone(): PBRSpecularMaterial {
7777
const dest = new PBRSpecularMaterial(this._engine);
78-
this.cloneTo(dest);
78+
this._cloneToAndModifyName(dest);
7979
return dest;
8080
}
8181
}

packages/core/src/material/UnlitMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ export class UnlitMaterial extends BaseMaterial {
7373
*/
7474
override clone(): UnlitMaterial {
7575
const dest = new UnlitMaterial(this._engine);
76-
this.cloneTo(dest);
76+
this._cloneToAndModifyName(dest);
7777
return dest;
7878
}
7979
}

packages/core/src/particle/ParticleMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ export class ParticleMaterial extends BaseMaterial {
5656
*/
5757
override clone(): ParticleMaterial {
5858
const dest = new ParticleMaterial(this._engine);
59-
this.cloneTo(dest);
59+
this._cloneToAndModifyName(dest);
6060
return dest;
6161
}
6262
}

packages/core/src/sky/SkyBoxMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ export class SkyBoxMaterial extends Material {
9696

9797
override clone(): SkyBoxMaterial {
9898
const dest = new SkyBoxMaterial(this._engine);
99-
this.cloneTo(dest);
99+
this._cloneToAndModifyName(dest);
100100
return dest;
101101
}
102102
}

packages/core/src/sky/SkyProceduralMaterial.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ export class SkyProceduralMaterial extends Material {
149149
*/
150150
override clone(): SkyProceduralMaterial {
151151
const dest = new SkyProceduralMaterial(this._engine);
152-
this.cloneTo(dest);
152+
this._cloneToAndModifyName(dest);
153153
return dest;
154154
}
155155
}

tests/src/core/MeshRenderer.test.ts

+4-4
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,15 @@ describe("MeshRenderer", async function () {
196196
// Test that getInstanceMaterial works correctly.
197197
const material = mr.getInstanceMaterial();
198198
expect(material).to.be.instanceOf(UnlitMaterial);
199-
expect(material.name).to.be.equal("undefined(Instance)");
199+
expect(material.name).to.be.equal("unlit(Instance)");
200200

201201
// Test that material0 is same as material.
202202
const material0 = mr.getInstanceMaterial(0);
203203
expect(material0).to.be.eq(material);
204204

205205
const material2 = mr.getInstanceMaterial(2);
206206
expect(material2).to.be.instanceOf(PBRMaterial);
207-
expect(material2.name).to.be.equal("undefined(Instance)");
207+
expect(material2.name).to.be.equal("pbr(Instance)");
208208

209209
expect(mr.getInstanceMaterial(1)).to.be.null;
210210

@@ -220,9 +220,9 @@ describe("MeshRenderer", async function () {
220220
// Test that getInstanceMaterials works correctly.
221221
const materials = mr.getInstanceMaterials();
222222
expect(materials[0]).to.be.instanceOf(UnlitMaterial);
223-
expect(materials[0].name).to.be.equal("undefined(Instance)");
223+
expect(materials[0].name).to.be.equal("unlit(Instance)");
224224
expect(materials[1]).to.be.instanceOf(PBRMaterial);
225-
expect(materials[1].name).to.be.equal("undefined(Instance)");
225+
expect(materials[1].name).to.be.equal("pbr(Instance)");
226226
});
227227

228228
it("priority", () => {

tests/src/core/material/Material.test.ts

+8
Original file line numberDiff line numberDiff line change
@@ -91,4 +91,12 @@ describe("Material", () => {
9191
}
9292
}
9393
});
94+
95+
it("clone", () => {
96+
const material = new Material(engine, Shader.find("blinn-phong"));
97+
expect(material.name).to.equal("blinn-phong");
98+
99+
const clone = material.clone();
100+
expect(clone.name).to.equal("blinn-phong(Clone)");
101+
});
94102
});

0 commit comments

Comments
 (0)