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; } }
/** 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."); } }
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(); }