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];
}