From 1859fe4057d7e6b4d45d8da2f3de0e018b68f852 Mon Sep 17 00:00:00 2001 From: alteredq Date: Fri, 25 Mar 2011 04:39:04 +0100 Subject: [PATCH] Updated Blender exporter to be able to export scenes. Work-in-progress. So close yet so far. Test scene almost works, just two things are not rotated properly (which means maybe everything will need to be reworked :( --- examples/obj/blenderscene/scene.Cube.js | 47 ++ examples/obj/blenderscene/scene.Monkey.js | 47 ++ examples/obj/blenderscene/scene.Plane.js | 47 ++ examples/obj/blenderscene/scene.blend | Bin 0 -> 512652 bytes examples/obj/blenderscene/scene.js | 359 ++++++++++ examples/webgl_scene_test_blender.html | 561 +++++++++++++++ .../scripts/op/io_mesh_threejs/__init__.py | 20 +- .../op/io_mesh_threejs/export_threejs.py | 667 ++++++++++++++++-- 8 files changed, 1695 insertions(+), 53 deletions(-) create mode 100644 examples/obj/blenderscene/scene.Cube.js create mode 100644 examples/obj/blenderscene/scene.Monkey.js create mode 100644 examples/obj/blenderscene/scene.Plane.js create mode 100644 examples/obj/blenderscene/scene.blend create mode 100644 examples/obj/blenderscene/scene.js create mode 100644 examples/webgl_scene_test_blender.html diff --git a/examples/obj/blenderscene/scene.Cube.js b/examples/obj/blenderscene/scene.Cube.js new file mode 100644 index 00000000..87815667 --- /dev/null +++ b/examples/obj/blenderscene/scene.Cube.js @@ -0,0 +1,47 @@ +/* + * File generated with Blender 2.56 Exporter + * https://github.com/mrdoob/three.js/tree/master/utils/exporters/blender/ + * + * vertices: 8 + * faces: 6 + * normals: 0 + * uvs: 0 + * colors: 0 + * materials: 1 + * + */ + +var model = { + + 'version' : 2, + + 'materials': [ { + "DbgColor" : 0xeeeeee, + "DbgIndex" : 0, + "DbgName" : "Material", + "colorAmbient" : [0.0, 0.0, 0.0], + "colorDiffuse" : [0.6400000190734865, 0.10179081114814892, 0.126246120426746], + "colorSpecular" : [0.5, 0.5, 0.5], + "shading" : "Phong", + "specularCoef" : 50, + "transparency" : 1.0, + "vertexColors" : false + }], + + 'vertices': [1.000000,-1.000000,-1.000000,1.000000,-1.000000,1.000000,-1.000000,-1.000000,1.000000,-1.000000,-1.000000,-1.000000,1.000000,1.000000,-1.000000,0.999999,1.000000,1.000001,-1.000000,1.000000,1.000000,-1.000000,1.000000,-1.000000], + + 'morphTargets': [], + + 'normals': [], + + 'colors': [], + + 'uvs': [[]], + + 'faces': [3,0,1,2,3,0,3,4,7,6,5,0,3,0,4,5,1,0,3,1,5,6,2,0,3,2,6,7,3,0,3,4,0,3,7,0], + + 'end': (new Date).getTime() + +} + +postMessage( model ); diff --git a/examples/obj/blenderscene/scene.Monkey.js b/examples/obj/blenderscene/scene.Monkey.js new file mode 100644 index 00000000..f6826252 --- /dev/null +++ b/examples/obj/blenderscene/scene.Monkey.js @@ -0,0 +1,47 @@ +/* + * File generated with Blender 2.56 Exporter + * https://github.com/mrdoob/three.js/tree/master/utils/exporters/blender/ + * + * vertices: 507 + * faces: 500 + * normals: 0 + * uvs: 0 + * colors: 0 + * materials: 1 + * + */ + +var model = { + + 'version' : 2, + + 'materials': [ { + "DbgColor" : 0xeeeeee, + "DbgIndex" : 0, + "DbgName" : "Material.002", + "colorAmbient" : [0.0, 0.0, 0.0], + "colorDiffuse" : [0.6400000190734865, 0.44102483452893537, 0.14499310471107218], + "colorSpecular" : [0.5, 0.5, 0.5], + "shading" : "Phong", + "specularCoef" : 50, + "transparency" : 1.0, + "vertexColors" : false + }], + + 'vertices': [0.437500,0.765625,-0.164063,-0.437500,0.765625,-0.164063,0.500000,0.687500,-0.093750,-0.500000,0.687500,-0.093750,0.546875,0.578125,-0.054688,-0.546875,0.578125,-0.054688,0.351562,0.617188,0.023437,-0.351562,0.617188,0.023437,0.351562,0.718750,-0.031250,-0.351562,0.718750,-0.031250,0.351562,0.781250,-0.132813,-0.351562,0.781250,-0.132813,0.273438,0.796875,-0.164063,-0.273438,0.796875,-0.164063,0.203125,0.742188,-0.093750,-0.203125,0.742188,-0.093750,0.156250,0.648438,-0.054688,-0.156250,0.648438,-0.054688,0.078125,0.656250,-0.242188,-0.078125,0.656250,-0.242188,0.140625,0.742188,-0.242188,-0.140625,0.742188,-0.242188,0.242188,0.796875,-0.242188,-0.242188,0.796875,-0.242188,0.273438,0.796875,-0.328125,-0.273438,0.796875,-0.328125,0.203125,0.742188,-0.390625,-0.203125,0.742188,-0.390625,0.156250,0.648438,-0.437500,-0.156250,0.648438,-0.437500,0.351562,0.617188,-0.515625,-0.351562,0.617188,-0.515625,0.351562,0.718750,-0.453125,-0.351562,0.718750,-0.453125,0.351562,0.781250,-0.359375,-0.351562,0.781250,-0.359375,0.437500,0.765625,-0.328125,-0.437500,0.765625,-0.328125,0.500000,0.687500,-0.390625,-0.500000,0.687500,-0.390625,0.546875,0.578125,-0.437500,-0.546875,0.578125,-0.437500,0.625000,0.562500,-0.242188,-0.625000,0.562500,-0.242188,0.562500,0.671875,-0.242188,-0.562500,0.671875,-0.242188,0.468750,0.757812,-0.242188,-0.468750,0.757812,-0.242188,0.476562,0.773438,-0.242188,-0.476562,0.773438,-0.242188,0.445312,0.781250,-0.335938,-0.445312,0.781250,-0.335938,0.351562,0.804688,-0.375000,-0.351562,0.804688,-0.375000,0.265625,0.820312,-0.335938,-0.265625,0.820312,-0.335938,0.226562,0.820312,-0.242188,-0.226562,0.820312,-0.242188,0.265625,0.820312,-0.156250,-0.265625,0.820312,-0.156250,0.351562,0.828125,-0.242188,-0.351562,0.828125,-0.242188,0.351562,0.804688,-0.117188,-0.351562,0.804688,-0.117188,0.445312,0.781250,-0.156250,-0.445312,0.781250,-0.156250,0.000000,0.742188,-0.429688,0.000000,0.820312,-0.351563,0.000000,0.734375,0.679687,0.000000,0.781250,0.320312,0.000000,0.796875,0.187500,0.000000,0.718750,0.773437,0.000000,0.601562,-0.406250,0.000000,0.570312,-0.570312,0.000000,-0.546875,-0.898438,0.000000,-0.851562,-0.562500,0.000000,-0.828125,-0.070312,0.000000,-0.351562,0.382813,0.203125,0.562500,0.187500,-0.203125,0.562500,0.187500,0.312500,0.570312,0.437500,-0.312500,0.570312,0.437500,0.351562,0.570313,0.695312,-0.351562,0.570313,0.695312,0.367188,0.531250,0.890625,-0.367188,0.531250,0.890625,0.328125,0.523438,0.945312,-0.328125,0.523438,0.945312,0.179688,0.554688,0.968750,-0.179688,0.554688,0.968750,0.000000,0.578125,0.984375,0.437500,0.531250,0.140625,-0.437500,0.531250,0.140625,0.632812,0.539062,0.039062,-0.632812,0.539062,0.039062,0.828125,0.445312,-0.148438,-0.828125,0.445312,-0.148438,0.859375,0.593750,-0.429688,-0.859375,0.593750,-0.429688,0.710938,0.625000,-0.484375,-0.710938,0.625000,-0.484375,0.492188,0.687500,-0.601563,-0.492188,0.687500,-0.601563,0.320312,0.734375,-0.757813,-0.320312,0.734375,-0.757813,0.156250,0.757812,-0.718750,-0.156250,0.757812,-0.718750,0.062500,0.750000,-0.492188,-0.062500,0.750000,-0.492188,0.164062,0.773438,-0.414063,-0.164062,0.773438,-0.414063,0.125000,0.765625,-0.304688,-0.125000,0.765625,-0.304688,0.203125,0.742188,-0.093750,-0.203125,0.742188,-0.093750,0.375000,0.703125,-0.015625,-0.375000,0.703125,-0.015625,0.492188,0.671875,-0.062500,-0.492188,0.671875,-0.062500,0.625000,0.648438,-0.187500,-0.625000,0.648438,-0.187500,0.640625,0.648438,-0.296875,-0.640625,0.648438,-0.296875,0.601562,0.664062,-0.375000,-0.601562,0.664062,-0.375000,0.429688,0.718750,-0.437500,-0.429688,0.718750,-0.437500,0.250000,0.757812,-0.468750,-0.250000,0.757812,-0.468750,0.000000,0.734375,0.765625,0.109375,0.734375,0.718750,-0.109375,0.734375,0.718750,0.117188,0.710938,0.835937,-0.117188,0.710938,0.835937,0.062500,0.695313,0.882812,-0.062500,0.695313,0.882812,0.000000,0.687500,0.890625,0.000000,0.750000,0.195312,0.000000,0.742188,0.140625,0.101562,0.742188,0.148437,-0.101562,0.742188,0.148437,0.125000,0.750000,0.226562,-0.125000,0.750000,0.226562,0.085938,0.742188,0.289062,-0.085938,0.742188,0.289062,0.398438,0.671875,0.046875,-0.398438,0.671875,0.046875,0.617188,0.625000,-0.054688,-0.617188,0.625000,-0.054688,0.726562,0.601562,-0.203125,-0.726562,0.601562,-0.203125,0.742188,0.656250,-0.375000,-0.742188,0.656250,-0.375000,0.687500,0.726562,-0.414063,-0.687500,0.726562,-0.414063,0.437500,0.796875,-0.546875,-0.437500,0.796875,-0.546875,0.312500,0.835938,-0.640625,-0.312500,0.835938,-0.640625,0.203125,0.851562,-0.617188,-0.203125,0.851562,-0.617188,0.101562,0.843750,-0.429688,-0.101562,0.843750,-0.429688,0.125000,0.812500,0.101562,-0.125000,0.812500,0.101562,0.210938,0.710938,0.445312,-0.210938,0.710938,0.445312,0.250000,0.687500,0.703125,-0.250000,0.687500,0.703125,0.265625,0.664063,0.820312,-0.265625,0.664063,0.820312,0.234375,0.632813,0.914062,-0.234375,0.632813,0.914062,0.164062,0.632813,0.929688,-0.164062,0.632813,0.929688,0.000000,0.640625,0.945312,0.000000,0.726562,-0.046875,0.000000,0.765625,-0.210938,0.328125,0.742188,-0.476563,-0.328125,0.742188,-0.476563,0.164062,0.750000,-0.140625,-0.164062,0.750000,-0.140625,0.132812,0.757812,-0.210938,-0.132812,0.757812,-0.210938,0.117188,0.734375,0.687500,-0.117188,0.734375,0.687500,0.078125,0.750000,0.445312,-0.078125,0.750000,0.445312,0.000000,0.750000,0.445312,0.000000,0.742188,0.328125,0.093750,0.781250,0.273437,-0.093750,0.781250,0.273437,0.132812,0.796875,0.226562,-0.132812,0.796875,0.226562,0.109375,0.781250,0.132812,-0.109375,0.781250,0.132812,0.039062,0.781250,0.125000,-0.039062,0.781250,0.125000,0.000000,0.828125,0.203125,0.046875,0.812500,0.148437,-0.046875,0.812500,0.148437,0.093750,0.812500,0.156250,-0.093750,0.812500,0.156250,0.109375,0.828125,0.226562,-0.109375,0.828125,0.226562,0.078125,0.804688,0.250000,-0.078125,0.804688,0.250000,0.000000,0.804688,0.289062,0.257812,0.554688,0.312500,-0.257812,0.554688,0.312500,0.164062,0.710938,0.242187,-0.164062,0.710938,0.242187,0.179688,0.710938,0.312500,-0.179688,0.710938,0.312500,0.234375,0.554688,0.250000,-0.234375,0.554688,0.250000,0.000000,0.687500,0.875000,0.046875,0.687500,0.867187,-0.046875,0.687500,0.867187,0.093750,0.710938,0.820312,-0.093750,0.710938,0.820312,0.093750,0.726563,0.742187,-0.093750,0.726563,0.742187,0.000000,0.656250,0.781250,0.093750,0.664063,0.750000,-0.093750,0.664063,0.750000,0.093750,0.640625,0.812500,-0.093750,0.640625,0.812500,0.046875,0.632813,0.851562,-0.046875,0.632813,0.851562,0.000000,0.632813,0.859375,0.171875,0.781250,-0.218750,-0.171875,0.781250,-0.218750,0.187500,0.773438,-0.156250,-0.187500,0.773438,-0.156250,0.335938,0.757812,-0.429688,-0.335938,0.757812,-0.429688,0.273438,0.773438,-0.421875,-0.273438,0.773438,-0.421875,0.421875,0.773438,-0.398438,-0.421875,0.773438,-0.398438,0.562500,0.695312,-0.351563,-0.562500,0.695312,-0.351563,0.585938,0.687500,-0.289063,-0.585938,0.687500,-0.289063,0.578125,0.679688,-0.195313,-0.578125,0.679688,-0.195313,0.476562,0.718750,-0.101563,-0.476562,0.718750,-0.101563,0.375000,0.742188,-0.062500,-0.375000,0.742188,-0.062500,0.226562,0.781250,-0.109375,-0.226562,0.781250,-0.109375,0.179688,0.781250,-0.296875,-0.179688,0.781250,-0.296875,0.210938,0.781250,-0.375000,-0.210938,0.781250,-0.375000,0.234375,0.757812,-0.359375,-0.234375,0.757812,-0.359375,0.195312,0.757812,-0.296875,-0.195312,0.757812,-0.296875,0.242188,0.757812,-0.125000,-0.242188,0.757812,-0.125000,0.375000,0.726562,-0.085938,-0.375000,0.726562,-0.085938,0.460938,0.703125,-0.117188,-0.460938,0.703125,-0.117188,0.546875,0.671875,-0.210938,-0.546875,0.671875,-0.210938,0.554688,0.671875,-0.281250,-0.554688,0.671875,-0.281250,0.531250,0.679688,-0.335938,-0.531250,0.679688,-0.335938,0.414062,0.750000,-0.390625,-0.414062,0.750000,-0.390625,0.281250,0.765625,-0.398438,-0.281250,0.765625,-0.398438,0.335938,0.750000,-0.406250,-0.335938,0.750000,-0.406250,0.203125,0.750000,-0.171875,-0.203125,0.750000,-0.171875,0.195312,0.750000,-0.226563,-0.195312,0.750000,-0.226563,0.109375,0.609375,-0.460938,-0.109375,0.609375,-0.460938,0.195312,0.617188,-0.664062,-0.195312,0.617188,-0.664062,0.335938,0.593750,-0.687500,-0.335938,0.593750,-0.687500,0.484375,0.554688,-0.554688,-0.484375,0.554688,-0.554688,0.679688,0.492187,-0.453125,-0.679688,0.492187,-0.453125,0.796875,0.460937,-0.406250,-0.796875,0.460937,-0.406250,0.773438,0.375000,-0.164063,-0.773438,0.375000,-0.164063,0.601562,0.414062,-0.000000,-0.601562,0.414062,-0.000000,0.437500,0.468750,0.093750,-0.437500,0.468750,0.093750,0.000000,0.289062,-0.898438,0.000000,-0.078125,-0.984375,0.000000,-0.671875,0.195313,0.000000,0.187500,0.460938,0.000000,0.460938,0.976562,0.000000,0.343750,0.804688,0.000000,0.320313,0.570312,0.000000,0.281250,0.484375,0.851562,0.054687,-0.234375,-0.851562,0.054687,-0.234375,0.859375,-0.046875,-0.320312,-0.859375,-0.046875,-0.320312,0.773438,-0.437500,-0.265625,-0.773438,-0.437500,-0.265625,0.460938,-0.703125,-0.437500,-0.460938,-0.703125,-0.437500,0.734375,0.070312,0.046875,-0.734375,0.070312,0.046875,0.593750,-0.164062,0.125000,-0.593750,-0.164062,0.125000,0.640625,-0.429688,0.007813,-0.640625,-0.429688,0.007813,0.335938,-0.664062,-0.054687,-0.335938,-0.664062,-0.054687,0.234375,0.406250,0.351562,-0.234375,0.406250,0.351562,0.179688,0.257813,0.414062,-0.179688,0.257813,0.414062,0.289062,0.382813,0.710938,-0.289062,0.382813,0.710938,0.250000,0.390625,0.500000,-0.250000,0.390625,0.500000,0.328125,0.398438,0.914062,-0.328125,0.398438,0.914062,0.140625,0.367188,0.757812,-0.140625,0.367188,0.757812,0.125000,0.359375,0.539062,-0.125000,0.359375,0.539062,0.164062,0.437500,0.945312,-0.164062,0.437500,0.945312,0.218750,0.429688,0.281250,-0.218750,0.429688,0.281250,0.210938,0.468750,0.226562,-0.210938,0.468750,0.226562,0.203125,0.500000,0.171875,-0.203125,0.500000,0.171875,0.210938,0.164063,0.390625,-0.210938,0.164063,0.390625,0.296875,-0.265625,0.312500,-0.296875,-0.265625,0.312500,0.343750,-0.539062,0.148438,-0.343750,-0.539062,0.148438,0.453125,-0.382813,-0.867188,-0.453125,-0.382813,-0.867188,0.453125,-0.070313,-0.929688,-0.453125,-0.070313,-0.929688,0.453125,0.234375,-0.851562,-0.453125,0.234375,-0.851562,0.460938,0.429687,-0.523438,-0.460938,0.429687,-0.523438,0.726562,0.335937,-0.406250,-0.726562,0.335937,-0.406250,0.632812,0.281250,-0.453125,-0.632812,0.281250,-0.453125,0.640625,0.054687,-0.703125,-0.640625,0.054687,-0.703125,0.796875,0.125000,-0.562500,-0.796875,0.125000,-0.562500,0.796875,-0.117188,-0.617188,-0.796875,-0.117188,-0.617188,0.640625,-0.195313,-0.750000,-0.640625,-0.195313,-0.750000,0.640625,-0.445313,-0.679688,-0.640625,-0.445313,-0.679688,0.796875,-0.359375,-0.539062,-0.796875,-0.359375,-0.539062,0.617188,-0.585938,-0.328125,-0.617188,-0.585938,-0.328125,0.484375,-0.546875,-0.023437,-0.484375,-0.546875,-0.023437,0.820312,-0.203125,-0.328125,-0.820312,-0.203125,-0.328125,0.406250,0.148438,0.171875,-0.406250,0.148438,0.171875,0.429688,-0.210937,0.195313,-0.429688,-0.210937,0.195313,0.890625,-0.234375,-0.406250,-0.890625,-0.234375,-0.406250,0.773438,-0.125000,0.140625,-0.773438,-0.125000,0.140625,1.039062,-0.328125,0.101563,-1.039062,-0.328125,0.101563,1.281250,-0.429688,-0.054687,-1.281250,-0.429688,-0.054687,1.351562,-0.421875,-0.320312,-1.351562,-0.421875,-0.320312,1.234375,-0.421875,-0.507812,-1.234375,-0.421875,-0.507812,1.023438,-0.312500,-0.476562,-1.023438,-0.312500,-0.476562,1.015625,-0.289063,-0.414062,-1.015625,-0.289063,-0.414062,1.187500,-0.390625,-0.437500,-1.187500,-0.390625,-0.437500,1.265625,-0.406250,-0.289062,-1.265625,-0.406250,-0.289062,1.210938,-0.406250,-0.078125,-1.210938,-0.406250,-0.078125,1.031250,-0.304688,0.039063,-1.031250,-0.304688,0.039063,0.828125,-0.132812,0.070313,-0.828125,-0.132812,0.070313,0.921875,-0.218750,-0.359375,-0.921875,-0.218750,-0.359375,0.945312,-0.289062,-0.304688,-0.945312,-0.289062,-0.304688,0.882812,-0.210938,0.023438,-0.882812,-0.210938,0.023438,1.039062,-0.367188,0.000000,-1.039062,-0.367188,0.000000,1.187500,-0.445312,-0.093750,-1.187500,-0.445312,-0.093750,1.234375,-0.445312,-0.250000,-1.234375,-0.445312,-0.250000,1.171875,-0.437500,-0.359375,-1.171875,-0.437500,-0.359375,1.023438,-0.359375,-0.343750,-1.023438,-0.359375,-0.343750,0.843750,-0.210938,-0.289062,-0.843750,-0.210938,-0.289062,0.835938,-0.273438,-0.171875,-0.835938,-0.273438,-0.171875,0.757812,-0.273438,-0.093750,-0.757812,-0.273438,-0.093750,0.820312,-0.273438,-0.085937,-0.820312,-0.273438,-0.085937,0.843750,-0.273438,-0.015625,-0.843750,-0.273438,-0.015625,0.812500,-0.273438,0.015625,-0.812500,-0.273438,0.015625,0.726562,-0.070312,0.000000,-0.726562,-0.070312,0.000000,0.718750,-0.171875,0.023438,-0.718750,-0.171875,0.023438,0.718750,-0.187500,-0.039062,-0.718750,-0.187500,-0.039062,0.796875,-0.210938,-0.203125,-0.796875,-0.210938,-0.203125,0.890625,-0.265625,-0.242187,-0.890625,-0.265625,-0.242187,0.890625,-0.320312,-0.234375,-0.890625,-0.320312,-0.234375,0.812500,-0.320312,0.015625,-0.812500,-0.320312,0.015625,0.851562,-0.320312,-0.015625,-0.851562,-0.320312,-0.015625,0.828125,-0.320312,-0.078125,-0.828125,-0.320312,-0.078125,0.765625,-0.320312,-0.093750,-0.765625,-0.320312,-0.093750,0.843750,-0.320312,-0.171875,-0.843750,-0.320312,-0.171875,1.039062,-0.414062,-0.328125,-1.039062,-0.414062,-0.328125,1.187500,-0.484375,-0.343750,-1.187500,-0.484375,-0.343750,1.257812,-0.492188,-0.242187,-1.257812,-0.492188,-0.242187,1.210938,-0.484375,-0.085937,-1.210938,-0.484375,-0.085937,1.046875,-0.421875,0.000000,-1.046875,-0.421875,0.000000,0.882812,-0.265625,0.015625,-0.882812,-0.265625,0.015625,0.953125,-0.343750,-0.289062,-0.953125,-0.343750,-0.289062,0.890625,-0.328125,-0.109375,-0.890625,-0.328125,-0.109375,0.937500,-0.335938,-0.062500,-0.937500,-0.335938,-0.062500,1.000000,-0.367188,-0.125000,-1.000000,-0.367188,-0.125000,0.960938,-0.351562,-0.171875,-0.960938,-0.351562,-0.171875,1.015625,-0.375000,-0.234375,-1.015625,-0.375000,-0.234375,1.054688,-0.382812,-0.187500,-1.054688,-0.382812,-0.187500,1.109375,-0.390625,-0.210937,-1.109375,-0.390625,-0.210937,1.085938,-0.390625,-0.273437,-1.085938,-0.390625,-0.273437,1.023438,-0.484375,-0.437500,-1.023438,-0.484375,-0.437500,1.250000,-0.546875,-0.468750,-1.250000,-0.546875,-0.468750,1.367188,-0.500000,-0.296875,-1.367188,-0.500000,-0.296875,1.312500,-0.531250,-0.054687,-1.312500,-0.531250,-0.054687,1.039062,-0.492188,0.085938,-1.039062,-0.492188,0.085938,0.789062,-0.328125,0.125000,-0.789062,-0.328125,0.125000,0.859375,-0.382813,-0.382812,-0.859375,-0.382813,-0.382812], + + 'morphTargets': [], + + 'normals': [], + + 'colors': [], + + 'uvs': [[]], + + 'faces': [3,46,0,2,44,0,3,3,1,47,45,0,3,44,2,4,42,0,3,5,3,45,43,0,3,2,8,6,4,0,3,7,9,3,5,0,3,0,10,8,2,0,3,9,11,1,3,0,3,10,12,14,8,0,3,15,13,11,9,0,3,8,14,16,6,0,3,17,15,9,7,0,3,14,20,18,16,0,3,19,21,15,17,0,3,12,22,20,14,0,3,21,23,13,15,0,3,22,24,26,20,0,3,27,25,23,21,0,3,20,26,28,18,0,3,29,27,21,19,0,3,26,32,30,28,0,3,31,33,27,29,0,3,24,34,32,26,0,3,33,35,25,27,0,3,34,36,38,32,0,3,39,37,35,33,0,3,32,38,40,30,0,3,41,39,33,31,0,3,38,44,42,40,0,3,43,45,39,41,0,3,36,46,44,38,0,3,45,47,37,39,0,3,46,36,50,48,0,3,51,37,47,49,0,3,36,34,52,50,0,3,53,35,37,51,0,3,34,24,54,52,0,3,55,25,35,53,0,3,24,22,56,54,0,3,57,23,25,55,0,3,22,12,58,56,0,3,59,13,23,57,0,3,12,10,62,58,0,3,63,11,13,59,0,3,10,0,64,62,0,3,65,1,11,63,0,3,0,46,48,64,0,3,49,47,1,65,0,2,60,64,48,0,2,49,65,61,0,2,62,64,60,0,2,61,65,63,0,2,60,58,62,0,2,63,59,61,0,2,60,56,58,0,2,59,57,61,0,2,60,54,56,0,2,57,55,61,0,2,60,52,54,0,2,55,53,61,0,2,60,50,52,0,2,53,51,61,0,2,60,48,50,0,2,51,49,61,0,3,88,173,175,90,0,3,175,174,89,90,0,3,86,171,173,88,0,3,174,172,87,89,0,3,84,169,171,86,0,3,172,170,85,87,0,3,82,167,169,84,0,3,170,168,83,85,0,3,80,165,167,82,0,3,168,166,81,83,0,3,78,91,145,163,0,3,146,92,79,164,0,3,91,93,147,145,0,3,148,94,92,146,0,3,93,95,149,147,0,3,150,96,94,148,0,3,95,97,151,149,0,3,152,98,96,150,0,3,97,99,153,151,0,3,154,100,98,152,0,3,99,101,155,153,0,3,156,102,100,154,0,3,101,103,157,155,0,3,158,104,102,156,0,3,103,105,159,157,0,3,160,106,104,158,0,3,105,107,161,159,0,3,162,108,106,160,0,3,107,66,67,161,0,3,67,66,108,162,0,3,109,127,159,161,0,3,160,128,110,162,0,3,127,178,157,159,0,3,158,179,128,160,0,3,125,155,157,178,0,3,158,156,126,179,0,3,123,153,155,125,0,3,156,154,124,126,0,3,121,151,153,123,0,3,154,152,122,124,0,3,119,149,151,121,0,3,152,150,120,122,0,3,117,147,149,119,0,3,150,148,118,120,0,3,115,145,147,117,0,3,148,146,116,118,0,3,113,163,145,115,0,3,146,164,114,116,0,3,113,180,176,163,0,3,176,181,114,164,0,3,109,161,67,111,0,3,67,162,110,112,0,3,111,67,177,182,0,3,177,67,112,183,0,3,176,180,182,177,0,3,183,181,176,177,0,3,134,136,175,173,0,3,175,136,135,174,0,3,132,134,173,171,0,3,174,135,133,172,0,3,130,132,171,169,0,3,172,133,131,170,0,3,165,186,184,167,0,3,185,187,166,168,0,3,130,169,167,184,0,3,168,170,131,185,0,3,143,189,188,186,0,3,188,189,144,187,0,3,184,186,188,68,0,3,188,187,185,68,0,3,129,130,184,68,0,3,185,131,129,68,0,3,141,192,190,143,0,3,191,193,142,144,0,3,139,194,192,141,0,3,193,195,140,142,0,3,138,196,194,139,0,3,195,197,138,140,0,3,137,70,196,138,0,3,197,70,137,138,0,3,189,143,190,69,0,3,191,144,189,69,0,3,69,190,205,207,0,3,206,191,69,207,0,3,70,198,199,196,0,3,200,198,70,197,0,3,196,199,201,194,0,3,202,200,197,195,0,3,194,201,203,192,0,3,204,202,195,193,0,3,192,203,205,190,0,3,206,204,193,191,0,3,198,203,201,199,0,3,202,204,198,200,0,3,198,207,205,203,0,3,206,207,198,204,0,3,138,139,163,176,0,3,164,140,138,176,0,3,139,141,210,163,0,3,211,142,140,164,0,3,141,143,212,210,0,3,213,144,142,211,0,3,143,186,165,212,0,3,166,187,144,213,0,3,80,208,212,165,0,3,213,209,81,166,0,3,208,214,210,212,0,3,211,215,209,213,0,3,78,163,210,214,0,3,211,164,79,215,0,3,130,129,71,221,0,3,71,129,131,222,0,3,132,130,221,219,0,3,222,131,133,220,0,3,134,132,219,217,0,3,220,133,135,218,0,3,136,134,217,216,0,3,218,135,136,216,0,3,216,217,228,230,0,3,229,218,216,230,0,3,217,219,226,228,0,3,227,220,218,229,0,3,219,221,224,226,0,3,225,222,220,227,0,3,221,71,223,224,0,3,223,71,222,225,0,3,223,230,228,224,0,3,229,230,223,225,0,2,224,228,226,0,2,227,229,225,0,3,182,180,233,231,0,3,234,181,183,232,0,3,111,182,231,253,0,3,232,183,112,254,0,3,109,111,253,255,0,3,254,112,110,256,0,3,180,113,251,233,0,3,252,114,181,234,0,3,113,115,249,251,0,3,250,116,114,252,0,3,115,117,247,249,0,3,248,118,116,250,0,3,117,119,245,247,0,3,246,120,118,248,0,3,119,121,243,245,0,3,244,122,120,246,0,3,121,123,241,243,0,3,242,124,122,244,0,3,123,125,239,241,0,3,240,126,124,242,0,3,125,178,235,239,0,3,236,179,126,240,0,3,178,127,237,235,0,3,238,128,179,236,0,3,127,109,255,237,0,3,256,110,128,238,0,3,237,255,257,275,0,3,258,256,238,276,0,3,235,237,275,277,0,3,276,238,236,278,0,3,239,235,277,273,0,3,278,236,240,274,0,3,241,239,273,271,0,3,274,240,242,272,0,3,243,241,271,269,0,3,272,242,244,270,0,3,245,243,269,267,0,3,270,244,246,268,0,3,247,245,267,265,0,3,268,246,248,266,0,3,249,247,265,263,0,3,266,248,250,264,0,3,251,249,263,261,0,3,264,250,252,262,0,3,233,251,261,279,0,3,262,252,234,280,0,3,255,253,259,257,0,3,260,254,256,258,0,3,253,231,281,259,0,3,282,232,254,260,0,3,231,233,279,281,0,3,280,234,232,282,0,3,66,107,283,72,0,3,284,108,66,72,0,3,107,105,285,283,0,3,286,106,108,284,0,3,105,103,287,285,0,3,288,104,106,286,0,3,103,101,289,287,0,3,290,102,104,288,0,3,101,99,291,289,0,3,292,100,102,290,0,3,99,97,293,291,0,3,294,98,100,292,0,3,97,95,295,293,0,3,296,96,98,294,0,3,95,93,297,295,0,3,298,94,96,296,0,3,93,91,299,297,0,3,300,92,94,298,0,3,307,308,327,337,0,3,328,308,307,338,0,3,306,307,337,335,0,3,338,307,306,336,0,3,305,306,335,339,0,3,336,306,305,340,0,3,88,90,305,339,0,3,305,90,89,340,0,3,86,88,339,333,0,3,340,89,87,334,0,3,84,86,333,329,0,3,334,87,85,330,0,3,82,84,329,331,0,3,330,85,83,332,0,3,329,335,337,331,0,3,338,336,330,332,0,3,329,333,339,335,0,3,340,334,330,336,0,3,325,331,337,327,0,3,338,332,326,328,0,3,80,82,331,325,0,3,332,83,81,326,0,3,208,341,343,214,0,3,344,342,209,215,0,3,80,325,341,208,0,3,342,326,81,209,0,3,78,214,343,345,0,3,344,215,79,346,0,3,78,345,299,91,0,3,300,346,79,92,0,3,76,323,351,303,0,3,352,324,76,303,0,3,303,351,349,77,0,3,350,352,303,77,0,3,77,349,347,304,0,3,348,350,77,304,0,3,304,347,327,308,0,3,328,348,304,308,0,3,325,327,347,341,0,3,348,328,326,342,0,3,295,297,317,309,0,3,318,298,296,310,0,3,75,315,323,76,0,3,324,316,75,76,0,3,301,357,355,302,0,3,356,358,301,302,0,3,302,355,353,74,0,3,354,356,302,74,0,3,74,353,315,75,0,3,316,354,74,75,0,3,291,293,361,363,0,3,362,294,292,364,0,3,363,361,367,365,0,3,368,362,364,366,0,3,365,367,369,371,0,3,370,368,366,372,0,3,371,369,375,373,0,3,376,370,372,374,0,3,313,377,373,375,0,3,374,378,314,376,0,3,315,353,373,377,0,3,374,354,316,378,0,3,353,355,371,373,0,3,372,356,354,374,0,3,355,357,365,371,0,3,366,358,356,372,0,3,357,359,363,365,0,3,364,360,358,366,0,3,289,291,363,359,0,3,364,292,290,360,0,3,73,359,357,301,0,3,358,360,73,301,0,3,283,285,287,289,0,3,288,286,284,290,0,3,283,289,359,73,0,3,360,290,284,73,0,2,72,283,73,0,2,73,284,72,0,3,293,295,309,361,0,3,310,296,294,362,0,3,309,311,367,361,0,3,368,312,310,362,0,3,311,381,369,367,0,3,370,382,312,368,0,3,313,375,369,381,0,3,370,376,314,382,0,3,347,349,385,383,0,3,386,350,348,384,0,3,317,383,385,319,0,3,386,384,318,320,0,3,297,299,383,317,0,3,384,300,298,318,0,3,299,343,341,383,0,3,342,344,300,384,0,2,341,347,383,0,2,384,348,342,0,2,299,345,343,0,2,344,346,300,0,3,313,321,379,377,0,3,380,322,314,378,0,3,315,377,379,323,0,3,380,378,316,324,0,3,319,385,379,321,0,3,380,386,320,322,0,3,349,351,379,385,0,3,380,352,350,386,0,2,323,379,351,0,2,352,380,324,0,3,399,387,413,401,0,3,414,388,400,402,0,3,399,401,403,397,0,3,404,402,400,398,0,3,397,403,405,395,0,3,406,404,398,396,0,3,395,405,407,393,0,3,408,406,396,394,0,3,393,407,409,391,0,3,410,408,394,392,0,3,391,409,411,389,0,3,412,410,392,390,0,3,409,419,417,411,0,3,418,420,410,412,0,3,407,421,419,409,0,3,420,422,408,410,0,3,405,423,421,407,0,3,422,424,406,408,0,3,403,425,423,405,0,3,424,426,404,406,0,3,401,427,425,403,0,3,426,428,402,404,0,3,401,413,415,427,0,3,416,414,402,428,0,3,317,319,443,441,0,3,444,320,318,442,0,3,319,389,411,443,0,3,412,390,320,444,0,3,309,317,441,311,0,3,442,318,310,312,0,3,381,429,413,387,0,3,414,430,382,388,0,3,411,417,439,443,0,3,440,418,412,444,0,3,437,445,443,439,0,3,444,446,438,440,0,3,433,445,437,435,0,3,438,446,434,436,0,3,431,447,445,433,0,3,446,448,432,434,0,3,429,447,431,449,0,3,432,448,430,450,0,3,413,429,449,415,0,3,450,430,414,416,0,3,311,447,429,381,0,3,430,448,312,382,0,3,311,441,445,447,0,3,446,442,312,448,0,2,441,443,445,0,2,446,444,442,0,3,415,449,451,475,0,3,452,450,416,476,0,3,449,431,461,451,0,3,462,432,450,452,0,3,431,433,459,461,0,3,460,434,432,462,0,3,433,435,457,459,0,3,458,436,434,460,0,3,435,437,455,457,0,3,456,438,436,458,0,3,437,439,453,455,0,3,454,440,438,456,0,3,439,417,473,453,0,3,474,418,440,454,0,3,427,415,475,463,0,3,476,416,428,464,0,3,425,427,463,465,0,3,464,428,426,466,0,3,423,425,465,467,0,3,466,426,424,468,0,3,421,423,467,469,0,3,468,424,422,470,0,3,419,421,469,471,0,3,470,422,420,472,0,3,417,419,471,473,0,3,472,420,418,474,0,3,457,455,479,477,0,3,480,456,458,478,0,3,477,479,481,483,0,3,482,480,478,484,0,3,483,481,487,485,0,3,488,482,484,486,0,3,485,487,489,491,0,3,490,488,486,492,0,3,463,475,485,491,0,3,486,476,464,492,0,3,451,483,485,475,0,3,486,484,452,476,0,3,451,461,477,483,0,3,478,462,452,484,0,3,457,477,461,459,0,3,462,478,458,460,0,3,453,473,479,455,0,3,480,474,454,456,0,3,471,481,479,473,0,3,480,482,472,474,0,3,469,487,481,471,0,3,482,488,470,472,0,3,467,489,487,469,0,3,488,490,468,470,0,3,465,491,489,467,0,3,490,492,466,468,0,2,463,491,465,0,2,466,492,464,0,3,391,389,503,501,0,3,504,390,392,502,0,3,393,391,501,499,0,3,502,392,394,500,0,3,395,393,499,497,0,3,500,394,396,498,0,3,397,395,497,495,0,3,498,396,398,496,0,3,399,397,495,493,0,3,496,398,400,494,0,3,387,399,493,505,0,3,494,400,388,506,0,3,493,501,503,505,0,3,504,502,494,506,0,3,493,495,499,501,0,3,500,496,494,502,0,2,495,497,499,0,2,500,498,496,0,3,313,381,387,505,0,3,388,382,314,506,0,3,313,505,503,321,0,3,504,506,314,322,0,3,319,321,503,389,0,3,504,322,320,390,0], + + 'end': (new Date).getTime() + +} + +postMessage( model ); diff --git a/examples/obj/blenderscene/scene.Plane.js b/examples/obj/blenderscene/scene.Plane.js new file mode 100644 index 00000000..758b9669 --- /dev/null +++ b/examples/obj/blenderscene/scene.Plane.js @@ -0,0 +1,47 @@ +/* + * File generated with Blender 2.56 Exporter + * https://github.com/mrdoob/three.js/tree/master/utils/exporters/blender/ + * + * vertices: 4 + * faces: 1 + * normals: 0 + * uvs: 0 + * colors: 0 + * materials: 1 + * + */ + +var model = { + + 'version' : 2, + + 'materials': [ { + "DbgColor" : 0xeeeeee, + "DbgIndex" : 0, + "DbgName" : "Material.001", + "colorAmbient" : [0.0, 0.0, 0.0], + "colorDiffuse" : [0.14462547517754842, 0.6400000190734865, 0.24541190036254967], + "colorSpecular" : [0.5, 0.5, 0.5], + "shading" : "Phong", + "specularCoef" : 50, + "transparency" : 1.0, + "vertexColors" : false + }], + + 'vertices': [1.000000,-0.000000,-1.000000,1.000000,0.000000,1.000000,-1.000000,0.000000,1.000000,-1.000000,-0.000000,-1.000000], + + 'morphTargets': [], + + 'normals': [], + + 'colors': [], + + 'uvs': [[]], + + 'faces': [3,0,3,2,1,0], + + 'end': (new Date).getTime() + +} + +postMessage( model ); diff --git a/examples/obj/blenderscene/scene.blend b/examples/obj/blenderscene/scene.blend new file mode 100644 index 0000000000000000000000000000000000000000..ab1d5cb6bdfec202b5086259e8ec104ee9e5c37d GIT binary patch literal 512652 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 literal 0 HcmV?d00001 diff --git a/examples/obj/blenderscene/scene.js b/examples/obj/blenderscene/scene.js new file mode 100644 index 00000000..fdab9674 --- /dev/null +++ b/examples/obj/blenderscene/scene.js @@ -0,0 +1,359 @@ +// Converted from: scene.blend +// File generated with Blender 2.56 Exporter +// https://github.com/alteredq/three.js/tree/master/utils/exporters/blender/ + + +var scene = { + +"type" : "scene", +"urlBaseType" : "relativeToScene", + + +"objects" : +{ + "Cube.006" : { + "geometry" : "geo_Cube", + "materials" : [ "Material" ], + "position" : [ 10.623673, 3.370784, -0.321692 ], + "rotation" : [ 0.005265, -0.056306, 4.717181 ], + "quaternion": [ 1.000000, 0.000000, 0.000000, 0.000000 ], + "scale" : [ 8.310000, 4.930000, 0.120000 ], + "visible" : true + }, + + "Monkey.018" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ 1.702659, 0.680278, 5.860421 ], + "rotation" : [ 1.413516, 0.081378, -3.204182 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.017" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ 0.081295, 0.639505, 5.808783 ], + "rotation" : [ 1.413516, 0.081378, -3.204182 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.016" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -1.569030, 0.619385, 5.747240 ], + "rotation" : [ 1.413516, 0.081378, -3.204182 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.015" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -3.129120, 0.552267, 5.709269 ], + "rotation" : [ 1.413516, 0.081378, -3.204182 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.014" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -6.386331, 0.382167, 3.004400 ], + "rotation" : [ 1.646237, -0.058425, -1.670593 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.013" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -6.499331, 0.471640, 1.593073 ], + "rotation" : [ 1.646237, -0.058425, -1.670593 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.012" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -6.629794, 0.533840, 0.234131 ], + "rotation" : [ 1.646237, -0.058425, -1.670593 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.011" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -6.713673, 0.629835, -1.008146 ], + "rotation" : [ 1.646237, -0.058425, -1.670593 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 0.435837, 0.435837, 0.435837 ], + "visible" : true + }, + + "Monkey.010" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -2.010442, 1.387332, 24.343616 ], + "rotation" : [ 1.520470, 0.191726, -3.004622 ], + "quaternion": [ -0.587711, 0.550951, 0.566613, 0.173203 ], + "scale" : [ 9.160007, 9.160007, 9.160008 ], + "visible" : true + }, + + "Monkey.009" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -4.292194, 1.826282, -7.975398 ], + "rotation" : [ 1.594819, 0.080713, -0.213986 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Monkey.008" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ 2.151757, 1.891882, -8.065320 ], + "rotation" : [ 1.594819, 0.080713, -0.213986 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Monkey.007" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -0.712512, 2.115002, -8.097841 ], + "rotation" : [ 1.594819, 0.080713, -0.213986 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Cube.005" : { + "geometry" : "geo_Cube", + "materials" : [ "Material" ], + "position" : [ -1.000975, 1.319482, -8.755547 ], + "rotation" : [ 0.000000, 0.000000, -0.000000 ], + "quaternion": [ 1.000000, 0.000000, 0.000000, 0.000000 ], + "scale" : [ 6.130000, 1.690000, 0.070000 ], + "visible" : true + }, + + "Cube.004" : { + "geometry" : "geo_Cube", + "materials" : [ "Material" ], + "position" : [ 2.484517, 2.724846, 7.486932 ], + "rotation" : [ 0.220417, -0.075224, 0.181029 ], + "quaternion": [ 0.988791, 0.112836, 0.027288, -0.093898 ], + "scale" : [ 0.350000, 3.310000, 0.890000 ], + "visible" : true + }, + + "Monkey.006" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ 7.724935, 1.694883, -7.123103 ], + "rotation" : [ 1.835590, 0.083161, -2.048913 ], + "quaternion": [ -0.587711, 0.550951, 0.566613, 0.173203 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Monkey.005" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -6.334642, 0.566791, -6.636147 ], + "rotation" : [ 1.327136, -0.032561, -4.135900 ], + "quaternion": [ -0.587711, 0.550951, 0.566613, 0.173203 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Monkey.004" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -5.384042, 0.444915, 6.194087 ], + "rotation" : [ 0.991213, 0.181430, -5.246078 ], + "quaternion": [ -0.587711, 0.550951, 0.566613, 0.173203 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Monkey.003" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ 3.147747, 1.014840, 4.230884 ], + "rotation" : [ 1.719311, -0.307044, -3.355401 ], + "quaternion": [ -0.587711, 0.550951, 0.566613, 0.173203 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Monkey.002" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -2.668043, 3.008879, 2.153389 ], + "rotation" : [ 1.881970, 0.457870, 4.066133 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Cube.003" : { + "geometry" : "geo_Cube", + "materials" : [ "Material" ], + "position" : [ -3.031251, 0.702044, 1.943665 ], + "rotation" : [ -1.300741, -1.330343, 3.282723 ], + "quaternion": [ 1.000000, 0.000000, 0.000000, 0.000000 ], + "scale" : [ 1.781142, 0.231142, 0.361142 ], + "visible" : true + }, + + "Monkey.001" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ 1.245307, 0.620196, -0.137285 ], + "rotation" : [ 2.339869, -0.286025, -1.394760 ], + "quaternion": [ -0.587711, 0.550951, 0.566613, 0.173203 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Monkey" : { + "geometry" : "geo_Monkey", + "materials" : [ "Material.002" ], + "position" : [ -0.282500, 1.813606, -4.272932 ], + "rotation" : [ 0.646062, -0.219349, -0.010569 ], + "quaternion": [ 0.942751, 0.314982, 0.105460, -0.029764 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Cube.002" : { + "geometry" : "geo_Cube", + "materials" : [ "Material" ], + "position" : [ 0.042212, 5.536832, -0.199037 ], + "rotation" : [ 0.000000, 0.000000, -0.000000 ], + "quaternion": [ 1.000000, 0.000000, 0.000000, 0.000000 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Cube.001" : { + "geometry" : "geo_Cube", + "materials" : [ "Material" ], + "position" : [ -0.395497, 1.009696, -3.944532 ], + "rotation" : [ 0.000000, 0.000000, -0.000000 ], + "quaternion": [ 1.000000, 0.000000, 0.000000, 0.000000 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + }, + + "Plane" : { + "geometry" : "geo_Plane", + "materials" : [ "Material.001" ], + "position" : [ 0.000000, 0.000000, 0.118260 ], + "rotation" : [ 0.000000, 0.000000, -0.000000 ], + "quaternion": [ 1.000000, 0.000000, 0.000000, 0.000000 ], + "scale" : [ 7.922787, 7.922787, 7.922787 ], + "visible" : true + }, + + "Cube" : { + "geometry" : "geo_Cube", + "materials" : [ "Material" ], + "position" : [ 3.651978, 1.071144, 0.000000 ], + "rotation" : [ 0.220417, -0.075224, 0.181029 ], + "quaternion": [ 0.988791, 0.112836, 0.027288, -0.093898 ], + "scale" : [ 1.000000, 1.000000, 1.000000 ], + "visible" : true + } +}, + + +"geometries" : +{ + "geo_Cube" : { + "type" : "ascii_mesh", + "url" : "scene.Cube.js" + }, + + "geo_Monkey" : { + "type" : "ascii_mesh", + "url" : "scene.Monkey.js" + }, + + "geo_Plane" : { + "type" : "ascii_mesh", + "url" : "scene.Plane.js" + } +}, + + +"materials" : +{ + "Material" : { + "type": "MeshPhongMaterial", + "parameters": { color: 0xa31920, opacity: 1.00, ambient: 0x000000, specular: 0x7f7f7f, shininess: 50.0 } + }, + + "Material.001" : { + "type": "MeshPhongMaterial", + "parameters": { color: 0x24a33e, opacity: 1.00, ambient: 0x000000, specular: 0x7f7f7f, shininess: 50.0 } + }, + + "Material.002" : { + "type": "MeshPhongMaterial", + "parameters": { color: 0xa37024, opacity: 1.00, ambient: 0x000000, specular: 0x7f7f7f, shininess: 50.0 } + } +}, + + +"cameras" : +{ + "default_camera" : { + "type" : "perspective", + "fov" : 60.000000, + "aspect": 1.333000, + "near" : 1.000000, + "far" : 10000.000000, + "position": [ 0.000000, 0.000000, 10.000000 ], + "target" : [ 0.000000, 0.000000, 0.000000 ] + } +}, + + +"lights" : +{ + "default_light": { + "type" : "directional", + "direction" : [ 0.000000, 1.000000, 1.000000 ], + "color" : 0xffffff, + "intensity" : 0.80 + } +}, + + +"defaults" : +{ + "bgcolor" : [ 0.000000, 0.000000, 0.000000 ], + "bgalpha" : 1.000000, + "camera" : "default_camera" +} + +} + +postMessage( scene ); + diff --git a/examples/webgl_scene_test_blender.html b/examples/webgl_scene_test_blender.html new file mode 100644 index 00000000..dc312b9b --- /dev/null +++ b/examples/webgl_scene_test_blender.html @@ -0,0 +1,561 @@ + + + + three.js webgl - io - scene loader [blender] + + + + + +
+ three.js - scene loader test [blender] +
+ +
+ [+] +
+
+ +
+ Loading ... + +
+
+
Start
+
+
+ +

+
+
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+		
+
+		
+
+	
+
diff --git a/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/__init__.py b/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/__init__.py
index 0e6cbbac..8355c5d3 100644
--- a/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/__init__.py
+++ b/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/__init__.py
@@ -35,13 +35,14 @@ class ExportTHREEJS(bpy.types.Operator, ExportHelper):
 
     filename_ext = ".js"
 
-    use_modifiers = BoolProperty(name="Apply Modifiers", description="Apply modifiers to the exported mesh", default=True)
+    option_flip_yz = BoolProperty(name="Flip YZ", description="Flip YZ", default=True)
     use_normals = BoolProperty(name="Normals", description="Export normals", default=True)
     use_colors = BoolProperty(name="Colors", description="Export vertex colors", default=True)
     use_uv_coords = BoolProperty(name="UVs", description="Export texture coordinates", default=True)
+    option_export_scene = BoolProperty(name="Scene", description="Export scene", default=True)
 
     align_types = [("None","None","None"), ("Center","Center","Center"), ("Bottom","Bottom","Bottom"), ("Top","Top","Top")]
-    align_model = EnumProperty(name="Align model", description="Align model", items=align_types, default="Center")
+    align_model = EnumProperty(name="Align model", description="Align model", items=align_types, default="None")
 
     @classmethod
     def poll(cls, context):
@@ -61,15 +62,24 @@ class ExportTHREEJS(bpy.types.Operator, ExportHelper):
         layout = self.layout
 
         row = layout.row()
-        row.prop(self.properties, "use_modifiers")
+        row.prop(self.properties, "option_export_scene")
+        layout.separator()
+
+        row = layout.row()
+        row.prop(self.properties, "option_flip_yz")
+        layout.separator()
+
+        row = layout.row()
+        row.prop(self.properties, "align_model")
+        layout.separator()
+
         row = layout.row()
         row.prop(self.properties, "use_normals")
         row = layout.row()
         row.prop(self.properties, "use_colors")
         row = layout.row()
         row.prop(self.properties, "use_uv_coords")
-        row = layout.row()
-        row.prop(self.properties, "align_model")
+        
 
 
 def menu_func(self, context):
diff --git a/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/export_threejs.py b/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/export_threejs.py
index b54e092c..8efea477 100644
--- a/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/export_threejs.py
+++ b/utils/exporters/blender/2.56/scripts/op/io_mesh_threejs/export_threejs.py
@@ -23,9 +23,8 @@
 Blender exporter for Three.js (ASCII JSON format).
 
 TODO
-    - model alignment
+    - export scene
     - copy used images to folder where exported file goes
-    - export all selected meshes
     - binary format
 """
 
@@ -42,13 +41,149 @@ import random
 # Configuration
 # #####################################################
 
-# default colors for debugging (each material gets one distinct color):
+DEFAULTS = {
+"bgcolor" : [0, 0, 0],
+"bgalpha" : 1.0,
+
+"camera"  : 
+    {
+        "name" : "default_camera",
+        "type" : "perspective",
+        "near" : 1,
+        "far"  : 10000,
+        "fov"  : 60,
+        "aspect": 1.333,
+        "position" : [0, 0, 10],
+        "target"   : [0, 0, 0]
+    },
+
+"light" :
+ {
+    "name"       : "default_light",
+    "type"       : "directional",
+    "direction"	 : [0,1,1],
+    "color" 	 : [1,1,1],
+    "intensity"	 : 0.8
+ }
+}
+
+# default colors for debugging (each material gets one distinct color): 
 # white, red, green, blue, yellow, cyan, magenta
 COLORS = [0xeeeeee, 0xee0000, 0x00ee00, 0x0000ee, 0xeeee00, 0x00eeee, 0xee00ee]
 
 
 # #####################################################
-# Templates
+# Templates - scene
+# #####################################################
+TEMPLATE_SCENE_ASCII = """\
+// Converted from: %(fname)s
+//  File generated with Blender 2.56 Exporter
+//  https://github.com/alteredq/three.js/tree/master/utils/exporters/blender/
+
+
+var scene = {
+
+"type" : "scene",
+"urlBaseType" : "relativeToScene",
+
+%(sections)s
+
+"defaults" : 
+{
+    "bgcolor" : %(bgcolor)s,
+    "bgalpha" : %(bgalpha)f,
+    "camera"  : %(defcamera)s
+}
+
+}
+
+postMessage( scene );
+
+"""
+
+TEMPLATE_SECTION = """
+"%s" : 
+{
+%s
+},
+"""
+
+TEMPLATE_OBJECT = """\
+    %(object_id)s : {
+        "geometry"  : %(geometry_id)s,
+        "materials" : [ %(material_id)s ],
+        "position"  : %(position)s,
+        "rotation"  : %(rotation)s,
+        "quaternion": %(quaternion)s,
+        "scale"	    : %(scale)s,
+        "visible"   : true
+    }"""
+
+TEMPLATE_GEOMETRY = """\
+    %(geometry_id)s : {
+        "type" : "ascii_mesh",
+        "url"  : %(model_file)s
+    }"""
+
+TEMPLATE_TEXTURE = """\
+    %(texture_id)s : {
+        "url": %(texture_file)s
+    }"""
+
+TEMPLATE_MATERIAL_SCENE = """\
+    %(material_id)s : {
+        "type": %(type)s,
+        "parameters": { %(parameters)s } 
+    }"""
+
+TEMPLATE_CAMERA_PERSPECTIVE = """\
+    %(camera_id)s : {
+        "type"  : "perspective",
+        "fov"   : %(fov)f,
+        "aspect": %(aspect)f,
+        "near"  : %(near)f,
+        "far"   : %(far)f,
+        "position": %(position)s,
+        "target"  : %(target)s
+    }"""
+
+TEMPLATE_CAMERA_ORTHO = """\
+    %(camera_id)s: {
+        "type"  : "ortho",
+        "left"  : %(left)f,
+        "right" : %(right)f,
+        "top"   : %(top)f,
+        "bottom": %(bottom)f,
+        "near"  : %(near)f,
+        "far"   : %(far)f,
+        "position": %(position)s,
+        "target"  : %(target)s
+    }"""
+
+TEMPLATE_LIGHT_DIRECTIONAL = """\
+	%(light_id)s: {
+		"type"		 : "directional",
+		"direction"	 : %(direction)s,
+		"color" 	 : %(color)s,
+		"intensity"	 : %(intensity).2f
+	}"""
+
+TEMPLATE_LIGHT_POINT = """\
+	%(light_id)s: {
+		"type"	     : "point",
+		"position"   : %(position)s,
+		"color"      : %(color)s
+		"intensity"	 : %(intensity).3f
+	}"""
+
+TEMPLATE_VEC4 = '[ %f, %f, %f, %f ]'
+TEMPLATE_VEC3 = '[ %f, %f, %f ]'
+TEMPLATE_VEC2 = '[ %f, %f ]'
+TEMPLATE_STRING = '"%s"'
+TEMPLATE_HEX = "0x%06x"
+
+# #####################################################
+# Templates - model
 # #####################################################
 TEMPLATE_FILE_ASCII = """\
 /*
@@ -98,8 +233,11 @@ TEMPLATE_C = "0x%06x"
 # #####################################################
 # Utils
 # #####################################################
+def veckey3(x,y,z):
+    return round(x, 6), round(y, 6), round(z, 6)
+
 def veckey3d(v):
-    return round(v.x, 6), round(v.y, 6), round(v.z, 6)
+    return veckey3(v.x, v.y, v.z)
 
 def veckey2d(v):
     return round(v[0], 6), round(v[1], 6)
@@ -107,8 +245,13 @@ def veckey2d(v):
 def get_normal_indices(v, normals, mesh):
     n = []
     mv = mesh.vertices
+
     for i in v:
-        n.append( normals[veckey3d(mv[i].normal)] )
+        normal = mv[i].normal        
+        key = veckey3d(normal)
+        
+        n.append( normals[key] )
+
     return n
 
 def get_uv_indices(face_index, uvs, mesh):
@@ -127,6 +270,24 @@ def get_color_indices(face_index, colors, mesh):
         c.append( colors[hexcolor(i)] )
     return c
 
+def rgb2int(rgb):
+    color = (int(rgb[0]*255) << 16) + (int(rgb[1]*255) << 8) + int(rgb[2]*255);
+    return color
+
+# #####################################################
+# Utils - files
+# #####################################################
+def write_file(fname, content):
+    out = open(fname, "w")
+    out.write(content)
+    out.close()
+
+def ensure_folder_exist(foldername):
+    """Create folder (with whole path) if it doesn't exist yet."""
+    
+    if not os.access(foldername, os.R_OK|os.W_OK|os.X_OK):
+        os.makedirs(foldername)
+
 # #####################################################
 # Alignment
 # #####################################################
@@ -231,7 +392,7 @@ def setBit(value, position, on):
         mask = ~(1 << position)
         return (value & mask)    
     
-def generate_face(f, faceIndex, normals, uvs, colors, mesh, use_normals, use_colors, use_uv_coords):
+def generate_face(f, faceIndex, normals, uvs, colors, mesh, use_normals, use_colors, use_uv_coords, flipyz):
     isTriangle = ( len(f.vertices) == 3 )
     
     if isTriangle:
@@ -315,7 +476,10 @@ def extract_vertex_normals(mesh, use_normals):
 
     for f in mesh.faces:
         for v in f.vertices:
-            key = veckey3d(mesh.vertices[v].normal)
+            
+            normal = mesh.vertices[v].normal            
+            key = veckey3d(normal)
+                
             if key not in normals:
                 normals[key] = count
                 count += 1
@@ -327,7 +491,7 @@ def generate_normals(normals, use_normals):
         return ""
 
     chunks = []
-    for key, index in sorted(normals.items(), key=operator.itemgetter(1)):
+    for key, index in sorted(normals.items(), key = operator.itemgetter(1)):
         chunks.append(key)
 
     return ",".join(generate_normal(n) for n in chunks)
@@ -441,7 +605,7 @@ def value2string(v):
         return str(v).lower()
     return str(v)
 
-def generate_materials(mtl, materials, use_colors):
+def generate_materials(mtl, materials, use_colors, draw_type):
     """Generate JS array of materials objects
     """
 
@@ -458,6 +622,10 @@ def generate_materials(mtl, materials, use_colors):
         mtl[m]['DbgColor'] = generate_color(index)
         mtl[m]['vertexColors'] = use_colors
 
+        if draw_type in [ "BOUNDS", "WIRE" ]:
+            mtl[m]['wireframe'] = True
+            mtl[m]['DbgColor'] = 0xff0000
+            
         mtl_raw = ",\n".join(['\t"%s" : %s' % (n, value2string(v)) for n,v in sorted(mtl[m].items())])
         mtl_string = "\t{\n%s\n\t}" % mtl_raw
         mtl_array.append([index, mtl_string])
@@ -505,7 +673,7 @@ def extract_materials(mesh, scene):
 
     return materials
 
-def generate_materials_string(mesh, scene, use_colors):
+def generate_materials_string(mesh, scene, use_colors, draw_type):
 
     random.seed(42) # to get well defined color order for debug materials
 
@@ -522,19 +690,21 @@ def generate_materials_string(mesh, scene, use_colors):
         materials = { 'default':0 }
 
     # default dummy materials
+    
     mtl = generate_mtl(materials)
 
     # extract real materials from the mesh
+    
     mtl.update(extract_materials(mesh, scene))
 
-    return generate_materials(mtl, materials, use_colors)
+    return generate_materials(mtl, materials, use_colors, draw_type)
 
 # #####################################################
 # ASCII exporter
 # #####################################################
-def generate_ascii_model(mesh, scene, use_normals, use_colors, use_uv_coords, align_model):
+def generate_ascii_model(mesh, scene, use_normals, use_colors, use_uv_coords, align_model, flipyz, draw_type):
 
-    vertices = mesh.vertices[:]
+    vertices = mesh.vertices[:]    
 
     if align_model == 1:
         center(vertices)
@@ -547,7 +717,7 @@ def generate_ascii_model(mesh, scene, use_normals, use_colors, use_uv_coords, al
     colors, ncolor = extract_vertex_colors(mesh, use_colors)
     uvs, nuv = extract_uvs(mesh, use_uv_coords)
 
-    mstring, nmaterial = generate_materials_string(mesh, scene, use_colors)
+    mstring, nmaterial = generate_materials_string(mesh, scene, use_colors, draw_type)
     
     text = TEMPLATE_FILE_ASCII % {
     "nvertex"   : len(mesh.vertices),
@@ -565,46 +735,49 @@ def generate_ascii_model(mesh, scene, use_normals, use_colors, use_uv_coords, al
 
     "vertices"      : ",".join(generate_vertex(v) for v in vertices),
 
-    "faces"     : ",".join(generate_face(f, i, normals, uvs, colors, mesh, use_normals, use_colors, use_uv_coords) for i, f in enumerate(mesh.faces))
+    "faces"     : ",".join(generate_face(f, i, normals, uvs, colors, mesh, use_normals, use_colors, use_uv_coords, flipyz) for i, f in enumerate(mesh.faces))
 
     }
 
     return text
 
 # #####################################################
-# Main
+# Utils
 # #####################################################
-def save(operator, context, filepath="", use_modifiers=True, use_normals=True, use_colors=True, use_uv_coords=True, align_model=1):
+def ensure_extension(filepath, extension):
+    if not filepath.lower().endswith(extension):
+        filepath += extension
+    return filepath
+    
+def generate_mesh_filename(meshname, filepath):
+    normpath = os.path.normpath(filepath)
+    path, ext = os.path.splitext(normpath)
+    return "%s.%s%s" % (path, meshname, ext)
+    
+# #####################################################
+# Export single mesh
+# #####################################################
+def export_mesh(obj, scene, filepath, use_normals, use_colors, use_uv_coords, align_model, flipyz, export_single_model):
+    """Export single mesh"""
 
-    def rvec3d(v):
-        return round(v[0], 6), round(v[1], 6), round(v[2], 6)
 
-    def rvec2d(v):
-        return round(v[0], 6), round(v[1], 6)
-
-    scene = context.scene
-    obj = context.object
-
-    if not filepath.lower().endswith('.js'):
-        filepath += '.js'
-
-    if not obj:
-        raise Exception("Error, Select 1 active object")
-
-    if scene.objects.active:
-        bpy.ops.object.mode_set(mode='OBJECT')
-
-    if use_modifiers:
-        mesh = obj.create_mesh(scene, True, 'PREVIEW')
-    else:
-        mesh = obj.data
+    # collapse modifiers into mesh
+    
+    mesh = obj.create_mesh(scene, True, 'RENDER')        
 
     if not mesh:
-        raise Exception("Error, could not get mesh data from active object")
+        raise Exception("Error, could not get mesh data from object [%s]" % obj.name)
 
     # that's what Blender's native export_obj.py does
-    x_rot = mathutils.Matrix.Rotation(-math.pi/2, 4, 'X')
-    mesh.transform(x_rot * obj.matrix_world)
+    # to flip YZ
+
+    X_ROT = mathutils.Matrix.Rotation(-math.pi/2, 4, 'X')
+
+    if export_single_model:
+        mesh.transform(X_ROT * obj.matrix_world)
+    else:
+        mesh.transform(X_ROT)
+
     mesh.calc_normals()
 
     faceUV = (len(mesh.uv_textures) > 0)
@@ -627,14 +800,412 @@ def save(operator, context, filepath="", use_modifiers=True, use_normals=True, u
         if not active_col_layer:
             use_colors = False
 
-    text = generate_ascii_model(mesh, scene, use_normals, use_colors, use_uv_coords, align_model)
-    file = open(filepath, 'w')
-    file.write(text)
-    file.close()
+    text = generate_ascii_model(mesh, scene, use_normals, use_colors, use_uv_coords, align_model, flipyz, obj.draw_type)    
+    write_file(filepath, text)
+
+    # remove temp mesh
+
+    bpy.data.meshes.remove(mesh)
 
     print("writing", filepath, "done")
+    
+    
+# #####################################################
+# Export scene
+# #####################################################
+def generate_vec4(vec):
+    return TEMPLATE_VEC4 % (vec[0], vec[1], vec[2], vec[3])
 
-    if use_modifiers:
-        bpy.data.meshes.remove(mesh)
+def generate_vec3(vec):
+    return TEMPLATE_VEC3 % (vec[0], vec[1], vec[2])
 
+def generate_vec2(vec):
+    return TEMPLATE_VEC2 % (vec[0], vec[1])
+
+def generate_hex(number):
+    return TEMPLATE_HEX % number
+    
+def generate_string(s):
+    return TEMPLATE_STRING % s
+    
+def generate_section(label, content):
+    return TEMPLATE_SECTION % (label, content)
+    
+def get_mesh_filename(mesh):
+    object_id = mesh["data"]["name"]
+    filename = "%s.js" % sanitize(object_id)
+    return filename
+    
+def generate_material_id_list(materials):
+    chunks = []
+    for material in materials:
+        chunks.append(material.name)
+    
+    return ",".join(chunks)
+    
+def generate_objects(data):
+    chunks = []
+    
+    for obj in data["objects"]:
+        if obj.type == "MESH":
+            object_id = obj.name
+            
+            if len(obj.modifiers) > 0:
+                geo_name = obj.name
+            else:
+                geo_name = obj.data.name
+
+            geometry_id = "geo_%s" % geo_name
+            
+            material_id = generate_material_id_list(obj.material_slots)
+
+            #position = obj.location
+            #rotation = obj.rotation_euler
+            scale = obj.scale
+            quaternion = obj.rotation_quaternion
+            
+            position = [obj.location.x, obj.location.z, -obj.location.y]
+            rotation = [obj.rotation_euler.x, -obj.rotation_euler.y, -obj.rotation_euler.z]
+            #quaternion = obj.rotation_euler.to_quat()
+            scale = [obj.scale.x, obj.scale.z, obj.scale.y]
+            
+            material_string = ""
+            if material_id:
+                material_string = generate_string(material_id)
+                
+            object_string = TEMPLATE_OBJECT % {
+            "object_id"   : generate_string(object_id),
+            "geometry_id" : generate_string(geometry_id),
+            "material_id" : material_string,
+            "position"    : generate_vec3(position),
+            "rotation"    : generate_vec3(rotation),
+            "quaternion"  : generate_vec4(quaternion),
+            "scale"       : generate_vec3(scale)
+            }
+            chunks.append(object_string)
+        
+    return ",\n\n".join(chunks)
+    
+def generate_geometries(data):
+    chunks = []
+    
+    geo_set = set()
+    
+    for obj in data["objects"]:
+        if obj.type == "MESH":
+            
+            if len(obj.modifiers) > 0:
+                name = obj.name
+            else:
+                name = obj.data.name
+            
+            if name not in geo_set:
+
+                geometry_id = "geo_%s" % name
+                model_filename = os.path.basename(generate_mesh_filename(name, data["filepath"]))
+                
+                geometry_string = TEMPLATE_GEOMETRY % {
+                "geometry_id" : generate_string(geometry_id),
+                "model_file"  : generate_string(model_filename)
+                }
+                chunks.append(geometry_string)
+                
+                geo_set.add(name)
+        
+    return ",\n\n".join(chunks)
+    
+def generate_textures_scene(data):
+    chunks = []
+    
+    # TODO: extract just textures actually used by some objects in the scene
+    
+    for img in bpy.data.images:
+        
+        texture_id = img.name
+        texture_file = extract_texture_filename(img)
+    
+        texture_string = TEMPLATE_TEXTURE % {
+        "texture_id"   : generate_string(texture_id),
+        "texture_file" : generate_string(texture_file)
+        }
+        chunks.append(texture_string)
+
+    return ",\n\n".join(chunks)
+
+def extract_texture_filename(image):
+    fn = bpy.path.abspath(image.filepath)
+    fn = os.path.normpath(fn)
+    fn_strip = os.path.basename(fn)
+    return fn_strip
+    
+def extract_material_data(m):
+    world = bpy.context.scene.world
+    
+    material = { 'name': m.name }
+    
+    material['colorDiffuse'] = [m.diffuse_intensity * m.diffuse_color[0],
+                                m.diffuse_intensity * m.diffuse_color[1],
+                                m.diffuse_intensity * m.diffuse_color[2]]
+
+    material['colorSpecular'] = [m.specular_intensity * m.specular_color[0],
+                                 m.specular_intensity * m.specular_color[1],
+                                 m.specular_intensity * m.specular_color[2]]
+
+    material['colorAmbient'] = [m.ambient * world.ambient_color[0],
+                                m.ambient * world.ambient_color[1],
+                                m.ambient * world.ambient_color[2]]
+
+    material['transparency'] = m.alpha
+
+    # not sure about mapping values to Blinn-Phong shader
+    # Blender uses INT from [1,511] with default 0
+    # http://www.blender.org/documentation/blender_python_api_2_54_0/bpy.types.Material.html#bpy.types.Material.specular_hardness
+
+    material["specularCoef"] = m.specular_hardness
+
+    material['mapDiffuse'] = ""
+    material['mapLight'] = ""
+    material['mapNormal'] = ""    
+        
+    # just take first textures of each, for the moment three.js materials can't handle more
+
+    for i in range(len(m.texture_slots)):
+        ts = m.texture_slots[i]
+        if ts:
+            t = ts.texture
+            if ts.use and t.type == 'IMAGE':
+                name = t.image.name
+
+                if t.use_normal_map:
+                    material['mapNormal'] = name
+                else:
+                    if not material['mapDiffuse']:
+                        material['mapDiffuse'] = name
+                    else:
+                        material['mapLight'] = name
+                
+                if material['mapDiffuse'] and material['mapNormal'] and material['mapLight']:
+                    break
+        
+    if m.specular_intensity > 0.0 and (m.specular_color[0] > 0 or m.specular_color[1] > 0 or m.specular_color[2] > 0):
+        material['shading'] = "Phong"
+    else:
+        material['shading'] = "Lambert"
+        
+    return material
+    
+def generate_material_string(material):
+    type_map = {
+    "Lambert"   : "MeshLambertMaterial",
+    "Phong"     : "MeshPhongMaterial"
+    }
+    
+    material_id = material["name"]
+    shading = material["shading"]
+    material_type = type_map.get(shading, "MeshBasicMaterial")
+
+    parameters = "color: %s" % generate_hex(rgb2int(material["colorDiffuse"]))
+    parameters += ", opacity: %.2f" % material["transparency"]
+
+    if shading == "Phong":
+        parameters += ", ambient: %s" % generate_hex(rgb2int(material["colorAmbient"]))
+        parameters += ", specular: %s" % generate_hex(rgb2int(material["colorSpecular"]))
+        parameters += ", shininess: %.1f" % material["specularCoef"]
+
+    colorMap = material['mapDiffuse']
+    lightMap = material['mapLight']
+    normalMap  = material['mapNormal']
+
+    if colorMap:
+        parameters += ", map: %s" % generate_string(colorMap)
+    if lightMap:
+        parameters += ", lightMap: %s" % generate_string(lightMap)
+    if normalMap:
+        parameters += ", normalMap: %s" % generate_string(normalMap)
+
+    material_string = TEMPLATE_MATERIAL_SCENE % {
+    "material_id" : generate_string(material_id),
+    "type"        : generate_string(material_type),
+    "parameters"  : parameters
+    }
+    
+    return material_string
+    
+def generate_materials_scene(data):
+    chunks = []
+
+    # TODO: extract just materials actually used by some objects in the scene
+    
+    for m in bpy.data.materials:
+        material = extract_material_data(m)
+        material_string = generate_material_string(material)
+        chunks.append(material_string)
+
+    return ",\n\n".join(chunks)
+
+def generate_cameras(data):
+    cameras = data.get("cameras", [])
+    if not cameras:
+        cameras.append(DEFAULTS["camera"])
+        
+    chunks = []
+    for camera in cameras:
+
+        if camera["type"] == "perspective":
+            camera_string = TEMPLATE_CAMERA_PERSPECTIVE % {
+            "camera_id" : generate_string(camera["name"]),
+            "fov"       : camera["fov"],
+            "aspect"    : camera["aspect"],
+            "near"      : camera["near"],
+            "far"       : camera["far"],
+            "position"  : generate_vec3(camera["position"]),
+            "target"    : generate_vec3(camera["target"])
+            }
+
+        elif camera["type"] == "ortho":
+            camera_string = TEMPLATE_CAMERA_ORTHO % {
+            "camera_id" : generate_string(camera["name"]),
+            "left"      : camera["left"],
+            "right"     : camera["right"],
+            "top"       : camera["top"],
+            "bottom"    : camera["bottom"],
+            "near"      : camera["near"],
+            "far"       : camera["far"],
+            "position"  : generate_vec3(camera["position"]),
+            "target"    : generate_vec3(camera["target"])
+            }
+            
+        chunks.append(camera_string)
+        
+    return ",\n\n".join(chunks)
+
+def generate_lights(data):
+    lights = data.get("lights", [])
+    if not lights:
+        lights.append(DEFAULTS["light"])
+        
+    chunks = []
+    for light in lights:
+
+        if light["type"] == "directional":
+            light_string = TEMPLATE_LIGHT_DIRECTIONAL % {
+            "light_id"      : generate_string(light["name"]),
+            "direction"     : generate_vec3(light["direction"]),
+            "color"         : generate_hex(rgb2int(light["color"])),
+            "intensity"     : light["intensity"]
+            }
+
+        elif light["type"] == "point":
+            light_string = TEMPLATE_LIGHT_POINT % {
+            "light_id"      : generate_string(light["name"]),
+            "position"      : generate_vec3(light["position"]),
+            "color"         : generate_hex(rgb2int(light["color"])),
+            "intensity"     : light["intensity"]
+            }
+            
+        chunks.append(light_string)
+            
+    return ",\n\n".join(chunks)
+
+def generate_ascii_scene(data):
+    objects = generate_objects(data)
+    geometries = generate_geometries(data)
+    textures = generate_textures_scene(data)
+    materials = generate_materials_scene(data)
+    cameras = generate_cameras(data)
+    lights = generate_lights(data)
+    
+    sections = [
+    ["objects",    objects],
+    ["geometries", geometries],
+    ["textures",   textures],
+    ["materials",  materials],
+    ["cameras",    cameras],
+    ["lights",     lights]
+    ]
+    
+    chunks = []
+    for label, content in sections:
+        if content:
+            chunks.append(generate_section(label, content))
+
+    sections_string = "\n".join(chunks)
+    
+    default_camera = "default_camera"
+    
+    parameters = {
+    "fname"     : data["source_file"],
+    "sections"  : sections_string,
+    "bgcolor"   : generate_vec3(DEFAULTS["bgcolor"]),
+    "bgalpha"   : DEFAULTS["bgalpha"],
+    "defcamera" : generate_string(default_camera)
+    }
+
+    text = TEMPLATE_SCENE_ASCII % parameters
+    
+    return text
+    
+def export_scene(scene, filepath, flipyz):
+
+    source_file = os.path.basename(bpy.data.filepath)
+
+    scene_text = ""
+    data = {
+    "scene"       : scene,
+    "objects"     : scene.objects,
+    "source_file" : source_file,
+    "filepath"    : filepath,
+    "flipyz"      : flipyz
+    }
+    scene_text += generate_ascii_scene(data)
+    
+    write_file(filepath, scene_text)
+
+# #####################################################
+# Main
+# #####################################################
+def save(operator, context, filepath = "", option_flip_yz = True, use_normals = True, use_colors = True, use_uv_coords = True, align_model = 0, option_export_scene = True):
+
+    filepath = ensure_extension(filepath, '.js')
+
+    scene = context.scene
+
+    if scene.objects.active:
+        bpy.ops.object.mode_set(mode='OBJECT')
+
+    if option_export_scene:
+
+        export_scene(scene, filepath, option_flip_yz)
+
+        geo_set = set()
+        
+        for obj in scene.objects:
+            if obj.type == "MESH":
+                
+                # create extra copy of geometry with applied modifiers
+                # (if they exist)
+                
+                if len(obj.modifiers) > 0:
+                    name = obj.name
+                    
+                # otherwise can share geometry
+
+                else:
+                    name = obj.data.name
+
+                if name not in geo_set:
+                    fname = generate_mesh_filename(name, filepath)
+                    export_mesh(obj, scene, fname, use_normals, use_colors, use_uv_coords, 0, option_flip_yz, False)
+                    
+                    geo_set.add(name)
+
+    else:
+
+        obj = context.object
+        if not obj:
+            raise Exception("Error, Select 1 active object or select 'export scene'")
+
+        export_mesh(obj, scene, filepath, use_normals, use_colors, use_uv_coords, align_model, option_flip_yz, True)
+
+    
     return {'FINISHED'}