def PlotDashLine(self):
     dashSize = 2.0
     gapSize = 7.0
     r, g, b = self.GetRGB()
     DASHCOLOR = (r, g, b, 1.0)
     GAPCOLOR = (r, g, b, 0.0)
     MARGIN = 16.0 * self.localScale
     vecDir = geo2.Vec2Subtract(self.toPosition, self.fromPosition)
     vecLength = geo2.Vec2Length(vecDir)
     vecDirNorm = geo2.Vec2Normalize(vecDir)
     p = MARGIN
     while p < vecLength - MARGIN:
         startPoint = geo2.Vec2Add(self.fromPosition,
                                   geo2.Vec2Scale(vecDirNorm, p - 0.5))
         self.AddPoint(startPoint, GAPCOLOR)
         fromPoint = geo2.Vec2Add(self.fromPosition,
                                  geo2.Vec2Scale(vecDirNorm, p))
         self.AddPoint(fromPoint, DASHCOLOR)
         p = min(vecLength - MARGIN, dashSize + p)
         toPoint = geo2.Vec2Add(self.fromPosition,
                                geo2.Vec2Scale(vecDirNorm, p))
         self.AddPoint(toPoint, DASHCOLOR)
         endPoint = geo2.Vec2Add(self.fromPosition,
                                 geo2.Vec2Scale(vecDirNorm, p + 0.5))
         self.AddPoint(endPoint, GAPCOLOR)
         p += gapSize
Esempio n. 2
0
 def ApplyLineMargin(self, p1, p2, radius1, radius2):
     v = geo2.Vec2Subtract(p1, p2)
     vn = geo2.Vec2Normalize(v)
     l = geo2.Vec2Length(v)
     if not l:
         return (None, None)
     s = (radius1 + radius2) / l
     mp1 = geo2.Vec2Subtract(p1, geo2.Vec2Scale(vn, radius1))
     mp2 = geo2.Vec2Add(p2, geo2.Vec2Scale(vn, radius2))
     return (mp1, mp2)
 def PlotLineTrace(self):
     self.Flush()
     if self.glowLine:
         self.glowLine.Flush()
     if self.lineType in (LINE_DASHED, LINE_DASHED_ACTIVE):
         self.PlotDashLine()
     elif self.lineType == LINE_SOLID:
         self.PlotSolidLine()
     else:
         return
     if self.lineType == LINE_DASHED_ACTIVE:
         vecDir = geo2.Vec2Subtract(self.toPosition, self.fromPosition)
         vecLength = geo2.Vec2Length(vecDir)
         vecDirNorm = geo2.Vec2Normalize(vecDir)
         r, g, b = self.GetRGB()
         GLOWCOLOR = (r, g, b, 1.0)
         GAPCOLOR = (r, g, b, 0.0)
         self.glowLine.AddPoint(self.fromPosition, GAPCOLOR)
         point = geo2.Vec2Add(self.fromPosition,
                              geo2.Vec2Scale(vecDirNorm, vecLength * 0.5))
         self.glowLine.AddPoint(point, GLOWCOLOR)
         self.glowLine.AddPoint(self.toPosition, GAPCOLOR)
         self.glowLine.textureWidth = vecLength
         uicore.animations.MorphScalar(self.glowLine,
                                       'textureOffset',
                                       startVal=0.0,
                                       endVal=1.0,
                                       curveType=uiconst.ANIM_LINEAR,
                                       duration=2.0,
                                       loops=uiconst.ANIM_REPEAT)
Esempio n. 4
0
 def IsMouseHeadingTowards(self):
     owner = self.GetOwner()
     if owner.destroyed:
         return False
     mx, my = uicore.ScaleDpi(uicore.uilib.x), uicore.ScaleDpi(
         uicore.uilib.y)
     if len(self._mouseTrace) > SAMPLESIZE:
         self._mouseTrace.pop(0)
     self._mouseTrace.append((mx, my))
     tl, tt, tw, th = (owner.displayX, owner.displayY, owner.displayWidth,
                       owner.displayHeight)
     if tl <= mx <= tl + tw and tt <= my <= tt + th:
         return False
     oldX, oldY = self._mouseTrace[0]
     if (oldX, oldY) == (mx, my):
         return False
     mouseVector = geo2.Vec2Subtract((oldX, oldY), (mx, my))
     dirX, dirY = geo2.Vec2Scale(mouseVector, 1000)
     hit = intersect((tl, tt), (tl + tw, tt + th), (mx, my),
                     (mx - dirX, my - dirY))
     if not hit:
         hit = intersect((tl + tw, tt), (tl, tt + th), (mx, my),
                         (mx - dirX, my - dirY))
     if hit:
         return True
     return False
 def UpdateState(self):
     tileFromData = self.tileFrom.tileData
     tileToData = self.tileTo.tileData
     if not tileFromData.IsFlippable() and not tileToData.IsFlippable():
         colorFrom = colorTo = hackingUIConst.COLOR_BLOCKED
     elif hackingConst.TYPE_NONE in (tileFromData.type, tileToData.type):
         colorFrom = colorTo = hackingUIConst.COLOR_UNEXPLORED
     else:
         colorFrom = colorTo = hackingUIConst.COLOR_EXPLORED
         self.ShowBleed()
     widthFrom = widthTo = hackingUIConst.WIDTH_LINE
     if tileFromData.blocked or tileFromData.type == hackingConst.TYPE_DEFENSESOFTWARE:
         colorFrom = (0.0, 0.0, 0.0, 0.5)
         widthFrom = 5.0
         if not (tileToData.blocked
                 or tileToData.type == hackingConst.TYPE_DEFENSESOFTWARE):
             widthTo = 0.0
     if tileToData.blocked or tileToData.type == hackingConst.TYPE_DEFENSESOFTWARE:
         colorFrom = (0.0, 0.0, 0.0, 0.5)
         widthTo = 5.0
         if not (tileFromData.blocked
                 or tileFromData.type == hackingConst.TYPE_DEFENSESOFTWARE):
             widthFrom = 0.0
     uicore.animations.SpColorMorphTo(self.line,
                                      self.line.colorFrom,
                                      colorFrom,
                                      attrName='colorFrom')
     uicore.animations.SpColorMorphTo(self.line,
                                      self.line.colorTo,
                                      colorFrom,
                                      attrName='colorTo')
     uicore.animations.MorphScalar(self.line, 'widthFrom',
                                   self.line.widthFrom, widthFrom)
     uicore.animations.MorphScalar(self.line, 'widthTo', self.line.widthTo,
                                   widthTo)
     offset1 = self.GetLineOffsetAmount(self.tileFrom.tileData.type)
     p0 = geo2.Vec2Add(self.p0, geo2.Vec2Scale(self.offset, offset1))
     self.line.translationFrom = p0
     offset2 = self.GetLineOffsetAmount(self.tileTo.tileData.type)
     p1 = geo2.Vec2Subtract(self.p1, geo2.Vec2Scale(self.offset, offset2))
     self.line.translationTo = p1
 def PlotSolidLine(self):
     r, g, b = self.GetRGB()
     DASHCOLOR = (r, g, b, 1.0)
     GAPCOLOR = (r, g, b, 0.0)
     MARGIN = 16.0 * self.localScale
     vecDir = geo2.Vec2Subtract(self.toPosition, self.fromPosition)
     vecLength = geo2.Vec2Length(vecDir)
     vecDirNorm = geo2.Vec2Normalize(vecDir)
     startPoint = geo2.Vec2Add(self.fromPosition,
                               geo2.Vec2Scale(vecDirNorm, MARGIN))
     self.AddPoint(startPoint, GAPCOLOR)
     startPoint = geo2.Vec2Add(self.fromPosition,
                               geo2.Vec2Scale(vecDirNorm, MARGIN + 8))
     self.AddPoint(startPoint, DASHCOLOR)
     startPoint = geo2.Vec2Add(
         self.fromPosition,
         geo2.Vec2Scale(vecDirNorm, vecLength - MARGIN - 8))
     self.AddPoint(startPoint, DASHCOLOR)
     startPoint = geo2.Vec2Add(
         self.fromPosition, geo2.Vec2Scale(vecDirNorm, vecLength - MARGIN))
     self.AddPoint(startPoint, GAPCOLOR)
Esempio n. 7
0
def seg_intersect(line1, line2):
    a1, a2 = line1
    b1, b2 = line2
    da = geo2.Vec2Subtract(a2, a1)
    db = geo2.Vec2Subtract(b2, b1)
    dp = geo2.Vec2Subtract(a1, b1)
    dap = (-da[1], da[0])
    denom = geo2.Vec2Dot(dap, db)
    if not denom:
        return False
    num = geo2.Vec2Dot(dap, dp)
    return geo2.Vec2Scale(geo2.Vec2Add(db, b1), num / denom)
Esempio n. 8
0
def closest_point_on_seg(seg_a, seg_b, circ_pos):
    seg_v = geo2.Vec2Subtract(seg_b, seg_a)
    pt_v = geo2.Vec2Subtract(circ_pos, seg_a)
    if geo2.Vec2Length(seg_v) <= 0:
        raise ValueError, 'Invalid segment length'
    seg_v_unit = geo2.Vec2Normalize(seg_v)
    proj = geo2.Vec2Dot(seg_v_unit, pt_v)
    if proj <= 0:
        return seg_a
    if proj >= geo2.Vec2Length(seg_v):
        return seg_b
    proj_v = geo2.Vec2Scale(seg_v_unit, proj)
    closest = geo2.Vec2Add(proj_v, seg_a)
    return closest
Esempio n. 9
0
    def GetVectorBetweenObjectsOnSameLevel(self,
                                           fromObjectID,
                                           toObjectID,
                                           parentObjectID,
                                           i=0):
        plotData = GetPlotDataForObject(parentObjectID, ignoreFixed=False)
        if fromObjectID in plotData:
            column1, row1 = plotData[fromObjectID]
            fromPos = hexUtil.hex_slot_center_position(column1, row1,
                                                       self.isFlatTop,
                                                       self.hexGridSize)
        elif self.parentMap and fromObjectID in self.parentMap.markersByID:
            fromPos = self.parentMap.markersByID[fromObjectID].unscaledPosition
        else:
            return
        if toObjectID in plotData:
            column2, row2 = plotData[toObjectID]
            toPos = hexUtil.hex_slot_center_position(column2, row2,
                                                     self.isFlatTop,
                                                     self.hexGridSize)
        elif self.parentMap and toObjectID in self.parentMap.markersByID:
            toPos = self.parentMap.markersByID[toObjectID].unscaledPosition
        else:
            return
        diffVec = geo2.Vec2Subtract(toPos, fromPos)
        diffVec = geo2.Vec2Scale(diffVec, 100000000000.0)
        cornerPoints = []
        for i in xrange(6):
            if self.isFlatTop:
                outlineRad = self.width * 0.5
                angle = 2.0 * math.pi / 6.0 * i
            else:
                outlineRad = self.height * 0.5
                angle = 2.0 * math.pi / 6.0 * (i + 0.5)
            x_i = outlineRad * math.cos(angle)
            y_i = outlineRad * math.sin(angle)
            cornerPoints.append((x_i, y_i))

        for i in xrange(6):
            p1 = cornerPoints[i]
            p2 = cornerPoints[i - 1]
            crossPoint = hexUtil.intersect_line_segments((p1, p2),
                                                         ((0.0, 0.0), diffVec))
            if crossPoint:
                return crossPoint
Esempio n. 10
0
    def _PanUpdateThread(self):
        while True:
            if self.panTarget is None or not self.mainCont.children:
                break
            distLeft = geo2.Vec2Length(self.panTarget)
            if distLeft == 0:
                break
            dist = self.panSpeed / blue.os.fps
            if distLeft < 1.0:
                dist *= 1.0 / distLeft
            dist = min(dist, 1.0)
            toMove = geo2.Vec2Scale(self.panTarget, dist)
            self.panTarget -= toMove
            dx, dy = toMove
            self.panLeft -= dx / self.mainCont.width
            self.panTop -= dy / self.mainCont.height
            blue.synchro.Yield()

        self.panUpdateThread = None
        self.panTarget = None
Esempio n. 11
0
 def _GetNodePosition(self, node):
     vec = geo2.Vec2Subtract(node.GetPosition(), self._offset)
     return geo2.Vec2Scale(vec, TREE_SCALE)
Esempio n. 12
0
 def _GetNodePosition(self, node):
     """ Returns node position scaled and offset so that the bottom-left most point is at (0, 0) """
     vec = geo2.Vec2Subtract(node.GetPosition(), self._offset)
     return geo2.Vec2Scale(vec, TREE_SCALE)