197 lines
5.7 KiB
C#
197 lines
5.7 KiB
C#
using System;
|
|
using UnityEngine;
|
|
|
|
namespace ProBuilder2.Common
|
|
{
|
|
// Token: 0x02000045 RID: 69
|
|
public class pb_UVUtility
|
|
{
|
|
// Token: 0x06000223 RID: 547 RVA: 0x0001D4EC File Offset: 0x0001B8EC
|
|
public static void PlanarMap2(Vector3[] verts, Vector2[] uvs, int[] indices, pb_UV uvSettings, Vector3 normal)
|
|
{
|
|
ProjectionAxis projectionAxis = pb_Projection.VectorToProjectionAxis(normal);
|
|
pb_Projection.PlanarProject(verts, uvs, indices, normal, projectionAxis);
|
|
pb_UVUtility.ApplyUVSettings(uvs, indices, uvSettings);
|
|
}
|
|
|
|
// Token: 0x06000224 RID: 548 RVA: 0x0001D514 File Offset: 0x0001B914
|
|
private static void ApplyUVSettings(Vector2[] uvs, int[] indices, pb_UV uvSettings)
|
|
{
|
|
int num = indices.Length;
|
|
pb_UV.Fill fill = uvSettings.fill;
|
|
if (fill != pb_UV.Fill.Tile)
|
|
{
|
|
if (fill != pb_UV.Fill.Fit)
|
|
{
|
|
if (fill == pb_UV.Fill.Stretch)
|
|
{
|
|
uvs = pb_UVUtility.StretchUVs(uvs, indices);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
uvs = pb_UVUtility.NormalizeUVs(uvs, indices);
|
|
}
|
|
}
|
|
if (!uvSettings.useWorldSpace && uvSettings.anchor != pb_UV.Anchor.None)
|
|
{
|
|
pb_UVUtility.ApplyUVAnchor(uvs, indices, uvSettings.anchor);
|
|
}
|
|
if (uvSettings.scale.x != 1f || uvSettings.scale.y != 1f || uvSettings.rotation != 0f)
|
|
{
|
|
Vector2 vector = pb_Bounds2D.Center(uvs, indices);
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
uvs[indices[i]] = uvs[indices[i]].ScaleAroundPoint(vector, uvSettings.scale);
|
|
uvs[indices[i]] = uvs[indices[i]].RotateAroundPoint(vector, uvSettings.rotation);
|
|
}
|
|
}
|
|
if (uvSettings.flipU || uvSettings.flipV || uvSettings.swapUV)
|
|
{
|
|
for (int j = 0; j < num; j++)
|
|
{
|
|
float num2 = uvs[indices[j]].x;
|
|
float num3 = uvs[indices[j]].y;
|
|
if (uvSettings.flipU)
|
|
{
|
|
num2 = -num2;
|
|
}
|
|
if (uvSettings.flipV)
|
|
{
|
|
num3 = -num3;
|
|
}
|
|
if (!uvSettings.swapUV)
|
|
{
|
|
uvs[indices[j]].x = num2;
|
|
uvs[indices[j]].y = num3;
|
|
}
|
|
else
|
|
{
|
|
uvs[indices[j]].x = num3;
|
|
uvs[indices[j]].y = num2;
|
|
}
|
|
}
|
|
}
|
|
uvSettings.localPivot = pb_Bounds2D.Center(uvs, indices);
|
|
for (int k = 0; k < indices.Length; k++)
|
|
{
|
|
Vector2[] array = uvs;
|
|
int num4 = indices[k];
|
|
array[num4].x = array[num4].x - uvSettings.offset.x;
|
|
Vector2[] array2 = uvs;
|
|
int num5 = indices[k];
|
|
array2[num5].y = array2[num5].y - uvSettings.offset.y;
|
|
}
|
|
}
|
|
|
|
// Token: 0x06000225 RID: 549 RVA: 0x0001D764 File Offset: 0x0001BB64
|
|
private static Vector2[] StretchUVs(Vector2[] uvs, int[] indices)
|
|
{
|
|
Vector2 vector = pb_Math.LargestVector2(uvs, indices) - pb_Math.SmallestVector2(uvs, indices);
|
|
for (int i = 0; i < indices.Length; i++)
|
|
{
|
|
uvs[i].x = uvs[indices[i]].x / vector.x;
|
|
uvs[i].y = uvs[indices[i]].y / vector.y;
|
|
}
|
|
return uvs;
|
|
}
|
|
|
|
// Token: 0x06000226 RID: 550 RVA: 0x0001D7E0 File Offset: 0x0001BBE0
|
|
private static Vector2[] NormalizeUVs(Vector2[] uvs, int[] indices)
|
|
{
|
|
int num = indices.Length;
|
|
Vector2 vector = pb_Math.SmallestVector2(uvs, indices);
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
int num2 = indices[i];
|
|
uvs[num2].x = uvs[num2].x - vector.x;
|
|
int num3 = indices[i];
|
|
uvs[num3].y = uvs[num3].y - vector.y;
|
|
}
|
|
float num4 = pb_Math.LargestValue(pb_Math.LargestVector2(uvs, indices));
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
int num5 = indices[i];
|
|
uvs[num5].x = uvs[num5].x / num4;
|
|
int num6 = indices[i];
|
|
uvs[num6].y = uvs[num6].y / num4;
|
|
}
|
|
return uvs;
|
|
}
|
|
|
|
// Token: 0x06000227 RID: 551 RVA: 0x0001D890 File Offset: 0x0001BC90
|
|
[Obsolete("See ApplyAnchor().")]
|
|
private static Vector2[] JustifyUVs(Vector2[] uvs, pb_UV.Justify j)
|
|
{
|
|
Vector2 vector = new Vector2(0f, 0f);
|
|
switch (j)
|
|
{
|
|
case pb_UV.Justify.Right:
|
|
vector = new Vector2(pb_Math.LargestVector2(uvs).x - 1f, 0f);
|
|
break;
|
|
case pb_UV.Justify.Left:
|
|
vector = new Vector2(pb_Math.SmallestVector2(uvs).x, 0f);
|
|
break;
|
|
case pb_UV.Justify.Top:
|
|
vector = new Vector2(0f, pb_Math.LargestVector2(uvs).y - 1f);
|
|
break;
|
|
case pb_UV.Justify.Center:
|
|
vector = pb_Math.Average(uvs, null) - new Vector2(0.5f, 0.5f);
|
|
break;
|
|
case pb_UV.Justify.Bottom:
|
|
vector = new Vector2(0f, pb_Math.SmallestVector2(uvs).y);
|
|
break;
|
|
}
|
|
for (int i = 0; i < uvs.Length; i++)
|
|
{
|
|
uvs[i] -= vector;
|
|
}
|
|
return uvs;
|
|
}
|
|
|
|
// Token: 0x06000228 RID: 552 RVA: 0x0001D9AC File Offset: 0x0001BDAC
|
|
private static void ApplyUVAnchor(Vector2[] uvs, int[] indices, pb_UV.Anchor anchor)
|
|
{
|
|
pb_UVUtility.tvec2.x = 0f;
|
|
pb_UVUtility.tvec2.y = 0f;
|
|
Vector2 vector = pb_Math.SmallestVector2(uvs, indices);
|
|
Vector2 vector2 = pb_Math.LargestVector2(uvs, indices);
|
|
if (anchor == pb_UV.Anchor.UpperLeft || anchor == pb_UV.Anchor.MiddleLeft || anchor == pb_UV.Anchor.LowerLeft)
|
|
{
|
|
pb_UVUtility.tvec2.x = vector.x;
|
|
}
|
|
else if (anchor == pb_UV.Anchor.UpperRight || anchor == pb_UV.Anchor.MiddleRight || anchor == pb_UV.Anchor.LowerRight)
|
|
{
|
|
pb_UVUtility.tvec2.x = vector2.x - 1f;
|
|
}
|
|
else
|
|
{
|
|
pb_UVUtility.tvec2.x = vector.x + (vector2.x - vector.x) * 0.5f - 0.5f;
|
|
}
|
|
if (anchor == pb_UV.Anchor.UpperLeft || anchor == pb_UV.Anchor.UpperCenter || anchor == pb_UV.Anchor.UpperRight)
|
|
{
|
|
pb_UVUtility.tvec2.y = vector2.y - 1f;
|
|
}
|
|
else if (anchor == pb_UV.Anchor.MiddleLeft || anchor == pb_UV.Anchor.MiddleCenter || anchor == pb_UV.Anchor.MiddleRight)
|
|
{
|
|
pb_UVUtility.tvec2.y = vector.y + (vector2.y - vector.y) * 0.5f - 0.5f;
|
|
}
|
|
else
|
|
{
|
|
pb_UVUtility.tvec2.y = vector.y;
|
|
}
|
|
int num = indices.Length;
|
|
for (int i = 0; i < num; i++)
|
|
{
|
|
int num2 = indices[i];
|
|
uvs[num2].x = uvs[num2].x - pb_UVUtility.tvec2.x;
|
|
int num3 = indices[i];
|
|
uvs[num3].y = uvs[num3].y - pb_UVUtility.tvec2.y;
|
|
}
|
|
}
|
|
|
|
// Token: 0x0400019C RID: 412
|
|
private static Vector2 tvec2 = Vector2.zero;
|
|
}
|
|
}
|