/// <summary> /// Record CyclesMesh as new mesh data to commit to Cycles. /// </summary> /// <param name="me"></param> public void AddMesh(CyclesMesh me) { _cqMeshChanges[me.MeshId] = me; }
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); }