Example #1
0
 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)
Example #2
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
Example #3
0
    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
Example #4
0
 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)
Example #5
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)