Hello,

This post is for sharing a patch to fix the Merge class in Broomstick.

Index: src/away3d/tools/Merge.as
===============================================
--- src/away3d/tools/Merge.as   (revision 3152)
+++ src/away3d/tools/Merge.as   (working copy)
@@ -107,13 +107,18 @@
                        var j : uint;
                        var i : uint;

+                       var v:Vertex = new Vertex();
+                       var t:Matrix3D = new Matrix3D();
+
+                       var scenePosX:Number;
+                       var scenePosY:Number;
+                       var scenePosZ:Number;
+
                        if(!_objectspace){
-                               var v:Vertex = new Vertex();
-                               var t:Matrix3D = mesh2.transform;
-
-                               var scenePosX:Number = mesh2.scenePosition.x -
mesh1.scenePosition.x;
-                               var scenePosY:Number = mesh2.scenePosition.y -
mesh1.scenePosition.y;
-                               var scenePosZ:Number = mesh2.scenePosition.z -
mesh1.scenePosition.z;
+                               t = mesh2.transform;
+                               scenePosX = mesh2.scenePosition.x - 
mesh1.scenePosition.x;
+                               scenePosY = mesh2.scenePosition.y - 
mesh1.scenePosition.y;
+                               scenePosZ = mesh2.scenePosition.z - 
mesh1.scenePosition.z;
                        }

                        var geometry:Geometry = mesh1.geometry;
@@ -131,11 +136,12 @@
                                materials.push(mesh1.subMeshes[i].material);
                        }

+                       var hasMaterial:Boolean;
+                       var nmaterials:Array = [];
+
                        if(_keepMaterial){
-                               var hasMaterial:Boolean;
-                               var nmaterials:Array = [];
                                for (i = 0; i<mesh2.subMeshes.length; ++i){
-                                       nmaterials.push((mesh2.material == 
null)?
mesh2.subMeshes[i].material : mesh2.material);
+                                       
nmaterials.push((mesh2.subMeshes[i].material != null)?
mesh2.subMeshes[i].material : mesh2.material);
                                        if(!hasMaterial && nmaterials[i] != 
null)
                                                hasMaterial = true;
                                }
@@ -157,7 +163,7 @@
                        var nuvs:Vector.<Number>;

                        var addSubgeom:Boolean;
-                       if(_keepMaterial && hasMaterial && nmaterials[0] !=
materials[materials.length-1])
+                       if(_keepMaterial && hasMaterial)
                                addSubgeom = true;

                        nvertices = vectors[vectors.length-1][0];
@@ -177,10 +183,8 @@

                        var geometry2:Geometry = mesh2.geometry;
                        var geometriesM2:Vector.<SubGeometry> = 
geometry2.subGeometries;
-                       numSubGeoms = geometriesM2.length;
+                       numSubGeoms = geometriesM2.length;

-                       var lockIndex:uint = nIndexind;
-
                        for (i = 0; i < numSubGeoms; ++i){
                                subGeom = SubGeometry(geometriesM2[i]);
                                vertices = subGeom.vertexData;
@@ -188,12 +192,12 @@
                                uvs = subGeom.UVData;

                                if(_keepMaterial){
-                                       materials.push((mesh2.material == 
null)? nmaterials[i] :
mesh2.material);
+                                       materials.push(nmaterials[i]);
                                } else{
                                        materials.push((mesh1.material == 
null)? materials[i] :
mesh1.material);
                                }

-                               vecLength = (i == 0)? lockIndex : 
indices.length;
+                               vecLength = indices.length;

                                for (j = 0; j < vecLength;++j){
                                        index = indices[j]*3;
@@ -211,14 +215,22 @@
                                                subGeom = new SubGeometry();
                                                
geometry.addSubGeometry(subGeom);

-                                               
materials.push(materials.length-1);
+                                               
materials.push(materials[materials.length-1]);
                                        }
+
+                                       var ii : uint = nIndexind + 1;
+                                       while(nindices.length < ii)
+                                               nindices.push(0);

                                        nindices[nIndexind++] = 
nvertices.length/3;

+                                       ii = nIndex + 3;
+                                       while(nvertices.length < ii)
+                                               nvertices.push(0);
+
                                        if(_objectspace){
                                                nvertices[nIndex++] = 
vertices[index];
-                                               nvertices[nIndex++] = 
vertices[index+1]+250;
+                                               nvertices[nIndex++] = 
vertices[index+1];
                                                nvertices[nIndex++] = 
vertices[index+2];

                                        } else {
@@ -238,6 +250,10 @@
                                                nvertices[nIndex++] = v.z;
                                        }

+                                       ii = nIndexuv + 2;
+                                       while(nuvs.length < ii)
+                                               nuvs.push(0);
+
                                        nuvs[nIndexuv++] = uvs[indexuv];
                                        nuvs[nIndexuv++] = uvs[indexuv+1];
                                }

Reply via email to