move into contrb > addons/space_view3d_game_props_visualiser.py
[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': '3D View: Game Property Visualiser',
24     'author': 'Bartius Crouch/Vilem Novak',
25     'version': '2.4 2010/06/07',
26     'blender': (2, 5, 3),
27     'category': '3D View',
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     'doc': """\
36 Displays game properties next to selected objects(under name)
37
38 -how to use:
39     just toggle the button 'Visualise game props' in the right side panel
40 """}
41
42
43 import bgl
44 import blf
45 import bpy
46 import mathutils
47
48
49 # calculate locations and store them as ID property in the mesh
50 def calc_callback(self, context):
51     # polling
52     if context.mode == 'EDIT_MESH':
53         return
54     
55     # get screen information
56     mid_x = context.region.width/2.0
57     mid_y = context.region.height/2.0
58     width = context.region.width
59     height = context.region.height
60     
61     # get matrices
62     view_mat = context.space_data.region_3d.perspective_matrix
63
64     ob_mat = context.active_object.matrix
65     total_mat = view_mat*ob_mat
66     
67     # calculate location info
68     texts = []
69     
70     # uncomment 2 lines below, to enable live updating of the selection
71     #ob=context.active_object
72     for ob in context.selected_objects:
73         locs = []
74         ob_mat = ob.matrix
75         total_mat = view_mat*ob_mat
76  
77         for p in ob.game.properties:
78           d=0.0#{'data':p.name+':'+str(p.value)}
79          #print (d)
80           locs.append([ mathutils.Vector([0,0,0]).resize4D()])
81     
82     
83         for loc in locs:
84     
85             vec = total_mat*loc[0] # order is important
86             # dehomogenise
87             vec = mathutils.Vector((vec[0]/vec[3],vec[1]/vec[3],vec[2]/vec[3]))
88             x = int(mid_x + vec[0]*width/2.0)
89             y = int(mid_y + vec[1]*height/2.0)
90             texts+=[x, y]
91         
92
93     # store as ID property in mesh
94     #print (texts)
95     context.scene['GamePropsVisualiser'] = texts
96
97
98 # draw in 3d-view
99 def draw_callback(self, context):
100     # polling
101     if context.mode == 'EDIT_MESH':
102         return
103     # retrieving ID property data
104     try:
105         #print(context.scene['GamePropsVisualiser'])
106         texts = context.scene['GamePropsVisualiser']
107         
108     except:
109         return
110     if not texts:
111         return
112     
113     # draw
114     i=0
115
116     blf.size(0, 12, 72)
117    
118         
119     bgl.glColor3f(1.0,1.0,1.0)
120     for ob in bpy.context.selected_objects:
121         for pi,p in enumerate(ob.game.properties):
122             blf.position(0, texts[i], texts[i+1]-(pi+1)*14, 0)
123             if p.type=='FLOAT':
124                 t=p.name+':  '+ str('%g'% p.value)
125             else:    
126                 t=p.name+':  '+ str(p.value)
127             blf.draw(0, t)
128             i+=2
129
130
131 # operator
132 class GamePropertyVisualiser(bpy.types.Operator):
133     bl_idname = "view3d.game_props_visualiser"
134     bl_label = "Game Properties Visualiser"
135     bl_description = "Toggle the visualisation of game properties"
136     
137    
138     def poll(self, context):
139         return context.mode!='EDIT_MESH'
140     
141     def modal(self, context, event):
142         context.area.tag_redraw()
143
144         # removal of callbacks when operator is called again
145         #print(context.scene.display_game_properties)
146         if context.scene.display_game_properties == -1:
147            # print('deinit2')
148
149             context.scene.display_game_properties = 0
150             context.region.callback_remove(self.handle1)
151             context.region.callback_remove(self.handle2)
152             context.scene.display_game_properties = 0
153             
154             return {'FINISHED'}
155         
156         return {'PASS_THROUGH'}
157     
158     def invoke(self, context, event):
159         if context.area.type == 'VIEW_3D':
160             print(context.scene.display_game_properties)
161             if context.scene.display_game_properties == 0 or context.scene.display_game_properties == -1:
162                 print('init')
163                 # operator is called for the first time, start everything
164                 context.scene.display_game_properties = 1
165                 context.manager.add_modal_handler(self)
166                 self.handle1 = context.region.callback_add(calc_callback,
167                     (self, context), 'POST_VIEW')
168                 self.handle2 = context.region.callback_add(draw_callback,
169                     (self, context), 'POST_PIXEL')
170                 return {'RUNNING_MODAL'}
171             else:
172                 # operator is called again, stop displaying
173                 context.scene.display_game_properties = -1
174                 #print(dir(self))
175                 #
176                 return {'RUNNING_MODAL'}
177         else:
178             self.report({'WARNING'}, "View3D not found, can't run operator")
179             return {'CANCELLED'}
180
181
182 # defining the panel
183 def menu_func(self, context):
184     
185     sce=context.scene
186     sce.IntProperty(name = 'visualise game properties' ,attr="display_game_properties", default=0)
187
188     col = self.layout.column(align=True)
189     col.operator(GamePropertyVisualiser.bl_idname, text="Visualise game props")
190     self.layout.separator()
191
192
193 def register():
194     bpy.types.register(GamePropertyVisualiser)
195     bpy.types.VIEW3D_PT_view3d_display.prepend(menu_func)
196
197
198 def unregister():
199     bpy.types.unregister(GamePropertyVisualiser)
200     bpy.types.VIEW3D_PT_view3d_display.remove(menu_func)
201
202
203 if __name__ == "__main__":
204     register()