fix for changes in the api
[blender-addons-contrib.git] / space_view3d_game_props_visualiser.py
1 # ##### BEGIN GPL LICENSE BLOCK #####
2 #
3 #  This program is free software; you can redistribute it and/or
4 #  modify it under the terms of the GNU General Public License
5 #  as published by the Free Software Foundation; either version 2
6 #  of the License, or (at your option) any later version.
7 #
8 #  This program is distributed in the hope that it will be useful,
9 #  but WITHOUT ANY WARRANTY; without even the implied warranty of
10 #  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11 #  GNU General Public License for more details.
12 #
13 #  You should have received a copy of the GNU General Public License
14 #  along with this program; if not, write to the Free Software Foundation,
15 #  Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
16 #
17 # ##### END GPL LICENSE BLOCK #####
18
19 # <pep8 compliant>
20
21
22 bl_addon_info = {
23     'name': 'Game Property Visualiser',
24     'author': 'Bartius Crouch/Vilem Novak',
25     'version': (2,4),
26     'blender': (2, 5, 3),
27     'api': 31667,
28     'location': 'View3D > Properties panel > Display tab',
29     'description': 'Display the game properties next to selected objects '\
30         'in the 3d-view',
31     'wiki_url': 'http://wiki.blender.org/index.php/Extensions:2.5/Py/'\
32         'Scripts/Index_Visualiser',
33     'tracker_url': 'http://projects.blender.org/tracker/index.php?'\
34         'func=detail&aid=21557&group_id=153&atid=468',
35     'category': '3D View'}
36
37 """
38 Displays game properties next to selected objects(under name)
39
40 How to use:
41     just toggle the button 'Visualise game props' in the right side panel
42 """
43
44 import bgl
45 import blf
46 import bpy
47 import mathutils
48
49
50 # calculate locations and store them as ID property in the mesh
51 def calc_callback(self, context):
52     # polling
53     if context.mode == 'EDIT_MESH':
54         return
55     
56     # get screen information
57     mid_x = context.region.width/2.0
58     mid_y = context.region.height/2.0
59     width = context.region.width
60     height = context.region.height
61     
62     # get matrices
63     view_mat = context.space_data.region_3d.perspective_matrix
64
65     ob_mat = context.active_object.matrix_world
66     total_mat = view_mat*ob_mat
67     
68     # calculate location info
69     texts = []
70     
71     # uncomment 2 lines below, to enable live updating of the selection
72     #ob=context.active_object
73     for ob in context.selected_objects:
74         locs = []
75         ob_mat = ob.matrix_world
76         total_mat = view_mat*ob_mat
77  
78         for p in ob.game.properties:
79           d=0.0#{'data':p.name+':'+str(p.value)}
80          #print (d)
81           locs.append([ mathutils.Vector([0,0,0]).resize4D()])
82     
83     
84         for loc in locs:
85     
86             vec = total_mat*loc[0] # order is important
87             # dehomogenise
88             vec = mathutils.Vector((vec[0]/vec[3],vec[1]/vec[3],vec[2]/vec[3]))
89             x = int(mid_x + vec[0]*width/2.0)
90             y = int(mid_y + vec[1]*height/2.0)
91             texts+=[x, y]
92         
93
94     # store as ID property in mesh
95     #print (texts)
96     context.scene['GamePropsVisualiser'] = texts
97
98
99 # draw in 3d-view
100 def draw_callback(self, context):
101     # polling
102     if context.mode == 'EDIT_MESH':
103         return
104     # retrieving ID property data
105     try:
106         #print(context.scene['GamePropsVisualiser'])
107         texts = context.scene['GamePropsVisualiser']
108         
109     except:
110         return
111     if not texts:
112         return
113     
114     # draw
115     i=0
116
117     blf.size(0, 12, 72)
118    
119         
120     bgl.glColor3f(1.0,1.0,1.0)
121     for ob in bpy.context.selected_objects:
122         for pi,p in enumerate(ob.game.properties):
123             blf.position(0, texts[i], texts[i+1]-(pi+1)*14, 0)
124             if p.type=='FLOAT':
125                 t=p.name+':  '+ str('%g'% p.value)
126             else:    
127                 t=p.name+':  '+ str(p.value)
128             blf.draw(0, t)
129             i+=2
130
131
132 # operator
133 class GamePropertyVisualiser(bpy.types.Operator):
134     bl_idname = "view3d.game_props_visualiser"
135     bl_label = "Game Properties Visualiser"
136     bl_description = "Toggle the visualisation of game properties"
137     
138     @classmethod
139     def poll(cls, context):
140         return context.mode!='EDIT_MESH'
141     
142     def modal(self, context, event):
143         context.area.tag_redraw()
144
145         # removal of callbacks when operator is called again
146         #print(context.scene.display_game_properties)
147         if context.scene.display_game_properties == -1:
148            # print('deinit2')
149
150             context.scene.display_game_properties = 0
151             context.region.callback_remove(self.handle1)
152             context.region.callback_remove(self.handle2)
153             context.scene.display_game_properties = 0
154             
155             return {'FINISHED'}
156         
157         return {'PASS_THROUGH'}
158     
159     def invoke(self, context, event):
160         if context.area.type == 'VIEW_3D':
161             print(context.scene.display_game_properties)
162             if context.scene.display_game_properties == 0 or context.scene.display_game_properties == -1:
163                 print('init')
164                 # operator is called for the first time, start everything
165                 context.scene.display_game_properties = 1
166                 context.window_manager.add_modal_handler(self)
167                 self.handle1 = context.region.callback_add(calc_callback,
168                     (self, context), 'POST_VIEW')
169                 self.handle2 = context.region.callback_add(draw_callback,
170                     (self, context), 'POST_PIXEL')
171                 return {'RUNNING_MODAL'}
172             else:
173                 # operator is called again, stop displaying
174                 context.scene.display_game_properties = -1
175                 #print(dir(self))
176                 #
177                 return {'RUNNING_MODAL'}
178         else:
179             self.report({'WARNING'}, "View3D not found, can't run operator")
180             return {'CANCELLED'}
181
182
183 # defining the panel
184 def menu_func(self, context):
185     col = self.layout.column(align=True)
186     col.operator(GamePropertyVisualiser.bl_idname, text="Visualise game props")
187     self.layout.separator()
188
189
190 def register():
191     bpy.types.Scene.display_game_properties = bpy.props.IntProperty(name='Visualise Game Poperties')
192     bpy.types.VIEW3D_PT_view3d_display.prepend(menu_func)
193
194 def unregister():
195     del bpy.types.Scene.display_game_properties
196     bpy.types.VIEW3D_PT_view3d_display.remove(menu_func)
197
198 if __name__ == "__main__":
199     register()