| 
					
				 | 
			
			
				@@ -268,6 +268,7 @@ void tnsShaderMakeIndex(tnsShader *tns){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tns->iShowStripes=glGetUniformLocation(program, "ShowStripes"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(tns->iTexColor>=0){glUniform1i(tns->iTexColor, 0);} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(tns->iTexColorMS>=0){glUniform1i(tns->iTexColorMS, 1);} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tns->iDoOffset = glGetUniformLocation(program, "DoOffset"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tns->uViewDir = glGetUniformLocation(program, "uViewDir"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tns->uViewPos = glGetUniformLocation(program, "uViewPos"); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1336,6 +1337,10 @@ void tnsInitBuiltinShaders(){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tnsNewVertexShader(LA_SELECTION_VERTEX_SHADER), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tnsNewFragmentShader(LA_SELECTION_FRAGMENT_SHADER), -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    T->FloorShader = tnsNewShaderProgram( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tnsNewVertexShader(LA_FLOOR_VERTEX_SHADER), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tnsNewFragmentShader(LA_FLOOR_FRAGMENT_SHADER), -1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsUseShader(T->immShader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsEnableShaderv(T->immShader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1736,6 +1741,10 @@ void tnsCopyScreenTo2DTexture(tnsTexture *target, int x_lower_left, int y_lower_ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsUnbindTexture(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void tnsUniformUseOffset(tnsShader* s, int use){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    glUniform1i(s->iDoOffset,use); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void tnsUseMaskTexture(tnsTexture *t){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if(!t){T->StateTextureMode=0; return;} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     T->StateTexColor = t; T->StateTextureMode=1; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -2479,15 +2488,15 @@ tnsOffscreen *tnsCreate2DOffscreen(int glInternalFormat, int w, int h, int Multi 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return toff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-tnsOffscreen *tnsCreateDeferredOffscreen(int w, int h){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+tnsOffscreen *tnsCreateDeferredOffscreen(int w, int h, int Multisample){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsOffscreen *toff = tnsCreateOffscreenHandle(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     tnsTexture *color,*normal,*gpos; tnsTexture *depth; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    color  = tnsCreate2DTexture(GL_RGBA8, w, h, 0);  tnsAttach2DOffscreenBuffer(toff, GL_COLOR_ATTACHMENT0, color); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    normal = tnsCreate2DTexture(GL_RGB8, w, h, 0);   tnsAttach2DOffscreenBuffer(toff, GL_COLOR_ATTACHMENT1, normal); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gpos   = tnsCreate2DTexture(GL_RGB32F, w, h, 0); tnsAttach2DOffscreenBuffer(toff, GL_COLOR_ATTACHMENT2, gpos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    color  = tnsCreate2DTexture(GL_RGBA8, w, h, Multisample);  tnsAttach2DOffscreenBuffer(toff, GL_COLOR_ATTACHMENT0, color); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    normal = tnsCreate2DTexture(GL_RGB8, w, h, Multisample);   tnsAttach2DOffscreenBuffer(toff, GL_COLOR_ATTACHMENT1, normal); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gpos   = tnsCreate2DTexture(GL_RGB32F, w, h, Multisample); tnsAttach2DOffscreenBuffer(toff, GL_COLOR_ATTACHMENT2, gpos); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    depth = tnsCreate2DTexture(GL_DEPTH_COMPONENT, w, h, 0); tnsAttach2DOffscreenBuffer(toff, GL_DEPTH_ATTACHMENT, depth); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    depth = tnsCreate2DTexture(GL_DEPTH_COMPONENT, w, h, Multisample); tnsAttach2DOffscreenBuffer(toff, GL_DEPTH_ATTACHMENT, depth); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return toff; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -4361,19 +4370,36 @@ void tnsDrawFloor(int Size, int Span, int *ShowAxis){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     int Lim = Span * 2 + 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     int Dist = Size * Span; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (i; i < Lim; i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (i == Span && ShowAxis[0]) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tnsVertex3d(-Dist, i * Size - Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tnsVertex3d(Dist, i * Size - Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsFlush(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    for (i = 0; i < Lim; i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        if (i == Span && ShowAxis[1]) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tnsVertex3d(i * Size - Dist, -Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tnsVertex3d(i * Size - Dist, Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(1,1); glEnable(GL_BLEND); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsUseShader(T->FloorShader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsEnableShaderv(T->FloorShader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    tnsPackAs(GL_LINES); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsVertex3d(-10000,10000,0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsVertex3d(10000,10000,0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsVertex3d(10000,-10000,0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsVertex3d(-10000,-10000,0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsPackAs(GL_TRIANGLE_FAN); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsFlush(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsUseShader(T->immShader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    tnsEnableShaderv(T->immShader); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    glDisable(GL_POLYGON_OFFSET_FILL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //for (i; i < Lim; i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //    if (i == Span && ShowAxis[0]) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //    tnsVertex3d(-Dist, i * Size - Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //    tnsVertex3d(Dist, i * Size - Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //for (i = 0; i < Lim; i++){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //    if (i == Span && ShowAxis[1]) continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //    tnsVertex3d(i * Size - Dist, -Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //    tnsVertex3d(i * Size - Dist, Dist, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //tnsPackAs(GL_LINES); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (ShowAxis[0]){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tnsColor4d(1, 0, 0, 1); 
			 |