|
@@ -109,7 +109,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
self.startStopHook = 'f6'
|
|
self.startStopHook = 'f6'
|
|
|
self.keyframeHook = 'f10'
|
|
self.keyframeHook = 'f10'
|
|
|
# Curve fitter object
|
|
# Curve fitter object
|
|
|
- self.startPos = Point3(0)
|
|
|
|
|
|
|
+ self.lastPos = Point3(0)
|
|
|
self.xyzCurveFitter = CurveFitter()
|
|
self.xyzCurveFitter = CurveFitter()
|
|
|
self.hprCurveFitter = CurveFitter()
|
|
self.hprCurveFitter = CurveFitter()
|
|
|
# Curve variables
|
|
# Curve variables
|
|
@@ -139,6 +139,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
self.desampleFrequency = 1
|
|
self.desampleFrequency = 1
|
|
|
self.numSamples = 100
|
|
self.numSamples = 100
|
|
|
self.recordStart = 0.0
|
|
self.recordStart = 0.0
|
|
|
|
|
+ self.deltaTime = 0.0
|
|
|
self.controlStart = 0.0
|
|
self.controlStart = 0.0
|
|
|
self.controlStop = 0.0
|
|
self.controlStop = 0.0
|
|
|
self.recordStop = 0.0
|
|
self.recordStop = 0.0
|
|
@@ -410,7 +411,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
widget = self.createEntryScale(
|
|
widget = self.createEntryScale(
|
|
|
resampleFrame, 'Resample', 'Num. Samples',
|
|
resampleFrame, 'Resample', 'Num. Samples',
|
|
|
'Number of samples in resampled curve',
|
|
'Number of samples in resampled curve',
|
|
|
- resolution = 1, max = 1000, command = self.setNumSamples,
|
|
|
|
|
|
|
+ resolution = 1, min = 2, max = 1000, command = self.setNumSamples,
|
|
|
side = LEFT)
|
|
side = LEFT)
|
|
|
widget.component('hull')['relief'] = RIDGE
|
|
widget.component('hull')['relief'] = RIDGE
|
|
|
widget.onRelease = widget.onReturnRelease = self.sampleCurve
|
|
widget.onRelease = widget.onReturnRelease = self.sampleCurve
|
|
@@ -744,6 +745,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
self.ignore(self.startStopHook)
|
|
self.ignore(self.startStopHook)
|
|
|
self.ignore(self.keyframeHook)
|
|
self.ignore(self.keyframeHook)
|
|
|
self.curveNodePath.reparentTo(self.recorderNodePath)
|
|
self.curveNodePath.reparentTo(self.recorderNodePath)
|
|
|
|
|
+ self.trace.reparentTo(self.recorderNodePath)
|
|
|
self.recorderNodePath.removeNode()
|
|
self.recorderNodePath.removeNode()
|
|
|
# Make sure markers are deselected
|
|
# Make sure markers are deselected
|
|
|
direct.deselect(self.playbackMarker)
|
|
direct.deselect(self.playbackMarker)
|
|
@@ -937,8 +939,11 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
# Keyframe mode?
|
|
# Keyframe mode?
|
|
|
if (self.samplingMode == 'Keyframe'):
|
|
if (self.samplingMode == 'Keyframe'):
|
|
|
# Record first point
|
|
# Record first point
|
|
|
- self.startPos = Point3(
|
|
|
|
|
- self['nodePath'].getPos(self.nodePathParent))
|
|
|
|
|
|
|
+ self.lastPos.assign(Point3(
|
|
|
|
|
+ self['nodePath'].getPos(self.nodePathParent)))
|
|
|
|
|
+ # Init delta time
|
|
|
|
|
+ self.deltaTime = 0.0
|
|
|
|
|
+ # Record first point
|
|
|
self.recordPoint(self.recordStart)
|
|
self.recordPoint(self.recordStart)
|
|
|
# Everything else
|
|
# Everything else
|
|
|
else:
|
|
else:
|
|
@@ -1010,15 +1015,19 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
# This will automatically add the first point
|
|
# This will automatically add the first point
|
|
|
self.toggleRecordVar()
|
|
self.toggleRecordVar()
|
|
|
else:
|
|
else:
|
|
|
- time = (self.recordStart +
|
|
|
|
|
- (Vec3(self['nodePath'].getPos(self.nodePathParent) -
|
|
|
|
|
- self.startPos).length()))
|
|
|
|
|
- # Did we move at all?
|
|
|
|
|
- if len(self.pointSet) > 0:
|
|
|
|
|
- if time == self.pointSet[-1][0]:
|
|
|
|
|
- print 'No delta'
|
|
|
|
|
- return
|
|
|
|
|
- self.recordPoint(time)
|
|
|
|
|
|
|
+ # Use distance as a time
|
|
|
|
|
+ pos = self['nodePath'].getPos(self.nodePathParent)
|
|
|
|
|
+ deltaPos = Vec3(pos - self.lastPos).length()
|
|
|
|
|
+ if deltaPos != 0:
|
|
|
|
|
+ # If we've moved at all, use delta Pos as time
|
|
|
|
|
+ self.deltaTime = self.deltaTime + deltaPos
|
|
|
|
|
+ else:
|
|
|
|
|
+ # Otherwise add one second
|
|
|
|
|
+ self.deltaTime = self.deltaTime + 1.0
|
|
|
|
|
+ # Record point at new time
|
|
|
|
|
+ self.recordPoint(self.recordStart + self.deltaTime)
|
|
|
|
|
+ # Update last pos
|
|
|
|
|
+ self.lastPos.assign(pos)
|
|
|
|
|
|
|
|
def easeInOut(self, t):
|
|
def easeInOut(self, t):
|
|
|
x = t * t
|
|
x = t * t
|
|
@@ -1320,16 +1329,23 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
cTime = state.currentTime + dTime
|
|
cTime = state.currentTime + dTime
|
|
|
# Stop task if not looping and at end of curve
|
|
# Stop task if not looping and at end of curve
|
|
|
# Or if refining curve and past recordStop
|
|
# Or if refining curve and past recordStop
|
|
|
- if (((self.loopPlayback == 0) & (cTime > self.maxT)) |
|
|
|
|
|
- ((self.recordingType.get() == 'Extend') & (cTime > self.maxT)) |
|
|
|
|
|
- ((self.recordingType.get() == 'Refine') &
|
|
|
|
|
- (cTime > self.recordStop))):
|
|
|
|
|
|
|
+ if ((self.recordingType.get() == 'Refine') &
|
|
|
|
|
+ (cTime > self.recordStop)):
|
|
|
|
|
+ # Go to recordStop
|
|
|
|
|
+ self.getWidget('Playback', 'Time').set(self.recordStop)
|
|
|
|
|
+ # Then stop playback
|
|
|
|
|
+ self.stopPlayback()
|
|
|
|
|
+ # Also kill record task
|
|
|
|
|
+ self.toggleRecordVar()
|
|
|
|
|
+ return Task.done
|
|
|
|
|
+ elif (((self.loopPlayback == 0) & (cTime > self.maxT)) |
|
|
|
|
|
+ ((self.recordingType.get() == 'Extend') & (cTime > self.maxT))):
|
|
|
|
|
+ # Go to maxT
|
|
|
|
|
+ self.getWidget('Playback', 'Time').set(self.maxT)
|
|
|
|
|
+ # Then stop playback
|
|
|
self.stopPlayback()
|
|
self.stopPlayback()
|
|
|
- if (self.recordingType.get() == 'Refine'):
|
|
|
|
|
- # Also kill record task
|
|
|
|
|
- self.toggleRecordVar()
|
|
|
|
|
return Task.done
|
|
return Task.done
|
|
|
- # Otherwise go to specified time
|
|
|
|
|
|
|
+ # Otherwise go to specified time and continue
|
|
|
self.getWidget('Playback', 'Time').set(cTime)
|
|
self.getWidget('Playback', 'Time').set(cTime)
|
|
|
state.currentTime = cTime
|
|
state.currentTime = cTime
|
|
|
return Task.cont
|
|
return Task.cont
|
|
@@ -1394,7 +1410,7 @@ class MopathRecorder(AppShell, PandaObject):
|
|
|
lookAtCS = self.playbackMarker.attachNewNode('lookAt')
|
|
lookAtCS = self.playbackMarker.attachNewNode('lookAt')
|
|
|
# Now sample the hprNurbsCurve using the same delta T
|
|
# Now sample the hprNurbsCurve using the same delta T
|
|
|
for i in range(self.numSamples):
|
|
for i in range(self.numSamples):
|
|
|
- t = self.maxT * (i / float(self.numSamples))
|
|
|
|
|
|
|
+ t = self.maxT * (i / float(self.numSamples - 1))
|
|
|
hpr = Point3(0)
|
|
hpr = Point3(0)
|
|
|
if self.fForward:
|
|
if self.fForward:
|
|
|
# Use xyz curve tangent
|
|
# Use xyz curve tangent
|