| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2009 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:29:41 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-24 05:16:52 -04:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoBackends/Software/Vec3.h"
 | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | struct Vec4 | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   float x; | 
					
						
							|  |  |  |   float y; | 
					
						
							|  |  |  |   float z; | 
					
						
							|  |  |  |   float w; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct InputVertexData | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   u8 posMtx; | 
					
						
							|  |  |  |   u8 texMtx[8]; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   Vec3 position; | 
					
						
							|  |  |  |   Vec3 normal[3]; | 
					
						
							|  |  |  |   u8 color[2][4]; | 
					
						
							|  |  |  |   float texCoords[8][2]; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | struct OutputVertexData | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   // components in color channels
 | 
					
						
							|  |  |  |   enum | 
					
						
							|  |  |  |   { | 
					
						
							|  |  |  |     RED_C, | 
					
						
							|  |  |  |     GRN_C, | 
					
						
							|  |  |  |     BLU_C, | 
					
						
							|  |  |  |     ALP_C | 
					
						
							|  |  |  |   }; | 
					
						
							| 
									
										
										
										
											2010-12-31 06:45:18 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   Vec3 mvPosition = {}; | 
					
						
							|  |  |  |   Vec4 projectedPosition = {}; | 
					
						
							|  |  |  |   Vec3 screenPosition = {}; | 
					
						
							|  |  |  |   Vec3 normal[3] = {}; | 
					
						
							|  |  |  |   u8 color[2][4] = {}; | 
					
						
							|  |  |  |   Vec3 texCoords[8] = {}; | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-09-22 20:52:35 -04:00
										 |  |  |   void Lerp(float t, const OutputVertexData* a, const OutputVertexData* b) | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   { | 
					
						
							|  |  |  | #define LINTERP(T, OUT, IN) (OUT) + ((IN - OUT) * T)
 | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | #define LINTERP_INT(T, OUT, IN) (OUT) + (((IN - OUT) * T) >> 8)
 | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     mvPosition = LINTERP(t, a->mvPosition, b->mvPosition); | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     projectedPosition.x = LINTERP(t, a->projectedPosition.x, b->projectedPosition.x); | 
					
						
							|  |  |  |     projectedPosition.y = LINTERP(t, a->projectedPosition.y, b->projectedPosition.y); | 
					
						
							|  |  |  |     projectedPosition.z = LINTERP(t, a->projectedPosition.z, b->projectedPosition.z); | 
					
						
							|  |  |  |     projectedPosition.w = LINTERP(t, a->projectedPosition.w, b->projectedPosition.w); | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     for (int i = 0; i < 3; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       normal[i] = LINTERP(t, a->normal[i], b->normal[i]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-04-13 23:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     u16 t_int = (u16)(t * 256); | 
					
						
							|  |  |  |     for (int i = 0; i < 4; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       color[0][i] = LINTERP_INT(t_int, a->color[0][i], b->color[0][i]); | 
					
						
							|  |  |  |       color[1][i] = LINTERP_INT(t_int, a->color[1][i], b->color[1][i]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-04-13 23:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |     for (int i = 0; i < 8; ++i) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       texCoords[i] = LINTERP(t, a->texCoords[i], b->texCoords[i]); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-04-13 23:54:02 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | #undef LINTERP
 | 
					
						
							|  |  |  | #undef LINTERP_INT
 | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2010-06-09 01:37:08 +00:00
										 |  |  | }; |