
#region ================== Copyright (c) 2007 Pascal vd Heiden

/*
 * Copyright (c) 2007 Pascal vd Heiden, www.codeimp.com
 * This program is released under GNU General Public License
 * 
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 */

#endregion

#region ================== Namespaces

using System.IO;
using CodeImp.DoomBuilder.Rendering;
using CodeImp.DoomBuilder.ZDoom;

#endregion

namespace CodeImp.DoomBuilder.Data
{
	public enum TexturePathRenderStyle
	{
		COPY,
		BLEND,
		ADD,
		SUBTRACT,
		REVERSE_SUBTRACT,
		MODULATE,
		COPY_ALPHA,
		COPY_NEW_ALPHA, //mxd
		OVERLAY, //mxd
	}

	public enum TexturePathBlendStyle //mxd
	{
		NONE,
		BLEND,
		TINT
	}
	
	internal struct TexturePatch
	{
		public readonly string LumpName;
		public readonly int X;
		public readonly int Y;
		public readonly bool FlipX;
		public readonly bool FlipY;
		public readonly bool HasLongName; //mxd
		public readonly int Rotate;
		public PixelColor BlendColor;
		public readonly float Alpha;
		public readonly TexturePathRenderStyle RenderStyle;
		public readonly TexturePathBlendStyle BlendStyle; //mxd
		public readonly bool Skip; //mxd
		
		// Constructor for simple patches
		public TexturePatch(string lumpname, int x, int y)
		{
			// Initialize
			this.LumpName = lumpname;
			this.X = x;
			this.Y = y;
			this.FlipX = false;
			this.FlipY = false;
			this.Rotate = 0;
			this.BlendColor = new PixelColor(0, 0, 0, 0);
			this.Alpha = 1.0f;
			this.RenderStyle = TexturePathRenderStyle.COPY;
			this.BlendStyle = TexturePathBlendStyle.NONE;//mxd
			this.HasLongName = false; //mxd
			this.Skip = false; //mxd
		}

		//mxd. Constructor for hires patches
		public TexturePatch(PatchStructure patch) 
		{
			// Initialize
			this.LumpName = patch.Name.ToUpperInvariant();
			this.X = patch.OffsetX;
			this.Y = patch.OffsetY;
			this.FlipX = patch.FlipX;
			this.FlipY = patch.FlipY;
			this.Rotate = patch.Rotation;
			this.BlendColor = patch.BlendColor;
			this.Alpha = patch.Alpha;
			this.RenderStyle = patch.RenderStyle;
			this.BlendStyle = patch.BlendStyle;
			this.HasLongName = (Path.GetFileNameWithoutExtension(this.LumpName) != this.LumpName);
			this.Skip = patch.Skip;

			//mxd. Check data so we don't perform unneeded operations later on
			if(this.Alpha == 1.0f) 
			{
				switch(this.RenderStyle)
				{
					case TexturePathRenderStyle.BLEND:
					case TexturePathRenderStyle.COPY_ALPHA:
					case TexturePathRenderStyle.COPY_NEW_ALPHA:
					case TexturePathRenderStyle.OVERLAY:
						this.RenderStyle = TexturePathRenderStyle.COPY;
						break;
				}
			}

			//mxd. and get rid of render styles we don't support
			if(this.RenderStyle == TexturePathRenderStyle.OVERLAY) this.RenderStyle = TexturePathRenderStyle.COPY;
		}
	}
}
