| 
									
										
										
										
											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:25:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | #include <cstddef>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Common/Common.h"
 | 
					
						
							|  |  |  | #include "VideoCommon/IndexGenerator.h"
 | 
					
						
							| 
									
										
										
										
											2014-05-08 16:53:18 -07:00
										 |  |  | #include "VideoCommon/OpcodeDecoding.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "VideoCommon/VideoConfig.h"
 | 
					
						
							| 
									
										
										
										
											2008-12-08 05:25:12 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-06 14:24:10 +00:00
										 |  |  | //Init
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | u16 *IndexGenerator::index_buffer_current; | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | u16 *IndexGenerator::BASEIptr; | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | u32 IndexGenerator::base_index; | 
					
						
							| 
									
										
										
										
											2009-10-06 14:24:10 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-08 17:58:23 +02:00
										 |  |  | static const u16 s_primitive_restart = -1; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | static u16* (*primitive_table[8])(u16*, u32, u32); | 
					
						
							| 
									
										
										
										
											2013-04-08 19:39:43 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | void IndexGenerator::Init() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (g_Config.backend_info.bSupportsPrimitiveRestart) | 
					
						
							| 
									
										
										
										
											2013-04-08 19:39:43 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-05-08 16:53:18 -07:00
										 |  |  | 		primitive_table[GX_DRAW_QUADS] = IndexGenerator::AddQuads<true>; | 
					
						
							| 
									
										
										
										
											2014-05-17 11:55:32 -07:00
										 |  |  | 		primitive_table[GX_DRAW_QUADS_2] = IndexGenerator::AddQuads_nonstandard<true>; | 
					
						
							| 
									
										
										
										
											2014-05-08 16:53:18 -07:00
										 |  |  | 		primitive_table[GX_DRAW_TRIANGLES] = IndexGenerator::AddList<true>; | 
					
						
							|  |  |  | 		primitive_table[GX_DRAW_TRIANGLE_STRIP] = IndexGenerator::AddStrip<true>; | 
					
						
							|  |  |  | 		primitive_table[GX_DRAW_TRIANGLE_FAN] = IndexGenerator::AddFan<true>; | 
					
						
							| 
									
										
										
										
											2013-04-08 19:39:43 +02:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-05-08 16:53:18 -07:00
										 |  |  | 		primitive_table[GX_DRAW_QUADS] = IndexGenerator::AddQuads<false>; | 
					
						
							| 
									
										
										
										
											2014-05-17 11:55:32 -07:00
										 |  |  | 		primitive_table[GX_DRAW_QUADS_2] = IndexGenerator::AddQuads_nonstandard<false>; | 
					
						
							| 
									
										
										
										
											2014-05-08 16:53:18 -07:00
										 |  |  | 		primitive_table[GX_DRAW_TRIANGLES] = IndexGenerator::AddList<false>; | 
					
						
							|  |  |  | 		primitive_table[GX_DRAW_TRIANGLE_STRIP] = IndexGenerator::AddStrip<false>; | 
					
						
							|  |  |  | 		primitive_table[GX_DRAW_TRIANGLE_FAN] = IndexGenerator::AddFan<false>; | 
					
						
							| 
									
										
										
										
											2013-04-08 19:39:43 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-05-08 16:53:18 -07:00
										 |  |  | 	primitive_table[GX_DRAW_LINES] = &IndexGenerator::AddLineList; | 
					
						
							|  |  |  | 	primitive_table[GX_DRAW_LINE_STRIP] = &IndexGenerator::AddLineStrip; | 
					
						
							|  |  |  | 	primitive_table[GX_DRAW_POINTS] = &IndexGenerator::AddPoints; | 
					
						
							| 
									
										
										
										
											2013-04-08 19:39:43 +02:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | void IndexGenerator::Start(u16* Indexptr) | 
					
						
							| 
									
										
										
										
											2010-06-16 10:12:57 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	index_buffer_current = Indexptr; | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 	BASEIptr = Indexptr; | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	base_index = 0; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | void IndexGenerator::AddIndices(int primitive, u32 numVerts) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	index_buffer_current = primitive_table[primitive](index_buffer_current, numVerts, base_index); | 
					
						
							|  |  |  | 	base_index += numVerts; | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | // Triangles
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | template <bool pr> __forceinline u16* IndexGenerator::WriteTriangle(u16 *Iptr, u32 index1, u32 index2, u32 index3) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 	*Iptr++ = index1; | 
					
						
							|  |  |  | 	*Iptr++ = index2; | 
					
						
							|  |  |  | 	*Iptr++ = index3; | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (pr) | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 		*Iptr++ = s_primitive_restart; | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | template <bool pr> u16* IndexGenerator::AddList(u16 *Iptr, u32 const numVerts, u32 index) | 
					
						
							| 
									
										
										
										
											2013-02-21 21:01:53 -06:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-23 14:38:25 +02:00
										 |  |  | 	for (u32 i = 2; i < numVerts; i+=3) | 
					
						
							| 
									
										
										
										
											2010-05-22 21:58:43 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 		Iptr = WriteTriangle<pr>(Iptr, index + i - 2, index + i - 1, index + i); | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | template <bool pr> u16* IndexGenerator::AddStrip(u16 *Iptr, u32 const numVerts, u32 index) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (pr) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2013-03-29 14:27:33 +01:00
										 |  |  | 		for (u32 i = 0; i < numVerts; ++i) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 			*Iptr++ = index + i; | 
					
						
							| 
									
										
										
										
											2013-03-29 14:27:33 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 		*Iptr++ = s_primitive_restart; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2013-03-29 14:27:33 +01:00
										 |  |  | 		bool wind = false; | 
					
						
							|  |  |  | 		for (u32 i = 2; i < numVerts; ++i) | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 			Iptr = WriteTriangle<pr>(Iptr, | 
					
						
							| 
									
										
										
										
											2013-03-29 14:27:33 +01:00
										 |  |  | 				index + i - 2, | 
					
						
							|  |  |  | 				index + i - !wind, | 
					
						
							|  |  |  | 				index + i - wind); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			wind ^= true; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * FAN simulator: | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  *   2---3 | 
					
						
							|  |  |  |  *  / \ / \ | 
					
						
							|  |  |  |  * 1---0---4 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  * would generate this triangles: | 
					
						
							|  |  |  |  * 012, 023, 034 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  * rotated (for better striping): | 
					
						
							|  |  |  |  * 120, 302, 034 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  * as odd ones have to winded, following strip is fine: | 
					
						
							|  |  |  |  * 12034 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  * so we use 6 indices for 3 triangles | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | template <bool pr> u16* IndexGenerator::AddFan(u16 *Iptr, u32 numVerts, u32 index) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  | 	u32 i = 2; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (pr) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 		for (; i+3<=numVerts; i+=3) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 			*Iptr++ = index + i - 1; | 
					
						
							|  |  |  | 			*Iptr++ = index + i + 0; | 
					
						
							|  |  |  | 			*Iptr++ = index; | 
					
						
							|  |  |  | 			*Iptr++ = index + i + 1; | 
					
						
							|  |  |  | 			*Iptr++ = index + i + 2; | 
					
						
							|  |  |  | 			*Iptr++ = s_primitive_restart; | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 		for (; i+2<=numVerts; i+=2) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 			*Iptr++ = index + i - 1; | 
					
						
							|  |  |  | 			*Iptr++ = index + i + 0; | 
					
						
							|  |  |  | 			*Iptr++ = index; | 
					
						
							|  |  |  | 			*Iptr++ = index + i + 1; | 
					
						
							|  |  |  | 			*Iptr++ = s_primitive_restart; | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  | 	for (; i < numVerts; ++i) | 
					
						
							| 
									
										
										
										
											2010-05-22 21:58:43 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 		Iptr = WriteTriangle<pr>(Iptr, index, index + i - 1, index + i); | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * QUAD simulator | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  * 0---1   4---5 | 
					
						
							|  |  |  |  * |\  |   |\  | | 
					
						
							|  |  |  |  * | \ |   | \ | | 
					
						
							|  |  |  |  * |  \|   |  \| | 
					
						
							|  |  |  |  * 3---2   7---6 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  * 012,023, 456,467 ... | 
					
						
							|  |  |  |  * or 120,302, 564,746 | 
					
						
							|  |  |  |  * or as strip: 1203, 5647 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * Warning: | 
					
						
							| 
									
										
										
										
											2013-04-10 12:45:44 +02:00
										 |  |  |  * A simple triangle has to be rendered for three vertices. | 
					
						
							|  |  |  |  * ZWW do this for sun rays | 
					
						
							| 
									
										
										
										
											2013-04-08 17:22:16 +02:00
										 |  |  |  */ | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | template <bool pr> u16* IndexGenerator::AddQuads(u16 *Iptr, u32 numVerts, u32 index) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-23 14:38:25 +02:00
										 |  |  | 	u32 i = 3; | 
					
						
							|  |  |  | 	for (; i < numVerts; i+=4) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 		if (pr) | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 			*Iptr++ = index + i - 2; | 
					
						
							|  |  |  | 			*Iptr++ = index + i - 1; | 
					
						
							|  |  |  | 			*Iptr++ = index + i - 3; | 
					
						
							|  |  |  | 			*Iptr++ = index + i - 0; | 
					
						
							|  |  |  | 			*Iptr++ = s_primitive_restart; | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 		{ | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 			Iptr = WriteTriangle<pr>(Iptr, index + i - 3, index + i - 2, index + i - 1); | 
					
						
							|  |  |  | 			Iptr = WriteTriangle<pr>(Iptr, index + i - 3, index + i - 1, index + i - 0); | 
					
						
							| 
									
										
										
										
											2013-03-29 14:27:33 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-04-24 09:21:54 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-10 12:36:59 +02:00
										 |  |  | 	// three vertices remaining, so render a triangle
 | 
					
						
							| 
									
										
										
										
											2014-03-11 00:30:55 +13:00
										 |  |  | 	if (i == numVerts) | 
					
						
							| 
									
										
										
										
											2013-04-10 12:36:59 +02:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 		Iptr = WriteTriangle<pr>(Iptr, index+numVerts-3, index+numVerts-2, index+numVerts-1); | 
					
						
							| 
									
										
										
										
											2013-04-10 12:36:59 +02:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-05-17 11:55:32 -07:00
										 |  |  | template <bool pr> u16* IndexGenerator::AddQuads_nonstandard(u16 *Iptr, u32 numVerts, u32 index) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	WARN_LOG(VIDEO, "Non-standard primitive drawing command GL_DRAW_QUADS_2"); | 
					
						
							|  |  |  | 	return AddQuads<pr>(Iptr, numVerts, index); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | // Lines
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | u16* IndexGenerator::AddLineList(u16 *Iptr, u32 numVerts, u32 index) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-06-23 14:38:25 +02:00
										 |  |  | 	for (u32 i = 1; i < numVerts; i+=2) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 		*Iptr++ = index + i - 1; | 
					
						
							|  |  |  | 		*Iptr++ = index + i; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-04-08 17:58:23 +02:00
										 |  |  | // shouldn't be used as strips as LineLists are much more common
 | 
					
						
							|  |  |  | // so converting them to lists
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | u16* IndexGenerator::AddLineStrip(u16 *Iptr, u32 numVerts, u32 index) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | 	for (u32 i = 1; i < numVerts; ++i) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 		*Iptr++ = index + i - 1; | 
					
						
							|  |  |  | 		*Iptr++ = index + i; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | // Points
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | u16* IndexGenerator::AddPoints(u16 *Iptr, u32 numVerts, u32 index) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-02-21 19:10:00 -06:00
										 |  |  | 	for (u32 i = 0; i != numVerts; ++i) | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	{ | 
					
						
							| 
									
										
										
										
											2014-01-15 21:44:46 +01:00
										 |  |  | 		*Iptr++ = index + i; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return Iptr; | 
					
						
							| 
									
										
										
										
											2009-09-29 18:27:41 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-03-23 00:18:35 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | u32 IndexGenerator::GetRemainingIndices() | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-04-08 17:58:23 +02:00
										 |  |  | 	u32 max_index = 65534; // -1 is reserved for primitive restart (ogl + dx11)
 | 
					
						
							| 
									
										
										
										
											2014-01-16 14:30:17 +01:00
										 |  |  | 	return max_index - base_index; | 
					
						
							| 
									
										
										
										
											2013-03-23 00:18:35 +01:00
										 |  |  | } |