codice:
unsigned int i0, i1, i2;
	unsigned int j0, j1, j2;

	for(unsigned int i=0; i<this->MeshData.ColladaBuffer.Indici/3; i++)
	{
		i0 = this->MeshData.Indices[i*3+0];
		i1 = this->MeshData.Indices[i*3+1];
		i2 = this->MeshData.Indices[i*3+2];

		pAdj[i*6+0] = i0;
		pAdj[i*6+1] = 0xffffffff;
		pAdj[i*6+2] = i1;
		pAdj[i*6+3] = 0xffffffff;
		pAdj[i*6+4] = i2;
		pAdj[i*6+5] = 0xffffffff;
		for(unsigned int j=0; j<this->MeshData.ColladaBuffer.Indici/3; j++)
		{
			if( j != i ) // don't check a triangle against itself
			{
				j0 = this->MeshData.Indices[j*3+0];
				j1 = this->MeshData.Indices[j*3+1];
				j2 = this->MeshData.Indices[j*3+2];
				// check for i0 and i1
				if( j0 == i0 )
				{
					if(j1==i1) pAdj[i*6+1] = j2;
					else if(j2==i1) pAdj[i*6+1] = j1;
				} else if( j1==j0 )
				{
					if(j0==i1) pAdj[i*6+1] = j2;
					else if(j2==i1) pAdj[i*6+1] = j0;
				} else if( j2==i0 )
				{
					if(j0==i1) pAdj[i*6+1] = j1;
					else if(j1==i1) pAdj[i*6+1] = j0;
				}
				// check for i1 and i2
				if( j0 == i1 )
				{
					if(j1==i2) pAdj[i*6+3] = j2;
					else if(j2==i2) pAdj[i*6+3] = j1;
				} else if( j1==i1 )
				{
					if(j0==i2) pAdj[i*6+3] = j2;
					else if(j2==i2) pAdj[i*6+3] = j0;
				} else if( j2==i1 )
				{
					if(j0==i2) pAdj[i*6+3] = j1;
					else if(j1==i2) pAdj[i*6+3] = j0;
				}
				// check for i2 and i0
				if( j0 == i2 )
				{
					if(j1==i0) pAdj[i*6+5] = j2;
					else if(j2==i0) pAdj[i*6+5] = j1;
				} else if( j1==i2 )
				{
					if(j0==i0) pAdj[i*6+5] = j2;
					else if(j2==i0) pAdj[i*6+5] = j0;
				} else if( j2==i2 )
				{
					if(j0==i0) pAdj[i*6+5] = j1;
					else if(j1==i0) pAdj[i*6+5] = j0;
				}
			}
		}	
	}

	this->MeshData.ColladaBuffer.Indici *= 2;
Ma non sembra ancora funzionare bene.

La tua soluzione invece è interessante.
Come faresti poi, per mettere nell'elemento 5 l'indice di adiacenza tra 0 e 2 e cosi via?