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 logicaVVoVe: )
questo è il codice :
come avrete visto lavoro con MDX 2 (sdk aprile 2006).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; }
![]()

VVoVe: )
Rispondi quotando

