From 2900832256e5b772687c490ac0f473aa62d4c361 Mon Sep 17 00:00:00 2001 From: MichalBiesek Date: Mon, 24 Feb 2025 11:54:10 +0100 Subject: [PATCH] #30 Draw vectors as arrows Draw vectors as arrows. Added ArrowSprite class --- include/Graphics/BartaSprite.h | 9 +++- include/Graphics/SpriteBuilder/ArrowSprite.h | 27 ++++++++++ include/Graphics/SpriteBuilder/SpriteMerger.h | 3 ++ include/pch.h | 5 ++ lib/Geometrics/Vector2f.cpp | 2 +- lib/Graphics/SFML_GraphicsBridge.cpp | 52 +++++++++++++++++++ lib/Graphics/SpriteBuilder/SpriteMerger.cpp | 23 ++++++++ lib/Objects/Rigid/RigidObjectRepository.cpp | 3 ++ 8 files changed, 122 insertions(+), 2 deletions(-) create mode 100644 include/Graphics/SpriteBuilder/ArrowSprite.h diff --git a/include/Graphics/BartaSprite.h b/include/Graphics/BartaSprite.h index 94dc299..8f36087 100644 --- a/include/Graphics/BartaSprite.h +++ b/include/Graphics/BartaSprite.h @@ -29,7 +29,14 @@ enum class SpriteType { * color2 (rgba), * color3 (rgba) */ - TRIANGLE + TRIANGLE, + /* + x, y, z, // orgin of vector + dx, dy, dz, // delta of vector + thickness, + color(rgba) + */ + ARROW }; class BartaSprite { diff --git a/include/Graphics/SpriteBuilder/ArrowSprite.h b/include/Graphics/SpriteBuilder/ArrowSprite.h new file mode 100644 index 0000000..41784ef --- /dev/null +++ b/include/Graphics/SpriteBuilder/ArrowSprite.h @@ -0,0 +1,27 @@ +#pragma once +#include "../Color.h" +#include "../../Geometrics/Vector2f.h" + +namespace Barta { +struct ArrowSprite { +public: + ArrowSprite( + Vector2f ogrin, + Vector2f value, + float thickness, + float capSize, + Color color + ) noexcept: + ogrin(ogrin), + value(value), + thickness(thickness), + capSize(capSize), + color(color) {} + + const Vector2f ogrin; + const Vector2f value; + const float thickness; + const float capSize; + const Color color; +}; +} diff --git a/include/Graphics/SpriteBuilder/SpriteMerger.h b/include/Graphics/SpriteBuilder/SpriteMerger.h index 68601c2..1d8243a 100644 --- a/include/Graphics/SpriteBuilder/SpriteMerger.h +++ b/include/Graphics/SpriteBuilder/SpriteMerger.h @@ -6,6 +6,7 @@ #include "SpriteBuilder.h" #include "StringSprite.h" #include "TriangleSprite.h" +#include "ArrowSprite.h" namespace Barta { class SpriteMerger { @@ -20,6 +21,8 @@ class SpriteMerger { SpriteMerger* addTriangle(const TriangleSprite& triangleSprite); + SpriteMerger* addArrow(const ArrowSprite& arrowSprite); + BartaSprite merge(bool reloadCache); protected: diff --git a/include/pch.h b/include/pch.h index 7ae11aa..523b985 100644 --- a/include/pch.h +++ b/include/pch.h @@ -32,3 +32,8 @@ // C++ 20+ #include + + +#ifndef M_PI + #define M_PI 3.141592f +#endif \ No newline at end of file diff --git a/lib/Geometrics/Vector2f.cpp b/lib/Geometrics/Vector2f.cpp index 416a203..7408d0d 100644 --- a/lib/Geometrics/Vector2f.cpp +++ b/lib/Geometrics/Vector2f.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include Barta::Vector2f::Vector2f( const Vector2f& second diff --git a/lib/Graphics/SFML_GraphicsBridge.cpp b/lib/Graphics/SFML_GraphicsBridge.cpp index 7f8a3c1..c7382b7 100644 --- a/lib/Graphics/SFML_GraphicsBridge.cpp +++ b/lib/Graphics/SFML_GraphicsBridge.cpp @@ -1,6 +1,7 @@ #include #include #include +#include Barta::SFML_GraphicsBridge::SFML_GraphicsBridge( std::unique_ptr resourceContainer, @@ -239,6 +240,57 @@ void Barta::SFML_GraphicsBridge::handleCustomResource( dataOffset += 3 * 3 + 4 * 3; } + + if (type == SpriteType::ARROW) { + + float posarr[2] = {data[dataOffset],data[dataOffset+1]}; + float valuearr[2] = {data[dataOffset+2],data[dataOffset+3]}; + float thikness = data[dataOffset+4]; + float capSize = data[dataOffset+5]; + + Vector2f x={posarr[0],posarr[1]}; + Vector2f dx={valuearr[0],valuearr[1]}; + //dx=dx.rotated(1.0); + + Vector2f dxNorm=dx.normalised(); + Vector2f n = dx.perpendicular().normalised(); + + //coords line + Vector2f x1=x-thikness*n*0.5; + Vector2f x2=x+thikness*n*0.5; + Vector2f x1v=x1+dx-capSize*dxNorm;//.rotated(0.2); + Vector2f x2v=x2+dx-capSize*dxNorm;//.rotated(0.2); + // + Vector2f C=x+dx; + Vector2f A=x-capSize*n+dx-capSize*dxNorm; + Vector2f B=x+capSize*n+dx-capSize*dxNorm; + + sf::Color c=sf::Color( + static_cast(data[dataOffset + 6]), + static_cast(data[dataOffset + 7]), + static_cast(data[dataOffset + 8]), + static_cast(data[dataOffset + 9]) + ); + + auto triangle = sf::VertexArray(sf::PrimitiveType::Triangles, 9); + + triangle[0]=sf::Vertex(transform.transformPoint(x1.x,x1.y),c); + triangle[1]=sf::Vertex(transform.transformPoint(x2.x,x2.y),c); + triangle[2]=sf::Vertex(transform.transformPoint(x1v.x,x1v.y),c); + + triangle[3]=sf::Vertex(transform.transformPoint(x1v.x,x1v.y),c); + triangle[4]=sf::Vertex(transform.transformPoint(x2.x,x2.y),c); + triangle[5]=sf::Vertex(transform.transformPoint(x2v.x,x2v.y),c); + + triangle[6]=sf::Vertex(transform.transformPoint(A.x,A.y),c); + triangle[7]=sf::Vertex(transform.transformPoint(B.x,B.y),c); + triangle[8]=sf::Vertex(transform.transformPoint(C.x,C.y),c); + + this->sf_window->draw(triangle); + + dataOffset += 2+2+1+1+4; + } + } } diff --git a/lib/Graphics/SpriteBuilder/SpriteMerger.cpp b/lib/Graphics/SpriteBuilder/SpriteMerger.cpp index af2ca5f..b3eaccc 100644 --- a/lib/Graphics/SpriteBuilder/SpriteMerger.cpp +++ b/lib/Graphics/SpriteBuilder/SpriteMerger.cpp @@ -90,6 +90,29 @@ Barta::SpriteMerger* Barta::SpriteMerger::addTriangle( return this; } +Barta::SpriteMerger* Barta::SpriteMerger::addArrow( + const ArrowSprite& arrowSprite +) { + this->types.push_back(SpriteType::ARROW); + + for (const auto& vector: {arrowSprite.ogrin,arrowSprite.value}) { + this->data.push_back(vector.getX()); + this->data.push_back(vector.getY()); + } + + this->data.push_back(arrowSprite.thickness); + this->data.push_back(arrowSprite.capSize); + + for (const auto& color: {arrowSprite.color}) { + this->data.push_back(color.r); + this->data.push_back(color.g); + this->data.push_back(color.b); + this->data.push_back(color.a); + } + + return this; +} + Barta::BartaSprite Barta::SpriteMerger::merge( bool reloadCache ) { diff --git a/lib/Objects/Rigid/RigidObjectRepository.cpp b/lib/Objects/Rigid/RigidObjectRepository.cpp index 6620ec1..0595619 100644 --- a/lib/Objects/Rigid/RigidObjectRepository.cpp +++ b/lib/Objects/Rigid/RigidObjectRepository.cpp @@ -28,6 +28,7 @@ Barta::RigidObjectInterface* Barta::RigidObjectRepository::addNewAABB( spriteBuilder.setAllColors(color); auto merger = SpriteMerger(); merger.addRectangleWithColors(spriteBuilder.build()); + // merger.add auto aabb = new RigidObject( { Barta::SFML_GraphicsBridge::createNewTransformableInstance(), @@ -52,6 +53,8 @@ Barta::RigidObjectInterface* Barta::RigidObjectRepository::addNewCircle( ) { auto merger = SpriteMerger(); merger.addCircleSprite(CircleSprite(Circle(radius, Vector2f(radius, radius)), color)); + merger.addArrow(ArrowSprite(Vector2f(radius, radius),Vector2f(radius*0.5f,radius*3.5f),radius*0.2f,radius*0.5, + Color(255,255,255))); auto circle = new RigidObject( { Barta::SFML_GraphicsBridge::createNewTransformableInstance(),