def UpdatePosition(self, localPosition=None): if not self.model: self._LoadModel() if not len(self.model.children): return if not localPosition: localSystem = sm.StartService('map').GetItem(session.solarsystemid) localPosition = (localSystem.x, localSystem.y, localSystem.z) if not self.effectPosition: effectSystem = sm.StartService('map').GetItem(SUPERNOVA_SYSTEM_ID) self.effectPosition = (effectSystem.x, effectSystem.y, effectSystem.z) effect = self.model.children[0] direction = geo2.Vec3SubtractD(localPosition, self.effectPosition) direction = (direction[0], direction[1], -direction[2]) distance = geo2.Vec3LengthD(direction) / 1e+16 direction = geo2.Vec3Normalize(direction) if distance < self.nearDistance: scale = self.nearSize else: shift = (self.farSize * self.farDistance - self.nearSize * self.nearDistance) / (self.nearSize - self.farSize) baseSize = self.nearSize * (self.nearDistance + shift) scale = baseSize / (distance + shift) effect.scaling = (scale, scale, scale) effect.translation = geo2.Vec3Scale(direction, 15.0)
def GetWarpCollisions(self, ball): space = sm.GetService('space') planets = space.planetManager.planets destination = self.destination source = (ball.x, ball.y, ball.z) self.direction = geo2.Vec3SubtractD(destination, source) direction = self.direction warpDistance = geo2.Vec3LengthD(direction) normDirection = geo2.Vec3NormalizeD(direction) self.normDirection = normDirection ballpark = sm.GetService('michelle').GetBallpark() collisions = [] for planet in planets: planetBall = ballpark.GetBall(planet.id) if planetBall is None: log.LogWarn('Warping got a None planet ball.') continue planetRadius = planetBall.radius planetPosition = (planetBall.x, planetBall.y, planetBall.z) planetDir = geo2.Vec3SubtractD(planetPosition, source) if geo2.Vec3LengthSqD( self.direction) < geo2.Vec3LengthSqD(planetDir): continue effectiveRadius = self.CalcEffectiveRadius(normDirection, planetDir, planetRadius) if effectiveRadius is None: continue collisions.append((planetBall, effectiveRadius)) blue.pyos.BeNice() return collisions
def PanUpdateThread(self): try: while True: if self.panTarget is None: break if self._IsPanTargetOutOfBounds(): return distLeft = geo2.Vec3LengthD(self.panTarget) if distLeft == 0: break if distLeft < self.kPanStopDist: dist = 1.0 else: dist = min(1.0, self._GetPanSpeed() / blue.os.fps) toMove = geo2.Vec3ScaleD(self.panTarget, dist) self.SetEyePosition(geo2.Vec3Add(self._eyePosition, toMove)) self.SetAtPosition(geo2.Vec3Add(self._atPosition, toMove)) self.panTarget = geo2.Vec3SubtractD(self.panTarget, toMove) if dist == 1.0: break blue.synchro.Yield() finally: self.panUpdateThread = None self.panTarget = None
def UpdatePosition(self, localPosition=None): """ Updates the position and scale of the supernova. localPosition: An optional 3 tuple for the local position. If not passed in the session.solarsystemid is used to determine the position. """ if not self.model: self._LoadModel() if not localPosition: localSystem = sm.StartService('map').GetItem(session.solarsystemid) localPosition = (localSystem.x, localSystem.y, localSystem.z) if not self.effectPosition: effectSystem = sm.StartService('map').GetItem(SUPERNOVA_SYSTEM_ID) self.effectPosition = (effectSystem.x, effectSystem.y, effectSystem.z) effect = self.model.children[0] direction = geo2.Vec3SubtractD(localPosition, self.effectPosition) direction = (direction[0], direction[1], -direction[2]) distance = geo2.Vec3LengthD(direction) / 1e+16 direction = geo2.Vec3Normalize(direction) if distance < self.nearDistance: scale = self.nearSize else: shift = (self.farSize * self.farDistance - self.nearSize * self.nearDistance) / (self.nearSize - self.farSize) baseSize = self.nearSize * (self.nearDistance + shift) scale = baseSize / (distance + shift) effect.scaling = (scale, scale, scale) effect.translation = geo2.Vec3Scale(direction, 15.0)
def AddGfxResult(self, siteData, myPos): if self.suppressGfxReasons: return if not self.sensorSuiteService.siteController.IsSiteVisible(siteData): return if siteData.signalStrength >= 1.0: return if siteData.targetID in self.gfxActiveSensorResults: return direction = geo2.Vec3SubtractD(siteData.position, myPos) distToSite = geo2.Vec3LengthD(direction) deviation = siteData.deviation * 0.5 a = min(distToSite, deviation) b = max(distToSite, deviation) tanA = a / b angle = math.atan(tanA) normalizedDir = geo2.Vec3NormalizeD(direction) self.AddGfxResultToScene(siteData.targetID, normalizedDir, angle)