예제 #1
0
    void MouseBrush()
    {
        go_extruder.SetActive(_editorState.GetEditMode() == EditorState.EditMode.EXTRUDE);

        RaycastHit hit;
        int        layerMask = 1 << LayerMask.NameToLayer("PolyObjectSelected");
        bool       mouseHit  = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, Mathf.Infinity, layerMask);

        _currentShapeGo.SetActive(mouseHit);

        if (!mouseHit)
        {
            return;
        }

        MeshCollider meshCollider = hit.collider as MeshCollider;

        if (meshCollider == null || meshCollider.sharedMesh == null)
        {
            return;
        }


        Mesh mesh = meshCollider.sharedMesh;

        Vector3[] vertices     = mesh.vertices;
        int[]     triangles    = mesh.triangles;
        Vector3   p0           = vertices[triangles[hit.triangleIndex * 3 + 0]];
        Vector3   p1           = vertices[triangles[hit.triangleIndex * 3 + 1]];
        Vector3   p2           = vertices[triangles[hit.triangleIndex * 3 + 2]];
        Transform hitTransform = hit.collider.transform;

        p0 = hitTransform.TransformPoint(p0);
        p1 = hitTransform.TransformPoint(p1);
        p2 = hitTransform.TransformPoint(p2);
        Debug.DrawLine(p0, p1);
        Debug.DrawLine(p1, p2);
        Debug.DrawLine(p2, p0);
        Debug.DrawRay(hit.point, hit.normal * 10f);


        Vector3 localPoint  = transform.InverseTransformPoint(hit.point);
        Vector3 localNormal = transform.InverseTransformDirection(hit.normal);

        HelpSetColidderPosition(localPoint, localNormal);

        IntVector3 centerVoxel = IntVector3.FromFloat(localPoint);
        int        len         = (int)Mathf.Ceil(Mathf.Sqrt(_brushWidth * _brushWidth + _brushHeight * _brushHeight) * 0.5f);
//		Debug.Log ("len" + len.ToString () + centerVoxel.ToString());
        Collider cld = _brushShape == BrushShape.Cube ? cld_cube :
                       _brushShape == BrushShape.Cylinder ? cld_cylinder : cld_sphere;
        var outside = Camera.main.transform.position;         //new Vector3 (300, 300, 300);

        if (_editorState.GetEditMode() == EditorState.EditMode.BRUSH)
        {
            if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
            {
                for (int x = -len; x <= len; x++)
                {
                    for (int y = -len; y <= len; y++)
                    {
                        for (int z = -len; z <= len; z++)
                        {
                            Vector3 underTestPoint = transform.TransformPoint(centerVoxel.ToFloat() + new Vector3(x, y, z));

                            if (Doge.IsColliderContainPoint(outside, underTestPoint, cld))
                            {
                                var key = new IntVector3(centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                if (_brushVoxelPoolBefore.ContainsKey(key))
                                {
                                    _brushVoxelPoolBefore.Remove(key);
                                }
                                _brushVoxelPoolAfter.Add(key, 0);

                                /*
                                 * if (_editorState.is_add){
                                 *      _targetPolyObject.AddEditSpacePoint (centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                 * } else {
                                 *      _targetPolyObject.DeleteEditSpacePoint (centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                 * }
                                 */
                            }
                        }
                    }
                }

                foreach (var k in _brushVoxelPoolBefore.Keys)
                {
                    _targetPolyObject.ConfigEditSpacePoint(k, _editorState.is_add);
                }

                _brushVoxelPoolBefore.Clear();
                var tmpAfter = _brushVoxelPoolAfter;
                _brushVoxelPoolAfter  = _brushVoxelPoolBefore;
                _brushVoxelPoolBefore = tmpAfter;

                _targetPolyObject.RefreshMesh();
            }

            if (Input.GetMouseButtonUp(0))
            {
                foreach (var k in _brushVoxelPoolBefore.Keys)
                {
                    _targetPolyObject.ConfigEditSpacePoint(k, _editorState.is_add);
                }
                _brushVoxelPoolBefore.Clear();
                _brushVoxelPoolAfter.Clear();
                _targetPolyObject.RefreshMesh();
            }
        }
        else
        {
            // ** extrude **
            if (Input.GetKey("v"))
            {
                if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
                {
                    for (int x = -len; x <= len; x++)
                    {
                        for (int y = -len; y <= len; y++)
                        {
                            for (int z = -len; z <= len; z++)
                            {
                                Vector3 underTestPoint = transform.TransformPoint(centerVoxel.ToFloat() + new Vector3(x, y, z));

                                if (Doge.IsColliderContainPoint(outside, underTestPoint, cld))
                                {
                                    var key = new IntVector3(centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                    if (_targetPolyObject.GetEditSpacePoint(key.x, key.y, key.z) > 0)
                                    {
                                        _extrudeVoxelPool[key] = 1;
                                    }
                                }
                            }
                        }
                    }
                }

                RefreshExtruderPosition();
            }
        }
    }