def ConstructLine(self, colorStart, colorEnd): numPoints = self.radius line = VectorLineTrace(name='bg', parent=self, lineWidth=self.lineWidth, width=1, height=1, end=0.0) w = self.lineWidth / 2.0 stepSize = 2 * pi / numPoints for i in xrange(numPoints + 1): if i == 0: t = self.startAngle - 0.1 * stepSize point = (w + self.radius * (1.0 + cos(t)), w + self.radius * (1.0 + sin(t))) line.AddPoint(point, color=(1, 1, 1, 0)) t = self.startAngle + float(i) * stepSize point = (w + self.radius * (1.0 + cos(t)), w + self.radius * (1.0 + sin(t))) color = geo2.Vec4Lerp(colorStart, colorEnd, i / float(numPoints)) line.AddPoint(point, color) return line
def DrawOutline(self, margin = 0): if self.outline: outline = self.outline else: outline = VectorLineTrace(parent=self, lineWidth=1, idx=0) outline.isLoop = True self.outline = outline outline.Flush() self.cornerPoints = [] colors = [(1, 0, 0, 1), (1, 1, 1, 1), (0, 1, 0, 1), (1, 1, 1, 1), (0, 0, 1, 1), (1, 1, 1, 1)] for i in xrange(6): if self.isFlatTop: outlineRad = self.displayWidth * 0.5 - margin angle = 2.0 * math.pi / 6.0 * i else: outlineRad = self.displayHeight * 0.5 - margin angle = 2.0 * math.pi / 6.0 * (i + 0.5) x_i = ReverseScaleDpi(self.displayWidth * 0.5 + outlineRad * math.cos(angle)) y_i = ReverseScaleDpi(self.displayHeight * 0.5 + outlineRad * math.sin(angle)) outline.AddPoint((x_i, y_i), colors[i]) self.cornerPoints.append((x_i, y_i))
def _DebugDrawLine(self, p1, p2, color=(1, 0, 0, 0.8), margin=10): if margin: p1, p2 = self.ApplyLineMargin(p1, p2, margin, margin) line = VectorLineTrace(parent=self, lineWidth=1, idx=0) x1, y1 = p1 x2, y2 = p2 line.AddPoint((x1, y1), color) line.AddPoint((x2, y2), color) return line
def ConstructSegments(self): ret = [] stepSize = 2 * pi / self.numSegments numPoints = max(3, int(30 / self.numSegments)) w = self.lineWidth / 2.0 radius = self.radius - self.lineWidth / 2.0 for i in xrange(self.numSegments): line = VectorLineTrace(name='line', parent=self.segmentTransform, lineWidth=self.lineWidth, width=100, height=100) for j in xrange(numPoints + 1): t = float(i) / self.numSegments * 2 * pi + float(j) / numPoints * stepSize t += pi / 2 point = (w + radius * (1.0 + cos(t)), w + radius * (1.0 + sin(t))) if self.numSegments > 1 and (j == 0 or j == numPoints): line.AddPoint(point, color=(1, 1, 1, 0)) else: line.AddPoint(point) ret.append(line) return ret
def ConstructLine(self, colorStart, colorEnd): numPoints = max(30, self.radius) line = VectorLineTrace(parent=self, lineWidth=self.lineWidth, width=1, height=1, end=0.0) w = self.lineWidth / 2.0 stepSize = 2 * pi / numPoints for i in xrange(numPoints + 1): if i == 0: t = self.startAngle - 0.1 * stepSize point = self.GetLinePoint(t, w) line.AddPoint(point, color=(1, 1, 1, 0)) t = self.startAngle + float(i) * stepSize point = self.GetLinePoint(t, w) color = geo2.Vec4Lerp(colorStart, colorEnd, i / float(numPoints)) line.AddPoint(point, color) return line
def DrawOutline(self): if self.outline: outline = self.outline else: outline = VectorLineTrace(parent=self, lineWidth=2) outline.isLoop = True self.outline = outline outline.Flush() for i in xrange(6): if self.isFlatTop: outlineRad = self.displayWidth * 0.5 angle = 2.0 * math.pi / 6.0 * i else: outlineRad = self.displayHeight * 0.5 angle = 2.0 * math.pi / 6.0 * (i + 0.5) x_i = ReverseScaleDpi(self.displayWidth * 0.5 + outlineRad * math.cos(angle)) y_i = ReverseScaleDpi(self.displayHeight * 0.5 + outlineRad * math.sin(angle)) outline.AddPoint((x_i, y_i), (1, 0, 0, 0.8))
class PointerContainer(Container): """ This is a frame with a pointer on one edge """ default_name = 'PointerContainer' default_state = uiconst.UI_NORMAL default_align = uiconst.TOPLEFT default_width = 200 default_height = 100 default_dockPlacement = DockPlacement.LeftCenter default_dockPointerLength = 16 default_dockMargin = 8 default_hintBgColor = (0.1, 0.1, 0.1, 0.85) default_hintFrameColor = (1.0, 1.0, 1.0, 0.25) def ApplyAttributes(self, attributes): Container.ApplyAttributes(self, attributes) self.dockPointerLength = attributes.get('dockPointerLength', self.default_dockPointerLength) self.dockMargin = attributes.get('dockMargin', self.default_dockMargin) self.hintBgColor = attributes.get('hintBgColor', self.default_hintBgColor) self.hintFrameColor = attributes.get('hintFrameColor', self.default_hintFrameColor) self.anchor = attributes.anchor self.dockPlacement = attributes.get('dockPlacement', self.default_dockPlacement) self.lineTrace = None self._BindToAnchor(self.anchor) self.SetDockPlacement(self.dockPlacement) def _BindToAnchor(self, anchor): """ When eve our anchor changes we want to update the hint location """ cs = uicore.uilib.bracketCurveSet self.bindings = [] self.bindings.append(trinity.CreateBinding(cs, anchor.renderObject, 'displayX', None, '')) self.bindings.append(trinity.CreateBinding(cs, anchor.renderObject, 'displayY', None, '')) for binding in self.bindings: binding.copyValueCallable = self._UpdateBoundValues def _UpdateBoundValues(self, *args): self.UpdatePosition() def UpdatePosition(self): anchorRect = self.anchor.GetAbsolute() dockPlacement = self.GetBestDockPlacement() left, top = self.CalcPosition(dockPlacement, anchorRect) self.top = top self.left = left def CalcPosition(self, dockPlacement, anchorRect): left, top, width, height = anchorRect newLeft, newTop = (0, 0) if dockPlacement == DockPlacement.TopCenter: newTop = top + (height + self.dockPointerLength + self.dockMargin) newLeft = left + (width - self.width) / 2 elif dockPlacement == DockPlacement.BottomCenter: newTop = top - (self.height + self.dockPointerLength + self.dockMargin) newLeft = left + (width - self.width) / 2 elif dockPlacement == DockPlacement.LeftCenter: newTop = top + (height - self.height) / 2 newLeft = left + (width + self.dockPointerLength + self.dockMargin) elif dockPlacement == DockPlacement.RightCenter: newTop = top + (height - self.height) / 2 newLeft = left - (self.width + self.dockPointerLength + self.dockMargin) return (newLeft, newTop) def GetBestDockPlacement(self): return self.dockPlacement def SetDockPlacement(self, dockPlacement): """ places the selector window on around the anchor as appropriate """ self.dockPlacement = dockPlacement self.DoUpdateLayout(dockPlacement) self.UpdatePosition() def DoUpdateLayout(self, dockPlacement): pointerWidth = self.dockPointerLength * 2 if dockPlacement == DockPlacement.TopCenter: pointList = ((0, 0), ((self.width - pointerWidth) * 0.5, 0), (self.width * 0.5, -self.dockPointerLength), ((self.width + pointerWidth) * 0.5, 0), (self.width, 0), (self.width, self.height), (0, self.height)) elif dockPlacement == DockPlacement.BottomCenter: pointList = ((0, 0), (self.width, 0), (self.width, self.height), ((self.width + pointerWidth) * 0.5, self.height), (self.width * 0.5, self.height + pointerWidth), ((self.width - pointerWidth) * 0.5, self.height), (0, self.height)) elif dockPlacement == DockPlacement.LeftCenter: pointList = ((0, 0), (self.width, 0), (self.width, self.height), (0, self.height), (0, (self.height + pointerWidth) * 0.5), (-self.dockPointerLength, self.height * 0.5), (0, (self.height - pointerWidth) * 0.5)) elif dockPlacement == DockPlacement.RightCenter: pointList = ((0, 0), (self.width, 0), (self.width, (self.height - pointerWidth) * 0.5), (self.width + self.dockPointerLength, self.height * 0.5), (self.width, (self.height + pointerWidth) * 0.5), (self.width, self.height), (0, self.height)) else: raise NotImplementedError('This case of dock placement has not been implemented yet') if self.lineTrace is not None: self.lineTrace.Close() self.lineTrace = VectorLineTrace(parent=self, lineWidth=1.0, spriteEffect=trinity.TR2_SFX_FILL) self.lineTrace.isLoop = True for point in pointList: x, y = point x, y = uicore.ScaleDpi(x), uicore.ScaleDpi(y) self.lineTrace.AddPoint((x, y), self.hintFrameColor) pointerSideWidth = int(self.dockPointerLength * 2 / sqrt(2)) pointerSideWidthHalf = pointerSideWidth / 2 if dockPlacement == DockPlacement.TopCenter: clipperAlign = uiconst.CENTERTOP transformAlign = uiconst.CENTERBOTTOM horizontal = False elif dockPlacement == DockPlacement.BottomCenter: clipperAlign = uiconst.CENTERBOTTOM transformAlign = uiconst.CENTERTOP horizontal = False elif dockPlacement == DockPlacement.LeftCenter: clipperAlign = uiconst.CENTERLEFT transformAlign = uiconst.CENTERRIGHT horizontal = True elif dockPlacement == DockPlacement.RightCenter: clipperAlign = uiconst.CENTERRIGHT transformAlign = uiconst.CENTERLEFT horizontal = True else: raise NotImplementedError('This case of dock placement has not been implemented yet') clipperCont = Container(name='clipper', parent=self, width=self.dockPointerLength if horizontal else pointerWidth, height=pointerWidth if horizontal else self.dockPointerLength, clipChildren=True, align=clipperAlign, top=0 if horizontal else -self.dockPointerLength, left=-self.dockPointerLength if horizontal else 0) transform = Transform(name='transform', parent=clipperCont, align=transformAlign, rotation=pi / 4, width=pointerSideWidth, height=pointerSideWidth, top=0 if horizontal else -pointerSideWidthHalf, left=-pointerSideWidthHalf if horizontal else 0) Fill(bgParent=transform, color=self.hintBgColor) def _OnClose(self): self._UnbindAnchor() Container._OnClose(self) def _UnbindAnchor(self): cs = uicore.uilib.bracketCurveSet if cs: for binding in self.bindings: if binding in cs.bindings: cs.bindings.remove(binding) def FixPosition(self): self._UnbindAnchor()
class AchievementTreeConnection(VectorLineTrace, ColorThemeMixin): default_lineWidth = 1.0 default_colorType = uiconst.COLORTYPE_UIHILIGHTGLOW default_opacity = 1.0 glowLine = None glowLineColor = (1, 1, 1, 0.5) localScale = 1.0 __notifyevents__ = ['OnUIScalingChange'] def ApplyAttributes(self, attributes): VectorLineTrace.ApplyAttributes(self, attributes) ColorThemeMixin.ApplyAttributes(self, attributes) self.lineType = LINE_SOLID self.fromID = attributes.fromID self.toID = attributes.toID self.glowLine = VectorLineTrace( parent=self.parent, lineWidth=20, spriteEffect=trinity.TR2_SFX_COPY, texturePath='res:/UI/Texture/classes/Achievements/lineGlow.png', name='glowLine', blendMode=trinity.TR2_SBM_ADDX2, opacity=0.3) sm.RegisterNotify(self) def Close(self, *args): if self.glowLine and not self.glowLine.destroyed: self.glowLine.Close() VectorLineTrace.Close(self, *args) def OnUIScalingChange(self, *args): self.PlotLineTrace() def UpdateFromToPosition(self, fromObject, toObject, localScale): self.localScale = localScale self.fromPosition = (fromObject.left + fromObject.width / 2, fromObject.top + fromObject.height / 2) self.toPosition = (toObject.left + toObject.width / 2, toObject.top + toObject.height / 2) self.PlotLineTrace() def SetLineType(self, lineType): self.lineType = lineType self.PlotLineTrace() 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) 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) 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