Ejemplo n.º 1
0
    public static void SetupBinding(VisageTracker tracker, TextAsset configuration)
    {
        string text = configuration.text;

        string[] lines = text.Split(new [] { "\n" }, StringSplitOptions.RemoveEmptyEntries);
        foreach (string line in lines)
        {
            // skip comments
            if (line.StartsWith("#"))
            {
                continue;
            }

            string[] values        = line.Split(new [] { ";" }, StringSplitOptions.RemoveEmptyEntries);
            string[] trimmedValues = new string[8];
            for (int i = 0; i < Mathf.Min(values.Length, 8); i++)
            {
                // trim values
                trimmedValues[i] = values[i].Trim();
            }

            // parse au name
            string au = trimmedValues[0];

            // parse blendshape identifier
            string   blendshape      = trimmedValues[1];
            string[] blendShapeParts = blendshape.Split(':');
            if (blendShapeParts.Length < 2)
            {
                Debug.LogError("Invalid blendshape_indentifier value in configuration '" + configuration.name + "'.", tracker);
                return;
            }

            string blendshapeObjectName = blendShapeParts[0];
            int    blendshapeIndex      = 0;
            if (!int.TryParse(blendShapeParts[1], out blendshapeIndex))
            {
                Debug.LogError("Invalid blendshape_indentifier value in configuration '" + configuration.name + "'.", tracker);
                return;
            }

            GameObject target = GameObject.Find(blendshapeObjectName);
            if (target == null || target.GetComponent <SkinnedMeshRenderer>() == null)
            {
                Debug.LogError(target == null);
                Debug.LogError("No valid blendshape target named '" + blendshapeObjectName + "' defined in configuration: '" + configuration.name + "'.", tracker);
                return;
            }

            // parse min limit
            float min = -1f;
            if (!float.TryParse(trimmedValues[2], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out min))
            {
                Debug.LogError("Invalid min_limit value in binding configuration '" + configuration.name + "'.", tracker);
                return;
            }

            // parse max limit
            float max = 1f;
            if (!float.TryParse(trimmedValues[3], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out max))
            {
                Debug.LogError("Invalid max_limit value in binding configuration '" + configuration.name + "'.", tracker);
                return;
            }

            // parse inverted
            bool inverted = false;
            if (!string.IsNullOrEmpty(trimmedValues[4]))
            {
                inverted = trimmedValues[4] == "1";
            }

            // parse weight
            float weight = 1f;
            if (!string.IsNullOrEmpty(trimmedValues[5]))
            {
                if (!float.TryParse(trimmedValues[5], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out weight))
                {
                    Debug.LogError("Invalid weight value in binding configuration '" + configuration.name + "'.", tracker);
                    return;
                }
            }

            // parse filter window
            int filterWindow = 6;
            if (!string.IsNullOrEmpty(trimmedValues[6]))
            {
                if (!int.TryParse(trimmedValues[6], out filterWindow) || filterWindow < 0 || filterWindow > 16)
                {
                    Debug.LogError("Invalid filter_window value in binding configuration '" + configuration.name + "'.", tracker);
                    return;
                }
            }

            // parse filter amount
            float filterAmount = 0.3f;
            if (!string.IsNullOrEmpty(trimmedValues[7]))
            {
                if (!float.TryParse(trimmedValues[7], System.Globalization.NumberStyles.Any, System.Globalization.CultureInfo.InvariantCulture, out filterAmount))
                {
                    Debug.LogError("Invalid filter_amount value in binding configuration '" + configuration.name + "'.", tracker);
                    return;
                }
            }

            // add new binding
            ActionUnitBinding binding = tracker.gameObject.AddComponent <ActionUnitBinding>();
            binding.Name                       = au + " -> " + blendshape;
            binding.Tracker                    = tracker;
            binding.ActionUnitName             = au;
            binding.Limits                     = new Vector2(min, max);
            binding.Inverted                   = inverted;
            binding.Weight                     = weight;
            binding.FilterWindowSize           = filterWindow;
            binding.FilterConstant             = filterAmount;
            binding.Targets                    = new ActionUnitBindingTarget[1];
            binding.Targets[0]                 = new ActionUnitBindingTarget();
            binding.Targets[0].Renderer        = GameObject.Find(blendshapeObjectName).GetComponent <SkinnedMeshRenderer>();
            binding.Targets[0].BlendshapeIndex = blendshapeIndex;
            binding.Targets[0].Weight          = 1f;
        }
    }
Ejemplo n.º 2
0
    /** This method is called before any of the Update methods are called the first time.
     *
     * It initializes helper variables and the tracker.
     */
    void Start()
    {
        contentSwitchCam.image     = (Texture2D)imageSwitchCam;
        contentStartTracking.image = (Texture2D)imageStartTracking;
        contentStopTracking.image  = (Texture2D)imageStopTracking;

        startTrackingStyle = new GUIStyle();
        startTrackingStyle.normal.background = (Texture2D)contentStartTracking.image;
        startTrackingStyle.active.background = (Texture2D)contentStartTracking.image;
        startTrackingStyle.hover.background  = (Texture2D)contentStartTracking.image;

        stopTrackingStyle = new GUIStyle();
        stopTrackingStyle.normal.background = (Texture2D)contentStopTracking.image;
        stopTrackingStyle.active.background = (Texture2D)contentStopTracking.image;
        stopTrackingStyle.hover.background  = (Texture2D)contentStopTracking.image;

        switchCamButtonStyle = new GUIStyle();
        switchCamButtonStyle.normal.background = (Texture2D)contentSwitchCam.image;
        switchCamButtonStyle.active.background = (Texture2D)contentSwitchCam.image;
        switchCamButtonStyle.hover.background  = (Texture2D)contentSwitchCam.image;


        Translation = new Vector3(0, 0, 0);
        Rotation    = new Vector3(0, 0, 0);

        // choose config file
        string configFilePath  = Application.streamingAssetsPath + "/" + ConfigFileStandalone;
        string licenseFilePath = Application.streamingAssetsPath + "/" + licenseFileFolder;

        switch (Application.platform)
        {
        case RuntimePlatform.IPhonePlayer:
            configFilePath  = "Data/Raw/Visage Tracker/" + ConfigFileIOS;
            licenseFilePath = "Data/Raw/Visage Tracker/" + licenseFileName;
            break;

        case RuntimePlatform.Android:
            configFilePath  = Application.persistentDataPath + "/" + ConfigFileAndroid;
            licenseFilePath = Application.persistentDataPath + "/" + licenseFileName;
            break;

        case RuntimePlatform.OSXPlayer:
            configFilePath  = Application.dataPath + "/Resources/Data/StreamingAssets/Visage Tracker/" + ConfigFileOSX;
            licenseFilePath = Application.dataPath + "/Resources/Data/StreamingAssets/Visage Tracker/" + licenseFileName;
            break;

        case RuntimePlatform.OSXEditor:
            configFilePath  = Application.dataPath + "/StreamingAssets/Visage Tracker/" + ConfigFileOSX;
            licenseFilePath = Application.dataPath + "/StreamingAssets/Visage Tracker/" + licenseFileName;
            break;

        case RuntimePlatform.WindowsEditor:
            configFilePath  = Application.streamingAssetsPath + "/" + ConfigFileEditor;
            licenseFilePath = Application.streamingAssetsPath + "/" + licenseFileFolder;
            break;
        }

        // initialize tracker
        InitializeTracker(configFilePath, licenseFilePath);

        // clear all existing binding components
        ActionUnitBinding[] existingBindings = GetComponents <ActionUnitBinding> ();
        foreach (ActionUnitBinding binding in existingBindings)
        {
            Destroy(binding);
        }

        // setup new bindings
        foreach (TextAsset configuration in BindingConfigurations)
        {
            ActionUnitBinding.SetupBinding(this, configuration);
        }

        //check orientation and start camera
        Orientation = getDeviceOrientation();
        OpenCamera(Orientation, device, defaultCameraWidth, defaultCameraHeight, isMirrored);

        isTracking = true;

        if (SystemInfo.graphicsDeviceType == UnityEngine.Rendering.GraphicsDeviceType.OpenGLCore)
        {
            Debug.Log("Notice: if graphics API is set to OpenGLCore, the texture might not get properly updated.");
        }
    }
Ejemplo n.º 3
0
    public override void OnInspectorGUI()
    {
        binding = (ActionUnitBinding)target;

        // name and action unit
        EditorGUILayout.Separator();
        binding.Tracker = EditorGUILayout.ObjectField("Tracker", binding.Tracker, typeof(VisageTracker), true) as VisageTracker;
        EditorGUILayout.LabelField("Binding", EditorStyles.boldLabel);
        EditorGUILayout.BeginVertical(EditorStyles.whiteLargeLabel);
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Name", GUILayout.MaxWidth(150f));
        EditorGUILayout.LabelField("Action unit", GUILayout.MaxWidth(150f));
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();
        binding.Name           = EditorGUILayout.TextField(binding.Name, GUILayout.MaxWidth(150f));
        binding.ActionUnitName = EditorGUILayout.TextField(binding.ActionUnitName, GUILayout.MaxWidth(150f));
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Weight: " + binding.Weight.ToString("0.00"), GUILayout.MaxWidth(150f));
        binding.Weight = EditorGUILayout.Slider(binding.Weight, 0f, 1f, GUILayout.MaxWidth(150f));
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();

        // limits
        EditorGUILayout.Separator();
        EditorGUILayout.LabelField("Limits", EditorStyles.boldLabel);
        EditorGUILayout.BeginVertical(EditorStyles.whiteLargeLabel);
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Raw value: " + binding.Value.ToString("0.00"), GUILayout.MaxWidth(150f));
        EditorGUILayout.LabelField("Limits: " + binding.Limits.x.ToString("0.00") + ", " + binding.Limits.y.ToString("0.00"), GUILayout.MaxWidth(150f));
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.BeginHorizontal();
        binding.Inverted = EditorGUILayout.ToggleLeft("Inverted", binding.Inverted, GUILayout.MaxWidth(150f));
        EditorGUILayout.MinMaxSlider(ref binding.Limits.x, ref binding.Limits.y, -1f, 1f, GUILayout.MaxWidth(150f));
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndVertical();
        EditorGUILayout.Separator();

        // filter
        EditorGUILayout.LabelField("Filter", EditorStyles.boldLabel);
        EditorGUILayout.BeginVertical(EditorStyles.whiteLargeLabel);
        EditorGUILayout.BeginHorizontal();
        EditorGUILayout.LabelField("Filtered value: " + binding.FilteredValue.ToString("0.00"), GUILayout.MaxWidth(150f));
        binding.FilterWindowSize = EditorGUILayout.IntField("Filter window", binding.FilterWindowSize, GUILayout.MaxWidth(150f));
        EditorGUILayout.EndHorizontal();
        binding.FilterConstant = EditorGUILayout.Slider("Filter amount", binding.FilterConstant, 0f, 1f, GUILayout.MaxWidth(305f));
        EditorGUILayout.EndVertical();
        EditorGUILayout.Separator();

        // targets
        EditorGUILayout.BeginVertical(EditorStyles.whiteLargeLabel);
        serializedObject.Update();
        SerializedProperty prop = serializedObject.FindProperty("Targets");

        EditorGUI.BeginChangeCheck();
        EditorGUILayout.PropertyField(prop, true, GUILayout.MaxWidth(305f));
        if (EditorGUI.EndChangeCheck())
        {
            serializedObject.ApplyModifiedProperties();
            if (binding.Targets != null)
            {
                foreach (ActionUnitBindingTarget t in binding.Targets)
                {
                    t.Name = "None";
                    if (t.Renderer != null)
                    {
                        t.Name = t.Renderer.name;
                    }
                }
            }
        }
        EditorGUILayout.Separator();
        EditorGUILayout.EndVertical();
    }