ciao a tutti

c'è qualcuno che mi saprebbe scovare il bug ???
il problema e che ogni tanto mi dice che la memoria e corrotta :CALCIOPOLI-bugs: e quando salvo comunque mi scrive una mesh non proprio perfetta... (dei bei triangoli senza una logica VVoVe: )

questo è il codice :

codice:
//*****************************************
 private void button1_Click(object sender, EventArgs e)
        {
            SortedList<int, Mesh> list = new SortedList<int, Mesh>();
            AttributeRange att = new AttributeRange();

            // creo la prima mesh
            Mesh m1 = Mesh.Box(RenderSecondario.dev.device, 10f, 20f, 5f);

            // imposto l'attribute
            att.AttributeId = 0;
            att.FaceCount = m1.FaceCount;
            att.FaceStart = 0;
            att.VertexCount = m1.VertexCount;
            att.VertexStart = 0;
            m1.SetAttributeTable(new AttributeRange[] { att });

            // creo la seconda mesh
            Mesh m2 = Mesh.Box(RenderSecondario.dev.device, 15f, 25f, 10f);

            //imposto l'attribute
            m2.SetAttributeTable(new AttributeRange[] { att });

            // inserico il una lista
            list.Add(0, m1);
            list.Add(1, m2);

            //chiamo il metodo per unire le mesh
            Mesh result = Combine(list, RenderSecondario.dev);

            // del risultato ne faccio un clone
            result = result.Clone(RenderSecondario.dev.device, MeshFlags.Managed, VertexFormats.TextureCountShift);

            // per il salvataggio... (possibile errore)
            MaterialList mat = new MaterialList();
            GraphicsBuffer adia = new GraphicsBuffer(result.FaceCount*3);
            result.GenerateAdjacency(0.0001F, adia);
            EffectInstanceList EffList = new EffectInstanceList();
            result.Save("prova.x", adia, mat, EffList, XFileFormat.Text);
        }



//*********************************************************


        public Mesh Combine(SortedList<int, Mesh> List, Device3D dev)
        {
            int numberVerts = 0, numberAttribute = 0, numberFace =0;
            
            // conto i vari parametri per creare la mesh unica
            foreach (Mesh M in List.Values)
            { 
                numberVerts += M.VertexCount;
                numberAttribute += M.AttributeCount;
                numberFace += M.FaceCount;
            }

            // creo la mesh (ancora vuota)
            Mesh mesh = new Mesh(dev.device, numberFace, numberVerts, MeshFlags.Managed, VertexFormats.TextureCountShift);

            // inserico nel indexBuffer della mesh vuota gli indici delle mesh della lista
            GraphicsBuffer<int> ResultIndex = mesh.LockIndexBuffer<int>(LockFlags.None);
            int CountResult = 0;
            foreach (Mesh M in List.Values)
            {
                GraphicsBuffer<int> indexBuffer = M.LockIndexBuffer<int>(LockFlags.None);
                for (int i = 0; i < indexBuffer.ElementSize; i++)
                {
        // ovviamente quelli della sedonda mesh avranno il loro valore + quello delle precedenti
                    ResultIndex[CountResult + i] = indexBuffer[i] + CountResult;
                }
                CountResult += indexBuffer.ElementSize;
                M.UnlockIndexBuffer();
            }
            mesh.UnlockIndexBuffer();


            // inserico nel vertexBuffer della mesh vuota i vertici delle mesh della lista
            GraphicsBuffer<VertexS> ResultVertex = mesh.LockVertexBuffer<VertexS>(LockFlags.None);
            CountResult = 0;
            foreach (Mesh M in List.Values)
            {
                GraphicsBuffer<VertexS> vertexBuffer = M.LockVertexBuffer<VertexS>(LockFlags.None);
                for (int i = 0; i < vertexBuffer.ElementSize; i++)
                {
                    ResultVertex[CountResult + i] = vertexBuffer[i];
                }
                CountResult += vertexBuffer.ElementSize;
                M.UnlockVertexBuffer();
            }
            mesh.UnlockVertexBuffer();

  
            // ora gli attributi
            GraphicsBuffer<int> ResultAttribute = mesh.LockAttributeBuffer(LockFlags.None);
            CountResult = 0;
            foreach (Mesh M in List.Values)
            {
                GraphicsBuffer<int> attributeBuffer = M.LockAttributeBuffer(LockFlags.None);
                for (int i = 0; i < attributeBuffer.ElementSize; i++)
                {
                    ResultAttribute[CountResult + i] = attributeBuffer[i] + CountResult;
                }
                CountResult += M.AttributeCount;
                M.UnlockAttributeBuffer();
            }
            mesh.UnlockAttributeBuffer();
            
            return mesh;
        }
come avrete visto lavoro con MDX 2 (sdk aprile 2006).