egoChangeSmoother.py (2997B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\eve\client\script\ui\camera\util\egoChangeSmoother.py 2 import blue 3 import geo2 4 import trinity 5 6 class EgoChangeSmoother(object): 7 __notifyevents__ = ['ProcessSessionChange', 'OnBallAdded'] 8 9 def __init__(self, timelimit = 10.0): 10 self.timelimit = timelimit 11 self._missingBalls = None 12 self._offsets = {} 13 self._easeCurve = trinity.Tr2CurveScalar() 14 self._easeCurve.AddKey(0, 1, trinity.Tr2CurveInterpolation.HERMITE, 0, 0) 15 self._easeCurve.AddKey(1, 0, trinity.Tr2CurveInterpolation.HERMITE, 0, 0) 16 self._lastEgo = session.structureid or session.shipid 17 sm.RegisterNotify(self) 18 19 def ProcessSessionChange(self, isRemote, sess, change): 20 if 'shipid' in change: 21 self._UpdateEgoOffset(change['shipid'][1]) 22 if 'structureid' in change: 23 self._UpdateEgoOffset(change['structureid'][1]) 24 25 def OnBallAdded(self, slimItem): 26 if self._missingBalls is not None and slimItem.itemID in self._missingBalls: 27 self._UpdateOffset(*self._missingBalls) 28 29 def _UpdateOffset(self, oldEgo, newEgo): 30 ballpark = sm.GetService('michelle').GetBallpark() 31 if ballpark is not None: 32 old = ballpark.GetBall(oldEgo) 33 new = ballpark.GetBall(newEgo) 34 if old and new: 35 timestamp = blue.os.GetSimTime() 36 offset = (old.x - new.x, old.y - new.y, old.z - new.z) 37 self._offsets[self._lastEgo] = (timestamp, offset) 38 self._missingBalls = None 39 else: 40 self._missingBalls = (oldEgo, newEgo) 41 42 def _UpdateEgoOffset(self, newEgo): 43 if self._lastEgo != newEgo: 44 if self._lastEgo: 45 self._UpdateOffset(self._lastEgo, newEgo) 46 self._lastEgo = newEgo 47 48 def _GetScaledOffset(self, easeTime, currTime, timestamp, offset): 49 timeSinceOffset = blue.os.TimeDiffInMs(timestamp, currTime) / 1000.0 50 return geo2.Vec3Scale(offset, self._easeCurve.GetValueAt(timeSinceOffset / easeTime)) 51 52 def GetTotalOffset(self, easeTime): 53 if easeTime <= 0: 54 raise RuntimeError('The easeTime must be more than 0. {} given.'.format(easeTime)) 55 if easeTime > self.timelimit: 56 raise RuntimeError('The easeTime ({}) supplied must be less than the timelimit ({}).'.format(easeTime, self.timelimit)) 57 total = (0, 0, 0) 58 if not self._offsets: 59 return total 60 currTime = blue.os.GetSimTime() 61 updatedOffsets = {} 62 for key, (timestamp, offset) in self._offsets.iteritems(): 63 scaledOffset = self._GetScaledOffset(easeTime, currTime, timestamp, offset) 64 total = geo2.Vec3Add(total, scaledOffset) 65 if any((abs(x) > 0.001 for x in scaledOffset)): 66 updatedOffsets[key] = (timestamp, offset) 67 68 self._offsets = updatedOffsets 69 return total