diff --git a/direct/src/leveleditor/LevelEditorBase.py b/direct/src/leveleditor/LevelEditorBase.py index f56efbeb1c..0d4351e871 100755 --- a/direct/src/leveleditor/LevelEditorBase.py +++ b/direct/src/leveleditor/LevelEditorBase.py @@ -30,6 +30,7 @@ class LevelEditorBase(DirectObject): self.fileMgr = FileMgr(self) self.actionMgr = ActionMgr() + self.NPParent = render # define your own config file in inherited class self.settingsFile = None @@ -262,6 +263,7 @@ class LevelEditorBase(DirectObject): return base.direct.deselectAll() + self.ui.reset() self.objectMgr.reset() self.actionMgr.reset() self.ui.perspView.camera.setPos(-19, -19, 19) diff --git a/direct/src/leveleditor/LevelEditorUIBase.py b/direct/src/leveleditor/LevelEditorUIBase.py index 160188f152..ac6b5e415d 100755 --- a/direct/src/leveleditor/LevelEditorUIBase.py +++ b/direct/src/leveleditor/LevelEditorUIBase.py @@ -84,6 +84,7 @@ class PandaTextDropTarget(wx.TextDropTarget): self.editor.actionMgr.push(action) np.remove() action() + iRay.collisionNodePath.removeNode() del iRay ID_NEW = 101 @@ -361,11 +362,13 @@ class LevelEditorUIBase(WxAppShell): self.wxApp.ProcessIdle() if task != None: return task.cont - def onNew(self, evt=None): - self.editor.reset() + def reset(self): self.sceneGraphUI.reset() self.layerEditorUI.reset() + def onNew(self, evt=None): + self.editor.reset() + def onOpen(self, evt=None): dialog = wx.FileDialog(None, "Choose a file", os.getcwd(), "", "*.py", wx.OPEN) if dialog.ShowModal() == wx.ID_OK: diff --git a/direct/src/leveleditor/ObjectMgr.py b/direct/src/leveleditor/ObjectMgr.py index bce9c6f527..30cd632456 100755 --- a/direct/src/leveleditor/ObjectMgr.py +++ b/direct/src/leveleditor/ObjectMgr.py @@ -2,14 +2,14 @@ Defines ObjectMgr """ -import os, time, wx +import os, time, wx, types from direct.task import Task from direct.actor.Actor import Actor from pandac.PandaModules import * from ActionMgr import * import ObjectGlobals as OG - +from ObjectPaletteBase import ObjectGen class ObjectMgr: """ ObjectMgr will create, manage, update objects in the scene """ @@ -64,10 +64,10 @@ class ObjectMgr: self.lastUidMod = 0 return newUid - def addNewObject(self, typeName, uid = None, model = None, parent=None, anim = None, fSelectObject=True): + def addNewObject(self, typeName, uid = None, model = None, parent=None, anim = None, fSelectObject=True, nodePath=None): """ function to add new obj to the scene """ if parent is None: - parent = render + parent = self.editor.NPParent if self.editor: objDef = self.editor.objectPalette.findItem(typeName) @@ -79,38 +79,44 @@ class ObjectMgr: objDef = base.protoPalette.findItem(typeName) newobj = None if objDef and type(objDef) != dict: - if objDef.createFunction: - funcName = objDef.createFunction[OG.FUNC_NAME] - funcArgs = objDef.createFunction[OG.FUNC_ARGS] - if funcName.startswith('.'): - # when it's using default objectHandler - if self.editor: - func = Functor(eval("base.le.objectHandler%s"%funcName)) - else: # when loaded outside of LE - func = Functor(eval("base.objectHandler%s"%funcName)) + if nodePath is None: + if objDef.createFunction: + funcName = objDef.createFunction[OG.FUNC_NAME] + funcArgs = objDef.createFunction[OG.FUNC_ARGS] + if type(funcName) == types.StringType: + if funcName.startswith('.'): + # when it's using default objectHandler + if self.editor: + func = Functor(eval("self.editor.objectHandler%s"%funcName)) + else: # when loaded outside of LE + func = Functor(eval("base.objectHandler%s"%funcName)) + else: + # when it's not using default objectHandler, whole name of the handling obj + # should be included in function name + func = Functor(eval(funcName)) + else: + func = funcName + # create new obj using function and keyword arguments defined in ObjectPalette + newobj = func(**funcArgs) + elif objDef.actor: + if model is None: + model = objDef.model + try: + newobj = Actor(model) + except: + newobj = Actor(Filename.fromOsSpecific(model).getFullpath()) + elif objDef.model is not None: + # since this obj is simple model let's load the model + if model is None: + model = objDef.model + try: + newobj = loader.loadModel(model) + except: + newobj = loader.loadModel(Filename.fromOsSpecific(model).getFullpath()) else: - # when it's not using default objectHandler, whole name of the handling obj - # should be included in function name - func = Functor(eval(funcName)) - - # create new obj using function and keyword arguments defined in ObjectPalette - newobj = func(**funcArgs) - elif objDef.actor: - if model is None: - model = objDef.model - try: - newobj = Actor(model) - except: - newobj = Actor(Filename.fromOsSpecific(model).getFullpath()) - elif objDef.model is not None: - # since this obj is simple model let's load the model - if model is None: - model = objDef.model - try: - newobj = loader.loadModel(model) - except: - newobj = loader.loadModel(Filename.fromOsSpecific(model).getFullpath()) - + newobj = hidden.attachNewNode(objDef.name) + else: + newobj = nodePath i = 0 for i in range(len(objDef.anims)): animFile = objDef.anims[i] @@ -499,16 +505,20 @@ class ObjectMgr: kwargs[key] = funcArgs[key] undoKwargs[key] = funcArgs[key] - if funcName.startswith('.'): - if self.editor: - func = Functor(eval("base.le.objectHandler%s"%funcName), **kwargs) - undoFunc = Functor(eval("base.le.objectHandler%s"%funcName), **undoKwargs) - else: # when loaded outside of LE - func = Functor(eval("base.objectHandler%s"%funcName), **kwargs) - undoFunc = Functor(eval("base.objectHandler%s"%funcName), **undoKwargs) + if type(funcName) == types.StringType: + if funcName.startswith('.'): + if self.editor: + func = Functor(eval("self.editor.objectHandler%s"%funcName), **kwargs) + undoFunc = Functor(eval("self.editor.objectHandler%s"%funcName), **undoKwargs) + else: # when loaded outside of LE + func = Functor(eval("base.objectHandler%s"%funcName), **kwargs) + undoFunc = Functor(eval("base.objectHandler%s"%funcName), **undoKwargs) + else: + func = Functor(eval(funcName), **kwargs) + undoFunc = Functor(eval(funcName), **undoKwargs) else: - func = Functor(eval(funcName), **kwargs) - undoFunc = Functor(eval(funcName), **undoKwargs) + func = Functor(funcName, **kwargs) + undoFunc = Functor(funcName, **undoKwargs) # finally call update function #func(**kwargs) diff --git a/direct/src/leveleditor/SceneGraphUIBase.py b/direct/src/leveleditor/SceneGraphUIBase.py index 35d8887b25..f7950f9ce3 100755 --- a/direct/src/leveleditor/SceneGraphUIBase.py +++ b/direct/src/leveleditor/SceneGraphUIBase.py @@ -125,7 +125,10 @@ class SceneGraphUIBase(wx.Panel): else: parent = self.traverse(self.root, parentObj[OG.OBJ_UID]) - namestr = "%s_%s"%(obj[OG.OBJ_DEF].name, obj[OG.OBJ_UID]) + name = NodePath(item).getName() + if not name: + name = ' ' + namestr = "%s_%s_%s"%(obj[OG.OBJ_DEF].name, name, obj[OG.OBJ_UID]) newItem = self.tree.AppendItem(parent, namestr) self.tree.SetItemPyData(newItem, obj[OG.OBJ_UID]) @@ -257,6 +260,17 @@ class SceneGraphUIBase(wx.Panel): if not self.tree.IsSelected(item): self.tree.SelectItem(item) + def changeLabel(self, itemId, newName): + item = self.traverse(self.root, itemId) + if item: + obj = self.editor.objectMgr.findObjectById(itemId) + if obj is None: + return + + obj[OG.OBJ_NP].setName(newName) + namestr = "%s_%s_%s"%(obj[OG.OBJ_DEF].name, newName, obj[OG.OBJ_UID]) + self.tree.SetItemText(item, namestr) + def deSelect(self, itemId): item = self.traverse(self.root, itemId) if item is not None: