public static void testLineMesh() { Mesh mesh = MeshUtil.createSquareSideLineMesh(new IntVector2(0, 0), new IntVector2(100, 200), 15f); MeshUtil.saveSharedMeshAsset("testLinemesh", mesh); }
public static Mesh RemeshTest(Mesh inMesh, double fResScale = 1.0, int iterations = 50) { inMesh.Faces.ConvertQuadsToTriangles(); DMesh3 mesh = inMesh.ToDMesh3(); mesh.CheckValidity(); AxisAlignedBox3d bounds = mesh.CachedBounds; // construct mesh projection target DMesh3 meshCopy = new DMesh3(mesh); meshCopy.CheckValidity(); DMeshAABBTree3 tree = new DMeshAABBTree3(meshCopy); tree.Build(); MeshProjectionTarget target = new MeshProjectionTarget() { Mesh = meshCopy, Spatial = tree }; // construct constraint set MeshConstraints cons = new MeshConstraints(); //EdgeRefineFlags useFlags = EdgeRefineFlags.NoFlip | EdgeRefineFlags.NoCollapse; EdgeRefineFlags useFlags = EdgeRefineFlags.NoFlip; foreach (int eid in mesh.EdgeIndices()) { double fAngle = MeshUtil.OpeningAngleD(mesh, eid); if (fAngle > 30.0) { cons.SetOrUpdateEdgeConstraint(eid, new EdgeConstraint(useFlags)); Index2i ev = mesh.GetEdgeV(eid); int nSetID0 = (mesh.GetVertex(ev[0]).y > bounds.Center.y) ? 1 : 2; int nSetID1 = (mesh.GetVertex(ev[1]).y > bounds.Center.y) ? 1 : 2; cons.SetOrUpdateVertexConstraint(ev[0], new VertexConstraint(true, nSetID0)); cons.SetOrUpdateVertexConstraint(ev[1], new VertexConstraint(true, nSetID1)); } } Remesher r = new Remesher(mesh); r.Precompute(); r.SetExternalConstraints(cons); r.SetProjectionTarget(target); r.EnableFlips = r.EnableSplits = r.EnableCollapses = true; r.MinEdgeLength = 0.5 * fResScale; r.MaxEdgeLength = 1.0 * fResScale; r.EnableSmoothing = true; r.SmoothSpeedT = 0.5; try { for (int k = 0; k < iterations; ++k) { r.BasicRemeshPass(); // mesh.CheckValidity(); } } catch { // ignore } return(mesh.ToRhinoMesh()); }
private void RebuildItemGrid(int focused) { bool ItemFound = false; for (int y = 0; y < ItemGridDimensions.y; y++) { for (int x = 0; x < ItemGridDimensions.x; x++) { // Find the item and mesh int i = x + y * (int)ItemGridDimensions.x; Item Item = Inventory.Drive.GetItemAt(x + y * (int)ItemGridDimensions.x); if (Item != null && (!ItemGridContainedItems.ContainsKey(i) || ItemGridContainedItems[i] != Item)) { // Clear cell for (int j = 0; j < ItemGridCells[i].childCount; j++) { DestroyImmediate(ItemGridCells[i].GetChild(j).gameObject); } // Add new item GameObject ItemObject = PrefabDB.Create(Item.ModelID, ItemGridCells[i]); MeshUtil.SetMaterial(ItemObject, ItemGridHologramMaterial); ItemGridContainedItems[i] = Item; } else if (Item == null && ItemGridContainedItems.ContainsKey(i)) { for (int j = 0; j < ItemGridCells[i].childCount; j++) { Destroy(ItemGridCells[i].GetChild(j).gameObject); } ItemGridContainedItems.Remove(i); } // Set the base scale and spin status float Scale = 0.13f; bool Spinning = false; if (focused == i || ItemGridSelectedIndex == i) { // Item is selected or hovered, animate Scale = 0.16f; Spinning = true; } if (ItemGridSelectedIndex == i) { // Set preview information if (ItemGridCells[i].childCount > 0) { SetPreviewItem(Item); } TextTextureProperties NameProps = ItemNameText.TextProperties; TextTextureProperties DescriptionProps = ItemDescriptionText.TextProperties; if (Item != null) { NameProps.Text = Item.Name; DescriptionProps.Text = Item.Description; ItemFound = true; } else { NameProps.Text = ""; DescriptionProps.Text = ""; } ItemNameText.SetTextProperties(NameProps); ItemDescriptionText.SetTextProperties(DescriptionProps); // Move selector if ((ItemGridSelector.position - ItemGridCells[i].position).magnitude < 0.01f) { ItemGridSelector.position = ItemGridCells[i].position; } else { ItemGridSelector.position = Vector3.Lerp(ItemGridSelector.position, ItemGridCells[i].position, 10f * Time.deltaTime); } Vector3 NewRot = ItemGridSelector.localEulerAngles; NewRot.z = 0; ItemGridSelector.localEulerAngles = NewRot; } if (!Spinning) { // Not selected, reset rotation if (ItemGridCells[i].childCount > 0) { Transform ItemTransform = ItemGridCells[i].GetChild(0); ItemTransform.LookAt(Camera.transform); Vector3 NewRot = ItemTransform.localEulerAngles; NewRot.z = 0; NewRot.y += 90; ItemTransform.localEulerAngles = NewRot; } } // Update spinning status and scaling ItemGridCells[i].GetComponent <Spinner>().Spinning = Spinning; if (ItemGridCells[i].childCount > 0) { FixMeshScaling(ItemGridCells[i].GetChild(0), Scale); } } } // Hide the selector if nothing is selected ItemGridSelector.gameObject.SetActive(ItemGridSelectedIndex >= 0); // Clean up the preview screen if there was no item if (!ItemFound) { SetPreviewItem(null); TextTextureProperties NameProps = ItemNameText.TextProperties; TextTextureProperties DescriptionProps = ItemDescriptionText.TextProperties; NameProps.Text = ""; DescriptionProps.Text = ""; ItemNameText.SetTextProperties(NameProps); ItemDescriptionText.SetTextProperties(DescriptionProps); PreviewVisibility = Mathf.Lerp(PreviewVisibility, 0f, 10f * Time.deltaTime); } else { PreviewVisibility = Mathf.Lerp(PreviewVisibility, 1f, 10f * Time.deltaTime); } }
//////////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------------------------------------------------------------*/ public virtual void Build(IHoverboardPanelState pPanelState, IHoverboardLayoutState pLayoutState, IBaseItemState pItemState, IItemVisualSettings pSettings) { vPanelState = pPanelState; vLayoutState = pLayoutState; vItemState = pItemState; vSettings = (ItemVisualSettingsStandard)pSettings; vSliderItem = (ISliderItem)vItemState.Item; vTicks = new GameObject[vSliderItem.Ticks]; vWidth = UiItem.Size * vSliderItem.Width; vHeight = UiItem.Size * vSliderItem.Height; vIsVert = (vHeight > vWidth); vGrabW = 1; vZeroValue = (0 - vSliderItem.RangeMin) / (vSliderItem.RangeMax - vSliderItem.RangeMin); gameObject.transform.SetParent(gameObject.transform, false); gameObject.transform.localPosition = new Vector3(vWidth / 2, 0, vHeight / 2f); gameObject.transform.localRotation = Quaternion.AngleAxis((vIsVert ? 90 : 0), Vector3.up); if (vIsVert) //swap dimensions here + rotate graphics later { float tempW = vWidth; vWidth = vHeight; vHeight = tempW; } vSlideX0 = (vGrabW - vWidth) / 2; vSlideW = vWidth - vGrabW; //// vHiddenRect = new UiHoverMeshRectBg(gameObject); vHiddenRect.UpdateSize(vWidth, vHeight); var trackObj = new GameObject("Track"); trackObj.transform.SetParent(gameObject.transform, false); trackObj.transform.localPosition = new Vector3(-vWidth / 2, 0, 0); vTrack = new UiItemSliderTrackRenderer(trackObj); vTrackSegments = new ReadList <DisplayUtil.TrackSegment>(); vTrackCuts = new ReadList <DisplayUtil.TrackSegment>(); //// if (vSliderItem.Ticks > 1) { Vector3 quadScale = new Vector3(UiHoverMeshRect.SizeInset * 2, 0.36f, 0.1f); float percPerTick = 1 / (float)(vSliderItem.Ticks - 1); vTickMeshBuilder = new MeshBuilder(); MeshUtil.BuildQuadMesh(vTickMeshBuilder); vTickMeshBuilder.Commit(); vTickMeshBuilder.CommitColors(Color.clear); for (int i = 0; i < vSliderItem.Ticks; ++i) { GameObject tickObj = new GameObject("Tick" + i); tickObj.transform.SetParent(gameObject.transform, false); tickObj.transform.localPosition = Vector3.right * (vSlideX0 + vSlideW * i * percPerTick); tickObj.transform.localRotation = TickQuatRot; tickObj.transform.localScale = quadScale; tickObj.AddComponent <MeshRenderer>(); MeshFilter tickFilt = tickObj.AddComponent <MeshFilter>(); tickFilt.sharedMesh = vTickMeshBuilder.Mesh; vTicks[i] = tickObj; } } //// vGrabHold = new GameObject("GrabHold"); vGrabHold.transform.SetParent(gameObject.transform, false); vGrabHold.transform.localRotation = Quaternion.Inverse(gameObject.transform.localRotation); var grabObj = new GameObject("Grab"); grabObj.transform.SetParent(vGrabHold.transform, false); vGrab = grabObj.AddComponent <UiItemSliderGrabRenderer>(); vGrab.IsVert = vIsVert; vGrab.Build(vPanelState, vLayoutState, vItemState, vSettings); if (vIsVert) { vGrab.SetCustomSize(vHeight, vGrabW, false); } else { vGrab.SetCustomSize(vGrabW, vHeight, false); } //// vHoverHold = new GameObject("HoverHold"); vHoverHold.transform.SetParent(gameObject.transform, false); var hoverObj = new GameObject("Hover"); hoverObj.transform.SetParent(vHoverHold.transform, false); vHover = new UiHoverMeshRect(hoverObj, "Hover"); }
public override void Init() { road = AssetManager.LoadTexture(AssetManager.GetAppPath() + "\\textures\\road.jpg"); roadCorner = AssetManager.LoadTexture(AssetManager.GetAppPath() + "\\textures\\road_corner.jpg"); curbModel = AssetManager.LoadModel(AssetManager.GetAppPath() + "\\models\\curb.obj"); curbCorner = AssetManager.LoadModel(AssetManager.GetAppPath() + "\\models\\curb_corner.obj"); Random rand = new Random(); int xAmt = rand.Next(2, 7), zAmt = rand.Next(2, 7), scaleX = rand.Next(10, 30), scaleZ = rand.Next(10, 30); int offset = 3; AddRoadCorner(new Line(new Vector3f(0, 0, -2), new Vector3f(0, 0, 0))); for (int x = 0; x <= xAmt; x++) { for (int i = 0; i < zAmt; i++) { AddRoad(new Line(new Vector3f(x * scaleX, 0, i * scaleZ), new Vector3f(x * scaleX, 0, (i + 1) * scaleZ - 2))); AddRoadCorner(new Line(new Vector3f(x * scaleX, 0, (i + 1) * scaleZ - 2), new Vector3f(x * scaleX, 0, (i + 1) * scaleZ))); if (x == 0) { // long bar Node curb2 = (Node)curbModel.Clone(); tmpVec.Set(x * scaleX - 1, 0, (i + 1) * scaleZ - 1); tmpVec.y = HeightRoad(tmpVec); curb2.SetLocalTranslation(tmpVec); curb2.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 180)); curb2.SetLocalScale(new Vector3f(1, 1, scaleZ)); curbNode.AddChild(curb2); } else if (x == (xAmt - 1)) { Node curb2 = (Node)curbModel.Clone(); tmpVec.Set((x + 1) * scaleX + 1, 0, (i) * scaleZ - 1); tmpVec.y = HeightRoad(tmpVec); curb2.SetLocalTranslation(tmpVec); curb2.SetLocalScale(new Vector3f(1, 1, scaleZ)); curbNode.AddChild(curb2); } Node curb0 = (Node)curbModel.Clone(); tmpVec.Set(x * scaleX + 1, 0, i * scaleZ + 1); tmpVec.y = HeightRoad(tmpVec); curb0.SetLocalTranslation(tmpVec); curb0.SetLocalScale(new Vector3f(1, 1, scaleZ - offset - 1)); curbNode.AddChild(curb0); Node curb1 = (Node)curbModel.Clone(); tmpVec.Set(x * scaleX - 1, 0, (i + 1) * scaleZ - offset); tmpVec.y = HeightRoad(tmpVec); curb1.SetLocalTranslation(tmpVec); curb1.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 180)); curb1.SetLocalScale(new Vector3f(1, 1, scaleZ - offset - 1)); curbNode.AddChild(curb1); if (x != 0) { Node curbCorner1 = (Node)curbCorner.Clone(); tmpVec.Set((x) * scaleX - 2, 0, (i + 1) * scaleZ - offset + 1); tmpVec.y = HeightRoad(tmpVec); curbCorner1.SetLocalTranslation(tmpVec); curbCorner1.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 180 + 90)); curbNode.AddChild(curbCorner1); } if (x != xAmt) { Node curbCorner0 = (Node)curbCorner.Clone(); tmpVec.Set(x * scaleX + 2, 0, i * scaleZ); tmpVec.y = HeightRoad(tmpVec); curbCorner0.SetLocalTranslation(tmpVec); curbCorner0.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 90)); curbNode.AddChild(curbCorner0); } } } for (int z = 0; z <= zAmt; z++) { for (int i = 0; i < xAmt; i++) { AddRoad(new Line(new Vector3f(i * scaleX + 1, 0, z * scaleZ - 1), new Vector3f((i + 1) * scaleX - 1, 0, z * scaleZ - 1))); AddRoadCorner(new Line(new Vector3f((i + 1) * scaleX - 1, 0, z * scaleZ - 1), new Vector3f((i + 1) * scaleX + 1, 0, z * scaleZ - 1))); // long pieces if (z == 0) { // long bar Node curb2 = (Node)curbModel.Clone(); tmpVec.Set(i * scaleX, 0, z * scaleZ - 2); tmpVec.y = HeightRoad(tmpVec); curb2.SetLocalTranslation(tmpVec); curb2.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 180 + 90)); curb2.SetLocalScale(new Vector3f(scaleX, 1, 1)); curbNode.AddChild(curb2); } else if (z == (zAmt - 1)) { Node curb2 = (Node)curbModel.Clone(); tmpVec.Set((i + 1) * scaleX, 0, (z + 1) * scaleZ); tmpVec.y = HeightRoad(tmpVec); curb2.SetLocalTranslation(tmpVec); curb2.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 180 + 90 + 180)); curb2.SetLocalScale(new Vector3f(scaleX, 1, 1)); curbNode.AddChild(curb2); } Node curb0 = (Node)curbModel.Clone(); tmpVec.Set((i + 1) * scaleX - 2, 0, z * scaleZ); tmpVec.y = HeightRoad(tmpVec); curb0.SetLocalTranslation(tmpVec); curb0.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 90)); curb0.SetLocalScale(new Vector3f(scaleX - offset - 1, 1, 1)); curbNode.AddChild(curb0); Node curb1 = (Node)curbModel.Clone(); tmpVec.Set((i) * scaleX + offset - 1, 0, z * scaleZ - 2); tmpVec.y = HeightRoad(tmpVec); curb1.SetLocalTranslation(tmpVec); curb1.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 180 + 90)); curb1.SetLocalScale(new Vector3f(scaleX - offset - 1, 1, 1)); curbNode.AddChild(curb1); if (z != zAmt) { Node curbCorner0 = (Node)curbCorner.Clone(); Vector3f curbVec1 = new Vector3f((i + 1) * scaleX - 1, 0, z * scaleZ + 1); curbVec1.y = HeightRoad(curbVec1); curbCorner0.SetLocalTranslation(curbVec1); curbCorner0.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 180)); curbNode.AddChild(curbCorner0); } if (z != 0) { Node curbCorner1 = (Node)curbCorner.Clone(); Vector3f curbVec1 = new Vector3f((i) * scaleX + offset - 2, 0, z * scaleZ - 3); curbVec1.y = HeightRoad(curbVec1); curbCorner1.SetLocalTranslation(curbVec1); curbCorner1.SetLocalRotation(new Quaternion().SetFromAxis(Vector3f.UnitY, 360)); curbNode.AddChild(curbCorner1); } } } Geometry roadMerged = new Geometry(MeshUtil.MergeMeshes(roadNode)); Geometry curbMerged = new Geometry(MeshUtil.MergeMeshes(curbNode)); rootNode.AddChild(curbMerged); roadMerged.Material.SetValue(Material.MATERIAL_CULLENABLED, false); roadMerged.Material.SetValue(Material.TEXTURE_DIFFUSE, road); roadMerged.Material.SetValue(Material.SHININESS, 0.0f); Geometry roadCornerMerged = new Geometry(MeshUtil.MergeMeshes(roadCornerNode)); roadCornerMerged.Material.SetValue(Material.MATERIAL_CULLENABLED, false); roadCornerMerged.Material.SetValue(Material.TEXTURE_DIFFUSE, roadCorner); roadCornerMerged.Material.SetValue(Material.SHININESS, 0.0f); rootNode.AddChild(roadCornerMerged); rootNode.AddChild(roadMerged); /* * * addroad(new line(new vector3f(0, 0, 0), new vector3f(0, 0, 10))); * AddRoad(new Line(new Vector3f(0, 0, 10), new Vector3f(1, 0, 12))); * AddRoad(new Line(new Vector3f(1, 0, 12), new Vector3f(5, 0, 12)));*/ /* * * for (int x = 0; x < 16; x ++) * { * AddRoad(new Line(new Vector3f((float)System.Math.Sin(x)*13, 0, (float)System.Math.Cos(x) * 13), new Vector3f((float)System.Math.Sin(x+1) * 13, 0, (float)System.Math.Cos(x+1) * 13))); * } */ /* AddRoad(new Line(new Vector3f(0, 0, 10), new Vector3f(-3, 0, 11))); * AddRoad(new Line(new Vector3f(-3, 0, 11), new Vector3f(-4, 0, 12))); * AddRoad(new Line(new Vector3f(-4, 0, 12), new Vector3f(-5, 0, 13))); * AddRoad(new Line(new Vector3f(-5, 0, 13), new Vector3f(-6, 0, 14)));*/ // AddRoad(new Line(new Vector3f(0, 0, 10), new Vector3f(10, 0, 10))); /* for (int i = 0; i < 4; i++) * { * Line myline = new Line(lastLine.To, lastLine.To.Add(new Vector3f(rand.Next(-15, 15),0, rand.Next(-15, 15)))); * Geometry quad = new Geometry(QuadFromLine(myline)); * quad.Material.SetValue(Material.MATERIAL_CULLENABLED, false); * quad.Material.SetValue(Material.TEXTURE_DIFFUSE, road); * quad.Material.SetValue(Material.SHININESS, 0.0f); * lastLine = myline; * * rootNode.AddChild(quad); * } */ }
private static void ComputeDataRecursive(MeshSimplify root, GameObject gameObject, bool bRecurseIntoChildren, Simplifier.ProgressDelegate progress = null) { MeshSimplify meshSimplify = gameObject.GetComponent <MeshSimplify>(); if (meshSimplify == null && root._generateIncludeChildren) { if (MeshUtil.HasValidMeshData(gameObject)) { meshSimplify = gameObject.AddComponent <MeshSimplify>(); meshSimplify.MeshSimplifyRoot = root; root.ListDependentChildren.Add(meshSimplify); } } if (meshSimplify != null) { if (IsRootOrBelongsToTree(meshSimplify, root)) { meshSimplify.FreeData(false); MeshFilter meshFilter = meshSimplify.GetComponent <MeshFilter>(); if (meshFilter != null && meshFilter.sharedMesh != null) { if (meshFilter.sharedMesh.vertexCount > 0) { if (meshSimplify.OriginalMesh == null) { meshSimplify.OriginalMesh = meshFilter.sharedMesh; } Simplifier[] simplifiers = meshSimplify.GetComponents <Simplifier>(); for (int c = 0; c < simplifiers.Length; c++) { if (Application.isEditor && Application.isPlaying == false) { DestroyImmediate(simplifiers[c]); } else { Destroy(simplifiers[c]); } } meshSimplify._meshSimplifier = meshSimplify.gameObject.AddComponent <Simplifier>(); meshSimplify._meshSimplifier.hideFlags = HideFlags.HideInInspector; meshSimplify.ConfigureSimplifier(); IEnumerator enumerator = meshSimplify._meshSimplifier.ProgressiveMesh(gameObject, meshSimplify.OriginalMesh, root.RelevanceSpheres, meshSimplify.name, progress); while (enumerator.MoveNext()) { if (Simplifier.Cancelled) { return; } } if (Simplifier.Cancelled) { return; } } } else { SkinnedMeshRenderer skin = meshSimplify.GetComponent <SkinnedMeshRenderer>(); if (skin != null) { if (skin.sharedMesh.vertexCount > 0) { if (meshSimplify.OriginalMesh == null) { meshSimplify.OriginalMesh = skin.sharedMesh; } Simplifier[] simplifiers = meshSimplify.GetComponents <Simplifier>(); for (int c = 0; c < simplifiers.Length; c++) { if (Application.isEditor && Application.isPlaying == false) { DestroyImmediate(simplifiers[c]); } else { Destroy(simplifiers[c]); } } meshSimplify._meshSimplifier = meshSimplify.gameObject.AddComponent <Simplifier>(); meshSimplify._meshSimplifier.hideFlags = HideFlags.HideInInspector; meshSimplify.ConfigureSimplifier(); IEnumerator enumerator = meshSimplify._meshSimplifier.ProgressiveMesh(gameObject, meshSimplify.OriginalMesh, root.RelevanceSpheres, meshSimplify.name, progress); while (enumerator.MoveNext()) { if (Simplifier.Cancelled) { return; } } if (Simplifier.Cancelled) { return; } } } } meshSimplify._dataDirty = false; } } if (bRecurseIntoChildren) { for (int nChild = 0; nChild < gameObject.transform.childCount; nChild++) { ComputeDataRecursive(root, gameObject.transform.GetChild(nChild).gameObject, bRecurseIntoChildren, progress); if (Simplifier.Cancelled) { return; } } } }
//////////////////////////////////////////////////////////////////////////////////////////////// /*--------------------------------------------------------------------------------------------*/ protected override void UpdateMesh(MeshType pType, MeshBuilder pMeshBuild, float pAmount = 1) { MeshUtil.BuildRectangleMesh(pMeshBuild, vMeshW, vMeshH, pAmount); pMeshBuild.Commit(); }