// generic shader draw, text draw, ui art elements to be included by menu scripts that use such

#define PREPROC_SHADER_DRAW_ALIGNED( prect, porigin, pshader, pcolor, pborder, pbordersize, pbordercolor ) \
		PREPROC_SHADER_DRAW_ALIGNED_VIS( prect, porigin, pshader, pcolor, pborder, pbordersize, pbordercolor, 1 )
		
#define PREPROC_SHADER_DRAW_ALIGNED_VIS( prect, porigin, pshader, pcolor, pborder, pbordersize, pbordercolor, visArg ) \
		itemDef { \
			style			WINDOW_STYLE_SHADER \
			rect			prect \
			origin 			porigin \
			forecolor		pcolor \
			exp				material( pshader ); \
			border			pborder \
			bordersize		pbordersize \
			bordercolor		pbordercolor \
			visible			visArg \
			decoration \
		}

#define PREPROC_GRADIENT_DRAW_ALIGNED_ADV( prect, porigin, pshader, pcolor ) \
		PREPROC_GRADIENT_DRAW_ALIGNED_ADV_VIS( prect, porigin, pshader, pcolor, 1 )

#define PREPROC_GRADIENT_DRAW_ALIGNED_ADV_VIS( prect, porigin, pshader, pcolor, visArg ) \
		itemDef { \
			style			WINDOW_STYLE_SHADER \
			rect			prect \
			origin			porigin \
			forecolor		pcolor \
			exp				material( pshader ); \
			visible			visArg \
			decoration \
		}

#define PREPROC_GRADIENT_DRAW_ALIGNED( px, py, pw, ph, horAlign, verAlign, porigin, pshader, pcolor ) \
		PREPROC_GRADIENT_DRAW_ALIGNED_VIS( px, py, pw, ph, horAlign, verAlign, porigin, pshader, pcolor, 1 )

#define PREPROC_GRADIENT_DRAW_ALIGNED_VIS( px, py, pw, ph, horAlign, verAlign, porigin, pshader, pcolor, visArg ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			px py pw ph horAlign verAlign \
			origin 			porigin \
			forecolor		pcolor \
			exp				material( pshader ); \
			visible			visArg \
			decoration \
		} \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			px (py-1) pw 1 horAlign verAlign \
			origin 			porigin \
			background		"menu_button_backing" \
			forecolor		0.3 0.3 0.3 0.7 \
			visible			visArg \
			decoration \
		} \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			px (py+ph) pw 1 horAlign verAlign \
			origin 			porigin \
			background		"menu_button_backing" \
			forecolor		0.2 0.2 0.2 0.7 \
			visible			visArg \
			decoration \
		}

#define PREPROC_GRADIENT_TOP_LINE_DRAW_ALIGNED( px, py, pw, ph, horAlign, verAlign, porigin, pshader, pcolor ) \
		PREPROC_GRADIENT_TOP_LINE_DRAW_ALIGNED_VIS( px, py, pw, ph, horAlign, verAlign, porigin, pshader, pcolor, 1 )

#define PREPROC_GRADIENT_TOP_LINE_DRAW_ALIGNED_VIS( px, py, pw, ph, horAlign, verAlign, porigin, pshader, pcolor, visArg ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			px py pw ph horAlign verAlign \
			origin 			porigin \
			forecolor		pcolor \
			exp				material( pshader ); \
			visible			visArg \
			decoration \
		} \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			px (py-1) pw 1 horAlign verAlign \
			origin 			porigin \
			background		"menu_button_backing" \
			forecolor		0.5 0.5 0.5 0.7 \
			visible			visArg \
			decoration \
		}

#define PREPROC_GRADIENT_LEFT_LINE_DRAW_ALIGNED( px, py, pw, ph, horAlign, verAlign, porigin ) \
		PREPROC_GRADIENT_LEFT_LINE_DRAW_ALIGNED_VIS( px, py, pw, ph, horAlign, verAlign, porigin, 1 )

#define PREPROC_GRADIENT_LEFT_LINE_DRAW_ALIGNED_VIS( px, py, pw, ph, horAlign, verAlign, porigin, visArg ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			px py pw ph horAlign verAlign \
			origin 			porigin \
			background		"gradient_left" \
			forecolor		0.5 0.5 0.5 0.3 \
			visible			1 \
			decoration \
		} \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			(px+16) py 1 ph horAlign verAlign \
			origin 			porigin \
			background		"menu_white_line" \
			forecolor		0.5 0.5 0.5 0.2 \
			visible			visArg \
			decoration \
		}

// generic shader draw
#define PREPROC_SHADER_DRAW( prect, porigin, pshader, pcolor, pborder, pbordersize, pbordercolor ) \
		PREPROC_SHADER_DRAW_VIS( prect, porigin, pshader, pcolor, pborder, pbordersize, pbordercolor, 1 )

#define PREPROC_SHADER_DRAW_VIS( prect, porigin, pshader, pcolor, pborder, pbordersize, pbordercolor, visArg ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			prect 0 0 \
			origin			porigin \
			forecolor		pcolor \
			exp				material( pshader ); \
			border			pborder \
			bordersize		pbordersize \
			bordercolor		pbordercolor \
			visible			visArg \
			decoration \
		}		

// generic text draw
#define PREPROC_TEXT_DRAW( prect, porigin, ptext, psize, palignx, paligny, palign, pcolor ) \
		itemDef \
		{ \
			rect			prect 0 0 \
			origin			porigin \
			textalignx		palignx \
			textaligny		paligny \
			textfont		UI_FONT_NORMAL \
			textstyle		ITEM_TEXTSTYLE_SHADOWED \
			textalign		palign \
			textscale		psize \
			forecolor		pcolor \
			ptext \
			visible			1 \
			decoration \
		}
	
// generic text draw
#define PREPROC_TEXT_DRAW_ALIGNED( prect, porigin, ptext, psize, palignx, paligny, palign, pcolor ) \
		itemDef \
		{ \
			rect			prect \
			origin 			porigin \
			textalignx		palignx \
			textaligny		paligny \
			textfont		UI_FONT_NORMAL \
			textstyle		ITEM_TEXTSTYLE_SHADOWED \
			textalign		palign \
			textscale		psize \
			forecolor		pcolor \
			ptext \
			visible			1 \
			decoration \
			autowrapped \
		}

// generic text draw
#define PREPROC_TEXT_DRAW_ALIGNED_EXP( prect, porigin, ptext, psize, palignx, paligny, palign, pcolor ) \
		itemDef \
		{ \
			rect			prect \
			origin 			porigin \
			textalignx		palignx \
			textaligny		paligny \
			textfont		UI_FONT_NORMAL \
			textstyle		ITEM_TEXTSTYLE_SHADOWED \
			textalign		palign \
			textscale		psize \
			forecolor		pcolor \
			exp				text( ptext ); \
			visible			1 \
			decoration \
			autowrapped \
		}

#define PREPROC_TEXT_DRAW_ALIGNED_EXP2( prect, porigin, ptext, pfont, psize, palignx, paligny, palign, pcolor ) \
		itemDef \
		{ \
			rect			prect \
			origin 			porigin \
			textalignx		palignx \
			textaligny		paligny \
			textfont		UI_FONT_NORMAL \
			textstyle		ITEM_TEXTSTYLE_SHADOWED \
			textalign		palign \
			textscale		psize \
			forecolor		pcolor \
			exp				text( ptext ); \
			visible			1 \
			decoration \
			autowrapped \
		}
		
#define PREPROC_TEXT_DRAW_ALIGNED_VIS( prect, porigin, ptext, psize, palignx, paligny, palign, pcolor, visArg ) \
		itemDef \
		{ \
			rect			prect \
			origin 			porigin \
			textalignx		palignx \
			textaligny		paligny \
			textfont		UI_FONT_NORMAL \
			textstyle		ITEM_TEXTSTYLE_SHADOWED \
			textalign		palign \
			textscale		psize \
			forecolor		pcolor \
			exp				text( ptext ); \
			visible			visArg; \
			decoration \
			autowrapped \
		}

// generic shader draw using exp
#define PREPROC_SHADER_DRAW_EXP( prect, porigin, pshader, pcolor, pborder, pbordersize, pbordercolor ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			rect			prect 0 0 origin porigin \
			forecolor		pcolor \
			pshader;\
			border			pborder \
			bordersize		pbordersize \
			bordercolor		pbordercolor \
			visible			1 \
			decoration \
		}		

// generic text draw using exp
#define PREPROC_TEXT_DRAW_EXP( prect, porigin, ptext, psize, palignx, paligny, palign, pcolor ) \
		itemDef \
		{ \
			rect			prect 0 0 \
			origin			porigin \
			textalignx		palignx \
			textaligny		paligny \
			textfont		UI_FONT_NORMAL \
			textstyle		ITEM_TEXTSTYLE_SHADOWED \
			textalign		palign \
			textscale		psize \
			forecolor		pcolor \
			ptext; \
			visible			1 \
			decoration \
		}

// generic shader draw
#define PREPROC_SHADER_DRAW_ADV( px, py, pw, ph, pshader, pcolor, pborder, pbordersize, pbordercolor ) \
		PREPROC_SHADER_DRAW_ADV_VIS( px, py, pw, ph, pshader, pcolor, pborder, pbordersize, pbordercolor, 1 )
		
#define PREPROC_SHADER_DRAW_ADV_VIS( px, py, pw, ph, pshader, pcolor, pborder, pbordersize, pbordercolor, visArg ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			exp				rect X( px ) \
			exp				rect Y( py ) \
			exp				rect W( pw ) \
			exp				rect H( ph ) \
			forecolor		pcolor \
			exp				material( pshader ); \
			border			pborder \
			bordersize		pbordersize \
			bordercolor		pbordercolor \
			visible			visArg \
			decoration \
		}		

// generic text draw
#define PREPROC_TEXT_DRAW_ADV( px, py, pw, ph, ptext, psize, palignx, paligny, palign, pcolor ) \
		itemDef \
		{ \
			exp				rect X( px ) \
			exp				rect Y( py ) \
			exp				rect W( pw ) \
			exp				rect H( ph ) \
			textalign		palign \
			textalignx		palignx \
			textaligny		paligny \
			textstyle		ITEM_TEXTSTYLE_SHADOWED \
			textfont		UI_FONT_NORMAL \
			textscale		psize \
			forecolor		pcolor \
			ptext; \
			visible			1 \
			decoration \
		}

#define PREPROC_LOBBY_CHAT( px, py, pw, ph, psize, palign, pcolor ) \
	/* main chat window bg */ \
	PREPROC_GRADIENT_DRAW_ALIGNED( px, py, pw, ph, HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_TOP, 0 0, "menu_white_line", 0 0 0 0.5 ) \
	/* text entry window bg */ \
	PREPROC_GRADIENT_DRAW_ALIGNED( px, (py+ph+5), pw, (ph / 8), HORIZONTAL_ALIGN_RIGHT, VERTICAL_ALIGN_TOP, 0 0, "menu_white_line", 0 0 0 0.5 ) \
	/* main chat window text */ \
	itemDef \
	{ \
		rect		px (py-(ph/6)-5) pw (ph/6) HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP \
		textalign	ITEM_ALIGN_MIDDLE_LEFT \
		textstyle	ITEM_TEXTSTYLE_SHADOWED \
		textfont	UI_FONT_NORMAL \
		text		"@MENU_LOBBY_CHAT" \
		textscale	(psize*2.0) \
		forecolor	pcolor \
		visible		1 \
		action \
		{ \
			setFocus chat_text_input; \
		} \
	} \ 
	itemDef \
	{ \
		rect		px py pw ph HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP \
		textalign	ITEM_ALIGN_MIDDLE_LEFT \
		textstyle	ITEM_TEXTSTYLE_SHADOWED \
		textfont	UI_FONT_NORMAL \
		textscale	psize \
		forecolor	pcolor \
		visible		1 \
		ownerdraw	UI_LOBBY_CHAT \
		action \
		{ \
			setFocus chat_text_input; \
		} \
	} \ 
	itemDef \
	{ \
		rect		(px-30) (py+ph+5) pw (ph/8) HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP \
		textalign	ITEM_ALIGN_MIDDLE_LEFT \
		textstyle	ITEM_TEXTSTYLE_SHADOWED \
		textfont	UI_FONT_NORMAL \
		text		"@MENU_TALK" \
		textscale	psize \
		forecolor	pcolor \
		visible		1 \
		action \
		{ \
			setFocus chat_text_input; \
		} \
	} \ 
	itemDef \
	{ \
		name			"chat_text_input" \
		type			ITEM_TYPE_EDITFIELD \
		text			" " \
		dvar			ui_tempChatText \
		rect			px (py+ph+5) pw (ph/8) HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP \
		textalign		ITEM_ALIGN_MIDDLE_LEFT \
		textalignx		0 \
		textscale		psize \
		textstyle		ITEM_TEXTSTYLE_SHADOWED \
		style			WINDOW_STYLE_FILLED \
		forecolor		pcolor \
		visible			1 \
		maxChars		60 \
		maxpaintchars	32 \
		accept \
		{ \
			play CHOICE_ACTION_SOUND; \
			execNow "check_chat_input"; \
			exec "wait"; \
			setdvar ui_tempChatText ""; \
		} \
	} \
	itemDef \
	{ \
		rect		(px+pw-30) (py+ph+(ph/8)+10) pw (ph/8) HORIZONTAL_ALIGN_RIGHT VERTICAL_ALIGN_TOP \
		type		ITEM_TYPE_BUTTON \
		textalign	ITEM_ALIGN_MIDDLE_LEFT \
		textstyle	ITEM_TEXTSTYLE_SHADOWED \
		textfont	UI_FONT_NORMAL \
		text		"@MENU_SEND" \
		textscale	psize \
		forecolor	pcolor \
		visible		1 \
		action \
		{ \
			play CHOICE_ACTION_SOUND; \
			execNow "check_chat_input"; \
			exec "wait"; \
			setdvar ui_tempChatText ""; \
		} \
	}

#define PREPROC_PERFORATION( px, py, pw, ph, px2, py2, px3, py3 ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			exp				rect X((px)+(px2)) \
			exp				rect Y((py)+(py2)) \
			exp				rect W(pw) \
			exp				rect H(ph) \
			origin 			px3 py3 \
			forecolor		1 1 1 1 \
			exp				material( "ui_perforation" ); \
			visible			1 \
			decoration \
		}		

#define PREPROC_PERFORATION_ALIGNED( px, py, pw, ph, px2, py2, palign ) \
		itemDef \
		{ \
			style			WINDOW_STYLE_SHADER \
			exp				rect X((px)+(px2)) \
			exp				rect Y((py)+(py2)) \
			exp				rect W(pw) \
			exp				rect H(ph) \
			rect			0 0 0 0 palign \
			forecolor		1 1 1 1 \
			exp				material( "ui_perforation" ); \
			visible			1 \
			decoration \
		}	

// art bar with perforation texture
#define PERFORATIONBAR( px, py, pw, ph, px2, py2 ) \
	PREPROC_PERFORATION( px, py, (ph)*4, ph, px2, py2, 0, 0 ) \
	PREPROC_PERFORATION( (px)+(pw)-(ph)*4, py, -4*(ph), ph, px2, py2, 0, 0 )

// ------------------ preprocessing function definitions ------------------
#define SINGULAR_HIDEALL \
	hide description_choice1;	\
	hide description2_choice1;	\
	hide highlight_choice1;		\
	hide a_button_choice1;		\
	hide description_choice2;	\
	hide description2_choice2;	\
	hide highlight_choice2;		\
	hide a_button_choice2;		\
	hide description_choice3;	\
	hide description2_choice3;	\
	hide highlight_choice3;		\
	hide a_button_choice3;		\
	hide description_choice4;	\
	hide description2_choice4;	\
	hide highlight_choice4;		\
	hide a_button_choice4;		\
	hide description_choice5;	\
	hide description2_choice5;	\
	hide highlight_choice5;		\
	hide a_button_choice5;		\
	hide description_choice6;	\
	hide description2_choice6;	\
	hide highlight_choice6;		\
	hide a_button_choice6;		\
	hide description_choice7;	\
	hide description2_choice7;	\
	hide highlight_choice7;		\
	hide a_button_choice7;		\
	hide description_choice8;	\
	hide description2_choice8;	\
	hide highlight_choice8;		\
	hide a_button_choice8;		\
	hide description_choice9;	\
	hide description2_choice9;	\
	hide highlight_choice9;		\
	hide a_button_choice9;		\
	hide description_choice10;	\
	hide description2_choice10;	\
	hide highlight_choice10;	\
	hide a_button_choice10;		\
	hide description_choice11;	\
	hide description2_choice11;	\
	hide highlight_choice11;	\
	hide a_button_choice11;		\
	hide description_choice12;	\
	hide description2_choice12;	\
	hide highlight_choice12;	\
	hide a_button_choice12;		\
	hide description_choice13;	\
	hide description2_choice13;	\
	hide highlight_choice13;	\
	hide a_button_choice13;		\
	hide description_choice14;	\
	hide description2_choice14;	\
	hide highlight_choice14;	\
	hide a_button_choice14;		\
	hide description_choice15;	\
	hide description2_choice15;	\
	hide highlight_choice15;	\
	hide a_button_choice15;		\
	hide description_choice16;	\
	hide description2_choice16;	\
	hide highlight_choice16;	\
	hide a_button_choice16;		\
	hide description_choice17;	\
	hide description2_choice17;	\
	hide highlight_choice17;	\
	hide a_button_choice17;	
		
// singular button macro
#define SINGULAR_BUTTON( pnum, porigin, phighlight_size, ptext, paction ) \
	SINGULAR_BUTTON_RAW( pnum, porigin, phighlight_size, ptext, paction, 1 )

#define SINGULAR_BUTTON_RAW( pnum, porigin, phighlight_size, ptext, paction, p_vis ) \
itemDef{											\
	type			ITEM_TYPE_BUTTON				\
	origin			porigin							\
	textfont		UI_FONT_NORMAL					\
	textstyle 		ITEM_TEXTSTYLE_SHADOWED			\
	exp				text( ptext );					\
	textscale		TEXTSIZE_DEFAULT				\
	forecolor		1 1 1 0.5						\
	visible			when( p_vis );					\
	onFocus{										\
		play "mouse_over";							\
		SINGULAR_HIDEALL							\
		show "description_choice"#pnum;				\
		show "description2_choice"#pnum;			\
		show "highlight_choice"#pnum;				\
		show "a_button_choice"#pnum; }				\
	leaveFocus{										\
		hide "description_choice"#pnum;				\
		hide "description2_choice"#pnum;			\
		hide "highlight_choice"#pnum;				\
		hide "a_button_choice"#pnum; }				\
	action{											\
		play "mouse_click";							\
		paction	}}									\
itemDef { 											\
	name			"highlight_choice"#pnum 		\
	style			WINDOW_STYLE_SHADER 			\
	rect			porigin phighlight_size 0 0 	\
	origin			-26 -19 						\
	background		"white"			 				\
	forecolor		0.2 0.25 0.35 0.25 				\
	border			1				 				\
	bordersize		1 								\
	bordercolor		0.8 0.95 1 0.4		 			\
	visible			1 								\
	decoration }									\
itemDef { 											\
	name			"a_button_choice"#pnum 			\
	text			"@XBOXLIVE_SELECTBUTTON" 		\
	textfont		UI_FONT_NORMAL 					\
	textscale		0.27		 					\
	rect			porigin 20 20 0 0				\
	origin			-20 -3							\
	forecolor		0 0 0 0.5	 					\
	visible			1 								\
	decoration }		
	
// full button that show/hides highlight, a button, description and gray out if locked
#define SINGULAR_BUTTON_FULL( pnum, porigin, phighlight_size, ptext, paction, pvis ) \
itemDef{											\
	type			ITEM_TYPE_BUTTON				\
	origin			porigin							\
	textfont		UI_FONT_NORMAL					\
	textstyle 		ITEM_TEXTSTYLE_SHADOWED			\
	exp				text( ptext );					\
	textscale		TEXTSIZE_DEFAULT				\
	forecolor		0.25 0.25 0.25 1				\
	visible			when( !( pvis ) );				\
	decoration }									\
itemDef{											\
	type			ITEM_TYPE_BUTTON				\
	origin			porigin							\
	textfont		UI_FONT_NORMAL					\
	textstyle 		ITEM_TEXTSTYLE_SHADOWED			\
	exp				text( "" );						\
	visible			when( !( pvis ) );				\
	onFocus{										\
		play "mouse_over";							\
		SINGULAR_HIDEALL							\
		show "description2_choice"#pnum;			\
		show "highlight_choice"#pnum;				\
		hide "description_choice"#pnum; }			\
	leaveFocus{										\
		hide "description2_choice"#pnum;			\
		hide "highlight_choice"#pnum; } }			\
SINGULAR_BUTTON_RAW( pnum, porigin, phighlight_size, ptext, paction, pvis )

#define LOADOUT_PLATING_RAW( porigin, px, py, pw, ph, palign, vis_gradient_top, vis_gradient_bottom ) \
	PREPROC_SHADER_DRAW_ALIGNED( (px-4) (py-8) pw ph palign, porigin, "white", 0.2 0.2 0.225 1, 0, 0, 0 0 0 0 ) \
	PREPROC_SHADER_DRAW_ALIGNED( (px-4) (py-8) pw ph palign, porigin, "line_horizontal", 0.9 0.9 0.95 0.5, 0, 0, 0 0 0 0 ) \
	PREPROC_SHADER_DRAW_ALIGNED( (px-4) (py+ph-8) pw 16 palign, porigin, "gradient_top", 1 1 1 0.4, 0, 0, 0 0 0 0 visible when( vis_gradient_bottom ) ) \
	PREPROC_SHADER_DRAW_ALIGNED( (px-4) (py-24) pw 16 palign, porigin, "gradient_bottom", 1 1 1 0.4, 0, 0, 0 0 0 0 visible when( vis_gradient_top ) )