257 lines
7.8 KiB
C#
257 lines
7.8 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace UniGLTF
|
|
{
|
|
public static class TextureSamplerUtil
|
|
{
|
|
#region WrapMode
|
|
public enum TextureWrapType
|
|
{
|
|
All,
|
|
#if UNITY_2017_1_OR_NEWER
|
|
U,
|
|
V,
|
|
W,
|
|
#endif
|
|
}
|
|
|
|
public static KeyValuePair<TextureWrapType, TextureWrapMode> TypeWithMode(TextureWrapType type, TextureWrapMode mode)
|
|
{
|
|
return new KeyValuePair<TextureWrapType, TextureWrapMode>(type, mode);
|
|
}
|
|
|
|
public static IEnumerable<KeyValuePair<TextureWrapType, TextureWrapMode>> GetUnityWrapMode(glTFTextureSampler sampler)
|
|
{
|
|
#if UNITY_2017_1_OR_NEWER
|
|
if (sampler.wrapS == sampler.wrapT)
|
|
{
|
|
switch (sampler.wrapS)
|
|
{
|
|
case glWrap.NONE: // default
|
|
yield return TypeWithMode(TextureWrapType.All, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
case glWrap.CLAMP_TO_EDGE:
|
|
yield return TypeWithMode(TextureWrapType.All, TextureWrapMode.Clamp);
|
|
break;
|
|
|
|
case glWrap.REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.All, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
case glWrap.MIRRORED_REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.All, TextureWrapMode.Mirror);
|
|
break;
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
else
|
|
{
|
|
switch (sampler.wrapS)
|
|
{
|
|
case glWrap.NONE: // default
|
|
yield return TypeWithMode(TextureWrapType.U, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
case glWrap.CLAMP_TO_EDGE:
|
|
yield return TypeWithMode(TextureWrapType.U, TextureWrapMode.Clamp);
|
|
break;
|
|
|
|
case glWrap.REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.U, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
case glWrap.MIRRORED_REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.U, TextureWrapMode.Mirror);
|
|
break;
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
switch (sampler.wrapT)
|
|
{
|
|
case glWrap.NONE: // default
|
|
yield return TypeWithMode(TextureWrapType.V, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
case glWrap.CLAMP_TO_EDGE:
|
|
yield return TypeWithMode(TextureWrapType.V, TextureWrapMode.Clamp);
|
|
break;
|
|
|
|
case glWrap.REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.V, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
case glWrap.MIRRORED_REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.V, TextureWrapMode.Mirror);
|
|
break;
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
#else
|
|
// Unity2017.1より前
|
|
// * wrapSとwrapTの区別が無くてwrapしかない
|
|
// * Mirrorが無い
|
|
|
|
switch (sampler.wrapS)
|
|
{
|
|
case glWrap.NONE: // default
|
|
yield return TypeWithMode(TextureWrapType.All, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
case glWrap.CLAMP_TO_EDGE:
|
|
case glWrap.MIRRORED_REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.All, TextureWrapMode.Clamp);
|
|
break;
|
|
|
|
case glWrap.REPEAT:
|
|
yield return TypeWithMode(TextureWrapType.All, TextureWrapMode.Repeat);
|
|
break;
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
#endif
|
|
}
|
|
}
|
|
#endregion
|
|
|
|
public static FilterMode ImportFilterMode(glFilter filterMode)
|
|
{
|
|
switch (filterMode)
|
|
{
|
|
case glFilter.NEAREST:
|
|
case glFilter.NEAREST_MIPMAP_LINEAR:
|
|
case glFilter.NEAREST_MIPMAP_NEAREST:
|
|
return FilterMode.Point;
|
|
|
|
case glFilter.NONE:
|
|
case glFilter.LINEAR:
|
|
case glFilter.LINEAR_MIPMAP_NEAREST:
|
|
return FilterMode.Bilinear;
|
|
|
|
case glFilter.LINEAR_MIPMAP_LINEAR:
|
|
return FilterMode.Trilinear;
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
|
|
}
|
|
}
|
|
|
|
public static void SetSampler(Texture2D texture, glTFTextureSampler sampler)
|
|
{
|
|
if (texture == null)
|
|
{
|
|
return;
|
|
}
|
|
|
|
foreach (var kv in GetUnityWrapMode(sampler))
|
|
{
|
|
switch (kv.Key)
|
|
{
|
|
case TextureWrapType.All:
|
|
texture.wrapMode = kv.Value;
|
|
break;
|
|
|
|
#if UNITY_2017_1_OR_NEWER
|
|
case TextureWrapType.U:
|
|
texture.wrapModeU = kv.Value;
|
|
break;
|
|
|
|
case TextureWrapType.V:
|
|
texture.wrapModeV = kv.Value;
|
|
break;
|
|
|
|
case TextureWrapType.W:
|
|
texture.wrapModeW = kv.Value;
|
|
break;
|
|
#endif
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
texture.filterMode = ImportFilterMode(sampler.minFilter);
|
|
}
|
|
|
|
#region Export
|
|
public static glFilter ExportFilterMode(Texture texture)
|
|
{
|
|
switch (texture.filterMode)
|
|
{
|
|
case FilterMode.Point:
|
|
return glFilter.NEAREST;
|
|
|
|
case FilterMode.Bilinear:
|
|
return glFilter.LINEAR;
|
|
|
|
case FilterMode.Trilinear:
|
|
return glFilter.LINEAR_MIPMAP_LINEAR;
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public static TextureWrapMode GetWrapS(Texture texture)
|
|
{
|
|
#if UNITY_2017_1_OR_NEWER
|
|
return texture.wrapModeU;
|
|
#else
|
|
return texture.wrapMode;
|
|
#endif
|
|
}
|
|
|
|
public static TextureWrapMode GetWrapT(Texture texture)
|
|
{
|
|
#if UNITY_2017_1_OR_NEWER
|
|
return texture.wrapModeV;
|
|
#else
|
|
return texture.wrapMode;
|
|
#endif
|
|
}
|
|
|
|
public static glWrap ExportWrapMode(TextureWrapMode wrapMode)
|
|
{
|
|
switch (wrapMode)
|
|
{
|
|
case TextureWrapMode.Clamp:
|
|
return glWrap.CLAMP_TO_EDGE;
|
|
|
|
case TextureWrapMode.Repeat:
|
|
return glWrap.REPEAT;
|
|
|
|
#if UNITY_2017_1_OR_NEWER
|
|
case TextureWrapMode.Mirror:
|
|
case TextureWrapMode.MirrorOnce:
|
|
return glWrap.MIRRORED_REPEAT;
|
|
#endif
|
|
|
|
default:
|
|
throw new NotImplementedException();
|
|
}
|
|
}
|
|
|
|
public static glTFTextureSampler Export(Texture texture)
|
|
{
|
|
var filter = ExportFilterMode(texture);
|
|
var wrapS = ExportWrapMode(GetWrapS(texture));
|
|
var wrapT = ExportWrapMode(GetWrapT(texture));
|
|
return new glTFTextureSampler
|
|
{
|
|
magFilter = filter,
|
|
minFilter = filter,
|
|
wrapS = wrapS,
|
|
wrapT = wrapT,
|
|
};
|
|
}
|
|
#endregion
|
|
}
|
|
}
|