예제 #1
0
    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);
    }
예제 #3
0
    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);
    }
예제 #4
0
        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;
            }
        }
예제 #5
0
 public void AddViewDirectionPoint(Vector3 ViewDirection)
 {
     //	transform direction by camera rotation
     Pop.AllocIfNull(ref ViewDirections);
     ViewDirections.Add(ViewDirection);
     OnChanged();
     Debug.Log("Added view dir");
 }
예제 #6
0
    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);
    }
예제 #7
0
        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);
        }
예제 #8
0
    public void UpdateRootValue()
    {
        var WorldPosition = TrackedPosition;

        Pop.AllocIfNull(ref Positions);
        if (Positions.Count == 0)
        {
            Positions.Add(WorldPosition);
        }

        Positions [0] = WorldPosition;
    }
예제 #9
0
    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);
    }
예제 #10
0
    void Update()
    {
        if (QuitOnAnyKey && Input.anyKeyDown)
        {
            Application.Quit();
        }

        Pop.AllocIfNull(ref QuitAppKeys);
        foreach (var Key in QuitAppKeys)
        {
            if (Input.GetKey(Key))
            {
                Application.Quit();
            }
        }
    }
예제 #11
0
        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]);
    }
예제 #14
0
    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);
    }
예제 #15
0
        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);
        }
예제 #16
0
        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);
            }
        }