示例#1
0
    public IEnumerator ApplyPositionalModifierAsync(Vector3 worldPosition, VPaintObjectPositionalModifier modifier, float time)
    {
        Mesh m = GetMeshInstance();

        Vector3[] vertices = myVertices;
        Color[]   colors   = myColors;
        if (colors == null)
        {
            colors = m.colors;
        }

        var len = vertices.Length;

        Color[] target = new Color[len];
        for (int i = 0; i < len; i++)
        {
            Vector3 v        = transform.TransformPoint(vertices[i]);
            float   distance = Vector3.Distance(v, worldPosition);
            target[i] = modifier(colors[i], distance);
        }

        var routine = VPaintUtility.LerpColors(this, colors, target, time);

        while (routine.MoveNext())
        {
            yield return(null);
        }
    }
示例#2
0
    public IEnumerator BlendTo(VPaintGroup target, float time)
    {
        var myBaseLayer     = paintLayer;
        var targetBaseLayer = target.paintLayer;

        List <IEnumerator> routines = new List <IEnumerator>();

        foreach (var obj in GetVPaintObjects())
        {
            if (!target.colorers.Contains(obj))
            {
                continue;
            }

            int colorLength = obj.GetMeshInstance().colors.Length;

            var     baseData   = myBaseLayer.Get(obj);
            Color[] baseColors = null;
            if (baseData == null)
            {
                baseColors = new Color[colorLength];
            }
            else
            {
                baseColors = baseData.colors;
            }

            var     targetData   = targetBaseLayer.Get(obj);
            Color[] targetColors = null;
            if (targetData == null)
            {
                targetColors = new Color[colorLength];
            }
            else
            {
                targetColors = targetData.colors;
            }

            routines.Add(VPaintUtility.LerpColors(obj, baseColors, targetColors, time));
        }

        while (true)
        {
            bool b = true;
            foreach (var r in routines)
            {
                if (r.MoveNext())
                {
                    b = false;
                }
            }
            if (b)
            {
                break;
            }
            yield return(null);
        }
    }
示例#3
0
    public void BlendDirectional(bool preview)
    {
        if (!preview)
        {
            VPaint.Instance.PushUndo("Blend Objects");
        }

        Bounds bounds = new Bounds(Settings.position, Settings.size);

        var validTargets = new List <VPaintObject>();

        foreach (var vc in blendTargets)
        {
            if (Settings.useBounds)
            {
                if (!bounds.Intersects(vc.GetBounds()))
                {
                    continue;
                }
            }
            if (!vc.editorCollider)
            {
                VPaint.Instance.GetCollider(vc);
            }
            validTargets.Add(vc);
        }

        var layers = GetLayers(preview);

        var asyncOperation = VPaintUtility.BlendDirectionalAsync(
            layers, GetBlendObjects(), validTargets.ToArray(),
            Settings.direction, Settings.directionalDistance, Settings.intensity, Settings.directionalPower,
            Settings.offset, Settings.useBounds ? bounds : (Bounds?)null
            );

        while (asyncOperation.MoveNext())
        {
            if (EditorUtility.DisplayCancelableProgressBar("Applying Directional Blending", asyncOperation.Current.message, asyncOperation.Current.progress))
            {
                EditorUtility.ClearProgressBar();
                return;
            }
        }
        EditorUtility.ClearProgressBar();

        if (preview)
        {
            VPaint.Instance.LoadLayers(new List <VPaintLayer>(layers));
        }
        else
        {
            VPaint.Instance.ReloadLayers();
        }
    }
示例#4
0
    void PaintObject(VPaintObject vc, VPaintLayer layer, VPaintVertexData data)
    {
        if (vc.colorsBuilder == null)
        {
            vc.colorsBuilder = new Color[data.colors.Length];
        }

        if (vc.transparencyBuilder == null)
        {
            vc.transparencyBuilder = new float[data.colors.Length];
        }

        VPaintUtility.MergeColors(
            vc.colorsBuilder, vc.transparencyBuilder,
            data.colors, data.transparency,
            layer.blendMode, layer.opacity,
            layer.maskR, layer.maskG, layer.maskB, layer.maskA
            );
    }
示例#5
0
    VPaintLayer CalculateAmbientOcclusion(VPaintObject[] objects, float radius, float intensity, int sampleCount, Color darkColor, Color lightColor, Bounds?bounds = null)
    {
        foreach (var obj in objects)
        {
            VPaint.Instance.GetCollider(obj);
        }
        var async = VPaintUtility.CalculateAmbientOcclusionAsync(objects, radius, intensity, sampleCount, darkColor, lightColor, bounds);

        while (async.MoveNext())
        {
            var c = async.Current;
            if (EditorUtility.DisplayCancelableProgressBar("Sampling AO", c.message, c.progress))
            {
                EditorUtility.ClearProgressBar();
                return(null);
            }
        }
        EditorUtility.ClearProgressBar();
        return(async.Current.result);
    }