Fix material clone name (#2576)

* fix: material name clone bug
This commit is contained in:
ChenMo
2025-03-03 18:32:18 +08:00
committed by GitHub
parent 2cd5b85498
commit 6185bfb0b0
13 changed files with 29 additions and 15 deletions

View File

@@ -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]);
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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
*/

View File

@@ -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;
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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", () => {

View File

@@ -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)");
});
});