thx, for your 2 patches Ragaes.
I was planning some updates/changes/addOns on Merge, Mirror and FaceHelper very
soon,
This one will shorten my pain :)
Fabrice
On Apr 14, 2011, at 9:55 AM, ragaes wrote:
> 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];
> }