public void reset() { // Please keep these in the same order and grouping as their declarations at the top. // Assets ------------------------------------------------------------------------------------------------------- prControl = null; // Parameters ----------------------------------------------------------------------------------------------- prEditable = true; prParmCount = 0; prParmIntValueCount = 0; prParmFloatValueCount = 0; prParmStringValueCount = 0; prParmChoiceCount = 0; prParms = null; prParmIntValues = new int[ 0 ]; prParmFloatValues = new float[ 0 ]; prParmStringValues = new HAPI_StringHandle[ 0 ]; prParmChoiceLists = new HAPI_ParmChoiceInfo[ 0 ]; prLastChangedParmId = -1; myParmsUndoInfo = null; prFolderListSelections = new List< int >(); prFolderListSelectionIds = new List< int >(); prFolderListSelections.Add( 0 ); prFolderListSelectionIds.Add( -1 ); // Control ------------------------------------------------------------------------------------------------- myPostSerialization = true; myValuesEqualToHoudini = false; }
///////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Private private void performUndo() { HoudiniParmsUndoInfo undo_info = ScriptableObject.Instantiate(myParms.prParmsUndoInfo) as HoudiniParmsUndoInfo; // First find all multiparms and add/remove instances as necessary. foreach (HAPI_ParmInfo parm in myParms.prParms) { if ( parm.type == HAPI_ParmType.HAPI_PARMTYPE_MULTIPARMLIST && undo_info.parmNames.Contains(parm.name)) { // Get value of multiparm from undo info. int new_value_index = undo_info.parmIndices[undo_info.parmNames.IndexOf(parm.name)]; int new_value = undo_info.parmIntValues[new_value_index]; // get current value of multiparm int current_value = myParms.prParmIntValues[parm.intValuesIndex]; // Add/Remove number of instances from current parameters to match number // of parameters from undo info. int difference = new_value - current_value; if (difference > 0) { myParms.appendMultiparmInstances(parm, difference); } else if (difference < 0) { myParms.removeMultiparmInstances(parm, -difference); } else { continue; } myParms.getParameterValues(); myParmChanges = true; } } // Next loop through all parameters and copy changed values over from undo info. foreach (HAPI_ParmInfo parm in myParms.prParms) { if (!undo_info.parmNames.Contains(parm.name)) { continue; } if (parm.isInt()) { int new_value_index = undo_info.parmIndices[undo_info.parmNames.IndexOf(parm.name)]; bool is_different = false; for (int idx = 0; idx < parm.size; ++idx) { is_different |= undo_info.parmIntValues[new_value_index + idx] != myParms.prParmIntValues[parm.intValuesIndex + idx]; } if (is_different && parm.type != HAPI_ParmType.HAPI_PARMTYPE_MULTIPARMLIST) { myParmChanges = true; int[] values = new int[parm.size]; Array.Copy(undo_info.parmIntValues, new_value_index, values, 0, parm.size); HoudiniHost.setParmIntValues( myParms.prControl.prNodeId, values, parm.intValuesIndex, parm.size); } } else if (parm.isFloat()) { int new_value_index = undo_info.parmIndices[undo_info.parmNames.IndexOf(parm.name)]; bool is_different = false; for (int idx = 0; idx < parm.size; ++idx) { is_different |= undo_info.parmFloatValues[new_value_index + idx] != myParms.prParmFloatValues[parm.floatValuesIndex + idx]; } if (is_different) { myParmChanges = true; float[] values = new float[parm.size]; Array.Copy(undo_info.parmFloatValues, new_value_index, values, 0, parm.size); HoudiniHost.setParmFloatValues( myParms.prControl.prNodeId, values, parm.floatValuesIndex, parm.size); } } else if (parm.isString()) { string[] current_string_values = new string[parm.size]; current_string_values = myParms.getParmStrings(parm); for (int i = 0; i < parm.size; i++) { int new_value_index = undo_info.parmIndices[undo_info.parmNames.IndexOf(parm.name)]; string new_string_value = undo_info.parmStringValues[new_value_index + i]; string current_string_value = current_string_values[i]; if (string.Compare(current_string_value, new_string_value) != 0) { myParmChanges = true; HoudiniHost.setParmStringValue( myParms.prControl.prNodeId, new_string_value, parm.id, i); } } } else if (parm.isNode()) { // TODO } // By type of parm. } // For all parms. }
public void getParameterValues() { if ( prControl == null ) return; if ( prControl.prAsset == null ) return; if ( prControl.prAssetId < 0 ) return; if ( myPostSerialization ) myValuesEqualToHoudini = areValuesEqualToHoudini(); else myValuesEqualToHoudini = true; // Create undo info if it hasn't been created already if ( myParmsUndoInfo == null ) myParmsUndoInfo = ScriptableObject.CreateInstance< HoudiniParmsUndoInfo >(); // Get the node info again HAPI_NodeInfo node_info = HoudiniHost.getNodeInfo( prControl.prNodeId ); prParmCount = node_info.parmCount; prParmIntValueCount = node_info.parmIntValueCount; prParmFloatValueCount = node_info.parmFloatValueCount; prParmStringValueCount = node_info.parmStringValueCount; prParmChoiceCount = node_info.parmChoiceCount; // Get all parameters. prParms = new HAPI_ParmInfo[ prParmCount ]; HoudiniAssetUtility.getArray1Id( prControl.prNodeId, HoudiniHost.getParameters, prParms, prParmCount ); // Get parameter int values. prParmIntValues = new int[ prParmIntValueCount ]; HoudiniAssetUtility.getArray1Id( prControl.prNodeId, HoudiniHost.getParmIntValues, prParmIntValues, prParmIntValueCount ); myParmsUndoInfo.parmIntValues = new int[ prParmIntValueCount ]; Array.Copy( prParmIntValues, myParmsUndoInfo.parmIntValues, prParmIntValueCount ); // Get parameter float values. prParmFloatValues = new float[ prParmFloatValueCount ]; HoudiniAssetUtility.getArray1Id( prControl.prNodeId, HoudiniHost.getParmFloatValues, prParmFloatValues, prParmFloatValueCount ); myParmsUndoInfo.parmFloatValues = new float[ prParmFloatValueCount ]; Array.Copy( prParmFloatValues, myParmsUndoInfo.parmFloatValues, prParmFloatValueCount ); // Get parameter string (handle) values. prParmStringValues = new int[ prParmStringValueCount ]; HoudiniAssetUtility.getArray1Id( prControl.prNodeId, HoudiniHost.getParmStringValues, prParmStringValues, prParmStringValueCount ); // Get parameter choice lists. prParmChoiceLists = new HAPI_ParmChoiceInfo[ prParmChoiceCount ]; HoudiniAssetUtility.getArray1Id( prControl.prNodeId, HoudiniHost.getParmChoiceLists, prParmChoiceLists, prParmChoiceCount ); // Build the map of parm id -> parm for ( int i = 0; i < prParms.Length; ++i ) myParmMap[ prParms[ i ].id ] = prParms[ i ]; cacheStringsFromHost(); // Go through parameters and set index map and multiparm map for undo info myParmsUndoInfo.parmNames.Clear(); myParmsUndoInfo.parmIndices.Clear(); foreach ( HAPI_ParmInfo parm in prParms ) { // Need to check the index values are greater or equal to 0 // for now because there is a bug where some parameters are // being set to have an integer parameter type, a size of // zero, and an index value of -1 if ( parm.isInt() && parm.intValuesIndex >= 0 ) myParmsUndoInfo.parmIndices.Add( parm.intValuesIndex ); else if ( parm.isFloat() && parm.floatValuesIndex >= 0 ) myParmsUndoInfo.parmIndices.Add( parm.floatValuesIndex ); else if ( parm.isString() && parm.stringValuesIndex >= 0 ) myParmsUndoInfo.parmIndices.Add( parm.stringValuesIndex ); else continue; myParmsUndoInfo.parmNames.Add( parm.name ); } #if UNITY_EDITOR // Set which parameter values have been overridden (only needed for a prefab instance) if ( prControl && prControl.isPrefabInstance() && gameObject.GetComponent< HoudiniAsset >() != null ) { HoudiniAsset prefab_asset = prControl.prAsset.getParentPrefabAsset(); if ( prefab_asset && prefab_asset.prParms != null && prefab_asset.prParms.prParms != null && !prefab_asset.isApplyingChangesToPrefab() ) { // loop through parameter values and determine which ones have been // overridden (ie. changed from corresponding parameter value on prefab) for ( int i = 0; i < prParms.Length; ++i ) { myOverriddenParmsMap[ prParms[ i ].id ] = !isParmSameInPrefab( prParms[ i ].id, prefab_asset.prParms ); } } // This tells Unity that parameter values have been overridden for this prefab instance PrefabUtility.RecordPrefabInstancePropertyModifications( this ); } #endif // UNITY_EDITOR }