Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 205c8dbf5a |
@@ -57,6 +57,13 @@ UObject* UAggregateConverter::ConvertToNativeInternal(const UBase* Object, UWorl
|
||||
UObject* Converter = GetConverter(Type).GetObject();
|
||||
if(!IsValid(Converter))
|
||||
{
|
||||
//TODO convert displayValues then halt traversal
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(Type != UBase::StaticClass())
|
||||
{
|
||||
UE_LOG(LogSpeckle, Warning, TEXT("Skipping Object %s: No conversion functions exist for %s"), *Object->Id, *Type->GetName());
|
||||
|
||||
@@ -14,15 +14,25 @@
|
||||
#include "Conversion/Converters/MaterialConverter.h"
|
||||
#include "Misc/ScopedSlowTask.h"
|
||||
#include "Objects/DisplayValueElement.h"
|
||||
#include "Objects/Geometry/Box.h"
|
||||
#include "Objects/Other/RenderMaterial.h"
|
||||
#include "Objects/Utils/SpeckleObjectUtils.h"
|
||||
|
||||
#define LOCTEXT_NAMESPACE "FSpeckleUnrealModule"
|
||||
|
||||
bool UStaticMeshConverter::CanConvertToNative_Implementation(TSubclassOf<UBase> BaseType)
|
||||
{
|
||||
if(EnabledTypes.Contains(BaseType))
|
||||
return EnabledTypes[BaseType];
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
UStaticMeshConverter::UStaticMeshConverter()
|
||||
{
|
||||
SpeckleTypes.Add(UMesh::StaticClass());
|
||||
SpeckleTypes.Add(UDisplayValueElement::StaticClass());
|
||||
EnabledTypes.Add(UMesh::StaticClass(), true);
|
||||
EnabledTypes.Add(UDisplayValueElement::StaticClass(), true);
|
||||
EnabledTypes.Add(UBoxx::StaticClass(), true);
|
||||
|
||||
#if WITH_EDITORONLY_DATA
|
||||
UseFullBuild = true;
|
||||
@@ -58,6 +68,15 @@ UObject* UStaticMeshConverter::ConvertToNative_Implementation(const UBase* Speck
|
||||
return MeshToNativeActor(m, World, AvailableConverters);
|
||||
}
|
||||
|
||||
|
||||
const UBoxx* b = Cast<UBoxx>(SpeckleBase);
|
||||
if(b != nullptr)
|
||||
{
|
||||
//Handle Element with Display Values
|
||||
const UMesh* m = b->ToMesh();
|
||||
return MeshToNativeActor(m, World, AvailableConverters);
|
||||
}
|
||||
|
||||
const UDisplayValueElement* d = Cast<UDisplayValueElement>(SpeckleBase);
|
||||
if(d != nullptr)
|
||||
{
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "Objects/Geometry/Box.h"
|
||||
|
||||
#include "Objects/Geometry/Plane.h"
|
||||
#include "Objects/Utils/SpeckleObjectUtils.h"
|
||||
|
||||
bool UBoxx::Parse(const TSharedPtr<FJsonObject> Obj, const TScriptInterface<ITransport> ReadTransport)
|
||||
{
|
||||
if(!Super::Parse(Obj, ReadTransport)) return false;
|
||||
|
||||
const float ScaleFactor = USpeckleObjectUtils::ParseScaleFactor(Units);
|
||||
|
||||
const FString BasePlanePropertyName = TEXT("basePlane");
|
||||
if (Obj->HasField(BasePlanePropertyName))
|
||||
{
|
||||
BasePlane = NewObject<UPlane>();
|
||||
if(!BasePlane->Parse(Obj->GetObjectField(BasePlanePropertyName), ReadTransport)) return false;
|
||||
DynamicProperties.Remove(BasePlanePropertyName);
|
||||
}
|
||||
|
||||
if(!USpeckleObjectUtils::ParseVectorProperty(Obj, "xSize", ReadTransport, XSize)) return false;
|
||||
XSize *= ScaleFactor;
|
||||
DynamicProperties.Remove("xSize");
|
||||
|
||||
if(!USpeckleObjectUtils::ParseVectorProperty(Obj, "ySize", ReadTransport, YSize)) return false;
|
||||
YSize *= ScaleFactor;
|
||||
DynamicProperties.Remove("ySize");
|
||||
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
UMesh* UBoxx::ToMesh(UObject* Outer) const
|
||||
{
|
||||
|
||||
TArray<FVector> Vertices = {
|
||||
FVector(),
|
||||
FVector(),
|
||||
FVector(),
|
||||
FVector(),
|
||||
FVector(),
|
||||
FVector(),
|
||||
};
|
||||
|
||||
TArray<int32> Faces = {
|
||||
};
|
||||
|
||||
//FMatrix transform =
|
||||
|
||||
|
||||
UMesh* Mesh = NewObject<UMesh>(Outer);
|
||||
return Mesh;
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
|
||||
#include "Objects/Geometry/Plane.h"
|
||||
|
||||
#include "Objects/Utils/SpeckleObjectUtils.h"
|
||||
|
||||
bool UPlane::Parse(const TSharedPtr<FJsonObject> Obj, const TScriptInterface<ITransport> ReadTransport)
|
||||
{
|
||||
if(!Super::Parse(Obj, ReadTransport)) return false;
|
||||
|
||||
const float ScaleFactor = USpeckleObjectUtils::ParseScaleFactor(Units);
|
||||
|
||||
if(!USpeckleObjectUtils::ParseVectorProperty(Obj, "origin", ReadTransport, Origin)) return false;
|
||||
Origin *= ScaleFactor;
|
||||
DynamicProperties.Remove("origin");
|
||||
|
||||
if(!USpeckleObjectUtils::ParseVectorProperty(Obj, "normal", ReadTransport, Normal)) return false;
|
||||
Normal *= ScaleFactor;
|
||||
DynamicProperties.Remove("normal");
|
||||
|
||||
if(!USpeckleObjectUtils::ParseVectorProperty(Obj, "ydir", ReadTransport, XDir)) return false;
|
||||
XDir *= ScaleFactor;
|
||||
DynamicProperties.Remove("ydir");
|
||||
|
||||
if(!USpeckleObjectUtils::ParseVectorProperty(Obj, "xdir", ReadTransport, YDir)) return false;
|
||||
YDir *= ScaleFactor;
|
||||
DynamicProperties.Remove("xdir");
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -143,6 +143,41 @@ bool USpeckleObjectUtils::ParseVector(const TSharedPtr<FJsonObject> Object,
|
||||
return ParseSpeckleObject<UMesh>(Obj, Transport, Mesh);
|
||||
}
|
||||
|
||||
bool USpeckleObjectUtils::ParseIntervalProperty(const TSharedPtr<FJsonObject> Base, const FString& PropertyName,
|
||||
const TScriptInterface<ITransport> ReadTransport, FVector2f<float>& OutObject)
|
||||
{
|
||||
const TSharedPtr<FJsonObject>* OriginObject;
|
||||
if(Base->TryGetObjectField(PropertyName, OriginObject)
|
||||
&& ParseInterval(*OriginObject, ReadTransport, OutObject))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
bool USpeckleObjectUtils::ParseInterval(const TSharedPtr<FJsonObject> Object,
|
||||
const TScriptInterface<ITransport> Transport, FVector2f& OutObject)
|
||||
{
|
||||
if(!ensure(Object != nullptr)) return false;
|
||||
|
||||
TSharedPtr<FJsonObject> Obj;
|
||||
if(!ResolveReference(Object, Transport, Obj)) Obj = Object;
|
||||
|
||||
double x = 0, y = 0, z = 0;
|
||||
|
||||
if(!(Obj->TryGetNumberField("start", x)
|
||||
&& Obj->TryGetNumberField("end", y)) return false;
|
||||
|
||||
OutObject = FVector2f(x,y,z);
|
||||
//return true;
|
||||
|
||||
UMesh* Mesh;
|
||||
return ParseSpeckleObject<UMesh>(Obj, Transport, Mesh);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <typename TBase>
|
||||
bool USpeckleObjectUtils::ParseSpeckleObject(const TSharedPtr<FJsonObject> Object,
|
||||
const TScriptInterface<ITransport> Transport, TBase*& OutObject)
|
||||
|
||||
@@ -13,7 +13,7 @@ class UMesh;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
UCLASS(meta=(ScriptName="Display Value Element (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API UDisplayValueElement : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Mesh.h"
|
||||
#include "Objects/Base.h"
|
||||
#include "Box.generated.h"
|
||||
|
||||
class UPlane;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS(meta=(ScriptName="Box (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API UBoxx : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
public:
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Speckle|Objects")
|
||||
UPlane* BasePlane;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Speckle|Objects")
|
||||
FVector2f XSize, YSize;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Speckle|Objects")
|
||||
float Area;
|
||||
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Speckle|Objects")
|
||||
float Volume;
|
||||
|
||||
|
||||
virtual bool Parse(const TSharedPtr<FJsonObject> Obj, const TScriptInterface<ITransport> ReadTransport) override;
|
||||
|
||||
UFUNCTION(BlueprintCallable)
|
||||
virtual UMesh* ToMesh(UObject* Outer = GetTransientPackage()) const;
|
||||
};
|
||||
@@ -12,7 +12,7 @@ class URenderMaterial;
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
UCLASS(meta=(ScriptName="Mesh (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API UMesh : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
// Fill out your copyright notice in the Description page of Project Settings.
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "CoreMinimal.h"
|
||||
#include "Objects/Base.h"
|
||||
#include "Plane.generated.h"
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS(meta=(ScriptName="Plane (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API UPlane : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
|
||||
public:
|
||||
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category="Speckle|Objects")
|
||||
FVector Origin, Normal, XDir, YDir;
|
||||
|
||||
|
||||
virtual bool Parse(const TSharedPtr<FJsonObject> Obj, const TScriptInterface<ITransport> ReadTransport) override;
|
||||
|
||||
};
|
||||
@@ -10,7 +10,7 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
UCLASS(meta=(ScriptName="Point Cloud (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API UPointCloud : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
UCLASS(meta=(ScriptName="Block Instance (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API UBlockInstance : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
UCLASS(meta=(ScriptName="Render Material (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API URenderMaterial : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
/**
|
||||
*
|
||||
*/
|
||||
UCLASS()
|
||||
UCLASS(meta=(ScriptName="View3D (Speckle.Objects)"))
|
||||
class SPECKLEUNREAL_API UView3D : public UBase
|
||||
{
|
||||
GENERATED_BODY()
|
||||
|
||||
Reference in New Issue
Block a user