2013-04-17 23:09:55 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// Copyright 2013 Dolphin Emulator Project
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Licensed under GPLv2
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								// Refer to the license.txt file included.
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <stdio.h> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <cmath> 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  <assert.h> 
  
						 
					
						
							
								
									
										
										
										
											2009-10-14 01:58:39 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  <locale.h> 
  
						 
					
						
							
								
									
										
										
										
											2013-06-15 13:21:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifdef __APPLE__ 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									# include  <xlocale.h> 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-02-05 23:57:12 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "LightingShaderGen.h" 
  
						 
					
						
							
								
									
										
										
										
											2008-12-26 17:33:53 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "PixelShaderGen.h" 
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "XFMemory.h"    // for texture projection mode
  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:31:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "BPMemory.h" 
  
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# include  "VideoConfig.h" 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								# include  "NativeVertexFormat.h" 
  
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:40:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//   old tev->pixelshader notes
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//
  
						 
					
						
							
								
									
										
										
										
											2009-06-22 09:31:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//   color for this stage (alpha, color) is given by bpmem.tevorders[0].colorchan0
  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//   konstant for this stage (alpha, color) is given by bpmem.tevksel
  
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//   inputs are given by bpmem.combiners[0].colorC.a/b/c/d     << could be current channel color
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//   according to GXTevColorArg table above
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//   output is given by .outreg
  
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//   tevtemp is set according to swapmodetables and
  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevKSelTableC [ ]  =  // KCSEL
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 1.0f,1.0f,1.0f " ,        // 1   = 0x00
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 0.875f,0.875f,0.875f " ,  // 7_8 = 0x01
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.75f,0.75f,0.75f " ,     // 3_4 = 0x02
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.625f,0.625f,0.625f " ,  // 5_8 = 0x03
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.5f,0.5f,0.5f " ,        // 1_2 = 0x04
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.375f,0.375f,0.375f " ,  // 3_8 = 0x05
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.25f,0.25f,0.25f " ,     // 1_4 = 0x06
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.125f,0.125f,0.125f " ,  // 1_8 = 0x07
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-11 15:47:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" ERROR1 " ,  // 0x08
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR2 " ,  // 0x09
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR3 " ,  // 0x0a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR4 " ,  // 0x0b
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									I_KCOLORS " [0].rgb " ,  // K0 = 0x0C
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].rgb " ,  // K1 = 0x0D
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].rgb " ,  // K2 = 0x0E
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].rgb " ,  // K3 = 0x0F
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].rrr " ,  // K0_R = 0x10
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].rrr " ,  // K1_R = 0x11
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].rrr " ,  // K2_R = 0x12
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].rrr " ,  // K3_R = 0x13
 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									I_KCOLORS " [0].ggg " ,  // K0_G = 0x14
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									I_KCOLORS " [1].ggg " ,  // K1_G = 0x15
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].ggg " ,  // K2_G = 0x16
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].ggg " ,  // K3_G = 0x17
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].bbb " ,  // K0_B = 0x18
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].bbb " ,  // K1_B = 0x19
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].bbb " ,  // K2_B = 0x1A
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].bbb " ,  // K3_B = 0x1B
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].aaa " ,  // K0_A = 0x1C
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].aaa " ,  // K1_A = 0x1D
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].aaa " ,  // K2_A = 0x1E
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].aaa " ,  // K3_A = 0x1F
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevKSelTableA [ ]  =  // KASEL
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 1.0f " ,   // 1   = 0x00
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.875f " , // 7_8 = 0x01
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.75f " ,  // 3_4 = 0x02
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.625f " , // 5_8 = 0x03
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.5f " ,   // 1_2 = 0x04
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.375f " , // 3_8 = 0x05
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.25f " ,  // 1_4 = 0x06
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.125f " , // 1_8 = 0x07
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-11 15:47:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" ERROR5 " ,  // 0x08
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR6 " ,  // 0x09
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR7 " ,  // 0x0a
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR8 " ,  // 0x0b
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR9 " ,  // 0x0c
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR10 " ,  // 0x0d
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR11 " ,  // 0x0e
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR12 " ,  // 0x0f
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									I_KCOLORS " [0].r " ,  // K0_R = 0x10
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].r " ,  // K1_R = 0x11
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].r " ,  // K2_R = 0x12
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].r " ,  // K3_R = 0x13
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].g " ,  // K0_G = 0x14
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].g " ,  // K1_G = 0x15
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].g " ,  // K2_G = 0x16
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].g " ,  // K3_G = 0x17
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].b " ,  // K0_B = 0x18
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].b " ,  // K1_B = 0x19
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].b " ,  // K2_B = 0x1A
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].b " ,  // K3_B = 0x1B
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [0].a " ,  // K0_A = 0x1C
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [1].a " ,  // K1_A = 0x1D
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [2].a " ,  // K2_A = 0x1E
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									I_KCOLORS " [3].a " ,  // K3_A = 0x1F
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevScaleTable [ ]  =  // CS
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" 1.0f " ,   // SCALE_1
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 2.0f " ,   // SCALE_2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 4.0f " ,   // SCALE_4
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.5f " ,   // DIVIDE_2
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevBiasTable [ ]  =  // TB
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" " ,        // ZERO,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" +0.5f " ,   // ADDHALF,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" -0.5f " ,   // SUBHALF,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" " , 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevOpTable [ ]  =  {  // TEV
  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" + " ,       // TEVOP_ADD = 0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" - " ,       // TEVOP_SUB = 1,
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevCInputTable [ ]  =  // CC
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (prev.rgb) " ,          // CPREV,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (prev.aaa) " ,          // APREV,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (c0.rgb) " ,            // C0,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (c0.aaa) " ,            // A0,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (c1.rgb) " ,            // C1,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (c1.aaa) " ,            // A1,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (c2.rgb) " ,            // C2,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (c2.aaa) " ,            // A2,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (textemp.rgb) " ,       // TEXC,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (textemp.aaa) " ,       // TEXA,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (rastemp.rgb) " ,       // RASC,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (rastemp.aaa) " ,       // RASA,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(1.0f, 1.0f, 1.0f) " ,               // ONE
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float3(0.5f, 0.5f, 0.5f) " ,               // HALF
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (konsttemp.rgb) " ,  //"konsttemp.rgb",    // KONST
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " ,               // ZERO
 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-07 17:11:29 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									///added extra values to map clamped values
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (cprev.rgb) " ,         // CPREV,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (cprev.aaa) " ,         // APREV,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (cc0.rgb) " ,           // C0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (cc0.aaa) " ,           // A0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (cc1.rgb) " ,           // C1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (cc1.aaa) " ,           // A1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (cc2.rgb) " ,           // C2,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (cc2.aaa) " ,           // A2,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (textemp.rgb) " ,       // TEXC,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (textemp.aaa) " ,       // TEXA,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (crastemp.rgb) " ,      // RASC,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (crastemp.aaa) " ,      // RASA,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float3(1.0f, 1.0f, 1.0f) " ,               // ONE
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float3(0.5f, 0.5f, 0.5f) " ,               // HALF
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (ckonsttemp.rgb) " ,  //"konsttemp.rgb",   // KONST
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " ,               // ZERO
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-11 15:47:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" PADERROR1 " ,  " PADERROR2 " ,  " PADERROR3 " ,  " PADERROR4 " 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevAInputTable [ ]  =  // CA
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" prev " ,             // APREV,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c0 " ,               // A0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c1 " ,               // A1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" c2 " ,               // A2,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" textemp " ,          // TEXA,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" rastemp " ,          // RASA,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" konsttemp " ,        // KONST,  (hw1 had quarter)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float4(0.0f, 0.0f, 0.0f, 0.0f) " ,  // ZERO
 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									///added extra values to map clamped values
 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-27 21:43:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" cprev " ,             // APREV,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" cc0 " ,               // A0,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" cc1 " ,               // A1,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" cc2 " ,               // A2,
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-19 21:51:12 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" textemp " ,           // TEXA,
 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" crastemp " ,          // RASA,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ckonsttemp " ,        // KONST,  (hw1 had quarter)
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float4(0.0f, 0.0f, 0.0f, 0.0f) " ,  // ZERO
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-11 15:47:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" PADERROR5 " ,  " PADERROR6 " ,  " PADERROR7 " ,  " PADERROR8 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" PADERROR9 " ,  " PADERROR10 " ,  " PADERROR11 " ,  " PADERROR12 " , 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevRasTable [ ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" colors_0 " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" colors_1 " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-11 15:47:38 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" ERROR13 " ,  //2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR14 " ,  //3
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" ERROR15 " ,  //4
 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-22 12:19:52 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float4(alphabump,alphabump,alphabump,alphabump) " ,  // use bump alpha
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (float4(alphabump,alphabump,alphabump,alphabump)*(255.0f/248.0f)) " ,  //normalized
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float4(0.0f, 0.0f, 0.0f, 0.0f) " ,  // zero
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//static const char *tevTexFunc[] = { "tex2D", "texRECT" };
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevCOutputTable [ ]   =  {  " prev.rgb " ,  " c0.rgb " ,  " c1.rgb " ,  " c2.rgb "  } ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevAOutputTable [ ]   =  {  " prev.a " ,  " c0.a " ,  " c1.a " ,  " c2.a "  } ;  
						 
					
						
							
								
									
										
										
										
											2008-12-26 17:26:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevIndAlphaSel [ ]    =  { " " ,  " x " ,  " y " ,  " z " } ;  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//static const char *tevIndAlphaScale[] = {"", "*32", "*16", "*8"};
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevIndAlphaScale [ ]  =  { " *(248.0f/255.0f) " ,  " *(224.0f/255.0f) " ,  " *(240.0f/255.0f) " ,  " *(248.0f/255.0f) " } ;  
						 
					
						
							
								
									
										
										
										
											2008-12-26 17:26:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevIndBiasField [ ]   =  { " " ,  " x " ,  " y " ,  " xy " ,  " z " ,  " xz " ,  " yz " ,  " xyz " } ;  // indexed by bias
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevIndBiasAdd [ ]     =  { " -128.0f " ,  " 1.0f " ,  " 1.0f " ,  " 1.0f "  } ;  // indexed by fmt
  
						 
					
						
							
								
									
										
										
										
											2010-04-03 22:22:55 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevIndWrapStart [ ]   =  { " 0.0f " ,  " 256.0f " ,  " 128.0f " ,  " 64.0f " ,  " 32.0f " ,  " 16.0f " ,  " 0.001f "  } ;  
						 
					
						
							
								
									
										
										
										
											2009-04-15 03:55:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevIndFmtScale [ ]    =  { " 255.0f " ,  " 31.0f " ,  " 15.0f " ,  " 7.0f "  } ;  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								struct  RegisterState  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  ColorNeedOverflowControl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  AlphaNeedOverflowControl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  AuxStored ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 11:37:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  char  text [ 16384 ] ;  
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  WriteStage ( T &  out ,  pixel_shader_uid_data &  uid_data ,  int  n ,  API_TYPE  ApiType ,  RegisterState  RegisterStates [ 4 ] ,  const  char  swapModeTable [ 4 ] [ 5 ] ) ;  
						 
					
						
							
								
									
										
										
										
											2013-08-12 12:52:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  SampleTexture ( T &  out ,  const  char  * texcoords ,  const  char  * texswap ,  int  texmap ,  API_TYPE  ApiType ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  WriteAlphaTest ( T &  out ,  pixel_shader_uid_data &  uid_data ,  API_TYPE  ApiType , DSTALPHA_MODE  dstAlphaMode ,  bool  per_pixel_depth ) ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								template < class  T >  static  inline  void  WriteFog ( T &  out ,  pixel_shader_uid_data &  uid_data ) ;  
						 
					
						
							
								
									
										
										
										
											2013-06-17 11:37:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2013-08-12 12:52:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  GeneratePixelShader ( T &  out ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Non-uid template parameters will write to the dummy data (=> gets optimized out)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									pixel_shader_uid_data  dummy_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 22:24:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									pixel_shader_uid_data &  uid_data  =  ( & out . template  GetUidData < pixel_shader_uid_data > ( )  ! =  NULL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
																		?  out . template  GetUidData < pixel_shader_uid_data > ( )  :  dummy_data ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:33:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . SetBuffer ( text ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  is_writing_shadercode  =  ( out . GetBuffer ( )  ! =  NULL ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-16 14:34:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef ANDROID 
  
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									locale_t  locale ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									locale_t  old_locale ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_writing_shadercode ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										locale  =  newlocale ( LC_NUMERIC_MASK ,  " C " ,  NULL ) ;  // New locale for compilation
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										old_locale  =  uselocale ( locale ) ;  // Apply the locale for this thread
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-16 14:34:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:33:28 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_writing_shadercode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										text [ sizeof ( text )  -  1 ]  =  0x7C ;   // canary
 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									unsigned  int  numStages  =  bpmem . genMode . numtevstages  +  1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									unsigned  int  numTexgen  =  bpmem . genMode . numtexgens ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  forced_early_z  =  g_ActiveConfig . backend_info . bSupportsEarlyZ  & &  bpmem . UseEarlyDepthTest ( )  & &  ( g_ActiveConfig . bFastDepthCalc  | |  bpmem . alpha_test . TestResult ( )  = =  AlphaTest : : UNDETERMINED ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 09:33:36 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  per_pixel_depth  =  ( bpmem . ztex2 . op  ! =  ZTEXTURE_DISABLE  & &  bpmem . UseLateDepthTest ( ) )  | |  ( ! g_ActiveConfig . bFastDepthCalc  & &  bpmem . zmode . testenable  & &  ! forced_early_z ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-08 01:51:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " //Pixel Shader for TEV stages \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:52:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " //%i TEV stages, %i texgens, %i IND stages \n " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										numStages ,  numTexgen ,  bpmem . genMode . numindstages ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . dstAlphaMode  =  dstAlphaMode ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . genMode_numindstages  =  bpmem . genMode . numindstages ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data . genMode_numtevstages  =  bpmem . genMode . numtevstages ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data . genMode_numtexgens  =  bpmem . genMode . numtexgens ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-27 22:46:29 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-29 19:34:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Fmod implementation gleaned from Nvidia
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// At http://http.developer.nvidia.com/Cg/fmod.html
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " float fmod( float x, float y ) \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " { \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " \t float z = fract( abs( x / y) ) * abs( y ); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:51:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t return (x < 0.0) ? -z : z; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " } \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-11 07:02:13 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Declare samplers
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " uniform sampler2D samp%d; \n " ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-08 01:51:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-08 01:51:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Declare samplers
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:52:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s samp%d : register(s%d); \n " ,  ( ApiType  = =  API_D3D11 )  ?  " sampler "  :  " uniform sampler2D " ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ApiType  = =  API_D3D11 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-08 01:51:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-08 01:51:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " Texture2D Tex%d : register(t%d); \n " ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-08 01:51:08 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-14 14:36:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-27 22:46:29 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . backend_info . bSupportsGLSLUBO ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " layout(std140) uniform PSBlock { \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:52:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_COLORS ,  " float4 " ,  I_COLORS " [4] " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_KCOLORS ,  " float4 " ,  I_KCOLORS " [4] " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_ALPHA ,  " float4 " ,  I_ALPHA " [1] " ) ;   // TODO: Why is this an array...-.-
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_TEXDIMS ,  " float4 " ,  I_TEXDIMS " [8] " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_ZBIAS ,  " float4 " ,  I_ZBIAS " [2] " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_INDTEXSCALE ,  " float4 " ,  I_INDTEXSCALE " [2] " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_INDTEXMTX ,  " float4 " ,  I_INDTEXMTX " [6] " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_FOG ,  " float4 " ,  I_FOG " [3] " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:29:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// For pixel lighting - TODO: Should only be defined when per pixel lighting is enabled!
 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:52:12 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_PLIGHTS ,  " float4 " ,  I_PLIGHTS " [40] " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									DeclareUniform ( out ,  ApiType ,  g_ActiveConfig . backend_info . bSupportsGLSLUBO ,  C_PMATERIALS ,  " float4 " ,  I_PMATERIALS " [4] " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:29:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-27 22:46:29 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . backend_info . bSupportsGLSLUBO ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " }; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 05:22:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:37:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " COLOROUT(ocol0) \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:37:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " COLOROUT(ocol1) \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 11:19:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( per_pixel_depth ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " #define depth gl_FragDepth \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " VARYIN float4 colors_02; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " VARYIN float4 colors_12; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 18:21:35 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-11-30 21:00:21 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// compute window position if needed because binding semantic WPOS is not widely supported
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:29:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Let's set up attributes
 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( xfregs . numTexGen . numTexGens  <  7 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " VARYIN float3 uv%d_2; \n " ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " VARYIN float4 clipPos_2; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " VARYIN float4 Normal_2; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// wpos is in w of first 4 texcoords
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													out . Write ( " VARYIN float4 uv%d_2; \n " ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( unsigned  int  i  =  0 ;  i  <  xfregs . numTexGen . numTexGens ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													out . Write ( " VARYIN float%d uv%d_2; \n " ,  i  <  4  ?  4  :  3  ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " float4 clipPos; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 12:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( forced_early_z ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// HACK: This doesn't force the driver to write to depth buffer if alpha test fails.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// It just allows it, but it seems that all drivers do.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " layout(early_fragment_tests) in; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( bpmem . UseEarlyDepthTest ( )  & &  ( g_ActiveConfig . bFastDepthCalc  | |  bpmem . alpha_test . TestResult ( )  = =  AlphaTest : : UNDETERMINED )  & &  is_writing_shadercode ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											static  bool  warn_once  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( warn_once ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												WARN_LOG ( VIDEO ,  " Early z test enabled but not possible to emulate with current configuration. Make sure to use the D3D11 or OpenGL backend and enable fast depth calculations. If this message still shows up your hardware isn't able to emulate the feature properly (a GPU which supports D3D 11.0 / OGL 4.2 is required). " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											warn_once  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " void main() \n { \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 05:22:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-14 14:36:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-21 05:22:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( forced_early_z ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " [earlydepthstencil] \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( bpmem . UseEarlyDepthTest ( )  & &  ( g_ActiveConfig . bFastDepthCalc  | |  bpmem . alpha_test . TestResult ( )  = =  AlphaTest : : UNDETERMINED )  & &  is_writing_shadercode ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											static  bool  warn_once  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( warn_once ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												WARN_LOG ( VIDEO ,  " Early z test enabled but not possible to emulate with current configuration. Make sure to use the D3D11 or OpenGL backend and enable fast depth calculations. If this message still shows up your hardware isn't able to emulate the feature properly (a GPU which supports D3D 11.0 / OGL 4.2 is required). " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											warn_once  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " void main( \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if ( ApiType  ! =  API_D3D11 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( "   out float4 ocol0 : COLOR0,%s%s \n   in float4 rawpos : %s, \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND  ?  " \n   out float4 ocol1 : COLOR1, "  :  " " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 11:19:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												per_pixel_depth  ?  " \n   out float depth : DEPTH, "  :  " " , 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												ApiType  &  API_D3D9_SM20  ?  " POSITION "  :  " VPOS " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( "   out float4 ocol0 : SV_Target0,%s%s \n   in float4 rawpos : SV_Position, \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND  ?  " \n   out float4 ocol1 : SV_Target1, "  :  " " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 11:19:52 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												per_pixel_depth  ?  " \n   out float depth : SV_Depth, "  :  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-07 20:58:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// "centroid" attribute is only supported by D3D11
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										const  char *  optCentroid  =  ( ApiType  = =  API_D3D11  ?  " centroid "  :  " " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( "   in %s float4 colors_0 : COLOR0, \n " ,  optCentroid ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( "   in %s float4 colors_1 : COLOR1 " ,  optCentroid ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-12-28 14:18:39 -06:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// compute window position if needed because binding semantic WPOS is not widely supported
 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( numTexgen  <  7 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 21:00:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											for  ( unsigned  int  i  =  0 ;  i  <  numTexgen ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " , \n   in %s float3 uv%d : TEXCOORD%d " ,  optCentroid ,  i ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " , \n   in %s float4 clipPos : TEXCOORD%d " ,  optCentroid ,  numTexgen ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if ( g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " , \n   in %s float4 Normal : TEXCOORD%d " ,  optCentroid ,  numTexgen  +  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( "         ) { \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// wpos is in w of first 4 texcoords
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if ( g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													out . Write ( " , \n   in float4 uv%d : TEXCOORD%d " ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( unsigned  int  i  =  0 ;  i  <  xfregs . numTexGen . numTexGens ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													out . Write ( " , \n   in float%d uv%d : TEXCOORD%d " ,  i  <  4  ?  4  :  3  ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-24 20:51:44 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( "         ) { \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " \t float4 clipPos = float4(0.0f, 0.0f, 0.0f, 0.0f); " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-24 19:13:19 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( "   float4 c0 =  "  I_COLORS " [1], c1 =  "  I_COLORS " [2], c2 =  "  I_COLORS " [3], prev = float4(0.0f, 0.0f, 0.0f, 0.0f), textemp = float4(0.0f, 0.0f, 0.0f, 0.0f), rastemp = float4(0.0f, 0.0f, 0.0f, 0.0f), konsttemp = float4(0.0f, 0.0f, 0.0f, 0.0f); \n " 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											"   float3 comp16 = float3(1.0f, 255.0f, 0.0f), comp24 = float3(1.0f, 255.0f, 255.0f*255.0f); \n " 
							 
						 
					
						
							
								
									
										
										
										
											2013-02-22 12:14:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											"   float alphabump=0.0f; \n " 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											"   float3 tevcoord=float3(0.0f, 0.0f, 0.0f); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"   float2 wrappedcoord=float2(0.0f,0.0f), tempcoord=float2(0.0f,0.0f); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"   float4 cc0=float4(0.0f,0.0f,0.0f,0.0f), cc1=float4(0.0f,0.0f,0.0f,0.0f); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"   float4 cc2=float4(0.0f,0.0f,0.0f,0.0f), cprev=float4(0.0f,0.0f,0.0f,0.0f); \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											"   float4 crastemp=float4(0.0f,0.0f,0.0f,0.0f),ckonsttemp=float4(0.0f,0.0f,0.0f,0.0f); \n \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-25 16:13:33 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_OPENGL ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// On Mali, global variables must be initialized as constants.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// This is why we initialize these variables locally instead.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " float4 rawpos = gl_FragCoord; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " float4 colors_0 = colors_02; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " float4 colors_1 = colors_12; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// compute window position if needed because binding semantic WPOS is not widely supported
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// Let's set up attributes
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( xfregs . numTexGen . numTexGens  <  7 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if ( numTexgen ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " float3 uv%d = uv%d_2; \n " ,  i ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " float4 clipPos = clipPos_2; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " float4 Normal = Normal_2; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// wpos is in w of first 4 texcoords
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( int  i  =  0 ;  i  <  8 ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													out . Write ( " float4 uv%d = uv%d_2; \n " ,  i ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												for  ( unsigned  int  i  =  0 ;  i  <  xfregs . numTexGen . numTexGens ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													out . Write ( " float%d uv%d = uv%d_2; \n " ,  i  <  4  ?  4  :  3  ,  i ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( xfregs . numTexGen . numTexGens  <  7 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t float3 _norm0 = normalize(Normal.xyz); \n \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " \t float3 pos = float3(clipPos.x,clipPos.y,Normal.w); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t float3 _norm0 = normalize(float3(uv4.w,uv5.w,uv6.w)); \n \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " \t float3 pos = float3(uv0.w,uv1.w,uv7.w); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float4 mat, lacc; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" \t float3 ldir, h; \n " 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												" \t float dist, dist2, attn; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:29:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_PLIGHTS ,  C_PLIGHTS + 39 ) ;  // TODO: Can be optimized further
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_PMATERIALS ,  C_PMATERIALS + 3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:57:39 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data . components  =  components ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-31 23:29:33 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										GenerateLightingShader < T > ( out ,  uid_data . lighting ,  components ,  I_PMATERIALS ,  I_PLIGHTS ,  " colors_ " ,  " colors_ " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 03:55:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( numTexgen  <  7 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t clipPos = float4(rawpos.x, rawpos.y, clipPos.z, clipPos.w); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-09-23 02:17:48 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 23:24:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t clipPos = float4(rawpos.x, rawpos.y, uv2.w, uv3.w); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// HACK to handle cases where the tex gen is not enabled
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( numTexgen  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float3 uv0 = float3(0.0f, 0.0f, 0.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_TEXDIMS ,  C_TEXDIMS + numTexgen - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										for  ( unsigned  int  i  =  0 ;  i  <  numTexgen ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// optional perspective divides
 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uid_data . texMtxInfo_n_projection  | =  xfregs . texMtxInfo [ i ] . projection  < <  i ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-02-05 18:25:34 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( xfregs . texMtxInfo [ i ] . projection  = =  XF_TEXPROJ_STQ ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-01 04:26:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t if (uv%d.z != 0.0f) " ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . Write ( " \t \t uv%d.xy = uv%d.xy / uv%d.z; \n " ,  i ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-12-01 04:26:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " uv%d.xy = uv%d.xy *  "  I_TEXDIMS " [%d].zw; \n " ,  i ,  i ,  i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// indirect texture map lookup
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-28 22:51:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  nIndirectStagesUsed  =  0 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( bpmem . genMode . numindstages  >  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										for  ( unsigned  int  i  =  0 ;  i  <  numStages ;  + + i ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if  ( bpmem . tevind [ i ] . IsActive ( )  & &  bpmem . tevind [ i ] . bt  <  bpmem . genMode . numindstages ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												nIndirectStagesUsed  | =  1  < <  bpmem . tevind [ i ] . bt ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . nIndirectStagesUsed  =  nIndirectStagesUsed ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( u32  i  =  0 ;  i  <  bpmem . genMode . numindstages ;  + + i ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-28 22:51:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( nIndirectStagesUsed  &  ( 1  < <  i ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:16:02 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											unsigned  int  texcoord  =  bpmem . tevindref . getTexCoord ( i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											unsigned  int  texmap  =  bpmem . tevindref . getTexMap ( i ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											uid_data . SetTevindrefValues ( i ,  texcoord ,  texmap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( texcoord  <  numTexgen ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXSCALE + i / 2 , C_INDTEXSCALE + i / 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t tempcoord = uv%d.xy *  "  I_INDTEXSCALE " [%d].%s; \n " ,  texcoord ,  i / 2 ,  ( i & 1 ) ? " zw " : " xy " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " \t tempcoord = float2(0.0f, 0.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-11 07:05:57 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 23:26:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " float3 indtex%d =  " ,  i ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											SampleTexture < T > ( out ,  " tempcoord " ,  " abg " ,  texmap ,  ApiType ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 11:37:41 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RegisterState  RegisterStates [ 4 ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RegisterStates [ 0 ] . AlphaNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RegisterStates [ 0 ] . ColorNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RegisterStates [ 0 ] . AuxStored  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for ( int  i  =  1 ;  i  <  4 ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RegisterStates [ i ] . AlphaNeedOverflowControl  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RegisterStates [ i ] . ColorNeedOverflowControl  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RegisterStates [ i ] . AuxStored  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 14:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Uid fields for BuildSwapModeTable are set in WriteStage
 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									char  swapModeTable [ 4 ] [ 5 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									const  char *  swapColors  =  " rgba " ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									for  ( int  i  =  0 ;  i  <  4 ;  i + + ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 0 ]  =  swapColors [ bpmem . tevksel [ i * 2 ] . swap1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 1 ]  =  swapColors [ bpmem . tevksel [ i * 2 ] . swap2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 2 ]  =  swapColors [ bpmem . tevksel [ i * 2 + 1 ] . swap1 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 3 ]  =  swapColors [ bpmem . tevksel [ i * 2 + 1 ] . swap2 ] ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										swapModeTable [ i ] [ 4 ]  =  ' \0 ' ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									for  ( unsigned  int  i  =  0 ;  i  <  numStages ;  i + + ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteStage < T > ( out ,  uid_data ,  i ,  ApiType ,  RegisterStates ,  swapModeTable ) ;  // build the equation for this stage
 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-29 14:40:37 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 21:24:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# define MY_STRUCT_OFFSET(str,elem) ((u32)((u64)&(str).elem-(u64)&(str))) 
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  enable_pl  =  g_ActiveConfig . bEnablePixelLighting  & &  g_ActiveConfig . backend_info . bSupportsPixelLighting ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-02 14:32:52 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . num_values  =  ( enable_pl )  ?  sizeof ( uid_data )  :  MY_STRUCT_OFFSET ( uid_data , stagehash [ numStages ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 21:24:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( numStages ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 19:55:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// The results of the last texenv stage are put onto the screen,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// regardless of the used destination register
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( bpmem . combiners [ numStages  -  1 ] . colorC . dest  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  retrieveFromAuxRegister  =  ! RegisterStates [ bpmem . combiners [ numStages  -  1 ] . colorC . dest ] . ColorNeedOverflowControl  & &  RegisterStates [ bpmem . combiners [ numStages  -  1 ] . colorC . dest ] . AuxStored ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t prev.rgb = %s%s; \n " ,  retrieveFromAuxRegister  ?  " c "  :  " "  ,  tevCOutputTable [ bpmem . combiners [ numStages  -  1 ] . colorC . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RegisterStates [ 0 ] . ColorNeedOverflowControl  =  RegisterStates [ bpmem . combiners [ numStages  -  1 ] . colorC . dest ] . ColorNeedOverflowControl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if ( bpmem . combiners [ numStages  -  1 ] . alphaC . dest  ! =  0 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											bool  retrieveFromAuxRegister  =  ! RegisterStates [ bpmem . combiners [ numStages  -  1 ] . alphaC . dest ] . AlphaNeedOverflowControl  & &  RegisterStates [ bpmem . combiners [ numStages  -  1 ] . alphaC . dest ] . AuxStored ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t prev.a = %s%s; \n " ,  retrieveFromAuxRegister  ?  " c "  :  " "  ,  tevAOutputTable [ bpmem . combiners [ numStages  -  1 ] . alphaC . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RegisterStates [ 0 ] . AlphaNeedOverflowControl  =  RegisterStates [ bpmem . combiners [ numStages  -  1 ] . alphaC . dest ] . AlphaNeedOverflowControl ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 19:55:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// emulation of unsigned 8 overflow when casting if needed
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if ( RegisterStates [ 0 ] . AlphaNeedOverflowControl  | |  RegisterStates [ 0 ] . ColorNeedOverflowControl ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t prev = frac(prev * (255.0f/256.0f)) * (256.0f/255.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 17:18:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									AlphaTest : : TEST_RESULT  Pretest  =  bpmem . alpha_test . TestResult ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . Pretest  =  Pretest ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-19 21:27:54 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// NOTE: Fragment may not be discarded if alpha test always fails and early depth test is enabled 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// (in this case we need to write a depth value if depth test passes regardless of the alpha testing result)
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( Pretest  = =  AlphaTest : : UNDETERMINED  | |  ( Pretest  = =  AlphaTest : : FAIL  & &  bpmem . UseLateDepthTest ( ) ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteAlphaTest < T > ( out ,  uid_data ,  ApiType ,  dstAlphaMode ,  per_pixel_depth ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:37:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// D3D9 doesn't support readback of depth in pixel shader, so we always have to calculate it again.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// This shouldn't be a performance issue as the written depth is usually still from perspective division
 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-10 12:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// but this isn't true for z-textures, so there will be depth issues between enabled and disabled z-textures fragments
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ( ApiType  = =  API_OPENGL  | |  ApiType  = =  API_D3D11 )  & &  g_ActiveConfig . bFastDepthCalc ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " float zCoord = rawpos.z; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-04 20:12:58 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ZBIAS + 1 ,  C_ZBIAS + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-09 17:48:48 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// the screen space depth value = far z + (clip z / clip w) * z range
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " float zCoord =  "  I_ZBIAS " [1].x + (clipPos.z / clipPos.w) *  "  I_ZBIAS " [1].y; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 00:52:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// depth texture can safely be ignored if the result won't be written to the depth buffer (early_ztest) and isn't used for fog either
 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:51:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									const  bool  skip_ztexture  =  ! per_pixel_depth  & &  ! bpmem . fog . c_proj_fsel . fsel ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-29 19:37:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . ztex_op  =  bpmem . ztex2 . op ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . per_pixel_depth  =  per_pixel_depth ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 12:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . forced_early_z  =  forced_early_z ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:51:57 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . fast_depth_calc  =  g_ActiveConfig . bFastDepthCalc ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . early_ztest  =  bpmem . UseEarlyDepthTest ( ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . fog_fsel  =  bpmem . fog . c_proj_fsel . fsel ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 00:52:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-10 12:51:06 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Note: z-textures are not written to depth buffer if early depth test is used
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( per_pixel_depth  & &  bpmem . UseEarlyDepthTest ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " depth = zCoord; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-29 23:14:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Note: depth texture output is only written to depth buffer if late depth test is used
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// theoretical final depth value is used for fog calculation, though, so we have to emulate ztextures anyway
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 00:52:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . ztex2 . op  ! =  ZTEXTURE_DISABLE  & &  ! skip_ztexture ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// use the texture input of the last texture stage (textemp), hopefully this has been read and is in correct format...
 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ZBIAS ,  C_ZBIAS + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " zCoord = dot( "  I_ZBIAS " [0].xyzw, textemp.xyzw) +  "  I_ZBIAS " [1].w %s; \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:40:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
																	( bpmem . ztex2 . op  = =  ZTEXTURE_ADD )  ?  " + zCoord "  :  " " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-12 15:49:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 14:51:54 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// U24 overflow emulation
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " zCoord = zCoord * (16777215.0f/16777216.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " zCoord = frac(zCoord); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " zCoord = zCoord * (16777216.0f/16777215.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-29 23:14:08 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( per_pixel_depth  & &  bpmem . UseLateDepthTest ( ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " depth = zCoord; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-20 03:11:22 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dstAlphaMode  = =  DSTALPHA_ALPHA_PASS ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ALPHA ,  C_ALPHA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ocol0 = float4(prev.rgb,  "  I_ALPHA " [0].a); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										WriteFog < T > ( out ,  uid_data ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ocol0 = prev; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Use dual-source color blending to perform dst alpha in a single pass
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_ALPHA ,  C_ALPHA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-28 20:08:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( ApiType  &  API_D3D9 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 00:41:36 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// alpha component must be 0 or the shader will not compile (Direct3D 9Ex restriction)
 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// Colors will be blended against the color from ocol1 in D3D 9...
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . Write ( " \t ocol1 = float4(prev.a, prev.a, prev.a, 0.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-28 20:08:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											// Colors will be blended against the alpha from ocol1...
 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t ocol1 = prev; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-28 20:08:51 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// ...and the alpha from ocol0 will be written to the framebuffer.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t ocol0.a =  "  I_ALPHA " [0].a; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-03-25 00:01:47 -03:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-25 14:01:07 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " } \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 21:53:57 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( is_writing_shadercode ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( text [ sizeof ( text )  -  1 ]  ! =  0x7C ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											PanicAlert ( " PixelShader generator - buffer too small, canary has been eaten! " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-16 14:34:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# ifndef ANDROID 
  
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uselocale ( old_locale ) ;  // restore locale
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										freelocale ( locale ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-16 14:34:23 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								# endif 
  
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-10-29 03:28:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//table with the color compare operations
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * TEVCMPColorOPTable [ 16 ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //1
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //3
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //4
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //5
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //6
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" float3(0.0f, 0.0f, 0.0f) " , //7
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + ((%s.r >= %s.r + (0.25f/255.0f)) ? %s : float3(0.0f, 0.0f, 0.0f)) " , //#define TEVCMP_R8_GT 8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + ((abs(%s.r - %s.r) < (0.5f/255.0f)) ? %s : float3(0.0f, 0.0f, 0.0f)) " , //#define TEVCMP_R8_EQ 9
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + (( dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25f/255.0f))) ? %s : float3(0.0f, 0.0f, 0.0f)) " , //#define TEVCMP_GR16_GT 10
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5f/255.0f) ? %s : float3(0.0f, 0.0f, 0.0f)) " , //#define TEVCMP_GR16_EQ 11
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + (( dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25f/255.0f))) ? %s : float3(0.0f, 0.0f, 0.0f)) " , //#define TEVCMP_BGR24_GT 12
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5f/255.0f) ? %s : float3(0.0f, 0.0f, 0.0f)) " , //#define TEVCMP_BGR24_EQ 13
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + (max(sign(%s.rgb - %s.rgb - (0.25f/255.0f)), float3(0.0f, 0.0f, 0.0f)) * %s) " , //#define TEVCMP_RGB8_GT  14
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s + ((float3(1.0f, 1.0f, 1.0f) - max(sign(abs(%s.rgb - %s.rgb) - (0.5f/255.0f)), float3(0.0f, 0.0f, 0.0f))) * %s) " //#define TEVCMP_RGB8_EQ  15
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-29 03:28:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								//table with the alpha compare operations
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * TEVCMPAlphaOPTable [ 16 ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //0
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //1
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //3
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //4
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //5
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //6
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" 0.0f " , //7
 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-27 03:05:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"    %s.a + ((%s.r >= (%s.r + (0.25f/255.0f))) ? %s.a : 0.0f) " , //#define TEVCMP_R8_GT 8
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s.a + (abs(%s.r - %s.r) < (0.5f/255.0f) ? %s.a : 0.0f) " , //#define TEVCMP_R8_EQ 9
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s.a + ((dot(%s.rgb, comp16) >= (dot(%s.rgb, comp16) + (0.25f/255.0f))) ? %s.a : 0.0f) " , //#define TEVCMP_GR16_GT 10
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s.a + (abs(dot(%s.rgb, comp16) - dot(%s.rgb, comp16)) < (0.5f/255.0f) ? %s.a : 0.0f) " , //#define TEVCMP_GR16_EQ 11
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s.a + ((dot(%s.rgb, comp24) >= (dot(%s.rgb, comp24) + (0.25f/255.0f))) ? %s.a : 0.0f) " , //#define TEVCMP_BGR24_GT 12
 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"    %s.a + (abs(dot(%s.rgb, comp24) - dot(%s.rgb, comp24)) < (0.5f/255.0f) ? %s.a : 0.0f) " , //#define TEVCMP_BGR24_EQ 13
 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-27 03:05:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"    %s.a + ((%s.a >= (%s.a + (0.25f/255.0f))) ? %s.a : 0.0f) " , //#define TEVCMP_A8_GT 14
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"    %s.a + (abs(%s.a - %s.a) < (0.5f/255.0f) ? %s.a : 0.0f) " //#define TEVCMP_A8_EQ 15
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-29 03:28:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  WriteStage ( T &  out ,  pixel_shader_uid_data &  uid_data ,  int  n ,  API_TYPE  ApiType ,  RegisterState  RegisterStates [ 4 ] ,  const  char  swapModeTable [ 4 ] [ 5 ] )  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  texcoord  =  bpmem . tevorders [ n / 2 ] . getTexCoord ( n & 1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  bHasTexCoord  =  ( u32 ) texcoord  <  bpmem . genMode . numtexgens ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									bool  bHasIndStage  =  bpmem . tevind [ n ] . IsActive ( )  & &  bpmem . tevind [ n ] . bt  <  bpmem . genMode . numindstages ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// HACK to handle cases where the tex gen is not enabled
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ! bHasTexCoord ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										texcoord  =  0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-03-05 05:10:25 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " // TEV stage %d \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . stagehash [ n ] . hasindstage  =  bHasIndStage ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data . stagehash [ n ] . tevorders_texcoord  =  texcoord ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bHasIndStage ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevind  =  bpmem . tevind [ n ] . hex  &  0x7FFFFF ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " // indirect op \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// perform the indirect op on the incoming regular coordinates using indtex%d as the offset coords
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . bs  ! =  ITBA_OFF ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " alphabump = indtex%d.%s %s; \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													bpmem . tevind [ n ] . bt , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
													tevIndAlphaSel [ bpmem . tevind [ n ] . bs ] , 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
													tevIndAlphaScale [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// format
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " float3 indtevcrd%d = indtex%d * %s; \n " ,  n ,  bpmem . tevind [ n ] . bt ,  tevIndFmtScale [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-04-15 03:55:38 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// bias
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . bias  ! =  ITB_NONE  ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " indtevcrd%d.%s += %s; \n " ,  n ,  tevIndBiasField [ bpmem . tevind [ n ] . bias ] ,  tevIndBiasAdd [ bpmem . tevind [ n ] . fmt ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// multiply by offset matrix and scale
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . mid  ! =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											if  ( bpmem . tevind [ n ] . mid  < =  3 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  mtxidx  =  2 * ( bpmem . tevind [ n ] . mid - 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXMTX + mtxidx ,  C_INDTEXMTX + mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " float2 indtevtrans%d = float2(dot( "  I_INDTEXMTX " [%d].xyz, indtevcrd%d), dot( "  I_INDTEXMTX " [%d].xyz, indtevcrd%d)); \n " , 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
															n ,  mtxidx ,  n ,  mtxidx + 1 ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else  if  ( bpmem . tevind [ n ] . mid  < =  7  & &  bHasTexCoord ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{  // s matrix
 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_assert_ ( bpmem . tevind [ n ] . mid  > =  5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  mtxidx  =  2 * ( bpmem . tevind [ n ] . mid - 5 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXMTX + mtxidx ,  C_INDTEXMTX + mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " float2 indtevtrans%d =  "  I_INDTEXMTX " [%d].ww * uv%d.xy * indtevcrd%d.xx; \n " ,  n ,  mtxidx ,  texcoord ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-09 14:13:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else  if  ( bpmem . tevind [ n ] . mid  < =  11  & &  bHasTexCoord ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{  // t matrix
 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 23:32:05 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												_assert_ ( bpmem . tevind [ n ] . mid  > =  9 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												int  mtxidx  =  2 * ( bpmem . tevind [ n ] . mid - 9 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . SetConstantsUsed ( C_INDTEXMTX + mtxidx ,  C_INDTEXMTX + mtxidx ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " float2 indtevtrans%d =  "  I_INDTEXMTX " [%d].ww * uv%d.xy * indtevcrd%d.yy; \n " ,  n ,  mtxidx ,  texcoord ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " float2 indtevtrans%d = float2(0.0f, 0.0f); \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " float2 indtevtrans%d = float2(0.0f, 0.0f); \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// ---------
 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// Wrapping
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// ---------
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// wrap S
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . sw  = =  ITW_OFF ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " wrappedcoord.x = uv%d.x; \n " ,  texcoord ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( bpmem . tevind [ n ] . sw  = =  ITW_0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " wrappedcoord.x = 0.0f; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " wrappedcoord.x = fmod( uv%d.x, %s ); \n " ,  texcoord ,  tevIndWrapStart [ bpmem . tevind [ n ] . sw ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										// wrap T
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . tw  = =  ITW_OFF ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " wrappedcoord.y = uv%d.y; \n " ,  texcoord ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( bpmem . tevind [ n ] . tw  = =  ITW_0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " wrappedcoord.y = 0.0f; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " wrappedcoord.y = fmod( uv%d.y, %s ); \n " ,  texcoord ,  tevIndWrapStart [ bpmem . tevind [ n ] . tw ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( bpmem . tevind [ n ] . fb_addprev )  // add previous tevcoord
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " tevcoord.xy += wrappedcoord + indtevtrans%d; \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " tevcoord.xy = wrappedcoord + indtevtrans%d; \n " ,  n ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									TevStageCombiner : : ColorCombiner  & cc  =  bpmem . combiners [ n ] . colorC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									TevStageCombiner : : AlphaCombiner  & ac  =  bpmem . combiners [ n ] . alphaC ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . stagehash [ n ] . cc  =  cc . hex  &  0xFFFFFF ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									uid_data . stagehash [ n ] . ac  =  ac . hex  &  0xFFFFF0 ;  // Storing rswap and tswap later
 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 18:30:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if ( cc . a  = =  TEVCOLORARG_RASA  | |  cc . a  = =  TEVCOLORARG_RASC 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  cc . b  = =  TEVCOLORARG_RASA  | |  cc . b  = =  TEVCOLORARG_RASC 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  cc . c  = =  TEVCOLORARG_RASA  | |  cc . c  = =  TEVCOLORARG_RASC 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  cc . d  = =  TEVCOLORARG_RASA  | |  cc . d  = =  TEVCOLORARG_RASC 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  ac . a  = =  TEVALPHAARG_RASA  | |  ac . b  = =  TEVALPHAARG_RASA 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  ac . c  = =  TEVALPHAARG_RASA  | |  ac . d  = =  TEVALPHAARG_RASA ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  int  i  =  bpmem . combiners [ n ] . alphaC . rswap ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . ac  | =  bpmem . combiners [ n ] . alphaC . rswap ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap1a  =  bpmem . tevksel [ i * 2 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap2a  =  bpmem . tevksel [ i * 2 ] . swap2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap1b  =  bpmem . tevksel [ i * 2 + 1 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap2b  =  bpmem . tevksel [ i * 2 + 1 ] . swap2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevorders_colorchan  =  bpmem . tevorders [ n  /  2 ] . getColorChan ( n  &  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * rasswap  =  swapModeTable [ bpmem . combiners [ n ] . alphaC . rswap ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " rastemp = %s.%s; \n " ,  tevRasTable [ bpmem . tevorders [ n  /  2 ] . getColorChan ( n  &  1 ) ] ,  rasswap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " crastemp = frac(rastemp * (255.0f/256.0f)) * (256.0f/255.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . stagehash [ n ] . tevorders_enable  =  bpmem . tevorders [ n  /  2 ] . getEnable ( n  &  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . tevorders [ n / 2 ] . getEnable ( n & 1 ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ! bHasIndStage ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											// calc tevcord
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											if ( bHasTexCoord ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " tevcoord.xy = uv%d.xy; \n " ,  texcoord ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											else 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												out . Write ( " tevcoord.xy = float2(0.0f, 0.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  int  i  =  bpmem . combiners [ n ] . alphaC . tswap ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . ac  | =  bpmem . combiners [ n ] . alphaC . tswap  < <  2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap1c  =  bpmem . tevksel [ i * 2 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap2c  =  bpmem . tevksel [ i * 2 ] . swap2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap1d  =  bpmem . tevksel [ i * 2 + 1 ] . swap1 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_swap2d  =  bpmem . tevksel [ i * 2 + 1 ] . swap2 ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevorders_texmap =  bpmem . tevorders [ n / 2 ] . getTexMap ( n & 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-09-04 21:56:03 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										const  char  * texswap  =  swapModeTable [ bpmem . combiners [ n ] . alphaC . tswap ] ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  texmap  =  bpmem . tevorders [ n / 2 ] . getTexMap ( n & 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data . SetTevindrefTexmap ( i ,  texmap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 23:26:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " textemp =  " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										SampleTexture < T > ( out ,  " tevcoord " ,  texswap ,  texmap ,  ApiType ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " textemp = float4(1.0f, 1.0f, 1.0f, 1.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . a  = =  TEVCOLORARG_KONST  | |  cc . b  = =  TEVCOLORARG_KONST  | |  cc . c  = =  TEVCOLORARG_KONST  | |  cc . d  = =  TEVCOLORARG_KONST 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  ac . a  = =  TEVALPHAARG_KONST  | |  ac . b  = =  TEVALPHAARG_KONST  | |  ac . c  = =  TEVALPHAARG_KONST  | |  ac . d  = =  TEVALPHAARG_KONST ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  kc  =  bpmem . tevksel [ n  /  2 ] . getKC ( n  &  1 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  ka  =  bpmem . tevksel [ n  /  2 ] . getKA ( n  &  1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-22 20:41:32 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_kc  =  kc ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										uid_data . stagehash [ n ] . tevksel_ka  =  ka ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " konsttemp = float4(%s, %s); \n " ,  tevKSelTableC [ kc ] ,  tevKSelTableA [ ka ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-10 14:35:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( kc  >  7  | |  ka  >  7 ) 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " ckonsttemp = frac(konsttemp * (255.0f/256.0f)) * (256.0f/255.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " ckonsttemp = konsttemp; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( kc  >  7 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . SetConstantsUsed ( C_KCOLORS + ( ( kc - 0xc ) % 4 ) , C_KCOLORS + ( ( kc - 0xc ) % 4 ) ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if  ( ka  >  7 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											out . SetConstantsUsed ( C_KCOLORS + ( ( ka - 0xc ) % 4 ) , C_KCOLORS + ( ( ka - 0xc ) % 4 ) ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-08-16 22:37:04 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if ( cc . a  = =  TEVCOLORARG_CPREV  | |  cc . a  = =  TEVCOLORARG_APREV 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  cc . b  = =  TEVCOLORARG_CPREV  | |  cc . b  = =  TEVCOLORARG_APREV 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  cc . c  = =  TEVCOLORARG_CPREV  | |  cc . c  = =  TEVCOLORARG_APREV 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										| |  ac . a  = =  TEVALPHAARG_APREV  | |  ac . b  = =  TEVALPHAARG_APREV  | |  ac . c  = =  TEVALPHAARG_APREV ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										if ( RegisterStates [ 0 ] . AlphaNeedOverflowControl  | |  RegisterStates [ 0 ] . ColorNeedOverflowControl ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cprev = frac(prev * (255.0f/256.0f)) * (256.0f/255.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RegisterStates [ 0 ] . AlphaNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											RegisterStates [ 0 ] . ColorNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cprev = prev; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RegisterStates [ 0 ] . AuxStored  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if ( cc . a  = =  TEVCOLORARG_C0  | |  cc . a  = =  TEVCOLORARG_A0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  cc . b  = =  TEVCOLORARG_C0  | |  cc . b  = =  TEVCOLORARG_A0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  cc . c  = =  TEVCOLORARG_C0  | |  cc . c  = =  TEVCOLORARG_A0 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  ac . a  = =  TEVALPHAARG_A0  | |  ac . b  = =  TEVALPHAARG_A0  | |  ac . c  = =  TEVALPHAARG_A0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 1 , C_COLORS + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( RegisterStates [ 1 ] . AlphaNeedOverflowControl  | |  RegisterStates [ 1 ] . ColorNeedOverflowControl ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cc0 = frac(c0 * (255.0f/256.0f)) * (256.0f/255.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RegisterStates [ 1 ] . AlphaNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											RegisterStates [ 1 ] . ColorNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cc0 = c0; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RegisterStates [ 1 ] . AuxStored  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if ( cc . a  = =  TEVCOLORARG_C1  | |  cc . a  = =  TEVCOLORARG_A1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  cc . b  = =  TEVCOLORARG_C1  | |  cc . b  = =  TEVCOLORARG_A1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  cc . c  = =  TEVCOLORARG_C1  | |  cc . c  = =  TEVCOLORARG_A1 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  ac . a  = =  TEVALPHAARG_A1  | |  ac . b  = =  TEVALPHAARG_A1  | |  ac . c  = =  TEVALPHAARG_A1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 2 , C_COLORS + 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( RegisterStates [ 2 ] . AlphaNeedOverflowControl  | |  RegisterStates [ 2 ] . ColorNeedOverflowControl ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cc1 = frac(c1 * (255.0f/256.0f)) * (256.0f/255.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RegisterStates [ 2 ] . AlphaNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											RegisterStates [ 2 ] . ColorNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cc1 = c1; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RegisterStates [ 2 ] . AuxStored  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if ( cc . a  = =  TEVCOLORARG_C2  | |  cc . a  = =  TEVCOLORARG_A2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  cc . b  = =  TEVCOLORARG_C2  | |  cc . b  = =  TEVCOLORARG_A2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  cc . c  = =  TEVCOLORARG_C2  | |  cc . c  = =  TEVCOLORARG_A2 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									| |  ac . a  = =  TEVALPHAARG_A2  | |  ac . b  = =  TEVALPHAARG_A2  | |  ac . c  = =  TEVALPHAARG_A2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 3 , C_COLORS + 3 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( RegisterStates [ 3 ] . AlphaNeedOverflowControl  | |  RegisterStates [ 3 ] . ColorNeedOverflowControl ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cc2 = frac(c2 * (255.0f/256.0f)) * (256.0f/255.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											RegisterStates [ 3 ] . AlphaNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											RegisterStates [ 3 ] . ColorNeedOverflowControl  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " cc2 = c2; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										RegisterStates [ 3 ] . AuxStored  =  true ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-27 21:43:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RegisterStates [ cc . dest ] . ColorNeedOverflowControl  =  ( cc . clamp  = =  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RegisterStates [ cc . dest ] . AuxStored  =  false ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . d  = =  TEVCOLORARG_C0  | |  cc . d  = =  TEVCOLORARG_A0  | |  ac . d  = =  TEVALPHAARG_A0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 1 , C_COLORS + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . d  = =  TEVCOLORARG_C1  | |  cc . d  = =  TEVCOLORARG_A1  | |  ac . d  = =  TEVALPHAARG_A1 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 2 , C_COLORS + 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . d  = =  TEVCOLORARG_C2  | |  cc . d  = =  TEVCOLORARG_A2  | |  ac . d  = =  TEVALPHAARG_A2 ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + 3 , C_COLORS + 3 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . dest  > =  GX_TEVREG0  & &  cc . dest  < =  GX_TEVREG2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + cc . dest ,  C_COLORS + cc . dest ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  ( ac . dest  > =  GX_TEVREG0  & &  ac . dest  < =  GX_TEVREG2 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_COLORS + ac . dest ,  C_COLORS + ac . dest ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " // color combine \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . clamp ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s = clamp( " ,  tevCOutputTable [ cc . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-31 04:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s =  " ,  tevCOutputTable [ cc . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// combine the color channel
 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . bias  ! =  TevBias_COMPARE )  // if not compare
 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//normal color combiner goes here
 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cc . shift  >  TEVSCALE_1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s*( " ,  tevScaleTable [ cc . shift ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( ! ( cc . d  = =  TEVCOLORARG_ZERO  & &  cc . op  = =  TEVOP_ADD ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s%s " ,  tevCInputTable [ cc . d ] ,  tevOpTable [ cc . op ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-31 04:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 22:46:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cc . a  = =  cc . b ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s " ,  tevCInputTable [ cc . a  +  16 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 22:46:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( cc . c  = =  TEVCOLORARG_ZERO ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s " ,  tevCInputTable [ cc . a  +  16 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 22:46:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( cc . c  = =  TEVCOLORARG_ONE ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s " ,  tevCInputTable [ cc . b  +  16 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 20:40:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( cc . a  = =  TEVCOLORARG_ZERO ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s*%s " ,  tevCInputTable [ cc . b  +  16 ] ,  tevCInputTable [ cc . c  +  16 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 20:40:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( cc . b  = =  TEVCOLORARG_ZERO ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s*(float3(1.0f, 1.0f, 1.0f)-%s) " ,  tevCInputTable [ cc . a  +  16 ] ,  tevCInputTable [ cc . c  +  16 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-31 04:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " lerp(%s, %s, %s) " ,  tevCInputTable [ cc . a  +  16 ] ,  tevCInputTable [ cc . b  +  16 ] ,  tevCInputTable [ cc . c  +  16 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s " ,  tevBiasTable [ cc . bias ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( cc . shift  >  TEVSCALE_1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " ) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										int  cmp  =  ( cc . shift < < 1 ) | cc . op | 8 ;  // comparemode stored here
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( TEVCMPColorOPTable [ cmp ] , //lookup the function from the op table
 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tevCInputTable [ cc . d ] , 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-27 21:43:07 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tevCInputTable [ cc . a  +  16 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tevCInputTable [ cc . b  +  16 ] , 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tevCInputTable [ cc . c  +  16 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( cc . clamp ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " , 0.0f, 1.0f) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " ; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-11 16:54:46 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									RegisterStates [ ac . dest ] . AlphaNeedOverflowControl  =  ( ac . clamp  = =  0 ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									RegisterStates [ ac . dest ] . AuxStored  =  false ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " // alpha combine \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ac . clamp ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-17 12:05:47 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s = clamp( " ,  tevAOutputTable [ ac . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-31 04:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s =  " ,  tevAOutputTable [ ac . dest ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ac . bias  ! =  TevBias_COMPARE )  // if not compare
 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//normal alpha combiner goes here
 
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ac . shift  >  TEVSCALE_1 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s*( " ,  tevScaleTable [ ac . shift ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-06-05 00:01:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if ( ! ( ac . d  = =  TEVALPHAARG_ZERO  & &  ac . op  = =  TEVOP_ADD ) ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s.a%s " ,  tevAInputTable [ ac . d ] ,  tevOpTable [ ac . op ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-31 04:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 22:46:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ac . a  = =  ac . b ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s.a " ,  tevAInputTable [ ac . a  +  8 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-23 22:46:13 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( ac . c  = =  TEVALPHAARG_ZERO ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s.a " ,  tevAInputTable [ ac . a  +  8 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 20:40:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( ac . a  = =  TEVALPHAARG_ZERO ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s.a*%s.a " ,  tevAInputTable [ ac . b  +  8 ] ,  tevAInputTable [ ac . c  +  8 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-22 20:40:43 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else  if  ( ac . b  = =  TEVALPHAARG_ZERO ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " %s.a*(1.0f-%s.a) " ,  tevAInputTable [ ac . a  +  8 ] ,  tevAInputTable [ ac . c  +  8 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-08-31 04:23:30 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										else 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " lerp(%s.a, %s.a, %s.a) " ,  tevAInputTable [ ac . a  +  8 ] ,  tevAInputTable [ ac . b  +  8 ] ,  tevAInputTable [ ac . c  +  8 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s " , tevBiasTable [ ac . bias ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ac . shift > 0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " ) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-05-17 22:17:46 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										//compare alpha combiner goes here
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										int  cmp  =  ( ac . shift < < 1 ) | ac . op | 8 ;  // comparemode stored here
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( TEVCMPAlphaOPTable [ cmp ] , 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tevAInputTable [ ac . d ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tevAInputTable [ ac . a  +  8 ] , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
												tevAInputTable [ ac . b  +  8 ] , 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
												tevAInputTable [ ac . c  +  8 ] ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2010-01-12 03:39:14 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ac . clamp ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " , 0.0f, 1.0f) " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " ; \n \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . Write ( " // TEV done \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2013-07-29 23:26:18 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  SampleTexture ( T &  out ,  const  char  * texcoords ,  const  char  * texswap ,  int  texmap ,  API_TYPE  ApiType )  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_TEXDIMS + texmap , C_TEXDIMS + texmap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-08-29 19:34:54 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ApiType  = =  API_D3D11 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 20:52:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " Tex%d.Sample(samp%d,%s.xy *  "  I_TEXDIMS " [%d].xy).%s; \n " ,  texmap , texmap ,  texcoords ,  texmap ,  texswap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-29 20:52:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s(samp%d,%s.xy *  "  I_TEXDIMS " [%d].xy).%s; \n " ,  ApiType  = =  API_OPENGL  ?  " texture "  :  " tex2D " ,  texmap ,  texcoords ,  texmap ,  texswap ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevAlphaFuncsTable [ ]  =  
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-29 20:59:03 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" (false) " , 									// NEVER
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a <= %s - (0.25f/255.0f)) " , 			// LESS
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (abs( prev.a - %s ) < (0.5f/255.0f)) " , 		// EQUAL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a < %s + (0.25f/255.0f)) " , 			// LEQUAL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a >= %s + (0.25f/255.0f)) " , 			// GREATER
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (abs( prev.a - %s ) >= (0.5f/255.0f)) " , 	// NEQUAL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (prev.a > %s - (0.25f/255.0f)) " , 			// GEQUAL
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" (true) " 									// ALWAYS
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								static  const  char  * tevAlphaFunclogicTable [ ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"  &&  " ,  // and
 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"  ||  " ,  // or
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"  !=  " ,  // xor
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									"  ==  "   // xnor
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:40:15 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2013-08-12 12:52:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  WriteAlphaTest ( T &  out ,  pixel_shader_uid_data &  uid_data ,  API_TYPE  ApiType ,  DSTALPHA_MODE  dstAlphaMode ,  bool  per_pixel_depth )  
						 
					
						
							
								
									
										
										
										
											2010-10-10 14:35:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2011-09-29 21:52:13 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									static  const  char  * alphaRef [ 2 ]  = 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										I_ALPHA " [0].r " , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										I_ALPHA " [0].g " 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_ALPHA ,  C_ALPHA ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-10-10 14:35:31 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-06-14 03:09:44 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// using discard then return works the same in cg and dx9 but not in dx11
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t if(!(  " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . alpha_test_comp0  =  bpmem . alpha_test . comp0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-23 02:13:40 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . alpha_test_comp1  =  bpmem . alpha_test . comp1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . alpha_test_logic  =  bpmem . alpha_test . logic ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// Lookup the first component from the alpha function table
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 17:18:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									int  compindex  =  bpmem . alpha_test . comp0 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( tevAlphaFuncsTable [ compindex ] ,  alphaRef [ 0 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " %s " ,  tevAlphaFunclogicTable [ bpmem . alpha_test . logic ] ) ; //lookup the logic op
 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Lookup the second component from the alpha function table
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 17:18:45 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									compindex  =  bpmem . alpha_test . comp1 ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 14:36:56 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( tevAlphaFuncsTable [ compindex ] ,  alphaRef [ 1 ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " )) { \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-04 04:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t \t ocol0 = float4(0.0f, 0.0f, 0.0f, 0.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( dstAlphaMode  = =  DSTALPHA_DUAL_SOURCE_BLEND ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t \t ocol1 = float4(0.0f, 0.0f, 0.0f, 0.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-15 00:52:50 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if ( per_pixel_depth ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t \t depth = 1.f; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:51:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// HAXX: zcomploc (aka early_ztest) is a way to control whether depth test is done before
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 12:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// or after texturing and alpha test. PC graphics APIs have no way to support this
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// feature properly as of 2012: Depth buffer and depth test are not
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:51:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// programmable and the depth test is always done after texturing.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 12:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// Most importantly, they do not allow writing to the z-buffer without
 
							 
						 
					
						
							
								
									
										
										
										
											2013-01-08 16:51:01 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// writing a color value (unless color writing is disabled altogether).
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 12:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// We implement "depth test before texturing" by disabling alpha test when early-z is in use.
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// It seems to be less buggy than not to update the depth buffer if alpha test fails,
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// but both ways wouldn't be accurate.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 12:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// OpenGL 4.2 has a flag which allows the driver to still update the depth buffer 
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// if alpha test fails. The driver doesn't have to, but I assume they all do because
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// it's the much faster code path for the GPU.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 14:38:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . alpha_test_use_zcomploc_hack  =  bpmem . UseEarlyDepthTest ( )  & &  bpmem . zmode . updateenable  & &  ! g_ActiveConfig . backend_info . bSupportsEarlyZ ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-07-22 12:02:16 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( ! uid_data . alpha_test_use_zcomploc_hack ) 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t \t discard; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( ApiType  ! =  API_D3D11 ) 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											out . Write ( " \t \t return; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-10 18:57:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-09-04 04:44:50 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " } \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2008-12-08 05:30:24 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  const  char  * tevFogFuncsTable [ ]  =  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-04-24 09:21:54 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									" " , 																// No Fog
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" " , 																// ?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" " , 																// Linear
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" " , 																// ?
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = 1.0f - pow(2.0f, -8.0f * fog); \n " , 						// exp
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = 1.0f - pow(2.0f, -8.0f * fog * fog); \n " , 				// exp2
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = pow(2.0f, -8.0f * (1.0f - fog)); \n " , 					// backward exp
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									" \t fog = 1.0f - fog; \n    fog = pow(2.0f, -8.0f * fog * fog); \n " 	// backward exp2
 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								} ;  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								template < class  T >  
						 
					
						
							
								
									
										
										
										
											2013-08-12 12:52:28 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								static  inline  void  WriteFog ( T &  out ,  pixel_shader_uid_data &  uid_data )  
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . fog_fsel  =  bpmem . fog . c_proj_fsel . fsel ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if ( bpmem . fog . c_proj_fsel . fsel  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										return ;  // no Fog
 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . fog_proj  =  bpmem . fog . c_proj_fsel . proj ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 18:30:21 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . SetConstantsUsed ( C_FOG ,  C_FOG + 1 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . fog . c_proj_fsel . proj  = =  0 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-07-26 09:52:35 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// perspective
 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-23 13:57:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// ze = A/(B - (Zs >> B_SHF)
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float ze =  "  I_FOG " [1].x / ( "  I_FOG " [1].y - (zCoord /  "  I_FOG " [1].w)); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// orthographic
 
							 
						 
					
						
							
								
									
										
										
										
											2010-11-23 13:57:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										// ze = a*Zs	(here, no B_SHF)
 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float ze =  "  I_FOG " [1].x * zCoord; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2010-11-23 13:57:01 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// x_adjust = sqrt((x-center)^2 + k^2)/k
 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									// ze *= x_adjust
 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									// this is completely theoretical as the real hardware seems to use a table intead of calculating the values.
 
							 
						 
					
						
							
								
									
										
										
										
											2013-05-01 11:39:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									uid_data . fog_RangeBaseEnabled  =  bpmem . fogRange . Base . Enabled ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . fogRange . Base . Enabled ) 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 04:31:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . SetConstantsUsed ( C_FOG + 2 ,  C_FOG + 2 ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2013-03-26 22:16:29 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " \t float x_adjust = (2.0f * (clipPos.x /  "  I_FOG " [2].y)) - 1.0f -  "  I_FOG " [2].x; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " \t x_adjust = sqrt(x_adjust * x_adjust +  "  I_FOG " [2].z *  "  I_FOG " [2].z) /  "  I_FOG " [2].z; \n " ) ; 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										out . Write ( " \t ze *= x_adjust; \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2011-01-29 04:31:56 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t float fog = clamp(ze -  "  I_FOG " [1].z, 0.0f, 1.0f); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2011-12-26 00:15:54 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  ( bpmem . fog . c_proj_fsel . fsel  >  3 ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										out . Write ( " %s " ,  tevFogFuncsTable [ bpmem . fog . c_proj_fsel . fsel ] ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									else 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									{ 
							 
						 
					
						
							
								
									
										
										
										
											2013-08-12 13:31:29 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ( bpmem . fog . c_proj_fsel . fsel  ! =  2  & &  out . GetBuffer ( )  ! =  NULL ) 
							 
						 
					
						
							
								
									
										
										
										
											2009-10-25 02:35:21 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											WARN_LOG ( VIDEO ,  " Unknown Fog Type! %08x " ,  bpmem . fog . c_proj_fsel . fsel ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2010-07-06 13:14:51 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2013-06-18 07:52:36 -05:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									out . Write ( " \t prev.rgb = lerp(prev.rgb,  "  I_FOG " [0].rgb, fog); \n " ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 14:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GetPixelShaderUid ( PixelShaderUid &  object ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GeneratePixelShader < PixelShaderUid > ( object ,  dstAlphaMode ,  ApiType ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2011-06-04 19:56:18 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 14:31:37 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								void  GeneratePixelShaderCode ( PixelShaderCode &  object ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
									
										
										
										
											2012-08-07 01:02:04 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GeneratePixelShader < PixelShaderCode > ( object ,  dstAlphaMode ,  ApiType ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2009-02-19 04:41:58 +00:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}  
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								void  GetPixelShaderConstantProfile ( PixelShaderConstantProfile &  object ,  DSTALPHA_MODE  dstAlphaMode ,  API_TYPE  ApiType ,  u32  components )  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								{  
						 
					
						
							
								
									
										
										
										
											2013-03-26 23:21:08 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									GeneratePixelShader < PixelShaderConstantProfile > ( object ,  dstAlphaMode ,  ApiType ,  components ) ; 
							 
						 
					
						
							
								
									
										
										
										
											2012-09-02 20:00:15 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								}