Пример #1
0
    public static void ScenePaintPerpedicularNearest(P3D_Brush brush, Vector3 position, float maxDistance, int layerMask = -1, int groupMask = -1)
    {
        P3D_Paintable paintable = null;
        P3D_Result    result    = null;

        for (int i = AllPaintables.Count - 1; i >= 0; i--)
        {
            P3D_Paintable paintable2 = AllPaintables[i];
            if (P3D_Helper.IndexInMask(paintable2.gameObject.layer, layerMask))
            {
                P3D_Tree tree = paintable2.GetTree();
                if (tree != null)
                {
                    Transform transform = paintable2.transform;
                    if (P3D_Helper.GetUniformScale(transform) != 0f)
                    {
                        P3D_Result result2 = tree.FindPerpendicularNearest(transform.InverseTransformPoint(position), maxDistance);
                        if (result2 != null)
                        {
                            paintable    = paintable2;
                            result       = result2;
                            maxDistance *= result2.Distance01;
                        }
                    }
                }
            }
        }
        if (paintable != null)
        {
            paintable.Paint(brush, result, groupMask);
        }
    }
Пример #2
0
    public static void ScenePaintBetweenNearest(P3D_Brush brush, Vector3 startPosition, Vector3 endPosition, int layerMask = -1, int groupMask = -1)
    {
        float num = Vector3.Distance(startPosition, endPosition);

        if (num != 0f)
        {
            P3D_Paintable paintable = null;
            P3D_Result    result    = null;
            for (int i = AllPaintables.Count - 1; i >= 0; i--)
            {
                P3D_Paintable paintable2 = AllPaintables[i];
                if (P3D_Helper.IndexInMask(paintable2.gameObject.layer, layerMask))
                {
                    P3D_Tree tree = paintable2.GetTree();
                    if (tree != null)
                    {
                        Transform  transform  = paintable2.transform;
                        Vector3    startPoint = transform.InverseTransformPoint(startPosition);
                        P3D_Result result2    = tree.FindBetweenNearest(startPoint, startPoint + ((transform.InverseTransformPoint(endPosition) - startPoint).normalized * num));
                        if (result2 != null)
                        {
                            paintable = paintable2;
                            result    = result2;
                            num      *= result2.Distance01;
                        }
                    }
                }
            }
            if ((paintable != null) && (result != null))
            {
                paintable.Paint(brush, result, groupMask);
            }
        }
    }
Пример #3
0
    // This allows you to change which mesh is currently used when doing painting
    // NOTE: If you're using MeshCollider raycasting then you don't need to call this, as you can pass the hit UV coordinates directly to the Paint method
    // NOTE: The material index is passed here because it alters the submesh used by the mesh
    public void SetMesh(Transform newTransform, Mesh newMesh, int newMaterialIndex = 0, bool forceUpdate = false)
    {
        if (tree == null)
        {
            tree = new P3D_Tree();
        }

        transform = newTransform;

        tree.SetMesh(newMesh, newMaterialIndex, forceUpdate);
    }
Пример #4
0
    public static void ScenePaintBetweenNearestRaycast(P3D_Brush brush, Vector3 startPosition, Vector3 endPosition, int layerMask = -1, int groupMask = -1)
    {
        float maxDistance = Vector3.Distance(startPosition, endPosition);

        if (maxDistance != 0f)
        {
            P3D_Paintable component = null;
            RaycastHit    hitInfo   = new RaycastHit();
            P3D_Result    result    = null;
            if (Physics.Raycast(startPosition, endPosition - startPosition, out hitInfo, maxDistance, layerMask))
            {
                component   = hitInfo.collider.GetComponent <P3D_Paintable>();
                maxDistance = hitInfo.distance;
            }
            for (int i = AllPaintables.Count - 1; i >= 0; i--)
            {
                P3D_Paintable paintable2 = AllPaintables[i];
                if (P3D_Helper.IndexInMask(paintable2.gameObject.layer, layerMask))
                {
                    P3D_Tree tree = paintable2.GetTree();
                    if (tree != null)
                    {
                        Transform  transform  = paintable2.transform;
                        Vector3    startPoint = transform.InverseTransformPoint(startPosition);
                        P3D_Result result2    = tree.FindBetweenNearest(startPoint, startPoint + ((transform.InverseTransformPoint(endPosition) - startPoint).normalized * maxDistance));
                        if (result2 != null)
                        {
                            component    = paintable2;
                            result       = result2;
                            maxDistance *= result2.Distance01;
                        }
                    }
                }
            }
            if (component != null)
            {
                if (result != null)
                {
                    component.Paint(brush, result, groupMask);
                }
                else
                {
                    component.Paint(brush, hitInfo, groupMask);
                }
            }
        }
    }
Пример #5
0
    public void UpdateTree()
    {
        var forceUpdate = false;
        var mesh        = P3D_Helper.GetMesh(gameObject, ref bakedMesh);

        if (bakedMesh != null)
        {
            forceUpdate = true;
        }

        if (tree == null)
        {
            tree = new P3D_Tree();
        }

        tree.SetMesh(mesh, SubMeshIndex, forceUpdate);
    }