示例#1
0
    public void EndDraw()
    {
        click = false;
        RaycastHit hit;
        Ray        ray = Camera.main.ScreenPointToRay(Input.mousePosition);

        pointer.Hide();

        if (Physics.Raycast(ray, out hit))
        {
            if (hit.collider != null)
            {
                switch (Settings.Instance.currBrush)
                {
                case Brush.Voxel:
                {
                    if (Settings.Instance.currTool == Tool.Attach)
                    {
                        AttachCube(hit.collider.transform.parent.GetComponent <CubeInfo>(),
                                   Settings.Instance.String2Sides(hit.collider.name),
                                   Settings.Instance.currMaterial);
                    }
                    else if (Settings.Instance.currTool == Tool.Erase)
                    {
                        lastCube = hit.collider.transform.parent.GetComponent <CubeInfo>();
                        if (lastCube.y > -1)
                        {
                            EraseCube(lastCube);
                        }
                    }
                    else if (Settings.Instance.currTool == Tool.Paint)
                    {
                        PaintCube(hit.collider.transform.parent.GetComponent <CubeInfo>(),
                                  Settings.Instance.currMaterial);
                    }
                    break;
                }

                case Brush.Rect:
                {
                    if (Settings.Instance.currTool == Tool.Attach)
                    {
                        Vector3Int pos = Settings.Instance.UseSidesOnCoordinate(beginCube.position, beginSide);
                        beginCube = new CubeInfo(cubeMap[pos.x, pos.y, pos.z]);
                    }
                    lastCube = hit.collider.transform.parent.GetComponent <CubeInfo>();
                    if (Settings.Instance.currTool == Tool.Attach)
                    {
                        Vector3Int pos = Settings.Instance.UseSidesOnCoordinate(lastCube.position, Settings.Instance.String2Sides(hit.collider.name));
                        lastCube = new CubeInfo(cubeMap[pos.x, pos.y, pos.z]);
                    }
                    int minX = lastCube.x < beginCube.x ? lastCube.x : beginCube.x;
                    int maxX = lastCube.x > beginCube.x ? lastCube.x : beginCube.x;
                    int minY = lastCube.y < beginCube.y ? lastCube.y : beginCube.y;
                    int maxY = lastCube.y > beginCube.y ? lastCube.y : beginCube.y;
                    int minZ = lastCube.z < beginCube.z ? lastCube.z : beginCube.z;
                    int maxZ = lastCube.z > beginCube.z ? lastCube.z : beginCube.z;
                    if (minY == -1)
                    {
                        minY = 0;
                    }

                    int mat = Settings.Instance.currMaterial;

                    if (Settings.Instance.currTool == Tool.Attach)
                    {
                        for (int x = minX; x <= maxX; ++x)
                        {
                            for (int y = minY; y <= maxY; ++y)
                            {
                                for (int z = minZ; z <= maxZ; ++z)
                                {
                                    SetCube(cubeMap[x, y, z], mat);
                                }
                            }
                        }
                    }
                    else if (Settings.Instance.currTool == Tool.Erase)
                    {
                        for (int x = minX; x <= maxX; ++x)
                        {
                            for (int y = minY; y <= maxY; ++y)
                            {
                                for (int z = minZ; z <= maxZ; ++z)
                                {
                                    EraseCube(cubeMap[x, y, z]);
                                }
                            }
                        }
                    }
                    else if (Settings.Instance.currTool == Tool.Paint)
                    {
                        for (int x = minX; x <= maxX; ++x)
                        {
                            for (int y = minY; y <= maxY; ++y)
                            {
                                for (int z = minZ; z <= maxZ; ++z)
                                {
                                    PaintCube(cubeMap[x, y, z], mat);
                                }
                            }
                        }
                    }
                    break;
                }

                case Brush.Line:
                {
                    //if(beginCube.y < 0) beginCube = cubeMap[beginCube.x, 0, beginCube.z];
                    if (Settings.Instance.currTool == Tool.Attach)
                    {
                        Vector3Int pos = Settings.Instance.UseSidesOnCoordinate(beginCube.position, beginSide);
                        beginCube = new CubeInfo(cubeMap[pos.x, pos.y, pos.z]);
                    }
                    lastCube = hit.collider.transform.parent.GetComponent <CubeInfo>();
                    if (Settings.Instance.currTool == Tool.Attach)
                    {
                        Vector3Int pos = Settings.Instance.UseSidesOnCoordinate(lastCube.position, Settings.Instance.String2Sides(hit.collider.name));
                        lastCube = new CubeInfo(cubeMap[pos.x, pos.y, pos.z]);
                    }
                    Debug.Log(beginCube.position + " " + lastCube.position);
                    List <Vector3Int> newLine = line.Draw3DLine(beginCube, lastCube,
                                                                Settings.Instance.String2Sides(hit.collider.name));

                    int mat = Settings.Instance.currMaterial;
                    foreach (var l in newLine)
                    {
                        if (Settings.Instance.currTool == Tool.Attach)
                        {
                            SetCube(cubeMap[l.x, l.y, l.z], mat);
                        }
                        else if (Settings.Instance.currTool == Tool.Erase)
                        {
                            if (l.y > -1)
                            {
                                EraseCube(cubeMap[l.x, l.y, l.z]);
                            }
                        }
                        else if (Settings.Instance.currTool == Tool.Paint)
                        {
                            PaintCube(cubeMap[l.x, l.y, l.z], mat);
                        }
                    }
                    break;
                }

                case Brush.Fill:
                {
                    lastCube  = hit.collider.transform.parent.GetComponent <CubeInfo>();
                    beginSide = Settings.Instance.String2Sides(hit.collider.name);
                    if (Settings.Instance.currTool == Tool.Attach)
                    {
                        Vector3Int pos = Settings.Instance.UseSidesOnCoordinate(lastCube.position, beginSide);
                        lastCube = cubeMap[pos.x, pos.y, pos.z];
                        fill.AttachFill(lastCube, beginSide, cubeMap);
                    }
                    else if (Settings.Instance.currTool == Tool.Erase)
                    {
                        fill.EraseFill(lastCube, beginSide, cubeMap);
                    }
                    else if (Settings.Instance.currTool == Tool.Paint)
                    {
                        fill.PaintFill(lastCube, beginSide, cubeMap);
                    }


                    break;
                }
                }
            }
        }
    }