/*! \endcond */ #endregion #region ### IOnRequestModule ### public CGData[] OnSlotDataRequest(CGModuleInputSlot requestedBy, CGModuleOutputSlot requestedSlot, params CGDataRequestParameter[] requests) { var raster = GetRequestParameter <CGDataRequestRasterization>(ref requests); var options = GetRequestParameter <CGDataRequestMetaCGOptions>(ref requests); if (options) { if (options.CheckMaterialID) { options.CheckMaterialID = false; UIMessages.Add("MaterialID option not supported!"); } if (options.IncludeControlPoints) { options.IncludeControlPoints = false; UIMessages.Add("IncludeCP option not supported!"); } } if (!raster || raster.Length == 0) { return(null); } var data = GetSplineData(Spline, true, raster, options); return(new CGData[1] { data }); }
/*! \cond PRIVATE */ void createMeshes(ref List <CGVMesh> vMeshes, bool combine) { int exceededVertexCount = 0; if (combine) { sortByVertexCount(ref vMeshes); // Skip meshes that exceeds Vertex limits while (vMeshes[exceededVertexCount].Count > 65534) { exceededVertexCount++; } CGVMesh curVMesh = (vMeshes.Count == 1) ? vMeshes[0] : new CGVMesh(vMeshes[0]); // Just one mesh? No need to create a copy! Otherwise, take a copy! for (int vm = exceededVertexCount + 1; vm < vMeshes.Count; vm++) { if (curVMesh.Count + vMeshes[vm].Count > 65534) { // write curVMesh writeVMeshToMesh(ref curVMesh); curVMesh = (vm < vMeshes.Count - 1) ? vMeshes[vm] : new CGVMesh(vMeshes[vm]); // just one mesh left? No need to create a copy! Otherwise, take a copy! } else // Add new vMesh to curVMesh { curVMesh.MergeVMesh(vMeshes[vm]); } } writeVMeshToMesh(ref curVMesh); } else { for (int vm = 0; vm < vMeshes.Count; vm++) { if (vMeshes[vm].Count < 65535) { CGVMesh vmesh = vMeshes[vm]; writeVMeshToMesh(ref vmesh); } else { exceededVertexCount++; } } } if (exceededVertexCount > 0) { UIMessages.Add(string.Format("{0} meshes skipped (VertexCount>65534)", exceededVertexCount)); } }
public void UpdateColliders() { bool success = true; for (int r = 0; r < m_MeshResources.Count; r++) { if (!m_MeshResources.Items[r].UpdateCollider(Collider, Convex, Material)) { success = false; } } if (!success) { UIMessages.Add("Error setting collider!"); } }
void createSpotMeshes(ref List <CGVMesh> vMeshes, ref CGSpots spots, bool combine) { int exceededVertexCount = 0; int vmCount = vMeshes.Count; CGSpot spot; CGMeshResource res; if (combine) { var sortedSpots = new List <CGSpot>(spots.Points); if (GroupMeshes) { sortedSpots.Sort((CGSpot a, CGSpot b) => a.Index.CompareTo(b.Index)); } spot = sortedSpots[0]; CGVMesh curVMesh = new CGVMesh(vMeshes[spot.Index]); if (spot.Position != Vector3.zero || spot.Rotation != Quaternion.identity || spot.Scale != Vector3.one) { curVMesh.TRS(spot.Matrix); } for (int s = 1; s < sortedSpots.Count; s++) { spot = sortedSpots[s]; // Filter spot.index not in vMeshes[] if (spot.Index > -1 && spot.Index < vmCount) { if (curVMesh.Count + vMeshes[spot.Index].Count > 65534 || (GroupMeshes && spot.Index != sortedSpots[s - 1].Index)) { // write curVMesh writeVMeshToMesh(ref curVMesh); curVMesh = new CGVMesh(vMeshes[spot.Index]); if (!spot.Matrix.isIdentity) { curVMesh.TRS(spot.Matrix); } } else { // Add new vMesh to curVMesh if (!spot.Matrix.isIdentity) { curVMesh.MergeVMesh(vMeshes[spot.Index], spot.Matrix); } else { curVMesh.MergeVMesh(vMeshes[spot.Index]); } } } } writeVMeshToMesh(ref curVMesh); } else { for (int s = 0; s < spots.Count; s++) { spot = spots.Points[s]; // Filter spot.index not in vMeshes[] if (spot.Index > -1 && spot.Index < vmCount) { // Don't touch vertices, TRS Resource instead if (vMeshes[spot.Index].Count < 65535) { CGVMesh vmesh = vMeshes[spot.Index]; res = writeVMeshToMesh(ref vmesh); if (spot.Position != Vector3.zero || spot.Rotation != Quaternion.identity || spot.Scale != Vector3.one) { spot.ToTransform(res.Filter.transform); } } else { exceededVertexCount++; } } } } if (exceededVertexCount > 0) { UIMessages.Add(string.Format("{0} meshes skipped (VertexCount>65534)", exceededVertexCount)); } }
/*! \endcond */ #endregion #region ### Public Methods ### public override void Refresh() { base.Refresh(); CGVolume vol = InVolume.GetData <CGVolume>(); var holes = InVolumeHoles.GetAllData <CGVolume>(); if (vol) { bool genStart = (StartCap == CGYesNoAuto.Yes || (StartCap == CGYesNoAuto.Auto && !vol.Seamless)); bool genEnd = (EndCap == CGYesNoAuto.Yes || (EndCap == CGYesNoAuto.Auto && !vol.Seamless)); if (!genStart && !genEnd) { OutVMesh.SetData(null); return; } var vmesh = new CGVMesh(); Vector3[] vtStart = new Vector3[0]; Vector3[] vtEnd = new Vector3[0]; vmesh.AddSubMesh(new CGVSubMesh()); CGVSubMesh submesh = vmesh.SubMeshes[0]; if (genStart) { #region --- Start Cap --- var tess = new Tess(); tess.UsePooling = true; tess.AddContour(make2DSegment(vol, 0)); for (int h = 0; h < holes.Count; h++) { if (holes[h].Count < 3) { OutVMesh.SetData(null); UIMessages.Add("Hole Cross has <3 Vertices: Can't create Caps!"); return; } tess.AddContour(make2DSegment(holes[h], 0)); } tess.Tessellate(WindingRule.EvenOdd, ElementType.Polygons, 3); vtStart = UnityLibTessUtility.FromContourVertex(tess.Vertices); Bounds b; vmesh.Vertex = applyMat(vtStart, getMat(vol, 0, true), out b); submesh.Material = StartMaterial; submesh.Triangles = tess.Elements; if (ReverseTriOrder) { flipTris(ref submesh.Triangles, 0, submesh.Triangles.Length); } if (GenerateUV) { vmesh.UV = new Vector2[vtStart.Length]; applyUV(vtStart, ref vmesh.UV, 0, vtStart.Length, StartMaterialSettings, b); } #endregion } if (genEnd) { #region --- End Cap --- var tess = new Tess(); tess.UsePooling = true; tess.AddContour(make2DSegment(vol, 0)); for (int h = 0; h < holes.Count; h++) { if (holes[h].Count < 3) { OutVMesh.SetData(null); UIMessages.Add("Hole Cross has <3 Vertices: Can't create Caps!"); return; } tess.AddContour(make2DSegment(holes[h], 0)); } tess.Tessellate(WindingRule.EvenOdd, ElementType.Polygons, 3); vtEnd = UnityLibTessUtility.FromContourVertex(tess.Vertices); Bounds b; int l = vmesh.Vertex.Length; vmesh.Vertex = vmesh.Vertex.AddRange <Vector3>(applyMat(vtEnd, getMat(vol, vol.Count - 1, true), out b)); int[] tris = tess.Elements; if (!ReverseTriOrder) { flipTris(ref tris, 0, tris.Length); } for (int i = 0; i < tris.Length; i++) { tris[i] += l; } if (!CloneStartCap && StartMaterial != EndMaterial) { vmesh.AddSubMesh(new CGVSubMesh(tris, EndMaterial)); } else { submesh.Material = StartMaterial; submesh.Triangles = submesh.Triangles.AddRange <int>(tris); } if (GenerateUV) { System.Array.Resize <Vector2>(ref vmesh.UV, vmesh.UV.Length + vtEnd.Length); applyUV(vtEnd, ref vmesh.UV, vtStart.Length, vtEnd.Length, (CloneStartCap) ? StartMaterialSettings : EndMaterialSettings, b); } #endregion } OutVMesh.SetData(vmesh); } }
/*! \endcond */ #endregion #region ### Public Methods ### public override void Refresh() { base.Refresh(); CGVolume vol = InVolume.GetData <CGVolume>(); var holes = InVolumeHoles.GetAllData <CGVolume>(); if (vol) { bool genStart = (StartCap == CGYesNoAuto.Yes || (StartCap == CGYesNoAuto.Auto && !vol.Seamless)); bool genEnd = (EndCap == CGYesNoAuto.Yes || (EndCap == CGYesNoAuto.Auto && !vol.Seamless)); if (!genStart && !genEnd) { OutVMesh.SetData(null); return; } var vmesh = new CGVMesh(); Vector3[] vtStart = new Vector3[0]; Vector3[] vtEnd = new Vector3[0]; Polygon pOuter; vmesh.AddSubMesh(new CGVSubMesh()); CGVSubMesh submesh = vmesh.SubMeshes[0]; Vector3[] points; if (genStart) { #region --- Start Cap --- points = make2DSegment(vol, 0); if (points.Length < 3) { OutVMesh.SetData(null); UIMessages.Add("Cross has <3 Vertices: Can't create Caps!"); return; } pOuter = new Polygon(points); for (int h = 0; h < holes.Count; h++) { points = make2DSegment(holes[h], 0); if (points.Length < 3) { OutVMesh.SetData(null); UIMessages.Add("Hole Cross has <3 Vertices: Can't create Caps!"); return; } pOuter.AddHole(new Polygon(points)); } try { P2T.Triangulate(pOuter); } catch (System.Exception e) { Debug.LogException(e); OutVMesh.SetData(null); return; } submesh.Material = StartMaterial; pOuter.GetResults(out vtStart, out submesh.Triangles, ReverseTriOrder); vmesh.Vertex = applyMat(vtStart, getMat(vol, 0, true)); if (GenerateUV) { vmesh.UV = new Vector2[vtStart.Length]; applyUV(vtStart, ref vmesh.UV, 0, vtStart.Length, pOuter.Bounds.Bounds, StartMaterialSettings); } #endregion } if (genEnd) { #region --- End Cap --- points = make2DSegment(vol, vol.Count - 1); if (points.Length < 3) { OutVMesh.SetData(null); UIMessages.Add("Cross has <3 Vertices: Can't create Caps!"); return; } pOuter = new Polygon(points); for (int h = 0; h < holes.Count; h++) { points = make2DSegment(holes[h], holes[h].Count - 1); if (points.Length < 3) { OutVMesh.SetData(null); UIMessages.Add("Hole Cross has <3 Vertices: Can't create Caps!"); return; } pOuter.AddHole(new Polygon(points)); } try { P2T.Triangulate(pOuter); } catch (System.Exception e) { Debug.LogException(e); OutVMesh.SetData(null); return; } int[] tris; pOuter.GetResults(out vtEnd, out tris, !ReverseTriOrder, vtStart.Length); vmesh.Vertex = vmesh.Vertex.AddRange <Vector3>(applyMat(vtEnd, getMat(vol, vol.Count - 1, true))); if (!CloneStartCap && StartMaterial != EndMaterial) { vmesh.AddSubMesh(new CGVSubMesh(tris, EndMaterial)); } else { submesh.Material = StartMaterial; submesh.Triangles = submesh.Triangles.AddRange <int>(tris); } if (GenerateUV) { System.Array.Resize <Vector2>(ref vmesh.UV, vmesh.UV.Length + vtEnd.Length); applyUV(vtEnd, ref vmesh.UV, vtStart.Length, vtEnd.Length, pOuter.Bounds.Bounds, (CloneStartCap) ? StartMaterialSettings : EndMaterialSettings); } #endregion } OutVMesh.SetData(vmesh); } }