diff --git a/.idea/.idea.lidarforest/.idea/.name b/.idea/.idea.lidarforest/.idea/.name new file mode 100644 index 0000000..050f799 --- /dev/null +++ b/.idea/.idea.lidarforest/.idea/.name @@ -0,0 +1 @@ +lidarforest \ No newline at end of file diff --git a/.idea/.idea.lidarforest/.idea/projectSettingsUpdater.xml b/.idea/.idea.lidarforest/.idea/projectSettingsUpdater.xml new file mode 100644 index 0000000..4bb9f4d --- /dev/null +++ b/.idea/.idea.lidarforest/.idea/projectSettingsUpdater.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/Plugins/ForestImporter/Content/Blueprints/BP_FIForestSpawner.uasset b/Plugins/ForestImporter/Content/Blueprints/BP_FIForestSpawner.uasset new file mode 100644 index 0000000..87352e3 --- /dev/null +++ b/Plugins/ForestImporter/Content/Blueprints/BP_FIForestSpawner.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:2d21729a23e7a4eb145638a85a67ac34b0abf77168b5197739b193f10d72cee0 +size 297806 diff --git a/Plugins/ForestImporter/Content/DataDefinitions/FFIForestData.uasset b/Plugins/ForestImporter/Content/DataDefinitions/FFIForestData.uasset new file mode 100644 index 0000000..b510116 --- /dev/null +++ b/Plugins/ForestImporter/Content/DataDefinitions/FFIForestData.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:773b164398b2eb64098f622aa901c90a5dfe900558aa502ea1dff2ec0454c2f2 +size 7897 diff --git a/Plugins/ForestImporter/Content/DataDefinitions/ForestData.uasset b/Plugins/ForestImporter/Content/DataDefinitions/ForestData.uasset new file mode 100644 index 0000000..2829557 --- /dev/null +++ b/Plugins/ForestImporter/Content/DataDefinitions/ForestData.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:7f5559b596cfcc57c803135d61fffe9946343281f4fa5ee42be65ba7b223af11 +size 5372 diff --git a/Plugins/ForestImporter/Content/EditorBlueprints/EBP_ForestImporter.uasset b/Plugins/ForestImporter/Content/EditorBlueprints/EBP_ForestImporter.uasset new file mode 100644 index 0000000..9e8b69d --- /dev/null +++ b/Plugins/ForestImporter/Content/EditorBlueprints/EBP_ForestImporter.uasset @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:1e3db11abe4ee190aba32bf17c165a6dcef2912993a27c6a5665f4cd9ca39265 +size 144482 diff --git a/Plugins/ForestImporter/Content/ExampleData/example-forest.json b/Plugins/ForestImporter/Content/ExampleData/example-forest.json new file mode 100644 index 0000000..6d7f11f --- /dev/null +++ b/Plugins/ForestImporter/Content/ExampleData/example-forest.json @@ -0,0 +1,17 @@ +[ +{"Name":"1","x":"-15.12","y":"7.64","z":"-5.40682839506173","r":"0.0479799561281845","dbh":"9.6","h":"9.444"}, +{"Name":"2","x":"-6.88","y":"10.26","z":"-0.243574999999998","r":"0.0419804284258564","dbh":"8.4","h":"11.3532"}, +{"Name":"3","x":"-2.06999999999999","y":"10.64","z":"2.45335828877006","r":"0.190900975744225","dbh":"38.2","h":"9.707"}, +{"Name":"4","x":"-4.83","y":"14.3","z":"1.67841221122112","r":"0.143288313874472","dbh":"28.7","h":"10.4663"}, +{"Name":"5","x":"-15.92","y":"15.29","z":"-4.08376397058823","r":"0.25582628359995","dbh":"51.2","h":"13.2696"}, +{"Name":"6","x":"0.510000000000005","y":"15.66","z":"5.12503727272727","r":"0.248212293732132","dbh":"49.6","h":"10.5504"}, +{"Name":"7","x":"-15.5","y":"17.96","z":"-2.80311261682243","r":"0.207707718070789","dbh":"41.5","h":"10.5709"}, +{"Name":"8","x":"-5.98","y":"18.47","z":"2.27009333333334","r":"0.0690890157121087","dbh":"13.8","h":"11.7931"}, +{"Name":"9","x":"-14.43","y":"20.64","z":"-2.49187435897436","r":"0.224657636678472","dbh":"44.9","h":"11.1663"}, +{"Name":"10","x":"-3.3","y":"20.26","z":"4.4628838362069","r":"0.234632402008446","dbh":"46.9","h":"26.1493"}, +{"Name":"11","x":"-7.28","y":"21.27","z":"1.90214520958084","r":"0.122116516019407","dbh":"24.4","h":"8.8303"}, +{"Name":"12","x":"-5.36","y":"21.83","z":"3.32361354166667","r":"0.221026336614948","dbh":"44.2","h":"26.4361"}, +{"Name":"13","x":"-9.16","y":"23.43","z":"1.50600110132159","r":"0.276642239001447","dbh":"55.3","h":"9.0957"}, +{"Name":"14","x":"-9","y":"26.02","z":"2.61905555555556","r":"0.0254846663744571","dbh":"5.1","h":"23.765"}, +{"Name":"15","x":"-0.109999999999999","y":"27.19","z":"7.17721333333334","r":"0.159445021558632","dbh":"31.9","h":"25.2112"} +] \ No newline at end of file diff --git a/Plugins/ForestImporter/ForestImporter.uplugin b/Plugins/ForestImporter/ForestImporter.uplugin new file mode 100644 index 0000000..9a20a39 Binary files /dev/null and b/Plugins/ForestImporter/ForestImporter.uplugin differ diff --git a/Plugins/ForestImporter/Resources/Icon128.png b/Plugins/ForestImporter/Resources/Icon128.png new file mode 100644 index 0000000..26245f6 --- /dev/null +++ b/Plugins/ForestImporter/Resources/Icon128.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f7239efaeefbd82de33ebe18518e50de075ea4188a468a9e4991396433d2275f +size 12699 diff --git a/Plugins/ForestImporter/Source/ForestImporter/ForestImporter.Build.cs b/Plugins/ForestImporter/Source/ForestImporter/ForestImporter.Build.cs new file mode 100644 index 0000000..0a6175a --- /dev/null +++ b/Plugins/ForestImporter/Source/ForestImporter/ForestImporter.Build.cs @@ -0,0 +1,56 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +using UnrealBuildTool; + +public class ForestImporter : ModuleRules +{ + public ForestImporter(ReadOnlyTargetRules Target) : base(Target) + { + PCHUsage = ModuleRules.PCHUsageMode.UseExplicitOrSharedPCHs; + + PublicIncludePaths.AddRange( + new string[] { + // ... add public include paths required here ... + } + ); + + + PrivateIncludePaths.AddRange( + new string[] { + // ... add other private include paths required here ... + } + ); + + + PublicDependencyModuleNames.AddRange( + new string[] + { + "Core", + // ... add other public dependencies that you statically link with here ... + } + ); + + + PrivateDependencyModuleNames.AddRange( + new string[] + { + "CoreUObject", + "Engine", + "Slate", + "SlateCore", + "InputCore", + "UnrealEd", + "LevelEditor", + // ... add private dependencies that you statically link with here ... + } + ); + + + DynamicallyLoadedModuleNames.AddRange( + new string[] + { + // ... add any modules that your module loads dynamically here ... + } + ); + } +} diff --git a/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporter.cpp b/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporter.cpp new file mode 100644 index 0000000..0f73642 --- /dev/null +++ b/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporter.cpp @@ -0,0 +1,24 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "ForestImporter.h" +#include "ForestImporterEdMode.h" + +#define LOCTEXT_NAMESPACE "FForestImporterModule" + +void FForestImporterModule::StartupModule() +{ + // This code will execute after your module is loaded into memory; the exact timing is specified in the .uplugin file per-module + FEditorModeRegistry::Get().RegisterMode(FForestImporterEdMode::EM_ForestImporterEdModeId, + LOCTEXT("ForestImporterEdModeName", "ForestImporterEdMode"), FSlateIcon(), true); +} + +void FForestImporterModule::ShutdownModule() +{ + // This function may be called during shutdown to clean up your module. For modules that support dynamic reloading, + // we call this function before unloading the module. + FEditorModeRegistry::Get().UnregisterMode(FForestImporterEdMode::EM_ForestImporterEdModeId); +} + +#undef LOCTEXT_NAMESPACE + +IMPLEMENT_MODULE(FForestImporterModule, ForestImporter) \ No newline at end of file diff --git a/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporterEdMode.cpp b/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporterEdMode.cpp new file mode 100644 index 0000000..2e5f988 --- /dev/null +++ b/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporterEdMode.cpp @@ -0,0 +1,50 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "ForestImporterEdMode.h" +#include "ForestImporterEdModeToolkit.h" +#include "Toolkits/ToolkitManager.h" +#include "EditorModeManager.h" + +const FEditorModeID FForestImporterEdMode::EM_ForestImporterEdModeId = TEXT("EM_ForestImporterEdMode"); + +FForestImporterEdMode::FForestImporterEdMode() +{ + +} + +FForestImporterEdMode::~FForestImporterEdMode() +{ + +} + +void FForestImporterEdMode::Enter() +{ + FEdMode::Enter(); + + if (!Toolkit.IsValid() && UsesToolkits()) + { + Toolkit = MakeShareable(new FForestImporterEdModeToolkit); + Toolkit->Init(Owner->GetToolkitHost()); + } +} + +void FForestImporterEdMode::Exit() +{ + if (Toolkit.IsValid()) + { + FToolkitManager::Get().CloseToolkit(Toolkit.ToSharedRef()); + Toolkit.Reset(); + } + + // Call base Exit method to ensure proper cleanup + FEdMode::Exit(); +} + +bool FForestImporterEdMode::UsesToolkits() const +{ + return true; +} + + + + diff --git a/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporterEdModeToolkit.cpp b/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporterEdModeToolkit.cpp new file mode 100644 index 0000000..f2ca276 --- /dev/null +++ b/Plugins/ForestImporter/Source/ForestImporter/Private/ForestImporterEdModeToolkit.cpp @@ -0,0 +1,124 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include "ForestImporterEdModeToolkit.h" +#include "ForestImporterEdMode.h" +#include "Engine/Selection.h" +#include "Widgets/Input/SButton.h" +#include "Widgets/Text/STextBlock.h" +#include "EditorModeManager.h" + +#define LOCTEXT_NAMESPACE "FForestImporterEdModeToolkit" + +FForestImporterEdModeToolkit::FForestImporterEdModeToolkit() +{ +} + +void FForestImporterEdModeToolkit::Init(const TSharedPtr& InitToolkitHost) +{ + struct Locals + { + static bool IsWidgetEnabled() + { + return GEditor->GetSelectedActors()->Num() != 0; + } + + static FReply OnButtonClick(FVector InOffset) + { + USelection* SelectedActors = GEditor->GetSelectedActors(); + + // Let editor know that we're about to do something that we want to undo/redo + GEditor->BeginTransaction(LOCTEXT("MoveActorsTransactionName", "MoveActors")); + + // For each selected actor + for (FSelectionIterator Iter(*SelectedActors); Iter; ++Iter) + { + if (AActor* LevelActor = Cast(*Iter)) + { + // Register actor in opened transaction (undo/redo) + LevelActor->Modify(); + // Move actor to given location + LevelActor->TeleportTo(LevelActor->GetActorLocation() + InOffset, FRotator(0, 0, 0)); + } + } + + // We're done moving actors so close transaction + GEditor->EndTransaction(); + + return FReply::Handled(); + } + + static TSharedRef MakeButton(FText InLabel, const FVector InOffset) + { + return SNew(SButton) + .Text(InLabel) + .OnClicked_Static(&Locals::OnButtonClick, InOffset); + } + }; + + const float Factor = 256.0f; + + SAssignNew(ToolkitWidget, SBorder) + .HAlign(HAlign_Center) + .Padding(25) + .IsEnabled_Static(&Locals::IsWidgetEnabled) + [ + SNew(SVerticalBox) + + SVerticalBox::Slot() + .AutoHeight() + .HAlign(HAlign_Center) + .Padding(50) + [ + SNew(STextBlock) + .AutoWrapText(true) + .Text(LOCTEXT("HelperLabel", "Select some actors and move them around using buttons below")) + ] + + SVerticalBox::Slot() + .HAlign(HAlign_Center) + .AutoHeight() + [ + Locals::MakeButton(LOCTEXT("UpButtonLabel", "Up"), FVector(0, 0, Factor)) + ] + + SVerticalBox::Slot() + .HAlign(HAlign_Center) + .AutoHeight() + [ + SNew(SHorizontalBox) + + SHorizontalBox::Slot() + .AutoWidth() + [ + Locals::MakeButton(LOCTEXT("LeftButtonLabel", "Left"), FVector(0, -Factor, 0)) + ] + + SHorizontalBox::Slot() + .AutoWidth() + [ + Locals::MakeButton(LOCTEXT("RightButtonLabel", "Right"), FVector(0, Factor, 0)) + ] + ] + + SVerticalBox::Slot() + .HAlign(HAlign_Center) + .AutoHeight() + [ + Locals::MakeButton(LOCTEXT("DownButtonLabel", "Down"), FVector(0, 0, -Factor)) + ] + + ]; + + FModeToolkit::Init(InitToolkitHost); +} + +FName FForestImporterEdModeToolkit::GetToolkitFName() const +{ + return FName("ForestImporterEdMode"); +} + +FText FForestImporterEdModeToolkit::GetBaseToolkitName() const +{ + return NSLOCTEXT("ForestImporterEdModeToolkit", "DisplayName", "ForestImporterEdMode Tool"); +} + +class FEdMode* FForestImporterEdModeToolkit::GetEditorMode() const +{ + return GLevelEditorModeTools().GetActiveMode(FForestImporterEdMode::EM_ForestImporterEdModeId); +} + +#undef LOCTEXT_NAMESPACE diff --git a/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporter.h b/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporter.h new file mode 100644 index 0000000..5f4f314 --- /dev/null +++ b/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporter.h @@ -0,0 +1,15 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Modules/ModuleManager.h" + +class FForestImporterModule : public IModuleInterface +{ +public: + + /** IModuleInterface implementation */ + virtual void StartupModule() override; + virtual void ShutdownModule() override; +}; diff --git a/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporterEdMode.h b/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporterEdMode.h new file mode 100644 index 0000000..cfb86ad --- /dev/null +++ b/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporterEdMode.h @@ -0,0 +1,24 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "EdMode.h" + +class FForestImporterEdMode : public FEdMode +{ +public: + const static FEditorModeID EM_ForestImporterEdModeId; +public: + FForestImporterEdMode(); + virtual ~FForestImporterEdMode(); + + // FEdMode interface + virtual void Enter() override; + virtual void Exit() override; + //virtual void Tick(FEditorViewportClient* ViewportClient, float DeltaTime) override; + //virtual void Render(const FSceneView* View, FViewport* Viewport, FPrimitiveDrawInterface* PDI) override; + //virtual void ActorSelectionChangeNotify() override; + bool UsesToolkits() const override; + // End of FEdMode interface +}; diff --git a/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporterEdModeToolkit.h b/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporterEdModeToolkit.h new file mode 100644 index 0000000..49d2f1f --- /dev/null +++ b/Plugins/ForestImporter/Source/ForestImporter/Public/ForestImporterEdModeToolkit.h @@ -0,0 +1,26 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#pragma once + +#include "CoreMinimal.h" +#include "Toolkits/BaseToolkit.h" + +class FForestImporterEdModeToolkit : public FModeToolkit +{ +public: + + FForestImporterEdModeToolkit(); + + /** FModeToolkit interface */ + virtual void Init(const TSharedPtr& InitToolkitHost) override; + + /** IToolkit interface */ + virtual FName GetToolkitFName() const override; + virtual FText GetBaseToolkitName() const override; + virtual class FEdMode* GetEditorMode() const override; + virtual TSharedPtr GetInlineContent() const override { return ToolkitWidget; } + +private: + + TSharedPtr ToolkitWidget; +}; diff --git a/Source/lidarforest/lidarforest.Build.cs b/Source/lidarforest/lidarforest.Build.cs index f053888..4380768 100644 --- a/Source/lidarforest/lidarforest.Build.cs +++ b/Source/lidarforest/lidarforest.Build.cs @@ -8,7 +8,7 @@ public class lidarforest : ModuleRules { PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs; - PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore" }); + PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "ForestImporter"}); PrivateDependencyModuleNames.AddRange(new string[] { }); diff --git a/lidarforest.uproject b/lidarforest.uproject index b5ab01a..ed7c2c0 100644 --- a/lidarforest.uproject +++ b/lidarforest.uproject @@ -7,7 +7,10 @@ { "Name": "lidarforest", "Type": "Runtime", - "LoadingPhase": "Default" + "LoadingPhase": "Default", + "AdditionalDependencies": [ + "Engine" + ] } ], "Plugins": [ @@ -33,6 +36,31 @@ { "Name": "HDRIBackdrop", "Enabled": true + }, + { + "Name": "FileSDK", + "Enabled": true, + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/4f737815666c4e7dabf2043fb55a8419" + }, + { + "Name": "BlueprintJson", + "Enabled": true, + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/f837e4835fbc434a853fe1ead2410b84" + }, + { + "Name": "EasyFileDialog", + "Enabled": true, + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/product/bcf64fe2e00c48189d8385a9c39b6e61" + }, + { + "Name": "ElectronicNodes", + "Enabled": true, + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/5cb2a394d0c04e73891762be4cbd7216" + }, + { + "Name": "DarkerNodes", + "Enabled": true, + "MarketplaceURL": "com.epicgames.launcher://ue/marketplace/content/4b3441f0228a40ec9ca986489a5bd682" } ] } \ No newline at end of file