ya2 · news · projects · code · about

test handle
[pmachines.git] / pmachines / editor / scene.py
index b2d3795e2677073bfd3dd92dd26e58aa135f0cb5..127cee682688b898e56336761ed1ff5bc6a48e47 100644 (file)
@@ -14,17 +14,21 @@ from direct.gui.DirectGuiGlobals import FLAT, NORMAL
 from direct.gui.OnscreenText import OnscreenText
 from direct.showbase.DirectObject import DirectObject
 from pmachines.items.item import Item
+from pmachines.items.test_item import PixelSpaceTestItem, WorldSpaceTestItem
 from pmachines.editor.scene_list import SceneList
-from pmachines.editor.inspector import Inspector
+from pmachines.editor.inspector import Inspector, PixelSpaceInspector, WorldSpaceInspector
 from pmachines.editor.start_items import StartItems
+from ya2.p3d.gfx import P3dGfxMgr
 
 
 class SceneEditor(DirectObject):
 
-    def __init__(self, json, json_name, context, add_item, items):
+    def __init__(self, json, json_name, context, add_item, items, world, mouse_plane_node):
         super().__init__()
         self.__items = items
         self.__json = json
+        self.__world = world
+        self.__mouse_plane_node = mouse_plane_node
         if not json_name:
             self.__json = json = {
                 'name': '',
@@ -190,17 +194,48 @@ class SceneEditor(DirectObject):
             frameColor=fcols[0],
             rolloverSound=loader.load_sfx('assets/audio/sfx/rollover.ogg'),
             clickSound=loader.load_sfx('assets/audio/sfx/click.ogg'))
+        self.__test_items = []
+        self.__set_test_items()
         messenger.send('editor-start')
         self.accept('editor-item-click', self.__on_item_click)
         self.accept('editor-inspector-destroy', self.__on_inspector_destroy)
         self.accept('editor-start-items-save', self.__on_start_items_save)
         self.accept('editor-start-items-destroy', self.__on_start_items_destroy)
 
+    def __set_test_items(self):
+        for pixel_space_item in self.__json['test_items']['pixel_space']:
+            print(pixel_space_item['id'], pixel_space_item['position'])
+            pos_pixel = pixel_space_item['position']
+            win_res = base.win.getXSize(), base.win.getYSize()
+            pos_win = (pos_pixel[0] / win_res[0] * 2 - 1,
+                       1 - pos_pixel[1] / win_res[1] * 2)
+            p_from, p_to = P3dGfxMgr.world_from_to(pos_win)
+            hits = self.__world.ray_test_all(p_from, p_to).get_hits()
+            for hit in self.__world.ray_test_all(p_from, p_to).get_hits():
+                if hit.get_node() == self.__mouse_plane_node:
+                    pos = hit.get_hit_pos()
+            self.__set_test_item(pos, pixel_space_item, PixelSpaceTestItem)
+        for world_space_item in self.__json['test_items']['world_space']:
+            print(world_space_item['id'], world_space_item['position'])
+            self.__set_test_item(world_space_item['position'], world_space_item, WorldSpaceTestItem)
+
+    def __set_test_item(self, pos, json, item_class):
+        test_item = item_class(
+            self.__context.world,
+            self.__context.plane_node,
+            self.__context.cb_inst,
+            self.__context.curr_bottom,
+            self.__context.repos,
+            json,
+            pos=(pos[0], 0, pos[-1]),
+            model_scale=.2)
+        self.__test_items += [test_item]
+
     def __on_close(self):
         self.__json['name'] = self.__name_entry.get()
         self.__json['instructions'] = self.__instructions_entry.get()
         if self.__compute_hash() == self.__json['version']:
-            self._frm.destroy()
+            self.destroy()
         else:
             self.__dialog = YesNoDialog(dialogName='Unsaved changes',
                                         text=_('You have unsaved changes. Really quit?'),
@@ -221,18 +256,29 @@ class SceneEditor(DirectObject):
     def __on_new_item(self, item):
         info(f'new {item}')
         item_json = {}
+        scale = 1
+        if item in ['PixelSpaceTestItem', 'WorldSpaceTestItem']:
+            scale = .2
         _item = self.__new_items[item](
             self.__context.world,
             self.__context.plane_node,
             self.__context.cb_inst,
             self.__context.curr_bottom,
             self.__context.repos,
-            item_json)
+            item_json,
+            model_scale=scale)
         _item._Item__editing = True
         self.__add_item(_item)
         item_json['class'] = _item.__class__.__name__
         item_json['position'] = list(_item._np.get_pos())
-        self.__json['items'] += [item_json]
+        if item == 'PixelSpaceTestItem':
+            del item_json['class']
+            self.__json['test_items']['pixel_space'] += [item_json]
+        elif item == 'WorldSpaceTestItem':
+            del item_json['class']
+            self.__json['test_items']['world_space'] += [item_json]
+        else:
+            self.__json['items'] += [item_json]
 
     def __actually_close(self, arg):
         if arg:
@@ -270,7 +316,12 @@ class SceneEditor(DirectObject):
         if self.__inspector and self.__inspector.item == item: return
         if self.__inspector:
             self.__inspector.destroy()
-        self.__inspector = Inspector(item, self.__items)
+        if item.__class__ == PixelSpaceTestItem:
+            self.__inspector = PixelSpaceInspector(item, self.__items)
+        elif item.__class__ == WorldSpaceTestItem:
+            self.__inspector = WorldSpaceInspector(item, self.__items)
+        else:
+            self.__inspector = Inspector(item, self.__items)
 
     def __on_inspector_destroy(self):
         self.__inspector = None
@@ -290,6 +341,10 @@ class SceneEditor(DirectObject):
     def __on_start_items_destroy(self):
         self.__start_items = None
 
+    @property
+    def test_items(self):
+        return self.__test_items
+
     def destroy(self):
         self._frm.destroy()
         if self.__inspector:
@@ -298,3 +353,5 @@ class SceneEditor(DirectObject):
         self.ignore('editor-inspector-destroy')
         self.ignore('editor-start-items-save')
         self.ignore('editor-start-items-destroy')
+        for t in self.__test_items: t.destroy()
+        self.__test_items = []