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': '',
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?'),
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:
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
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:
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 = []