Skip to content

Commit 918e0b9

Browse files
authored
feat: add normal material (#584)
1 parent cdde35a commit 918e0b9

File tree

5 files changed

+59
-4
lines changed

5 files changed

+59
-4
lines changed

editor/src/editor/dialogs/command-palette/material.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { Editor } from "../../main";
22

3-
import { addPBRMaterial, addStandardMaterial, addNodeMaterial, addSkyMaterial, addGridMaterial } from "../../../project/add/material";
3+
import { addPBRMaterial, addStandardMaterial, addNodeMaterial, addSkyMaterial, addGridMaterial, addNormalMaterial } from "../../../project/add/material";
44

55
import { ICommandPaletteType } from "./command-palette";
66

@@ -36,5 +36,11 @@ export function getMaterialCommands(editor?: Editor): ICommandPaletteType[] {
3636
key: "add-grid-material",
3737
action: () => editor && addGridMaterial(editor.layout.preview.scene),
3838
},
39+
{
40+
text: "Normal Material",
41+
label: "Add a new normal material to the scene",
42+
key: "add-normal-material",
43+
action: () => editor && addNormalMaterial(editor.layout.preview.scene),
44+
},
3945
];
4046
}

editor/src/editor/layout/inspector/material/multi.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { extname } from "path/posix";
22

33
import { Component, DragEvent, ReactNode } from "react";
44

5-
import { SkyMaterial, GridMaterial } from "babylonjs-materials";
5+
import { SkyMaterial, GridMaterial, NormalMaterial } from "babylonjs-materials";
66
import { Material, MultiMaterial, PBRMaterial, StandardMaterial } from "babylonjs";
77

88
import { Table, TableBody, TableCaption, TableCell, TableRow } from "../../../../ui/shadcn/ui/table";
@@ -15,6 +15,7 @@ import { EditorInspectorSectionField } from "../fields/section";
1515

1616
import { EditorSkyMaterialInspector } from "./sky";
1717
import { EditorGridMaterialInspector } from "./grid";
18+
import { EditorNormalMaterialInspector } from "./normal";
1819
import { EditorPBRMaterialInspector } from "./pbr";
1920
import { EditorStandardMaterialInspector } from "./standard";
2021

@@ -121,6 +122,8 @@ export class EditorMultiMaterialInspector extends Component<IEditorPBRMaterialIn
121122
return <EditorSkyMaterialInspector key={this.state.material.id} material={this.state.material as SkyMaterial} />;
122123
case "GridMaterial":
123124
return <EditorGridMaterialInspector key={this.state.material.id} material={this.state.material as GridMaterial} />;
125+
case "NormalMaterial":
126+
return <EditorNormalMaterialInspector key={this.state.material.id} material={this.state.material as NormalMaterial} />;
124127
}
125128
}
126129
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
import { Component, ReactNode } from "react";
2+
3+
import { AbstractMesh } from "babylonjs";
4+
import { NormalMaterial } from "babylonjs-materials";
5+
6+
import { EditorInspectorStringField } from "../fields/string";
7+
import { EditorInspectorSwitchField } from "../fields/switch";
8+
import { EditorInspectorSectionField } from "../fields/section";
9+
10+
import { EditorMaterialInspectorUtilsComponent } from "./components/utils";
11+
12+
export interface IEditorNormalMaterialInspectorProps {
13+
mesh?: AbstractMesh;
14+
material: NormalMaterial;
15+
}
16+
17+
export class EditorNormalMaterialInspector extends Component<IEditorNormalMaterialInspectorProps> {
18+
public constructor(props: IEditorNormalMaterialInspectorProps) {
19+
super(props);
20+
}
21+
22+
public render(): ReactNode {
23+
return (
24+
<>
25+
<EditorInspectorSectionField title="Material" label={this.props.material.getClassName()}>
26+
<EditorInspectorStringField label="Name" object={this.props.material} property="name" />
27+
<EditorInspectorSwitchField label="Back Face Culling" object={this.props.material} property="backFaceCulling" />
28+
29+
<EditorMaterialInspectorUtilsComponent mesh={this.props.mesh} material={this.props.material} />
30+
</EditorInspectorSectionField>
31+
</>
32+
);
33+
}
34+
}

editor/src/editor/layout/inspector/mesh/mesh.tsx

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { FaCopy, FaLink } from "react-icons/fa6";
55
import { IoAddSharp, IoCloseOutline } from "react-icons/io5";
66
import { AiOutlinePlus } from "react-icons/ai";
77

8-
import { SkyMaterial, GridMaterial } from "babylonjs-materials";
8+
import { SkyMaterial, GridMaterial, NormalMaterial } from "babylonjs-materials";
99
import { AbstractMesh, InstancedMesh, Material, Mesh, MorphTarget, MultiMaterial, Node, Observer, PBRMaterial, StandardMaterial, NodeMaterial } from "babylonjs";
1010

1111
import { CollisionMesh } from "../../../nodes/collision";
@@ -40,6 +40,7 @@ import { IEditorInspectorImplementationProps } from "../inspector";
4040
import { EditorPBRMaterialInspector } from "../material/pbr";
4141
import { EditorSkyMaterialInspector } from "../material/sky";
4242
import { EditorGridMaterialInspector } from "../material/grid";
43+
import { EditorNormalMaterialInspector } from "../material/normal";
4344
import { EditorNodeMaterialInspector } from "../material/node";
4445
import { EditorMultiMaterialInspector } from "../material/multi";
4546
import { EditorStandardMaterialInspector } from "../material/standard";
@@ -307,6 +308,9 @@ export class EditorMeshInspector extends Component<IEditorInspectorImplementatio
307308

308309
case "GridMaterial":
309310
return <EditorGridMaterialInspector mesh={this.props.object} material={this.props.object.material as GridMaterial} />;
311+
312+
case "NormalMaterial":
313+
return <EditorNormalMaterialInspector mesh={this.props.object} material={this.props.object.material as NormalMaterial} />;
310314
}
311315
}
312316

editor/src/project/add/material.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { SkyMaterial, GridMaterial } from "babylonjs-materials";
1+
import { SkyMaterial, GridMaterial, NormalMaterial } from "babylonjs-materials";
22
import { Scene, Tools, PBRMaterial, StandardMaterial, NodeMaterial } from "babylonjs";
33

44
import { UniqueNumber } from "../../tools/tools";
@@ -43,3 +43,11 @@ export function addGridMaterial(scene: Scene) {
4343

4444
return material;
4545
}
46+
47+
export function addNormalMaterial(scene: Scene) {
48+
const material = new NormalMaterial("New Normal Material", scene);
49+
material.id = Tools.RandomId();
50+
material.uniqueId = UniqueNumber.Get();
51+
52+
return material;
53+
}

0 commit comments

Comments
 (0)