/// <summary> /// Set the input node's transform. /// </summary> /// <param name="session">Session that the input node exists in</param> /// <param name="inputObject">The input object info containing data about the input</param> /// <param name="inputNodeID">The input node ID</param> /// <param name="bKeepWorldTransform">Whether to use world transform or not</param> /// <returns></returns> internal static bool UploadInputObjectTransform(HEU_SessionBase session, HEU_InputObjectInfo inputObject, HAPI_NodeId inputNodeID, bool bKeepWorldTransform) { Matrix4x4 inputTransform = Matrix4x4.identity; if (inputObject._useTransformOffset) { if (bKeepWorldTransform) { // Add offset tranform to world transform Transform inputObjTransform = inputObject._gameObject.transform; Vector3 position = inputObjTransform.position + inputObject._translateOffset; Quaternion rotation = inputObjTransform.rotation * Quaternion.Euler(inputObject._rotateOffset); Vector3 scale = Vector3.Scale(inputObjTransform.localScale, inputObject._scaleOffset); Vector3 rotVector = rotation.eulerAngles; inputTransform = HEU_HAPIUtility.GetMatrix4x4(ref position, ref rotVector, ref scale); } else { // Offset from origin. inputTransform = HEU_HAPIUtility.GetMatrix4x4(ref inputObject._translateOffset, ref inputObject._rotateOffset, ref inputObject._scaleOffset); } } else { inputTransform = inputObject._gameObject.transform.localToWorldMatrix; } HAPI_TransformEuler transformEuler = HEU_HAPIUtility.GetHAPITransformFromMatrix(ref inputTransform); HAPI_NodeInfo inputNodeInfo = new HAPI_NodeInfo(); if (!session.GetNodeInfo(inputNodeID, ref inputNodeInfo)) { return false; } if (session.SetObjectTransform(inputNodeInfo.parentId, ref transformEuler)) { inputObject._syncdTransform = inputTransform; inputObject._syncdChildTransforms.Clear(); GetChildrenTransforms(inputObject._gameObject.transform, ref inputObject._syncdChildTransforms); } return true; }