package fr.lyrgard.hexScape.model.model3d.loader; import java.io.File; import com.jme3.asset.AssetManager; import com.jme3.material.Material; import com.jme3.math.ColorRGBA; import com.jme3.scene.Geometry; import com.jme3.scene.Node; import com.jme3.scene.Spatial; import com.jme3.texture.Texture; import fr.lyrgard.hexScape.HexScapeCore; import fr.lyrgard.hexScape.model.model3d.ExternalModel; import fr.lyrgard.hexScape.model.model3d.ObjExternalModel; public class ObjModelLoader extends AbstractModelLoader { @Override public boolean canLoad(String name) { File file = getObjFile(name); return file != null && file.exists(); } @Override public ExternalModel load(String name) { AssetManager assetManager = HexScapeCore.getInstance().getHexScapeJme3Application().getAssetManager(); Spatial model = assetManager.loadModel(getObjFile(name).getPath().replaceAll("\\\\", "/")); if (model instanceof Geometry) { normalizeMaterial((Geometry)model, assetManager); } else { for (Spatial child : ((Node)model).getChildren()) { if (child instanceof Geometry) { normalizeMaterial((Geometry)child, assetManager); } } } ObjExternalModel externalModel = new ObjExternalModel(); externalModel.setName(name); externalModel.setSpatial(model); return externalModel; } private File getObjFile(String name) { File file = null; for (File folder : getModelsFolders()) { File potentialFile = new File(new File(folder, name), name + ".obj"); if (potentialFile.exists()) { file = potentialFile; } } return file; } private void normalizeMaterial(Geometry geo, AssetManager assetManager) { Material mat = geo.getMaterial(); if (mat.getTextureParam("DiffuseMap") != null) { Texture texture = mat.getTextureParam("DiffuseMap").getTextureValue(); mat = new Material(assetManager, "Common/MatDefs/Light/Lighting.j3md"); geo.setMaterial(mat); mat.setTexture("DiffuseMap", texture); mat.setBoolean("UseMaterialColors",true); mat.setColor("Ambient", ColorRGBA.White); mat.setColor("Diffuse",ColorRGBA.White); // minimum material color mat.setColor("Specular",ColorRGBA.White); // for shininess mat.setFloat("Shininess", 50f); } } }