void Start()
 {
     leftDragDetector = new DragDetector(dragStartDistance);
     OrbitPoint       = new GameObject("Stage Orbit").transform;
     RootTransform.SetParent(OrbitPoint, true);
     OrbitPoint.Rotate(Vector3.up, -40, Space.World);
     OrbitPoint.Rotate(Vector3.left, 10, Space.World);
     currentRotation = new Vector2(40, -10);
     StartOrbit();
 }
示例#2
0
    public void InventoryItemRotation()
    {
        SlotShape ss = new SlotShape(new int[, ]
        {
            { 1 },  // (0,0)
            { 1 },  // (0,1)
            { 1 }   // (0,2)
        });


        var ii = new GameObject().AddComponent <InventoryItemUI>();

        ii.GetComponent <InventoryItemUI>().Init(ss);

        // Rotate Pivot Origin (0,0) -> (0,0)(1,0)(2,0)
        ii.Rotate(new Vector2(0, 0), 1);
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(0, 0)), ii.ToString());
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(1, 0)), ii.ToString());
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(2, 0)), ii.ToString());
        // Rotate Pivot (0,1) -> (-1,1)(0,1)(1,1)
        ii = new GameObject().AddComponent <InventoryItemUI>();
        ii.GetComponent <InventoryItemUI>().Init(ss);
        ii.Rotate(new Vector2(0, 1), -1);
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(-1, 1)), ii.ToString());
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(0, 1)), ii.ToString());
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(1, 1)), ii.ToString());
        // Rotate Pivot (0,2) -> (-2, 2)(-1, 2)(0,2)
        ii = new GameObject().AddComponent <InventoryItemUI>();
        ii.GetComponent <InventoryItemUI>().Init(ss);
        ii.Rotate(new Vector2(0, 2), 1);
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(-2, 2)), ii.ToString());
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(-1, 2)), ii.ToString());
        Assert.AreEqual(true, ii.itemSlots.Contains(new Vector2(0, 2)), ii.ToString());
    }
示例#3
0
    void Arc(GameObject ShotStyle, int nbBullets, int espacement)
    {
        var newTrans1 = new GameObject().transform;
        var newTrans2 = new GameObject().transform;

        for (int i = 0; i <= nbBullets; i++)
        {
            var bullet1 = Instantiate(ShotStyle, BulletSpawn.position, newTrans1.rotation);
            var bullet2 = Instantiate(ShotStyle, BulletSpawn.position, newTrans2.rotation);
            newTrans1.Rotate(new Vector3(0, 0, espacement));
            newTrans2.Rotate(new Vector3(0, 0, -espacement));
        }
    }
示例#4
0
        private void autoHover()
        {
            {
                Vector3  heading = (Vector3d)this.vessel.transform.up;
                Vector3d up      = (this.vessel.GetComponent <Rigidbody>().position - this.vessel.mainBody.position).normalized;

                Transform modifiedUp = new GameObject().transform;
                modifiedUp.rotation = Quaternion.LookRotation(up, heading);
                modifiedUp.Rotate(new Vector3(-90, 0, 180));

                partTransform.localRotation = Quaternion.Euler(currentRotation + new Vector3(defaultRotationX, defaultRotationY, defaultRotationZ));
                partTransform.rotation      = Quaternion.RotateTowards(partTransform.rotation, modifiedUp.rotation, steerAmount * 4);
            }
        }
示例#5
0
 private void OnGUI()
 {
     if (GUILayout.Button("Add 10230"))
     {
         Transform t = new GameObject().transform;
         t.parent = transform;
         for (int j = 0; j < 10; j++)
         {
             Matrix4x4[] arr = new Matrix4x4[1023];
             for (int i = 0; i < 1023; i++)
             {
                 t.localPosition = new Vector3(Random.Range(-rd, rd), Random.Range(-rd, rd), Random.Range(-rd, rd));
                 t.localScale    = Vector3.one * Random.Range(0, rd * scale);
                 t.Rotate(Vector3.up, Random.Range(0f, 360f));
                 t.Rotate(Vector3.right, Random.Range(0f, 360f));
                 arr[i] = t.localToWorldMatrix;
             }
             _matrixArray.Add(arr);
         }
         DestroyImmediate(t.gameObject);
     }
     GUILayout.Label($"Count: {_matrixArray.Count * 1023}");
 }
示例#6
0
    /// <summary>
    /// 创建圆环
    /// </summary>
    /// <param name="deg">圆环角度</param>
    /// <param name="radius">圆环半径</param>
    /// <param name="dot">圆环初始位置角度</param>
    private void CreateArch(int deg, int radius, int dot)
    {
        ProBuilderMesh pbMesh = ShapeGenerator.GenerateArch(PivotLocation.FirstVertex, deg, radius, 1, 1, 20, true, true, true, true, true);

        pbMesh.gameObject.tag = "Archs";
        pbMesh.gameObject.AddComponent <MeshCollider>();
        pbMesh.transform.Rotate(-90, 0, 0);
        pbMesh.GetComponent <MeshRenderer>().material = data.mat;

        Transform yPos = new GameObject("yPos").transform;

        yPos.Rotate(0, dot, 0);
        pbMesh.transform.SetParent(yPos, false);
        yPos.SetParent(this.transform, false);
        archs.Add(pbMesh);
    }
    static void RandomizePos()
    {
        Transform tempHolder = new GameObject().transform;
        var       items      = Selection.transforms;

        Undo.RecordObjects(items, "Store positions before distribute");
        for (int i = 0; i < items.Length; i++)
        {
            var obj = items[i];
            tempHolder.rotation = obj.rotation;
            obj.SetParent(tempHolder);
            obj.localPosition = Vector3.forward * R * Random.Range(0.3f, 1f);
            tempHolder.Rotate(Random.Range(-180, 180), Random.Range(-180, 180), 0);
            obj.SetParent(null);
        }
        GameObject.DestroyImmediate(tempHolder.gameObject);
    }
示例#8
0
        public static Matrix4x4 fromUnityMatrix(GameObject sceneRoot, JSONNode metadata = null)
        {
            if (metadata == null)
            {
                metadata = sceneRoot.GetComponent <ForgeProperties> ().Properties;
            }

            Vector3 center = GetSceneBoundingBox(sceneRoot, metadata).center;
            Vector3 pivot  = GetSceneOrigin(sceneRoot, metadata);

            if (IsMarkerDefined(sceneRoot, metadata))
            {
                pivot += /*center +*/ GetMarkerPoint(sceneRoot, metadata);
            }
            Vector3 upvector = GetSceneUpVector(sceneRoot, metadata);
            string  units    = GetSceneUnit(sceneRoot, metadata);

            Transform tr = new GameObject().transform;

            if (upvector [2] != 0f)                 // Z axis
            {
                tr.Rotate(Vector3.right, -90);
                tr.localScale = new Vector3(-1f, 1f, 1f);
            }
            float unitsConvert = ForgeLoaderEngine.convertToMeter(units);

            if (unitsConvert != 1.0f)
            {
                tr.localScale = new Vector3(tr.localScale.x * unitsConvert, tr.localScale.y * unitsConvert, tr.localScale.z * unitsConvert);
            }
            //tr.localPosition =-pivot ;

            Matrix4x4 mat = Matrix4x4.identity;

            mat = tr.worldToLocalMatrix;

            Matrix4x4 mTR = Matrix4x4.identity;

            mTR.m03 = pivot.x;
            mTR.m13 = pivot.y;
            mTR.m23 = pivot.z;
            mat     = mTR * mat;
            GameObject.DestroyImmediate(tr.gameObject);
            return(mat);
        }
示例#9
0
    void Cercle(float angle, float nbBullets, GameObject ShotStyle)
    {
        var   newTrans  = new GameObject().transform;
        float angleStep = 360f / nbBullets;
        float radius    = 5f;

        for (int i = 0; i <= nbBullets; i++)
        {
            float bulletDirXposition = BulletSpawn.position.x + Mathf.Sin((angle * Mathf.PI) / 180) * radius;
            float bulletDirYposition = BulletSpawn.position.y + Mathf.Cos((angle * Mathf.PI) / 180) * radius;

            Vector3 projectileVector        = new Vector3(bulletDirXposition, bulletDirYposition, 0);
            Vector3 projectileMoveDirection = (projectileVector - BulletSpawn.position).normalized * 5;

            var bullet = Instantiate(ShotStyle, BulletSpawn.position, newTrans.rotation);
            bullet.GetComponent <Rigidbody2D> ().velocity = new Vector2(projectileMoveDirection.x, projectileMoveDirection.y);
            angle += angleStep;
            newTrans.Rotate(new Vector3(0, 0, angle));
        }
    }
示例#10
0
    private void Control(out Vector3 position, out Quaternion rotation)
    {
        Transform _transform = new GameObject().transform;

        _transform.position = transform.position;
        _transform.rotation = transform.rotation;
        if (target != null)
        {
            _transform.rotation = Quaternion.RotateTowards(_transform.rotation, Quaternion.LookRotation(target.transform.position - _transform.position), rotSpeed * Time.fixedDeltaTime);
            float _rotSpeed = (moveSpeed * 360.0f) / (2 * Mathf.PI * Vector3.Distance(_transform.position, target.transform.position));
            _transform.RotateAround(target.transform.position, target.transform.TransformDirection(Vector3.up), -1 * inputDir.x * _rotSpeed * Time.fixedDeltaTime);
            _transform.position = Vector3.MoveTowards(_transform.position, target.transform.position, inputDir.y * moveSpeed * Time.fixedDeltaTime);
        }
        else
        {
            _transform.Rotate(_transform.TransformDirection(Vector3.up), inputDir.x * rotSpeed * Time.fixedDeltaTime);
            _transform.position += _transform.TransformDirection(Vector3.forward) * inputDir.y * moveSpeed * Time.fixedDeltaTime;
        }
        position = _transform.position;
        rotation = _transform.rotation;
        Destroy(_transform.gameObject);
    }
示例#11
0
        public void CreateTrack()
        {
            ParseTrack();
            CreateRotations();


            var holder      = new GameObject("LevelHolder");
            var levelHolder = holder.AddComponent <LevelHolder>();

            levelHolder._startPercent = (_playerStartIndex + _prefabs.startPointOffset) / (double)(_track.Length);

            var go = new GameObject("Track", typeof(SplineComputer));

            go.transform.parent = holder.transform;
            var spline = go.GetComponent <SplineComputer>();

            levelHolder.Init(spline);

            var points = new List <SplinePoint>(_track.Length);
            var point  = new GameObject().transform;

            for (var i = 0; i < _track.Length; i++)
            {
                var t     = _track[i];
                var p     = new SplinePoint(point.position);
                var angle = 0f;
                foreach (var dir in t.dir)
                {
                    switch (dir)
                    {
                    case TrackDir.None:
                    case TrackDir.Fence:
                        break;

                    case TrackDir.Left:
                    case TrackDir.Right:
                    case TrackDir.Up:
                    case TrackDir.Down:
                        point.Rotate(_directions2[(int)dir]);
                        break;

                    case TrackDir.ShiftLeft:
                        point.position += point.right * (-1f * _stepHorizontalShift);
                        break;

                    case TrackDir.ShiftRight:
                        point.position += point.right * _stepHorizontalShift;
                        break;

                    case TrackDir.ShiftUp:
                        point.position += point.up * _stepVerticalShift;
                        break;

                    case TrackDir.ShiftDown:
                        point.position += point.up * (-1f * _stepVerticalShift);
                        break;

                    case TrackDir.DeathloopStart:
                    {
                        var rot = Quaternion.LookRotation(p.position - points[points.Count - 1].position, p.normal);
                        var dl  = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.DeathLoopStart);
                        var dlt = dl.transform;
                        dlt.position   = p.position;
                        dlt.rotation   = rot;
                        dlt.parent     = spline.transform.parent;
                        dlt.localScale = new Vector3(_lines * _linesInterval, dlt.localScale.y, dlt.localScale.z);
                        break;
                    }

                    case TrackDir.DeathloopEnd:
                    {
                        var rot = Quaternion.LookRotation(p.position - points[points.Count - 1].position, p.normal);
                        var dl  = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.DeathLoopEnd);
                        var dlt = dl.transform;
                        dlt.position   = p.position;
                        dlt.rotation   = rot;
                        dlt.parent     = spline.transform.parent;
                        dlt.localScale = new Vector3(_lines * _linesInterval, dlt.localScale.y, dlt.localScale.z);
                        break;
                    }

                    case TrackDir.RotateLeft:
                        angle += _stepRotate;
                        break;

                    case TrackDir.RotateRight:
                        angle -= _stepRotate;
                        break;

                    default:
                        throw new ArgumentOutOfRangeException();
                    }
                }
                var r = point.rotation;
                point.Rotate(0f, 0f, angle * _stepRotate);
                p.normal = point.up;
                PatchRotation(point);
                point.position += point.forward * _stepLength;
                points.Add(p);
            }
            spline.SetPoints(points.ToArray());
            spline.type = Spline.Type.BSpline;

            DestroyImmediate(point.gameObject);
            {
                var start = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.StartLine.prefab);
                var pos   = spline.Evaluate(spline.Project(points[_prefabs.startPointIndex + _prefabs.startPointOffset].position));
                start.transform.rotation = pos.rotation;
                start.transform.position = pos.position + pos.rotation * _prefabs.StartLine.offset;
                start.transform.parent   = spline.transform.parent;
            }
            {
                var finish = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.FinishLine.prefab);
                var pos    = spline.Evaluate(spline.Project(points[points.Count - 1 - _prefabs.finishAdd].position));
                finish.transform.rotation = pos.rotation;
                finish.transform.position = pos.position + pos.rotation * _prefabs.FinishLine.offset;
                finish.transform.parent   = spline.transform.parent;
            }
            if (_prefabs.TrackHeader.prefab != null)
            {
                var trackHeader = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.TrackHeader.prefab);
                var pos         = spline.Evaluate(spline.Project(points[0].position));
                trackHeader.transform.rotation = pos.rotation;
                trackHeader.transform.position = pos.position + pos.rotation * _prefabs.TrackHeader.offset;
                trackHeader.transform.parent   = spline.transform.parent;
            }
            if (_prefabs.TrackFooter.prefab != null)
            {
                var trackFooter = (GameObject)PrefabUtility.InstantiatePrefab(_prefabs.TrackFooter.prefab);
                var pos         = spline.Evaluate(spline.Project(points[points.Count - 1].position));
                trackFooter.transform.rotation = pos.rotation;
                trackFooter.transform.position = pos.position + pos.rotation * _prefabs.TrackFooter.offset;
                trackFooter.transform.parent   = spline.transform.parent;
            }
            var dataHolder = FindObjectOfType <DataHolder>();

            dataHolder.SetInternals(spline, levelHolder);
            eGUI.SetDirty(dataHolder);
            CreateLines(levelHolder);
        }
示例#12
0
    public override void GenerateObjectsInWorld()
    {
        //Seleziono il pavimento
        Transform    floor = SpatialProcessing.Instance.floors.ElementAt(0).transform;
        SurfacePlane plane = floor.GetComponent <SurfacePlane>();


        Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal);

        floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal);

        Vector3    gazePosition = new Vector3(0f, 0f, 0f);
        RaycastHit hitInfo;

        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers))
        {
            gazePosition = hitInfo.point;
        }

        Vector3 boxesPosition = gazePosition;

        boxesPosition.y = floorPosition.y + 0.1f;


        Vector3    relativePos = gazePosition - Camera.main.transform.position;
        Quaternion rotation    = Quaternion.LookRotation(relativePos);

        rotation.x = 0f;
        rotation.z = 0f;


        List <Transform> objs = transform.GetComponentInChildren <PlayModeManager>().GenerateObjects(ObjectsPrefabs, numberOfBoxes);

        Transform sceneRoot = GameObject.Find("Broadcasted Content").transform;

        System.Random rnd   = new System.Random();
        Transform     elems = new GameObject("Elements").transform;

        elems.parent = sceneRoot;
        for (int i = 1; i <= numberOfBoxes / 2; i++)
        {
            Transform elem = new GameObject("Element").transform;
            elem.parent   = elems;
            elem.position = elems.TransformPoint(new Vector3((float)Math.Pow(-1, i) * 0.3f * (i / 2), 0f, 0f));
            GameObject box = Instantiate(BoxPrefab, elem.position, BoxPrefab.transform.rotation, elem);
            int        j   = rnd.Next(0, objs.Count);
            Transform  obj = Instantiate(objs.ElementAt(j), box.transform.position, box.transform.rotation, elem);
            obj.gameObject.SetActive(false);
            objs.RemoveAt(j);

            Transform elem2 = new GameObject("Element").transform;
            elem2.parent   = elems;
            elem2.position = elems.TransformPoint(new Vector3((float)Math.Pow(-1, i) * 0.3f * (i / 2), 0f, 0.3f));
            GameObject box2 = Instantiate(BoxPrefab, elem2.position, BoxPrefab.transform.rotation, elem2);
            int        k    = rnd.Next(0, objs.Count);
            Transform  obj2 = Instantiate(objs.ElementAt(k), elem2.position, box2.transform.rotation, elem2);
            obj2.gameObject.SetActive(false);
            objs.RemoveAt(k);
        }

        elems.Translate(boxesPosition);
        elems.Rotate(rotation.eulerAngles);


        Vector3 assistantPosition = elems.GetChild(elems.childCount - 2).TransformPoint(0.3f * (float)Math.Pow(-1, elems.childCount / 2 % 2), 0f, 0f);

        assistantPosition.y = floor.position.y;

        if (assistantPresence != 0)
        {
            Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot);
            VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z);
        }

        transform.GetComponentInChildren <PlayModeManager>().StartGame(waitingTime);
    }
示例#13
0
 private void DeleteVisualObstacles()
 {
     Transform visualObstacle;
     for (int i = 0; i < visualObstacles.Count; i++)
     {
         visualObstacle = visualObstacles[i].transform;
         if (visualObstacle.position.z + 150.0f < playerZPosition)
         {
             visualObstacle.Rotate (Vector3.zero);
             visualObstacle.gameObject.SetActive(false);
             visualObstacles.Remove(visualObstacle.gameObject);
             loadedVisualObstacles.Add(visualObstacle.gameObject);
         }
     }
 }
示例#14
0
    public override void GenerateObjectsInWorld()
    {
        Transform    floor = SpatialProcessing.Instance.floors.ElementAt(0).transform;
        SurfacePlane plane = floor.GetComponent <SurfacePlane>();


        Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal);

        floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal);

        Vector3    gazePosition = new Vector3(0f, 0f, 0f);
        RaycastHit hitInfo;

        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers))
        {
            gazePosition = hitInfo.point;
        }

        Vector3 objsPosition = gazePosition;

        objsPosition.y = floorPosition.y;


        Vector3    relativePos = Camera.main.transform.position - gazePosition;
        Quaternion rotation    = Quaternion.LookRotation(relativePos);

        rotation.x = 0f;
        rotation.z = 0f;


        Transform sceneRoot = GameObject.Find("Broadcasted Content").transform;

        Transform targets = new GameObject("Targets").transform;

        targets.parent = sceneRoot;
        targets.tag    = "Targets";
        Instantiate(Targets.transform.GetChild(0), Targets.transform.GetChild(0).position + new Vector3(0f, 0.2f, 0f), Targets.transform.GetChild(0).rotation, targets);
        targets.Translate(objsPosition);
        targets.Rotate(rotation.eulerAngles);


        Transform objs = new GameObject("ObjectsToBePlaced").transform;

        objs.parent = sceneRoot;
        objs.tag    = "ObjectsToBePlaced";
        Instantiate(ObjectsToBePlaced.transform.GetChild(0), ObjectsToBePlaced.transform.GetChild(0).position, ObjectsToBePlaced.transform.GetChild(0).rotation, objs);
        objs.Translate(Vector3.Lerp(objsPosition, Camera.main.transform.position, 0.5f));


        Counter.Instance.InitializeCounter(ObjectsToBePlaced.GetComponentsInChildren <Rigidbody>().Length);


        Vector3 assistantPosition = gazePosition + new Vector3(-0.5f, 0f, 0f);

        assistantPosition.y = floor.position.y;

        if (assistantPresence != 0)
        {
            Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot);
            VirtualAssistantManager.Instance.patience              = assistantPatience;
            VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z);
        }
    }
    public void BuildCasings()
    {
        float      half = size / 2.0f;
        GameObject bomb = GameObject.Instantiate(Empty_Bomb);

        bomb.name = size + "x" + size + " Casing (" + (size * size * 2 - 1) + " modules)";
        Casing     casing           = bomb.GetComponent <Casing>();
        Transform  visual_transform = casing.Visual;
        KMBombFace front_face       = casing.Front.GetComponent <KMBombFace>();
        KMBombFace rear_face        = casing.Back.GetComponent <KMBombFace>();

        front_face.Anchors  = new System.Collections.Generic.List <Transform>();
        front_face.Backings = new System.Collections.Generic.List <KMModuleBacking>();
        front_face.GetComponent <KMSelectable>().ChildRowLength = size;
        rear_face.Anchors  = new System.Collections.Generic.List <Transform>();
        rear_face.Backings = new System.Collections.Generic.List <KMModuleBacking>();
        rear_face.GetComponent <KMSelectable>().ChildRowLength = size;

        casing.Distance_Collider.size = new Vector3(size * 0.23f, 0.20f, size * 0.23f);
        casing.Selectable_Area.size   = new Vector3(size * 0.24f, size * 0.24f, 0.22f);
        casing.Selectable_Area.transform.Translate(0, -0.25f, 0);

        casing.Highlight.localScale = new Vector3(size * 0.24f, size * 0.24f, 0.22f);

        // casing.Body.localScale = new Vector3(size * 0.23f, 0.18f, size * 0.23f);

        float crossbar_width         = 0.025f;
        float widget_offset          = 0.22f;
        float widget_constant_offset = crossbar_width + 0.00275f;

        //Make the widget anchors
        for (int w = 0; w < size; w++)
        {
            Transform Bface = new GameObject().GetComponent <Transform>();
            Bface.Translate(new Vector3(offset * (w - half + 0.5f), 0.0f, 0.0f));
            Bface.Rotate(-90, 0, 0);
            Bface.SetParent(casing.W_Bottom);
            Bface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Bface.name       = "Bottom Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Bface.gameObject);

            Transform Tface = new GameObject().GetComponent <Transform>();
            Tface.Translate(new Vector3(offset * (w - half + 0.5f), 0.0f, 0.0f));
            Tface.Rotate(-90, 180, 0);
            Tface.SetParent(casing.W_Top);
            Tface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Tface.name       = "Top Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Tface.gameObject);

            Transform Lface = new GameObject().GetComponent <Transform>();
            Lface.Translate(new Vector3(0.0f, 0.0f, offset * (w - half + 0.5f)));
            Lface.Rotate(-90, 90, 0);
            Lface.SetParent(casing.W_Left);
            Lface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Lface.name       = "Left Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Lface.gameObject);

            Transform Rface = new GameObject().GetComponent <Transform>();
            Rface.Translate(new Vector3(0.0f, 0.0f, offset * (w - half + 0.5f)));
            Rface.Rotate(-90, -90, 0);
            Rface.SetParent(casing.W_Right);
            Rface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Rface.name       = "Right Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Rface.gameObject);
        }

        casing.W_Bottom.Translate(new Vector3(0, 0, size * -widget_offset / 2 - widget_constant_offset), Space.World);
        casing.W_Top.Translate(new Vector3(0, 0, size * widget_offset / 2 + widget_constant_offset), Space.World);
        casing.W_Left.Translate(new Vector3(size * -widget_offset / 2 - widget_constant_offset, 0, 0), Space.World);
        casing.W_Right.Translate(new Vector3(size * widget_offset / 2 + widget_constant_offset, 0, 0), Space.World);


        //Generate the crossbars.
        for (int i = 0; i <= size; i++)
        {
            Transform CrossBar1 = (GameObject.Instantiate(Cross_Bar) as GameObject).GetComponent <Transform>();
            CrossBar1.SetParent(visual_transform);
            CrossBar1.localScale = new Vector3(crossbar_width, 0.21f, size * 0.22f);
            CrossBar1.Translate(new Vector3(offset * (i - half), 0, -0));

            Transform CrossBar2 = (GameObject.Instantiate(Cross_Bar) as GameObject).GetComponent <Transform>();
            CrossBar2.SetParent(visual_transform);
            CrossBar2.localScale = new Vector3(size * 0.22f, 0.22f, crossbar_width);
            CrossBar2.Translate(new Vector3(0, 0, offset * (i - half)));
        }

        // Generate The module backings and anchors
        for (int x = 0; x < size; x++)
        {
            for (int y = 0; y < size; y++)
            {
                GameObject front_backing = GameObject.Instantiate(Bomb_Backing);    // Grab the prefab
                Transform  f             = front_backing.GetComponent <Transform>();
                f.SetParent(casing.Faces_F);
                f.Translate(new Vector3(offset * (x - half), offset * (y - half), -0.01f));
                f.Translate(new Vector3(-0.687f, 0.359f, 0.0f));
                f.name = "Bomb_Foam_" + x + "_" + y + "_F";
                Transform f_anchor = new GameObject().GetComponent <Transform>();    // We need to rotate the anchor relative to the backing, so we need a new transform
                f_anchor.position = f.position;
                f_anchor.parent   = f;
                f_anchor.Translate(0, 0.08f, 0);    // Move the modules out of the backing
                f_anchor.Rotate(new Vector3(0, 0, 0));
                f_anchor.name = "Anchor";
                front_face.Anchors.Add(f_anchor);
                front_face.Backings.Add(front_backing.GetComponent <KMModuleBacking>());
                // And do it all again for the back face
                GameObject rear_backing = GameObject.Instantiate(Bomb_Backing);
                Transform  r            = rear_backing.GetComponent <Transform>();
                r.SetParent(casing.Faces_R);
                r.Translate(new Vector3(offset * (x - half), offset * (y - half), 0.01f));
                r.Translate(new Vector3(-0.687f, 0.359f, 0.0f));
                r.Rotate(new Vector3(0, 180, 0));
                r.name = "Bomb_Foam_" + x + "_" + y + "_R";
                Transform r_anchor = new GameObject().GetComponent <Transform>();
                r_anchor.position = r.position;
                r_anchor.parent   = r;
                r_anchor.Translate(0, -0.08f, 0);
                r_anchor.Rotate(new Vector3(0, 0, 180));
                r_anchor.name = "Anchor";
                rear_face.Anchors.Add(r_anchor);
                rear_face.Backings.Add(rear_backing.GetComponent <KMModuleBacking>());
            }
        }
        bomb.GetComponent <KMBomb>().Scale = 2.2f / size;
    }
示例#16
0
    public override void GenerateObjectsInWorld()
    {
        //Seleziono il pavimento
        Transform    floor = SpatialProcessing.Instance.floors.ElementAt(0).transform;
        SurfacePlane plane = floor.GetComponent <SurfacePlane>();

        System.Random rnd = new System.Random();



        Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal);

        floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal);

        Vector3    gazePosition = new Vector3(0f, 0f, 0f);
        RaycastHit hitInfo;

        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers))
        {
            gazePosition = hitInfo.point;
        }

        Vector3 binsPosition = gazePosition;

        binsPosition.y = floorPosition.y;


        Vector3    relativePos = Camera.main.transform.position - gazePosition;
        Quaternion rotation    = Quaternion.LookRotation(relativePos);

        rotation.x = 0f;
        rotation.z = 0f;


        Transform sceneRoot = GameObject.Find("Broadcasted Content").transform;

        Transform bins = new GameObject("Bins").transform;

        bins.parent = sceneRoot;
        bins.tag    = "Targets";

        activeBins = new List <string>();
        for (int i = 1; i <= numberOfBins;)
        {
            Transform bin           = BinsPrefabs.transform.GetChild(rnd.Next(0, BinsPrefabs.transform.childCount));
            string    currentBinTag = bin.gameObject.tag;
            if (!activeBins.Contains(currentBinTag))
            {
                Instantiate(bin, new Vector3((float)Math.Pow(-1, i) * 0.4f * (i / 2), 0f, 0f), bin.rotation, bins);
                activeBins.Add(bin.gameObject.tag);
                i++;
            }
        }

        bins.Translate(binsPosition);
        bins.Rotate(rotation.eulerAngles);


        Transform waste = new GameObject("Waste").transform;

        waste.parent = sceneRoot;
        waste.tag    = "ObjectsToBePlaced";

        Vector3 wastePosition = Vector3.Lerp(Camera.main.transform.position, bins.position, 0.5f);

        wastePosition.y = floorPosition.y + 0.1f;

        for (int i = 0; i < numberOfWaste;)
        {
            Transform wasteGroup      = WastePrefabs.transform.GetChild(rnd.Next(0, WastePrefabs.transform.childCount));
            int       groupSize       = wasteGroup.GetComponentsInChildren <Rigidbody>().Length;
            Transform currentWaste    = wasteGroup.GetChild(rnd.Next(0, groupSize));
            string    currentWasteTag = currentWaste.gameObject.tag;
            if (activeBins.Contains(currentWasteTag))
            {
                Instantiate(currentWaste.gameObject, currentWaste.position, currentWaste.rotation, waste);
                i++;
            }
        }

        waste.Translate(wastePosition);
        waste.Rotate(rotation.eulerAngles);


        Counter.Instance.InitializeCounter(waste.GetComponentsInChildren <Rigidbody>().Length);


        Vector3 assistantPosition = bins.TransformPoint(-0.3f, 0f, 0.3f);

        assistantPosition.y = floor.position.y;

        if (assistantPresence != 0)
        {
            Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot);
            VirtualAssistantManager.Instance.patience              = assistantPatience;
            VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z);

            if (explainTaskGoal == 1)
            {
                VirtualAssistantManager.Instance.ExplainTaskGoal();
            }
        }
    }
示例#17
0
        protected override void InitializeScene()
        {
            creator       = BufferCreator.CreateWithBuiltInTypes();
            iset          = FLInstructionSet.CreateWithBuiltInTypes(CLAPI.MainThread, "assets/kernel/");
            checkPipeline = FLProgramCheckBuilder.CreateDefaultCheckBuilder(iset, creator);
            parser        = new FLParser(iset, creator);
            checkPipeline.Attach(parser, true);
            Mesh plane = MeshLoader.FileToMesh("assets/models/plane.obj");

            Texture texQuad   = TextureLoader.ParameterToTexture(1024, 1024, "FLDisplayTextureQuad");
            Texture texSphere = TextureLoader.ParameterToTexture(1024, 1024, "FLDisplayTextureSphere");

            GameObject objSphere = new GameObject(new Vector3(1, 1, 0), "SphereDisplay");

            LitMeshRendererComponent sphereLmr = new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader,
                                                                              Prefabs.Sphere,
                                                                              texSphere, 1);

            objSphere.AddComponent(sphereLmr);
            sphereLmr.Textures = new[]
            { sphereLmr.Textures[0], DefaultFilepaths.DefaultTexture };

            objSphere.AddComponent(new RotatingComponent());

            GameObject objQuad = new GameObject(new Vector3(-1, 1, 0), "QuadDisplay");
            LitMeshRendererComponent quadLmr = new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader, plane,
                                                                            texQuad, 1);

            objQuad.AddComponent(quadLmr);
            quadLmr.Textures = new[]
            { quadLmr.Textures[0], DefaultFilepaths.DefaultTexture };

            objQuad.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(45));

            GameObject sourceCube = new GameObject(new Vector3(0, 10, 10), "Light Source");

            sourceCube.AddComponent(new LightComponent());
            sourceCube.AddComponent(new RotateAroundComponent {
                Slow = 0.15f
            });
            sourceCube.AddComponent(new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader, Prefabs.Cube,
                                                                 TextureLoader.ColorToTexture(Color.White), 1));

            GameObject uiText = new GameObject(new Vector3(0), "UIText");

            uiText.AddComponent(new FlGeneratorComponent(new List <LitMeshRendererComponent>
            {
                sphereLmr, quadLmr
            },
                                                         512,
                                                         512, true));

            Add(sourceCube);
            Add(uiText);
            Add(DebugConsoleComponent.CreateConsole());
            Add(objSphere);
            Add(objQuad);

            GameObject bgObj = new GameObject(Vector3.UnitY * -3, "BG")
            {
                Scale = new Vector3(25, 1, 25)
            };


            bgObj.AddComponent(new LitMeshRendererComponent(DefaultFilepaths.DefaultLitShader, Prefabs.Cube,
                                                            GenerateGroundTexture(), 1));
            Add(bgObj);


            BasicCamera mainCamera =
                new BasicCamera(
                    Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f),
                                                         GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero);

            object mc = mainCamera;

            EngineConfig.LoadConfig("assets/configs/camera_fldemo.xml", ref mc);


            Add(mainCamera);
            SetCamera(mainCamera);

            GameObject camContainer = new GameObject("CamContainer");

            BasicCamera inPicCam =
                new BasicCamera(
                    Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f),
                                                         GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero);

            inPicCam.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(0));
            inPicCam.Translate(new Vector3(0, 2, 4));
            inPicCam.AddComponent(new RotateAroundComponent());
            GameObject zeroPoint = new GameObject("Zero");

            Add(zeroPoint);
            LookAtComponent comp = new LookAtComponent();

            comp.SetTarget(zeroPoint);
            inPicCam.AddComponent(comp);
            Add(inPicCam);


            splitCam = new RenderTarget(inPicCam, 1, Color.FromArgb(0, 0, 0, 0))
            {
                MergeType = RenderTargetMergeType.Additive,
                ViewPort  = new Rectangle(0, 0, (int)(GameEngine.Instance.Width * 0.3f),
                                          (int)(GameEngine.Instance.Height * 0.3f))
            };

            Add(camContainer);
            GameEngine.Instance.AddRenderTarget(splitCam);
        }
示例#18
0
 private void DeleteVisualObstacles()
 {
     Transform visualObstacle;
     for (int i = 0; i < visualObstacles.Count; i++)
     {
         visualObstacle = visualObstacles[i].transform;
         if (visualObstacle.position.z + 150.0f < playerZPosition)
         {
             if (visualObstacle.gameObject.layer == 10)
             {
                 loadedVisualObstacles.Insert(0, visualObstacle.gameObject);
             }
             else if (visualObstacle.gameObject.layer == 11)
             {
                 loadedVisualObstacles.Insert(numberOfCopiesOfEachObstacle * numberOfObstaclesInEachDifficultyLevel, visualObstacle.gameObject);
             }
             else if (visualObstacle.gameObject.layer == 12)
             {
                 loadedVisualObstacles.Add(visualObstacle.gameObject);
             }
             visualObstacle.Rotate(Vector3.zero);
             visualObstacle.gameObject.SetActive(false);
             visualObstacles.Remove(visualObstacle.gameObject);
             limit++;
         }
     }
 }
示例#19
0
        protected override void InitializeScene()
        {
            Mesh sphere = MeshLoader.FileToMesh("models/sphere_smooth.obj");
            Mesh plane  = MeshLoader.FileToMesh("models/plane.obj");
            Mesh bgBox  = MeshLoader.FileToMesh("models/cube_flat.obj");


            ShaderProgram.TryCreate(new Dictionary <ShaderType, string>
            {
                { ShaderType.FragmentShader, "shader/UITextRender.fs" },
                { ShaderType.VertexShader, "shader/UITextRender.vs" }
            }, out ShaderProgram textShader);

            ShaderProgram.TryCreate(new Dictionary <ShaderType, string>
            {
                { ShaderType.FragmentShader, "shader/texture.fs" },
                { ShaderType.VertexShader, "shader/texture.vs" }
            }, out ShaderProgram shader);

            GameObject objSphere = new GameObject(new Vector3(1, 1, 0), "SphereDisplay");

            objSphere.AddComponent(new MeshRendererComponent(shader, sphere,
                                                             TextureLoader.FileToTexture("textures/ground4k.png"), 1));
            objSphere.AddComponent(new RotatingComponent());

            GameObject objQuad = new GameObject(new Vector3(-1, 1, 0), "QuadDisplay");

            objQuad.AddComponent(new MeshRendererComponent(shader, plane,
                                                           TextureLoader.FileToTexture("textures/ground4k.png"), 1));
            objQuad.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(90));

            GameObject uiText = new GameObject(new Vector3(0), "UIText");

            uiText.AddComponent(new FLGeneratorComponent(new List <MeshRendererComponent>
            {
                objSphere.GetComponent <MeshRendererComponent>(), objQuad.GetComponent <MeshRendererComponent>()
            },
                                                         512,
                                                         512));


            GameEngine.Instance.CurrentScene.Add(uiText);
            DebugConsoleComponent dbg = DebugConsoleComponent.CreateConsole().GetComponent <DebugConsoleComponent>();

            dbg.AddCommand("mov", cmd_ChangeCameraPos);
            dbg.AddCommand("rot", cmd_ChangeCameraRot);
            dbg.AddCommand("reload", cmd_ReLoadScene);
            dbg.AddCommand("next", cmd_NextScene);
            GameEngine.Instance.CurrentScene.Add(dbg.Owner);
            GameEngine.Instance.CurrentScene.Add(objSphere);
            GameEngine.Instance.CurrentScene.Add(objQuad);

            GameObject bgObj = new GameObject(Vector3.UnitY * -3, "BG");

            bgObj.Scale = new Vector3(25, 1, 25);

            Texture bgTex = TextureLoader.FileToTexture("textures/ground4k.png");

            //BufferOperations.GetRegion<byte>(buf, new int3(), )


            bgObj.AddComponent(new MeshRendererComponent(shader, bgBox, bgTex, 1));
            GameEngine.Instance.CurrentScene.Add(bgObj);


            BasicCamera mainCamera =
                new BasicCamera(
                    Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f),
                                                         GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero);

            object mc = mainCamera;

            EngineConfig.LoadConfig("configs/camera_fldemo.xml", ref mc);


            GameEngine.Instance.CurrentScene.Add(mainCamera);
            GameEngine.Instance.CurrentScene.SetCamera(mainCamera);

            GameObject camContainer = new GameObject("CamContainer");

            BasicCamera inPicCam =
                new BasicCamera(
                    Matrix4.CreatePerspectiveFieldOfView(MathHelper.DegreesToRadians(75f),
                                                         GameEngine.Instance.Width / (float)GameEngine.Instance.Height, 0.01f, 1000f), Vector3.Zero);

            inPicCam.Rotate(new Vector3(1, 0, 0), MathHelper.DegreesToRadians(0));
            inPicCam.Translate(new Vector3(0, 2, 4));
            inPicCam.AddComponent(new RotateAroundComponent());
            GameObject zeroPoint = new GameObject("Zero");

            GameEngine.Instance.CurrentScene.Add(zeroPoint);
            LookAtComponent comp = new LookAtComponent();

            comp.SetTarget(zeroPoint);
            inPicCam.AddComponent(comp);
            GameEngine.Instance.CurrentScene.Add(inPicCam);


            splitCam = new RenderTarget(inPicCam, 1, new Color(0, 0, 0, 0))
            {
                MergeType = RenderTargetMergeType.Additive,
                ViewPort  = new Rectangle(0, 0, (int)(GameEngine.Instance.Width * 0.3f),
                                          (int)(GameEngine.Instance.Height * 0.3f))
            };

            GameEngine.Instance.CurrentScene.Add(camContainer);
            GameEngine.Instance.AddRenderTarget(splitCam);
        }
示例#20
0
    private void autoHover()
    {
        {
            Vector3 heading = (Vector3d)this.vessel.transform.up;
            Vector3d up = (this.vessel.rigidbody.position - this.vessel.mainBody.position).normalized;

            Transform partTransform = part.FindModelTransform(targetPartObject);

            Transform modifiedUp = new GameObject().transform;
            modifiedUp.rotation = Quaternion.LookRotation(up, heading);
            modifiedUp.Rotate(new Vector3(-90,0,180));

            partTransform.localRotation = Quaternion.Euler(currentRotation + new Vector3(defaultRotationX, defaultRotationY, defaultRotationZ));
            partTransform.rotation = Quaternion.RotateTowards(partTransform.rotation, modifiedUp.rotation, steerAmount*4);
        }
    }
示例#21
0
    public GameObject GenerateCase(Vector2 size)
    {
        float      halfX = size.x / 2;
        float      halfY = size.y / 2;
        GameObject bomb  = Instantiate(Empty_Bomb);

        bomb.name = size.x + "x" + size.y + " Casing (" + (size.x * size.y * 2 - 1) + " modules)";
        Casing     casing           = bomb.GetComponent <Casing>();
        Transform  visual_transform = casing.Visual;
        KMBombFace front_face       = casing.Front.GetComponent <KMBombFace>();
        KMBombFace rear_face        = casing.Back.GetComponent <KMBombFace>();

        front_face.Anchors  = new List <Transform>();
        front_face.Backings = new List <KMModuleBacking>();
        front_face.GetComponent <KMSelectable>().ChildRowLength = (int)size.x;
        rear_face.Anchors  = new List <Transform>();
        rear_face.Backings = new List <KMModuleBacking>();
        rear_face.GetComponent <KMSelectable>().ChildRowLength = (int)size.x;

        casing.Distance_Collider.size = new Vector3(size.x * 0.23f, 0.20f, size.y * 0.23f);
        casing.Selectable_Area.size   = new Vector3(size.x * 0.24f, size.y * 0.24f, 0.22f);
        casing.Selectable_Area.transform.Translate(0, -0.25f, 0);

        casing.Highlight.localScale = new Vector3(size.x * 0.24f, size.y * 0.24f, 0.22f);

        // casing.Body.localScale = new Vector3(size * 0.23f, 0.18f, size * 0.23f);

        const float crossbar_width         = 0.025f;
        const float widget_offset          = 0.22f;
        const float widget_constant_offset = crossbar_width + 0.00275f;

        //Make the widget anchors
        for (int w = 0; w < size.x; w++)
        {
            Transform Bface = new GameObject().GetComponent <Transform>();
            Bface.Translate(new Vector3(offset * (w - halfX + 0.5f), 0.0f, 0.0f));
            Bface.Rotate(-90, 0, 0);
            Bface.SetParent(casing.W_Bottom);
            Bface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Bface.name       = "Bottom Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Bface.gameObject);

            Transform Tface = new GameObject().GetComponent <Transform>();
            Tface.Translate(new Vector3(offset * (w - halfX + 0.5f), 0.0f, 0.0f));
            Tface.Rotate(-90, 180, 0);
            Tface.SetParent(casing.W_Top);
            Tface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Tface.name       = "Top Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Tface.gameObject);
        }

        for (int w = 0; w < size.y; w++)
        {
            Transform Lface = new GameObject().GetComponent <Transform>();
            Lface.Translate(new Vector3(0.0f, 0.0f, offset * (w - halfY + 0.5f)));
            Lface.Rotate(-90, 90, 0);
            Lface.SetParent(casing.W_Left);
            Lface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Lface.name       = "Left Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Lface.gameObject);

            Transform Rface = new GameObject().GetComponent <Transform>();
            Rface.Translate(new Vector3(0.0f, 0.0f, offset * (w - halfY + 0.5f)));
            Rface.Rotate(-90, -90, 0);
            Rface.SetParent(casing.W_Right);
            Rface.localScale = new Vector3(0.12f, 0.03f, 0.17f);
            Rface.name       = "Right Face";
            bomb.GetComponent <KMBomb>().WidgetAreas.Add(Rface.gameObject);
        }

        casing.W_Bottom.Translate(new Vector3(0, 0, size.y * -widget_offset / 2 - widget_constant_offset), Space.World);
        casing.W_Top.Translate(new Vector3(0, 0, size.y * widget_offset / 2 + widget_constant_offset), Space.World);
        casing.W_Left.Translate(new Vector3(size.x * -widget_offset / 2 - widget_constant_offset, 0, 0), Space.World);
        casing.W_Right.Translate(new Vector3(size.x * widget_offset / 2 + widget_constant_offset, 0, 0), Space.World);

        //Generate the crossbars.
        if (Cross_Bar.GetComponent <ExcludeFromTexturePack>() == null)
        {
            Cross_Bar.AddComponent <ExcludeFromTexturePack>();
        }
        Cross_Bar.GetComponent <Renderer>().sharedMaterial.color = MakeCaseColor(Tweaks.settings.CaseColors);

        for (int i = 0; i <= size.x; i++)
        {
            Transform CrossBar1 = Instantiate(Cross_Bar).GetComponent <Transform>();
            CrossBar1.SetParent(visual_transform);
            CrossBar1.localScale = new Vector3(crossbar_width, 0.22f, size.y * 0.22f + crossbar_width * ((i == 0 || i == size.x) ? 1 : -1));
            CrossBar1.Translate(new Vector3(offset * (i - halfX), 0, -0));
        }

        for (int i = 0; i <= size.y; i++)
        {
            Transform CrossBar2 = Instantiate(Cross_Bar).GetComponent <Transform>();
            CrossBar2.SetParent(visual_transform);
            CrossBar2.localScale = new Vector3(size.x * 0.22f + crossbar_width * ((i == 0 || i == size.y) ? 1 : -1), 0.22f, crossbar_width) - new Vector3(0.0001f, 0.0001f, 0.0001f); // Subtracted 0.0001 to prevent Z-fighting.
            CrossBar2.Translate(new Vector3(0, 0, offset * (i - halfY)));
        }

        // Generate The module backings and anchors
        for (int x = 0; x < size.x; x++)
        {
            for (int y = 0; y < size.y; y++)
            {
                GameObject front_backing = Instantiate(Bomb_Backing);    // Grab the prefab
                Transform  f             = front_backing.GetComponent <Transform>();
                f.SetParent(casing.Faces_F);
                f.Translate(new Vector3(offset * (x - halfX + 0.5f), offset * (y - halfY + 0.5f), -0.06f));
                f.name = "Bomb_Foam_" + x + "_" + y + "_F";
                Transform f_anchor = new GameObject().GetComponent <Transform>();    // We need to rotate the anchor relative to the backing, so we need a new transform
                f_anchor.position = f.position;
                f_anchor.parent   = f;
                f_anchor.Translate(0, 0.03f, 0);    // Move the modules out of the backing
                f_anchor.Rotate(new Vector3(0, 0, 0));
                f_anchor.name = "Anchor";
                front_face.Anchors.Add(f_anchor);
                front_face.Backings.Add(front_backing.GetComponent <KMModuleBacking>());
                // And do it all again for the back face
                GameObject rear_backing = Instantiate(Bomb_Backing);
                Transform  r            = rear_backing.GetComponent <Transform>();
                r.SetParent(casing.Faces_R);
                r.Translate(new Vector3(offset * (x - halfX + 0.5f), offset * (y - halfY + 0.5f), 0.06f));
                r.Rotate(new Vector3(0, 180, 0));
                r.name = "Bomb_Foam_" + x + "_" + y + "_R";
                Transform r_anchor = new GameObject().GetComponent <Transform>();
                r_anchor.position = r.position;
                r_anchor.parent   = r;
                r_anchor.Translate(0, -0.03f, 0);
                r_anchor.Rotate(new Vector3(0, 0, 180));
                r_anchor.name = "Anchor";
                rear_face.Anchors.Add(r_anchor);
                rear_face.Backings.Add(rear_backing.GetComponent <KMModuleBacking>());
            }
        }
        bomb.GetComponent <KMBomb>().Scale = Mathf.Min(2.2f / Mathf.Max(size.x, size.y), 1);

        foreach (KMSelectable selectable in bomb.GetComponentsInChildren <KMSelectable>())
        {
            selectable.gameObject.AddComponent <ModSelectable>();
        }

        bomb.AddComponent <ModBomb>();

        return(bomb);
    }
示例#22
0
    public override void GenerateObjectsInWorld()
    {
        //Seleziono il pavimento
        Transform    floor = SpatialProcessing.Instance.floors.ElementAt(0).transform;
        SurfacePlane plane = floor.GetComponent <SurfacePlane>();

        System.Random rnd = new System.Random();


        Vector3 floorPosition = floor.transform.position + (plane.PlaneThickness * plane.SurfaceNormal);

        floorPosition = AdjustPositionWithSpatialMap(floorPosition, plane.SurfaceNormal);

        Vector3    gazePosition = new Vector3(0f, 0f, 0f);
        RaycastHit hitInfo;

        if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hitInfo, 20f, Physics.DefaultRaycastLayers))
        {
            gazePosition = hitInfo.point;
        }

        Vector3 weatherPosition = gazePosition;

        weatherPosition.y = floorPosition.y + 1f;
        Debug.DrawLine(Camera.main.transform.position, weatherPosition, Color.black, 30f);


        Vector3    relativePos = Camera.main.transform.position - gazePosition;
        Quaternion rotation    = Quaternion.LookRotation(relativePos);

        rotation.x = 0f;
        rotation.z = 0f;


        Transform sceneRoot = GameObject.Find("Broadcasted Content").transform;

        Transform weather = new GameObject("Weather").transform;

        weather.parent   = sceneRoot;
        weather.position = weatherPosition;

        Transform selectedLevel   = WeatherPrefabs.transform.GetChild(numberOfLevel);
        Transform selectedWeather = selectedLevel.GetChild(rnd.Next(0, selectedLevel.childCount));

        Instantiate(selectedWeather, weather.TransformPoint(-0.2f, 0f, 0f), rotation, weather);

        selectedWeather.GetChild(1).GetComponent <TemperatureGenerator>().GenerateTemperature();


        weathertag     = GameObject.Find("Weather").transform.GetChild(0).GetChild(0).tag;
        temperaturetag = GameObject.Find("Weather").transform.GetChild(0).GetChild(1).tag;


        Transform clothes = new GameObject("Clothes").transform;

        clothes.parent = sceneRoot;
        clothes.tag    = "ObjectsToBePlaced";

        Vector3 clothesPosition = weatherPosition;

        clothesPosition.y = floorPosition.y + 0.1f;
        Debug.DrawLine(weatherPosition, clothesPosition, Color.red, 30f);

        int counter = 0;

        for (int i = 0; i < numberOfClothes; i++)
        {
            Transform     currentClothe = ClothesPrefabs.transform.GetChild(rnd.Next(0, ClothesPrefabs.transform.childCount));
            List <string> tags          = currentClothe.GetComponent <TagsContainer>().tags;

            if (counter <= Math.Floor((double)numberOfClothes / 3))
            {
                if (!tags.Contains(weathertag) && !tags.Contains(temperaturetag))
                {
                    i--;
                    continue;
                }
            }
            Instantiate(currentClothe.gameObject, currentClothe.position, currentClothe.rotation, clothes);

            if (tags.Contains(weathertag) || tags.Contains(temperaturetag))
            {
                counter++;
            }
        }
        Debug.Log("Number of clothes: " + numberOfClothes + ", correct clothes: " + counter);

        clothes.Translate(clothesPosition);
        clothes.Rotate(rotation.eulerAngles);


        Transform bag = new GameObject("Bag").transform;

        bag.parent = sceneRoot;
        bag.tag    = "Targets";

        Vector3 bagPosition = weatherPosition;

        bagPosition.y = floorPosition.y + 0.1f;
        Instantiate(BagsPrefabs.transform.GetChild(rnd.Next(0, BagsPrefabs.transform.childCount)).gameObject, bagPosition, rotation, bag);
        Debug.DrawLine(clothesPosition, bagPosition, Color.blue, 30f);


        Counter.Instance.InitializeCounter(counter);


        Vector3 assistantPosition = clothes.TransformPoint(-0.3f, 0f, 0.3f);

        assistantPosition.y = floor.position.y;
        Debug.DrawLine(bagPosition, assistantPosition, Color.green, 30f);

        if (assistantPresence != 0)
        {
            Instantiate(virtualAssistant.gameObject, assistantPosition, virtualAssistant.transform.rotation, sceneRoot);
            VirtualAssistantManager.Instance.patience              = assistantPatience;
            VirtualAssistantManager.Instance.transform.localScale += new Vector3(0.25f * VirtualAssistantManager.Instance.transform.localScale.x, 0.25f * VirtualAssistantManager.Instance.transform.localScale.y, 0.25f * VirtualAssistantManager.Instance.transform.localScale.z);
        }
    }
示例#23
0
        private void SnapIn(Transform snapTransform, bool doSnap = true)
        {
            Vector3    initialPosition = snapTransform.position;
            Quaternion initialRotation = snapTransform.rotation;

            Transform tempObject = new GameObject().transform;
            Transform snapParent = snapTransform.parent;


            tempObject.rotation = m_attachPt.transform.rotation;
            Quaternion tempR = tempObject.rotation;

            snapTransform.parent = tempObject;
            tempObject.rotation  = Quaternion.LookRotation(-attachPoint.transform.forward);

            Quaternion[] angs = new Quaternion[4]; // rotate by 90 degree increments to see which is closest to correct angle
            for (int i = 0; i < 4; i++)
            {
                angs[i] = tempObject.rotation;
                tempObject.Rotate(attachPoint.transform.forward * 90, Space.World);
            }

            float angClose = Mathf.Infinity;
            int   closest  = 0;

            for (int i = 0; i < 4; i++)
            {
                float a = Vector3.Angle(angs[i] * Vector3.right, tempR * Vector3.right);
                if (a < angClose)
                {
                    closest  = i;
                    angClose = a;
                }
            }

            tempObject.rotation = angs[closest];

            snapTransform.parent = snapParent;
            Destroy(tempObject.gameObject);

            snapTransform.position = initialPosition;
            Vector3 pDiff = attachPoint.transform.position - m_attachPt.transform.position;

            snapTransform.position += pDiff;

            if (doSnap)
            {
                DestroyImmediate(interactable.GetComponent <Throwable>());
                DestroyImmediate(interactable.GetComponent <VelocityEstimator>());
                DestroyImmediate(interactable.GetComponent <Rigidbody>());

                Rigidbody parentRigidbody = snapParent.GetComponentInParent <Rigidbody>();

                var joints = snapTransform.GetComponentsInChildren <Joint>();
                foreach (var joint in joints)
                {
                    joint.GetComponent <Rigidbody>().rotation = snapTransform.rotation;
                    joint.connectedBody = parentRigidbody;
                    joint.autoConfigureConnectedAnchor = false;
                    joint.anchor          = Vector3.zero;
                    joint.connectedAnchor = parentRigidbody.transform.InverseTransformPoint(joint.transform.position);
                    StartCoroutine(DoSetBreakForce(joint));
                }

                Destroy(interactable);

                //Interactable item = t.GetComponentInParent<Interactable>();
                //item.UpdateColliders(); //give the parent this item's colliders
            }
        }
    // Use this for initialization
    void Start()
    {
        VideoCanvas.gameObject.SetActive(false);
        VirtualPhone.gameObject.SetActive(false);
        StatusText.gameObject.SetActive(true);

        VideoFrame.texture = new Texture2D(1080, 1920, TextureFormat.BGRA32, false);

        NetworkManager.Connected += () =>
        {
            UnityEngine.WSA.Application.InvokeOnAppThread(() =>
            {
                StatusText.gameObject.SetActive(false);
                //VirtualPhone.SetActive(true);
                VideoCanvas.gameObject.SetActive(true);
            }, false);
        };
        // TODO: handle lost connection / reconnection
        NetworkManager.TextReceived += (string message) =>
        {
            UnityEngine.WSA.Application.InvokeOnAppThread(() =>
            {
                try
                {
                    // TODO: use a better JSON parser
                    var match = Regex.Match(message, "\\{\"?([a-zA-Z0-9-_.]+)\"?\\: ?\"?(.+)\"?\\}");
                    if (match != null && match.Success)
                    {
                        string command  = match.Groups.Count > 1 ? match.Groups[1].Value : null;
                        string argument = match.Groups.Count > 2 ? match.Groups[2].Value : null;
                        if (argument != null)
                        {
                            argument = argument.TrimEnd('"');
                        }

                        //LoggingManager.Log("Command recognized: " + command + ", " + argument);
                        if (command == "transform")
                        {
                            var values = Regex.Match(argument, "\\[([0-9-.e]+),([0-9-.e]+),([0-9-.e]+),([0-9-.e]+);([0-9-.e]+),([0-9-.e]+),([0-9-.e]+),([0-9-.e]+);([0-9-.e]+),([0-9-.e]+),([0-9-.e]+),([0-9-.e]+)\\]");

                            float m00    = 0, m01 = 0, m02 = 0, m03 = 0, m10 = 0, m11 = 0, m12 = 0, m13 = 0, m20 = 0, m21 = 0, m22 = 0, m23 = 0;
                            bool success = false;
                            if (values != null && values.Success)
                            {
                                string m00Str = values.Groups.Count > 1 ? values.Groups[1].Value : null;
                                string m01Str = values.Groups.Count > 2 ? values.Groups[2].Value : null;
                                string m02Str = values.Groups.Count > 3 ? values.Groups[3].Value : null;
                                string m03Str = values.Groups.Count > 4 ? values.Groups[4].Value : null;
                                string m10Str = values.Groups.Count > 5 ? values.Groups[5].Value : null;
                                string m11Str = values.Groups.Count > 6 ? values.Groups[6].Value : null;
                                string m12Str = values.Groups.Count > 7 ? values.Groups[7].Value : null;
                                string m13Str = values.Groups.Count > 8 ? values.Groups[8].Value : null;
                                string m20Str = values.Groups.Count > 9 ? values.Groups[9].Value : null;
                                string m21Str = values.Groups.Count > 10 ? values.Groups[10].Value : null;
                                string m22Str = values.Groups.Count > 11 ? values.Groups[11].Value : null;
                                string m23Str = values.Groups.Count > 12 ? values.Groups[12].Value : null;

                                try
                                {
                                    m00     = m00Str == null ? 0 : float.Parse(m00Str);
                                    m01     = m01Str == null ? 0 : float.Parse(m01Str);
                                    m02     = m02Str == null ? 0 : float.Parse(m02Str);
                                    m03     = m03Str == null ? 0 : float.Parse(m03Str);
                                    m10     = m10Str == null ? 0 : float.Parse(m10Str);
                                    m11     = m11Str == null ? 0 : float.Parse(m11Str);
                                    m12     = m12Str == null ? 0 : float.Parse(m12Str);
                                    m13     = m13Str == null ? 0 : float.Parse(m13Str);
                                    m20     = m20Str == null ? 0 : float.Parse(m20Str);
                                    m21     = m21Str == null ? 0 : float.Parse(m21Str);
                                    m22     = m22Str == null ? 0 : float.Parse(m22Str);
                                    m23     = m23Str == null ? 0 : float.Parse(m23Str);
                                    success = true;
                                }
                                catch { LoggingManager.LogError("Bad argument: " + m00Str + ", " + m01Str + ", " + m02Str + ", " + m03Str + ", " + m10Str + ", " + m11Str + ", " + m12Str + ", " + m13Str + ", " + m20Str + ", " + m21Str + ", " + m22Str + ", " + m23Str); }
                            }
                            else
                            {
                                LoggingManager.LogError("Couldn't parse coordinates: " + argument);
                            }

                            if (success)
                            {
                                //Matrix4x4 m = new Matrix4x4(new Vector4(m00, m10, m20, m30), new Vector4(m01, m11, m21, m31), new Vector4(m02, m12, m22, m32), new Vector4(m03, m13, m23, m33));

                                // extract rotation
                                Vector3 forward     = new Vector3(m02, m12, m22);
                                Vector3 upward      = new Vector3(m01, m11, m21);
                                Quaternion rotation = Quaternion.LookRotation(forward, upward);

                                // correct rotation (iOS convention: +x = long axis toward home button, +y = short axis toward right, +z upward from screen)
                                rotation = Quaternion.Euler(-rotation.eulerAngles.x, -rotation.eulerAngles.y, rotation.eulerAngles.z);

                                // extract position
                                Vector3 position = new Vector3(m03, m13, -m23);

                                Transform phoneTransform = new GameObject().transform;
                                phoneTransform.rotation  = rotation;
                                phoneTransform.Rotate(Vector3.forward, -90);
                                phoneTransform.Rotate(Vector3.up, 180);
                                phoneTransform.position = position;
                                phoneTransform.RotateAround(Vector3.zero, Vector3.up, worldRotation.eulerAngles.y);
                                //phoneTransform.rotation *= worldRotation;
                                phoneTransform.position += worldTranslation;

                                lastCorrectedPosition = phoneTransform.position;
                                lastCorrectedRotation = phoneTransform.rotation;

                                if ((uiMode == UIMode.FineCalibration && positioningMode == Positioning.Fixed) ||
                                    (uiMode == UIMode.Default && attachmentMode == Attachment.Phone && positioningMode == Positioning.Fixed) ||
                                    (uiMode == UIMode.Default && attachmentMode == Attachment.World && positioningMode == Positioning.Active) ||
                                    (uiMode == UIMode.Default && attachmentMode == Attachment.Self && positioningMode == Positioning.Active))
                                {
                                    VideoCanvas.transform.rotation = phoneTransform.rotation;
                                    VideoCanvas.transform.position = phoneTransform.position;

                                    // store the current offsets from the default self position and rotation
                                    if (attachmentMode == Attachment.Self)
                                    {
                                        Vector3 displayPosition   = Camera.main.transform.position + Camera.main.transform.forward * 0.5f;
                                        Vector3 directionToCamera = Camera.main.transform.position - displayPosition;
                                        Transform tempTransform   = new GameObject().transform;
                                        tempTransform.position    = displayPosition;
                                        tempTransform.rotation    = Quaternion.LookRotation(-directionToCamera);
                                        tempTransform.Rotate(Vector3.right, 180);

                                        selfOffset   = Camera.main.transform.InverseTransformVector(VideoCanvas.transform.position - tempTransform.position);
                                        selfRotation = Quaternion.Inverse(tempTransform.localRotation) * VideoCanvas.transform.localRotation;
                                    }

                                    // apply offsets
                                    if (attachmentMode == Attachment.Phone && uiMode == UIMode.Default)
                                    {
                                        VideoCanvas.transform.position      += Camera.main.transform.TransformVector(phoneOffset);
                                        VideoCanvas.transform.localRotation *= phoneRotation;
                                    }
                                }
                                else if (uiMode == UIMode.FineCalibration && positioningMode == Positioning.Active)
                                {
                                    phoneTransform.position -= worldTranslation;
                                    //phoneTransform.rotation *= Quaternion.Inverse(worldRotation);
                                    phoneTransform.RotateAround(Vector3.zero, Vector3.up, -worldRotation.eulerAngles.y);
                                    worldRotation = Quaternion.Euler(0, VideoCanvas.transform.localRotation.eulerAngles.y - phoneTransform.localRotation.eulerAngles.y, 0);
                                    //worldRotation = Quaternion.Inverse(VideoCanvas.transform.rotation) * phoneTransform.rotation;
                                    worldTranslation = VideoCanvas.transform.position - worldRotation * phoneTransform.position;
                                }
                                else if (uiMode == UIMode.Default && attachmentMode == Attachment.Phone && positioningMode == Positioning.Active)
                                {
                                    phoneOffset   = Camera.main.transform.InverseTransformVector(VideoCanvas.transform.position - phoneTransform.position);
                                    phoneRotation = Quaternion.Inverse(phoneTransform.localRotation) * VideoCanvas.transform.localRotation;
                                }
                                else if (uiMode == UIMode.Calibration)
                                {
                                    // TODO: highlight phone if close enough
                                }

                                lastRotation = rotation;
                                lastPosition = position;
                            }
                        }
                        else if (command == "calibration")
                        {
                            if (argument == "start")
                            {
                                uiMode = UIMode.Calibration;
                                LoggingManager.Log("Calibration Started");
                                StatusText.text = "Calibrating";

                                VirtualPhone.SetActive(true);
                                VideoCanvas.gameObject.SetActive(false);
                                StatusText.gameObject.SetActive(true);

                                correspondences.Clear();
                                worldTranslation = Vector3.zero;
                                worldRotation    = Quaternion.identity;

                                VirtualPhone.transform.rotation = Quaternion.identity;
                                VirtualPhone.transform.Rotate(Vector3.right, -60);
                                VirtualPhone.transform.position = Camera.main.transform.position + new Vector3(0, -0.1f, 0.5f);
                                calibrationInitRotation         = Camera.main.transform.rotation.eulerAngles.y;
                                VirtualPhone.transform.RotateAround(Camera.main.transform.position, Vector3.up, calibrationInitRotation);
                                calibrationPosition = VirtualPhone.transform.position;
                                calibrationRotation = VirtualPhone.transform.rotation;
                            }
                            else if (argument == "stop")
                            {
                                // reset alignment since calibration has likely changed how the display will appear
                                phoneOffset   = Vector3.zero;
                                phoneRotation = Quaternion.identity;
                                selfOffset    = Vector3.zero;
                                selfRotation  = Quaternion.identity;

                                VirtualPhone.SetActive(false);
                                VideoCanvas.gameObject.SetActive(true);
                                StatusText.gameObject.SetActive(false);

                                uiMode = UIMode.Default;
                                LoggingManager.Log("Calibration Ended");
                            }
                            else if (argument == "fine")
                            {
                                uiMode = UIMode.FineCalibration;
                                LoggingManager.Log("Fine Calibration Started");

                                StatusText.text = "Calibrating (Fine)";
                                StatusText.gameObject.SetActive(true);
                                VirtualPhone.SetActive(false);
                                VideoCanvas.gameObject.SetActive(true);
                            }
                            else if (argument == "store")
                            {
                                Transform a = new GameObject().transform; a.position = calibrationPosition; a.rotation = calibrationRotation;
                                Transform b = new GameObject().transform; b.position = lastPosition; b.rotation = lastRotation;
                                correspondences.Add(new Tuple <Transform, Transform>(a, b));

                                double averageRotationX = 0, averageRotationY = 0;
                                foreach (var corr in correspondences)
                                {
                                    var target        = corr.Item1;
                                    var actual        = corr.Item2;
                                    float diff        = target.eulerAngles.y - actual.eulerAngles.y;
                                    averageRotationX += Math.Cos(diff * Math.PI / 180);
                                    averageRotationY += Math.Sin(diff * Math.PI / 180);
                                }
                                float averageRotation = (float)(Math.Atan2(averageRotationY, averageRotationX) * 180.0 / Math.PI);
                                worldRotation         = Quaternion.Euler(0, averageRotation, 0);

                                Vector3 averageTranslation = Vector3.zero;
                                foreach (var corr in correspondences)
                                {
                                    var target = corr.Item1.position;
                                    var actual = corr.Item2.position;
                                    actual     = worldRotation * actual;

                                    averageTranslation += target - actual;
                                }
                                averageTranslation /= correspondences.Count;
                                worldTranslation    = averageTranslation;

                                LoggingManager.Log("World rotation: " + averageRotation + ", translation: " + worldTranslation);

                                //// compute the centroids of the correspondence points and use them to set the translation
                                //Vector3 centroid = new Vector3(0, 0, 0), targetCentroid = new Vector3(0, 0, 0);
                                //foreach (var corr in correspondences)
                                //{
                                //    targetCentroid += corr.Item1;
                                //    centroid += corr.Item2;
                                //}
                                //centroid /= correspondences.Count;
                                //targetCentroid /= correspondences.Count;
                                //worldTranslation = targetCentroid - centroid;
                                //worldOrigin = targetCentroid;

                                //// compute the rotation of the correspondences relative to the centroids and use them to set the rotation
                                //float averageRotation = 0;
                                //foreach (var corr in correspondences)
                                //{
                                //    Vector2 target = new Vector2(corr.Item1.x - targetCentroid.x, corr.Item1.z - targetCentroid.z);
                                //    Vector2 actual = new Vector2(corr.Item2.x - centroid.x, corr.Item2.z - centroid.z);

                                //    double angle = (float)Math.Acos((target.x * actual.x + target.y * actual.y) / (target.magnitude * actual.magnitude));
                                //    angle *= 180.0 / Math.PI;
                                //    if (angle > 180) angle -= 360;

                                //    averageRotation += (float)angle;
                                //}
                                //averageRotation /= correspondences.Count;
                                //worldRotation = Quaternion.Euler(0, averageRotation2, 0);

                                // move the virtual phone target
                                VirtualPhone.transform.rotation = Quaternion.identity;
                                VirtualPhone.transform.Rotate(Vector3.right, -60);
                                VirtualPhone.transform.position = Camera.main.transform.position + new Vector3(0, -0.1f, 0.5f);
                                float rotation = calibrationInitRotation + correspondences.Count * 45;
                                while (rotation >= 360)
                                {
                                    rotation -= 360;
                                }
                                VirtualPhone.transform.RotateAround(Camera.main.transform.position, Vector3.up, rotation);
                                //VirtualPhone.transform.RotateAround(Camera.main.transform.position, Vector3.right, rand.Next(20) - 10);
                                calibrationPosition = VirtualPhone.transform.position;
                                calibrationRotation = VirtualPhone.transform.rotation;
                            }
                        }
                        else if (command == "scale")
                        {
                            float value = float.Parse(argument);

                            // Locate pivot point for scaling by raycasting from the camera to the canvas
                            RaycastHit hit;
                            Vector3 pivot = VideoCanvas.transform.position;
                            if (Physics.Raycast(Camera.main.transform.position, Camera.main.transform.forward, out hit))
                            {
                                Transform objectHit = hit.transform;
                                Vector3 hitPoint3D  = hit.point;
                                //Vector3 hitPoint2D = VideoCanvas.transform.TransformPoint(hit.point);

                                pivot = hitPoint3D;
                            }

                            // Apply scale factor
                            double scaleX = VideoCanvas.transform.localScale.x * value;
                            double scaleY = VideoCanvas.transform.localScale.y * value;
                            if (scaleX < videoDefaultScaleX)
                            {
                                scaleX = videoDefaultScaleX;
                            }
                            if (scaleY < videoDefaultScaleY)
                            {
                                scaleY = videoDefaultScaleY;
                            }
                            VideoCanvas.transform.localScale = new Vector3((float)scaleX, (float)scaleY, 1);

                            // update position / offset depending on current mode
                            Vector3 offset = (float)(value - 1) * (pivot - VideoCanvas.transform.position);
                            switch (attachmentMode)
                            {
                            case Attachment.Phone:
                                phoneOffset -= offset;
                                break;

                            case Attachment.Self:
                                selfOffset -= offset;
                                break;

                            case Attachment.World:
                                VideoCanvas.transform.position -= offset;
                                break;
                            }
                            //LoggingManager.Log("Updated offset by (" + offset.x + ", " + offset.y + ", " + offset.z + ")");

                            //LoggingManager.Log("Scaled by " + value);
                        }
                        else if (command == "pan")
                        {
                            var values   = Regex.Match(argument, "\\{\"?x\"?\\: ?([0-9-.e]+), ?\"?y\"?\\: ?([0-9-.e]+), ?\"?touches\"?\\: ?([0-9]+)\\}");
                            bool success = false;
                            float x      = 0, y = 0;
                            int touches  = 0;
                            if (values != null && values.Success)
                            {
                                string xStr = values.Groups.Count > 1 ? values.Groups[1].Value : null;
                                string yStr = values.Groups.Count > 2 ? values.Groups[2].Value : null;
                                string tStr = values.Groups.Count > 3 ? values.Groups[3].Value : null;

                                try
                                {
                                    x       = xStr == null ? 0 : float.Parse(xStr);
                                    y       = yStr == null ? 0 : float.Parse(yStr);
                                    touches = tStr == null ? 0 : int.Parse(tStr);
                                    success = true;
                                }
                                catch { LoggingManager.LogError("Bad argument: " + xStr + ", " + yStr + ", " + tStr); }
                            }

                            if (uiMode == UIMode.FineCalibration)
                            {
                                if (success)
                                {
                                    if (touches == 1)
                                    {
                                        Vector3 translation = new Vector3(x * 5, y * 5, 0);
                                        worldTranslation   += VideoCanvas.transform.TransformVector(translation);
                                        //LoggingManager.Log("Set translation: " + worldTranslation.x + ", " + worldTranslation.y);
                                    }
                                    else if (touches == 2)
                                    {
                                        Vector3 translation = new Vector3(0, 0, y / 2000);
                                        worldTranslation   += VideoCanvas.transform.TransformVector(translation);
                                        worldRotation       = Quaternion.Euler(0, worldRotation.eulerAngles.y + x / 10, 0);
                                        //LoggingManager.Log("Set rotation: " + worldRotation.eulerAngles.y);
                                    }
                                }
                            }
                            else if (imageFrozen)
                            {
                                if (success && touches == 1)
                                {
                                    Vector3 translation = new Vector3(x * 5, y * 5, 0);
                                    switch (attachmentMode)
                                    {
                                    case Attachment.Phone:
                                        phoneOffset += VideoCanvas.transform.TransformVector(translation);
                                        break;

                                    case Attachment.Self:
                                        selfOffset += VideoCanvas.transform.TransformVector(translation);
                                        break;

                                    case Attachment.World:
                                        VideoCanvas.transform.position += VideoCanvas.transform.TransformVector(translation);
                                        break;
                                    }
                                }
                            }
                        }
                        else if (command == "attach")
                        {
                            if (argument == "self")
                            {
                                attachmentMode  = Attachment.Self;
                                positioningMode = Positioning.Fixed;
                                selfOffset      = Vector3.zero;
                                selfRotation    = Quaternion.identity;
                            }
                            else if (argument == "world")
                            {
                                attachmentMode = Attachment.World;
                            }
                            else if (argument == "phone")
                            {
                                attachmentMode  = Attachment.Phone;
                                positioningMode = Positioning.Fixed;
                                phoneOffset     = Vector3.zero;
                                phoneRotation   = Quaternion.identity;
                                VideoCanvas.transform.rotation = lastCorrectedRotation;
                                VideoCanvas.transform.position = lastCorrectedPosition;
                            }
                        }
                        else if (command == "positioning")
                        {
                            if (argument == "start")
                            {
                                //if (attachmentMode == Attachment.Phone)
                                //{
                                //    VideoCanvas.transform.rotation = lastCorrectedRotation;
                                //    VideoCanvas.transform.position = lastCorrectedPosition;
                                //    phoneOffset = Vector3.zero;
                                //    phoneRotation = Quaternion.identity;
                                //}
                                positioningMode = Positioning.Active;
                            }
                            else if (argument == "stop")
                            {
                                positioningMode = Positioning.Fixed;
                            }
                        }
                        else if (command == "frozen")
                        {
                            if (argument == "true")
                            {
                                imageFrozen = true;
                            }
                            else
                            {
                                imageFrozen = false;
                            }
                        }
                    }
                }
                catch { LoggingManager.LogError("Couldn't parse command: " + message); }
            }, false);
        };
        NetworkManager.ImageDecoded += (byte[] image, int width, int height) =>
        {
            UnityEngine.WSA.Application.InvokeOnAppThread(() =>
            {
                // TODO: check if resolution is changing, adjust zoom level to maintain same size
                //if(VideoFrame.texture != null && (VideoFrame.texture.width != width || VideoFrame.texture.height != height))
                //{
                //    float scaleChange = (float)width / VideoFrame.texture.width;
                //    VideoCanvas.transform.localScale = new Vector3(VideoFrame.transform.localScale.x * scaleChange, VideoFrame.transform.localScale.y * scaleChange, 1);
                //}

                ShowImage(VideoFrame, image, width, height);
            }, false);
        };
    }
示例#25
0
        static void Main(string[] args)
        {
            while (MainLoop.ActiveLoop)
            {
                MainLoop.InitDefaultGraphicContext(1440, 900, "Asteroids");
                MainGraphic.CreateShaderProgram("SpriteProgram", ShaderSort.SPRITE);
                MainGraphic.CreateShaderProgram("PolyProgram", ShaderSort.POLY);

                #region Modules
                //Player
                GraphicModule playerModule = new GraphicModule("PolyProgram", 1, Color.Red);
                playerModule.CreateCustomShader(new Vector3[] { new Vector3(0, -25, 0), new Vector3(0, 25, 0), new Vector3(50, 0, 0) },
                                                new Vector3[] { new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0) });
                TexturedGraphicModule playerModule2 = new TexturedGraphicModule("SpriteProgram");
                playerModule2.CreateCustomShader(new Vector3[] { new Vector3(-50, -50, 0), new Vector3(-50, 50, 0), new Vector3(50, 50, 0), new Vector3(50, -50, 0) },
                                                 "Textures\\Player.png");

                //Bullet
                GraphicModule bulletModule = new GraphicModule("PolyProgram", 10, Color.White);
                bulletModule.CreateRandomShader(13);
                TexturedGraphicModule bulletModule2 = new TexturedGraphicModule("SpriteProgram");
                bulletModule2.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 10, 0), new Vector3(20, 10, 0), new Vector3(20, 0, 0) },
                                                 "Textures\\bullet.png");
                Prototype.CreatePrototypeOfGraphicModule("bulletModule", bulletModule2);

                //UFO
                GraphicModule ufoModule = new GraphicModule("PolyProgram", 25, Color.Green);
                ufoModule.CreateRandomShader(5);
                TexturedGraphicModule ufoModule2 = new TexturedGraphicModule("SpriteProgram");
                ufoModule2.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(0, 30, 0), new Vector3(30, 30, 0), new Vector3(30, -30, 0) },
                                              "Textures\\Ufo.png");
                Prototype.CreatePrototypeOfGraphicModule("ufoModule", ufoModule2);

                //Asteroid_BIG
                GraphicModule asteroidModule = new GraphicModule("PolyProgram", 50, Color.Red);
                asteroidModule.CreateRandomShader(10);
                TexturedGraphicModule asteroidModule2 = new TexturedGraphicModule("SpriteProgram");
                asteroidModule2.CreateCustomShader(new Vector3[] { new Vector3(-50, -50, 0), new Vector3(-50, 50, 0), new Vector3(50, 50, 0), new Vector3(50, -50, 0) },
                                                   "Textures\\Asteroid_big.png");
                Prototype.CreatePrototypeOfGraphicModule("asteroidBig", asteroidModule2);

                //Asteroid_small
                GraphicModule miniAsteroidModule = new GraphicModule("PolyProgram", 30, Color.Blue);
                miniAsteroidModule.CreateRandomShader(10);
                TexturedGraphicModule miniAsteroidModule2 = new TexturedGraphicModule("SpriteProgram");
                miniAsteroidModule2.CreateCustomShader(new Vector3[] { new Vector3(-15, -15, 0), new Vector3(-15, 15, 0), new Vector3(15, 15, 0), new Vector3(15, -15, 0) },
                                                       "Textures\\Asteroid_small.png");
                Prototype.CreatePrototypeOfGraphicModule("asteroidSmall", miniAsteroidModule2);

                //LASER
                GraphicModule laserModule = new GraphicModule("PolyProgram", 30, Color.Red);
                laserModule.CreateCustomShader(new Vector3[] { new Vector3(-3, -3, 0), new Vector3(-3, 3, 0), new Vector3(27, 3, 0), new Vector3(27, -3, 0) },
                                               new Vector3[] { new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0), new Vector3(1, 0, 0) });
                TexturedGraphicModule laserModule2 = new TexturedGraphicModule("SpriteProgram");
                laserModule2.CreateCustomShader(new Vector3[] { new Vector3(-10, -10, 0), new Vector3(-10, 10, 0), new Vector3(30, 10, 0), new Vector3(30, -10, 0) },
                                                "Textures\\laser.png");
                Prototype.CreatePrototypeOfGraphicModule("laserModule", laserModule2);

                //Background
                TexturedGraphicModule backgroundModule = new TexturedGraphicModule("SpriteProgram");
                backgroundModule.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(MainLoop.MonitorWidth, 0, 0),
                                                                    new Vector3(MainLoop.MonitorWidth, MainLoop.MonitorHeight, 0), new Vector3(0, MainLoop.MonitorHeight, 0) },
                                                    "Textures\\back_simpled.png");
                TexturedGraphicModule backgroundModule2 = new TexturedGraphicModule("SpriteProgram");
                backgroundModule2.CreateCustomShader(new Vector3[] { new Vector3(0, 0, 0), new Vector3(MainLoop.MonitorWidth, 0, 0),
                                                                     new Vector3(MainLoop.MonitorWidth, MainLoop.MonitorHeight, 0), new Vector3(0, MainLoop.MonitorHeight, 0) },
                                                     "Textures\\background.png");
                #endregion

                #region GameObject creation
                ////Background
                BaseEntity backEntity = new BaseEntity();
                backEntity.AddInnerModel(new ExtraGraphicModul(backgroundModule2));
                GameObject background = Factory.Build <GameObject>(backgroundModule, backEntity);
                background.SetPosition(MainLoop.MonitorWidth / 2, MainLoop.MonitorHeight / 2);
                //Player Object
                BaseEntity player = new PlayerEntity(2);
                player.AddInnerModel(new InertMoveModel());
                player.AddInnerModel(new OutOfWindowSizeModel());
                player.AddInnerModel(new ExtraGraphicModul(playerModule2));
                player.DeathEvent += player.OnDeath;
                player.DeathEvent += () =>
                {
                    MainLoop.StopMainLoop();
                    if (MessageBox.Show("You are dead. Are you want to play again?", $"You have {MainLoop.Score} scores!", MessageBoxButtons.YesNo) == DialogResult.No)
                    {
                        MainLoop.ActiveLoop = false;
                    }
                    else
                    {
                        MainLoop.Close = false;
                    }
                };
                GameObject playerObject = Factory.Build <GameObject>(playerModule, player);
                playerObject.Entity.OutOfWindowEvent += playerObject.GoToReverseCoordinates;
                playerObject.SetPosition(MainLoop.MonitorWidth / 2, MainLoop.MonitorHeight / 2);

                //Bullet Object
                BaseEntity bullet       = new BulletEntity(5);
                GameObject bulletObject = Factory.Build <GameObject>(bulletModule, bullet, false);
                Prototype.CreatePrototypeOfGameObject("bullet", bulletObject);

                //Ufo Object
                BaseEntity ufo       = new EnemyEntity(2);
                GameObject ufoObject = Factory.Build <GameObject>(ufoModule, ufo, false);
                Prototype.CreatePrototypeOfGameObject("ufo", ufoObject);

                //Asteroid_BIG Object
                BaseEntity asteroid       = new EnemyEntity(2);
                GameObject asteroidObject = Factory.Build <GameObject>(asteroidModule, asteroid, false);
                Prototype.CreatePrototypeOfGameObject("asteroid", asteroidObject);

                //Asteroid_small Object
                BaseEntity miniAsteroid       = new EnemyEntity(4);
                GameObject miniAsteroidObject = Factory.Build <GameObject>(miniAsteroidModule, miniAsteroid, false);
                Prototype.CreatePrototypeOfGameObject("miniAsteroid", miniAsteroidObject);

                //Laser Object
                BaseEntity laserEntity = new BulletEntity(4);
                GameObject laserObject = Factory.Build <GameObject>(laserModule, laserEntity, false);
                Prototype.CreatePrototypeOfGameObject("laser", laserObject);
                #endregion

                #region Commands
                ////Player Move
                Command up    = new Command(() => playerObject.MoveByAngle(0.1));
                Command left  = new Command(() => playerObject.Rotate(DirectionEnum.LEFT, 0.1));
                Command right = new Command(() => playerObject.Rotate(DirectionEnum.RIGHT, 0.1));
                //Player Fire bullet
                Command fire = new Command(() =>
                {
                    var bul = Prototype.CreateCopyOf <GameObject>("bullet");
                    bul.Entity.DeathEvent += bul.Entity.OnDeath;
                    bul.AddInnerModel(new OutOfWindowSizeModel());
                    bul.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("bulletModule")));
                    bul.AddInnerModel(new MoveByAngleModel(playerObject.Entity.XCoordinate, playerObject.Entity.YCoordinate, playerObject.Entity.RenderAngle));
                    bul.AddInnerModel(new DeadByConditionModel(typeof(EnemyEntity), DeadByConditionType.DEAD_BY_COLLISION));
                    bul.AddInnerModel(new LifeTimeModel(5));
                    bul.Entity.OutOfWindowEvent += bul.GoToReverseCoordinates;
                });
                //Create Asteroid
                Command createAsteroid = new Command(() =>
                {
                    var asr = Prototype.CreateCopyOf <GameObject>("asteroid");
                    asr.Entity.DeathEvent += asr.Entity.OnDeath;
                    asr.Entity.DeathEvent += () => MainLoop.AddScore(100);
                    asr.Entity.DeathEvent += () =>
                    {
                        Random rand     = new Random();
                        Random randMini = new Random();
                        var count       = rand.Next(1, 4);
                        for (int i = 0; i < count; i++)
                        {
                            var mini  = Prototype.CreateCopyOf <GameObject>("miniAsteroid");
                            var value = randMini.NextDouble() * Math.PI * 2;
                            mini.AddInnerModel(new OutOfWindowSizeModel());
                            mini.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("asteroidSmall")));
                            mini.AddInnerModel(new MoveByAngleModel(asr.Entity.XCoordinate + 1, asr.Entity.YCoordinate + 1, value));
                            mini.AddInnerModel(new DeadByConditionModel(typeof(PlayerEntity), DeadByConditionType.DEAD_BY_COLLISION));
                            mini.Entity.DeathEvent       += mini.Entity.OnDeath;
                            mini.Entity.DeathEvent       += () => MainLoop.AddScore(50);
                            mini.Entity.OutOfWindowEvent += mini.GoToReverseCoordinates;
                        }
                    };
                    asr.AddInnerModel(new OutOfWindowSizeModel());
                    asr.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("asteroidBig")));
                    asr.AddInnerModel(new MoveByAngleModel(GetRandomAccessiblePositionAndAngle(playerObject).Item1, GetRandomAccessiblePositionAndAngle(playerObject).Item2,
                                                           GetRandomAccessiblePositionAndAngle(playerObject).Item3));
                    asr.AddInnerModel(new DeadByConditionModel(typeof(PlayerEntity), DeadByConditionType.DEAD_BY_COLLISION));
                    asr.Entity.OutOfWindowEvent += asr.GoToReverseCoordinates;
                });
                //Create Ufo
                Command createUfo = new Command(() =>
                {
                    var ufoCopy = Prototype.CreateCopyOf <GameObject>("ufo");
                    ufoCopy.Entity.DeathEvent += ufoCopy.Entity.OnDeath;
                    ufoCopy.Entity.DeathEvent += () => MainLoop.AddScore(250);
                    ufoCopy.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("ufoModule")));
                    ufoCopy.AddInnerModel(new MoveToTargetModel(playerObject));
                    ufoCopy.AddInnerModel(new DeadByConditionModel(typeof(PlayerEntity), DeadByConditionType.DEAD_BY_COLLISION));
                    ufoCopy.AddInnerModel(new MoveByAngleModel(GetRandomAccessiblePositionAndAngle(playerObject).Item1, GetRandomAccessiblePositionAndAngle(playerObject).Item2,
                                                               GetRandomAccessiblePositionAndAngle(playerObject).Item3));
                });
                //Laser
                int     laserCount = 3;
                Command fireLaser  = new Command(() =>
                {
                    if (laserCount > 0)
                    {
                        var laser = Prototype.CreateCopyOf <GameObject>("laser");
                        laser.Entity.DeathEvent += laser.Entity.OnDeath;
                        laser.AddInnerModel(new OutOfWindowSizeModel());
                        laser.AddInnerModel(new ExtraGraphicModul(Prototype.CreateCopyOf <GraphicModule>("laserModule")));
                        laser.AddInnerModel(new MoveByAngleModel(playerObject.Entity.XCoordinate, playerObject.Entity.YCoordinate, playerObject.Entity.RenderAngle));
                        laser.AddInnerModel(new DeadByConditionModel(typeof(EnemyEntity), DeadByConditionType.IMMORTAL_DEAD_BY_COLLISION));
                        laser.AddInnerModel(new LifeTimeModel(10));
                        laser.Entity.OutOfWindowEvent += laser.GoToReverseCoordinates;
                        laserCount--;
                    }
                });
                //Laser respawn
                Command respawnLaser = new Command(() =>
                {
                    if (laserCount < 3)
                    {
                        laserCount++;
                    }
                });
                //Swap Graphic
                Command activateExtraModule = new Command(() =>
                {
                    ExtraGraphicModul.SwapGraphicModule();
                });
                //Bindings
                CommandHandler.BindKeyToCommand("w", up, false);
                CommandHandler.BindKeyToCommand("a", left, false);
                CommandHandler.BindKeyToCommand("d", right, false);
                CommandHandler.BindKeyToCommand("x", fire);
                CommandHandler.BindKeyToCommand("z", activateExtraModule);
                CommandHandler.BindKeyToCommand("q", createAsteroid);
                CommandHandler.BindKeyToCommand("f", fireLaser);
                CommandHandler.BindTimerToCommand(0, createAsteroid, 5000);
                CommandHandler.BindTimerToCommand(1, createUfo, 10000);
                CommandHandler.BindTimerToCommand(2, respawnLaser, 10000);
                #endregion
                //Main loop starts
                MainLoop.StartMainLoop();

                //DIspose stuff
                playerModule2.Dispose();
                asteroidModule2.Dispose();
                miniAsteroidModule2.Dispose();
                bulletModule2.Dispose();
                laserModule2.Dispose();
                ufoModule2.Dispose();
                backgroundModule.Dispose();
                backgroundModule2.Dispose();
                CommandHandler.UnbindAll();
                MainLogic.FullCleanup();
            }
        }