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); } }
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); } } }
// 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); }
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); } } } }
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); }