You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
5.0 KiB
C#

/******************************************************************************/
/*
Project - MudBun
Publisher - Long Bunny Labs
http://LongBunnyLabs.com
Author - Ming-Lun "Allen" Chou
http://AllenChou.net
*/
/******************************************************************************/
using UnityEngine;
namespace MudBun
{
//[CreateAssetMenu(fileName = "MudBun Texture Packer", menuName = "MudBun/Texture Packer", order = 151)]
public class MudTexturePacker : ScriptableObject
{
public enum TextureType
{
White,
Gray,
Black,
FlatNormal,
Texutre,
}
public TextureType ColorType;
public Texture2D Color;
public TextureType EmissionType;
public Texture2D Emission;
public TextureType NormalType;
public Texture2D Normal;
public TextureType MetallicType;
public Texture2D Metallic;
public TextureType SmoothnessType;
public Texture2D Smoothness;
private Color [] GetPixels(TextureType type, int numPixels)
{
switch (type)
{
case TextureType.White:
Color white = new Color(255, 255, 255, 255);
Color[] aWhite = new Color[numPixels];
for (int i = 0; i < numPixels; ++i)
{
aWhite[i] = white;
}
return aWhite;
case TextureType.Gray:
Color gray = new Color(128, 128, 128, 255);
Color[] aGray = new Color[numPixels];
for (int i = 0; i < numPixels; ++i)
{
aGray[i] = gray;
}
return aGray;
case TextureType.Black:
Color black = new Color(0, 0, 0, 255);
Color[] aBlack = new Color[numPixels];
for (int i = 0; i < numPixels; ++i)
{
aBlack[i] = black;
}
return aBlack;
case TextureType.FlatNormal:
Color flatNormal = new Color(0, 0, 0, 255);
Color[] aFlatNormal = new Color[numPixels];
for (int i = 0; i < numPixels; ++i)
{
aFlatNormal[i] = flatNormal;
}
return aFlatNormal;
}
Assert.Warn("Invalid texture type: " + type);
return null;
}
public void Pack(string path)
{
int width = -1;
int height = -1;
if (Color != null)
{
width = Color.width;
height = Color.height;
}
if (Emission != null)
{
if ((width >= 0 && width != Emission.width)
|| (height >= 0 && height != Emission.height))
{
Debug.LogError($"MudBun Texture Packer: Emission texture doesn't match other textures dimsions (need {width} x {height} but got {Emission.width} x {Emission.height}).");
return;
}
width = Emission.width;
height = Emission.height;
}
if (Normal != null)
{
if ((width >= 0 && width != Normal.width)
|| (height >= 0 && height != Normal.height))
{
Debug.LogError($"MudBun Texture Packer: ENormal texture doesn't match other textures dimsions (need {width} x {height} but got {Normal.width} x {Normal.height}).");
return;
}
width = Normal.width;
height = Normal.height;
}
if (Metallic != null)
{
if ((width >= 0 && width != Metallic.width)
|| (height >= 0 && height != Metallic.height))
{
Debug.LogError($"MudBun Texture Packer: EMetallic texture doesn't match other textures dimsions (need {width} x {height} but got {Metallic.width} x {Metallic.height}).");
return;
}
width = Metallic.width;
height = Metallic.height;
}
if (Smoothness != null)
{
if ((width >= 0 && width != Smoothness.width)
|| (height >= 0 && height != Smoothness.height))
{
Debug.LogError($"MudBun Texture Packer: ESmoothness texture doesn't match other textures dimsions (need {width} x {height} but got {Smoothness.width} x {Smoothness.height}).");
return;
}
width = Smoothness.width;
height = Smoothness.height;
}
if (width <= 0 || height <= 0)
{
Debug.LogError("MudBun Texture Packer: EAt least one non-empty texture needs to be specified.");
return;
}
int numPixels = width * height;
Color [] aColor = (Color != null) ? Color.GetPixels() : GetPixels(ColorType, numPixels);
Color [] aEmission = (Emission != null) ? Emission.GetPixels() : GetPixels(EmissionType, numPixels);
Color [] aNormal = (Normal != null) ? Normal.GetPixels() : GetPixels(NormalType, numPixels);
Color [] aMetallic = (Metallic != null) ? Metallic.GetPixels() : GetPixels(MetallicType, numPixels);
Color [] aSmoothness = (Smoothness != null) ? Metallic.GetPixels() : GetPixels(SmoothnessType, numPixels);
for (int x = 0; x < width; ++x)
{
for (int y = 0; y < height; ++y)
{
// TODO: don't need this right now
}
}
}
}
}