public void Update()
        {
            bool changed = false;

            // SHIFT
            if (InputHelper.IsKeyDown(Keys.LeftShift) || InputHelper.IsKeyDown(Keys.RightShift))
            {
                if (InputHelper.IsNewKeyPress(Keys.Right))
                {
                    if (_RampBlockDirection == RampBlockDirection.North)
                    {
                        _RampBlockDirection = RampBlockDirection.East;
                    }
                    else if (_RampBlockDirection == RampBlockDirection.East)
                    {
                        _RampBlockDirection = RampBlockDirection.South;
                    }
                    else if (_RampBlockDirection == RampBlockDirection.South)
                    {
                        _RampBlockDirection = RampBlockDirection.West;
                    }
                    else if (_RampBlockDirection == RampBlockDirection.West)
                    {
                        _RampBlockDirection = RampBlockDirection.North;
                    }

                    changed = true;
                }

                if (InputHelper.IsNewKeyPress(Keys.Left))
                {
                    if (_RampBlockDirection == RampBlockDirection.North)
                    {
                        _RampBlockDirection = RampBlockDirection.West;
                    }
                    else if (_RampBlockDirection == RampBlockDirection.East)
                    {
                        _RampBlockDirection = RampBlockDirection.North;
                    }
                    else if (_RampBlockDirection == RampBlockDirection.South)
                    {
                        _RampBlockDirection = RampBlockDirection.East;
                    }
                    else if (_RampBlockDirection == RampBlockDirection.West)
                    {
                        _RampBlockDirection = RampBlockDirection.South;
                    }
                    changed = true;
                }
            }
            else
            {
                if (InputHelper.IsNewKeyPress(Keys.Up))
                {
                    switch (_selectedType)
                    {
                    case EditorType.Blocks:
                        _selectedType = EditorType.BottomRamps;
                        break;

                    case EditorType.BottomRamps:
                        _selectedType = EditorType.TopRamps;
                        break;

                    case EditorType.TopRamps:
                        _selectedType = EditorType.Blocks;
                        break;

                    default:
                        _previewData = new BlockVertexData();
                        break;
                    }
                    changed = true;
                }

                if (InputHelper.IsNewKeyPress(Keys.Down))
                {
                    switch (_selectedType)
                    {
                    case EditorType.Blocks:
                        _selectedType = EditorType.TopRamps;
                        break;

                    case EditorType.BottomRamps:
                        _selectedType = EditorType.Blocks;
                        break;

                    case EditorType.TopRamps:
                        _selectedType = EditorType.BottomRamps;
                        break;

                    default:
                        _previewData = new BlockVertexData();
                        break;
                    }
                    changed = true;
                }

                if (InputHelper.IsNewKeyPress(Keys.Right))
                {
                    _index++;

                    if (_index >= CountCurrentList())
                    {
                        _index = 0;
                    }
                    changed = true;
                }

                if (InputHelper.IsNewKeyPress(Keys.Left))
                {
                    _index--;

                    if (_index < 0)
                    {
                        _index = CountCurrentList() - 1;
                    }
                    changed = true;
                }
            }

            if (changed)
            {
                switch (_selectedType)
                {
                case EditorType.Blocks:
                    _activeBlockMask = _blockMasks[_index];
                    _previewData     = BlockVertexData.GetBlockMaskVertexData(_blockMasks[_index]).Copy();
                    break;

                case EditorType.BottomRamps:
                    _activeBlockMask = _bottomRampMasks[_index] | _RampBlockDirection;
                    _previewData     = RampBlockVertexData.GetBlockMaskVertexData(_bottomRampMasks[_index] | _RampBlockDirection).Copy();
                    break;

                case EditorType.TopRamps:
                    _activeBlockMask = _topRampMasks[_index] | _RampBlockDirection;
                    _previewData     = RampBlockVertexData.GetBlockMaskVertexData(_topRampMasks[_index] | _RampBlockDirection).Copy();
                    break;

                default:
                    _previewData = new BlockVertexData();
                    break;
                }
            }

            HandleHighlight();
        }
        public void UpdateDrawModule()
        {
            DebugLog.Log("Updating RenderChunk: (" + ParentRenderSegment.Position.X + ", " + _heightOffset + ", " + ParentRenderSegment.Position.Y + ");");
            for (int x = 0; x < Blocks.GetLength(0); x++)
            {
                for (int y = 0; y < Blocks.GetLength(1); y++)
                {
                    for (int z = 0; z < Blocks.GetLength(2); z++)
                    {
                        if (Blocks[x, y, z] != BlockHelper.BlockMasks.Air && Blocks[x, y, z] != BlockHelper.BlockMasks.AirBlocked)
                        {
                            BlockVertexData currentVertextData = new BlockVertexData();
                            Vector3         blockLocation      = new Vector3(x, y, z) + _locationOffset;
                            if (BlockHelper.IsBlock(Blocks[x, y, z]))
                            {
                                currentVertextData = BlockVertexData.GetCopyOfBlockMasBlockVertexData(Blocks[x, y, z]);
                            }
                            else if (BlockHelper.IsRampBlock(Blocks[x, y, z]))
                            {
                                currentVertextData = RampBlockVertexData.GetBlockMaskVertexData(Blocks[x, y, z]);
                            }

                            currentVertextData.TranslateToWorldLocation(blockLocation);

                            // Following checks all the face blocking cubes around the current location to see if we'll add the vertices to the buffer or not.
                            if (!BlockHelper.DoesBlockMaskAObscureMaskBFace(ParentRenderSegment.ParentSegmentManager.GetBlockMaskAt(new SegmentLocation(blockLocation + WorldDirection.Up)), Blocks[x, y, z], WorldDirection.Up))
                            {
                                _blockDrawModule.AddData(currentVertextData.UpVertices.ToList(),
                                                         currentVertextData.UpIndices.ToList());
                            }
                            if (!BlockHelper.DoesBlockMaskAObscureMaskBFace(ParentRenderSegment.ParentSegmentManager.GetBlockMaskAt(new SegmentLocation(blockLocation + WorldDirection.Down)), Blocks[x, y, z], WorldDirection.Down))
                            {
                                _blockDrawModule.AddData(currentVertextData.DownVertices.ToList(),
                                                         currentVertextData.DownIndices.ToList());
                            }
                            if (!BlockHelper.DoesBlockMaskAObscureMaskBFace(ParentRenderSegment.ParentSegmentManager.GetBlockMaskAt(new SegmentLocation(blockLocation + WorldDirection.North)), Blocks[x, y, z], WorldDirection.North))
                            {
                                _blockDrawModule.AddData(currentVertextData.NorthVertices.ToList(),
                                                         currentVertextData.NorthIndices.ToList());
                            }
                            if (!BlockHelper.DoesBlockMaskAObscureMaskBFace(ParentRenderSegment.ParentSegmentManager.GetBlockMaskAt(new SegmentLocation(blockLocation + WorldDirection.East)), Blocks[x, y, z], WorldDirection.East))
                            {
                                // add east vertices/indices, but don't forget to translate to world location...
                                _blockDrawModule.AddData(currentVertextData.EastVertices.ToList(),
                                                         currentVertextData.EastIndices.ToList());
                            }
                            if (!BlockHelper.DoesBlockMaskAObscureMaskBFace(ParentRenderSegment.ParentSegmentManager.GetBlockMaskAt(new SegmentLocation(blockLocation + WorldDirection.South)), Blocks[x, y, z], WorldDirection.South))
                            {
                                // add east vertices/indices, but don't forget to translate to world location...
                                _blockDrawModule.AddData(currentVertextData.SouthVertices.ToList(),
                                                         currentVertextData.SouthIndices.ToList());
                            }
                            if (!BlockHelper.DoesBlockMaskAObscureMaskBFace(ParentRenderSegment.ParentSegmentManager.GetBlockMaskAt(new SegmentLocation(blockLocation + WorldDirection.West)), Blocks[x, y, z], WorldDirection.West))
                            {
                                // add east vertices/indices, but don't forget to translate to world location...
                                _blockDrawModule.AddData(currentVertextData.WestVertices.ToList(),
                                                         currentVertextData.WestIndices.ToList());
                            }
                        }
                    }
                }
            }
            _blockDrawModule.PrepareToDraw();

            Dirty = false;
        }