private void View3DWidget_AfterDraw(object sender, DrawEventArgs e)
        {
            if (view3DWidget?.HasBeenClosed == false && this.TrackingObject != null)
            {
                // Account for loading items in InsertionGroups - inherit parent transform
                var offset = TrackingObject.Parent?.Matrix ?? Matrix4X4.Identity;

                AxisAlignedBoundingBox bounds = TrackingObject.GetAxisAlignedBoundingBox(offset);

                Vector3 renderPosition    = bounds.GetBottomCorner(2);
                Vector2 cornerScreenSpace = view3DWidget.Object3DControlLayer.World.GetScreenPosition(renderPosition) - new Vector2(20, 0);

                e.Graphics2D.PushTransform();
                Affine currentGraphics2DTransform = e.Graphics2D.GetTransform();
                Affine accumulatedTransform       = currentGraphics2DTransform * Affine.NewTranslation(cornerScreenSpace.X, cornerScreenSpace.Y);
                e.Graphics2D.SetTransform(accumulatedTransform);

                progressBar.OnDraw(e.Graphics2D);

                if (!string.IsNullOrEmpty(this.State))
                {
                    e.Graphics2D.DrawString(this.State, 0, -20, 11);
                }

                e.Graphics2D.PopTransform();
            }
        }
        private void View3DWidget_AfterDraw(object sender, DrawEventArgs e)
        {
            if (view3DWidget?.HasBeenClosed == false && this.TrackingObject != null)
            {
                // Account for loading items in InsertionGroups - inherit parent transform
                var offset = TrackingObject.Parent?.Matrix ?? Matrix4X4.Identity;

                AxisAlignedBoundingBox bounds = TrackingObject.GetAxisAlignedBoundingBox(offset);

                Vector3 renderPosition    = bounds.GetBottomCorner(2);
                Vector2 cornerScreenSpace = view3DWidget.Object3DControlLayer.World.GetScreenPosition(renderPosition) - new Vector2(20, 10) * GuiWidget.DeviceScale;

                e.Graphics2D.PushTransform();
                Affine currentGraphics2DTransform = e.Graphics2D.GetTransform();
                Affine accumulatedTransform       = currentGraphics2DTransform * Affine.NewTranslation(cornerScreenSpace.X, cornerScreenSpace.Y);
                e.Graphics2D.SetTransform(accumulatedTransform);

                progressBar.OnDraw(e.Graphics2D);

                if (!string.IsNullOrEmpty(this.State))
                {
                    var stringPrinter = new TypeFacePrinter(this.State, 9, new Vector2(0, -20));
                    var textBounds    = stringPrinter.LocalBounds;
                    textBounds.Inflate(textBounds.Height / 4);
                    e.Graphics2D.Render(new RoundedRect(textBounds, textBounds.Height / 4), theme.BackgroundColor);
                    stringPrinter.Render(e.Graphics2D, theme.TextColor);
                }

                e.Graphics2D.PopTransform();
            }
        }
Exemple #3
0
    IEnumerator StartBattle(TrackingObject _first_turn, TrackingObject _second_turn)
    {
        yield return(new WaitForSeconds(1.0f));

        game_state_ = eGameState.Result;
        int first_hp  = _first_turn.hp_;
        int second_hp = _second_turn.hp_;

        // 체력 정보 갱신
        _first_turn.obj_text_mesh_.text  = _first_turn.name_ + "\n HP:" + first_hp;
        _second_turn.obj_text_mesh_.text = _second_turn.name_ + "\n HP:" + second_hp;

        while (true)
        {
            // 선공의 턴
            _first_turn.obj_animation_.Play("Attack");
            yield return(new WaitForSeconds(_first_turn.obj_animation_.GetClip("Attack").length));

            _first_turn.obj_animation_.Play("Idle");
            second_hp -= _first_turn.atk_;


            // 체력 정보 갱신
            _first_turn.obj_text_mesh_.text  = _first_turn.name_ + "\n HP:" + first_hp;
            _second_turn.obj_text_mesh_.text = _second_turn.name_ + "\n HP:" + second_hp;
            if (second_hp <= 0)
            {
                // _second_turn 의 패배
                system_message_ = _first_turn.name_ + " 가 승리하였습니다.";
                break;
            }
            yield return(new WaitForSeconds(1.0f));

            // 후공의 턴
            _second_turn.obj_animation_.Play("Attack");
            yield return(new WaitForSeconds(_second_turn.obj_animation_.GetClip("Attack").length));

            _second_turn.obj_animation_.Play("Idle");
            first_hp -= _second_turn.atk_;


            // 체력 정보 갱신
            _first_turn.obj_text_mesh_.text  = _first_turn.name_ + "\n HP:" + first_hp;
            _second_turn.obj_text_mesh_.text = _second_turn.name_ + "\n HP:" + second_hp;
            if (first_hp <= 0)
            {
                // _first_turn 의 패배
                system_message_ = _second_turn.name_ + " 가 승리하였습니다.";
                break;
            }

            yield return(new WaitForSeconds(1.0f));
        }
    }
 private void OnGUI()
 {
     for (int i = 0; i < obj_zone.Length; i++)
     {
         TrackingObject zone = obj_zone[i];
         if (zone.is_detected_)
         {
             StartCoroutine(getZoneData(zone.model_name, humid_text[i], temp_text[i]));
         }
     }
 }
Exemple #5
0
 private void OnGUI()
 {
     for (int i = 0; i < obj_band.Length; i++)
     {
         TrackingObject band = obj_band[i];
         if (band.is_detected_)
         {
             StartCoroutine(getBandData(band.model_name, start_time_text[i], end_time_text[i], cost_text[i]));
         }
     }
 }
Exemple #6
0
        private void computeCurrentPosition()
        {
            TrackingObject obj = tracker.TrackingObject;

            DoubleRange unit   = new DoubleRange(-1, 1);
            DoubleRange circle = new DoubleRange(Math.PI, 0);

            currentPosition.X = (float)Tools.Scale(xaxisRange, unit, obj.Center.X);
            currentPosition.Y = (float)Tools.Scale(yaxisRange, unit, obj.Center.Y);
            currentAngle      = (float)Tools.Scale(angleRange, circle, obj.Angle);
            currentScale      = (float)Tools.Scale(scaleRange, unit, Math.Sqrt(obj.Area));
        }
        private void computeCurrentPosition()
        {
            TrackingObject obj = tracker.TrackingObject;

            DoubleRange unit   = new DoubleRange(-1, 1);
            DoubleRange circle = new DoubleRange(Math.PI, 0);

            currentX     = (float)Vector.Scale(obj.Center.X, xaxisRange, unit);
            currentY     = (float)Vector.Scale(obj.Center.Y, yaxisRange, unit);
            currentAngle = (float)Vector.Scale(obj.Angle, angleRange, circle);
            currentScale = (float)Vector.Scale(Math.Sqrt(obj.Area), scaleRange, unit);
        }
Exemple #8
0
        private static void TrackObjectInternal(Object obj, LoadedBundle loadedBundle)
        {
            var id = obj.GetInstanceID();

            if (s_TrackingObjects.TryGetValue(id, out var trackingObject))
            {
                trackingObject.RefCount++;
            }
            else
            {
                trackingObject = new TrackingObject(obj, loadedBundle);
                RetainBundleInternal(trackingObject.Bundle, 1);
            }
            s_TrackingObjects[id] = trackingObject; //update
        }
Exemple #9
0
        private static Maybe <PropertyValue> GetProperty(TrackingObject trackingObject, PropertyTag propertyTag)
        {
            var property = trackingObject.GetProperty(propertyTag);

            if (property.HasNoValue)
            {
                return(Maybe <PropertyValue> .NoValue());
            }

            if (property.Value.State == PropertyStates.Deleted ||
                property.Value.State == PropertyStates.LoadedAndDeleted)
            {
                return(Maybe <PropertyValue> .NoValue());
            }

            return(property.Value.Value);
        }
Exemple #10
0
        public static Maybe <PropertyValue> GetProperty(this TrackingObject trackingObject, PropertyTag propertyTag, Func <Maybe <PropertyValue> > untrackedPropertyValueReader)
        {
            var propertyValue = GetProperty(trackingObject, propertyTag);

            if (propertyValue.HasValue)
            {
                return(propertyValue);
            }

            var untrackedPropertyValue = untrackedPropertyValueReader();

            if (untrackedPropertyValue.HasNoValue)
            {
                return(Maybe <PropertyValue> .NoValue());
            }

            trackingObject.UpdateProperty(
                propertyTag,
                p => new PropertyTrackingObject(propertyTag, PropertyStates.Loaded, untrackedPropertyValue.Value));

            return(untrackedPropertyValue);
        }
Exemple #11
0
        private void computeCurrentPosition(int width, int height)
        {
            TrackingObject obj = tracker.TrackingObject;

            DoubleRange scaleX = new DoubleRange(0, width);
            DoubleRange scaleY = new DoubleRange(0, height);
            DoubleRange unit   = new DoubleRange(-1, 1);

            this.rawX = (float)BestCS.Math.Tools.Scale(scaleX, unit, obj.Center.X);
            this.rawY = (float)BestCS.Math.Tools.Scale(scaleY, unit, obj.Center.Y);

            double newPositionX = BestCS.Math.Tools.Scale(xaxisRange, unit, rawX);
            double newPositionY = BestCS.Math.Tools.Scale(yaxisRange, unit, rawY);

            xsmooth.Push(newPositionX);
            ysmooth.Push(newPositionY);

            newPositionX = xsmooth.Mean;
            newPositionY = ysmooth.Mean;

            this.currentX = (float)(Math.Round(newPositionX, 1));
            this.currentY = (float)(Math.Round(newPositionY, 1));
        }
Exemple #12
0
        private static void TrackObjectsInternal <T>(T[] objs, LoadedBundle loadedBundle) where T : Object
        {
            int retainCount = 0;

            for (int i = 0; i < objs.Length; i++)
            {
                var id = objs[0].GetInstanceID();
                if (s_TrackingObjects.TryGetValue(id, out var trackingObject))
                {
                    trackingObject.RefCount++;
                }
                else
                {
                    trackingObject = new TrackingObject(objs[0], loadedBundle);
                    retainCount++;
                }
                s_TrackingObjects[id] = trackingObject; //update
            }
            if (retainCount > 0)
            {
                RetainBundleInternal(loadedBundle, retainCount);                 //do once
            }
        }
Exemple #13
0
        private void source_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            if (!IsRunning || (!IsTracking && !IsDetecting))
            {
                return;
            }


            lock (syncObject)
            {
                Bitmap frame = eventArgs.Frame;

                int width  = frame.Width;
                int height = frame.Height;

                BitmapData data = frame.LockBits(new Rectangle(0, 0, width, height),
                                                 ImageLockMode.ReadWrite, frame.PixelFormat);

                UnmanagedImage head = new UnmanagedImage(data);


                if (IsDetecting)
                {
                    IsDetecting = false;

                    // Process the nose detector in the head image
                    Rectangle[] regions = detector.ProcessFrame(head);

                    if (regions.Length >= 1)
                    {
                        // Re-initialize tracker
                        tracker.Reset();
                        tracker.SearchWindow = regions[0];
                        tracker.ProcessFrame(head);

                        // Update initial position
                        computeCurrentPosition(width, height);

                        OnFaceEnter(new FaceEventArgs(currentX, currentY));
                    }
                    else
                    {
                        IsDetecting = true;
                    }
                }

                else if (IsTracking)
                {
                    // Track the object
                    tracker.ProcessFrame(head);

                    // Get the object position
                    TrackingObject obj = tracker.TrackingObject;

                    // Update current position
                    computeCurrentPosition(width, height);

                    if (obj.IsEmpty)
                    {
                        OnFaceLeave(EventArgs.Empty);
                    }

                    else
                    {
                        OnFaceMove(new FaceEventArgs(currentX, currentY));
                    }
                }

                frame.UnlockBits(data);
            }
        }
Exemple #14
0
 void Awake()
 {
     stepBack       = GetComponent <StepBack>();
     trackingObject = GetComponent <TrackingObject>();
     animator       = GetComponent <Animator>();
 }
Exemple #15
0
        private void source_NewFrame(object sender, NewFrameEventArgs eventArgs)
        {
            if (requestedToStop)
            {
                return;
            }

            if (!IsTracking && !IsDetecting)
            {
                return;
            }


            lock (syncObject)
            {
                // skip first frames during initialization
                if (skip < 10)
                {
                    skip++; return;
                }

                Bitmap frame = eventArgs.Frame;

                int width  = frame.Width;
                int height = frame.Height;

                BitmapData data = frame.LockBits(new Rectangle(0, 0, width, height),
                                                 ImageLockMode.ReadWrite, frame.PixelFormat);

                UnmanagedImage image = new UnmanagedImage(data);

                if (IsDetecting)
                {
                    // Reduce frame size to process it faster
                    float xscale = (float)width / resize.NewWidth;
                    float yscale = (float)height / resize.NewHeight;

                    UnmanagedImage downsample = resize.Apply(image);

                    // Process the face detector in the downsampled image
                    Rectangle[] regions = detector.ProcessFrame(downsample);

                    // Check if the face has been steady 5 frames in a row
                    if (detector.Steady >= 5)
                    {
                        // Yes, so track the face
                        Rectangle face = regions[0];

                        // Reduce the face size to avoid tracking background
                        Rectangle window = new Rectangle(
                            (int)((face.X + face.Width / 2f) * xscale),
                            (int)((face.Y + face.Height / 2f) * yscale),
                            1, 1);

                        window.Inflate((int)(0.25f * face.Width * xscale),
                                       (int)(0.40f * face.Height * yscale));

                        // Re-initialize tracker
                        tracker.Reset();
                        tracker.SearchWindow = window;
                        tracker.ProcessFrame(image);

                        // Update initial position
                        computeCurrentPosition();

                        OnHeadEnter(new HeadEventArgs(currentPosition, currentAngle, currentScale));
                    }
                }

                else if (IsTracking)
                {
                    tracker.Extract = (NewFrame != null);

                    // Track the object
                    tracker.ProcessFrame(image);

                    // Get the object position
                    TrackingObject obj = tracker.TrackingObject;

                    // Update current position
                    computeCurrentPosition();

                    if (obj.IsEmpty || !tracker.IsSteady)
                    {
                        OnHeadLeave(EventArgs.Empty);
                    }

                    else
                    {
                        OnHeadMove(new HeadEventArgs(currentPosition, currentAngle, currentScale));

                        if (NewFrame != null && obj.Image != null)
                        {
                            Bitmap headFrame = obj.Image.ToManagedImage();
                            NewFrame(this, new NewFrameEventArgs(headFrame));
                        }
                    }
                }

                frame.UnlockBits(data);
            }
        }
Exemple #16
0
    // Update is called once per frame
    void Update()
    {
        if (dlg.Active == true)
        {
            return;
        }
        if (TrackingObject != null)
        {
            float camera_angle    = 90f;
            float toCheckDistance = 6f;
            ViewRader(camera_angle, toCheckDistance, GetComponent <Transform>().position);

            int index = Search(camera_angle, toCheckDistance, GetComponent <Transform>().position, TrackingObject);
            // Debug.Log(index);

            // エネミーに見つかっていないときの処理
            if (index == -1)
            {
                if (floor.BGM() == "Warning")
                {
                    floor.BGM("Default");
                }
                TrackingObject.GetComponent <PlayerCellController>().SetColor();
                // 自作
                // autoMovingSpeed = 1.0f;
            }
            // エネミーに見つかっているときの処理
            else
            {
                floor.BGM("Warning");
                TrackingObject.GetComponent <PlayerCellController>().SetColor(new Color32(255, 0, 255,
                                                                                          TrackingObject.GetComponent <PlayerCellController>().defaultColor.a));
                autoMovingSpeed = 5.0f;
                // 初めて相手を見つけたときまたは見つけた相手が動いたとき(index番号が変わったとき)
                if (nextNavigation.Count == 0 || nextNavigation[nextNavigation.Count - 1] != index)
                {
                    pmotion.Cancel();
                    // 一個前に自動移動した時間autoMovedTime
                    autoMovedTime = Time.realtimeSinceStartup - AutoMovingSpan;                                         //プレイヤーのいち
                    List <int> route = floor.blocks.Solve(floor.blocks.GetBlockIndex(GetComponent <Transform>().position), index);
                    nextNavigation.Clear();
                    for (int cnt = 1; cnt < route.Count; cnt++)
                    {
                        nextNavigation.Add(route[cnt]);
                    }
                    routeRenderer.Render(route, i => floor.blocks.GetBlockPosition(i), Color.red);
                }
            }
        }

        // Playerの条件分岐
        if (AutoMovingSpan == 0)
        {
            foreach (var elem in actions)
            {
                if (Input.GetKeyDown(elem.Key))
                {
                    Move(elem.Value);
                }
            }
        }
        // エネミーの条件分岐
        else if (Time.realtimeSinceStartup > autoMovedTime + AutoMovingSpan / autoMovingSpeed)
        {
            autoMovedTime = Time.realtimeSinceStartup;
            pmotion.Unset();

            int[] pos = floor.blocks.GetBlockIndexXZ(GetComponent <Transform>().position);

            bool moved = false;
            while (nextNavigation.Count > 0)
            {
                int next = nextNavigation[0];
                int x    = floor.blocks.i2x(next);
                int z    = floor.blocks.i2z(next);
                if (x - pos[0] != 0 || z - pos[1] != 0)
                {
                    Move(new int[] { x - pos[0], z - pos[1], 0, 1 }, () =>
                    {
                        nextNavigation.RemoveAt(0);
                        if (nextNavigation.Count == 0)
                        {
                            autoMovingSpeed = 1.0f;
                            routeRenderer.clear();
                            // Clearが効かない
                            // routeRenderer.Clear();
                        }
                    });
                    moved = true;
                    break;
                }
                else
                {
                    nextNavigation.RemoveAt(0);
                }
            }
            // movedがfalseだった場合は自動運転(ランダム)に切り替える
            if (moved == false)
            {
                List <string> avail = new List <string>();
                // 動ける範囲があるか探す処理
                foreach (var d in nextPosition)
                {
                    if (floor.blocks.IsWall(pos[0] + d.Value[0], pos[1] + d.Value[1]) == false)
                    {
                        avail.Add(d.Key);
                    }
                }
                if (avail.Count != 0)
                {
                    Move(nextPosition[avail[UnityEngine.Random.Range(0, avail.Count)]]);
                }
            }
        }
        // めちゃくちゃ大事な処理
        // 動いたあとの場所をしゅとくする
        // gameObject.nameが何の名前なのかを調べる
        floor.UpdateObjectPosition(gameObject.name, GetComponent <Transform>().position, GetComponent <Transform>().rotation);
    }