private void PlayAndRecord()
    {
        StateToRestore = CreateCloudState();
        ChangeCloudState(InitialState);

        UIMenu.gameObject.SetActive(false);
        GameObject sphere = MobileCamera.gameObject.transform.parent.gameObject;

        ControllerTransform       = sphere.transform.parent;
        sphere.transform.parent   = null;
        sphere.transform.position = CameraWaypointsDict[0].obj.transform.position;
        sphere.transform.rotation = CameraWaypointsDict[0].obj.transform.rotation;
        //animationScript.InitializeFirstKeyframe(sphere.transform);
        //GameObject go = new GameObject("dummy");
        //go.transform.position = WaypointList[0].transform.position;
        sphere.transform.SetParent(WaypointContainer.transform);
        foreach (KeyValuePair <int, CameraWaypoint> g in CameraWaypointsDict)
        {
            g.Value.obj.SetActive(false);
        }
        WaypointContainer.GetComponent <MeshRenderer>().enabled = false;

        //TODO : Disable all UI when recording

        MobileCamera.gameObject.AddComponent <ScreenRecorder>();
        Debug.Log(AnimationDuration);
        MobileCamera.gameObject.GetComponent <ScreenRecorder>().maxFrames = (AnimationDuration * FramesPerSecond) + FramesPerSecond;

        MobileCamera.gameObject.GetComponent <ScreenRecorder>().OnRecordingEnd += RestoreObjects;

        animationScript.PlayAnimation();
        MobileCamera.gameObject.GetComponent <ScreenRecorder>().ActivateRecording();
    }
 private void ChangeCloudState(CloudStateInTime state)
 {
     CloudUpdater.instance.OverrideBoxScale(state.BoxScale);
     CloudUpdater.instance.OverrideMesh(state.Mesh);
     CloudUpdater.instance.ChangePointSize(state.PointSize);
     CloudUpdater.instance.ChangeCloudScale(state.Scale);
     CloudUpdater.instance.ChangeCurrentColorMap(state.ColorMap);
 }
 private void AddCloudState()
 {
     if (!CloudSelector.instance.noSelection)
     {
         CloudStateInTime state = CreateCloudState();
         CloudStateDict.Add(state.ID, state);
         animationScript.AddAnimationEvent(state);
         UIMenu.CreateCloudStateTimingButton(state.ID, state.Time);
     }
     //get mesh from cloudData
 }
    public void PlaceWaypoint(Vector3 position, Quaternion rotation, float time = -1)
    {
        //animationScript.AddKeyframe(tr);
        GameObject s = CreateWaypointGameObject(position, rotation);

        if (CameraWaypointsDict.Count == 0)
        {
            CreateWaypointContainer(position);

            if (!CloudSelector.instance.noSelection)
            {
                CloudStateInTime state = CreateCloudState();
                InitialState = state;
            }
        }
        s.transform.SetParent(WaypointContainer.transform);

        //Debug.Log("s : " + s.transform.localRotation.eulerAngles);
        //Debug.Log("sphere : " + sphere.transform.rotation.eulerAngles);
        float TimeToAssign;

        if (time >= 0)
        {
            TimeToAssign = time;
        }
        else
        {
            TimeToAssign = WaypointMasterID * KeyFrameTimestep;
        }
        CameraWaypoint campoint = new CameraWaypoint(WaypointMasterID, Mathf.RoundToInt(TimeToAssign));

        campoint.obj = s;
        int indexkey;

        indexkey = animationScript.AddKeyframe(s.transform, campoint.Time);
        WaypointMasterID++;
        campoint.IndexKey = indexkey;

        //Debug.Log("Adding key for point "+campoint.ID+" at time "+campoint.Time+" / Result : "+ campoint.IndexKey);
        //Debug.Log(animationScript.curvePositionX[campoint.IndexKey].ToString());
        CameraWaypointsDict.Add(campoint.ID, campoint);
        //CREATE NEW BUTTON
        UIMenu.CreateTimeButton(campoint.ID, campoint.Time);
        CalculateAnimationDuration();
        ReloadMesh();
    }
    private CloudStateInTime CreateCloudState()
    {
        CloudData clouddata = CloudUpdater.instance.LoadCurrentStatus();
        Mesh      mesh      = new Mesh();

        mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32;
        mesh.vertices    = clouddata.gameObject.GetComponent <MeshFilter>().mesh.vertices;
        mesh.SetIndices(clouddata.gameObject.GetComponent <MeshFilter>().mesh.GetIndices(0), MeshTopology.Points, 0);
        mesh.uv  = clouddata.gameObject.GetComponent <MeshFilter>().mesh.uv;
        mesh.uv2 = clouddata.gameObject.GetComponent <MeshFilter>().mesh.uv2;
        mesh.uv3 = clouddata.gameObject.GetComponent <MeshFilter>().mesh.uv3;
        mesh.uv4 = clouddata.gameObject.GetComponent <MeshFilter>().mesh.uv4;
        mesh.uv5 = clouddata.gameObject.GetComponent <MeshFilter>().mesh.uv5;
        int              time     = StateMasterID * KeyFrameTimestep;
        float            psize    = clouddata.globalMetaData.point_size;
        Vector3          scale    = clouddata.globalMetaData.scale;
        Vector3          boxscale = clouddata.globalMetaData.box_scale;
        string           color    = clouddata.globalMetaData.colormapName;
        CloudStateInTime state    = new CloudStateInTime(StateMasterID, time, mesh, psize, scale, boxscale, color);

        StateMasterID++;
        return(state);
    }