public void Update()
        {
            Clear();

            var activeEntity = StaticStates.Get <ActiveEntityState>().ActiveEntity;

            Profiler.BeginSample("Component Renderer outer");
            RenderOuterComponent(activeEntity);
            Profiler.EndSample();

            Profiler.BeginSample("Component Renderer inner");
            RenderInnerComponents(activeEntity);
            Profiler.EndSample();

            if (!activeEntity.GetState <PhysicalState>().IsRoot())
            {
                var entitiesAtThisEntitiesLevel = activeEntity.GetState <PhysicalState>().ParentEntity.GetState <PhysicalState>().ChildEntities;
                foreach (var entity in entitiesAtThisEntitiesLevel)
                {
                    RenderOuterComponent(entity, 0.4f);
                    RenderInnerComponents(entity, 0.4f);
                }
            }

            if (activeEntity != lastRenderedEntity)
            {
                CenterCamera(activeEntity);
            }

            lastRenderedEntity = activeEntity;
        }
 private static void UpdateLocationLookup(Entity entityToAdd, GridCoordinate locationToAddIt, PhysicalState targetEntityPhysicalState)
 {
     if (!targetEntityPhysicalState.childEntityLookup.ContainsKey(locationToAddIt))
     {
         targetEntityPhysicalState.childEntityLookup.Add(locationToAddIt, new List <Entity>());
     }
     targetEntityPhysicalState.childEntityLookup[locationToAddIt].Add(entityToAdd);
 }
        private GridCoordinate GetComponentCenter(Entity entity)
        {
            var coreComponent = entity.GetState <PhysicalState>();
            var midpoint      = new GridCoordinate(
                Mathf.RoundToInt(coreComponent.InternalWidth / 2.0f),
                Mathf.RoundToInt(coreComponent.InternalHeight / 2.0f)
                );

            return(midpoint);
        }
 public PhysicalState(Entity parentEntity, List <Entity> childEntities, GridCoordinate bottomLeftCoordinate, int internalWidth, int internalHeight, bool isTangible, bool isPermeable)
 {
     ParentEntity         = parentEntity;
     ChildEntities        = childEntities;
     BottomLeftCoordinate = bottomLeftCoordinate;
     InternalWidth        = internalWidth;
     InternalHeight       = internalHeight;
     IsTangible           = isTangible;
     IsPermeable          = isPermeable;
 }
 public void RemoveEntityFromEntity(Entity entityToRemove)
 {
     ChildEntities.ForEach(entity => {
         if (Equals(entity, entityToRemove))
         {
             childEntityLookup[entityToRemove.GetState <PhysicalState>().BottomLeftCoordinate].Remove(entityToRemove);
             ChildEntities.Remove(entityToRemove);
         }
     });
 }
 private void RenderOuterComponent(Entity module, float opacity = 1.0f)
 {
     for (var x = 0; x < module.GetState <PhysicalState>().InternalWidth; x++)
     {
         for (var y = 0; y < module.GetState <PhysicalState>().InternalHeight; y++)
         {
             var grid = new GridCoordinate(x, y);
             var tile = SimplePool.Spawn(Tile);
             //SetOpacity(tile, opacity);
             tile.transform.parent   = outerRendererRoot.transform;
             tile.transform.position = GridCoordinate.GridToPosition(grid);
         }
     }
 }
        public static bool AddEntityToEntity([NotNull] Entity entityToAdd, [NotNull] GridCoordinate locationToAddIt, [NotNull] Entity entityToAddItTo)
        {
            var physicalState = entityToAdd.GetState <PhysicalState>();

            physicalState.ParentEntity         = entityToAddItTo;
            physicalState.BottomLeftCoordinate = locationToAddIt;
            var targetEntityPhysicalState = entityToAddItTo.GetState <PhysicalState>();
            var entitiesAtTargetLocation  = targetEntityPhysicalState.GetEntitiesAtGrid(locationToAddIt).ToList();

            if (!entitiesAtTargetLocation.Any() || entitiesAtTargetLocation.All(entity => !entity.GetState <PhysicalState>().IsTangible))
            {
                targetEntityPhysicalState.ChildEntities.Add(entityToAdd);
                UpdateLocationLookup(entityToAdd, locationToAddIt, targetEntityPhysicalState);
                return(true);
            }
            return(false);
        }
        public void Start()
        {
            SimplePool.Preload(Tile, 200);

            outerRendererRoot = new GameObject();
            if (outerRendererRoot != null)
            {
                outerRendererRoot.name             = "OuterComponent";
                outerRendererRoot.transform.parent = transform;
            }

            innerRendererRoot = new GameObject();
            if (innerRendererRoot != null)
            {
                innerRendererRoot.name             = "InnerComponent";
                innerRendererRoot.transform.parent = transform;
            }

            lastRenderedEntity = new Entity(null, -1);
        }
        private void RenderInnerComponents(Entity entityToRender, float opacity = 1.0f)
        {
            for (var x = 0; x < entityToRender.GetState <PhysicalState>().InternalWidth; x++)
            {
                for (var y = 0; y < entityToRender.GetState <PhysicalState>().InternalHeight; y++)
                {
                    var grid = new GridCoordinate(x, y);

                    Profiler.BeginSample("Get entities at grid");
                    var innerEntities = entityToRender.GetState <PhysicalState>().GetEntitiesAtGrid(grid);
                    Profiler.EndSample();

                    foreach (var innerEntity in innerEntities)
                    {
                        Profiler.BeginSample("Resources Loading");
                        var innerModuleAsset = Resources.Load <GameObject>(innerEntity.GetState <EntityTypeState>().EntityType);
                        Profiler.EndSample();

                        if (innerModuleAsset == null)
                        {
                            UnityEngine.Debug.LogError(innerEntity.GetState <EntityTypeState>().EntityType);
                        }

                        var moduleGameObject = SimplePool.Spawn(innerModuleAsset);
                        //SetOpacity(moduleGameObject, opacity);
                        moduleGameObject.transform.parent   = innerRendererRoot.transform;
                        moduleGameObject.transform.position = GridCoordinate.GridToPosition(grid);
                        var possibleRenderer = moduleGameObject.GetComponent <IEntityRenderer>();
                        if (possibleRenderer != null)
                        {
                            possibleRenderer.OnRenderEntity(innerEntity);
                        }
                    }
                }
            }
        }
 private void CenterCamera(Entity entity)
 {
     //CameraController.Instance.SetPosition(GridCoordinate.GridToPosition(GetComponentCenter(module)));
 }