Browse Source

Made new object will be created at the cursor position

Gyedo Jeon 16 years ago
parent
commit
a8e3a84af8
1 changed files with 37 additions and 3 deletions
  1. 37 3
      direct/src/leveleditor/LevelEditorUI.py

+ 37 - 3
direct/src/leveleditor/LevelEditorUI.py

@@ -4,6 +4,7 @@ from wx.lib.agw import fourwaysplitter as FWS
 
 from pandac.PandaModules import *
 from direct.wxwidgets.WxAppShell import *
+from direct.directtools.DirectSelection import SelectionRay
 
 from ViewPort import *
 from ObjectPaletteUI import *
@@ -15,14 +16,44 @@ from ProtoPaletteUI import *
 from ActionMgr import *
 
 class PandaTextDropTarget(wx.TextDropTarget):
-    def __init__(self, editor):
+    def __init__(self, editor, view):
         wx.TextDropTarget.__init__(self)
         self.editor = editor
+        self.view = view
 
     def OnDropText(self, x, y, text):
+        # create new object
         action = ActionAddNewObj(self.editor, text)
         self.editor.actionMgr.push(action)
+        newobj = action()
+
+        # change window coordinate to mouse coordinate
+        mx = 2 * (x/float(self.view.ClientSize.GetWidth()) - 0.5)
+        my = -2 * (y/float(self.view.ClientSize.GetHeight()) - 0.5)
+
+        # create ray from the camera to detect 3d position
+        iRay = SelectionRay(self.view.camera)
+        iRay.collider.setFromLens(self.view.camNode, mx, my)
+        iRay.collideWithGeom()
+        iRay.ct.traverse(self.view.grid)
+        entry = iRay.getEntry(0)
+        hitPt = entry.getSurfacePoint(entry.getFromNodePath())
+
+        # create a temp nodePath to get the position
+        np = hidden.attachNewNode('temp')
+        np.setPos(self.view.camera, hitPt)
+
+        # update temp nodePath's HPR and scale with newobj's
+        np.setHpr(newobj.getHpr())
+        np.setScale(newobj.getScale())
+
+        # transform newobj to cursor position
+        obj = self.editor.objectMgr.findObjectByNodePath(newobj)
+        action = ActionTransformObj(self.editor, obj[OG.OBJ_UID], Mat4(np.getMat()))
+        self.editor.actionMgr.push(action)
+        np.remove()
         action()
+        del iRay
 
 class LevelEditorUI(WxAppShell):
     """ Class for Panda3D LevelEditor """ 
@@ -112,8 +143,11 @@ class LevelEditorUI(WxAppShell):
         self.mainFrame.SplitVertically(self.leftFrame, self.baseFrame, 200)
         self.baseFrame.SplitVertically(self.viewFrame, self.rightFrame, 600)
         
-        self.viewFrame.SetDropTarget(PandaTextDropTarget(self.editor))
-
+        self.topView.SetDropTarget(PandaTextDropTarget(self.editor, self.topView))
+        self.frontView.SetDropTarget(PandaTextDropTarget(self.editor, self.frontView))
+        self.leftView.SetDropTarget(PandaTextDropTarget(self.editor, self.leftView))
+        self.perspView.SetDropTarget(PandaTextDropTarget(self.editor, self.perspView))
+        
         self.leftFrame.SetSashGravity(0.5)
         self.leftBarUpFrame.SetSashGravity(0.5)
         self.rightFrame.SetSashGravity(0.5)