= jMonkeyEngine SDK: Material Editor
:revnumber: 2.0
:revdate: 2020/07/10
:keywords: documentation, sdk, material, file, texture


If you are looking for background information, read about xref:ROOT:jme3/advanced/material_definitions.adoc[Material Definitions] and xref:ROOT:jme3/advanced/j3m_material_files.adoc[j3M Material Files].
You can write .j3m files in a text editor, or use the jMonkeyEngine SDK to generate them for you as described in this article.


== Materials

The jMonkeyEngine uses a special Material format, which comes in .j3m files. You use .j3m files to store sets of material properties that you use repeatedly. This enables you write one short line of code that simply loads the presets from a custom .j3m file. Without a .j3m file you need to write several lines of material property setters every time when you want to use a non-default material.


== Creating .j3m Materials

[float.right]
image::material-editor.png[material-editor.png,width="275",height="245",align="right"]


To create new .j3m files in the jMonkeyEngine SDK:

.  btn:[RMB] select the `assets/Materials` directory and choose `menu:New[Other]`.
.  In the New File Wizard, choose `menu:Material[Empty Material File]`, and click btn:[Next].
.  Give the file a name, for example `mat_wall` for a wall material.
.  A new file `mat_wall.j3m` is created in the Materials directory and opens in the Material Editor.

You can edit the source of the material, or use the user-friendly visual editor to set the properties of the material. Set the properties to the same values as you would otherwise specify with setters on a Material object in Java code:

[source,java]
----
Material mat_wall = new Material(
    assetManager, "Common/MatDefs/Light/Lighting.j3md");
mat_wall.setTexture("DiffuseMap",
    assetManager.loadTexture("Textures/wall_diffuse.png"));
mat_wall.setTexture("NormalMap",
    assetManager.loadTexture("Textures/wall_normals.png"));
mat_wall.setFloat("Shininess", 5f);
----

This Java code corresponds to the following .j3m file:

[source,xml]
----
Material my brick wall : Common/MatDefs/Light/Lighting.j3md {
  MaterialParameters {
    DiffuseMap: Repeat Textures/wall_diffuse.png
    NormalMap:  Repeat Textures/wall_normals.png
    Shininess: 5.0
  }
}
----

You can modify the source code of the j3m file in the "`source`" tab of the Material Editor.


== Using .j3m Materials

[float.right]
image::applymaterial.jpg[applymaterial.jpg,width="180",height="300",align="right"]


When the material is ready and saved into your projects assets directory, you can assign the .j3m to a Geometry.

In the jMonkeyEngine SDK

.  btn:[RMB] select the j3o file and choose `Edit in SceneComposer`.
.  You can open the SceneExplorer window by selecting `menu:Window[SceneExplorer]` from the menu bar, if it's not already open.
.  In the SceneExplorer, click the geometry to which you want to assign the material.
.  Open the Properties window.
.  Assign the .j3m material to the .j3o in the `menu:Properties[Geometry>Material]` section.
+
TIP: If the .j3o file already has a material assigned to it from exporting/importing, you can generate the material by selecting "`create j3m file`" instead. This will place a .j3m under `assets/Materials/Generated` and assign it to your .j3o.

.  Save the j3o and load it into you game.

Or in your Java code

*  Use a loader and a setter to assign the material to a Geometry.

[source,java]
----
mywall.setMaterial(assetManager.loadMaterial( "Materials/mat_wall.j3m"));
----

'''

*See also:*

*  xref:ROOT:jme3/advanced/material_specification.adoc[Developer specification of the jME3 material system (.j3md,.j3m)]
*  xref:tutorials:beginner/hello_material.adoc[Hello Material]
*  xref:ROOT:jme3/advanced/materials_overview.adoc[Materials Overview]
*  xref:neotexture.adoc[Neotexture] (Procedural textures)
