
#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;
using System.IO;
using CodeImp.DoomBuilder.Rendering;
using CodeImp.DoomBuilder.ZDoom;

#endregion

namespace CodeImp.DoomBuilder.Data
{
	public enum TexturePathRenderStyle
	{
		Copy,
		Blend,
		Add,
		Subtract,
		ReverseSubtract,
		Modulate,
		CopyAlpha,
		CopyNewAlpha, //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 blend;
		public readonly float alpha;
		public readonly TexturePathRenderStyle style;
		public readonly TexturePathBlendStyle blendstyle; //mxd
		public readonly float tintammount;//mxd
		public readonly bool skip; //mxd
		
		// Constructor for simple patches
		public TexturePatch(string lumpname, int x, int y)
		{
			// Initialize
			this.lumpname = lumpname;
			this.x = (Int16)x;
			this.y = (Int16)y;
			this.flipx = false;
			this.flipy = false;
			this.rotate = 0;
			this.blend = new PixelColor(0, 0, 0, 0);
			this.alpha = 1.0f;
			this.style = TexturePathRenderStyle.Copy;
			this.blendstyle = TexturePathBlendStyle.None;//mxd
			this.tintammount = 0; //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 = (Int16)patch.OffsetX;
			this.y = (Int16)patch.OffsetY;
			this.flipx = patch.FlipX;
			this.flipy = patch.FlipY;
			this.rotate = patch.Rotation;
			this.blend = patch.BlendColor;
			this.alpha = patch.Alpha;
			this.style = patch.RenderStyle;
			this.blendstyle = patch.BlendStyle;
			this.tintammount = patch.TintAmmount;
			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.style)
				{
					case TexturePathRenderStyle.Blend:
					case TexturePathRenderStyle.CopyAlpha:
					case TexturePathRenderStyle.CopyNewAlpha:
					case TexturePathRenderStyle.Overlay:
						this.style = TexturePathRenderStyle.Copy;
						break;
				}
			}

			//mxd. and get rid of render styles we don't support
			if(this.style == TexturePathRenderStyle.Overlay) this.style = TexturePathRenderStyle.Copy;
		}
	}
}
