| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  | import bpy, blf, bgl, os, gpu | 
					
						
							|  |  |  | from gpu_extras.batch import batch_for_shader | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ViewportDraw: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def __init__(self, context, text): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bakefile = "TLM_Overlay.png" | 
					
						
							|  |  |  |         scriptDir = os.path.dirname(os.path.realpath(__file__)) | 
					
						
							|  |  |  |         bakefile_path = os.path.abspath(os.path.join(scriptDir, '..', '..', 'assets', bakefile)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         image_name = "TLM_Overlay.png" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         bpy.ops.image.open(filepath=bakefile_path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         print("Self path: " + bakefile_path) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for img in bpy.data.images: | 
					
						
							|  |  |  |             if img.filepath.endswith(image_name): | 
					
						
							|  |  |  |                 image = img | 
					
						
							|  |  |  |                 break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not image: | 
					
						
							|  |  |  |             image = bpy.data.images[image_name] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         x = 15 | 
					
						
							|  |  |  |         y = 15 | 
					
						
							|  |  |  |         w = 400 | 
					
						
							|  |  |  |         h = 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-05-28 02:21:24 +00:00
										 |  |  |         if bpy.app.version[0] == 3: | 
					
						
							|  |  |  |             self.shader = gpu.shader.from_builtin('2D_IMAGE') | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             self.shader = gpu.shader.from_builtin('IMAGE') | 
					
						
							|  |  |  |              | 
					
						
							| 
									
										
										
										
											2025-01-22 16:18:30 +01:00
										 |  |  |         self.batch = batch_for_shader( | 
					
						
							|  |  |  |             self.shader, 'TRI_FAN', | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "pos": ((x, y), (x+w, y), (x+w, y+h), (x, y+h)), | 
					
						
							|  |  |  |                 "texCoord": ((0, 0), (1, 0), (1, 1), (0, 1)), | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if image.gl_load(): | 
					
						
							|  |  |  |             raise Exception() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.text = text | 
					
						
							|  |  |  |         self.image = image | 
					
						
							|  |  |  |         #self.handle = bpy.types.SpaceView3D.draw_handler_add(self.draw_text_callback, (context,), 'WINDOW', 'POST_PIXEL') | 
					
						
							|  |  |  |         self.handle2 = bpy.types.SpaceView3D.draw_handler_add(self.draw_image_callback, (context,), 'WINDOW', 'POST_PIXEL') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def draw_text_callback(self, context): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         font_id = 0 | 
					
						
							|  |  |  |         blf.position(font_id, 15, 15, 0) | 
					
						
							|  |  |  |         blf.size(font_id, 20, 72) | 
					
						
							|  |  |  |         blf.draw(font_id, "%s" % (self.text)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def draw_image_callback(self, context): | 
					
						
							|  |  |  |          | 
					
						
							|  |  |  |         if self.image: | 
					
						
							|  |  |  |             bgl.glEnable(bgl.GL_BLEND) | 
					
						
							|  |  |  |             bgl.glActiveTexture(bgl.GL_TEXTURE0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             try: | 
					
						
							|  |  |  |                 bgl.glBindTexture(bgl.GL_TEXTURE_2D, self.image.bindcode) | 
					
						
							|  |  |  |             except: | 
					
						
							|  |  |  |                 bpy.types.SpaceView3D.draw_handler_remove(self.handle2, 'WINDOW') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             self.shader.bind() | 
					
						
							|  |  |  |             self.shader.uniform_int("image", 0) | 
					
						
							|  |  |  |             self.batch.draw(self.shader) | 
					
						
							|  |  |  |             bgl.glDisable(bgl.GL_BLEND) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def update_text(self, text): | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         self.text = text | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def remove_handle(self): | 
					
						
							|  |  |  |         #bpy.types.SpaceView3D.draw_handler_remove(self.handle, 'WINDOW') | 
					
						
							|  |  |  |         bpy.types.SpaceView3D.draw_handler_remove(self.handle2, 'WINDOW') |