public static void SelectKeyframe(int index, SubstanceMaterialParams substanceMaterialParams, SubstanceAnimationParams animationParams, SubstanceToolParams substanceToolParams) // select a keyframe by its number. { SubstanceTweenSetParameterUtility.SetProceduralVariablesFromList(substanceMaterialParams.MaterialVariableKeyframeList[index], substanceMaterialParams, animationParams, substanceToolParams); substanceMaterialParams.emissionInput = substanceMaterialParams.MaterialVariableKeyframeList[index].emissionColor; if (substanceMaterialParams.rend.sharedMaterial.HasProperty("_EmissionColor")) { substanceMaterialParams.rend.sharedMaterial.SetColor("_EmissionColor", substanceMaterialParams.MaterialVariableKeyframeList[index].emissionColor); substanceToolParams.selectedPrefabScript.emissionInput = substanceMaterialParams.MaterialVariableKeyframeList[index].emissionColor; } if (substanceMaterialParams.rend.sharedMaterial.HasProperty("_MainTex")) { substanceMaterialParams.MainTexOffset = substanceMaterialParams.MaterialVariableKeyframeList[index].MainTex; substanceMaterialParams.rend.sharedMaterial.SetTextureOffset("_MainTex", substanceMaterialParams.MaterialVariableKeyframeList[index].MainTex); } }
public static void ReadJSON(SubstanceMaterialParams substanceMaterialParams, SubstanceAnimationParams animationParams, SubstanceToolParams substanceToolParams) { string path = EditorUtility.OpenFilePanel("", "", "json"); // 'Open' Dialog that only accepts JSON files if (path.Length != 0) { string dataAsJson = File.ReadAllText(path); var stream = new FileStream(path, FileMode.Open); if (stream.Length != 0) { MaterialVariableListHolder jsonContainer = JsonUtility.FromJson <MaterialVariableListHolder>(dataAsJson); SubstanceTweenSetParameterUtility.SetProceduralVariablesFromList(jsonContainer, substanceMaterialParams, animationParams, substanceToolParams); substanceMaterialParams.MainTexOffset = jsonContainer.MainTex; Color jsonEmissionColor = new Color(0, 0, 0, 0); jsonEmissionColor = jsonContainer.emissionColor; if (substanceMaterialParams.rend.sharedMaterial.HasProperty("_EmissionColor")) { substanceMaterialParams.emissionInput = jsonEmissionColor; substanceMaterialParams.rend.sharedMaterial.SetColor("_EmissionColor", jsonEmissionColor); substanceToolParams.selectedPrefabScript.emissionInput = substanceMaterialParams.emissionInput; } stream.Close(); substanceToolParams.DebugStrings.Add("-----------------------------------"); substanceToolParams.DebugStrings.Add("Read XML file " + " from: " + stream.Name + ", File has: "); if (jsonContainer.PropertyMaterialName != null) { substanceToolParams.DebugStrings.Add("Material Name: " + jsonContainer.PropertyMaterialName); } substanceToolParams.DebugStrings.Add(jsonContainer.PropertyName.Count + " Total Properties"); substanceToolParams.DebugStrings.Add(jsonContainer.PropertyFloat.Count + " Float Properties"); substanceToolParams.DebugStrings.Add(jsonContainer.PropertyColor.Count + " Color Properties "); substanceToolParams.DebugStrings.Add(jsonContainer.PropertyVector4.Count + " Vector4 Properties"); substanceToolParams.DebugStrings.Add(jsonContainer.PropertyVector3.Count + " Vector3 Properties"); substanceToolParams.DebugStrings.Add(jsonContainer.PropertyVector2.Count + " Vector2 Properties"); substanceToolParams.DebugStrings.Add(jsonContainer.PropertyEnum.Count + " Enum Properties"); substanceToolParams.DebugStrings.Add(jsonContainer.PropertyBool.Count + " Boolean Properties"); substanceToolParams.DebugStrings.Add(jsonContainer.myKeys.Count + " Keys"); substanceToolParams.DebugStrings.Add(jsonContainer.myValues.Count + " Values"); substanceToolParams.DebugStrings.Add("_EmissionColor = " + jsonContainer.emissionColor); substanceToolParams.DebugStrings.Add("_MainTex = " + substanceMaterialParams.MainTexOffset); substanceToolParams.DebugStrings.Add("-----------------------------------"); substanceMaterialParams.substance.RebuildTexturesImmediately(); } } substanceToolParams.lastAction = MethodBase.GetCurrentMethod().Name.ToString(); SubstanceTweenAnimationUtility.CacheAnimatedProceduralVariables(substanceMaterialParams, animationParams); } // Sets current material variables from a JSON file without creating a keyframe
public static void ReadXML(SubstanceMaterialParams substanceMaterialParams, SubstanceAnimationParams animationParams, SubstanceToolParams substanceToolParams) // Sets current material variables from a XML file without creating a keyframe. { var serializer = new XmlSerializer(typeof(MaterialVariableListHolder)); string path = EditorUtility.OpenFilePanel("", "", "xml"); // 'Open' Dialog that only accepts XML files if (path.Length != 0) { var stream = new FileStream(path, FileMode.Open); if (stream.Length != 0) { var container = serializer.Deserialize(stream) as MaterialVariableListHolder; //Convert XML to a list SubstanceTweenSetParameterUtility.SetProceduralVariablesFromList(container, substanceMaterialParams, animationParams, substanceToolParams); substanceMaterialParams.MainTexOffset = container.MainTex; Color xmlEmissionColor = new Color(0, 0, 0, 0); xmlEmissionColor = container.emissionColor; if (substanceMaterialParams.rend.sharedMaterial.HasProperty("_EmissionColor")) { substanceMaterialParams.emissionInput = xmlEmissionColor; substanceMaterialParams.rend.sharedMaterial.SetColor("_EmissionColor", xmlEmissionColor); } stream.Close(); substanceToolParams.DebugStrings.Add("-----------------------------------"); substanceToolParams.DebugStrings.Add("Read XML file " + " from: " + stream.Name + ", File has: "); if (container.PropertyMaterialName != null) { substanceToolParams.DebugStrings.Add("Material Name: " + container.PropertyMaterialName); } substanceToolParams.DebugStrings.Add(container.PropertyName.Count + " Total Properties"); substanceToolParams.DebugStrings.Add(container.PropertyFloat.Count + " Float Properties"); substanceToolParams.DebugStrings.Add(container.PropertyColor.Count + " Color Properties "); substanceToolParams.DebugStrings.Add(container.PropertyVector4.Count + " Vector4 Properties"); substanceToolParams.DebugStrings.Add(container.PropertyVector3.Count + " Vector3 Properties"); substanceToolParams.DebugStrings.Add(container.PropertyVector2.Count + " Vector2 Properties"); substanceToolParams.DebugStrings.Add(container.PropertyEnum.Count + " Enum Properties"); substanceToolParams.DebugStrings.Add(container.PropertyBool.Count + " Boolean Properties"); substanceToolParams.DebugStrings.Add(container.myKeys.Count + " Keys"); substanceToolParams.DebugStrings.Add(container.myValues.Count + " Values"); substanceToolParams.DebugStrings.Add("_EmissionColor = " + container.emissionColor); substanceToolParams.DebugStrings.Add("_MainTex = " + substanceMaterialParams.MainTexOffset); substanceToolParams.DebugStrings.Add("-----------------------------------"); substanceMaterialParams.substance.RebuildTexturesImmediately(); } } substanceToolParams.lastAction = MethodBase.GetCurrentMethod().Name.ToString(); SubstanceTweenAnimationUtility.CacheAnimatedProceduralVariables(substanceMaterialParams, animationParams); }
public static void CheckForAddKeyFromCurveEditor(SubstanceMaterialParams substanceMaterialParams, SubstanceAnimationParams animationParams, SubstanceToolParams substanceToolParams, SubstanceFlickerParams flickerValues) { for (int i = 0; i <= animationParams.substanceCurveBackup.keys.Count() - 1; i++) { if (i <= animationParams.substanceCurve.keys.Count() - 1 && animationParams.substanceCurve.keys[i].time != animationParams.substanceCurveBackup.keys[i].time) // find keyframe that has just been created or deleted in the curve editor { if (animationParams.substanceCurve.keys.Count() > animationParams.substanceCurveBackup.keys.Count()) { animationParams.substanceCurve.MoveKey(i, new Keyframe(animationParams.substanceCurve.keys[i].time, animationParams.substanceCurve.keys[i].time)); // lerp does not work correctly if the keyframe value is different than the time. i cant edit the key so i delete then add a new one float tempKeyframeTime = animationParams.substanceCurve.keys[i].time; SubstanceTweenSetParameterUtility.SetProceduralMaterialBasedOnAnimationTime(ref tempKeyframeTime, substanceMaterialParams, animationParams, substanceToolParams, flickerValues); SubstanceTweenKeyframeUtility.InsertKeyframe(i, substanceMaterialParams, animationParams, substanceToolParams); SubstanceTweenKeyframeUtility.SelectKeyframe(i, substanceMaterialParams, animationParams, substanceToolParams); animationParams.currentAnimationTime = 0; animationParams.substanceCurveBackup.keys = animationParams.substanceCurve.keys; SubstanceTweenAnimationUtility.CalculateAnimationLength(substanceMaterialParams, animationParams); return; } } } }
public static void ResetAllProceduralValues(SubstanceDefaultMaterialParams substanceDefaultMaterialParams, SubstanceMaterialParams substanceMaterialParams, SubstanceAnimationParams animationParams, SubstanceToolParams substanceToolParams) // Resets all procedural values to default(When the material was first selected) { for (int i = 0; i <= substanceDefaultMaterialParams.defaultSubstanceObjProperties.Count - 1; i++) { if ((substanceMaterialParams.substance.name == substanceDefaultMaterialParams.defaultSubstanceObjProperties[i].PropertyMaterialName) || (substanceMaterialParams.rend.sharedMaterial.name == substanceDefaultMaterialParams.defaultSubstanceObjProperties[i].PropertyMaterialName)) { substanceMaterialParams.resettingValuesToDefault = true; SubstanceTweenSetParameterUtility.SetProceduralVariablesFromList(substanceDefaultMaterialParams.defaultSubstanceObjProperties[i], substanceMaterialParams, animationParams, substanceToolParams); substanceMaterialParams.MainTexOffset = substanceDefaultMaterialParams.defaultSubstanceObjProperties[i].MainTex; if (substanceMaterialParams.rend.sharedMaterial.HasProperty("_EmissionColor")) { substanceMaterialParams.rend.sharedMaterial.EnableKeyword("_EMISSION"); substanceMaterialParams.emissionInput = substanceDefaultMaterialParams.defaultSubstanceObjProperties[i].emissionColor; substanceMaterialParams.rend.sharedMaterial.SetColor("_EmissionColor", substanceMaterialParams.emissionInput);; substanceToolParams.selectedPrefabScript.emissionInput = substanceMaterialParams.emissionInput; } substanceMaterialParams.substance.RebuildTexturesImmediately(); substanceMaterialParams.resettingValuesToDefault = false; return; } } }
public static void CheckForRemoveOrEditFromCurveEditor(SubstanceMaterialParams substanceMaterialParams, SubstanceAnimationParams animationParams, SubstanceToolParams substanceToolParams, SubstanceFlickerParams flickerValues) { bool inEditKeysMode = false; int keyframesModifiedSoFar = 0; //number of keyframes deleted edited so far int curvePointsCountDifference = animationParams.substanceCurveBackup.keys.Count() - animationParams.substanceCurve.keys.Count(); // difference between number of points before the change compared to the number of points after the change List <float> BackupKeyframePointTimes = new List <float>(); // points on curve before change List <float> CurrentKeyframePointTimes = new List <float>(); // points on curve after change Keyframe firstEditedKeyframeBeforeEdit = new Keyframe(-1, -1); //the first keyframe in the list that has been edited ore deleted int firstEditedKeyframeIndexBeforeEdit = -1; // index of the first edited keyframe if (animationParams.substanceCurve.keys[0].time != 0) { animationParams.substanceCurve.keys[0].time = 0; } for (int i = 0; i <= animationParams.substanceCurveBackup.keys.Count() - 1; i++) { BackupKeyframePointTimes.Add(animationParams.substanceCurveBackup.keys[i].time); } for (int i = 0; i <= animationParams.substanceCurve.keys.Count() - 1; i++) { CurrentKeyframePointTimes.Add(animationParams.substanceCurve.keys[i].time); } for (int i = 0; i <= BackupKeyframePointTimes.Count() - 2; i++) { if (!CurrentKeyframePointTimes.Contains(BackupKeyframePointTimes[i])) { // find index of the first key that has ben edited using context menu firstEditedKeyframeBeforeEdit = animationParams.substanceCurveBackup.keys[i]; float tempKeyframeTime = firstEditedKeyframeBeforeEdit.time; firstEditedKeyframeIndexBeforeEdit = i; SubstanceTweenSetParameterUtility.SetProceduralMaterialBasedOnAnimationTime(ref tempKeyframeTime, substanceMaterialParams, animationParams, substanceToolParams, flickerValues); break; } } for (int i = 0; i <= CurrentKeyframePointTimes.Count() - 2; i++) { if (!BackupKeyframePointTimes.Contains(CurrentKeyframePointTimes[i])) {// if i use the context menu to edit multiple keyframes to a value that is not already on the graph i can find that new keyframe here. // I can tell when i have EDITED a keyframe to a new value because when deleting keyframes, every new point's time should also exist in the backup inEditKeysMode = true; float tempKeyframeTime = firstEditedKeyframeBeforeEdit.time; SubstanceTweenSetParameterUtility.SetProceduralMaterialBasedOnAnimationTime(ref tempKeyframeTime, substanceMaterialParams, animationParams, substanceToolParams, flickerValues); // find/set material based on first edited keyframe if (firstEditedKeyframeIndexBeforeEdit != -1) // if multiple keyframes has been edited using context menu { SubstanceTweenKeyframeUtility.OverWriteKeyframe(firstEditedKeyframeIndexBeforeEdit, substanceMaterialParams, animationParams, substanceToolParams); // overwrite new keyframe with material of the first edited keyframe } } } for (int i = BackupKeyframePointTimes.Count() - 1; i > 0; i--) // Go through every key in the backup list(Before the keys got deleted) { if (!CurrentKeyframePointTimes.Contains(BackupKeyframePointTimes[i])) // if the current list of curve points does not contain this value(it was deleted in the curve editor) { //Find the index of the value and delete any information that has not already been deleted in the curve editor // get the index of the deleted point and delete the Dictionary/List associated with that index keyframesModifiedSoFar++; animationParams.keyFrameTimes.RemoveAt(BackupKeyframePointTimes.IndexOf(BackupKeyframePointTimes[i])); substanceMaterialParams.MaterialVariableKeyframeList.RemoveAt(BackupKeyframePointTimes.IndexOf(BackupKeyframePointTimes[i])); substanceMaterialParams.MaterialVariableKeyframeDictionaryList.RemoveAt(BackupKeyframePointTimes.IndexOf(BackupKeyframePointTimes[i])); if (animationParams.keyFrames > 0) { animationParams.keyFrames--; } } if (inEditKeysMode && i == 1 && keyframesModifiedSoFar > 0) { // if i edited multiple keyframes at the same time using the context menu I insert a keyframe when i reach the end of the for loop SubstanceTweenKeyframeUtility.InsertKeyframe(i, substanceMaterialParams, animationParams, substanceToolParams); } } for (int i = 0; i <= animationParams.substanceCurve.keys.Count() - 2; i++) { // rebuild/refresh animation times animationParams.keyFrameTimes[i] = animationParams.substanceCurve.keys[i + 1].time - animationParams.substanceCurve.keys[i].time; // this keyframe time = (next keyframe time - This keyframe time) substanceMaterialParams.MaterialVariableKeyframeList[i].animationTime = animationParams.substanceCurve.keys[i + 1].time - animationParams.substanceCurve.keys[i].time; } if (curvePointsCountDifference != keyframesModifiedSoFar) { // Because curvePoint EditDifference != keyframes Edited/changed, I know that keyframes have been changed with 'Edit Keys..' and not 'Delete' // when editing multipule keyframes to a new singular time that is not already on the list, // there should always be more edited keyframes then the difference between current curve points and backup curve points. if (animationParams.substanceCurve.keys[animationParams.substanceCurve.keys.Count() - 1].time > animationParams.substanceCurveBackup.keys[animationParams.substanceCurveBackup.keys.Count() - 1].time) {// Edited multiple keyframes to a new time that is more than the length of the backup curve SubstanceTweenKeyframeUtility.CreateKeyframe(substanceMaterialParams, animationParams, substanceToolParams); } } animationParams.substanceCurveBackup.keys = animationParams.substanceCurve.keys; SubstanceTweenAnimationUtility.CalculateAnimationLength(substanceMaterialParams, animationParams); inEditKeysMode = false; }
public IEnumerator SubstanceTweenPlayTestWithEnumeratorPasses() { // Use the Assert class to test conditions. // yield to skip a frame //SETUP SCENE/OBJECT SetupScene(); SpawnAndSetupObject(); yield return(new WaitForSeconds(0.5f)); //LOAD PROCEDURAL MATERIALS LoadAllProceduralMaterialsFromFolder(); SetSpecificProceduralMaterial("Crystal1-11"); yield return(new WaitForSeconds(1)); // ADD MAIN TOOL TO SELECTED OBJECT AddEditorToolToObject(); //REMEMBER CURRENT MATERIAL AS THE STARTUP/BEFORE CHANGE materialVariablesBeforeChange = materialBeforeChange.GetProceduralPropertyDescriptions(); AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange); AddSetProceduralVariablesBeforeChangeToKeyValue(materialAtStartup, materialVariablesAtStartup, materialKeysAtStartup, materialValuesAtStartup); materialVariablesAtStartup = materialAtStartup.GetProceduralPropertyDescriptions(); yield return(new WaitForSeconds(0.5f)); // RANDOMIZE VALUES SubstanceTweenSetParameterUtility.RandomizeProceduralValues(testingScript.substanceMaterialParams, testingScript.randomizeSettings); yield return(new WaitForSeconds(0.5f)); // SET TO MINIMUM AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange); SubstanceTweenSetParameterUtility.SetAllProceduralValuesToMin(testingScript.substanceMaterialParams); yield return(new WaitForSeconds(0.5f)); //SET TO MAXIMUM CheckForChangedMaterialParams(materialVariablesBeforeChange); AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange); SubstanceTweenSetParameterUtility.SetAllProceduralValuesToMax(testingScript.substanceMaterialParams); CheckForChangedMaterialParams(materialVariablesBeforeChange); yield return(new WaitForSeconds(0.5f)); // RESET MATERIAL SubstanceTweenSetParameterUtility.ResetAllProceduralValues(testingScript.substanceDefaultMaterialParams, testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams); CheckForNoChangeInMaterialParams(materialAtStartup, materialVariablesAtStartup, materialKeysAtStartup, materialValuesAtStartup); AddSetProceduralVariablesBeforeChangeToKeyValue(materialBeforeChange, materialVariablesBeforeChange, materialKeysBeforeChange, materialValuesBeforeChange); yield return(new WaitForSeconds(0.5f)); //CREATE KEYFRAMES SetSpecificMaterialParamsAndCreateKeyframes(5, "Crystal_Disorder", "Grunge_Map5_Contrast", "Base_Color"); CheckForChangedMaterialParams(materialVariablesBeforeChange); ReWriteAllKeyframeTimes(1, testingScript.substanceMaterialParams, testingScript.animationParams); testingScript.substanceToolParams.selectedPrefabScript.animationToggle = true; yield return(new WaitForSeconds(40f)); // START TESTING CURVES testingScript.substanceToolParams.testingCurve = true; float addKey = 19; testingScript.animationParams.substanceCurve.AddKey(addKey, addKey); // ADD KEY TO CURVE Assert.That(testingScript.animationParams.substanceCurve.keys.Count() != testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key count matches backup "); SubstanceTweenKeyframeUtility.CheckForAddKeyFromCurveEditor(testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams, testingScript.flickerValues); // checks if a key was added on the curve. if a curve key was added I add a keyframe for the material Assert.That(testingScript.animationParams.substanceCurve.keys.Count() == testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key does not count matches backup "); for (int i = 0; i <= testingScript.animationParams.substanceCurve.keys.Count() - 1; i++) { if (testingScript.animationParams.substanceCurve.keys[i].time == addKey) { testingScript.animationParams.substanceCurve.RemoveKey(i); } } Assert.That(testingScript.animationParams.substanceCurve.keys.Count() != testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key count matches backup "); SubstanceTweenKeyframeUtility.CheckForRemoveOrEditFromCurveEditor(testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams, testingScript.flickerValues); // checks if a key was removed/edited on the curve. if a curve key was removed/edited I reflect the changes to the material keyframes. Assert.That(testingScript.animationParams.substanceCurve.keys.Count() == testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key does not count matches backup "); //CREATE UNDO STATE Undo.RegisterCompleteObjectUndo(new UnityEngine.Object[] { testingScript.referenceToEditorScript }, "Edited Curve"); //SIMULATE EDITING MULTIPLE CURVE KEYS TO A NEW VALUE THAT DOES NOT ALREADY EXIST ON THE CURVE testingScript.animationParams.substanceCurve.RemoveKey(2); testingScript.animationParams.substanceCurve.RemoveKey(1); testingScript.animationParams.substanceCurve.AddKey(4, 4); Assert.That(testingScript.animationParams.substanceCurve.keys.Count() != testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key count matches backup "); SubstanceTweenKeyframeUtility.CheckForRemoveOrEditFromCurveEditor(testingScript.substanceMaterialParams, testingScript.animationParams, testingScript.substanceToolParams, testingScript.flickerValues); Assert.That(testingScript.animationParams.substanceCurve.keys.Count() == testingScript.animationParams.substanceCurveBackup.keys.Count(), "ERROR: Curve key does not count matches backup "); yield return(new WaitForSeconds(10)); // UNDO TO A PREVIOUS STATE Undo.PerformUndo(); // STOP TESTING CURVES testingScript.substanceToolParams.testingCurve = false; yield return(new WaitForSeconds(50)); //END TEST yield break; }
} //Writes all keyframes to JSON files public static void ReadAllJSON(SubstanceMaterialParams substanceMaterialParams, SubstanceAnimationParams animationParams, SubstanceToolParams substanceToolParams) // Read JSON files and create keyframes from them. { string JsonReadFolderPath = EditorUtility.OpenFolderPanel("Load JSON files from folder", "", ""); //Creates 'Open Folder' Dialog if (JsonReadFolderPath.Length != 0) { string[] JsonReadFiles = Directory.GetFiles(JsonReadFolderPath);//array of selected xml file paths if (JsonReadFiles.Count() > 0) { animationParams.keyFrames = animationParams.keyFrameTimes.Count(); foreach (string jsonReadFile in JsonReadFiles) //for each xml file path in the list. { if (jsonReadFile.EndsWith(".json")) { string dataAsJson = File.ReadAllText(jsonReadFile); var stream = new FileStream(jsonReadFile, FileMode.Open); // defines how to use the file at the selected path MaterialVariableListHolder jsonContainer = JsonUtility.FromJson <MaterialVariableListHolder>(dataAsJson); SubstanceTweenSetParameterUtility.SetProceduralVariablesFromList(jsonContainer, substanceMaterialParams, animationParams, substanceToolParams); //Sets current substance values from list substanceMaterialParams.MainTexOffset = jsonContainer.MainTex; Color jsonEmissionColor = new Color(0, 0, 0, 0); jsonEmissionColor = jsonContainer.emissionColor; if (substanceMaterialParams.rend.sharedMaterial.HasProperty("_EmissionColor")) { substanceMaterialParams.emissionInput = jsonEmissionColor; if (substanceToolParams.selectedPrefabScript) { substanceToolParams.selectedPrefabScript.emissionInput = substanceMaterialParams.emissionInput; } substanceMaterialParams.rend.sharedMaterial.SetColor("_EmissionColor", jsonEmissionColor); } stream.Close(); //Close Xml reader substanceMaterialParams.substance.RebuildTexturesImmediately(); if (animationParams.keyFrameTimes.Count == 0) // Create keyframe from list containing XML variables { if (animationParams.substanceCurve.keys.Count() > 0) { animationParams.substanceCurve.RemoveKey(0); animationParams.substanceCurve.AddKey(0, 0); } substanceMaterialParams.MaterialVariableKeyframeDictionaryList.Add(new MaterialVariableDictionaryHolder()); substanceMaterialParams.MaterialVariableKeyframeList.Add(new MaterialVariableListHolder()); substanceMaterialParams.MaterialVariableKeyframeList[0] = jsonContainer; animationParams.keyFrames++; animationParams.keyFrameTimes.Add(substanceMaterialParams.MaterialVariableKeyframeList[0].animationTime); AnimationUtility.SetKeyBroken(animationParams.substanceCurve, 0, true); AnimationUtility.SetKeyLeftTangentMode(animationParams.substanceCurve, 0, AnimationUtility.TangentMode.Linear); AnimationUtility.SetKeyRightTangentMode(animationParams.substanceCurve, 0, AnimationUtility.TangentMode.Linear); } else if (animationParams.keyFrameTimes.Count > 0) { substanceMaterialParams.MaterialVariableKeyframeList.Add(new MaterialVariableListHolder()); substanceMaterialParams.MaterialVariableKeyframeList[animationParams.keyFrames] = jsonContainer; substanceMaterialParams.MaterialVariableKeyframeDictionaryList.Add(new MaterialVariableDictionaryHolder()); substanceMaterialParams.MaterialVariableKeyframeDictionaryList[animationParams.keyFrames] = new MaterialVariableDictionaryHolder(); animationParams.keyFrameTimes.Add(jsonContainer.animationTime); animationParams.keyframeSum = 0; for (int i = 0; i < substanceMaterialParams.MaterialVariableKeyframeList.Count() - 1; i++) // -1 to count here 6/10/17 { animationParams.keyframeSum += substanceMaterialParams.MaterialVariableKeyframeList[i].animationTime; } if (jsonContainer.AnimationCurveKeyframeList.Count() >= 1) { animationParams.substanceCurve.AddKey(new Keyframe(animationParams.keyframeSum, animationParams.keyframeSum, jsonContainer.AnimationCurveKeyframeList[0].inTangent, jsonContainer.AnimationCurveKeyframeList[0].outTangent)); } else { animationParams.substanceCurve.AddKey(new Keyframe(animationParams.keyframeSum, animationParams.keyframeSum)); } if (animationParams.keyFrames >= 1) { AnimationUtility.SetKeyBroken(animationParams.substanceCurve, animationParams.keyFrames, true); } animationParams.keyFrames++; } } substanceToolParams.DebugStrings.Add("Read keyframe from: " + jsonReadFile); } substanceToolParams.DebugStrings.Add(animationParams.keyFrames - 1 + " Keyframes created from XML files "); animationParams.substanceCurveBackup.keys = animationParams.substanceCurve.keys; substanceToolParams.lastAction = MethodBase.GetCurrentMethod().Name.ToString(); } else { EditorUtility.DisplayDialog("Empty Folder", "No Files were found in the selected folder", "Ok"); } SubstanceTweenAnimationUtility.CacheAnimatedProceduralVariables(substanceMaterialParams, animationParams); SubstanceTweenAnimationUtility.CalculateAnimationLength(substanceMaterialParams, animationParams); } }