diff --git a/packages/core/src/Entity.ts b/packages/core/src/Entity.ts index a012c09e0..a24eb6f1d 100644 --- a/packages/core/src/Entity.ts +++ b/packages/core/src/Entity.ts @@ -251,7 +251,7 @@ export class Entity extends EngineObject { */ constructor(engine: Engine, name?: string, ...components: ComponentConstructor[]) { super(engine); - this.name = name ?? "New Entity"; + this.name = name ?? "Entity"; for (let i = 0, n = components.length; i < n; i++) { this.addComponent(components[i]); } diff --git a/packages/core/src/Renderer.ts b/packages/core/src/Renderer.ts index 06812fa18..339c7ed9b 100644 --- a/packages/core/src/Renderer.ts +++ b/packages/core/src/Renderer.ts @@ -486,7 +486,7 @@ export class Renderer extends Component implements IComponentCustomClone { private _createInstanceMaterial(material: Material, index: number): Material { const insMaterial: Material = material.clone(); - insMaterial.name = insMaterial.name + "(Instance)"; + insMaterial.name = material.name + "(Instance)"; this._addResourceReferCount(material, -1); this._addResourceReferCount(insMaterial, 1); this._materialsInstanced[index] = true; diff --git a/packages/core/src/material/BaseMaterial.ts b/packages/core/src/material/BaseMaterial.ts index 874c4d70f..d24ad87f4 100644 --- a/packages/core/src/material/BaseMaterial.ts +++ b/packages/core/src/material/BaseMaterial.ts @@ -220,7 +220,7 @@ export class BaseMaterial extends Material { */ override clone(): BaseMaterial { const dest = new BaseMaterial(this._engine, this.shader); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } diff --git a/packages/core/src/material/BlinnPhongMaterial.ts b/packages/core/src/material/BlinnPhongMaterial.ts index 7c645d112..e962246cd 100644 --- a/packages/core/src/material/BlinnPhongMaterial.ts +++ b/packages/core/src/material/BlinnPhongMaterial.ts @@ -177,7 +177,7 @@ export class BlinnPhongMaterial extends BaseMaterial { override clone(): BlinnPhongMaterial { var dest: BlinnPhongMaterial = new BlinnPhongMaterial(this._engine); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } } diff --git a/packages/core/src/material/Material.ts b/packages/core/src/material/Material.ts index a197e5eb2..40c1674c2 100644 --- a/packages/core/src/material/Material.ts +++ b/packages/core/src/material/Material.ts @@ -84,6 +84,7 @@ export class Material extends ReferResource implements IClone { constructor(engine: Engine, shader: Shader) { super(engine); this.shader = shader; + this.name = shader.name; } /** @@ -91,7 +92,7 @@ export class Material extends ReferResource implements IClone { */ clone(): Material { const dest = new Material(this._engine, this.shader); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } @@ -112,6 +113,11 @@ export class Material extends ReferResource implements IClone { this._shader._addReferCount(value); } + protected _cloneToAndModifyName(target: Material): void { + this.cloneTo(target); + target.name = this.name + "(Clone)"; + } + /** * @override */ diff --git a/packages/core/src/material/PBRMaterial.ts b/packages/core/src/material/PBRMaterial.ts index a59d4955b..0bea4ae9c 100644 --- a/packages/core/src/material/PBRMaterial.ts +++ b/packages/core/src/material/PBRMaterial.ts @@ -484,7 +484,7 @@ export class PBRMaterial extends PBRBaseMaterial { */ override clone(): PBRMaterial { const dest = new PBRMaterial(this._engine); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } diff --git a/packages/core/src/material/PBRSpecularMaterial.ts b/packages/core/src/material/PBRSpecularMaterial.ts index 8eb54d0e6..b8d159b1c 100644 --- a/packages/core/src/material/PBRSpecularMaterial.ts +++ b/packages/core/src/material/PBRSpecularMaterial.ts @@ -75,7 +75,7 @@ export class PBRSpecularMaterial extends PBRBaseMaterial { */ override clone(): PBRSpecularMaterial { const dest = new PBRSpecularMaterial(this._engine); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } } diff --git a/packages/core/src/material/UnlitMaterial.ts b/packages/core/src/material/UnlitMaterial.ts index 2e6684e0a..81fafda76 100644 --- a/packages/core/src/material/UnlitMaterial.ts +++ b/packages/core/src/material/UnlitMaterial.ts @@ -73,7 +73,7 @@ export class UnlitMaterial extends BaseMaterial { */ override clone(): UnlitMaterial { const dest = new UnlitMaterial(this._engine); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } } diff --git a/packages/core/src/particle/ParticleMaterial.ts b/packages/core/src/particle/ParticleMaterial.ts index ea80d8399..f85779500 100644 --- a/packages/core/src/particle/ParticleMaterial.ts +++ b/packages/core/src/particle/ParticleMaterial.ts @@ -56,7 +56,7 @@ export class ParticleMaterial extends BaseMaterial { */ override clone(): ParticleMaterial { const dest = new ParticleMaterial(this._engine); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } } diff --git a/packages/core/src/sky/SkyBoxMaterial.ts b/packages/core/src/sky/SkyBoxMaterial.ts index 03b0c4b3a..d85347a7e 100644 --- a/packages/core/src/sky/SkyBoxMaterial.ts +++ b/packages/core/src/sky/SkyBoxMaterial.ts @@ -96,7 +96,7 @@ export class SkyBoxMaterial extends Material { override clone(): SkyBoxMaterial { const dest = new SkyBoxMaterial(this._engine); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } } diff --git a/packages/core/src/sky/SkyProceduralMaterial.ts b/packages/core/src/sky/SkyProceduralMaterial.ts index e71a2607c..9c9a25258 100644 --- a/packages/core/src/sky/SkyProceduralMaterial.ts +++ b/packages/core/src/sky/SkyProceduralMaterial.ts @@ -149,7 +149,7 @@ export class SkyProceduralMaterial extends Material { */ override clone(): SkyProceduralMaterial { const dest = new SkyProceduralMaterial(this._engine); - this.cloneTo(dest); + this._cloneToAndModifyName(dest); return dest; } } diff --git a/tests/src/core/MeshRenderer.test.ts b/tests/src/core/MeshRenderer.test.ts index 726fdcb4a..baf9d0e90 100644 --- a/tests/src/core/MeshRenderer.test.ts +++ b/tests/src/core/MeshRenderer.test.ts @@ -196,7 +196,7 @@ describe("MeshRenderer", async function () { // Test that getInstanceMaterial works correctly. const material = mr.getInstanceMaterial(); expect(material).to.be.instanceOf(UnlitMaterial); - expect(material.name).to.be.equal("undefined(Instance)"); + expect(material.name).to.be.equal("unlit(Instance)"); // Test that material0 is same as material. const material0 = mr.getInstanceMaterial(0); @@ -204,7 +204,7 @@ describe("MeshRenderer", async function () { const material2 = mr.getInstanceMaterial(2); expect(material2).to.be.instanceOf(PBRMaterial); - expect(material2.name).to.be.equal("undefined(Instance)"); + expect(material2.name).to.be.equal("pbr(Instance)"); expect(mr.getInstanceMaterial(1)).to.be.null; @@ -220,9 +220,9 @@ describe("MeshRenderer", async function () { // Test that getInstanceMaterials works correctly. const materials = mr.getInstanceMaterials(); expect(materials[0]).to.be.instanceOf(UnlitMaterial); - expect(materials[0].name).to.be.equal("undefined(Instance)"); + expect(materials[0].name).to.be.equal("unlit(Instance)"); expect(materials[1]).to.be.instanceOf(PBRMaterial); - expect(materials[1].name).to.be.equal("undefined(Instance)"); + expect(materials[1].name).to.be.equal("pbr(Instance)"); }); it("priority", () => { diff --git a/tests/src/core/material/Material.test.ts b/tests/src/core/material/Material.test.ts index f3bc00874..5dbcfa5af 100644 --- a/tests/src/core/material/Material.test.ts +++ b/tests/src/core/material/Material.test.ts @@ -91,4 +91,12 @@ describe("Material", () => { } } }); + + it("clone", () => { + const material = new Material(engine, Shader.find("blinn-phong")); + expect(material.name).to.equal("blinn-phong"); + + const clone = material.clone(); + expect(clone.name).to.equal("blinn-phong(Clone)"); + }); });