// Shatter Toolkit // Copyright 2015 Gustav Olsson using System.Collections.Generic; using UnityEngine; namespace ShatterToolkit { public class WorldUvMapper : UvMapper { /// /// Determines the scale to be applied to the uv-coordinates. (1,1) will repeat the texture once for every local-space unit, (2,2) twice and so on. /// public Vector2 scale = Vector2.one; public override void Map(IList points, Vector3 planeNormal, out Vector4[] tangentsA, out Vector4[] tangentsB, out Vector2[] uvsA, out Vector2[] uvsB) { // Calculate texture direction vectors Vector3 u = Vector3.Cross(planeNormal, Vector3.up); if (u == Vector3.zero) { u = Vector3.Cross(planeNormal, Vector3.forward); } Vector3 v = Vector3.Cross(u, planeNormal); u.Normalize(); v.Normalize(); // Set tangents Vector4 tangentA = new Vector4(u.x, u.y, u.z, 1.0f); Vector4 tangentB = new Vector4(u.x, u.y, u.z, -1.0f); tangentsA = new Vector4[points.Count]; tangentsB = new Vector4[points.Count]; for (int i = 0; i < points.Count; i++) { tangentsA[i] = tangentA; tangentsB[i] = tangentB; } // Set uvs Vector2[] uvs = new Vector2[points.Count]; Vector2 min = Vector2.zero; for (int i = 0; i < points.Count; i++) { Vector3 point = points[i]; uvs[i].x = Vector3.Dot(point, u); uvs[i].y = Vector3.Dot(point, v); if (i == 0) { min = uvs[i]; } else { min = Vector2.Min(uvs[i], min); } } for (int i = 0; i < points.Count; i++) { uvs[i] -= min; uvs[i].x *= scale.x; uvs[i].y *= scale.y; } uvsA = uvs; uvsB = uvs; } } }