| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is Copyright (C) 2013 Blender Foundation. | 
					
						
							|  |  |  |  * All rights reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * The Original Code is: all of this file. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Contributor(s): Brecht Van Lommel. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | /** \file blender/gpu/intern/gpu_basic_shader.c
 | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  |  *  \ingroup gpu | 
					
						
							| 
									
										
										
										
											2014-01-19 23:14:24 +11:00
										 |  |  |  * | 
					
						
							|  |  |  |  * GLSL shaders to replace fixed function OpenGL materials and lighting. These | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  |  * are deprecated in newer OpenGL versions and missing in OpenGL ES 2.0. Also, | 
					
						
							|  |  |  |  * two sided lighting is no longer natively supported on NVidia cards which | 
					
						
							|  |  |  |  * results in slow software fallback. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Todo: | 
					
						
							|  |  |  |  * - Replace glLight and glMaterial functions entirely with GLSL uniforms, to | 
					
						
							|  |  |  |  *   make OpenGL ES 2.0 work. | 
					
						
							|  |  |  |  * - Replace glTexCoord and glColor with generic attributes. | 
					
						
							|  |  |  |  * - Optimize for case where fewer than 3 or 8 lights are used. | 
					
						
							|  |  |  |  * - Optimize for case where specular is not used. | 
					
						
							|  |  |  |  * - Optimize for case where no texture matrix is used. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLI_math.h"
 | 
					
						
							|  |  |  | #include "BLI_utildefines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | #include "GPU_basic_shader.h"
 | 
					
						
							| 
									
										
										
										
											2015-12-06 21:20:19 +01:00
										 |  |  | #include "GPU_glew.h"
 | 
					
						
							|  |  |  | #include "GPU_shader.h"
 | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* State */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | static const bool USE_GLSL = false; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static struct { | 
					
						
							|  |  |  | 	GPUShader *cached_shaders[GPU_SHADER_OPTION_COMBINATIONS]; | 
					
						
							|  |  |  | 	bool failed_shaders[GPU_SHADER_OPTION_COMBINATIONS]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	int bound_options; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	int lights_enabled; | 
					
						
							|  |  |  | 	int lights_directional; | 
					
						
							|  |  |  | } GPU_MATERIAL_STATE; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-25 22:57:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* Stipple patterns */ | 
					
						
							|  |  |  | /* ******************************************** */ | 
					
						
							|  |  |  | const GLubyte stipple_halftone[128] = { | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xAA, 0xAA, 0xAA, 0xAA, 0x55, 0x55, 0x55, 0x55}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_quarttone[128] = { | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0, | 
					
						
							|  |  |  | 	136, 136, 136, 136, 0, 0, 0, 0, 34, 34, 34, 34, 0, 0, 0, 0}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_diag_stripes_pos[128] = { | 
					
						
							|  |  |  | 	0x00, 0xff, 0x00, 0xff, 0x01, 0xfe, 0x01, 0xfe, | 
					
						
							|  |  |  | 	0x03, 0xfc, 0x03, 0xfc, 0x07, 0xf8, 0x07, 0xf8, | 
					
						
							|  |  |  | 	0x0f, 0xf0, 0x0f, 0xf0, 0x1f, 0xe0, 0x1f, 0xe0, | 
					
						
							|  |  |  | 	0x3f, 0xc0, 0x3f, 0xc0, 0x7f, 0x80, 0x7f, 0x80, | 
					
						
							|  |  |  | 	0xff, 0x00, 0xff, 0x00, 0xfe, 0x01, 0xfe, 0x01, | 
					
						
							|  |  |  | 	0xfc, 0x03, 0xfc, 0x03, 0xf8, 0x07, 0xf8, 0x07, | 
					
						
							|  |  |  | 	0xf0, 0x0f, 0xf0, 0x0f, 0xe0, 0x1f, 0xe0, 0x1f, | 
					
						
							|  |  |  | 	0xc0, 0x3f, 0xc0, 0x3f, 0x80, 0x7f, 0x80, 0x7f, | 
					
						
							|  |  |  | 	0x00, 0xff, 0x00, 0xff, 0x01, 0xfe, 0x01, 0xfe, | 
					
						
							|  |  |  | 	0x03, 0xfc, 0x03, 0xfc, 0x07, 0xf8, 0x07, 0xf8, | 
					
						
							|  |  |  | 	0x0f, 0xf0, 0x0f, 0xf0, 0x1f, 0xe0, 0x1f, 0xe0, | 
					
						
							|  |  |  | 	0x3f, 0xc0, 0x3f, 0xc0, 0x7f, 0x80, 0x7f, 0x80, | 
					
						
							|  |  |  | 	0xff, 0x00, 0xff, 0x00, 0xfe, 0x01, 0xfe, 0x01, | 
					
						
							|  |  |  | 	0xfc, 0x03, 0xfc, 0x03, 0xf8, 0x07, 0xf8, 0x07, | 
					
						
							|  |  |  | 	0xf0, 0x0f, 0xf0, 0x0f, 0xe0, 0x1f, 0xe0, 0x1f, | 
					
						
							|  |  |  | 	0xc0, 0x3f, 0xc0, 0x3f, 0x80, 0x7f, 0x80, 0x7f}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_diag_stripes_neg[128] = { | 
					
						
							|  |  |  | 	0xff, 0x00, 0xff, 0x00, 0xfe, 0x01, 0xfe, 0x01, | 
					
						
							|  |  |  | 	0xfc, 0x03, 0xfc, 0x03, 0xf8, 0x07, 0xf8, 0x07, | 
					
						
							|  |  |  | 	0xf0, 0x0f, 0xf0, 0x0f, 0xe0, 0x1f, 0xe0, 0x1f, | 
					
						
							|  |  |  | 	0xc0, 0x3f, 0xc0, 0x3f, 0x80, 0x7f, 0x80, 0x7f, | 
					
						
							|  |  |  | 	0x00, 0xff, 0x00, 0xff, 0x01, 0xfe, 0x01, 0xfe, | 
					
						
							|  |  |  | 	0x03, 0xfc, 0x03, 0xfc, 0x07, 0xf8, 0x07, 0xf8, | 
					
						
							|  |  |  | 	0x0f, 0xf0, 0x0f, 0xf0, 0x1f, 0xe0, 0x1f, 0xe0, | 
					
						
							|  |  |  | 	0x3f, 0xc0, 0x3f, 0xc0, 0x7f, 0x80, 0x7f, 0x80, | 
					
						
							|  |  |  | 	0xff, 0x00, 0xff, 0x00, 0xfe, 0x01, 0xfe, 0x01, | 
					
						
							|  |  |  | 	0xfc, 0x03, 0xfc, 0x03, 0xf8, 0x07, 0xf8, 0x07, | 
					
						
							|  |  |  | 	0xf0, 0x0f, 0xf0, 0x0f, 0xe0, 0x1f, 0xe0, 0x1f, | 
					
						
							|  |  |  | 	0xc0, 0x3f, 0xc0, 0x3f, 0x80, 0x7f, 0x80, 0x7f, | 
					
						
							|  |  |  | 	0x00, 0xff, 0x00, 0xff, 0x01, 0xfe, 0x01, 0xfe, | 
					
						
							|  |  |  | 	0x03, 0xfc, 0x03, 0xfc, 0x07, 0xf8, 0x07, 0xf8, | 
					
						
							|  |  |  | 	0x0f, 0xf0, 0x0f, 0xf0, 0x1f, 0xe0, 0x1f, 0xe0, | 
					
						
							|  |  |  | 	0x3f, 0xc0, 0x3f, 0xc0, 0x7f, 0x80, 0x7f, 0x80}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_checker_8px[128] = { | 
					
						
							|  |  |  | 	255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, | 
					
						
							|  |  |  | 	255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, | 
					
						
							|  |  |  | 	0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, | 
					
						
							|  |  |  | 	0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, | 
					
						
							|  |  |  | 	255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, | 
					
						
							|  |  |  | 	255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, | 
					
						
							|  |  |  | 	0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, | 
					
						
							|  |  |  | 	0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_interlace_row[128] = { | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, | 
					
						
							|  |  |  | 	0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_interlace_row_swap[128] = { | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, | 
					
						
							|  |  |  | 	0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_interlace_column[128] = { | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_interlace_column_swap[128] = { | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_interlace_checker[128] = { | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa, | 
					
						
							|  |  |  | 	0x55, 0x55, 0x55, 0x55, 0xaa, 0xaa, 0xaa, 0xaa}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_interlace_checker_swap[128] = { | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55, | 
					
						
							|  |  |  | 	0xaa, 0xaa, 0xaa, 0xaa, 0x55, 0x55, 0x55, 0x55}; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | const GLubyte stipple_hexagon[128] = { | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, | 
					
						
							|  |  |  | 	0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, 0x88, | 
					
						
							|  |  |  | 	0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22, 0x22}; | 
					
						
							|  |  |  | /* ********************************************* */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | /* Init / exit */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | void GPU_basic_shaders_init(void) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	memset(&GPU_MATERIAL_STATE, 0, sizeof(GPU_MATERIAL_STATE)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | void GPU_basic_shaders_exit(void) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int i; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	for (i = 0; i < GPU_SHADER_OPTION_COMBINATIONS; i++) | 
					
						
							|  |  |  | 		if (GPU_MATERIAL_STATE.cached_shaders[i]) | 
					
						
							|  |  |  | 			GPU_shader_free(GPU_MATERIAL_STATE.cached_shaders[i]); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Shader lookup / create */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static bool solid_compatible_lighting(void) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	int enabled = GPU_MATERIAL_STATE.lights_enabled; | 
					
						
							|  |  |  | 	int directional = GPU_MATERIAL_STATE.lights_directional; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* more than 3 lights? */ | 
					
						
							|  |  |  | 	if (enabled >= (1 << 3)) | 
					
						
							|  |  |  | 		return false; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* all directional? */ | 
					
						
							|  |  |  | 	return ((directional & enabled) == enabled); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if 0
 | 
					
						
							|  |  |  | static int detect_options() | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	GLint two_sided; | 
					
						
							|  |  |  | 	int options = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (glIsEnabled(GL_TEXTURE_2D)) | 
					
						
							|  |  |  | 		options |= GPU_SHADER_TEXTURE_2D; | 
					
						
							|  |  |  | 	if (glIsEnabled(GL_COLOR_MATERIAL)) | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		options |= GPU_SHADER_USE_COLOR; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	if (glIsEnabled(GL_LIGHTING)) | 
					
						
							|  |  |  | 		options |= GPU_SHADER_LIGHTING; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	glGetIntegerv(GL_LIGHT_MODEL_TWO_SIDE, &two_sided); | 
					
						
							|  |  |  | 	if (two_sided == GL_TRUE) | 
					
						
							|  |  |  | 		options |= GPU_SHADER_TWO_SIDED; | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	return options; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | static GPUShader *gpu_basic_shader(int options) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	/* glsl code */ | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | 	extern char datatoc_gpu_shader_basic_vert_glsl[]; | 
					
						
							|  |  |  | 	extern char datatoc_gpu_shader_basic_frag_glsl[]; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 	GPUShader *shader; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* detect if we can do faster lighting for solid draw mode */ | 
					
						
							|  |  |  | 	if (options & GPU_SHADER_LIGHTING) | 
					
						
							|  |  |  | 		if (solid_compatible_lighting()) | 
					
						
							|  |  |  | 			options |= GPU_SHADER_SOLID_LIGHTING; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* cached shaders */ | 
					
						
							|  |  |  | 	shader = GPU_MATERIAL_STATE.cached_shaders[options]; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (!shader && !GPU_MATERIAL_STATE.failed_shaders[options]) { | 
					
						
							|  |  |  | 		/* create shader if it doesn't exist yet */ | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 		char defines[64 * GPU_SHADER_OPTIONS_NUM] = ""; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		if (options & GPU_SHADER_USE_COLOR) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 			strcat(defines, "#define USE_COLOR\n"); | 
					
						
							|  |  |  | 		if (options & GPU_SHADER_TWO_SIDED) | 
					
						
							|  |  |  | 			strcat(defines, "#define USE_TWO_SIDED\n"); | 
					
						
							|  |  |  | 		if (options & GPU_SHADER_TEXTURE_2D) | 
					
						
							|  |  |  | 			strcat(defines, "#define USE_TEXTURE\n"); | 
					
						
							| 
									
										
										
										
											2015-12-25 22:57:50 +01:00
										 |  |  | 		if (options & GPU_SHADER_STIPPLE) | 
					
						
							|  |  |  | 			strcat(defines, "#define USE_STIPPLE\n"); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (options & GPU_SHADER_SOLID_LIGHTING) | 
					
						
							|  |  |  | 			strcat(defines, "#define USE_SOLID_LIGHTING\n"); | 
					
						
							|  |  |  | 		else if (options & GPU_SHADER_LIGHTING) | 
					
						
							|  |  |  | 			strcat(defines, "#define USE_SCENE_LIGHTING\n"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		shader = GPU_shader_create( | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | 			datatoc_gpu_shader_basic_vert_glsl, | 
					
						
							|  |  |  | 			datatoc_gpu_shader_basic_frag_glsl, | 
					
						
							| 
									
										
										
										
											2015-03-03 17:47:31 +01:00
										 |  |  | 			NULL, | 
					
						
							| 
									
										
										
										
											2015-07-20 16:08:06 +02:00
										 |  |  | 			NULL, | 
					
						
							|  |  |  | 			defines, 0, 0, 0); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		if (shader) { | 
					
						
							|  |  |  | 			/* set texture map to first texture unit */ | 
					
						
							| 
									
										
										
										
											2015-12-28 20:51:38 +01:00
										 |  |  | 			if (options & GPU_SHADER_TEXTURE_2D) { | 
					
						
							|  |  |  | 				GPU_shader_bind(shader); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 				glUniform1i(GPU_shader_get_uniform(shader, "texture_map"), 0); | 
					
						
							| 
									
										
										
										
											2015-12-28 20:51:38 +01:00
										 |  |  | 				GPU_shader_unbind(); | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			GPU_MATERIAL_STATE.cached_shaders[options] = shader; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else | 
					
						
							|  |  |  | 			GPU_MATERIAL_STATE.failed_shaders[options] = true; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return shader; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Bind / unbind */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | void GPU_basic_shader_bind(int options) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	if (USE_GLSL) { | 
					
						
							|  |  |  | 		if (options) { | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | 			GPUShader *shader = gpu_basic_shader(options); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 			if (shader) | 
					
						
							|  |  |  | 				GPU_shader_bind(shader); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			GPU_shader_unbind(); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							|  |  |  | 		int bound_options = GPU_MATERIAL_STATE.bound_options; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		if (options & GPU_SHADER_LIGHTING) { | 
					
						
							|  |  |  | 			glEnable(GL_LIGHTING); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (options & GPU_SHADER_USE_COLOR) | 
					
						
							|  |  |  | 				glEnable(GL_COLOR_MATERIAL); | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				glDisable(GL_COLOR_MATERIAL); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if (options & GPU_SHADER_TWO_SIDED) | 
					
						
							|  |  |  | 				glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE); | 
					
						
							|  |  |  | 			else | 
					
						
							|  |  |  | 				glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else if (bound_options & GPU_SHADER_LIGHTING) { | 
					
						
							|  |  |  | 			glDisable(GL_LIGHTING); | 
					
						
							|  |  |  | 			glDisable(GL_COLOR_MATERIAL); | 
					
						
							|  |  |  | 			glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-23 20:38:58 +01:00
										 |  |  | 		if (options & GPU_SHADER_TEXTURE_2D) { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 			GLint env_mode = (options & (GPU_SHADER_USE_COLOR | GPU_SHADER_LIGHTING)) ? GL_MODULATE : GL_REPLACE; | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 			glEnable(GL_TEXTURE_2D); | 
					
						
							| 
									
										
										
										
											2015-12-23 20:38:58 +01:00
										 |  |  | 			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, env_mode); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else if (bound_options & GPU_SHADER_TEXTURE_2D) { | 
					
						
							|  |  |  | 			glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 			glDisable(GL_TEXTURE_2D); | 
					
						
							| 
									
										
										
										
											2015-12-23 20:38:58 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2015-12-25 22:57:50 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		if (options & GPU_SHADER_STIPPLE) | 
					
						
							|  |  |  | 			glEnable(GL_POLYGON_STIPPLE); | 
					
						
							|  |  |  | 		else if (bound_options & GPU_SHADER_STIPPLE) | 
					
						
							|  |  |  | 			glDisable(GL_POLYGON_STIPPLE); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	GPU_MATERIAL_STATE.bound_options = options; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | int GPU_basic_shader_bound_options(void) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	/* ideally this should disappear, anything that uses this is making fragile
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | 	 * assumptions that the basic shader is bound and not another shader */ | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	return GPU_MATERIAL_STATE.bound_options; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Material Colors */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | void GPU_basic_shader_colors(const float diffuse[3], const float specular[3], | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 	int shininess, float alpha) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	float gl_diffuse[4], gl_specular[4]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	if (diffuse) | 
					
						
							|  |  |  | 		copy_v3_v3(gl_diffuse, diffuse); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		zero_v3(gl_diffuse); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 	gl_diffuse[3] = alpha; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	if (specular) | 
					
						
							|  |  |  | 		copy_v3_v3(gl_specular, specular); | 
					
						
							|  |  |  | 	else | 
					
						
							|  |  |  | 		zero_v3(gl_specular); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 	gl_specular[3] = 1.0f; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, gl_diffuse); | 
					
						
							|  |  |  | 	glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, gl_specular); | 
					
						
							|  |  |  | 	glMateriali(GL_FRONT_AND_BACK, GL_SHININESS, CLAMPIS(shininess, 1, 128)); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | void GPU_basic_shader_light_set(int light_num, GPULightData *light) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | { | 
					
						
							|  |  |  | 	int light_bit = (1 << light_num); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 	/* note that light position is affected by the current modelview matrix! */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 	GPU_MATERIAL_STATE.lights_enabled &= ~light_bit; | 
					
						
							|  |  |  | 	GPU_MATERIAL_STATE.lights_directional &= ~light_bit; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if (light) { | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		float position[4], diffuse[4], specular[4]; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 		glEnable(GL_LIGHT0 + light_num); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		/* position */ | 
					
						
							|  |  |  | 		if (light->type == GPU_LIGHT_SUN) { | 
					
						
							|  |  |  | 			copy_v3_v3(position, light->direction); | 
					
						
							|  |  |  | 			position[3] = 0.0f; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							|  |  |  | 			copy_v3_v3(position, light->position); | 
					
						
							|  |  |  | 			position[3] = 1.0f; | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 		glLightfv(GL_LIGHT0 + light_num, GL_POSITION, position); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* energy */ | 
					
						
							|  |  |  | 		copy_v3_v3(diffuse, light->diffuse); | 
					
						
							|  |  |  | 		copy_v3_v3(specular, light->specular); | 
					
						
							|  |  |  | 		diffuse[3] = 1.0f; | 
					
						
							|  |  |  | 		specular[3] = 1.0f; | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 		glLightfv(GL_LIGHT0 + light_num, GL_DIFFUSE, diffuse); | 
					
						
							|  |  |  | 		glLightfv(GL_LIGHT0 + light_num, GL_SPECULAR, specular); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* attenuation */ | 
					
						
							|  |  |  | 		if (light->type == GPU_LIGHT_SUN) { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_CONSTANT_ATTENUATION, 1.0f); | 
					
						
							|  |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_LINEAR_ATTENUATION, 0.0f); | 
					
						
							|  |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_QUADRATIC_ATTENUATION, 0.0f); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_CONSTANT_ATTENUATION, light->constant_attenuation); | 
					
						
							|  |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_LINEAR_ATTENUATION, light->linear_attenuation); | 
					
						
							|  |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_QUADRATIC_ATTENUATION, light->quadratic_attenuation); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		/* spot */ | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 		glLightfv(GL_LIGHT0 + light_num, GL_SPOT_DIRECTION, light->direction); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		if (light->type == GPU_LIGHT_SPOT) { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_SPOT_CUTOFF, light->spot_cutoff); | 
					
						
							|  |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_SPOT_EXPONENT, light->spot_exponent); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 		else { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_SPOT_CUTOFF, 180.0f); | 
					
						
							|  |  |  | 			glLightf(GL_LIGHT0 + light_num, GL_SPOT_EXPONENT, 0.0f); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		GPU_MATERIAL_STATE.lights_enabled |= light_bit; | 
					
						
							| 
									
										
										
										
											2015-12-01 19:39:43 +11:00
										 |  |  | 		if (position[3] == 0.0f) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 			GPU_MATERIAL_STATE.lights_directional |= light_bit; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		if (USE_GLSL) { | 
					
						
							|  |  |  | 			/* glsl shader needs these zero to skip them */ | 
					
						
							|  |  |  | 			const float zero[4] = {0.0f, 0.0f, 0.0f, 0.0f}; | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 			glLightfv(GL_LIGHT0 + light_num, GL_POSITION, zero); | 
					
						
							|  |  |  | 			glLightfv(GL_LIGHT0 + light_num, GL_DIFFUSE, zero); | 
					
						
							|  |  |  | 			glLightfv(GL_LIGHT0 + light_num, GL_SPECULAR, zero); | 
					
						
							| 
									
										
										
										
											2015-11-27 21:06:23 +01:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 		glDisable(GL_LIGHT0 + light_num); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-05 22:11:31 +01:00
										 |  |  | void GPU_basic_shader_light_set_viewer(bool local) | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 	glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, (local) ? GL_TRUE: GL_FALSE); | 
					
						
							| 
									
										
										
										
											2013-03-10 15:38:23 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-12-25 22:57:50 +01:00
										 |  |  | void GPU_basic_shader_stipple(GPUBasicShaderStipple stipple_id) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | 	if (USE_GLSL) { | 
					
						
							|  |  |  | 		glUniform1i(GPU_shader_get_uniform(gpu_basic_shader(GPU_MATERIAL_STATE.bound_options), "stipple_id"), stipple_id); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { | 
					
						
							| 
									
										
										
										
											2016-01-10 07:12:10 +11:00
										 |  |  | 		switch (stipple_id) { | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_HALFTONE: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_halftone); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_QUARTTONE: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_quarttone); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_CHECKER_8PX: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_checker_8px); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_HEXAGON: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_hexagon); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_DIAG_STRIPES_SWAP: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_diag_stripes_neg); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_DIAG_STRIPES: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_diag_stripes_pos); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_S3D_INTERLACE_ROW: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_interlace_row); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_S3D_INTERLACE_ROW_SWAP: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_interlace_row_swap); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_S3D_INTERLACE_COLUMN: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_interlace_column); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_S3D_INTERLACE_COLUMN_SWAP: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_interlace_column_swap); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_S3D_INTERLACE_CHECKER: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_interlace_checker); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			case GPU_SHADER_STIPPLE_S3D_INTERLACE_CHECKER_SWAP: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_interlace_checker_swap); | 
					
						
							|  |  |  | 				return; | 
					
						
							|  |  |  | 			default: | 
					
						
							|  |  |  | 				glPolygonStipple(stipple_hexagon); | 
					
						
							|  |  |  | 				return; | 
					
						
							| 
									
										
										
										
											2015-12-25 22:57:50 +01:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } |