public void HandleMeshData(Guid meshguid, int meshIndex, Rhino.Geometry.Mesh meshdata)
{
// Get face indices flattened to an
// integer array.
var findices = meshdata.Faces.ToIntArray(true);
// Get texture coordinates and
// flattens to a float array.
var tc = meshdata.TextureCoordinates;
var rhuv = tc.ToFloatArray();
// Get rhino vertex normals and
// flatten to a float array.
var vn = meshdata.Normals;
var rhvn = vn.ToFloatArray();
// now convert UVs: from vertex indexed array to per face per vertex
var cmuv = rhuv.Length > 0 ? new float[findices.Length * 2] : null;
if (cmuv != null)
{
for (var fi = 0; fi < findices.Length; fi++)
{
var fioffs = fi * 2;
var findex = findices[fi];
var findex2 = findex * 2;
var rhuvit = rhuv[findex2];
var rhuvit1 = rhuv[findex2 + 1];
cmuv[fioffs] = rhuvit;
cmuv[fioffs + 1] = rhuvit1;
}
}
var meshid = new Tuple<Guid, int>(meshguid, meshIndex);
var crc = _objectShaderDatabase.FindRenderHashForMeshId(meshid);
if (crc == uint.MaxValue) crc = 0;
// now we have everything we need
// so we can create a CyclesMesh that the
// RenderEngine can eventually commit to Cycles
var cyclesMesh = new CyclesMesh
{
MeshId = meshid,
verts = meshdata.Vertices.ToFloatArray(),
faces = findices,
uvs = cmuv,
vertex_normals = rhvn,
matid = crc
};
_objectDatabase.AddMesh(cyclesMesh);
}