/// <summary> /// Appends a geometry data object to the Mesh, returns false if the mesh would become too big and needs splitting /// </summary> /// <param name="geometryMeshData"></param> /// <param name="modelId"></param> public bool Add(XbimGeometryData geometryMeshData, short modelId = 0) { var transform = XbimMatrix3D.FromArray(geometryMeshData.DataArray2); if (geometryMeshData.GeometryType == XbimGeometryType.TriangulatedMesh) { var strm = new XbimTriangulatedModelStream(geometryMeshData.ShapeData); var fragment = strm.BuildWithNormals(this, transform, modelId); if (fragment.EntityLabel == -1) //nothing was added due to size being exceeded { return(false); } fragment.EntityLabel = geometryMeshData.IfcProductLabel; fragment.EntityTypeId = geometryMeshData.IfcTypeId; _meshes.Add(fragment); } else if (geometryMeshData.GeometryType == XbimGeometryType.BoundingBox) { var r3D = XbimRect3D.FromArray(geometryMeshData.ShapeData); throw new NotImplementedException();//need to fix this // Add(MakeBoundingBox(r3D, transform), geometryMeshData.IfcProductLabel, IfcMetaData.GetType(geometryMeshData.IfcTypeId), modelId); } else { throw new XbimException("Illegal geometry type found"); } return(true); }
//adds the content of the toAdd to this, it is added as a single mesh fragment, any meshes in toAdd are lost public void Add(IXbimMeshGeometry3D toAdd, int entityLabel, Type ifcType, short modelId) { var startPosition = Positions.Count; var fragment = new XbimMeshFragment(startPosition, TriangleIndexCount, modelId); Positions.AddRange(toAdd.Positions); Normals.AddRange(toAdd.Normals); foreach (var idx in toAdd.TriangleIndices) { TriangleIndices.Add(idx + startPosition); } fragment.EndPosition = PositionCount - 1; fragment.EndTriangleIndex = TriangleIndexCount - 1; fragment.EntityLabel = entityLabel; fragment.EntityTypeId = IfcMetaData.IfcTypeId(ifcType); _meshes.Add(fragment); }