public ChangeVisuallyAttribute(ChangeTo to, string whenOtherPropertyName, DisplayChangeIf ifOperator, object value, bool conditionPassesIfNull) { To = to; WhenOtherPropertyName = whenOtherPropertyName; If = ifOperator; Value = value; ConditionPassesIfNull = conditionPassesIfNull; }
public ChangeVisuallyAttribute(ChangeTo to, string whenOtherPropertyName, DisplayChangeIf ifOperator, object value, bool conditionPassesIfNull, ComparisonValueType valueType = ComparisonValueType.String) { To = to; WhenOtherPropertyName = whenOtherPropertyName; If = ifOperator; Value = value; ConditionPassesIfNull = conditionPassesIfNull; ValueTypeToCompare = valueType; }
public void SetTrails(params Trail[] trails) { //remove exisiting trails Node.RemoveAllChildren(); _safetyIndex.Clear(); //create each trail if (trails == null || trails.Length == 0) { return; } var totalDelay = 0f; var decorationRoot = Node.CreateChild(); var safetyIndex = 0; var safetyPositions = new Dictionary <Vector3, int>(); foreach (var trail in trails.Where(i => i.Path != null && i.Path.Length != 0)) { //create ribbon var ribbonNode = Node.CreateChild(); var ribbon = ribbonNode.CreateComponent <RibbonTrail>(); ribbon.ViewMask = 1; //invisible to Selection Manager ribbon.CastShadows = false; ribbon.Material = Material.FromColor(new Color(trail.R / 255f, trail.G / 255f, trail.B / 255f, trail.A / 255f)); ribbon.Material.SetTechnique(0, CoreAssets.Techniques.NoTextureUnlitAlpha); //self illuminating ribbon.Lifetime = 10000f; ribbon.Width = (trail.Width == 0) ? .1f : trail.Width; ribbonNode.SetWorldPosition(new Vector3(trail.Path[0].X, trail.Path[0].Y, trail.Path[0].Z)); //create decoration var decorationNode = decorationRoot.CreateChild(); if (trail.Decoration != null) { var decoration = trail.Decoration.Value; var start = new Vector3(decoration.Start.X, decoration.Start.Y, decoration.Start.Z); var end = new Vector3(decoration.End.X, decoration.End.Y, decoration.End.Z); //Safety if (decoration.Type == TrailDecorationType.Safety) { if (!safetyPositions.ContainsKey(start)) { var width = .7f; var top = CreateShape <Cone>(decorationNode, decoration, new Vector3(0, width / 2f, 0), new Vector3(width, width, width)); var bottom = CreateShape <Cone>(decorationNode, decoration, new Vector3(0, -width / 2f, 0), new Vector3(width, width, width)); bottom.Roll(180); decorationNode.SetWorldPosition(start); safetyPositions.Add(start, safetyIndex); } else { _safetyIndex.AddOrUpdate(safetyIndex, safetyPositions[start], (i, e) => safetyPositions[start]); //if one is at the same location, then reuse it } } //pick if (decoration.Type == TrailDecorationType.Pick) { CreatePointer(decorationNode, .4f, false, decoration, start, end); } //place if (decoration.Type == TrailDecorationType.Place) { CreatePointer(decorationNode, .4f, true, decoration, start, end); } } safetyIndex++; //create action var speed = (trail.Speed == 0) ? 50f : trail.Speed; var actions = trail.Path.Skip(1).Select((i, index) => { var pos = new Vector3(i.X, i.Y, i.Z); var prevPos = new Vector3(trail.Path[index].X, trail.Path[index].Y, trail.Path[index].Z); var dist = Vector3.Distance(pos, prevPos); var time = dist / speed; totalDelay += time; return(new MoveTo(time, pos)); }); //animate ribbon FiniteTimeAction[] actionsArray; if (totalDelay != 0) { var time = totalDelay; var a = actions.ToList <FiniteTimeAction>(); a.Insert(0, new DelayTime(time)); actionsArray = a.ToArray(); } else { actionsArray = actions.ToArray(); } ribbonNode.RunActions(new Sequence(actionsArray)); //animate decoration if (trail.Decoration != null) { float fadeTime = .2f; var nodes = decorationNode.GetChildrenWithComponent <Shape>(true); foreach (var node in nodes) { var target = GetDecorationAlpha(null, node); ChangeDecorationAlpha(null, node, 0, 0, 0); var action = new ChangeTo <float>(fadeTime, target, GetDecorationAlpha, ChangeDecorationAlpha); node.RunActions(new Sequence(new FiniteTimeAction[] { new DelayTime(totalDelay), action })); } if (nodes.Length != 0) { totalDelay += fadeTime; } } } }