Browse Source

buffer geometry export is working
scene with buffer geometry fixed
most scenes test
broken: scene tests with non-embedded geometry
can't test: scenes with textures

repsac 10 years ago
parent
commit
903833958c

+ 6 - 1
utils/exporters/blender/addons/io_three/exporter/geometry.py

@@ -261,7 +261,12 @@ class Geometry(base_classes.BaseNode):
                 constants.METADATA: self.metadata
             })
         else:
-            data[constants.ATTRIBUTES] = component_data
+            if self.options[constants.EMBED_GEOMETRY]:
+                data[constants.DATA] = {
+                    constants.ATTRIBUTES: component_data
+                }
+            else:
+                data[constants.ATTRIBUTES] = component_data
             data.update({constants.METADATA: self.metadata}) 
             data[constants.NAME] = self[constants.NAME]
 

+ 7 - 3
utils/exporters/blender/addons/io_three/exporter/scene.py

@@ -83,12 +83,16 @@ class Scene(base_classes.BaseScene):
             constants.EXTENSIONS[constants.JSON])
 
         for key, value in self.items():
-            if key == constants.GEOMETRIES and \
-            not self.options[constants.EMBED_GEOMETRY]:
+            embed = self.options[constants.EMBED_GEOMETRY]
+            if key == constants.GEOMETRIES and embed:
                 geometries = []
                 for geometry in value:
                     geom_data = geometry.copy()
-                    geom_data.pop(constants.DATA)
+
+                    geo_type = geom_data[constants.TYPE].lower()
+                    if geo_type == constants.GEOMETRY.lower():
+                        import sys;sys.exit(0)
+                        geom_data.pop(constants.DATA)
 
                     dirname = os.path.dirname(self.filepath)
                     url = 'geometry.%s%s' % (geometry.node, extension)

+ 85 - 2
utils/exporters/blender/tests/scripts/js/review.js

@@ -60,11 +60,44 @@ function setupLights() {
 
 }
 
+function loadObject( data ) {
+
+    var loader = new THREE.ObjectLoader();
+    scene = loader.parse( data );
+
+
+    var hasLights = false;
+
+    var lights = ['AmbientLight', 'DirectionalLight', 'AreaLight',
+        'PointLight', 'SpotLight', 'HemisphereLight']
+
+    for ( i = 0; i < data.object.children.length; i ++ ) {
+
+        var index = lights.indexOf( data.object.children[ i ].type );
+
+        if ( index > -1 ) {
+
+            hasLights = true;
+            break;
+
+        }
+
+    }
+
+    if ( ! ( hasLights ) ) setupLights();
+
+    scene.add( new THREE.GridHelper( 10, 2.5 ) );
+
+    render();
+
+}
+
 function loadGeometry( data, url ) {
 
     var loader = new THREE.JSONLoader();
     var texturePath = loader.extractUrlBase( url );
     data = loader.parse( data, texturePath );
+
     if ( data.materials === undefined ) {
     
         console.log('using default material');
@@ -75,22 +108,72 @@ function loadGeometry( data, url ) {
     var material = new THREE.MeshFaceMaterial( data.materials ); 
     var mesh;
 
-    mesh = new THREE.Mesh( data.geometry, material );
+    if ( data.geometry.animation !== undefined ) {
+
+        console.log( 'loading animation' );
+        data.materials[ 0 ].skinning = true;
+        mesh = new THREE.SkinnedMesh( data.geometry, material, false);
+
+        var name = data.geometry.animation.name;
+        animation = new THREE.Animation( mesh, data.geometry.animation );
+
+    } else {
+
+        mesh = new THREE.Mesh( data.geometry, material );
+
+    }
 
     setupScene();
     setupLights();
     scene.add( mesh );
 
+    if ( animation != null ) {
+
+        console.log( 'playing animation' );
+        animation.play();
+        animate();
+
+    } else {
+
+        render();
+
+    }
+}
+
+function loadBufferGeometry( data ) {
+
+    var loader = new THREE.BufferGeometryLoader();
+
+    var bufferGeometry = loader.parse( data );
+
+    var material = new THREE.MeshLambertMaterial( { color: 0xb8b8b8 } );
+    var mesh = new THREE.Mesh( bufferGeometry, material );
+    setupScene();
+    setupLights();
+    scene.add( mesh );
+
     render();
 
 }
 
 function loadData( data, url ) {
 
-    if ( data.metadata.type == 'Geometry' ) {
+    if ( data.metadata.type === 'Geometry' ) {
         
         loadGeometry( data, url );
     
+    } else if ( data.metadata.type === 'Object' ) {
+    
+        loadObject( data );
+
+    } else if ( data.metadata.type === 'BufferGeometry' ) {
+
+        loadBufferGeometry( data );
+
+    } else {
+
+        console.warn( 'can not determine type' );
+
     }
 
 }

+ 4 - 0
utils/exporters/blender/tests/scripts/setup_test_env.bash

@@ -16,6 +16,10 @@ export BLEND=$(cd "$DIR/../blend"; pwd)
 export PYSCRIPT="$DIR/exporter.py"
 
 function makereview() {
+    if [ ! -f "$JSON" ]; then
+        echo "no json, export error suspected"
+        exit 1
+    fi
     python3 "$DIR/review.py" $JSON $@
 }
 

+ 1 - 1
utils/exporters/blender/tests/scripts/test_buffer_geometry.bash

@@ -4,5 +4,5 @@ DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
 source "$DIR/setup_test_env.bash"
 
 blender --background $BLEND/cubeA.blend --python $PYSCRIPT -- \
-    $JSON --vertices --faces --geometryType BufferGeometry
+    $JSON --vertices --normals --geometryType BufferGeometry
 makereview $@ --tag $(tagname)

+ 9 - 0
utils/exporters/blender/tests/scripts/test_scene_buffer_geometry.bash

@@ -0,0 +1,9 @@
+#!/bin/bash
+
+DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
+source "$DIR/setup_test_env.bash"
+
+blender --background $BLEND/cubeA.blend --python $PYSCRIPT -- \
+    $JSON --vertices --normals --geometryType BufferGeometry \
+    --scene --materials #--embedGeometry 
+makereview $@ --tag $(tagname)