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;
        }
Exemple #2
0
        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();
        }