mirror of
https://github.com/Sneed-Group/Poodletooth-iLand
synced 2024-11-01 01:07:54 +00:00
146 lines
5.9 KiB
Python
146 lines
5.9 KiB
Python
"""
|
|
This is the module for curve edit
|
|
"""
|
|
|
|
from pandac.PandaModules import *
|
|
from direct.wxwidgets.WxPandaShell import *
|
|
from direct.showbase.DirectObject import *
|
|
from direct.directtools.DirectSelection import SelectionRay
|
|
from direct.showutil.Rope import Rope
|
|
from ActionMgr import *
|
|
from direct.task import Task
|
|
import ObjectGlobals as OG
|
|
|
|
class CurveEditor(DirectObject):
|
|
""" CurveEditor will create and edit the curve """
|
|
def __init__(self, editor):
|
|
self.editor = editor
|
|
self.i = 0
|
|
self.ropeNum = 0
|
|
self.curve = []
|
|
self.curveControl = []
|
|
self.currentRope = None
|
|
self.degree = 3
|
|
|
|
def createCurve(self):
|
|
if self.editor.mode == self.editor.CREATE_CURVE_MODE:
|
|
self.view = self.editor.ui.currentView
|
|
|
|
#Get the mouse position
|
|
x = base.direct.dr.mouseX
|
|
y = base.direct.dr.mouseY
|
|
|
|
if self.editor.fMoveCamera == False and self.view != None:
|
|
self.createControler(x,y)
|
|
if self.currentRope != None:
|
|
self.currentRope.detachNode()
|
|
self.ropeUpdate(self.curve)
|
|
self.accept("DIRECT-enter", self.onBaseMode)
|
|
|
|
self.accept("DIRECT-enter", self.onBaseMode)
|
|
|
|
def editCurve(self, task):
|
|
if self.editor.mode == self.editor.EDIT_CURVE_MODE:
|
|
if self.editor.fMoveCamera == False:
|
|
self.selected = None
|
|
self.selected = base.direct.selected.last
|
|
if self.selected != None:
|
|
for item in self.curveControl:
|
|
if item[1] == self.selected:
|
|
self.point = item #temporarily save the controler information for further use
|
|
self.currentCurve = self.currentRope.ropeNode.getCurve()
|
|
self.currentCurve.setVertex(item[0], self.selected.getPos())
|
|
self.accept("DIRECT-delete", self.onControlerDelete)
|
|
return task.cont
|
|
|
|
def onControlerDelete(self):
|
|
if self.editor.mode == self.editor.EDIT_CURVE_MODE:
|
|
self.curve.remove(self.curve[self.point[0]])
|
|
#reset the controller list
|
|
for item in self.curveControl:
|
|
if item[0] > self.point[0]:
|
|
newname = 'controler%d' % (item[0]-1)
|
|
item[1].setName(newname)
|
|
self.curveControl[item[0]] = (item[0]-1, item[1])
|
|
self.curveControl.remove(self.point)
|
|
self.currentRope.setup(self.degree,self.curve)
|
|
|
|
def ropeUpdate(self, curve):
|
|
self.currentRope = Rope()
|
|
self.currentRope.setup(self.degree, curve)
|
|
self.currentRope.reparentTo(render)
|
|
|
|
def onBaseMode(self):
|
|
self.editor.preMode = self.editor.mode
|
|
self.editor.mode = self.editor.BASE_MODE
|
|
self.editor.ui.editCurveMenuItem.Check(False)
|
|
self.editor.ui.createCurveMenuItem.Check(False)
|
|
self.i = 0
|
|
for item in self.curveControl:
|
|
item[1].hide()
|
|
if self.editor.preMode == self.editor.BASE_MODE :
|
|
pass
|
|
if self.editor.preMode == self.editor.CREATE_CURVE_MODE :
|
|
self.updateScene()
|
|
if self.editor.preMode == self.editor.EDIT_CURVE_MODE :
|
|
self.doneEdit()
|
|
self.curveControl = []
|
|
self.curve = []
|
|
self.currentRope = None
|
|
base.direct.manipulationControl.enableManipulation()
|
|
self.editor.ui.createCurveMenuItem.Check(False)
|
|
self.editor.ui.editCurveMenuItem.Check(False)
|
|
|
|
def updateScene(self):
|
|
curveObjNP = self.editor.objectMgr.addNewCurve(self.curveControl, self.degree, nodePath=self.currentRope)
|
|
curveObj = self.editor.objectMgr.findObjectByNodePath(curveObjNP)
|
|
for item in self.curveControl:
|
|
item[1].reparentTo(curveObjNP)
|
|
self.editor.objectMgr.updateObjectPropValue(curveObj, 'Degree', self.degree, fSelectObject=False, fUndo=False)
|
|
|
|
def doneEdit(self):
|
|
base.direct.selected.last = None
|
|
|
|
def createControler(self, x, y):
|
|
if self.view != None:
|
|
self.controler = render.attachNewNode("controler")
|
|
self.controler = loader.loadModel('models/misc/smiley')
|
|
controlerPathname = 'controler%d' % self.i
|
|
self.controler.setName(controlerPathname)
|
|
self.controler.setColor(0, 0, 0, 1)
|
|
self.controler.setScale(0.2)
|
|
self.controler.reparentTo(render)
|
|
self.controler.setTag('OBJRoot','1')
|
|
self.controler.setTag('Controller','1') #controller Tag
|
|
self.i += 1
|
|
|
|
iRay = SelectionRay(self.view.camera)
|
|
iRay.collider.setFromLens(self.view.camNode, x, y)
|
|
iRay.collideWithBitMask(BitMask32.bit(21))
|
|
iRay.ct.traverse(self.view.collPlane)
|
|
if iRay.getNumEntries() > 0:
|
|
entry = iRay.getEntry(0)
|
|
hitPt = entry.getSurfacePoint(entry.getFromNodePath())
|
|
|
|
if hitPt:
|
|
# create a temp nodePath to get the position
|
|
np = NodePath('temp')
|
|
np.setPos(self.view.camera, hitPt)
|
|
|
|
if base.direct.manipulationControl.fGridSnap:
|
|
snappedPos = self.view.grid.computeSnapPoint(np.getPos())
|
|
np.setPos(snappedPos)
|
|
|
|
# update temp nodePath's HPR and scale with newobj's
|
|
np.setHpr(self.controler.getHpr())
|
|
np.setScale(self.controler.getScale())
|
|
|
|
# transform newobj to cursor position
|
|
self.controler.setMat(Mat4(np.getMat()))
|
|
np.remove()
|
|
iRay.collisionNodePath.removeNode()
|
|
del iRay
|
|
|
|
self.curve.append((None, self.controler.getPos()))
|
|
self.curveControl.append((self.i-1, self.controler))
|
|
|