Hi all,
Merge class is updated (in Git repo)
various issues were fixed and lots of enhancement/rewriting was done.

in big lines what is now different with previous version:

1:
constructor has changed, the first param "objectspace" is now the third param.
simply because in 99% of cases, you do not need object space

so where you did say, new Merge(false, true, true); , you can update your code 
by just getting rid of first param as its by default false
becomes --> new Merge(true, true);

2:
Added new method, as I've seen already several cases where you were merging 
during a loop.
public function applyToMeshes(receiver:Mesh, meshes:Vector.<Mesh>):Mesh
(see first snippet example)

3:
it takes now in account, scale, and rotations of the to be merged items, but 
also respects reciever rotations and scale.
It is faster and uses less resource than previous version
It supports now also cloned meshes inputs and even empty mesh (new Mesh()) as 
receiver

merging multiple meshes
if you merge for instance from a loaded model or if you loop to generate a 
merged mesh
do not use "apply", instead, use "applyToMeshes" or "applyToContainer"
apply would work but would ask way more processing time.

A few examples with few variations in use. Covering probably most of your 
possible cases.

merge.applyToMeshes
                private function mergeUsingVectors() : void
                {
                        var iteration : uint = 20; 
                        var increase : Number = 200;
                        var offset:Number = -((increase *iteration) *.5);
                         
                        var merge:Merge = new Merge(false, false);
                         
                        var bmd:BitmapData = new 
BitmapData(64,64,false,0xFF00FF);
                        var mat:BitmapMaterial = new 
BitmapMaterial(bmd,true,false,true);
                        mat.lights = [_light1, _light2];
                        
                        var sphere : Sphere; 
                        var sphereReceiver : Sphere; 
                        
                        var meshes:Vector.<Mesh> = new Vector.<Mesh>();
                        var i:uint;
                        var scaleIncrease:Number = .1;
                        var nscale:Number = 0.2;
                        for (i = 0;i < iteration; ++i) {
                                sphere = new Sphere(mat, 100*nscale, 6, 6);
                                sphere.x = offset + (i*increase);
                                sphere.y = Math.sin(sphere.x)*100;
                                meshes.push(Mesh(sphere));
                                
                                nscale+=scaleIncrease;
                        }
       
                        
_view.scene.addChild(merge.applyToMeshes(Mesh(meshes.shift()), meshes));
                }

merge.applyToContainer
in this case we loop, but this could be your loaded model (make sure if your 
model have more material to set keepMaterial to true)

                private function mergeWithContainer() : void
                {
                        var _rows : Number = 8; 
                        var _space : Number = 250;
                        var _radius : Number = 200;
                
                        var merge:Merge = new Merge(false,true);
                         
                        var sphere : Sphere; 
                        var container:ObjectContainer3D = new 
ObjectContainer3D();
                        
                        var z:uint;
                        var y:uint;
                        var x:uint;
            for (z = 0;z < _rows; ++z) {
                for (y= 0;y < _rows;++y) {
                    for (x = 0;x < _rows;++x) {
                                                sphere = new Sphere(null, 
_radius, 6, 6, true ); 
                                                sphere.x = 
-(_rows*(_radius+_space)*0.5) + x * _radius * 2 + (x*_space);
                                                sphere.y = 
-(_rows*(_radius+_space)*0.5) + y * _radius * 2 + (y*_space);
                                                sphere.z = 
-(_rows*(_radius+_space)*0.5) + z * _radius * 2 + (z*_space);
                                                container.addChild(sphere);
                    }
                }
            }
            
                        var mergedMesh:Mesh = merge.applyToContainer(container, 
"myMergedMesh");
                        
                        var bmd:BitmapData = new 
BitmapData(64,64,false,0xFF00FF);
                        var mat:BitmapMaterial = new 
BitmapMaterial(bmd,true,false,true);
                        mat.lights = [_light1, _light2];
                        
                        mergedMesh.material = mat;
                        _view.scene.addChild(mergedMesh);
                }

merge.apply
in this case, notice that the scale and rotations of originals are respected, 
if you compare with the green non merged cubes placed right above.

                private function singleMerge() : void
                {
                        //we want to keep the materials different and clear the 
source
                        var merge:Merge = new Merge(true, true);
                        
                        var matcube:BitmapMaterial = new BitmapMaterial(new 
BitmapData(256,256, false, 0xFF0000));
                        var matcube1:BitmapMaterial = new BitmapMaterial(new 
BitmapData(256,256, false, 0x0000FF));
                        matcube.lights = [_light1, _light2];
                        matcube1.lights = [_light1, _light2];
                         
                        var cube1:Cube = new Cube(matcube, 800, 400, 100);
                        var cube2:Cube = new Cube(matcube1, 800, 400, 100);
                        
                        cube1.x = 600;
                        cube2.x = -600;
                        cube1.z = cube2.z = 0;
                        cube1.y = cube2.y = 0;
                        
                        //here an example where the reciever as scale and 
rotations
                        cube1.rotationY = -45;
                        cube2.rotationY = 45;
                        
                        cube1.scaleY = 2;
                        cube2.scaleY = 2;
                         
                        merge.apply(cube1, cube2);
                        _view.scene.addChild(cube1);
                         
                        // the same settings but higher on y not merge to check 
results, shown here in green
                        var matcube2:BitmapMaterial = new BitmapMaterial(new 
BitmapData(256,256, false, 0x00FF00));
                        matcube2.lights = [_light1, _light2];
                        var cube3:Cube = new Cube(matcube2, 800, 400, 100);
                        var cube4:Cube = new Cube(matcube2, 800, 400, 100);
                        
                        cube3.x = 600;
                        cube4.x = -600;
                        cube3.z = cube4.z = 0;
                        cube3.y = cube4.y = 800;
                        
                        cube3.rotationY = -45;
                        cube4.rotationY = 45;
                        
                        cube3.scaleY = 2;
                        cube4.scaleY = 2;
                         
                        _view.scene.addChild(cube3);
                        _view.scene.addChild(cube4);
                         
                }

example of empty reciever and the use of clones
                private function mergeWithClones() : void
                {
                        var merge:Merge = new Merge(true, true);                
        
                        var matcube:BitmapMaterial = new BitmapMaterial(new 
BitmapData(256,256, false, 0xFF0000));
                        matcube.lights = [_light1, _light2];
                         
                        var cube:Cube = new Cube(matcube, 800, 400, 100);
                        var meshes:Vector.<Mesh> = new Vector.<Mesh>();
                        
                        //empty mesh reciever
                        var receiver:Mesh = new Mesh();
                        var cubeclone:Mesh;

                        var i:uint;
                        var iteration : uint = 20; 
                        var increase : Number = 200;
                        var offset:Number = -((increase *iteration) *.5);
                         
                        for (i = 0;i < iteration; ++i) {
                                cubeclone = cube.clone() as Mesh;
                                cubeclone.x = offset + (i*increase);
                                cubeclone.y = i*50;
                                meshes.push(cubeclone);
                        }
                        _view.scene.addChild(merge.applyToMeshes(receiver, 
meshes));
                        cube = null;
                }


I'll add soon these in the examples section.

cheers,
Fabrice






Reply via email to