ya2 · news · projects · code · about

new item
[pmachines.git] / pmachines / scene.py
index 035ea0e80b27014676a4ca62e1ac0bf61a6d0750..612ddde590bef390ba682db700cfca1835faa281 100644 (file)
@@ -2,6 +2,7 @@ from os.path import exists
 from os import makedirs
 from logging import info
 from json import loads
+from collections import namedtuple
 from panda3d.core import AmbientLight, Texture, TextPropertiesManager, \
     TextNode, Spotlight, PerspectiveLens, BitMask32, NodePath
 from panda3d.bullet import BulletPlaneShape, BulletGhostNode
@@ -73,6 +74,7 @@ class Scene(DirectObject):
         self._scene_tsk = taskMgr.add(self.on_frame, 'on_frame')
         if auto_start_editor:
             self._set_editor()
+        self.accept('editor-inspector-delete', self.__on_inspector_delete)
 
     @classmethod
     def filename(cls, scene_name):
@@ -126,24 +128,7 @@ class Scene(DirectObject):
             if 'friction' in item:
                 args['friction'] = item['friction']
             self.items += [self.__code2class(item['class'])(**args)]
-        for item in self.json['fixed_items']:
-            args = {
-                'world': self._world,
-                'plane_node': self._mouse_plane_node,
-                'cb_inst': self.cb_inst,
-                'curr_bottom': self.current_bottom,
-                'repos': self.repos,
-                'json': item,
-                'mass': 0}
-            args['pos'] = tuple(item['position'])
-            if 'roll' in item:
-                args['r'] = item['roll']
-            if 'restitution' in item:
-                args['restitution'] = item['restitution']
-            if 'friction' in item:
-                args['friction'] = item['friction']
-            self.items += [self.__code2class(item['class'])(**args)]
-        for item in self.json['scene_items']:
+        for item in self.json['items']:
             args = {
                 'world': self._world,
                 'plane_node': self._mouse_plane_node,
@@ -160,6 +145,10 @@ class Scene(DirectObject):
                 args['r'] = item['roll']
             if 'model_scale' in item:
                 args['model_scale'] = item['model_scale']
+            if 'restitution' in item:
+                args['restitution'] = item['restitution']
+            if 'friction' in item:
+                args['friction'] = item['friction']
             self.items += [self.__code2class(item['class'])(**args)]
             if 'strategy' in item:
                 match item['strategy']:
@@ -794,5 +783,22 @@ class Scene(DirectObject):
         self._test_items += [NodePath(name)]
         self._test_items[-1].set_pos(pos[0], 0, pos[1])
 
+    def add_item(self, item):
+        self.items += [item]
+
     def _set_editor(self):
-        self.__scene_editor = SceneEditor(self.json, self.__json_name)
+        fields = ['world', 'plane_node', 'cb_inst', 'curr_bottom', 'repos', 'json']
+        SceneContext = namedtuple('SceneContext', fields)
+        context = SceneContext(
+            self._world,
+            self._mouse_plane_node,
+            self.cb_inst,
+            self.current_bottom,
+            self.repos,
+            {})
+        self.__scene_editor = SceneEditor(self.json, self.__json_name, context, self.add_item, self.items)
+
+    def __on_inspector_delete(self, item):
+        self.items.remove(item)
+        self.json['items'].remove(item.json)
+        item.destroy()