private void DiscoverModels()
 {
     isRetrievingModels = true;
     this.StartCoroutine(RunwayHub.listModels((models) =>
     {
         isRetrievingModels = false;
         availableModels    = models;
     }));
 }
    void RunInference()
    {
        Field[] inputs  = getSelectedModel().commands[0].inputs;
        Field[] outputs = getSelectedModel().commands[0].outputs;
        Dictionary <string, object> dataToSend = new Dictionary <string, object>();

        for (var i = 0; i < inputs.Length; i++)
        {
            Field  input = inputs[i];
            object value = inputData[input.name];
            if (input.type.Equals("image"))
            {
                Texture2D tex  = textureForInputKey(input.name, false) as Texture2D;
                byte[]    data = RunwayUtils.TextureToPNG(tex);
                dataToSend[input.name] = "data:image/png;base64," + System.Convert.ToBase64String(data);
            }
            else if (input.type.Equals("segmentation"))
            {
                Texture2D tex  = textureForInputKey(input.name, true) as Texture2D;
                byte[]    data = RunwayUtils.TextureToPNG(tex);
                dataToSend[input.name] = "data:image/png;base64," + System.Convert.ToBase64String(data);
            }
            else if (input.type.Equals("vector"))
            {
                dataToSend[input.name] = RunwayUtils.RandomVector(input.length, input.samplingMean, input.samplingStd);
            }
            else
            {
                dataToSend[input.name] = value;
            }
        }
        this.StartCoroutine(RunwayHub.runInference(runningSession.url, getFilteredModels()[selectedModelIndex].commands[0].name, dataToSend, (outputData) =>
        {
            this.isProcessingInput = false;
            if (outputData == null)
            {
                EditorUtility.DisplayDialog("Inference Error", "There was an error processing this input", "OK");
                return;
            }
            for (var i = 0; i < outputs.Length; i++)
            {
                object value = outputData[outputs[i].name];
                if (outputs[i].type.Equals("image"))
                {
                    string stringValue = value as string;
                    int dataStartIndex = stringValue.IndexOf("base64,") + 7;
                    byte[] outputImg   = System.Convert.FromBase64String(((string)value).Substring(dataStartIndex));
                    Texture2D tex      = new Texture2D(2, 2); // Once image is loaded, texture will auto-resize
                    tex.LoadImage(outputImg);
                    this.lastOutput = tex;
                }
            }
            Repaint();
        }));
    }
 private IEnumerator UpdateRunningSession()
 {
     while (isWindowEnabled)
     {
         if (isRunwayRunning && runningSession != null)
         {
             this.StartCoroutine(RunwayHub.getSession(runningSession.id, (session) =>
             {
                 runningSession = session;
             }));
         }
         yield return(new WaitForSeconds(1));
     }
 }
 private IEnumerator CheckIfRunwayRunning()
 {
     while (isWindowEnabled)
     {
         this.StartCoroutine(RunwayHub.isRunwayRunning((newStatus) =>
         {
             if (!this.isRunwayRunning && newStatus)
             {
                 DiscoverModels();
             }
             this.isRunwayRunning = newStatus;
         }));
         yield return(new WaitForSeconds(1));
     }
 }
 private IEnumerator DiscoverRunningSessions()
 {
     while (isWindowEnabled)
     {
         if (isRunwayRunning)
         {
             this.StartCoroutine(RunwayHub.listSessions((sessions) =>
             {
                 foreach (ModelSession s in sessions)
                 {
                     if (s.application.Equals("Unity"))
                     {
                         runningSession = s;
                     }
                 }
             }));
         }
         yield return(new WaitForSeconds(1));
     }
 }
    void RenderRunModel()
    {
        GUILayout.Space(10);
        GUILayout.Label("RUN OPTIONS", sectionTitleStyle);
        GUILayout.Space(5);

        GUILayout.BeginHorizontal("box");

        GUILayout.BeginVertical();

        GUILayout.Space(5);

        GUILayout.BeginHorizontal(horizontalStyle);
        GUILayout.Label("Run Location");
        GUILayout.FlexibleSpace();
        runLocationIndex = EditorGUILayout.Popup(runLocationIndex, runLocations);
        GUILayout.EndHorizontal();

        GUILayout.Space(5);
        GUILayout.BeginHorizontal(horizontalStyle);
        GUILayout.Label("Run Continuously");
        GUILayout.FlexibleSpace();
        this.continuousInference = EditorGUILayout.Toggle(this.continuousInference, GUILayout.Width(20));
        GUILayout.EndHorizontal();


        GUILayout.Space(5);
        GUILayout.BeginHorizontal(horizontalStyle);
        GUILayout.FlexibleSpace();

        if (modelIsRunning())
        {
            if (this.continuousInference && !this.isProcessingInput)
            {
                this.isProcessingInput = true;
                try
                {
                    this.RunInference();
                }
                catch
                {
                    this.isProcessingInput = false;
                }
            }
            using (new EditorGUI.DisabledScope(this.isProcessingInput))
            {
                if (GUILayout.Button("Process"))
                {
                    this.isProcessingInput = true;
                    try
                    {
                        this.RunInference();
                    }
                    catch
                    {
                        this.isProcessingInput = false;
                    }
                }
            }
        }

        string buttonText;
        bool   buttonDisabled;

        if (modelIsRunning())
        {
            buttonText     = "Stop Model";
            buttonDisabled = false;
        }
        else if (modelIsStarting())
        {
            buttonText     = "Starting Model...";
            buttonDisabled = true;
        }
        else
        {
            buttonText     = "Start Model";
            buttonDisabled = false;
        }
        buttonDisabled = buttonDisabled || this.isMakingRequest;

        using (new EditorGUI.DisabledScope(buttonDisabled))
        {
            if (GUILayout.Button(buttonText))
            {
                if (modelIsRunning())
                {
                    this.isMakingRequest = true;
                    this.StartCoroutine(RunwayHub.stopModel(runningSession.id, (response) =>
                    {
                        this.runningSession    = null;
                        this.isMakingRequest   = false;
                        this.isProcessingInput = false;
                        Repaint();
                    }));
                }
                else
                {
                    ProviderOptions providerOptions = new ProviderOptions();
                    providerOptions.runLocation = runLocations[runLocationIndex];
                    this.isMakingRequest        = true;
                    int versionId = getFilteredModels()[selectedModelIndex].defaultVersionId;
                    this.StartCoroutine(RunwayHub.runModel(versionId, getOptions(), providerOptions, (error, session) =>
                    {
                        this.isMakingRequest = false;
                        if (error != null)
                        {
                            EditorUtility.DisplayDialog("Error starting model", error, "OK");
                            return;
                        }
                        this.runningSession = session;
                        Repaint();
                    }));
                }
            }
        }
        GUILayout.EndHorizontal();

        GUILayout.EndVertical();
        GUILayout.EndHorizontal();

        GUILayout.Space(15);
    }