Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539

    [C#] unire piu' mesh in una.

    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).



  2. #2
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    up

  3. #3
    Utente di HTML.it L'avatar di U235
    Registrato dal
    Mar 2006
    Messaggi
    1,539
    lasciando perdere il discorso memoria (penso che sia risolvibile nel momento che ripulisco il codice eliminando e chiudendo..), secondo voi potrebbe essere un problema relativo al fatto che MDX 2 (managed Directx) è in beta ? nella versione 1.1 esisteva il graphicStream, ora hanno introdotto il graphicBuffer, ma o tanto l'impressione che sia un bel passo indietro...




Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.