Skip to content

Commit caa5603

Browse files
authored
Merge pull request #87 from specklesystems/jrm/converter/collections
Support for receiving Collections and various other Bug fixes
2 parents 6aa4afb + c1f5476 commit caa5603

19 files changed

+199
-20
lines changed
Binary file not shown.
26.5 KB
Binary file not shown.

Source/SpeckleUnreal/Private/Analytics.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
#include "Kismet/GameplayStatics.h"
77
#include "LogSpeckle.h"
88
#include "Interfaces/IHttpResponse.h"
9-
#include "Launch/Resources/Version.h"
109
#include "Misc/Base64.h"
10+
#include "Runtime/Launch/Resources/Version.h"
1111
#include "Policies/CondensedJsonPrintPolicy.h"
1212
#include "Serialization/JsonSerializerMacros.h"
1313
#include "Serialization/JsonWriter.h"
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
2+
#include "Conversion/Converters/CollectionConverter.h"
3+
4+
#include "Objects/Collection.h"
5+
6+
UCollectionConverter::UCollectionConverter()
7+
{
8+
SpeckleTypes.Add(UCollection::StaticClass());
9+
10+
11+
ActorType = AActor::StaticClass();
12+
ActorMobility = EComponentMobility::Static;
13+
}
14+
15+
UObject* UCollectionConverter::ConvertToNative_Implementation(const UBase* SpeckleBase, UWorld* World,
16+
TScriptInterface<ISpeckleConverter>& AvailableConverters )
17+
{
18+
const UCollection* p = Cast<UCollection>(SpeckleBase);
19+
20+
if(p == nullptr) return nullptr;
21+
22+
return CollectionToNative(p, World);
23+
}
24+
25+
AActor* UCollectionConverter::CollectionToNative(const UCollection*, UWorld* World)
26+
{
27+
AActor* MeshActor = CreateEmptyActor(World);
28+
29+
30+
return MeshActor;
31+
}
32+
33+
AActor* UCollectionConverter::CreateEmptyActor(UWorld* World, const FActorSpawnParameters& SpawnParameters)
34+
{
35+
AActor* Actor = World->SpawnActor<AActor>(ActorType, SpawnParameters);
36+
USceneComponent* Scene = NewObject<USceneComponent>(Actor, "Root");
37+
Actor->SetRootComponent(Scene);
38+
Scene->RegisterComponent();
39+
Scene->SetMobility(ActorMobility);
40+
return Actor;
41+
}
42+
43+
44+
UBase* UCollectionConverter::ConvertToSpeckle_Implementation(const UObject* Object)
45+
{
46+
return nullptr; //TODO implement ToSpeckle function
47+
}
48+
49+
50+
UCollection* UCollectionConverter::CollectionToSpeckle(const AActor* Object)
51+
{
52+
return nullptr; //TODO implement ToSpeckle function
53+
}

Source/SpeckleUnreal/Private/Conversion/Converters/StaticMeshConverter.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,10 @@ AActor* UStaticMeshConverter::MeshesToNativeActor(const UBase* Parent, const TAr
101101
FMatrix Transform = FMatrix::Identity;
102102
// For single mesh, we check for transform
103103
//TODO figure out how to handle DisplayValueElement with transform. Maybe we just grab transform from parent unconditionally? How does this affect blocks?
104-
if(Parent == SpeckleMeshes[0])
105-
{
106-
Transform = SpeckleMeshes[0]->Transform;
107-
}
104+
// if(Parent == SpeckleMeshes[0])
105+
// {
106+
// Transform = SpeckleMeshes[0]->Transform;
107+
// }
108108

109109
AActor* Actor = CreateEmptyActor(World, USpeckleObjectUtils::CreateTransform(Transform));
110110
TInlineComponentArray<UStaticMeshComponent*> Components;

Source/SpeckleUnreal/Private/Conversion/SpeckleConverterComponent.cpp

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#include "API/SpeckleSerializer.h"
66
#include "Conversion/Converters/AggregateConverter.h"
77
#include "Conversion/Converters/BlockConverter.h"
8+
#include "Conversion/Converters/CollectionConverter.h"
89
#include "Conversion/Converters/PointCloudConverter.h"
910
#include "Conversion/Converters/StaticMeshConverter.h"
1011
#include "Conversion/Converters/MaterialConverter.h"
@@ -22,6 +23,7 @@ USpeckleConverterComponent::USpeckleConverterComponent()
2223
static ConstructorHelpers::FObjectFinder<UPointCloudConverter> PointCloudConverter(TEXT("PointCloudConverter'/SpeckleUnreal/Converters/DefaultPointCloudConverter.DefaultPointCloudConverter'"));
2324
static ConstructorHelpers::FObjectFinder<UBlockConverter> BlockConverter(TEXT("BlockConverter'/SpeckleUnreal/Converters/DefaultBlockConverter.DefaultBlockConverter'"));
2425
static ConstructorHelpers::FObjectFinder<UMaterialConverter> MaterialConverter(TEXT("MaterialConverter'/SpeckleUnreal/Converters/DefaultMaterialConverter.DefaultMaterialConverter'"));
26+
static ConstructorHelpers::FObjectFinder<UCollectionConverter> CollectionConverter(TEXT("CollectionConverter'/SpeckleUnreal/Converters/DefaultCollectionConverter.DefaultCollectionConverter'"));
2527
static ConstructorHelpers::FObjectFinder<UObject> CameraConverter(TEXT("CameraConverter'/SpeckleUnreal/Converters/DefaultCameraConverter.DefaultCameraConverter'"));
2628
//static ConstructorHelpers::FObjectFinder<ULightConverter> LightConverter(TEXT("LightConverter'/SpeckleUnreal/Converters/DefaultLightConverter.DefaultLightConverter'"));
2729

@@ -31,6 +33,7 @@ USpeckleConverterComponent::USpeckleConverterComponent()
3133
SpeckleConverter->SpeckleConverters.Add(PointCloudConverter.Object);
3234
SpeckleConverter->SpeckleConverters.Add(BlockConverter.Object);
3335
SpeckleConverter->SpeckleConverters.Add(MaterialConverter.Object);
36+
SpeckleConverter->SpeckleConverters.Add(CollectionConverter.Object);
3437
SpeckleConverter->SpeckleConverters.Add(CameraConverter.Object);
3538
//SpeckleConverter->SpeckleConverters.Add(LightConverter.Object);
3639

@@ -41,8 +44,19 @@ AActor* USpeckleConverterComponent::RecursivelyConvertToNative(AActor* AOwner, c
4144
const TScriptInterface<ITransport>& LocalTransport, bool DisplayProgressBar, TArray<AActor*>& OutActors)
4245
{
4346
float ObjectsToConvert{};
44-
Base->TryGetDynamicNumber("totalChildrenCount", ObjectsToConvert);
45-
47+
if(Base->TotalChildrenCount > 0)
48+
{
49+
ObjectsToConvert = Base->TotalChildrenCount;
50+
}
51+
else
52+
{
53+
Base->TryGetDynamicNumber("totalChildrenCount", ObjectsToConvert);
54+
}
55+
if(ObjectsToConvert <= 1)
56+
{
57+
ObjectsToConvert = 99999; //A large number
58+
}
59+
4660
// Progress bar
4761
FScopedSlowTask Progress(ObjectsToConvert + 2,
4862
LOCTEXT("SpeckleConvertoNative","Converting Speckle Objects to Native"), DisplayProgressBar);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
#include "Objects/Collection.h"
3+
4+
5+
6+
7+
bool UCollection::Parse(const TSharedPtr<FJsonObject> Obj, const TScriptInterface<ITransport> ReadTransport)
8+
{
9+
if(!Super::Parse(Obj, ReadTransport)) return false;
10+
11+
// Parse Name property
12+
if(!Obj->TryGetStringField("name", Name)) return false;
13+
//DynamicProperties.Remove("name"); //Don't remove from dynamic, as we pick this up to name the actor
14+
15+
// Parse collectionType
16+
if(!Obj->TryGetStringField("collectionType", CollectionType)) return false;
17+
DynamicProperties.Remove("collectionType");
18+
19+
return true;
20+
}

Source/SpeckleUnreal/Private/Objects/Geometry/Mesh.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,12 @@ bool UMesh::Parse(const TSharedPtr<FJsonObject> Obj, const TScriptInterface<ITra
3131

3232
for (size_t i = 0, j = 0; i < NumberOfVertices; i++, j += 3)
3333
{
34-
Vertices.Add(Transform.InverseTransformPosition(FVector
34+
Vertices.Add(FVector
3535
(
3636
ObjectVertices[j].Get()->AsNumber(),
3737
-ObjectVertices[j + 1].Get()->AsNumber(),
3838
ObjectVertices[j + 2].Get()->AsNumber()
39-
) * ScaleFactor ));
39+
) * ScaleFactor );
4040
}
4141
DynamicProperties.Remove("vertices");
4242
}

Source/SpeckleUnreal/Private/Transports/ServerTransport.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
#include "LogSpeckle.h"
55
#include "Mixpanel.h"
6+
#include "Runtime/Launch/Resources/Version.h"
67
#include "JsonObjectConverter.h"
78
#include "HttpModule.h"
89
#include "Interfaces/IHttpRequest.h"
@@ -79,7 +80,12 @@ void UServerTransport::CopyObjectAndChildren(const FString& ObjectId,
7980
Request->SetHeader("apollographql-client-version", SPECKLE_CONNECTOR_VERSION);
8081

8182
// Response Callback
82-
auto ResponseHandler = [=](FHttpRequestPtr, FHttpResponsePtr Response, bool bWasSuccessful) mutable
83+
#if ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 3
84+
auto ResponseHandler = [=, this](FHttpRequestPtr, FHttpResponsePtr Response, bool bWasSuccessful) mutable
85+
#else
86+
auto ResponseHandler = [=](FHttpRequestPtr, FHttpResponsePtr Response, bool bWasSuccessful) mutable
87+
#endif
88+
8389
{
8490
if(!bWasSuccessful)
8591
{
@@ -163,7 +169,11 @@ void UServerTransport::FetchChildren(TScriptInterface<ITransport> TargetTranspor
163169
}
164170

165171
// Response Callback
166-
auto ResponseHandler = [=](FHttpRequestPtr, FHttpResponsePtr Response, bool bWasSuccessful) mutable
172+
#if ENGINE_MAJOR_VERSION == 5 && ENGINE_MINOR_VERSION >= 3
173+
auto ResponseHandler = [=, this](FHttpRequestPtr, FHttpResponsePtr Response, bool bWasSuccessful) mutable
174+
#else
175+
auto ResponseHandler = [=](FHttpRequestPtr, FHttpResponsePtr Response, bool bWasSuccessful) mutable
176+
#endif
167177
{
168178
// Request Fail
169179
if(!bWasSuccessful)

Source/SpeckleUnreal/Public/API/Models/SpeckleUser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ struct FSpeckleUser
3434
FString Avatar;
3535

3636
UPROPERTY(BlueprintReadWrite, Category="Speckle|API Models")
37-
bool Verified;
37+
bool Verified = false;
3838

3939
UPROPERTY(BlueprintReadWrite, Category="Speckle|API Models")
4040
FString Role;
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
2+
#pragma once
3+
4+
#include "CoreMinimal.h"
5+
#include "Conversion/SpeckleConverter.h"
6+
#include "Engine/EngineTypes.h"
7+
#include "Engine/World.h"
8+
9+
#include "CollectionConverter.generated.h"
10+
11+
class UCollection;
12+
13+
14+
/**
15+
* Converts Speckle Mesh objects into native actors with a procedural mesh component.
16+
*
17+
* Compared with the StaticMeshConverter, this converter has some serious limitations
18+
* - Cannot convert displayValues,
19+
* - N-gon faces will be ignored,
20+
* - Meshes are transient, and won't persist on level reload
21+
*/
22+
UCLASS()
23+
class SPECKLEUNREAL_API UCollectionConverter : public UObject, public ISpeckleConverter
24+
{
25+
GENERATED_BODY()
26+
27+
CONVERTS_SPECKLE_TYPES()
28+
29+
public:
30+
31+
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="ToNative")
32+
TSubclassOf<AActor> ActorType;
33+
34+
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="ToNative")
35+
TEnumAsByte<EComponentMobility::Type> ActorMobility;
36+
37+
// Sets default values for this actor's properties
38+
UCollectionConverter();
39+
40+
virtual UObject* ConvertToNative_Implementation(const UBase* SpeckleBase, UWorld* World,
41+
TScriptInterface<ISpeckleConverter>& AvailableConverters) override;
42+
43+
virtual UBase* ConvertToSpeckle_Implementation(const UObject* Object) override;
44+
45+
UFUNCTION(BlueprintCallable, Category="ToNative")
46+
virtual AActor* CollectionToNative(const UCollection* SpeckleCollection, UWorld* World);
47+
48+
UFUNCTION(BlueprintCallable, Category="ToNative")
49+
virtual UCollection* CollectionToSpeckle(const AActor* Object);
50+
51+
virtual AActor* CreateEmptyActor(UWorld* World, const FActorSpawnParameters& SpawnParameters = FActorSpawnParameters());
52+
53+
};

Source/SpeckleUnreal/Public/Conversion/SpeckleConverter.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class SPECKLEUNREAL_API ISpeckleConverter
3434
UObject* ConvertToNative(const UBase* SpeckleBase, UWorld* World, UPARAM(ref) TScriptInterface<ISpeckleConverter>& AvailableConverters);
3535

3636
/// Tries to convert a given Actor or Component into a Speckle Base
37+
/// NOT IMPLEMENTED!!!
3738
UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category="ToSpeckle")
3839
UBase* ConvertToSpeckle(const UObject* Object);
3940

Source/SpeckleUnreal/Public/Conversion/SpeckleConverterComponent.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ struct FSlowTask;
1717
/**
1818
* An Actor Component for encapsulating recursive conversion of Speckle Objects
1919
*/
20-
UCLASS(ClassGroup=(Speckle), meta=(BlueprintSpawnableComponent))
20+
UCLASS(ClassGroup=(Speckle), meta=(BlueprintSpawnableComponent), HideCategories=(Activation, Collision, Cooking, Tags))
2121
class SPECKLEUNREAL_API USpeckleConverterComponent : public UActorComponent
2222
{
2323
GENERATED_BODY()

Source/SpeckleUnreal/Public/Objects/Base.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class SPECKLEUNREAL_API UBase : public UObject
3333
FString Id;
3434

3535
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Speckle|Objects")
36-
int64 TotalChildrenCount;
36+
int64 TotalChildrenCount = 0;
3737

3838
UPROPERTY(VisibleAnywhere, BlueprintReadWrite, Category="Speckle|Objects")
3939
FString ApplicationId;
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
2+
#pragma once
3+
4+
#include "CoreMinimal.h"
5+
#include "Objects/Base.h"
6+
7+
#include "Collection.generated.h"
8+
9+
/**
10+
*
11+
*/
12+
UCLASS()
13+
class SPECKLEUNREAL_API UCollection : public UBase
14+
{
15+
GENERATED_BODY()
16+
17+
public:
18+
19+
UPROPERTY(BlueprintReadWrite, Category="Speckle|Objects")
20+
FString Name;
21+
22+
UPROPERTY(BlueprintReadWrite, Category="Speckle|Objects")
23+
FString CollectionType;
24+
25+
UCollection() : UBase(TEXT("Speckle.Core.Models.Collection")) {}
26+
27+
virtual bool Parse(const TSharedPtr<FJsonObject> Obj, const TScriptInterface<ITransport> ReadTransport) override;
28+
};

Source/SpeckleUnreal/Public/ReceiveSelectionComponent.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
* Either by Stream Id + Object Id (Object selection mode)
1414
* Or by Stream + Branch + Commit (Commit selection mode)
1515
*/
16-
UCLASS(ClassGroup=(Speckle), meta=(BlueprintSpawnableComponent))
16+
UCLASS(ClassGroup=(Speckle), meta=(BlueprintSpawnableComponent), HideCategories=(Activation, Collision, Cooking, Tags))
1717
class SPECKLEUNREAL_API UReceiveSelectionComponent : public UActorComponent
1818
{
1919
GENERATED_BODY()
@@ -126,7 +126,7 @@ class SPECKLEUNREAL_API UReceiveSelectionComponent : public UActorComponent
126126
#pragma endregion
127127

128128
#pragma region Branch
129-
UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, Category="Speckle", meta=(DisplayName="Branch", GetOptions=GetBranchOptions, EditCondition="IsStreamValid && !bManualMode", NoResetToDefault))
129+
UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, Category="Speckle", meta=(DisplayName="Branch", GetOptions=GetBranchOptions, EditCondition="IsAccountValid && !bManualMode", NoResetToDefault))
130130
FString SelectedBranchText;
131131

132132
UPROPERTY(BlueprintReadOnly, Transient, Category="Speckle")
@@ -150,7 +150,7 @@ class SPECKLEUNREAL_API UReceiveSelectionComponent : public UActorComponent
150150
#pragma endregion
151151

152152
#pragma region Commit
153-
UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, Category="Speckle", meta=(DisplayName="Commit", GetOptions=GetCommitOptions, EditCondition="IsCommitValid && !bManualMode", NoResetToDefault))
153+
UPROPERTY(EditAnywhere, BlueprintReadWrite, Transient, Category="Speckle", meta=(DisplayName="Commit", GetOptions=GetCommitOptions, EditCondition="IsAccountValid && !bManualMode", NoResetToDefault))
154154
FString SelectedCommitText;
155155

156156
UPROPERTY(BlueprintReadOnly, Transient, Category="Speckle")

Source/SpeckleUnreal/Public/SpeckleUnrealManager.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ class FJsonObject;
1313
/**
1414
* An Actor to handle the receiving of Speckle objects into a level
1515
*/
16-
UCLASS(ClassGroup=(Speckle), AutoCollapseCategories=("Speckle|Conversion"), BlueprintType)
16+
UCLASS(ClassGroup=(Speckle), AutoCollapseCategories=("Speckle|Conversion"), BlueprintType, HideCategories = (Collision, Rendering, Replication, HLOD, Physics, Networking, Input, Actor))
1717
class SPECKLEUNREAL_API ASpeckleUnrealManager : public AActor
1818
{
1919
GENERATED_BODY()

Source/SpeckleUnreal/SpeckleUnreal.Build.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public SpeckleUnreal(ReadOnlyTargetRules Target) : base(Target)
1515
//
1616
// bUseUnity = false;
1717

18-
PublicDefinitions.Add("SPECKLE_CONNECTOR_VERSION=\"2.15.1\"");
18+
PublicDefinitions.Add("SPECKLE_CONNECTOR_VERSION=\"2.15.2\"");
1919

2020
PublicIncludePaths.AddRange(
2121
new string[] {

SpeckleUnreal.uplugin

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"FileVersion": 3,
33
"Version": 1,
4-
"VersionName": "2.15.1",
4+
"VersionName": "2.15.2",
55
"FriendlyName": "Speckle Unreal",
66
"Description": "Speckle is an open source data platform for Architecture, Engineering, and Construction. It has been open sourced under the Apache License 2.0, is customizable, and available in the cloud or via a self-hosted server. It allows users to exchange data between various AEC modelling and content creation platforms.",
77
"Category": "AEC",

0 commit comments

Comments
 (0)