2.18 Update

This commit is contained in:
Jedd Morgan
2024-02-22 18:31:09 +00:00
parent edeec70993
commit 1b2eeed3eb
24 changed files with 776 additions and 418 deletions
@@ -23,7 +23,7 @@ public class AttachSpecklePropertiesExample : MonoBehaviour
public virtual void Start()
{
Client speckleClient = new(AccountManager.GetDefaultAccount());
Client speckleClient = new(AccountManager.GetDefaultAccount()!);
StartCoroutine(AttachSpeckleProperties(speckleClient, streamId, objectId));
}
+18 -22
View File
@@ -1,10 +1,10 @@
using System;
using System.Collections;
using System.Threading.Tasks;
using Speckle.ConnectorUnity;
using Speckle.ConnectorUnity.Components;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Models;
using Speckle.Core.Transports;
using UnityEngine;
@@ -12,24 +12,23 @@ using UnityEngine;
[RequireComponent(typeof(RecursiveConverter))]
public class ManualReceive : MonoBehaviour
{
public string authToken;
public string serverUrl;
public string streamId, objectId;
public string streamId,
objectId;
private RecursiveConverter receiver;
void Awake()
{
receiver = GetComponent<RecursiveConverter>();
}
IEnumerator Start()
{
Debug.developerConsoleVisible = true;
if(Time.timeSinceLevelLoad > 20) yield return null;
if (Time.timeSinceLevelLoad > 20)
yield return null;
Receive();
}
@@ -39,33 +38,30 @@ public class ManualReceive : MonoBehaviour
var account = new Account()
{
token = authToken,
serverInfo = new ServerInfo() {url = serverUrl},
serverInfo = new ServerInfo() { url = serverUrl },
};
Task.Run(async () =>
{
var transport = new ServerTransport(account, streamId);
var localTransport = new MemoryTransport();
using ServerTransport transport = new(account, streamId);
MemoryTransport localTransport = new();
var @base = await Operations.Receive(
Base speckleObject = await Operations.Receive(
objectId,
remoteTransport: transport,
localTransport: localTransport,
onErrorAction: (m, e) => Debug.LogError(m + e),
disposeTransports: true
localTransport: localTransport
);
if (@base == null) throw new Exception("received data was null!");
Dispatcher
.Instance()
.Enqueue(() =>
{
var parentObject = new GameObject(name);
Dispatcher.Instance().Enqueue(() =>
{
var parentObject = new GameObject(name);
receiver.RecursivelyConvertToNative_Sync(speckleObject, parentObject.transform);
receiver.RecursivelyConvertToNative_Sync(@base, parentObject.transform);
Debug.Log($"Receive {objectId} completed");
});
Debug.Log($"Receive {objectId} completed");
});
});
}
}
+16 -11
View File
@@ -2,6 +2,7 @@ using System.Threading;
using System.Threading.Tasks;
using Speckle.ConnectorUnity.Components;
using Speckle.Core.Api;
using Speckle.Core.Credentials;
using Speckle.Core.Models;
using Speckle.Core.Transports;
using UnityEngine;
@@ -24,6 +25,7 @@ namespace Extra
public GameObject objectToSend;
private SpeckleSender sender;
private void Awake()
{
sender = GetComponent<SpeckleSender>();
@@ -44,20 +46,23 @@ namespace Extra
private async Task<string> Send(Base data, string branchName)
{
var client = sender.Account.Client;
var stream = sender.Stream.Selected;
ServerTransport transport = new ServerTransport(sender.Account.Selected, stream!.id);
Client client = sender.Account.Client!;
Stream stream = sender.Stream.Selected;
Account selectedAccount = sender.Account.Selected!;
await client.BranchCreate(new BranchCreateInput(){streamId = stream.id, name = branchName});
using ServerTransport transport = new(selectedAccount, stream!.id);
return await SpeckleSender.SendDataAsync(CancellationToken.None,
string branchId = await client.BranchCreate(
new BranchCreateInput() { streamId = stream.id, name = branchName }
);
return await SpeckleSender.SendDataAsync(
remoteTransport: transport,
data: data,
client: client!,
branchName: branchName,
createCommit: true,
onProgressAction: null,
onErrorAction: (m, e) => throw e);
data,
client,
branchId,
true
);
}
}
-1
View File
@@ -3,7 +3,6 @@ using System.Collections.Generic;
using UnityEngine;
using Speckle.Core.Credentials;
using System.Linq;
using UnityEngine.Events;
using UnityEngine.UI;
using Stream = Speckle.Core.Api.Stream;
+2 -2
View File
@@ -1,14 +1,14 @@
{
"dependencies": {
"com.unity.2d.sprite": "1.0.0",
"com.unity.collab-proxy": "2.0.5",
"com.unity.collab-proxy": "2.0.7",
"com.unity.ide.rider": "3.0.24",
"com.unity.ide.visualstudio": "2.0.18",
"com.unity.ide.vscode": "1.2.5",
"com.unity.test-framework": "1.1.33",
"com.unity.textmeshpro": "3.0.6",
"com.unity.timeline": "1.6.5",
"com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.2",
"com.unity.toolchain.win-x86_64-linux-x86_64": "2.0.4",
"com.unity.ugui": "1.0.0",
"com.unity.modules.ai": "1.0.0",
"com.unity.modules.androidjni": "1.0.0",
+4 -4
View File
@@ -7,7 +7,7 @@
"dependencies": {}
},
"com.unity.collab-proxy": {
"version": "2.0.5",
"version": "2.0.7",
"depth": 0,
"source": "registry",
"dependencies": {},
@@ -94,12 +94,12 @@
"url": "https://packages.unity.com"
},
"com.unity.toolchain.win-x86_64-linux-x86_64": {
"version": "2.0.2",
"version": "2.0.4",
"depth": 0,
"source": "registry",
"dependencies": {
"com.unity.sysroot": "2.0.3",
"com.unity.sysroot.linux-x86_64": "2.0.2"
"com.unity.sysroot": "2.0.5",
"com.unity.sysroot.linux-x86_64": "2.0.4"
},
"url": "https://packages.unity.com"
},
@@ -163,7 +163,7 @@ namespace Speckle.ConnectorUnity.Components.Editor
bool BeforeConvert(TraversalContext context)
{
Base b = context.current;
Base b = context.Current;
//NOTE: progress wont reach 100% because not all objects are convertable
float progress = (childrenConverted + childrenFailed) / totalChildrenFloat;
@@ -77,7 +77,6 @@ namespace Speckle.ConnectorUnity.Components.Editor
),
};
//TODO onError action?
if (data["@objects"] is IList l && l.Count == 0)
{
Debug.LogWarning($"Nothing to send", speckleSender);
@@ -64,7 +64,7 @@ namespace Speckle.ConnectorUnity
cancellationTokenSource = new CancellationTokenSource();
var client = new Client(account ?? AccountManager.GetDefaultAccount());
var client = new Client(account ?? AccountManager.GetDefaultAccount()!);
transport = new ServerTransport(client.Account, streamId);
transport.CancellationToken = cancellationTokenSource.Token;
@@ -49,7 +49,8 @@ namespace Speckle.ConnectorUnity.Components
);
var accountTask = new Utils.Utils.WaitForTask<Account>(
async () => await GetAccount(sw)
async () => await GetAccount(sw),
_tokenSource.Token
);
yield return accountTask;
@@ -57,8 +58,10 @@ namespace Speckle.ConnectorUnity.Components
using Client c = new(accountTask.Result);
var objectIdTask = new Utils.Utils.WaitForTask<(string, Commit?)>(
async () => await GetObjectID(sw, c)
async () => await GetObjectID(sw, c),
_tokenSource.Token
);
yield return objectIdTask;
(string objectId, Commit? commit) = objectIdTask.Result;
@@ -72,7 +75,8 @@ namespace Speckle.ConnectorUnity.Components
objectId,
commit,
cancellationToken: _tokenSource.Token
)
),
_tokenSource.Token
);
yield return receiveTask;
@@ -92,7 +92,7 @@ namespace Speckle.ConnectorUnity.Components
public bool WasSuccessful() => this.exception == null;
public Base SpeckleObject => traversalContext.current;
public Base SpeckleObject => traversalContext.Current;
}
public partial class RecursiveConverter
@@ -143,7 +143,7 @@ namespace Speckle.ConnectorUnity.Components
var objectsToConvert = traversalFunc
.Traverse(rootObject)
.Where(x => ConverterInstance.CanConvertToNative(x.current))
.Where(x => ConverterInstance.CanConvertToNative(x.Current))
.Where(x => userPredicate(x));
Dictionary<Base, GameObject?> created = new();
@@ -186,9 +186,9 @@ namespace Speckle.ConnectorUnity.Components
{
Transform? currentParent = GetParent(tc, outCreatedObjects) ?? parent;
var converted = ConvertToNative(tc.current, currentParent);
var converted = ConvertToNative(tc.Current, currentParent);
result = new ConversionResult(tc, converted);
outCreatedObjects.TryAdd(tc.current, result.converted);
outCreatedObjects.TryAdd(tc.Current, result.converted);
}
catch (Exception ex)
{
@@ -209,11 +209,11 @@ namespace Speckle.ConnectorUnity.Components
if (tc == null)
return null; //We've reached the root object, and still not found a converted parent
if (createdObjects.TryGetValue(tc.current, out GameObject? p) && p != null)
if (createdObjects.TryGetValue(tc.Current, out GameObject? p) && p != null)
return p.transform;
//Go one level up, and repeat!
return GetParent(tc.parent, createdObjects);
return GetParent(tc.Parent, createdObjects);
}
protected GameObject ConvertToNative(Base speckleObject, Transform? parentTransform)
@@ -327,7 +327,18 @@ namespace Speckle.ConnectorUnity.Components
{
object? converted = null;
if (predicate(baseObject))
converted = ConverterInstance.ConvertToNative(baseObject);
{
try
{
converted = ConverterInstance.ConvertToNative(baseObject);
}
catch (Exception ex) when (!ex.IsFatal())
{
Debug.LogWarning(
$"Failed to convert {baseObject.speckle_type} - {baseObject.id}\n{ex}"
);
}
}
// Handle new GameObjects
Transform? nextParent = parent;
@@ -259,42 +259,20 @@ namespace Speckle.ConnectorUnity.Components
CancellationToken cancellationToken = default
)
{
using var transport = new ServerTransportV2(client.Account, streamId);
using var transport = new ServerTransport(client.Account, streamId);
transport.CancellationToken = cancellationToken;
cancellationToken.ThrowIfCancellationRequested();
Base? requestedObject = await Operations
Base requestedObject = await Operations
.Receive(
objectId: objectId,
cancellationToken: cancellationToken,
remoteTransport: transport,
onProgressAction: onProgressAction,
onErrorAction: (s, ex) =>
{
//Don't wrap cancellation exceptions!
if (ex is OperationCanceledException)
throw ex;
//HACK: Sometimes, the task was cancelled, and Operations.Receive doesn't fail in a reliable way. In this case, the exception is often simply a symptom of a cancel.
if (cancellationToken.IsCancellationRequested)
{
SpeckleLog.Logger.Warning(
ex,
"A task was cancelled, ignoring potentially symptomatic exception"
);
cancellationToken.ThrowIfCancellationRequested();
}
//Treat all operation errors as fatal
throw new SpeckleException(
$"Failed to receive requested object {objectId} from server: {s}",
ex
);
},
onTotalChildrenCountKnown: onTotalChildrenCountKnown,
disposeTransports: false
objectId,
transport,
null,
onProgressAction,
onTotalChildrenCountKnown,
cancellationToken
)
.ConfigureAwait(false);
@@ -317,9 +295,6 @@ namespace Speckle.ConnectorUnity.Components
}
);
if (requestedObject == null)
throw new SpeckleException($"Operation {nameof(Operations.Receive)} returned null");
cancellationToken.ThrowIfCancellationRequested();
//Read receipt
@@ -340,10 +315,10 @@ namespace Speckle.ConnectorUnity.Components
)
.ConfigureAwait(false);
}
catch (Exception e)
catch (Exception ex)
{
// Do nothing!
Debug.LogWarning($"Failed to send read receipt\n{e}");
Debug.LogWarning($"Failed to send read receipt\n{ex}");
}
return requestedObject;
@@ -447,12 +422,9 @@ namespace Speckle.ConnectorUnity.Components
/// <summary>
/// Fetches the commit preview for the currently selected commit
/// </summary>
/// <param name="allAngles">when <see langword="true"/>, will fetch 360 degree preview image</param>
/// <param name="callback">Callback function to be called when the web request completes</param>
/// <returns>The executing <see cref="Coroutine"/> or <see langword="null"/> if <see cref="Account"/>, <see cref="Stream"/>, or <see cref="Commit"/> was <see langword="null"/></returns>
public Coroutine? GetPreviewImage( /*bool allAngles,*/
Action<Texture2D?> callback
)
public Coroutine? GetPreviewImage(Action<Texture2D?> callback)
{
Account? account = Account.Selected;
if (account == null)
@@ -476,25 +448,25 @@ namespace Speckle.ConnectorUnity.Components
[ContextMenu("Open Speckle Stream in Browser")]
protected void OpenUrlInBrowser()
{
string url = GetSelectedUrl();
Application.OpenURL(url);
Uri url = GetSelectedUrl();
Application.OpenURL(url.ToString());
}
#endif
public string GetSelectedUrl()
public Uri GetSelectedUrl()
{
string serverUrl = Account.Selected!.serverInfo.url;
string? streamId = Stream.Selected?.id;
string? branchName = Branch.Selected?.name;
string? commitId = Commit.Selected?.id;
Account selectedAccount = Account.Selected!;
StreamWrapper sw =
new()
{
ServerUrl = selectedAccount.serverInfo.url,
StreamId = Stream.Selected!.id,
BranchName = Branch.Selected?.id,
CommitId = Commit.Selected?.id
};
sw.SetAccount(selectedAccount);
if (string.IsNullOrEmpty(streamId))
return serverUrl;
if (!string.IsNullOrEmpty(commitId))
return $"{serverUrl}/streams/{streamId}/commits/{commitId}";
if (!string.IsNullOrEmpty(branchName))
return $"{serverUrl}/streams/{streamId}/branches/{branchName}";
return $"{serverUrl}/streams/{streamId}";
return sw.ToServerUri();
}
public void Awake()
@@ -36,6 +36,7 @@ namespace Speckle.ConnectorUnity.Components
[HideInInspector]
public BranchSelectionEvent OnBranchSelectionChange;
[Obsolete("No longer used")]
[HideInInspector]
public ErrorActionEvent OnErrorAction;
@@ -61,40 +62,44 @@ namespace Speckle.ConnectorUnity.Components
)
throw new SpeckleException(error);
ServerTransport transport = new ServerTransport(client.Account, stream.id);
using ServerTransport transport = new(client.Account, stream.id);
transport.CancellationToken = CancellationTokenSource.Token;
return await SendDataAsync(
CancellationTokenSource.Token,
remoteTransport: transport,
data: data,
client: client,
branchName: branch.name,
createCommit: createCommit,
onProgressAction: dict => OnSendProgressAction.Invoke(dict),
onErrorAction: (m, e) => OnErrorAction.Invoke(m, e)
data,
client,
branch.id,
createCommit,
dict => OnSendProgressAction.Invoke(dict),
CancellationTokenSource.Token
);
}
/// <param name="remoteTransport">The transport to send to</param>
/// <param name="data">The data to send</param>
/// <param name="client">An authenticated Speckle Client</param>
/// <param name="branchId">The branch name or id</param>
/// <param name="createCommit">when <see langword="true"/> will call <see cref="Client.CommitCreate"/>, otherwise only the object data is sent</param>
/// <param name="onProgressAction">Called every progress tick of the <see cref="Operations.Send"/></param>
/// <param name="cancellationToken">Optional cancellation token</param>
/// <returns>The id (hash) of the object sent</returns>
public static async Task<string> SendDataAsync(
CancellationToken cancellationToken,
ServerTransport remoteTransport,
Base data,
Client client,
string branchName,
string branchId,
bool createCommit,
Action<ConcurrentDictionary<string, int>>? onProgressAction = null,
Action<string, Exception>? onErrorAction = null
CancellationToken cancellationToken = default
)
{
string res = await Operations.Send(
data,
cancellationToken: cancellationToken,
new List<ITransport> { remoteTransport },
useDefaultCache: true,
disposeTransports: true,
onProgressAction: onProgressAction,
onErrorAction: onErrorAction
remoteTransport,
true,
onProgressAction,
cancellationToken
);
Analytics.TrackEvent(
@@ -115,15 +120,26 @@ namespace Speckle.ConnectorUnity.Components
string commitMessage = $"Sent {data.totalChildrenCount} objects from {unityVer}";
string commitId = await CreateCommit(
cancellationToken,
data,
client,
streamId,
branchName,
branchId,
res,
commitMessage
commitMessage,
cancellationToken
);
string url = $"{client.ServerUrl}/streams/{streamId}/commits/{commitId}";
StreamWrapper sw =
new()
{
ServerUrl = client.ServerUrl,
StreamId = streamId,
BranchName = branchId,
CommitId = commitId,
};
sw.SetAccount(client.Account);
string url = sw.ToServerUri().GetLeftPart(UriPartial.Path);
Debug.Log($"Data successfully sent to <a href=\"{url}\">{url}</a>");
}
@@ -131,13 +147,13 @@ namespace Speckle.ConnectorUnity.Components
}
public static async Task<string> CreateCommit(
CancellationToken cancellationToken,
Base data,
Client client,
string streamId,
string branchName,
string objectId,
string message
string message,
CancellationToken cancellationToken
)
{
string commitId = await client.CommitCreate(
@@ -249,5 +265,28 @@ namespace Speckle.ConnectorUnity.Components
{
Initialise();
}
[Obsolete("use other overload")]
public static async Task<string> SendDataAsync(
CancellationToken cancellationToken,
ServerTransport remoteTransport,
Base data,
Client client,
string branchName,
bool createCommit,
Action<ConcurrentDictionary<string, int>>? onProgressAction = null,
Action<string, Exception>? onErrorAction = null
)
{
return await SendDataAsync(
remoteTransport,
data,
client,
branchName,
createCommit,
onProgressAction,
cancellationToken
);
}
}
}
@@ -10,9 +10,7 @@ using UnityEngine.Rendering;
using Material = UnityEngine.Material;
using Mesh = UnityEngine.Mesh;
using SMesh = Objects.Geometry.Mesh;
using SColor = System.Drawing.Color;
using Transform = UnityEngine.Transform;
using STransform = Objects.Other.Transform;
#nullable enable
namespace Objects.Converter.Unity
@@ -8,7 +8,6 @@ using UnityEngine;
using Material = UnityEngine.Material;
using SMesh = Objects.Geometry.Mesh;
using SColor = System.Drawing.Color;
using STransform = Objects.Other.Transform;
namespace Objects.Converter.Unity
{
@@ -76,7 +75,7 @@ namespace Objects.Converter.Unity
// 3. Otherwise, convert fresh!
string name = CoreUtils.GenerateObjectName(renderMaterial);
Color diffuse = renderMaterial.diffuse.ToUnityColor();
bool isOpaque = Math.Abs(renderMaterial.opacity - 1d) < Constants.Eps;
bool isOpaque = Math.Abs(renderMaterial.opacity - 1d) < Constants.EPS;
Color color = new(diffuse.r, diffuse.g, diffuse.b, (float)renderMaterial.opacity);
float metalic = (float)renderMaterial.metalness;
float gloss = 1f - (float)renderMaterial.roughness;
File diff suppressed because it is too large Load Diff
@@ -98,7 +98,7 @@ namespace Speckle.ConnectorUnity
yield return null;
}
private static Dispatcher _instance = null;
private static Dispatcher _instance;
public static bool Exists()
{
@@ -1,6 +1,7 @@
#nullable enable
using System;
using System.Collections;
using System.Threading;
using System.Threading.Tasks;
using UnityEngine;
using UnityEngine.Networking;
@@ -111,9 +112,9 @@ namespace Speckle.ConnectorUnity.Utils
public readonly Task Task;
public override bool keepWaiting => !Task.IsCompleted;
public WaitForTask(Func<Task> function)
public WaitForTask(Func<Task> function, CancellationToken cancellationToken = default)
{
Task = Task.Run(function);
Task = Task.Run(function, cancellationToken);
}
}
@@ -124,9 +125,12 @@ namespace Speckle.ConnectorUnity.Utils
public TResult Result => Task.Result;
public override bool keepWaiting => !Task.IsCompleted;
public WaitForTask(Func<Task<TResult>> function)
public WaitForTask(
Func<Task<TResult>> function,
CancellationToken cancellationToken = default
)
{
this.Task = System.Threading.Tasks.Task.Run(function);
this.Task = System.Threading.Tasks.Task.Run(function, cancellationToken);
}
}
}
@@ -30,7 +30,7 @@ namespace Speckle.ConnectorUnity.Wrappers.Selection
if (value is null)
return null;
return value.id + Crypt.Hash(value.serverInfo.url ?? "");
return value.id + Crypt.Md5(value.serverInfo.url ?? "", "X2");
}
public override void RefreshOptions()
@@ -1,6 +1,6 @@
{
"name": "systems.speckle.speckle-unity",
"version": "2.17.1",
"version": "2.18.0-rc1",
"displayName": "Speckle Unity Connector",
"description": "AEC Interoperability for Unity through Speckle",
"unity": "2021.1",
+2 -2
View File
@@ -1,2 +1,2 @@
m_EditorVersion: 2021.3.22f1
m_EditorVersionWithRevision: 2021.3.22f1 (b6c551784ba3)
m_EditorVersion: 2021.3.30f1
m_EditorVersionWithRevision: 2021.3.30f1 (b4360d7cdac4)