|
|
@ -47,6 +47,7 @@ import com.jme3.asset.ModelKey; |
|
|
|
import com.jme3.light.Light; |
|
|
|
import com.jme3.light.Light; |
|
|
|
import com.jme3.renderer.Camera; |
|
|
|
import com.jme3.renderer.Camera; |
|
|
|
import com.jme3.scene.Node; |
|
|
|
import com.jme3.scene.Node; |
|
|
|
|
|
|
|
import com.jme3.scene.Spatial; |
|
|
|
import com.jme3.scene.plugins.blender.animations.ArmatureHelper; |
|
|
|
import com.jme3.scene.plugins.blender.animations.ArmatureHelper; |
|
|
|
import com.jme3.scene.plugins.blender.animations.IpoHelper; |
|
|
|
import com.jme3.scene.plugins.blender.animations.IpoHelper; |
|
|
|
import com.jme3.scene.plugins.blender.cameras.CameraHelper; |
|
|
|
import com.jme3.scene.plugins.blender.cameras.CameraHelper; |
|
|
@ -72,63 +73,22 @@ public class BlenderLoader implements AssetLoader { |
|
|
|
|
|
|
|
|
|
|
|
private static final Logger LOGGER = Logger.getLogger(BlenderLoader.class.getName()); |
|
|
|
private static final Logger LOGGER = Logger.getLogger(BlenderLoader.class.getName()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** Converter for blender structures. */ |
|
|
|
|
|
|
|
protected JmeConverter converter; |
|
|
|
|
|
|
|
/** The data repository. */ |
|
|
|
|
|
|
|
protected DataRepository dataRepository; |
|
|
|
|
|
|
|
/** The blender key to use. */ |
|
|
|
|
|
|
|
protected BlenderKey blenderKey; |
|
|
|
|
|
|
|
/** The blocks read from the file. */ |
|
|
|
|
|
|
|
protected List<FileBlockHeader> blocks; |
|
|
|
|
|
|
|
/** Blender input stream. */ |
|
|
|
|
|
|
|
protected BlenderInputStream inputStream; |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public LoadingResults load(AssetInfo assetInfo) throws IOException { |
|
|
|
public Spatial load(AssetInfo assetInfo) throws IOException { |
|
|
|
try { |
|
|
|
try { |
|
|
|
//registering loaders
|
|
|
|
this.setup(assetInfo); |
|
|
|
ModelKey modelKey = (ModelKey) assetInfo.getKey(); |
|
|
|
|
|
|
|
BlenderKey blenderKey; |
|
|
|
|
|
|
|
if (modelKey instanceof BlenderKey) { |
|
|
|
|
|
|
|
blenderKey = (BlenderKey) modelKey; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
blenderKey = new BlenderKey(modelKey.getName()); |
|
|
|
|
|
|
|
blenderKey.setAssetRootPath(modelKey.getFolder()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//opening stream
|
|
|
|
|
|
|
|
BlenderInputStream inputStream = new BlenderInputStream(assetInfo.openStream(), assetInfo.getManager()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//reading blocks
|
|
|
|
|
|
|
|
List<FileBlockHeader> blocks = new ArrayList<FileBlockHeader>(); |
|
|
|
|
|
|
|
FileBlockHeader fileBlock; |
|
|
|
|
|
|
|
DataRepository dataRepository = new DataRepository(); |
|
|
|
|
|
|
|
dataRepository.setAssetManager(assetInfo.getManager()); |
|
|
|
|
|
|
|
dataRepository.setInputStream(inputStream); |
|
|
|
|
|
|
|
dataRepository.setBlenderKey(blenderKey); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//creating helpers
|
|
|
|
|
|
|
|
dataRepository.putHelper(ArmatureHelper.class, new ArmatureHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(TextureHelper.class, new TextureHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(MeshHelper.class, new MeshHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ObjectHelper.class, new ObjectHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(CurvesHelper.class, new CurvesHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(LightHelper.class, new LightHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(CameraHelper.class, new CameraHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ModifierHelper.class, new ModifierHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(MaterialHelper.class, new MaterialHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ConstraintHelper.class, new ConstraintHelper(inputStream.getVersionNumber(), dataRepository)); |
|
|
|
|
|
|
|
dataRepository.putHelper(IpoHelper.class, new IpoHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ParticlesHelper.class, new ParticlesHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//setting additional data to helpers
|
|
|
|
|
|
|
|
if (blenderKey.isFixUpAxis()) { |
|
|
|
|
|
|
|
ObjectHelper objectHelper = dataRepository.getHelper(ObjectHelper.class); |
|
|
|
|
|
|
|
objectHelper.setyIsUpAxis(true); |
|
|
|
|
|
|
|
CurvesHelper curvesHelper = dataRepository.getHelper(CurvesHelper.class); |
|
|
|
|
|
|
|
curvesHelper.setyIsUpAxis(true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
MaterialHelper materialHelper = dataRepository.getHelper(MaterialHelper.class); |
|
|
|
|
|
|
|
materialHelper.setFaceCullMode(blenderKey.getFaceCullMode()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//reading the blocks (dna block is automatically saved in the data repository when found)//TODO: zmienić to
|
|
|
|
|
|
|
|
do { |
|
|
|
|
|
|
|
fileBlock = new FileBlockHeader(inputStream, dataRepository); |
|
|
|
|
|
|
|
if (!fileBlock.isDnaBlock()) { |
|
|
|
|
|
|
|
blocks.add(fileBlock); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} while (!fileBlock.isLastBlock()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
JmeConverter converter = new JmeConverter(dataRepository); |
|
|
|
|
|
|
|
LoadingResults loadingResults = blenderKey.prepareLoadingResults(); |
|
|
|
LoadingResults loadingResults = blenderKey.prepareLoadingResults(); |
|
|
|
WorldData worldData = null;// a set of data used in different scene aspects
|
|
|
|
WorldData worldData = null;// a set of data used in different scene aspects
|
|
|
|
for (FileBlockHeader block : blocks) { |
|
|
|
for (FileBlockHeader block : blocks) { |
|
|
@ -187,4 +147,77 @@ public class BlenderLoader implements AssetLoader { |
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
|
|
|
|
* This method sets up the loader. |
|
|
|
|
|
|
|
* @param assetInfo |
|
|
|
|
|
|
|
* the asset info |
|
|
|
|
|
|
|
* @throws BlenderFileException |
|
|
|
|
|
|
|
* an exception is throw when something wrong happens with blender file |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
protected void setup(AssetInfo assetInfo) throws BlenderFileException { |
|
|
|
|
|
|
|
// registering loaders
|
|
|
|
|
|
|
|
ModelKey modelKey = (ModelKey) assetInfo.getKey(); |
|
|
|
|
|
|
|
if (modelKey instanceof BlenderKey) { |
|
|
|
|
|
|
|
blenderKey = (BlenderKey) modelKey; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
blenderKey = new BlenderKey(modelKey.getName()); |
|
|
|
|
|
|
|
blenderKey.setAssetRootPath(modelKey.getFolder()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// opening stream
|
|
|
|
|
|
|
|
inputStream = new BlenderInputStream(assetInfo.openStream(), assetInfo.getManager()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// reading blocks
|
|
|
|
|
|
|
|
blocks = new ArrayList<FileBlockHeader>(); |
|
|
|
|
|
|
|
FileBlockHeader fileBlock; |
|
|
|
|
|
|
|
dataRepository = new DataRepository(); |
|
|
|
|
|
|
|
dataRepository.setAssetManager(assetInfo.getManager()); |
|
|
|
|
|
|
|
dataRepository.setInputStream(inputStream); |
|
|
|
|
|
|
|
dataRepository.setBlenderKey(blenderKey); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// creating helpers
|
|
|
|
|
|
|
|
dataRepository.putHelper(ArmatureHelper.class, new ArmatureHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(TextureHelper.class, new TextureHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(MeshHelper.class, new MeshHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ObjectHelper.class, new ObjectHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(CurvesHelper.class, new CurvesHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(LightHelper.class, new LightHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(CameraHelper.class, new CameraHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ModifierHelper.class, new ModifierHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(MaterialHelper.class, new MaterialHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ConstraintHelper.class, new ConstraintHelper(inputStream.getVersionNumber(), dataRepository)); |
|
|
|
|
|
|
|
dataRepository.putHelper(IpoHelper.class, new IpoHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
dataRepository.putHelper(ParticlesHelper.class, new ParticlesHelper(inputStream.getVersionNumber())); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// setting additional data to helpers
|
|
|
|
|
|
|
|
if (blenderKey.isFixUpAxis()) { |
|
|
|
|
|
|
|
ObjectHelper objectHelper = dataRepository.getHelper(ObjectHelper.class); |
|
|
|
|
|
|
|
objectHelper.setyIsUpAxis(true); |
|
|
|
|
|
|
|
CurvesHelper curvesHelper = dataRepository.getHelper(CurvesHelper.class); |
|
|
|
|
|
|
|
curvesHelper.setyIsUpAxis(true); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
MaterialHelper materialHelper = dataRepository.getHelper(MaterialHelper.class); |
|
|
|
|
|
|
|
materialHelper.setFaceCullMode(blenderKey.getFaceCullMode()); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// reading the blocks (dna block is automatically saved in the data repository when found)//TODO: zmienić to
|
|
|
|
|
|
|
|
FileBlockHeader sceneFileBlock = null; |
|
|
|
|
|
|
|
do { |
|
|
|
|
|
|
|
fileBlock = new FileBlockHeader(inputStream, dataRepository); |
|
|
|
|
|
|
|
if (!fileBlock.isDnaBlock()) { |
|
|
|
|
|
|
|
blocks.add(fileBlock); |
|
|
|
|
|
|
|
// save the scene's file block
|
|
|
|
|
|
|
|
if (fileBlock.getCode() == FileBlockHeader.BLOCK_SC00 && blenderKey.getLayersToLoad() < 0) { |
|
|
|
|
|
|
|
sceneFileBlock = fileBlock; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} while (!fileBlock.isLastBlock()); |
|
|
|
|
|
|
|
// VERIFY LAYERS TO BE LOADED BEFORE LOADING FEATURES
|
|
|
|
|
|
|
|
if (sceneFileBlock != null) { |
|
|
|
|
|
|
|
int lay = ((Number) sceneFileBlock.getStructure(dataRepository).getFieldValue("lay")).intValue(); |
|
|
|
|
|
|
|
dataRepository.getBlenderKey().setLayersToLoad(lay);// load only current layer
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
converter = new JmeConverter(dataRepository); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|