int?FindClosestViewDirectionPoint(Vector3 MatchViewDirection, float MinScore) { Pop.AllocIfNull(ref ViewDirections); // closest to 1 is closest to vector int? ClosestDotIndex = null; float ClosestDot = 0; float MinDot = 1 - MinScore; for (int i = 0; i < ViewDirections.Count; i++) { var ViewDir = ViewDirections[i]; var Dot = Vector3.Dot(ViewDir, MatchViewDirection); if (Dot < MinDot) { continue; } if (ClosestDotIndex.HasValue) { if (ClosestDot > Dot) { continue; } } ClosestDotIndex = i; ClosestDot = Dot; } return(ClosestDotIndex); }
public override void GetTimeRange(out PopTimeline.TimeUnit Min, out PopTimeline.TimeUnit Max) { int?MinTime = null; int?MaxTime = null; Pop.AllocIfNull(ref VideoStreams); foreach (var bs in VideoStreams) { var Blocks = bs.Blocks; if (Blocks == null || Blocks.Count == 0) { continue; } var bsmin = Blocks[0].GetStartTime().Time; var bsmax = Blocks[Blocks.Count - 1].GetEndTime().Time; MinTime = MinTime.HasValue ? Mathf.Min(MinTime.Value, bsmin) : bsmin; MaxTime = MaxTime.HasValue ? Mathf.Max(MaxTime.Value, bsmax) : bsmax; } if (!MinTime.HasValue) { throw new System.Exception("No time range (no data)"); } Min = new PopTimeline.TimeUnit(MinTime.Value); Max = new PopTimeline.TimeUnit(MaxTime.Value); }
public void PushPosition(Vector4 WorldPosition) { Pop.AllocIfNull(ref Positions); // only add if significant if (Positions.Count > 1) { var DistanceToLastPos = Vector3.Distance(WorldPosition, Positions [1]); if (DistanceToLastPos < MinDistanceToPushPosition) { return; } } Positions.Insert(0, WorldPosition); if (Positions.Count > MAX_SPLINE_POINTS) { Positions.RemoveRange(MAX_SPLINE_POINTS, Positions.Count - MAX_SPLINE_POINTS); } var Positions4 = new Vector3[Positions.Count]; for (int i = 0; i < Positions.Count; i++) { Positions4 [i] = Positions [i]; } OnPositionsChanged.Invoke(Positions4); }
void ParseTag_Group(Dictionary <string, string> Attribs, string TagContents, bool EndTag, bool LoneTag) { Pop.AllocIfNull(ref CurrentGroupStack); if (!EndTag) { var NewGroup = new Svg.Group(); // add to tree if (CurrentGroupStack.Count == 0) { this.Svg.Groups.Add(NewGroup); } else { var CurrentGroup = GetCurrentGroup(); CurrentGroup.Children.Add(NewGroup); } // add to stack CurrentGroupStack.Add(NewGroup); } if (LoneTag || EndTag) { CurrentGroupStack.RemoveAt(CurrentGroupStack.Count - 1); return; } }
public void AddViewDirectionPoint(Vector3 ViewDirection) { // transform direction by camera rotation Pop.AllocIfNull(ref ViewDirections); ViewDirections.Add(ViewDirection); OnChanged(); Debug.Log("Added view dir"); }
public void AddFrame(Vector3 Position, Quaternion Rotation, float Time) { var Frame = new AnimFrame(); Frame.Position = Position; Frame.Rotation = Rotation; Frame.Scale = Vector3.one; Frame.Time = Time; Pop.AllocIfNull(ref Frames); Frames.Add(Frame); }
SvgImporter(string SvgContents) { Pop.AllocIfNull(ref TagToParserFunc); TagToParserFunc[Tag_Svg] = ParseTag_Svg; TagToParserFunc[Tag_Group] = ParseTag_Group; TagToParserFunc[Tag_Definitions] = ParseTag_Defs; TagToParserFunc[Tag_Style] = ParseTag_Style; TagToParserFunc[Tag_Title] = ParseTag_Title; TagToParserFunc[Tag_Polyline] = ParseTag_Polyline; /* * < svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 14.25 22.84" > * < defs > * < style >.cls - 1{ * fill: none; stroke:#0267ff;stroke-miterlimit:10;stroke-width:4px;}</style> * </defs> * <title>Blue Arrow</title> * <g id="Layer_2" data-name="Layer 2"> * <g id="Layer_1-2" data-name="Layer 1"> * <polyline class="cls-1" points="1.41 1.41 11.42 11.42 1.41 21.43"/> * </g> * </g> * </svg> */ // parse xml tags int Iterations = 0; // stop infinite loops int StringIndex = 0; var TagPattern = "<([/]?)([^>\\s]+)([^>]*)>([^<]*)"; var RegExpression = new Regex(TagPattern); do { var match = RegExpression.Match(SvgContents, StringIndex); if (match == null) { break; } if (match.Groups.Count < 3) { break; } StringIndex = match.Index + match.Length; var WholeMatch = match.Groups[0].Captures[0]; var EndTag = !string.IsNullOrEmpty(match.Groups[1].Captures[0].ToString()); var Name = match.Groups[2].Captures[0]; var Attribs = match.Groups[3].Captures[0].Value; var LoneTag = string.IsNullOrEmpty(Attribs) ? false : Attribs[Attribs.Length - 1] == '/'; Attribs = Attribs.TrimEnd(new char[] { '/' }); var Contents = match.Groups[4].Captures[0].ToString(); ParseTag(Name.ToString(), Attribs.ToString(), Contents, EndTag, LoneTag); }while (Iterations++ < 5000); }
public void UpdateRootValue() { var WorldPosition = TrackedPosition; Pop.AllocIfNull(ref Positions); if (Positions.Count == 0) { Positions.Add(WorldPosition); } Positions [0] = WorldPosition; }
List <Ray> GetWorldRays() { Pop.AllocIfNull(ref ViewDirections); var WorldRays = new List <Ray>(); var RayOrigin = this.RayOrigin; foreach (var ViewDirection in ViewDirections) { var Ray = new Ray(RayOrigin, ViewDirection); WorldRays.Add(Ray); } return(WorldRays); }
void Update() { if (QuitOnAnyKey && Input.anyKeyDown) { Application.Quit(); } Pop.AllocIfNull(ref QuitAppKeys); foreach (var Key in QuitAppKeys) { if (Input.GetKey(Key)) { Application.Quit(); } } }
public static void Export(System.Action <string> WriteLine, List <FbxProperty> Tree, List <string> Comments = null) { Pop.AllocIfNull(ref Comments); Comments.Add("Using WIP PopX.FbxAscii exporter from @soylentgraham"); foreach (var Comment in Comments) { WriteLine(Tag_Comment + " " + Comment); } WriteLine(null); // write out the tree foreach (var Prop in Tree) { Export(WriteLine, Prop); WriteLine(null); } }
void RenderTriangleAtlas(ref RenderTexture AtlasTexture, List <Triangle2> AtlasTriangles, List <Triangle3> MeshTriangles) { // render each triangle to atlas (can probably do all of these at once with an ortho camera) // make a temp copy var TempTexture = new RenderTexture(AtlasTexture); PopX.Textures.ClearTexture(AtlasTexture, Color.black); PopX.Textures.ClearTexture(TempTexture, Color.black); Pop.AllocIfNull(ref ExportTextureMapShader); var Material = new Material(ExportTextureMapShader.BlitShader); for (int t = 0; t < AtlasTriangles.Count; t++) { ExportTextureMapShader.SetUniforms(Material, AtlasTriangles[t], MeshTriangles[t]); Graphics.Blit(TempTexture, AtlasTexture, Material); Graphics.Blit(AtlasTexture, TempTexture); } }
VideoStream GetStream(string StreamName) { // return existing... Pop.AllocIfNull(ref VideoStreams); foreach (var bs in VideoStreams) { if (bs.StreamName == StreamName) { return(bs); } } // new! var NewBlockStream = new VideoStream(); NewBlockStream._Packets = new List <VideoPacket>(); NewBlockStream.StreamName = StreamName; VideoStreams.Add(NewBlockStream); return(VideoStreams[VideoStreams.Count - 1]); }
public void PushPoint(Vector3 Position) { Pop.AllocIfNull(ref PositionSets); if (PositionSets.Count == 0) { PositionSets.Add(new List <Matrix4x4>()); } if (PositionSets[PositionSets.Count - 1].Count >= 1023) { PositionSets.Add(new List <Matrix4x4>()); } var PositionSet = PositionSets[PositionSets.Count - 1]; var PosMtx = Matrix4x4.TRS(Position, Quaternion.identity, Scale3); if (ApplyThisMatrix) { PosMtx = this.transform.localToWorldMatrix * PosMtx; } PositionSet.Add(PosMtx); }
public static void Export(System.Action <string> WriteLine, Mesh mesh, Matrix4x4 transform, List <string> Comments = null) { // temp objects var MeshAnim = new AnimObject(); MeshAnim.AddFrame(new Vector3(0, 0, 0), Quaternion.identity, 0); MeshAnim.AddFrame(new Vector3(0, 1000, 0), Quaternion.Euler(0, 90, 0), 1); MeshAnim.AddFrame(new Vector3(0, 0, 0), Quaternion.Euler(0, 180, 0), 2); MeshAnim.AddFrame(new Vector3(0, 1000, 0), Quaternion.Euler(0, 270, 0), 3); MeshAnim.AddFrame(new Vector3(0, 0, 0), Quaternion.Euler(0, 359, 0), 4); var AnimStack = new AnimStack("Take001", MeshAnim.GetStartTime(), MeshAnim.GetEndTime()); var Cam = new FbxCamera("Camera1"); Pop.AllocIfNull(ref Comments); Comments.Add("Using WIP PopX.FbxAscii exporter from @soylentgraham"); var Header = GetHeaderProperty(); Header.AddComment(Comments); Export(WriteLine, Header); var ConnectionManager = new FbxConnectionManager(); var ObjectManager = new FbxObjectManager(); //var MeshObject = CreateFbxObject(mesh, transform, ObjectManager); var CameraObject = CreateFbxObject(Cam, transform, ObjectManager, ConnectionManager); var AnimLayerObject = CreateAnimLayerObject(ObjectManager); var AnimStackObject = CreateAnimStackObject(AnimStack, ObjectManager); MakeAnimationNode(MeshAnim, CameraObject, AnimLayerObject, ObjectManager, ConnectionManager); ConnectionManager.Add(new FbxConnection(AnimLayerObject.TypeName, AnimLayerObject.ObjectName, AnimLayerObject, AnimStackObject.TypeName, AnimStackObject.ObjectName, AnimStackObject, FbxRelationType.OO)); var Definitions = GetDefinitionsProperty(ObjectManager); Export(WriteLine, Definitions); Export(WriteLine, ObjectManager); // fake connections after we've exported ObjectManager var SceneMesh = new Mesh(); SceneMesh.name = "Root"; var SceneMeshObject = CreateFbxObject(SceneMesh, Matrix4x4.identity, ObjectManager, FbxObjectManager.RootNodeIdent); //var MeshMaterialObject = CreateFbxObject_Material("DummyMaterial", ObjectManager); //ConnectionManager.Add(new FbxConnection( MeshObject, SceneMeshObject, FbxRelationType.OO)); ConnectionManager.Add(new FbxConnection(CameraObject, SceneMeshObject, FbxRelationType.OO)); //ConnectionManager.Add(new FbxConnection( MeshMaterialObject.TypeName, MeshMaterialObject.ObjectName, MeshMaterialObject, MeshObject.TypeName, MeshObject.ObjectName, MeshObject, FbxRelationType.OO)); Export(WriteLine, ConnectionManager); }
void OnGUI() { OnInteractionEvent(null); if (Error != null) { EditorGUILayout.HelpBox(Error.Message, MessageType.Error); } if (Bridge == null) { EditorGUILayout.HelpBox("No bridge.", MessageType.Warning); return; } try { TimeUnit LeftTime, RightTime; Bridge.GetTimeRange(out LeftTime, out RightTime); StickyScroll = GUILayout.Toggle(StickyScroll, "Sticky Scroll", GUILayout.ExpandWidth(true)); var NewStickySelect = GUILayout.Toggle(StickySelect, "Sticky Select", GUILayout.ExpandWidth(true)); if (NewStickySelect) { // detect change var NewTime = (LastStickySelectTime.HasValue && LastStickySelectTime.Value.Time != RightTime.Time); LastStickySelectTime = RightTime; if (NewTime) { OnSelectTime(LastStickySelectTime.Value); } } else { LastStickySelectTime = null; } if (StickyScroll) { ScrollTimeLeft = new TimeUnit(RightTime.Time - ScrollVisibleTimeRange.Time); } ScrollVisibleTimeRange.Time = (int)GUILayout.HorizontalSlider(ScrollVisibleTimeRange.Time, VisibleTimeRangeMin.Time, VisibleTimeRangeMax.Time, GUILayout.ExpandWidth(true)); var LeftTimef = TimeUnitToFloat(LeftTime); var RightTimef = TimeUnitToFloat(RightTime); var ScrollTimef = TimeUnitToFloat(ScrollTimeLeft); var ScrollSizef = TimeUnitToFloat(ScrollVisibleTimeRange); EditorGUI.BeginChangeCheck(); ScrollTimeLeft = FloatToTimeUnit(GUILayout.HorizontalScrollbar(ScrollTimef, ScrollSizef, LeftTimef, RightTimef, GUILayout.ExpandWidth(true))); if (EditorGUI.EndChangeCheck()) { // user scrolled, turn on sticky mode StickyScroll = (ScrollTimeLeft.Time + ScrollVisibleTimeRange.Time) >= RightTime.Time; } var DrawLeft = ScrollTimeLeft; var DrawRight = new TimeUnit(ScrollTimeLeft.Time + FloatToTimeUnit(ScrollSizef).Time); Pop.AllocIfNull(ref View); var CanvasOptions = new GUILayoutOption[] { GUILayout.ExpandWidth(true), GUILayout.ExpandHeight(true) }; var Border = 2; var Canvas = EditorGUILayout.BeginVertical(CanvasOptions); Canvas.min = Canvas.min + new Vector2(Border, Border); Canvas.max = Canvas.max - new Vector2(Border, Border); var Streams = Bridge.Streams; HandlePendingEvents(Canvas, Streams); if (Event.current.type == EventType.Repaint) { View.Draw(Canvas, DrawLeft, DrawRight, SelectedTime, HoverTime, Bridge, Streams, CurrentDrag); } EditorGUILayout.EndVertical(); } catch (System.Exception e) { EditorGUILayout.HelpBox(e.Message, MessageType.Error); } }