1 Commits

Author SHA1 Message Date
JR-Morgan 205c8dbf5a Experimentation adding box conversion 2022-06-07 21:37:28 +01:00
13 changed files with 219 additions and 8 deletions
@@ -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()