Наследование: MonoBehaviour
Пример #1
0
        internal void OnDeserializedMethod(StreamingContext context)
        {
            //DiagManager.Instance.LogInfo(String.Format("GroundMap.OnDeserializedMethod(): Map {0} deserialized!", AssetName));

            //recompute the grid
            grid = new AABB.Grid(Width, Height, GraphicsManager.TileSize);

            //TODO: v0.5: remove this
            if (Background == null)
            {
                Background = new MapBG();
            }
            if (BlankBG == null)
            {
                BlankBG = new AutoTile();
            }


            if (ActiveChar != null)
            {
                ActiveChar.OnDeserializeMap(this);
                signCharToMap(ActiveChar);
            }

            ReloadEntLayer(0);
        }
        public void AutoTile_Edit(AutoTile element, TileBoxViewModel.EditElementOp op)
        {
            TileEditForm      frmData = new TileEditForm();
            TileEditViewModel tmv     = new TileEditViewModel();

            frmData.DataContext = tmv;
            tmv.Name            = element.ToString();

            //load as if eyedropping
            tmv.TileBrowser.TileSize     = ZoneManager.Instance.CurrentGround.TileSize;
            tmv.AutotileBrowser.TileSize = ZoneManager.Instance.CurrentGround.TileSize;
            tmv.LoadTile(element);

            tmv.SelectedOKEvent += () =>
            {
                element = tmv.GetTile();
                op(element);
                frmData.Close();
            };
            tmv.SelectedCancelEvent += () =>
            {
                frmData.Close();
            };

            DevForm form = (DevForm)DiagManager.Instance.DevEditor;

            form.GroundEditForm.RegisterChild(frmData);
            frmData.Show();
        }
        public AutoTile GetSanitizedTile(Loc offset)
        {
            if (autotile > -1)
            {
                AutoTile auto = new AutoTile(autotile, associates);
                return(auto);
            }

            TileLayer newLayer  = new TileLayer();
            bool      hasFilled = false;

            foreach (TileFrame frame in layer.Frames)
            {
                TileFrame newFrame = new TileFrame(frame.TexLoc + offset, frame.Sheet);
                //check for emptiness
                long tilePos = GraphicsManager.TileIndex.GetPosition(newFrame.Sheet, newFrame.TexLoc);
                if (tilePos > 0)
                {
                    newLayer.Frames.Add(newFrame);
                    hasFilled = true;
                }
                else
                {
                    newLayer.Frames.Add(TileFrame.Empty);
                }
            }
            if (!hasFilled)
            {
                return(new AutoTile());
            }

            newLayer.FrameLength = layer.FrameLength;
            return(new AutoTile(newLayer));
        }
Пример #4
0
        void Update()
        {
            if (Input.GetMouseButtonDown(0) && isDialogActive() == false)
            {
                Vector2      pos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
                RaycastHit2D hit = Physics2D.Raycast(pos, Vector2.zero);
                //Unit Touch or AutoTile Touch
                if (hit.collider != null)
                {
                    //1. 유닛 팔레트에선 Unit이 있는 오브젝트일 것임
                    //2. 선택타일에선 AutoTile이 나타날 것이다
                    GameObject gameObject = hit.collider.gameObject;
                    Unit       unit       = gameObject.GetComponent <Unit>();
                    AutoTile   tile       = gameObject.GetComponent <AutoTile>();

                    if (unit != null)
                    {
                        if (gameObject.tag == "pallette")
                        {
                            SelectPallette(unit);
                            selectedUnit = gameObject;
                        }
                    }
                    else if (tile != null)
                    {
                        if (gameObject.tag == "placable")
                        {
                            SelectAutoTile(tile);
                        }
                    }
                }
            }
        }
Пример #5
0
 private GameObject GetBoardTile(AutoTile autoTile, Point point, int tile)
 {
     return autoTile.GetTile(
         !_board.InBounds(point + Point.Right) || _board.GetTile(point + Point.Right) == tile,
         !_board.InBounds(point + Point.Down) || _board.GetTile(point + Point.Down) == tile,
         !_board.InBounds(point + Point.Left) || _board.GetTile(point + Point.Left) == tile,
         !_board.InBounds(point + Point.Up) || _board.GetTile(point + Point.Up) == tile
     );
 }
    public override void OnInspectorGUI()
    {
        AutoTile autoTile = (AutoTile)target;

        DrawDefaultInspector();

        if (GUILayout.Button("Update"))
        {
            autoTile.UpdateState();
        }
    }
    public void OnEnable()
    {
        _autoTile = (AutoTile)target;

        _icons[(int)AutoTile.TileEdge.All]          = Resources.Load("Icons/AutoTile/autotile_0000") as Texture;
        _icons[(int)AutoTile.TileEdge.ThreeSides]    = Resources.Load("Icons/AutoTile/autotile_1000") as Texture;
        _icons[(int)AutoTile.TileEdge.OppositeSides] = Resources.Load("Icons/AutoTile/autotile_0101") as Texture;
        _icons[(int)AutoTile.TileEdge.Corner]        = Resources.Load("Icons/AutoTile/autotile_1100") as Texture;
        _icons[(int)AutoTile.TileEdge.OneSide]       = Resources.Load("Icons/AutoTile/autotile_1101") as Texture;
        _icons[(int)AutoTile.TileEdge.None]           = Resources.Load("Icons/AutoTile/autotile_1111") as Texture;
    }
Пример #8
0
        public void SelectAutoTile(AutoTile tile)
        {
            if (selected2.activeInHierarchy)
            {
                selected.SetActive(true);
                tile.attach(selected);
                this.selectedTile = tile;
                //유닛 설치에 관한 다이얼로그 표시
                //TODO : 다이얼로그 만들고 이 클래스에 인터페이스를 추가하는식으로 이어줘야 한다
                OKCancelDialog dialog = okCancelDialog.GetComponent <OKCancelDialog>();

                dialog.SetDialogListener(this);
                okCancelDialog.SetActive(true);
                dialog.SetText("이 곳에 해당 유닛을 위치시키겠습니까?");
            }
        }
Пример #9
0
        private void OnNewAutoTile(object sender, EventArgs eventArgs)
        {
            int[] indexSet = new int[16];
            for (int index = 0; index < 16; index++)
            {
                indexSet[index] = -1;
            }

            // determine unused name
            int    nameIndex = 1;
            string newId     = null;

            while (true)
            {
                newId = "Auto Tile #" + nameIndex;
                bool duplicate = false;
                foreach (AutoTile autoTile in m_autoTiles)
                {
                    if (autoTile.Id == newId)
                    {
                        duplicate = true;
                        break;
                    }
                }
                if (!duplicate)
                {
                    break;
                }
                ++nameIndex;
            }

            AutoTile newAutoTile = new AutoTile(newId, m_tileSheet, indexSet);

            m_autoTiles.Add(newAutoTile);
            m_selectedAutoTile = newAutoTile;

            SortAutoTiles();
            UpdateIdComboBox();

            m_cmbId.SelectedIndex = m_autoTiles.IndexOf(m_selectedAutoTile);

            UpdateDialogState(true);
            m_btnRename.Enabled  = true;
            m_tilePicker.Enabled = true;
            m_btnDelete.Enabled  = true;
        }
Пример #10
0
        public static void CreateAutoTileAsset(string path, params string[] tilenames)
        {
            var alltilesprites = AssetDatabase.LoadAllAssetsAtPath(path).OfType <Sprite>().OrderBy(s => s.name).ToList();

            for (var i = 0; i < tilenames.Length; i++)
            {
                var spriteList = alltilesprites.Skip(i * toPaint.Length).Take(toPaint.Length).ToList();
                var autotile   = new AutoTile()
                {
                    name    = (tilenames[i]),
                    sprites = spriteIndex.Select(j => spriteList[j]).ToArray()
                };

                AssetDatabase.CreateAsset(autotile, "assets\\" + tilenames[i] + ".asset");
            }
            AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate);
        }
Пример #11
0
    private bool CompareNeighbor(int x, int y)
    {
        GameObject neighbor = getNeighbor(x, y);

        if (!neighbor)
        {
            return(false);
        }

        AutoTile neighborAutoTile = neighbor.GetComponent <AutoTile>();

        if (!neighborAutoTile)
        {
            return(false);
        }

        return(neighborAutoTile.tileTag == tileTag);
    }
Пример #12
0
        public void attach()
        {
            string     name       = "autotile(" + this.x + "," + this.y + ")";
            Transform  tfAutoTile = this.autoMapper.transform.Find(name);
            GameObject goAutoTile = tfAutoTile.gameObject;

            if (goAutoTile == null)
            {
                throw new CannotFindComponentException(name + "을 찾지못함");
            }
            AutoTile tile = goAutoTile.GetComponent <AutoTile>();

            if (tile == null)
            {
                throw new CannotFindComponentException(name + " AutoTile 을 찾지못함");
            }
            tile.attach(this.gameObject);
        }
Пример #13
0
    /// <summary> Add auto-tile definition. Mainly for editor use. </summary>
    public void AddAutoTile(bool withCorners)
    {
        AutoTile at = new AutoTile()
        {
            id = nextAutoTileId++, tiles = new GameMapTile[withCorners ? 47 : 16]
        };

        for (int i = 0; i < at.tiles.Length; i++)
        {
            at.tiles[i] = new GameMapTile()
            {
                id = nextTileId++, _aid = at.id
            };
        }

        autoTiles.Add(at);
        _cache = null;
    }
Пример #14
0
    void ToggleTool()
    {
        if (pointHit && pointHit.gameObject.GetComponent <AutoTile>() != null)
        {
            AutoTile     currentTile = pointHit.gameObject.GetComponent <AutoTile>();
            AutoTileMode newValue;
            switch (currentTile.autoTileMode)
            {
            case AutoTileMode.Corner:     newValue = AutoTileMode.Slope; break;

            case AutoTileMode.Slope:      newValue = AutoTileMode.Corner; break;

            default:                      newValue = AutoTileMode.Corner; break;
            }
            SerializedObject target = new SerializedObject(currentTile);
            target.FindProperty("autoTileMode").enumValueIndex = (int)newValue;
            target.ApplyModifiedProperties();
            currentTile.UpdateTile();
        }
    }
Пример #15
0
        public GroundMap()
        {
            AssetName    = "";
            rand         = new ReRandom(0);
            ScriptEvents = new Dictionary <LuaEngine.EMapCallbacks, ScriptEvent>();

            Entities = new List <EntityLayer>();

            Status = new Dictionary <int, MapStatus>();

            Background = new MapBG();
            BlankBG    = new AutoTile();

            Name    = new LocalText();
            Comment = "";
            Music   = "";

            Layers = new List <MapLayer>();

            Decorations = new List <AnimLayer>();
        }
Пример #16
0
    public static Dictionary <string, Sprite> GetSprites(TileData tileData)
    {
        Dictionary <string, Sprite> sprites   = new Dictionary <string, Sprite>();
        AutoTileAnimated            animation = tileData.GetModifierOfType <AutoTileAnimated>() as AutoTileAnimated;

        if (animation != null)
        {
            for (int i = 0; i < animation.frames; ++i)
            {
                foreach (TerrainBrush.TileType tileType in Enum.GetValues(typeof(TerrainBrush.TileType)))
                {
                    sprites[tileData.Name + tileType.ToString("") + i] = GetTileSprite(tileData.Name + tileType.ToString("") + i);
                }
            }
            return(sprites);
        }
        AutoTile autoTile = tileData.GetModifierOfType <AutoTile>() as AutoTile;

        if (autoTile != null)
        {
            foreach (TerrainBrush.TileType tileType in Enum.GetValues(typeof(TerrainBrush.TileType)))
            {
                sprites[tileData.Name + tileType.ToString("")] = GetTileSprite(tileData.Name + tileType.ToString(""));
            }
            return(sprites);
        }
        TileRenderer renderer = tileData.GetModifierOfType <TileRenderer>() as TileRenderer;

        if (renderer != null)
        {
            for (int i = 0; i < renderer.tileAmounts; ++i)
            {
                sprites[tileData.Name + i] = GetTileSprite(tileData.Name + i);
            }
            return(sprites);
        }
        return(null);
    }
Пример #17
0
    void NotificateChange(int x, int y)
    {
        if (x < 0 || y < 0 || x >= width || y >= height)
        {
            return;
        }

        Node       node  = nodeMap[x, y];
        GameObject block = node.GetBlock();

        if (!block)
        {
            return;
        }

        AutoTile autoTile = block.GetComponent <AutoTile>() as AutoTile;

        if (autoTile == null)
        {
            return;
        }

        autoTile.UpdateState();
    }
Пример #18
0
        protected override void PostDraw(SpriteBatch spriteBatch)
        {
            Matrix matrix = Matrix.CreateScale(new Vector3(drawScale, drawScale, 1));

            spriteBatch.Begin(SpriteSortMode.Deferred, BlendState.AlphaBlend, SamplerState.PointClamp, null, null, null, matrix);

            if (AutoTileInProgress != null)
            {
                for (int jj = viewTileRect.Y; jj < viewTileRect.End.Y; jj++)
                {
                    for (int ii = viewTileRect.X; ii < viewTileRect.End.X; ii++)
                    {
                        Loc testLoc = new Loc(ii, jj);
                        if (Collision.InBounds(ZoneManager.Instance.CurrentMap.Width, ZoneManager.Instance.CurrentMap.Height, testLoc) &&
                            AutoTileInProgress.IncludesLoc(testLoc))
                        {
                            AutoTile brush = AutoTileInProgress.GetBrush(testLoc);
                            if (brush.IsEmpty())
                            {
                                GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(ii * GraphicsManager.TileSize - ViewRect.X, jj * GraphicsManager.TileSize - ViewRect.Y, GraphicsManager.TileSize, GraphicsManager.TileSize), null, Color.Black);
                            }
                            else
                            {
                                brush.Draw(spriteBatch, new Loc(ii * GraphicsManager.TileSize, jj * GraphicsManager.TileSize) - ViewRect.Start);
                            }
                        }
                    }
                }
            }

            //draw the blocks

            for (int jj = viewTileRect.Y; jj < viewTileRect.End.Y; jj++)
            {
                for (int ii = viewTileRect.X; ii < viewTileRect.End.X; ii++)
                {
                    Loc testLoc = new Loc(ii, jj);
                    if (Collision.InBounds(ZoneManager.Instance.CurrentMap.Width, ZoneManager.Instance.CurrentMap.Height, testLoc))
                    {
                        TerrainTile tile = ZoneManager.Instance.CurrentMap.Tiles[ii][jj].Data;
                        if (TerrainInProgress != null && TerrainInProgress.IncludesLoc(testLoc))
                        {
                            tile = TerrainInProgress.GetBrush(testLoc);
                            if (tile.TileTex.IsEmpty())
                            {
                                GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(ii * GraphicsManager.TileSize - ViewRect.X, jj * GraphicsManager.TileSize - ViewRect.Y, GraphicsManager.TileSize, GraphicsManager.TileSize), null, Color.Black);
                            }
                            else
                            {
                                tile.TileTex.Draw(spriteBatch, new Loc(ii * GraphicsManager.TileSize, jj * GraphicsManager.TileSize) - ViewRect.Start);
                            }
                        }

                        if (ShowTerrain)
                        {
                            TerrainData data  = tile.GetData();
                            Color       color = Color.Transparent;
                            switch (data.BlockType)
                            {
                            case TerrainData.Mobility.Block:
                                color = Color.Red;
                                break;

                            case TerrainData.Mobility.Water:
                                color = Color.Blue;
                                break;

                            case TerrainData.Mobility.Lava:
                                color = Color.Orange;
                                break;

                            case TerrainData.Mobility.Abyss:
                                color = Color.Black;
                                break;

                            case TerrainData.Mobility.Impassable:
                                color = Color.White;
                                break;
                            }
                            if (color != Color.Transparent)
                            {
                                GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(ii * GraphicsManager.TileSize - ViewRect.X, jj * GraphicsManager.TileSize - ViewRect.Y, GraphicsManager.TileSize, GraphicsManager.TileSize), null, color * 0.5f);
                            }
                        }
                    }
                }
            }
            if (ShowEntrances)
            {
                foreach (LocRay8 entrance in ZoneManager.Instance.CurrentMap.EntryPoints)
                {
                    Color showColor = Color.OrangeRed;
                    GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(entrance.Loc.X * GraphicsManager.TileSize - ViewRect.X, entrance.Loc.Y * GraphicsManager.TileSize - ViewRect.Y, GraphicsManager.TileSize, GraphicsManager.TileSize), null, showColor * 0.75f);
                }
            }

            if (TileInProgress != null)
            {
                for (int jj = viewTileRect.Y; jj < viewTileRect.End.Y; jj++)
                {
                    for (int ii = viewTileRect.X; ii < viewTileRect.End.X; ii++)
                    {
                        Loc testLoc = new Loc(ii, jj);
                        if (Collision.InBounds(ZoneManager.Instance.CurrentMap.Width, ZoneManager.Instance.CurrentMap.Height, testLoc) &&
                            TileInProgress.IncludesLoc(testLoc))
                        {
                            EffectTile tile = TileInProgress.GetBrush(testLoc);
                            if (tile.ID < 0)
                            {
                                GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(ii * GraphicsManager.TileSize - ViewRect.X, jj * GraphicsManager.TileSize - ViewRect.Y, GraphicsManager.TileSize, GraphicsManager.TileSize), null, Color.Black);
                            }
                            else
                            {
                                TileData entry = DataManager.Instance.GetTile(tile.ID);
                                if (entry.Anim.AnimIndex != "")
                                {
                                    DirSheet sheet   = GraphicsManager.GetObject(entry.Anim.AnimIndex);
                                    Loc      drawLoc = new Loc(ii * GraphicsManager.TileSize, jj * GraphicsManager.TileSize) - ViewRect.Start + new Loc(GraphicsManager.TileSize / 2) - new Loc(sheet.Width, sheet.Height) / 2;
                                    sheet.DrawDir(spriteBatch, drawLoc.ToVector2(), entry.Anim.GetCurrentFrame(GraphicsManager.TotalFrameTick, sheet.TotalFrames),
                                                  entry.Anim.GetDrawDir(Dir8.None), Color.White);
                                }
                                else
                                {
                                    GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(ii * GraphicsManager.TileSize - ViewRect.X, jj * GraphicsManager.TileSize - ViewRect.Y, GraphicsManager.TileSize, GraphicsManager.TileSize), null, Color.White);
                                }
                            }
                        }
                    }
                }
            }

            spriteBatch.End();
        }
Пример #19
0
 public void AddAutoTile(AutoTile autoTile)
 {
     autoTiles.Add(autoTile.Id, autoTile);
 }
Пример #20
0
    void OnSceneGUI()
    {
        Event current   = Event.current;
        int   controlID = GUIUtility.GetControlID(FocusType.Passive);

        HandleUtility.AddDefaultControl(controlID);
        EventType currentEventType = current.GetTypeForControl(controlID);
        bool      skip             = false;
        int       saveControl      = GUIUtility.hotControl;

        Ray ray = HandleUtility.GUIPointToWorldRay(Event.current.mousePosition);

        pointHit  = Physics2D.OverlapPoint(ray.origin);
        radiusHit = Physics2D.OverlapCircle(ray.origin, 0.333f);
        if (!pointHit && radiusHit)
        {
            AutoTile currentTile = radiusHit.gameObject.GetComponent <AutoTile>();
            if (currentTile.autoTileMode == AutoTileMode.Slope)
            {
                pointHit = radiusHit;
            }
        }

        if (currentEventType == EventType.Layout)
        {
            skip = true;
        }
        if (currentEventType == EventType.ScrollWheel)
        {
            skip = true;
        }
        if (current.button != 0)
        {
            skip = true;
        }

        if (style == null)
        {
            style = new GUIStyle();
            style.normal.textColor  = Color.red;
            style.normal.background = new Texture2D(1, 1);
            style.normal.background.SetPixel(0, 0, Color.white);
            style.normal.background.Apply();
        }

        if (SceneView.currentDrawingSceneView.in2DMode)
        {
            style.normal.textColor = Color.black;
            Handles.Label(HandleUtility.GUIPointToWorldRay(Vector3.zero).origin, "LMB: Draw/Erase , RMB: Toggle corners", style);
            if (current.button == 0 && !skip)
            {
                GUIUtility.hotControl = controlID;

                switch (current.type)
                {
                case EventType.KeyDown: if (current.keyCode == KeyCode.Escape)
                    {
                        Selection.activeGameObject = null; Event.current.Use();
                    }
                    break;

                case EventType.MouseDown: GetTool();  break;

                case EventType.MouseDrag: TileTool(); break;

                case EventType.MouseUp:       TileTool = null; break;
                }
            }
        }
        else
        {
            style.normal.textColor = Color.red;
            Handles.Label(HandleUtility.GUIPointToWorldRay(Vector3.zero).origin, "Tile editing requires 2D mode", style);
        }

        if (current.button == 1 && current.type == EventType.MouseDown)
        {
            ToggleTool();
        }

        GUIUtility.hotControl = saveControl;
        if (GUI.changed)
        {
            EditorUtility.SetDirty(target);
        }
    }
Пример #21
0
        public override void DrawGame(SpriteBatch spriteBatch)
        {
            //
            //When in editor mode, we want to display an overlay over some entities
            //
            base.DrawGame(spriteBatch);


            if (DiagManager.Instance.DevEditor.GroundEditor.Active && ZoneManager.Instance.CurrentGround != null)
            {
                if (AutoTileInProgress != null)
                {
                    for (int jj = viewTileRect.Y; jj < viewTileRect.End.Y; jj++)
                    {
                        for (int ii = viewTileRect.X; ii < viewTileRect.End.X; ii++)
                        {
                            Loc testLoc = new Loc(ii, jj);
                            if (Collision.InBounds(ZoneManager.Instance.CurrentGround.Width, ZoneManager.Instance.CurrentGround.Height, testLoc) &&
                                AutoTileInProgress.IncludesLoc(testLoc))
                            {
                                AutoTile brush = AutoTileInProgress.GetBrush(testLoc);
                                if (brush.IsEmpty())
                                {
                                    GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(ii * ZoneManager.Instance.CurrentGround.TileSize - ViewRect.X, jj * ZoneManager.Instance.CurrentGround.TileSize - ViewRect.Y, ZoneManager.Instance.CurrentGround.TileSize, ZoneManager.Instance.CurrentGround.TileSize), null, Color.Black);
                                }
                                else
                                {
                                    brush.Draw(spriteBatch, new Loc(ii * ZoneManager.Instance.CurrentGround.TileSize, jj * ZoneManager.Instance.CurrentGround.TileSize) - ViewRect.Start);
                                }
                            }
                        }
                    }
                }

                //draw the blocks
                if (ShowWalls)
                {
                    int texSize = ZoneManager.Instance.CurrentGround.TexSize;
                    for (int jj = viewTileRect.Y * texSize; jj < viewTileRect.End.Y * texSize; jj++)
                    {
                        for (int ii = viewTileRect.X * texSize; ii < viewTileRect.End.X * texSize; ii++)
                        {
                            Loc testLoc = new Loc(ii, jj);
                            if (Collision.InBounds(ZoneManager.Instance.CurrentGround.Width * texSize, ZoneManager.Instance.CurrentGround.Height * texSize, testLoc))
                            {
                                bool blocked = ZoneManager.Instance.CurrentGround.GetObstacle(ii, jj) == 1u;
                                if (BlockInProgress != null && BlockInProgress.IncludesLoc(testLoc))
                                {
                                    blocked = BlockInProgress.GetBrush(testLoc);
                                }

                                if (blocked)
                                {
                                    GraphicsManager.Pixel.Draw(spriteBatch, new Rectangle(ii * GraphicsManager.TEX_SIZE - ViewRect.X, jj * GraphicsManager.TEX_SIZE - ViewRect.Y, GraphicsManager.TEX_SIZE, GraphicsManager.TEX_SIZE), null, Color.Red * 0.6f);
                                }
                            }
                        }
                    }
                }


                //DevHasGraphics()
                //Draw Entity bounds
                GroundDebug dbg = new GroundDebug(spriteBatch, Color.BlueViolet);
                foreach (GroundEntity entity in ZoneManager.Instance.CurrentGround.IterateEntities())
                {
                    if (entity.DevEntitySelected)
                    {
                        //Invert the color of selected entities
                        dbg.DrawColor     = new Color(entity.DevEntColoring.B, entity.DevEntColoring.G, entity.DevEntColoring.R, entity.DevEntColoring.A);
                        dbg.LineThickness = 1.0f;
                        dbg.DrawFilledBox(new Rect(entity.Bounds.X, entity.Bounds.Y, entity.Width - 1, entity.Height - 1), 92);
                    }
                    else if (!entity.DevHasGraphics())
                    {
                        //Draw entities with no graphics of their own as a filled box
                        dbg.DrawColor     = entity.DevEntColoring;
                        dbg.LineThickness = 1.0f;
                        dbg.DrawFilledBox(new Rect(entity.Bounds.X, entity.Bounds.Y, entity.Width - 1, entity.Height - 1), 128);
                    }
                    else
                    {
                        //Draw boxes around other entities with graphics using low opacity
                        dbg.DrawColor     = new Color(entity.DevEntColoring.R, entity.DevEntColoring.G, entity.DevEntColoring.B, 92);
                        dbg.LineThickness = 1.0f;
                        dbg.DrawBox(new Rect(entity.Bounds.X, entity.Bounds.Y, entity.Width - 1, entity.Height - 1));
                    }
                    //And don't draw bounds of entities that have a graphics representation
                }
            }
        }
Пример #22
0
    /// <summary>
    /// Build this BlockMesh's geometry
    /// </summary>
    public void Build()
    {
        Point size = new Point(_blocks.GetLength(0) - 2, _blocks.GetLength(1) - 2, _blocks.GetLength(2) - 2);

        if (size != _size)
        {
            Resize(size, true);
        }

        List <Vector3> vertices  = new List <Vector3>();
        List <int>     triangles = new List <int>();
        List <Vector2> uvs       = new List <Vector2>();

        // Start building the block sides
        Point.ForEachXYZ(Point.Zero, _size, (Point point) => {
            Vector3 blockCenter = point.ToVector();
            int blockType       = GetBlock(point);
            // Only create geometry for blocks that have a nonzero type, and have a BlockProperty associated to its type
            if (blockType != 0 && BlockProperties.Length > blockType && BlockProperties[blockType] != null)
            {
                // For each side of the block, create an 8-bit adjacency bitstring, with each bit represents that side's neighbor
                // blocks, in clockwise order from LSB to MSB. If the neighbor has the same block type, the bit is 1, 0 otherwise.
                // The AutoTile then uses that adjacency bitstring to determine how to create the side's geometry.
                for (int side = 0; side < Point.Neighbors.Length; side++)
                {
                    Point sideForward = Point.Neighbors[side];
                    Point neighbor    = point + sideForward;
                    AutoTile autoTile = BlockProperties[blockType].SideTiles[side];
                    if (autoTile != null && GetBlock(neighbor) != blockType)
                    {
                        // Get adjacency bitstring for the AutoTile texture
                        byte tileAdjacency = 0;
                        int adjacencyIdx   = 0;
                        for (int sideNeighborIdx = 0; sideNeighborIdx < _BLOCK_SIDE_NEIGHBORS.GetLength(1); sideNeighborIdx++)
                        {
                            // Check each neighbor, and the block in front of that neighbor
                            // If the block in front of the neighbor is occupied, then don't include the neighbor
                            // in the adjacency string.
                            // This lets the texture reset its tiling against edges.
                            Point sideNeighbor = point + _BLOCK_SIDE_NEIGHBORS[side, sideNeighborIdx];

                            byte neighborType      = GetBlock(sideNeighbor);
                            byte neighborFrontType = GetBlock(sideNeighbor + sideForward);
                            if (InArray(sideNeighbor) && neighborType == blockType &&
                                neighborFrontType != blockType)
                            {
                                tileAdjacency |= (byte)(1 << adjacencyIdx);
                            }
                            adjacencyIdx++;

                            // Check the corners
                            int cornerIdx = (sideNeighborIdx + 1) % _BLOCK_SIDE_NEIGHBORS.GetLength(1);
                            sideNeighbor  = point + _BLOCK_SIDE_NEIGHBORS[side, sideNeighborIdx]
                                            + _BLOCK_SIDE_NEIGHBORS[side, cornerIdx];
                            neighborType      = GetBlock(sideNeighbor);
                            neighborFrontType = GetBlock(sideNeighbor + sideForward);
                            if (InArray(sideNeighbor) && neighborType == blockType &&
                                neighborFrontType != blockType)
                            {
                                tileAdjacency |= (byte)(1 << adjacencyIdx);
                            }
                            adjacencyIdx++;
                        }

                        Vector3 sideCenter = blockCenter + 0.5f * Point.Neighbors[side].ToVector();

                        // Generate the side mesh
                        autoTile.AddTile(
                            sideCenter,
                            _SIDE_VECTORS[side, 0],
                            _SIDE_VECTORS[side, 1],
                            tileAdjacency,
                            vertices,
                            triangles,
                            uvs
                            );
                    }
                }
            }
        });

        // Assign the geometry to the MeshFilter
        if (_meshFilter.sharedMesh == null)
        {
            _meshFilter.sharedMesh = new Mesh();
        }
        else
        {
            _meshFilter.sharedMesh.Clear();
        }
        _meshFilter.sharedMesh.vertices  = vertices.ToArray();
        _meshFilter.sharedMesh.triangles = triangles.ToArray();
        _meshFilter.sharedMesh.uv        = uvs.ToArray();
        _meshFilter.sharedMesh.RecalculateNormals();
    }