From 14480a67b2b98ed6b614652c403ff99c54818143 Mon Sep 17 00:00:00 2001 From: Sebi <pape@vr.rwth-aachen.de> Date: Tue, 23 Apr 2024 16:40:59 +0200 Subject: [PATCH] Implementing 3D Cursor & Crosshair, fixing many internal things, improving box shader & font rendering --- Source/DasherVR/Private/Dasher3DWidget.cpp | 59 +++++++++++++------- Source/DasherVR/Private/SDasherWidget.cpp | 7 ++- Source/DasherVR/Public/Dasher3DWidget.h | 9 ++- Source/Thirdparty/Dasher/DasherCore | 2 +- Source/Thirdparty/Dasher/Lib/DasherCore.lib | 4 +- Source/Thirdparty/Dasher/Lib/DasherCore.pdb | Bin 10326016 -> 10448896 bytes 6 files changed, 52 insertions(+), 29 deletions(-) diff --git a/Source/DasherVR/Private/Dasher3DWidget.cpp b/Source/DasherVR/Private/Dasher3DWidget.cpp index d52de31..131080e 100644 --- a/Source/DasherVR/Private/Dasher3DWidget.cpp +++ b/Source/DasherVR/Private/Dasher3DWidget.cpp @@ -13,20 +13,21 @@ ADasher3DWidget::ADasher3DWidget() : DasherParents() PrimaryActorTick.bCanEverTick = true; ActorRootComponent = CreateDefaultSubobject<UStaticMeshComponent>("Root"); + ActorRootComponent->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); SetRootComponent(ActorRootComponent); CubeInstances = CreateDefaultSubobject<UInstancedStaticMeshComponent>("Cubes"); CubeInstances->SetupAttachment(GetRootComponent()); CubeInstances->SetFlags(RF_Transactional); CubeInstances->NumCustomDataFloats = 7; //Color(3), Scale(3), LineWidth(1) - CubeInstances->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); + CubeInstances->SetCollisionResponseToChannel(ECC_Visibility, ECR_Block); this->AddInstanceComponent(CubeInstances); LetterInstances = CreateDefaultSubobject<UInstancedStaticMeshComponent>("Letters"); LetterInstances->SetupAttachment(GetRootComponent()); LetterInstances->SetFlags(RF_Transactional); LetterInstances->NumCustomDataFloats = 5; //UV(2), Size(2), TexturePage(1) - LetterInstances->SetCollisionResponseToAllChannels(ECollisionResponse::ECR_Ignore); + LetterInstances->SetCollisionResponseToAllChannels(ECR_Ignore); this->AddInstanceComponent(LetterInstances); } @@ -37,6 +38,9 @@ void ADasher3DWidget::PostInitializeComponents() CubeMaterialInstanceDynamic = UMaterialInstanceDynamic::Create(CubeInstances->GetMaterial(0), CubeInstances); CubeInstances->SetMaterial(0, CubeMaterialInstanceDynamic); + + LetterMaterialInstanceDynamic = UMaterialInstanceDynamic::Create(LetterInstances->GetMaterial(0), LetterInstances); + LetterInstances->SetMaterial(0, LetterMaterialInstanceDynamic); } // Called when the game starts or when spawned @@ -63,8 +67,10 @@ void ADasher3DWidget::Tick(float DeltaTime) std::pair<Dasher::screenint, Dasher::screenint> ADasher3DWidget::TextSize(Label* label, unsigned iFontSize) { - char CurrentChar = label->m_strText[0]; + FString labelText = UTF8_TO_TCHAR(label->m_strText.c_str()); + TCHAR CurrentChar = labelText[0]; if (CurrentChar < 32) CurrentChar = 32; // replace non-printable characters with spaces. + CurrentChar = DisplayFont->RemapChar(CurrentChar); const float FontScale = iFontSize / DisplayFont->ImportOptions.Height; const float CharacterSizeU = DisplayFont->Characters[CurrentChar].USize; // Pixel Sizes for actual character without blank space @@ -80,7 +86,7 @@ std::pair<Dasher::screenint, Dasher::screenint> ADasher3DWidget::TextSize(Label* void ADasher3DWidget::DrawString(Label* label, Dasher::screenint x, Dasher::screenint y, unsigned iFontSize, const Dasher::ColorPalette::Color& color){} -void ADasher3DWidget::DrawCube(Dasher::screenint posX, Dasher::screenint posY, Dasher::screenint sizeX, Dasher::screenint sizeY, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, Dasher::myint levelUnderCrosshair, const Dasher::ColorPalette::Color& color, const Dasher::ColorPalette::Color& outlineColor, int iThickness) { +void ADasher3DWidget::DrawCube(Dasher::screenint posX, Dasher::screenint posY, Dasher::screenint sizeX, Dasher::screenint sizeY, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, const Dasher::ColorPalette::Color& color, const Dasher::ColorPalette::Color& outlineColor, int iThickness) { if (sizeX == 0 || sizeY == 0) return; const FVector Scale = FVector(FVector2D(sizeX, sizeY) / DrawingSize, @@ -90,7 +96,7 @@ void ADasher3DWidget::DrawCube(Dasher::screenint posX, Dasher::screenint posY, D const FLinearColor RectColor = FLinearColor(color.Red / 255.0, color.Green / 255.0, color.Blue / 255.0, color.Alpha / 255.0); - BackBuffer->first.Add(FTransform(FQuat::Identity, FVector(Translation, -ExtrusionLevelToHeight(levelUnderCrosshair)) * WorldToMeters, Scale)); + BackBuffer->first.Add(FTransform(FQuat::Identity, FVector(Translation, 0) * WorldToMeters, Scale)); BackBuffer->second.Add(RectColor.R); BackBuffer->second.Add(RectColor.G); BackBuffer->second.Add(RectColor.B); @@ -101,23 +107,25 @@ void ADasher3DWidget::DrawCube(Dasher::screenint posX, Dasher::screenint posY, D } // x & y are given as upper left corner of the character -void ADasher3DWidget::Draw3DLabel(Label* label, Dasher::screenint x, Dasher::screenint y, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, Dasher::myint levelUnderCrosshair, unsigned int iFontSize, const Dasher::ColorPalette::Color& color) { +void ADasher3DWidget::Draw3DLabel(Label* label, Dasher::screenint x, Dasher::screenint y, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, unsigned int iFontSize, const Dasher::ColorPalette::Color& color) { float CharacterOffset = 0; // in Meters - - for (int i = 0; i < label->m_strText.size(); i++) + + FString labelText = UTF8_TO_TCHAR(label->m_strText.c_str()); + for (int i = 0; i < labelText.Len(); i++) { - char CurrentChar = label->m_strText[i]; + TCHAR CurrentChar = labelText[i]; if (CurrentChar < 32) CurrentChar = 32; // replace non-printable characters with spaces. + const TCHAR RemappedChar = DisplayFont->RemapChar(CurrentChar); - const int TextureIndex = DisplayFont->Characters[CurrentChar].TextureIndex; + const int TextureIndex = DisplayFont->Characters[RemappedChar].TextureIndex; const float FontScale = iFontSize / DisplayFont->ImportOptions.Height; - const float TextureSizeU = TextureArray->SourceTextures[TextureIndex]->GetSizeX(); // Pixel Sizes - const float TextureSizeV = TextureArray->SourceTextures[TextureIndex]->GetSizeY(); // Pixel Sizes - const float CharacterOffsetU = DisplayFont->Characters[CurrentChar].StartU; //Upper left corner - const float CharacterOffsetV = DisplayFont->Characters[CurrentChar].StartV; //Upper left corner - const float CharacterSizeU = DisplayFont->Characters[CurrentChar].USize; // Pixel Sizes for actual character without blank space - const float CharacterSizeV = DisplayFont->Characters[CurrentChar].VSize; // Pixel Sizes for actual character without blank space - const float CharacterVerticalOffset = DisplayFont->Characters[CurrentChar].VerticalOffset * FontScale; //vertical offset in pixels + const float TextureSizeU = DisplayFont->Textures[TextureIndex]->GetSizeX(); // Pixel Sizes + const float TextureSizeV = DisplayFont->Textures[TextureIndex]->GetSizeY(); // Pixel Sizes + const float CharacterOffsetU = DisplayFont->Characters[RemappedChar].StartU; //Upper left corner + const float CharacterOffsetV = DisplayFont->Characters[RemappedChar].StartV; //Upper left corner + const float CharacterSizeU = DisplayFont->Characters[RemappedChar].USize; // Pixel Sizes for actual character without blank space + const float CharacterSizeV = DisplayFont->Characters[RemappedChar].VSize; // Pixel Sizes for actual character without blank space + const float CharacterVerticalOffset = DisplayFont->Characters[RemappedChar].VerticalOffset * FontScale; //vertical offset in pixels TArray<float> FontData = { CharacterOffsetU / TextureSizeU, // Upper Left Corner given in UV @@ -136,7 +144,7 @@ void ADasher3DWidget::Draw3DLabel(Label* label, Dasher::screenint x, Dasher::scr const FVector CharTranslation = FVector( (x / DrawingSize.X + CharScale.X * 0.5f) * WorldToMeters + CharacterOffset, ((y + CharacterVerticalOffset) / DrawingSize.Y) * WorldToMeters, - (FMath::Max(ExtrusionLevelToHeight(extrusionLevel), 0.001) - ExtrusionLevelToHeight(levelUnderCrosshair) + groupRecursionDepth*FLT_EPSILON) * WorldToMeters + 0.01f + (FMath::Max(ExtrusionLevelToHeight(extrusionLevel), 0.001) + groupRecursionDepth*0.001) * WorldToMeters + 0.01f ) - FVector(0.5f, 0.5f, 0) * WorldToMeters; // Move to upper left corner of parent @@ -147,9 +155,17 @@ void ADasher3DWidget::Draw3DLabel(Label* label, Dasher::screenint x, Dasher::scr } } +void ADasher3DWidget::FinishRender3D(Dasher::myint originX, Dasher::myint originY, Dasher::myint originExtrusionLevel) +{ + Origin = FVector(originX / DrawingSize.X, originY / DrawingSize.Y, 0) * WorldToMeters; + + CubeInstances->SetRelativeLocation({0,0,-ExtrusionLevelToHeight(originExtrusionLevel) * WorldToMeters}); + LetterInstances->SetRelativeLocation({0,0,-ExtrusionLevelToHeight(originExtrusionLevel) * WorldToMeters}); +} + void ADasher3DWidget::DrawRectangle(Dasher::screenint x1, Dasher::screenint y1, Dasher::screenint x2, Dasher::screenint y2, const Dasher::ColorPalette::Color& color, const Dasher::ColorPalette::Color& outlineColor, int iThickness) { - DrawCube((x2 - x1)/2 + x1, (y2-y1)/2 + y1, x2-x1, y2-y1, 1, 0, 0, color, outlineColor, iThickness); + DrawCube((x2 - x1)/2 + x1, (y2-y1)/2 + y1, x2-x1, y2-y1, 1, 0, color, outlineColor, iThickness); } void ADasher3DWidget::DrawCircle(Dasher::screenint iCX, Dasher::screenint iCY, Dasher::screenint iR, const Dasher::ColorPalette::Color& fillColor, const Dasher::ColorPalette::Color& lineColor, int iLineWidth) @@ -241,8 +257,8 @@ bool ADasher3DWidget::GetScreenCoords(Dasher::screenint& iX, Dasher::screenint& void ADasher3DWidget::SetMouseLocation(FVector WorldLocation) { - FVector2D inp = FVector2D(ActorRootComponent->GetComponentToWorld().InverseTransformPosition(WorldLocation)) / WorldToMeters + FVector2D(0.5f,0.5f); - CursorPosition = inp * DrawingSize; //convert to pixels + MousePos = ActorRootComponent->GetComponentToWorld().InverseTransformPosition(WorldLocation) + FVector(0.5f,0.5f,0) * WorldToMeters; + CursorPosition = FVector2D(MousePos) / WorldToMeters * DrawingSize; //convert to pixels } void ADasher3DWidget::SimulateClick(FKey Key, bool pressed) @@ -265,6 +281,7 @@ void ADasher3DWidget::InitializeTextureArray() TextureArray->SourceTextures.Add(DisplayFont->Textures[i]); } TextureArray->UpdateSourceFromSourceTextures(true); + LetterMaterialInstanceDynamic->SetTextureParameterValue("TextureArray", TextureArray); } float ADasher3DWidget::ExtrusionLevelToHeight(float level) diff --git a/Source/DasherVR/Private/SDasherWidget.cpp b/Source/DasherVR/Private/SDasherWidget.cpp index 3f715fe..c533fc7 100644 --- a/Source/DasherVR/Private/SDasherWidget.cpp +++ b/Source/DasherVR/Private/SDasherWidget.cpp @@ -138,14 +138,15 @@ void SDasherWidget::Construct(const FArguments& InArgs) //Setting up Dasher static Dasher::XMLErrorDisplay display; - Dasher::XmlSettingsStore* Settings = new Dasher::XmlSettingsStore("Settings.xml", &display); //Gets deleted somewhere else - Settings->Load(); + Dasher::XmlSettingsStore* Settings = new Dasher::XmlSettingsStore("Settings.xml", &display); //Gets deleted somewhere else + Settings->Load(); Settings->Save(); - DasherMainInterface = MakeShared<Dasher::DasherInterface>(Settings); + DasherMainInterface = MakeShared<Dasher::DasherInterface>(Settings); DasherMainInterface->SetDefaultInputDevice(this); DasherMainInterface->SetScreen(this); DasherMainInterface->SetBuffer(0); + DasherMainInterface->SetLongParameter(Dasher::LP_SHAPE_TYPE, Dasher::Options::OVERLAPPING_RECTANGLE); DasherMainInterface->SetCharEnteredCallback([this](FString Char, FString Buffer) {CharacterEnteredFlag = true; AlteredChar = Char; }); DasherMainInterface->SetCharDeletedCallback([this](FString Char, FString Buffer) {CharacterDeletedFlag = true; AlteredChar = Char; }); diff --git a/Source/DasherVR/Public/Dasher3DWidget.h b/Source/DasherVR/Public/Dasher3DWidget.h index df3167a..936e407 100644 --- a/Source/DasherVR/Public/Dasher3DWidget.h +++ b/Source/DasherVR/Public/Dasher3DWidget.h @@ -43,8 +43,9 @@ public: virtual std::pair<Dasher::screenint, Dasher::screenint> TextSize(Label* label, unsigned iFontSize) override; virtual void DrawString(Label* label, Dasher::screenint x, Dasher::screenint y, unsigned iFontSize, const Dasher::ColorPalette::Color& color) override; virtual void DrawRectangle(Dasher::screenint x1, Dasher::screenint y1, Dasher::screenint x2, Dasher::screenint y2, const Dasher::ColorPalette::Color& color, const Dasher::ColorPalette::Color& outlineColor, int iThickness) override; - virtual void DrawCube(Dasher::screenint posX, Dasher::screenint posY, Dasher::screenint sizeX, Dasher::screenint sizeY, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, Dasher::myint levelUnderCrosshair, const Dasher::ColorPalette::Color& color, const Dasher::ColorPalette::Color& outlineColor, int iThickness) override; - virtual void Draw3DLabel(Label* label, Dasher::screenint x, Dasher::screenint y, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, Dasher::myint levelUnderCrosshair, unsigned int iFontSize, const Dasher::ColorPalette::Color& color) override; + virtual void DrawCube(Dasher::screenint posX, Dasher::screenint posY, Dasher::screenint sizeX, Dasher::screenint sizeY, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, const Dasher::ColorPalette::Color& color, const Dasher::ColorPalette::Color& outlineColor, int iThickness) override; + virtual void Draw3DLabel(Label* label, Dasher::screenint x, Dasher::screenint y, Dasher::myint extrusionLevel, Dasher::myint groupRecursionDepth, unsigned int iFontSize, const Dasher::ColorPalette::Color& color) override; + virtual void FinishRender3D(Dasher::myint originX, Dasher::myint originY, Dasher::myint originExtrusionLevel) override; virtual void DrawCircle(Dasher::screenint iCX, Dasher::screenint iCY, Dasher::screenint iR, const Dasher::ColorPalette::Color& fillColor, const Dasher::ColorPalette::Color& lineColor, int iLineWidth) override; virtual void Polyline(point* Points, int Number, int iWidth, const Dasher::ColorPalette::Color& color) override; virtual void Polygon(point* Points, int Number, const Dasher::ColorPalette::Color& fillColor, const Dasher::ColorPalette::Color& outlineColor, int lineWidth) override; @@ -62,10 +63,13 @@ public: UPROPERTY(EditAnywhere) UFont* DisplayFont; UPROPERTY(EditAnywhere) UMaterial* FontMaterial; UPROPERTY(EditAnywhere) float DepthScale = 0.1; + UPROPERTY(EditAnywhere, BlueprintReadOnly) FVector Origin = {0,0,0}; + UPROPERTY(EditAnywhere, BlueprintReadOnly) FVector MousePos = {0,0,0}; UFUNCTION(BlueprintCallable) void SetMouseLocation(FVector WorldLocation); UFUNCTION(BlueprintCallable) void SimulateClick(FKey Key, bool pressed); virtual void PostInitializeComponents() override; + private: FVector2D CursorPosition; @@ -73,6 +77,7 @@ private: FVector2D DrawingSize = {1000,1000}; // Rendering Resolution TSharedPtr<Dasher::DasherInterface> DasherMainInterface; UPROPERTY() UMaterialInstanceDynamic* CubeMaterialInstanceDynamic; + UPROPERTY() UMaterialInstanceDynamic* LetterMaterialInstanceDynamic; UPROPERTY() UTexture2DArray* TextureArray; FVector DefaultTranslation; diff --git a/Source/Thirdparty/Dasher/DasherCore b/Source/Thirdparty/Dasher/DasherCore index a061849..841a75e 160000 --- a/Source/Thirdparty/Dasher/DasherCore +++ b/Source/Thirdparty/Dasher/DasherCore @@ -1 +1 @@ -Subproject commit a061849126815c95bda625aee511b63030904236 +Subproject commit 841a75e6a3410f40a44696a5ba4b224fac32566c diff --git a/Source/Thirdparty/Dasher/Lib/DasherCore.lib b/Source/Thirdparty/Dasher/Lib/DasherCore.lib index 0541fb6..211eee4 100644 --- a/Source/Thirdparty/Dasher/Lib/DasherCore.lib +++ b/Source/Thirdparty/Dasher/Lib/DasherCore.lib @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:461b5d6f6fec5470088444f0467fd5a7ed51f135bef940b1fc1142d950a950dd -size 19978948 +oid sha256:6b5181c3f79660521838bb8c41ba794ef0520053e866f40be22e12913b5de066 +size 20109586 diff --git a/Source/Thirdparty/Dasher/Lib/DasherCore.pdb b/Source/Thirdparty/Dasher/Lib/DasherCore.pdb index 130b41dcca7bc1dfc61498ffa647656a8c135793..c5fff29c9228c3de21efa84677b30bac89437b21 100644 GIT binary patch delta 64907 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 aif1_)7^t5VH##ygbHUQmSI&)&-}nK=N|H$c delta 11740 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 -- GitLab