private void CreateNewVertexAtHover(ref HandState state) { var virtualVertex = EntityManager.GetComponentData <Vertex>(_halfEdgeWidgetVertex); var newVertex = EntityManager.CreateVertex(Level, math.round(virtualVertex.X / GridSnap) * GridSnap, math.round(virtualVertex.Z / GridSnap) * GridSnap); var halfEdgeStack = new TempEntitySet(SetAccess.Enumerate); EntityManager.FindAllStackedHalfEdges(state.HoveredHalfEdge, halfEdgeStack); var newHalfEdges = new NativeArray <Entity>(halfEdgeStack.Count, Allocator.TempJob); for (var i = 0; i < halfEdgeStack.Count; ++i) { newHalfEdges[i] = EntityManager.InsertHalfEdge(halfEdgeStack[i], newVertex); } if (newHalfEdges.Length > 1) { for (var i = 0; i < newHalfEdges.Length; ++i) { var halfEdge = EntityManager.GetComponentData <HalfEdge>(newHalfEdges[i]); if (i > 0) { halfEdge.Below = newHalfEdges[i - 1]; } if (i < newHalfEdges.Length - 1) { halfEdge.Above = newHalfEdges[i + 1]; } EntityManager.SetComponentData(newHalfEdges[i], halfEdge); } } halfEdgeStack.Dispose(); newHalfEdges.Dispose(); EntityManager.SetHovered(newVertex, true); state.HoveredVertex = newVertex; state.HoveredHalfEdge = Entity.Null; }
private void StartExtrude(bool up, ref HandState state) { state.HasExtruded = true; var halfEdges = new TempEntitySet(SetAccess.Enumerate); var srcFloorCeilings = _getSelectedFloorCeilings.ToEntityArray(Allocator.TempJob); foreach (var srcFloorCeilingEnt in srcFloorCeilings) { var srcFloorCeiling = EntityManager.GetComponentData <FloorCeiling>(srcFloorCeilingEnt); var newRoomEnt = EntityManager.CreateRoom(Level); var newFloorCeilingEnt = EntityManager.CreateFloorCeiling(Level, srcFloorCeiling.Plane, !up ? newRoomEnt : srcFloorCeiling.Above, up ? newRoomEnt : srcFloorCeiling.Below); if (up) { if (srcFloorCeiling.Above != Entity.Null) { var aboveRoom = EntityManager.GetComponentData <Room>(srcFloorCeiling.Above); aboveRoom.Floor = newFloorCeilingEnt; EntityManager.SetComponentData(srcFloorCeiling.Above, aboveRoom); } srcFloorCeiling.Above = newRoomEnt; } else { if (srcFloorCeiling.Below != Entity.Null) { var belowRoom = EntityManager.GetComponentData <Room>(srcFloorCeiling.Below); belowRoom.Ceiling = newFloorCeilingEnt; EntityManager.SetComponentData(srcFloorCeiling.Below, belowRoom); } srcFloorCeiling.Below = newRoomEnt; } EntityManager.SetComponentData(srcFloorCeilingEnt, srcFloorCeiling); EntityManager.SetComponentData(newRoomEnt, new Room { Floor = !up ? newFloorCeilingEnt : srcFloorCeilingEnt, Ceiling = up ? newFloorCeilingEnt : srcFloorCeilingEnt }); halfEdges.Clear(); EntityManager.FindRoomHalfEdges(up ? srcFloorCeiling.Below : srcFloorCeiling.Above, halfEdges); _newHalfEdges.Clear(); foreach (var halfEdgeEnt in halfEdges) { var halfEdge = EntityManager.GetComponentData <HalfEdge>(halfEdgeEnt); _newHalfEdges.Add(halfEdgeEnt, EntityManager.CreateHalfEdge(newRoomEnt, halfEdge.Vertex)); } foreach (var srcHalfEdgeEnt in halfEdges) { var dstHalfEdgeEnt = _newHalfEdges[srcHalfEdgeEnt]; var srcHalfEdge = EntityManager.GetComponentData <HalfEdge>(srcHalfEdgeEnt); var dstHalfEdge = EntityManager.GetComponentData <HalfEdge>(dstHalfEdgeEnt); dstHalfEdge.Next = _newHalfEdges[srcHalfEdge.Next]; dstHalfEdge.Above = up ? srcHalfEdge.Above : srcHalfEdgeEnt; dstHalfEdge.Below = !up ? srcHalfEdge.Below : srcHalfEdgeEnt; EntityManager.SetComponentData(dstHalfEdgeEnt, dstHalfEdge); srcHalfEdge.Above = up ? dstHalfEdgeEnt : srcHalfEdge.Above; srcHalfEdge.Below = !up ? dstHalfEdgeEnt : srcHalfEdge.Below; EntityManager.SetComponentData(srcHalfEdgeEnt, srcHalfEdge); } EntityManager.SetSelected(srcFloorCeilingEnt, false); EntityManager.SetSelected(newFloorCeilingEnt, true); } srcFloorCeilings.Dispose(); halfEdges.Dispose(); }