Beispiel #1
0
    protected override bool buildCreateObjects(bool reload_asset, ref HoudiniProgressBar progress_bar)
    {
        try
        {
            const int object_id = 0;
            const int geo_id    = 0;

            // Write marshalled geo to Input Asset.
            HoudiniAssetUtility.setMesh(
                prAssetId, object_id, geo_id, ref myEditableMesh, null, myGeoAttributeManager);

            // Apply the input asset transform to the marshaled object in the Houdini scene.
            HAPI_TransformEuler trans = HoudiniAssetUtility.getHapiTransform(transform.localToWorldMatrix);
            HoudiniHost.setObjectTransform(prAssetId, object_id, ref trans);

            // Marshall in the animation.
            Animation anim_component = GetComponent <Animation>();
            if (anim_component)
            {
                if (anim_component.clip != null)
                {
                    marshalCurvesFromClip(prObjectNodeId, anim_component.clip);
                }
                else
                {
                    foreach (AnimationState anim_state in anim_component)
                    {
                        AnimationClip clip = anim_component.GetClip(anim_state.name);
                        if (clip != null)
                        {
                            marshalCurvesFromClip(prObjectNodeId, clip);
                            break;
                        }
                    }
                }
            }

            HoudiniHost.repaint();
        }
        catch (HoudiniError)
        {
            // Per-object errors are not re-thrown so that the rest of the asset has a chance to load.
            //Debug.LogWarning( error.ToString() );
        }

        return(false);
    }
    private static extern HAPI_Result HAPI_ConvertTransform(
		ref HAPI_Session session,
		ref HAPI_TransformEuler transform_in,
		HAPI_RSTOrder rst_order,
		HAPI_XYZOrder rot_order,
		out HAPI_TransformEuler transform_out );
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	// Public
	public void handlesOnSceneGUI()
	{
		if ( myAssetOTL.prShowPinnedInstances )
			drawPinnedInstances();

		// On mouse up the drag operation is completed.
		if ( Event.current.type == EventType.MouseUp )
			myOpInProgress = false;

		string currentGlobalManipTool = Tools.current.ToString();

		if ( currentGlobalManipTool == "Rotate" )
			myManipMode = XformManipMode.Rotate;
		
		else if ( currentGlobalManipTool == "Move" )
			myManipMode = XformManipMode.Translate;
		
		else if ( currentGlobalManipTool == "Scale" )
			myManipMode = XformManipMode.Scale;
		
		if ( myAssetOTL == null )
			return;
		
		int node_id						= myAssetOTL.prNodeId;
		HAPI_HandleInfo[] handleInfos 	= myAssetOTL.prHandleInfos;
		
		if ( handleInfos == null )
			return;

		// Detect changes and build asset only when changed.
		bool changed = false;

		for ( int ii = 0; ii < handleInfos.Length; ++ii )
		{
			HAPI_HandleInfo handleInfo = handleInfos[ ii ];
			if ( handleInfo.typeName == "xform" )
			{
				float tx = 0, ty = 0, tz = 0;
				float rx = 0, ry = 0, rz = 0;
				float sx = 1, sy = 1, sz = 1;
				HAPI_RSTOrder rstOrder = HAPI_RSTOrder.HAPI_SRT;
				HAPI_XYZOrder xyzOrder = HAPI_XYZOrder.HAPI_XYZ;
				
				HAPI_HandleBindingInfo[] bindingInfos = myAssetOTL.prHandleBindingInfos[ ii ];
				
				int[] parm_int_values = myAssetOTL.prParms.prParmIntValues;
				float[] parm_float_values = myAssetOTL.prParms.prParmFloatValues;
				
				if ( parm_int_values == null || parm_float_values == null )
				{
					Debug.LogError( "No parm int/float values yet handles exist?" );
					continue;
				}

				int translate_parm_id = -1;
				int rotate_parm_id = -1;
				int scale_parm_id = -1;
				int rst_order_parm_id = -1;
				int xyz_order_parm_id = -1;

				foreach ( HAPI_HandleBindingInfo bindingInfo in bindingInfos )
				{
					string parm_name = bindingInfo.handleParmName;
					if ( parm_name == "tx" )
						translate_parm_id = bindingInfo.assetParmId;
							
					else if ( parm_name == "rx" )
						rotate_parm_id = bindingInfo.assetParmId;
							
					else if ( parm_name == "sx" )
						scale_parm_id = bindingInfo.assetParmId;
						
					else if ( parm_name == "trs_order" )
						rst_order_parm_id = bindingInfo.assetParmId;
						
					else if ( parm_name == "xyz_order" )
						xyz_order_parm_id = bindingInfo.assetParmId;
				}
				
				if ( translate_parm_id >= 0 )
				{
					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( translate_parm_id );
					
					tx = parm_float_values[ parm_info.floatValuesIndex + 0 ];
					ty = parm_float_values[ parm_info.floatValuesIndex + 1 ];
					tz = parm_float_values[ parm_info.floatValuesIndex + 2 ];
				}
				
				if ( rotate_parm_id >= 0 )
				{
					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( rotate_parm_id );
					
					rx = parm_float_values[ parm_info.floatValuesIndex + 0 ];
					ry = parm_float_values[ parm_info.floatValuesIndex + 1 ];
					rz = parm_float_values[ parm_info.floatValuesIndex + 2 ];
				}
				
				if ( scale_parm_id >= 0 )
				{
					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( scale_parm_id );
					
					sx = parm_float_values[ parm_info.floatValuesIndex + 0 ];
					sy = parm_float_values[ parm_info.floatValuesIndex + 1 ];
					sz = parm_float_values[ parm_info.floatValuesIndex + 2 ];
				}
				
				if ( rst_order_parm_id >= 0 )
				{
					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( rst_order_parm_id );
					rstOrder = (HAPI_RSTOrder) parm_int_values[ parm_info.intValuesIndex ];
				}
				
				if ( xyz_order_parm_id >= 0 )
				{
					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( xyz_order_parm_id );
					xyzOrder = (HAPI_XYZOrder) parm_int_values[ parm_info.intValuesIndex ];
				}				
				
				HAPI_TransformEuler xform = new HAPI_TransformEuler( true );
				
				// This bit is a little tricky.  We will eventually call Handle.PositionHandle
				// or Handle.RotationHandle to display the translation and rotation handles.
				// These function take a translation parameter and a rotation parameter in 
				// order to display the handle in its proper location and orientation.  
				// These functions have an assumed order that it will put the rotation
				// and translation back together.  Depending whether the order of translation
				// and roation matches that of the rstOrder setting, we may, or may not
				// need to convert the translation parameter for use with the handle.
				if ( rstOrder == HAPI_RSTOrder.HAPI_TSR || rstOrder == HAPI_RSTOrder.HAPI_STR || rstOrder == HAPI_RSTOrder.HAPI_SRT )
				{
					xform.position[0] = tx;
					xform.position[1] = ty;
					xform.position[2] = tz;
					xform.rotationEuler[0] = rx;
					xform.rotationEuler[1] = ry;
					xform.rotationEuler[2] = rz;
					xform.scale[0] = 1;
					xform.scale[1] = 1;
					xform.scale[2] = 1;
					xform.rotationOrder = xyzOrder;
					xform.rstOrder = rstOrder;
				}
				else
				{
					xform.position[0] = 0;
					xform.position[1] = 0;
					xform.position[2] = 0;
					xform.rotationEuler[0] = rx;
					xform.rotationEuler[1] = ry;
					xform.rotationEuler[2] = rz;
					xform.scale[0] = 1;
					xform.scale[1] = 1;
					xform.scale[2] = 1;
					xform.rotationOrder = xyzOrder;
					xform.rstOrder = rstOrder;
				}
				
				xform = HoudiniHost.convertTransform( xform, HAPI_RSTOrder.HAPI_SRT, HAPI_XYZOrder.HAPI_ZXY );
				
				// Axis and Rotation conversions:
				// Note that Houdini's X axis points in the opposite direction that Unity's does.  Also, Houdini's 
				// rotation is right handed, whereas Unity is left handed.  To account for this, we need to invert
				// the x coordinate of the translation, and do the same for the rotations (except for the x rotation,
				// which doesn't need to be flipped because the change in handedness AND direction of the left x axis
				// causes a double negative - yeah, I know).
				
				xform.position[ 0 ] = -xform.position[ 0 ];
				xform.rotationEuler[ 1 ] = -xform.rotationEuler[ 1 ];
				xform.rotationEuler[ 2 ] = -xform.rotationEuler[ 2 ];
				tx = -tx;
				
				Handles.matrix = myAssetOTL.transform.localToWorldMatrix;
				
				Vector3 position;
				
				if( rstOrder == HAPI_RSTOrder.HAPI_TSR || rstOrder == HAPI_RSTOrder.HAPI_STR || rstOrder == HAPI_RSTOrder.HAPI_SRT )
					position = new Vector3( xform.position[ 0 ], xform.position[ 1 ], xform.position[ 2 ] );
				else
					position = new Vector3( tx, ty, tz );
				
				Quaternion rotation = Quaternion.Euler(
					xform.rotationEuler[ 0 ], xform.rotationEuler[ 1 ], xform.rotationEuler[ 2 ] );
				Vector3 scale = new Vector3( sx, sy, sz );
				
				if ( myManipMode == XformManipMode.Translate )
				{
					if ( translate_parm_id < 0 )
						continue;

					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( translate_parm_id );

					if ( parm_info.invisible )
						continue;

					GUIStyle style = new GUIStyle( EditorStyles.textField );
					style.contentOffset = new Vector2( 1.4f, 1.4f );
					string handle_name = handleInfo.name;
					if ( parm_info.disabled )
						handle_name = handle_name + " (disabled)";
					GUIContent content = new GUIContent( handle_name );
					content.tooltip = handle_name;
					Handles.Label( position, content, style );

					if ( parm_info.disabled )
					{
						Handles.lighting = false;
						Handles.PositionHandle( position, rotation );
						Handles.lighting = true;
						continue;
					}

					Vector3 new_position = Handles.PositionHandle( position, rotation );

					if ( new_position != position )
					{
						changed = true;

						if ( !myOpInProgress )
						{
							Undo.RecordObject( myAssetOTL.prParms.prParmsUndoInfo, handleInfo.name );
							myOpInProgress = true;
						}

						if ( rstOrder == HAPI_RSTOrder.HAPI_TSR 
							 || rstOrder == HAPI_RSTOrder.HAPI_STR 
							 || rstOrder == HAPI_RSTOrder.HAPI_SRT )
						{
							xform.position[ 0 ] = new_position[ 0 ];
							xform.position[ 1 ] = new_position[ 1 ];
							xform.position[ 2 ] = new_position[ 2 ];
							
							xform = HoudiniHost.convertTransform( xform, rstOrder, xyzOrder );
							new_position.x 		= xform.position[ 0 ];
							new_position.y 		= xform.position[ 1 ];
							new_position.z 		= xform.position[ 2 ];
						}

						// the - in the x coordinate is to convert back to "Houdini" coordinates
						parm_float_values[ parm_info.floatValuesIndex + 0 ] = -new_position.x; 
						parm_float_values[ parm_info.floatValuesIndex + 1 ] = new_position.y;
						parm_float_values[ parm_info.floatValuesIndex + 2 ] = new_position.z;
						
						float[] temp_float_values = new float[ HoudiniConstants.HAPI_POSITION_VECTOR_SIZE ];
						for ( int pp = 0; pp < HoudiniConstants.HAPI_POSITION_VECTOR_SIZE; ++pp )
							temp_float_values[ pp ] = parm_float_values[ parm_info.floatValuesIndex + pp ];
						HoudiniHost.setParmFloatValues( node_id, temp_float_values, parm_info.floatValuesIndex, 
													  parm_info.size );

						myAsset.savePreset();
					} // if changed
				}
				else if ( myManipMode == XformManipMode.Rotate )
				{
					if ( rotate_parm_id < 0 )
						continue;

					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( rotate_parm_id );

					if ( parm_info.invisible )
						continue;

					GUIStyle style = new GUIStyle( EditorStyles.textField );
					style.contentOffset = new Vector2( 1.4f, 1.4f );
					string handle_name = handleInfo.name;
					if ( parm_info.disabled )
						handle_name = handle_name + " (disabled)";
					GUIContent content = new GUIContent( handle_name );
					content.tooltip = handle_name;
					Handles.Label( position, content, style );

					if ( parm_info.disabled )
					{
						Handles.lighting = false;
						Handles.RotationHandle( rotation, position );
						Handles.lighting = true;
						continue;
					}
					
					Quaternion new_rotation = Handles.RotationHandle( rotation, position );
						
					if ( new_rotation != rotation )
					{
						changed = true;

						if ( !myOpInProgress )
						{
							Undo.RecordObject( myAssetOTL.prParms.prParmsUndoInfo, handleInfo.name );
							myOpInProgress = true;
						}

						Vector3 newRot = new_rotation.eulerAngles;
						
						xform.position[0] = 0;
						xform.position[1] = 0;
						xform.position[2] = 0;
						xform.rotationEuler[0] = newRot.x;
						xform.rotationEuler[1] = newRot.y;
						xform.rotationEuler[2] = newRot.z;
						xform.scale[0] = 1;
						xform.scale[1] = 1;
						xform.scale[2] = 1;
						xform.rotationOrder = HAPI_XYZOrder.HAPI_ZXY;
						xform.rstOrder = HAPI_RSTOrder.HAPI_SRT;
						
						xform = HoudiniHost.convertTransform( xform, rstOrder, xyzOrder );
						
						parm_float_values[ parm_info.floatValuesIndex + 0 ] = xform.rotationEuler[ 0 ];
						// the - in the y & z coordinate is to convert back to "Houdini" coordinates
						parm_float_values[ parm_info.floatValuesIndex + 1 ] = -xform.rotationEuler[ 1 ];
						parm_float_values[ parm_info.floatValuesIndex + 2 ] = -xform.rotationEuler[ 2 ];
						
						float[] temp_float_values = new float[ HoudiniConstants.HAPI_POSITION_VECTOR_SIZE ];
						for ( int pp = 0; pp < HoudiniConstants.HAPI_POSITION_VECTOR_SIZE; ++pp )
							temp_float_values[ pp ] = parm_float_values[ parm_info.floatValuesIndex + pp ];
						HoudiniHost.setParmFloatValues(
							node_id, temp_float_values, parm_info.floatValuesIndex, parm_info.size );

						myAsset.savePreset();
					} // if changed
				}
				else if ( myManipMode == XformManipMode.Scale )
				{
					if ( scale_parm_id < 0 )
						continue;

					HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm( scale_parm_id );

					if ( parm_info.invisible )
						continue;

					GUIStyle style = new GUIStyle( EditorStyles.textField );
					style.contentOffset = new Vector2( 1.4f, 1.4f );
					string handle_name = handleInfo.name;
					if ( parm_info.disabled )
						handle_name = handle_name + " (disabled)";
					GUIContent content = new GUIContent( handle_name );
					content.tooltip = handle_name;
					Handles.Label( position, content, style );

					if ( parm_info.disabled )
					{
						Handles.lighting = false;
						Handles.ScaleHandle( scale, position, rotation, 1.0f );
						Handles.lighting = true;
						continue;
					}
					
					Vector3 new_scale = Handles.ScaleHandle( scale, position, rotation, 1.0f );
					
					if ( new_scale != scale )
					{
						changed = true;

						if ( !myOpInProgress )
						{
							Undo.RecordObject( myAssetOTL.prParms.prParmsUndoInfo, handleInfo.name );
							myOpInProgress = true;
						}

						parm_float_values[ parm_info.floatValuesIndex + 0 ] = new_scale.x;
						parm_float_values[ parm_info.floatValuesIndex + 1 ] = new_scale.y;
						parm_float_values[ parm_info.floatValuesIndex + 2 ] = new_scale.z;
						
						float[] temp_float_values = new float[ HoudiniConstants.HAPI_POSITION_VECTOR_SIZE ];
						for ( int pp = 0; pp < HoudiniConstants.HAPI_POSITION_VECTOR_SIZE; ++pp )
							temp_float_values[ pp ] = parm_float_values[ parm_info.floatValuesIndex + pp ];
						HoudiniHost.setParmFloatValues(
							node_id, temp_float_values, parm_info.floatValuesIndex,
							parm_info.size );

						myAsset.savePreset();
					} // if changed
				} // if myManipMode
			} // if typeName
		} // for each handle
		
		if ( changed )
			myAssetOTL.buildClientSide();
	}
	public static void getAssetTransform(
		HAPI_AssetId asset_id, HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order,
		out HAPI_TransformEuler transform )
	{
#if ( UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || ( UNITY_METRO && UNITY_EDITOR ) )
		HAPI_Result status_code = HAPI_GetAssetTransform( ref mySession, asset_id, rst_order, rot_order, out transform );
		processStatusCode( status_code );
#else
		throw new HoudiniErrorUnsupportedPlatform();
#endif
	}
Beispiel #5
0
	HAPI_SetObjectTransform(
		ref HAPI_Session session,
		HAPI_AssetId asset_id, HAPI_ObjectId object_id,
		ref HAPI_TransformEuler transform );
	public static HAPI_TransformEuler convertMatrixToEuler(
		Matrix4x4 matrix, HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order )
	{
#if ( UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || ( UNITY_METRO && UNITY_EDITOR ) )
		HAPI_TransformEuler transform = new HAPI_TransformEuler();
		float[] raw_matrix = new float[ 16 ];

		for ( int i = 0; i < 16; ++i )
			raw_matrix[ i ] = matrix[ i ];

		HAPI_Result status_code = HAPI_ConvertMatrixToEuler(
			ref mySession, raw_matrix, rst_order, rot_order, ref transform );
		processStatusCode( status_code );

		return transform;
#else
		throw new HoudiniErrorUnsupportedPlatform();
#endif
	}
 HAPI_SetAssetTransform(
     ref HAPI_Session session,
     HAPI_AssetId asset_id,
     ref HAPI_TransformEuler transform);
Beispiel #8
0
	HAPI_GetAssetTransform(
		ref HAPI_Session session,
		HAPI_AssetId asset_id,
		HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order,
		out HAPI_TransformEuler transform );
 HAPI_ConvertTransform(
     ref HAPI_Session session,
     ref HAPI_TransformEuler transform_in,
     HAPI_RSTOrder rst_order,
     HAPI_XYZOrder rot_order,
     out HAPI_TransformEuler transform_out);
 HAPI_ConvertMatrixToEuler(
     ref HAPI_Session session,
     float[] matrix,
     HAPI_RSTOrder rst_order,
     HAPI_XYZOrder rot_order,
     ref HAPI_TransformEuler transform_out);
    private static extern HAPI_Result HAPI_SetObjectTransform(
		ref HAPI_Session session,
		HAPI_AssetId asset_id, HAPI_ObjectId object_id,
		ref HAPI_TransformEuler transform );
    private static extern HAPI_Result HAPI_GetAssetTransform(
		ref HAPI_Session session,
		HAPI_AssetId asset_id,
		HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order,
		out HAPI_TransformEuler transform );
    private static extern HAPI_Result HAPI_ConvertTransformEulerToMatrix(
		ref HAPI_Session session,
		ref HAPI_TransformEuler transform,
		[Out] float[] matrix );
Beispiel #14
0
	HAPI_ConvertMatrixToEuler(
		ref HAPI_Session session,
		float[] matrix,
		HAPI_RSTOrder rst_order,
		HAPI_XYZOrder rot_order,
		ref HAPI_TransformEuler transform_out );
Beispiel #15
0
 HAPI_ConvertMatrixToEuler(
     float[] mat,
     HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order,
     ref HAPI_TransformEuler transform_out);
Beispiel #16
0
	HAPI_ConvertTransformEulerToMatrix(
		ref HAPI_Session session,
		ref HAPI_TransformEuler transform,
		[Out] float[] matrix );
Beispiel #17
0
 HAPI_ConvertTransformEulerToMatrix(
     ref HAPI_TransformEuler transform,
     [Out] float[] matrix);
Beispiel #18
0
	HAPI_SetAssetTransform(
		ref HAPI_Session session,
		HAPI_AssetId asset_id,
		ref HAPI_TransformEuler transform );
Beispiel #19
0
 HAPI_GetAssetTransform(
     HAPI_AssetId asset_id,
     HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order,
     out HAPI_TransformEuler transform);
Beispiel #20
0
	// UTILITY --------------------------------------------------------------------------------------------------

	public static HAPI_TransformEuler convertTransform(
		HAPI_TransformEuler transform,
		HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order )
	{
#if ( UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || ( UNITY_METRO && UNITY_EDITOR ) )
		HAPI_TransformEuler transform_out = new HAPI_TransformEuler();
		HAPI_Result status_code = HAPI_ConvertTransform(
			ref mySession, ref transform, rst_order, rot_order, out transform_out );
		processStatusCode( status_code );
		return transform_out;
#else
		throw new HoudiniErrorUnsupportedPlatform();
#endif
	}
Beispiel #21
0
 HAPI_SetAssetTransform(
     HAPI_AssetId asset_id,
     ref HAPI_TransformEuler transform);
Beispiel #22
0
	public static Matrix4x4 convertTransformEulerToMatrix( HAPI_TransformEuler transform )
	{
#if ( UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || ( UNITY_METRO && UNITY_EDITOR ) )
		float[] raw_matrix = new float[ 16 ];
		HAPI_Result status_code = HAPI_ConvertTransformEulerToMatrix( ref mySession, ref transform, raw_matrix );
		processStatusCode( status_code );

		Matrix4x4 output = new Matrix4x4();
			
		for ( int i = 0; i < 16; ++i )
			output[ i ] = raw_matrix[ i ];

		return output;
#else
		throw new HoudiniErrorUnsupportedPlatform();
#endif
	}
Beispiel #23
0
 HAPI_SetObjectTransform(
     HAPI_AssetId asset_id, HAPI_ObjectId object_id,
     ref HAPI_TransformEuler transform);
Beispiel #24
0
	public static void setObjectTransform(
		HAPI_AssetId asset_id, HAPI_ObjectId object_id,
		ref HAPI_TransformEuler transform )
	{
#if ( UNITY_STANDALONE_WIN || UNITY_STANDALONE_OSX || ( UNITY_METRO && UNITY_EDITOR ) )
		HAPI_Result status_code = HAPI_SetObjectTransform( ref mySession, asset_id, object_id, ref transform );
		processStatusCode( status_code );
#else
		throw new HoudiniErrorUnsupportedPlatform();
#endif
	}
Beispiel #25
0
 HAPI_ConvertTransform(
     ref HAPI_TransformEuler transform_in_out,
     HAPI_RSTOrder rst_order, HAPI_XYZOrder rot_order);
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // Public
    public void handlesOnSceneGUI()
    {
        if (myAssetOTL.prShowPinnedInstances)
        {
            drawPinnedInstances();
        }

        // On mouse up the drag operation is completed.
        if (Event.current.type == EventType.MouseUp)
        {
            myOpInProgress = false;
        }

        string currentGlobalManipTool = Tools.current.ToString();

        if (currentGlobalManipTool == "Rotate")
        {
            myManipMode = XformManipMode.Rotate;
        }

        else if (currentGlobalManipTool == "Move")
        {
            myManipMode = XformManipMode.Translate;
        }

        else if (currentGlobalManipTool == "Scale")
        {
            myManipMode = XformManipMode.Scale;
        }

        if (myAssetOTL == null)
        {
            return;
        }

        int node_id = myAssetOTL.prNodeId;

        HAPI_HandleInfo[] handleInfos = myAssetOTL.prHandleInfos;

        if (handleInfos == null)
        {
            return;
        }

        // Detect changes and build asset only when changed.
        bool changed = false;

        for (int ii = 0; ii < handleInfos.Length; ++ii)
        {
            HAPI_HandleInfo handleInfo = handleInfos[ii];
            if (handleInfo.typeName == "xform")
            {
                float         tx = 0, ty = 0, tz = 0;
                float         rx = 0, ry = 0, rz = 0;
                float         sx = 1, sy = 1, sz = 1;
                HAPI_RSTOrder rstOrder = HAPI_RSTOrder.HAPI_SRT;
                HAPI_XYZOrder xyzOrder = HAPI_XYZOrder.HAPI_XYZ;

                HAPI_HandleBindingInfo[] bindingInfos = myAssetOTL.prHandleBindingInfos[ii];

                int[]   parm_int_values   = myAssetOTL.prParms.prParmIntValues;
                float[] parm_float_values = myAssetOTL.prParms.prParmFloatValues;

                if (parm_int_values == null || parm_float_values == null)
                {
                    Debug.LogError("No parm int/float values yet handles exist?");
                    continue;
                }

                int translate_parm_id = -1;
                int rotate_parm_id    = -1;
                int scale_parm_id     = -1;
                int rst_order_parm_id = -1;
                int xyz_order_parm_id = -1;

                foreach (HAPI_HandleBindingInfo bindingInfo in bindingInfos)
                {
                    string parm_name = bindingInfo.handleParmName;
                    if (parm_name == "tx")
                    {
                        translate_parm_id = bindingInfo.assetParmId;
                    }

                    else if (parm_name == "rx")
                    {
                        rotate_parm_id = bindingInfo.assetParmId;
                    }

                    else if (parm_name == "sx")
                    {
                        scale_parm_id = bindingInfo.assetParmId;
                    }

                    else if (parm_name == "trs_order")
                    {
                        rst_order_parm_id = bindingInfo.assetParmId;
                    }

                    else if (parm_name == "xyz_order")
                    {
                        xyz_order_parm_id = bindingInfo.assetParmId;
                    }
                }

                if (translate_parm_id >= 0)
                {
                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(translate_parm_id);

                    tx = parm_float_values[parm_info.floatValuesIndex + 0];
                    ty = parm_float_values[parm_info.floatValuesIndex + 1];
                    tz = parm_float_values[parm_info.floatValuesIndex + 2];
                }

                if (rotate_parm_id >= 0)
                {
                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(rotate_parm_id);

                    rx = parm_float_values[parm_info.floatValuesIndex + 0];
                    ry = parm_float_values[parm_info.floatValuesIndex + 1];
                    rz = parm_float_values[parm_info.floatValuesIndex + 2];
                }

                if (scale_parm_id >= 0)
                {
                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(scale_parm_id);

                    sx = parm_float_values[parm_info.floatValuesIndex + 0];
                    sy = parm_float_values[parm_info.floatValuesIndex + 1];
                    sz = parm_float_values[parm_info.floatValuesIndex + 2];
                }

                if (rst_order_parm_id >= 0)
                {
                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(rst_order_parm_id);
                    rstOrder = (HAPI_RSTOrder)parm_int_values[parm_info.intValuesIndex];
                }

                if (xyz_order_parm_id >= 0)
                {
                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(xyz_order_parm_id);
                    xyzOrder = (HAPI_XYZOrder)parm_int_values[parm_info.intValuesIndex];
                }

                HAPI_TransformEuler xform = new HAPI_TransformEuler(true);

                // This bit is a little tricky.  We will eventually call Handle.PositionHandle
                // or Handle.RotationHandle to display the translation and rotation handles.
                // These function take a translation parameter and a rotation parameter in
                // order to display the handle in its proper location and orientation.
                // These functions have an assumed order that it will put the rotation
                // and translation back together.  Depending whether the order of translation
                // and roation matches that of the rstOrder setting, we may, or may not
                // need to convert the translation parameter for use with the handle.
                if (rstOrder == HAPI_RSTOrder.HAPI_TSR || rstOrder == HAPI_RSTOrder.HAPI_STR || rstOrder == HAPI_RSTOrder.HAPI_SRT)
                {
                    xform.position[0]      = tx;
                    xform.position[1]      = ty;
                    xform.position[2]      = tz;
                    xform.rotationEuler[0] = rx;
                    xform.rotationEuler[1] = ry;
                    xform.rotationEuler[2] = rz;
                    xform.scale[0]         = 1;
                    xform.scale[1]         = 1;
                    xform.scale[2]         = 1;
                    xform.rotationOrder    = xyzOrder;
                    xform.rstOrder         = rstOrder;
                }
                else
                {
                    xform.position[0]      = 0;
                    xform.position[1]      = 0;
                    xform.position[2]      = 0;
                    xform.rotationEuler[0] = rx;
                    xform.rotationEuler[1] = ry;
                    xform.rotationEuler[2] = rz;
                    xform.scale[0]         = 1;
                    xform.scale[1]         = 1;
                    xform.scale[2]         = 1;
                    xform.rotationOrder    = xyzOrder;
                    xform.rstOrder         = rstOrder;
                }

                xform = HoudiniHost.convertTransform(xform, HAPI_RSTOrder.HAPI_SRT, HAPI_XYZOrder.HAPI_ZXY);

                // Axis and Rotation conversions:
                // Note that Houdini's X axis points in the opposite direction that Unity's does.  Also, Houdini's
                // rotation is right handed, whereas Unity is left handed.  To account for this, we need to invert
                // the x coordinate of the translation, and do the same for the rotations (except for the x rotation,
                // which doesn't need to be flipped because the change in handedness AND direction of the left x axis
                // causes a double negative - yeah, I know).

                xform.position[0]      = -xform.position[0];
                xform.rotationEuler[1] = -xform.rotationEuler[1];
                xform.rotationEuler[2] = -xform.rotationEuler[2];
                tx = -tx;

                Handles.matrix = myAssetOTL.transform.localToWorldMatrix;

                Vector3 position;

                if (rstOrder == HAPI_RSTOrder.HAPI_TSR || rstOrder == HAPI_RSTOrder.HAPI_STR || rstOrder == HAPI_RSTOrder.HAPI_SRT)
                {
                    position = new Vector3(xform.position[0], xform.position[1], xform.position[2]);
                }
                else
                {
                    position = new Vector3(tx, ty, tz);
                }

                Quaternion rotation = Quaternion.Euler(
                    xform.rotationEuler[0], xform.rotationEuler[1], xform.rotationEuler[2]);
                Vector3 scale = new Vector3(sx, sy, sz);

                if (myManipMode == XformManipMode.Translate)
                {
                    if (translate_parm_id < 0)
                    {
                        continue;
                    }

                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(translate_parm_id);

                    if (parm_info.invisible)
                    {
                        continue;
                    }

                    GUIStyle style = new GUIStyle(EditorStyles.textField);
                    style.contentOffset = new Vector2(1.4f, 1.4f);
                    string handle_name = handleInfo.name;
                    if (parm_info.disabled)
                    {
                        handle_name = handle_name + " (disabled)";
                    }
                    GUIContent content = new GUIContent(handle_name);
                    content.tooltip = handle_name;
                    Handles.Label(position, content, style);

                    if (parm_info.disabled)
                    {
                        Handles.lighting = false;
                        Handles.PositionHandle(position, rotation);
                        Handles.lighting = true;
                        continue;
                    }

                    Vector3 new_position = Handles.PositionHandle(position, rotation);

                    if (new_position != position)
                    {
                        changed = true;

                        if (!myOpInProgress)
                        {
                            Undo.RecordObject(myAssetOTL.prParms.prParmsUndoInfo, handleInfo.name);
                            myOpInProgress = true;
                        }

                        if (rstOrder == HAPI_RSTOrder.HAPI_TSR ||
                            rstOrder == HAPI_RSTOrder.HAPI_STR ||
                            rstOrder == HAPI_RSTOrder.HAPI_SRT)
                        {
                            xform.position[0] = new_position[0];
                            xform.position[1] = new_position[1];
                            xform.position[2] = new_position[2];

                            xform          = HoudiniHost.convertTransform(xform, rstOrder, xyzOrder);
                            new_position.x = xform.position[0];
                            new_position.y = xform.position[1];
                            new_position.z = xform.position[2];
                        }

                        // the - in the x coordinate is to convert back to "Houdini" coordinates
                        parm_float_values[parm_info.floatValuesIndex + 0] = -new_position.x;
                        parm_float_values[parm_info.floatValuesIndex + 1] = new_position.y;
                        parm_float_values[parm_info.floatValuesIndex + 2] = new_position.z;

                        float[] temp_float_values = new float[HoudiniConstants.HAPI_POSITION_VECTOR_SIZE];
                        for (int pp = 0; pp < HoudiniConstants.HAPI_POSITION_VECTOR_SIZE; ++pp)
                        {
                            temp_float_values[pp] = parm_float_values[parm_info.floatValuesIndex + pp];
                        }
                        HoudiniHost.setParmFloatValues(node_id, temp_float_values, parm_info.floatValuesIndex,
                                                       parm_info.size);

                        myAsset.savePreset();
                    }                     // if changed
                }
                else if (myManipMode == XformManipMode.Rotate)
                {
                    if (rotate_parm_id < 0)
                    {
                        continue;
                    }

                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(rotate_parm_id);

                    if (parm_info.invisible)
                    {
                        continue;
                    }

                    GUIStyle style = new GUIStyle(EditorStyles.textField);
                    style.contentOffset = new Vector2(1.4f, 1.4f);
                    string handle_name = handleInfo.name;
                    if (parm_info.disabled)
                    {
                        handle_name = handle_name + " (disabled)";
                    }
                    GUIContent content = new GUIContent(handle_name);
                    content.tooltip = handle_name;
                    Handles.Label(position, content, style);

                    if (parm_info.disabled)
                    {
                        Handles.lighting = false;
                        Handles.RotationHandle(rotation, position);
                        Handles.lighting = true;
                        continue;
                    }

                    Quaternion new_rotation = Handles.RotationHandle(rotation, position);

                    if (new_rotation != rotation)
                    {
                        changed = true;

                        if (!myOpInProgress)
                        {
                            Undo.RecordObject(myAssetOTL.prParms.prParmsUndoInfo, handleInfo.name);
                            myOpInProgress = true;
                        }

                        Vector3 newRot = new_rotation.eulerAngles;

                        xform.position[0]      = 0;
                        xform.position[1]      = 0;
                        xform.position[2]      = 0;
                        xform.rotationEuler[0] = newRot.x;
                        xform.rotationEuler[1] = newRot.y;
                        xform.rotationEuler[2] = newRot.z;
                        xform.scale[0]         = 1;
                        xform.scale[1]         = 1;
                        xform.scale[2]         = 1;
                        xform.rotationOrder    = HAPI_XYZOrder.HAPI_ZXY;
                        xform.rstOrder         = HAPI_RSTOrder.HAPI_SRT;

                        xform = HoudiniHost.convertTransform(xform, rstOrder, xyzOrder);

                        parm_float_values[parm_info.floatValuesIndex + 0] = xform.rotationEuler[0];
                        // the - in the y & z coordinate is to convert back to "Houdini" coordinates
                        parm_float_values[parm_info.floatValuesIndex + 1] = -xform.rotationEuler[1];
                        parm_float_values[parm_info.floatValuesIndex + 2] = -xform.rotationEuler[2];

                        float[] temp_float_values = new float[HoudiniConstants.HAPI_POSITION_VECTOR_SIZE];
                        for (int pp = 0; pp < HoudiniConstants.HAPI_POSITION_VECTOR_SIZE; ++pp)
                        {
                            temp_float_values[pp] = parm_float_values[parm_info.floatValuesIndex + pp];
                        }
                        HoudiniHost.setParmFloatValues(
                            node_id, temp_float_values, parm_info.floatValuesIndex, parm_info.size);

                        myAsset.savePreset();
                    }                     // if changed
                }
                else if (myManipMode == XformManipMode.Scale)
                {
                    if (scale_parm_id < 0)
                    {
                        continue;
                    }

                    HAPI_ParmInfo parm_info = myAssetOTL.prParms.findParm(scale_parm_id);

                    if (parm_info.invisible)
                    {
                        continue;
                    }

                    GUIStyle style = new GUIStyle(EditorStyles.textField);
                    style.contentOffset = new Vector2(1.4f, 1.4f);
                    string handle_name = handleInfo.name;
                    if (parm_info.disabled)
                    {
                        handle_name = handle_name + " (disabled)";
                    }
                    GUIContent content = new GUIContent(handle_name);
                    content.tooltip = handle_name;
                    Handles.Label(position, content, style);

                    if (parm_info.disabled)
                    {
                        Handles.lighting = false;
                        Handles.ScaleHandle(scale, position, rotation, 1.0f);
                        Handles.lighting = true;
                        continue;
                    }

                    Vector3 new_scale = Handles.ScaleHandle(scale, position, rotation, 1.0f);

                    if (new_scale != scale)
                    {
                        changed = true;

                        if (!myOpInProgress)
                        {
                            Undo.RecordObject(myAssetOTL.prParms.prParmsUndoInfo, handleInfo.name);
                            myOpInProgress = true;
                        }

                        parm_float_values[parm_info.floatValuesIndex + 0] = new_scale.x;
                        parm_float_values[parm_info.floatValuesIndex + 1] = new_scale.y;
                        parm_float_values[parm_info.floatValuesIndex + 2] = new_scale.z;

                        float[] temp_float_values = new float[HoudiniConstants.HAPI_POSITION_VECTOR_SIZE];
                        for (int pp = 0; pp < HoudiniConstants.HAPI_POSITION_VECTOR_SIZE; ++pp)
                        {
                            temp_float_values[pp] = parm_float_values[parm_info.floatValuesIndex + pp];
                        }
                        HoudiniHost.setParmFloatValues(
                            node_id, temp_float_values, parm_info.floatValuesIndex,
                            parm_info.size);

                        myAsset.savePreset();
                    } // if changed
                }     // if myManipMode
            }         // if typeName
        }             // for each handle

        if (changed)
        {
            myAssetOTL.buildClientSide();
        }
    }
Beispiel #27
0
	HAPI_ConvertTransform(
		ref HAPI_Session session,
		ref HAPI_TransformEuler transform_in,
		HAPI_RSTOrder rst_order,
		HAPI_XYZOrder rot_order,
		out HAPI_TransformEuler transform_out );
Beispiel #28
0
    public bool setNodeParameterIntoHost(int id)
    {
        HAPI_ParmInfo parm = findParm(id);

        var parm_input = myParmInputs[id];

        if (!parm_input.inputObject)
        {
            return(false);
        }

        // Create new input node.
        GameObject     input_object    = parm_input.inputObject;
        HoudiniControl houdini_control = input_object.GetComponent <HoudiniControl>();
        MeshFilter     mesh_filter     = input_object.GetComponent <MeshFilter>();

        if (houdini_control &&
            houdini_control.prAsset.gameObject.GetComponentInChildren <HoudiniGeoControl>())
        {
            if (!houdini_control.prAsset.isAssetValid())
            {
                houdini_control.prAsset.buildAll();
            }

            HoudiniGeoControl geo_control =
                houdini_control.prAsset.gameObject.GetComponentInChildren <HoudiniGeoControl>();
            parm_input.inputNodeId = geo_control.prNodeId;

            // Add ourselves to our input asset's downstream nodes so when it cooks we cook.
            houdini_control.prAsset.addDownstreamAsset(myControl.prAsset);
        }
        else if (houdini_control &&
                 input_object.GetComponent <HoudiniAssetCurve>())
        {
            if (!houdini_control.prAsset.isAssetValid())
            {
                houdini_control.prAsset.buildAll();
            }

            parm_input.inputNodeId = houdini_control.prNodeId;

            // Add ourselves to our input asset's downstream nodes so when it cooks we cook.
            houdini_control.prAsset.addDownstreamAsset(myControl.prAsset);
        }
        else if (mesh_filter && mesh_filter.sharedMesh)
        {
            // We need to remove spaces in the input name
            string inputName = input_object.name.Replace(' ', '_');

            parm_input.inputNodeId = HoudiniHost.createInputNode(inputName);
            Mesh mesh = mesh_filter.sharedMesh;
            HoudiniAssetUtility.setMesh(
                parm_input.inputNodeId, 0, parm_input.inputNodeId, ref mesh, null, null);

            // Set the asset transform from the source GameObject transform.
            HAPI_TransformEuler trans =
                HoudiniAssetUtility.getHapiTransform(input_object.transform.localToWorldMatrix);
            HAPI_NodeInfo input_node_info = HoudiniHost.getNodeInfo(parm_input.inputNodeId);
            HoudiniHost.setObjectTransform(input_node_info.parentId, ref trans);
        }
        else
        {
            return(false);
        }

        HAPI_NodeInfo node_info = HoudiniHost.getNodeInfo(parm_input.inputNodeId);

        parm_input.inputNodeUniqueId = node_info.uniqueHoudiniNodeId;

        // Assign node parm input.
        HoudiniHost.setParmNodeValue(prControl.prNodeId, parm.name, parm_input.inputNodeId);

        myParmInputs[id] = parm_input;

        return(true);
    }
    private static extern HAPI_Result HAPI_ConvertMatrixToEuler(
		ref HAPI_Session session,
		float[] matrix,
		HAPI_RSTOrder rst_order,
		HAPI_XYZOrder rot_order,
		ref HAPI_TransformEuler transform_out );