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