Patch Blender Loader

Refering to this post i created a patch to only load active layer and lights.

[patch]

— Remotely Modified (Based On HEAD)

+++ Locally Modified (Based On LOCAL)

@@ -33,7 +33,6 @@



import java.io.IOException;

import java.util.ArrayList;

-import java.util.Iterator;

import java.util.List;

import java.util.logging.Level;

import java.util.logging.Logger;

@@ -41,8 +40,12 @@

import com.jme3.asset.AssetInfo;

import com.jme3.asset.AssetLoader;

import com.jme3.asset.BlenderKey;

+import com.jme3.asset.BlenderKey.FeaturesToLoad;

import com.jme3.asset.BlenderKey.LoadingResults;

+import com.jme3.asset.BlenderKey.WorldData;

import com.jme3.asset.ModelKey;

+import com.jme3.light.Light;

+import com.jme3.renderer.Camera;

import com.jme3.scene.Node;

import com.jme3.scene.Spatial;

import com.jme3.scene.plugins.blender.animations.ArmatureHelper;

@@ -53,6 +56,7 @@

import com.jme3.scene.plugins.blender.exceptions.BlenderFileException;

import com.jme3.scene.plugins.blender.file.BlenderInputStream;

import com.jme3.scene.plugins.blender.file.FileBlockHeader;

+import com.jme3.scene.plugins.blender.file.Structure;

import com.jme3.scene.plugins.blender.lights.LightHelper;

import com.jme3.scene.plugins.blender.materials.MaterialHelper;

import com.jme3.scene.plugins.blender.meshes.MeshHelper;

@@ -123,25 +127,66 @@



JmeConverter converter = new JmeConverter(dataRepository);

LoadingResults loadingResults = blenderKey.prepareLoadingResults();

  •        WorldData worldData = null;//a set of data used in different scene aspects<br />
    

for (FileBlockHeader block : blocks) {

  •            if (block.getCode() == FileBlockHeader.BLOCK_OB00) {<br />
    
  •            switch (block.getCode()) {<br />
    
  •                case FileBlockHeader.BLOCK_OB00://Object<br />
    

Object object = converter.toObject(block.getStructure(dataRepository));

if (object instanceof Node) {

  •                        if ((blenderKey.getFeaturesToLoad() &amp; FeaturesToLoad.OBJECTS) != 0) {<br />
    

LOGGER.log(Level.INFO, "{0}: {1}–> {2}", new Object[]{((Node) object).getName(), ((Node) object).getLocalTranslation().toString(), ((Node) object).getParent() == null ? "null" : ((Node) object).getParent().getName()});

if (((Node) object).getParent() == null) {

loadingResults.addObject((Node) object);

}

}

  •                    } else if (object instanceof Camera) {<br />
    
  •                        if ((blenderKey.getFeaturesToLoad() &amp; FeaturesToLoad.CAMERAS) != 0) {<br />
    
  •                            loadingResults.addCamera((Camera) object);<br />
    

}

  •                    } else if (object instanceof Light) {<br />
    
  •                        if ((blenderKey.getFeaturesToLoad() &amp; FeaturesToLoad.LIGHTS) != 0) {<br />
    
  •                            loadingResults.addLight((Light) object);<br />
    

}

  •                    }<br />
    
  •                    break;<br />
    
  •                case FileBlockHeader.BLOCK_MA00://Material<br />
    
  •                    if ((blenderKey.getFeaturesToLoad() &amp; FeaturesToLoad.MATERIALS) != 0) {<br />
    
  •                        loadingResults.addMaterial(converter.toMaterial(block.getStructure(dataRepository)));<br />
    
  •                    }<br />
    
  •                    break;<br />
    
  •                case FileBlockHeader.BLOCK_SC00://Scene<br />
    
  •                    if ((blenderKey.getFeaturesToLoad() &amp; FeaturesToLoad.SCENES) != 0) {<br />
    
  •                        loadingResults.addScene(converter.toScene(block.getStructure(dataRepository)));<br />
    
  •                    }<br />
    
  •                    break;<br />
    
  •                case FileBlockHeader.BLOCK_WO00://World<br />
    
  •                    if (worldData == null) {//onlu one world data is used<br />
    
  •                        Structure worldStructure = block.getStructure(dataRepository);<br />
    
  •                        String worldName = worldStructure.getName();<br />
    
  •                        if (blenderKey.getUsedWorld() == null || blenderKey.getUsedWorld().equals(worldName)) {<br />
    
  •                            worldData = converter.toWorldData(worldStructure);<br />
    
  •                            if ((blenderKey.getFeaturesToLoad() &amp; FeaturesToLoad.LIGHTS) != 0) {<br />
    
  •                                loadingResults.addLight(worldData.getAmbientLight());<br />
    
  •                            }<br />
    
  •                        }<br />
    
  •                    }<br />
    
  •                    break;<br />
    
  •            }<br />
    
  •        }<br />
    
  •        try {<br />
    

inputStream.close();

  •        } catch (IOException e) {<br />
    
  •            LOGGER.log(Level.SEVERE, e.getMessage(), e);<br />
    
  •        }<br />
    

List<Node> objects = loadingResults.getObjects();

if (objects.size() > 0) {

Node modelNode = new Node(blenderKey.getName());

  •            for (Iterator&lt;Node&gt; it = objects.iterator(); it.hasNext();) {<br />
    
  •                Node node = it.next();<br />
    
  •                modelNode.attachChild(node);<br />
    
  •             for (Node object : loadingResults.getObjects()) {<br />
    
  •                 modelNode.attachChild(object);<br />
    

}

  •             for (Light light : loadingResults.getLights()) {<br />
    
  •                 modelNode.addLight(light);<br />
    
  •             }<br />
    

return modelNode;

} else if (objects.size() == 1) {

return objects.get(0);

[/patch]

I just updated the patch to work with current svn rev.



Could someone please review the patch and commit it, if it’s reasonable.

@Kaelthas? U around? :slight_smile:

@Kaelthas Could you please take a look at this!?

kaelfufu? kaelgaga? :o

Sorry guys I did not respond.

I was away two weeks ago so I didn’t check the forum and when I returned I missed this topic :wink:



I’m not really sure why do you want to load Material, Scene and World info in this loader.

BlenderModelLoader was intended to load a single model only. If you want to load more - use BlenderLoader :slight_smile:



I added try-catch around the inputStream.close() and changed the loop at the end (I removed the Iterator).

Its good that somebody noticed that :wink:



@Momoko_Fan

I can do with ‘kaelfufu’, but PLEASE DO NOT USE ‘kaelgaga’ :stuck_out_tongue:

This reminds me of a ‘Lady’ with similar nickname :stuck_out_tongue:

My intention was to only load the objects from the active layer. The current implementation loads all objects from all layers.



Perhaps this might not be the right solution to load a blender scene.

I want to create my maps in blender and load them within the SDK.

OK so I’ll add it here too.

Just give me a moment. Need to get back from work first :wink:

OK bug fixed.

Hope it will be OK now :wink:

Kaelthas said:
@Momoko_Fan
I can do with 'kaelfufu', but PLEASE DO NOT USE 'kaelgaga' :P
This reminds me of a 'Lady' with similar nickname :P

oh man....you shouldn't have told him...now you're good for kaelgaga for the rest of your life... :D