In the Material Definitions article you learned how to configure Materials programmatically in Java code. If you have certain commonly used Materials that never change, you can clean up the amount of Java code that clutters your init method, by moving material settings into .j3m files. Then later in your code, you only need to call one setter instead of several to apply the material.
SimpleBump.j3massets/Materials/ directory, e.g. MyGame/src/assets/Materials/SimpleBump.j3mMaterial shiny bumpy rock : Common/MatDefs/Light/Lighting.j3md {
MaterialParameters {
Shininess: 8.0
NormalMap: Textures/bump_rock_normal.png
UseMaterialColors : true
Ambient : 0.0 0.0 0.0 1.0
Diffuse : 1.0 1.0 1.0 1.0
Specular : 0.0 0.0 0.0 1.0
}
}
How to this file is structured:
Material is a fixed keyword, keep it.shiny bumpy rock is a descriptive string that you can make up. Choose a name to help you remember for what you intend to use this material.Tip: In the jMonkeyPlatform, use File>New File>Material>Empty Material File to create .j3m files.
This is how you use the prepared .j3m Material on a Spatial. Since you have saved the .j3m file to your project's Assets directory, the .j3m path is relative to MyGame/src/assets/….
myGeometry.setMaterial(assetManager.loadAsset("Materials/SimpleBump.j3m"));
Tip: In the jMonkeyPlatform, open Windows>Palette and drag the JME Material: Set J3M snippet into your code.
Make sure to get the paths to the textures (.png, .jpg) and material definitions (.j3md) right.
Common/MatDefs/Misc/Unshaded.j3md is resolved to jme3/src/src/core-data/Common/MatDefs/Misc/Unshaded.j3md.Textures/bump_rock_normal.png is resolved to MyGame/src/assets/Textures/bump_rock_normal.pngAll data types (except Color) are specified in com.jme3.shader.VarType. "Color" is specified as Vector4 in J3MLoader.java.
| Name | jME Java class | .j3m file syntax |
|---|---|---|
| Float | (basic Java type) | a float (e.g. 0.72) , no comma or parentheses |
| Vector2 | com.jme3.math.Vector2f | Two floats, no comma or parentheses |
| Vector3 | com.jme3.math.Vector3f | Three floats, no comma or parentheses |
| Vector4 | com.jme3.math.Vector4f | Four floats, no comma or parentheses |
| Texture2D | com.jme3.texture.Texture2D | Path to texture in assets directory, no quotation marks |
| Texture3D | com.jme3.texture.Texture3D | Same as texture 2D except it is interpreted as a 3D texture |
| TextureCubeMap | com.jme3.texture.TextureCubeMap | Same as texture 2D except it is interpreted as a cubemap texture |
| Boolean | (basic Java type) | true or false |
| Int | (basic Java type) | Integer number, no comma or parentheses |
| Color | com.jme3.math.ColorRGBA | Four floats, no comma or parentheses |
| FloatArray | (Currently not supported in J3M) | |
| Vector2Array | (Currently not supported in J3M) | |
| Vector3Array | (Currently not supported in J3M) | |
| Vector4Array | (Currently not supported in J3M) | |
| Matrix3 | (Currently not supported in J3M) | |
| Matrix4 | (Currently not supported in J3M) | |
| Matrix3Array | (Currently not supported in J3M) | |
| Matrix4Array | (Currently not supported in J3M) | |
| TextureBuffer | (Currently not supported in J3M) | |
| TextureArray | (Currently not supported in J3M) |
NormalMap: Flip Textures/bump_rock_normal.pngNormalMap: Repeat Textures/bump_rock_normal.pngSee the javadoc for a detailed explanation of render states.
| Name | Type | Purpose |
|---|---|---|
| (Boolean) | Enable wireframe rendering mode | |
| (Enum: FaceCullMode) | Set face culling mode (Off, Front, Back, FrontAndBack) | |
| (Boolean) | Enable writing depth to the depth buffer | |
| (Boolean) | Enable depth testing | |
| (Enum: BlendMode) | Set the blending mode | |
| (Float) | Set the alpha testing alpha falloff value (if set, it will enable alpha testing) | |
| (Float, Float) | Set the polygon offset factor and units | |
| (Boolean) | Enable color writing | |
| (Boolean) | Enable point sprite rendering for point meshes |
Spatial signpost = (Spatial) assetManager.loadAsset(
new OgreMeshKey("Models/Sign Post/Sign Post.mesh.xml", null));
signpost.setMaterial( (Material) assetManager.loadAsset(
new AssetKey("Models/Sign Post/Sign Post.j3m")));
TangentBinormalGenerator.generate(signpost);
rootNode.attachChild(signpost);
The file assets/Models/Sign Post/Sign Post.j3m contains:
Material Signpost : Common/MatDefs/Light/Lighting.j3md {
MaterialParameters {
Shininess: 4.0
DiffuseMap: Models/Sign Post/Sign Post.jpg
NormalMap: Models/Sign Post/Sign Post_normal.jpg
SpecularMap: Models/Sign Post/Sign Post_specular.jpg
UseMaterialColors : true
Ambient : 0.5 0.5 0.5 1.0
Diffuse : 1.0 1.0 1.0 1.0
Specular : 1.0 1.0 1.0 1.0
}
}
The JPG files are in the same directory, assets/Models/Sign Post/….
Material mat = assetManager.loadMaterial(
"Textures/Terrain/Pond/Pond.j3m");
mat.setColor("Ambient", ColorRGBA.DarkGray);
mat.setColor("Diffuse", ColorRGBA.White);
mat.setBoolean("UseMaterialColors", true);
The file assets/Textures/Terrain/Pond/Pond.j3m contains:
Material Pong Rock : Common/MatDefs/Light/Lighting.j3md {
MaterialParameters {
Shininess: 8.0
DiffuseMap: Repeat Textures/Terrain/Pond/Pond.png
NormalMap: Repeat Textures/Terrain/Pond/Pond_normal.png
}
}
The PNG files are in the same directory, assets/Textures/Terrain/Pond/
The file assets/Models/Tree/Leaves.j3m contains:
Material Leaves : Common/MatDefs/Light/Lighting.j3md {
Transparent On
MaterialParameters {
DiffuseMap : Models/Tree/Leaves.png
UseAlpha : true
AlphaDiscardThreshold : 0.5
UseMaterialColors : true
Ambient : .5 .5 .5 .5
Diffuse : 0.7 0.7 0.7 1
Specular : 0 0 0 1
Shininess : 16
}
AdditionalRenderState {
Blend Alpha
AlphaTestFalloff 0.50
FaceCull Off
}
}
The PNG file is in the same directory, assets/Models/Tree/…