From 3a571adaa3ffd2d511227ea236debac33ea68423 Mon Sep 17 00:00:00 2001 From: Frank DeMarco Date: Tue, 1 Sep 2020 17:00:17 -0400 Subject: [PATCH] segment comparison operators; get sdl surface from pixels --- demo/Demo.cpp | 3 ++- src/Pixels.hpp | 2 +- src/Segment.cpp | 30 ++++++++++++++++++++++++++++-- src/Segment.hpp | 27 +++++++++++++++++++++++++-- src/Sprite.cpp | 11 +++++++---- src/Sprite.hpp | 2 +- src/extension.cpp | 47 ++++++++++++++++++++--------------------------- src/extension.hpp | 9 ++------- 8 files changed, 86 insertions(+), 45 deletions(-) diff --git a/demo/Demo.cpp b/demo/Demo.cpp index 953fa50..229e088 100644 --- a/demo/Demo.cpp +++ b/demo/Demo.cpp @@ -15,7 +15,8 @@ node children list, node animations list, copy constructor for all base classes, private and public class members, pixel class iterator, sprite movement history, input history, use seconds instead of milliseconds, store - a node's animations in list + a node's animations in list, frame object for sprite class, inline short + functions :) SWEATY HANDS :) OILY SNACKS :) AND BAD HYGIENE :) diff --git a/src/Pixels.hpp b/src/Pixels.hpp index f01da21..8ab0831 100644 --- a/src/Pixels.hpp +++ b/src/Pixels.hpp @@ -29,7 +29,7 @@ struct Pixels ~Pixels(); template - T operator()(int x, int y) + T operator()(int x = 0, int y = 0) { std::uint8_t* access = static_cast(source); if (x < 0 || x >= rect.w) diff --git a/src/Segment.cpp b/src/Segment.cpp index 50f8eb4..1d60454 100644 --- a/src/Segment.cpp +++ b/src/Segment.cpp @@ -124,9 +124,35 @@ void Segment::move(const glm::vec2& delta) end += delta; } -glm::vec2 Segment::get_center() +glm::vec2 Segment::get_center() const { - return sfw::get_segments(*this, 2)[0].end; + return get_subsegments(2)[0].end; +} + +glm::vec2 Segment::get_step(float speed) const +{ + float angle = glm::atan(end.x - start.x, end.y - start.y); + return glm::vec2(speed * glm::sin(angle), speed * glm::cos(angle)); +} + +glm::vec2 Segment::get_step_relative(float relative_length_per_step) const +{ + return get_step(glm::distance(start, end) * relative_length_per_step); +} + +std::vector Segment::get_subsegments(int count) const +{ + glm::vec2 step = get_step_relative(1.0f / count); + std::vector subsegments; + subsegments.reserve(count); + glm::vec2 subsegment_start = start, subsegment_end; + for (int ii = 0; ii < count; ii++) + { + subsegment_end = subsegment_start + step; + subsegments.emplace_back(subsegment_start, subsegment_end); + subsegment_start = subsegment_end; + } + return subsegments; } std::ostream& operator<<(std::ostream& out, const Segment& segment) diff --git a/src/Segment.hpp b/src/Segment.hpp index d95b00b..e4401a0 100644 --- a/src/Segment.hpp +++ b/src/Segment.hpp @@ -22,14 +22,37 @@ struct Segment void set_start(const glm::vec2&); glm::vec2 get_end() const; void set_end(const glm::vec2&); - bool intersect(const Segment&, glm::vec2* = NULL) const; + bool intersect(const Segment&, glm::vec2* = nullptr) const; bool intersect(const Segment&, glm::vec2&) const; float get_dx() const; float get_dy() const; float get_length() const; Box get_box() const; void move(const glm::vec2&); - glm::vec2 get_center(); + glm::vec2 get_center() const; + glm::vec2 get_step(float) const; + glm::vec2 get_step_relative(float) const; + std::vector get_subsegments(int) const; + inline bool operator<(const Segment& segment) const { return operator<(segment.get_length()); } + + /* + std::cout << (a < b) << (a > b) << (b < c) << (b <= c) << (c > b) << (c >= b) << (d < 1) << (d < 2) << + (d >= a) << (d > c) << std::endl; + + should print 0101010101 + */ + + template + inline bool operator<(const N& other) const { return get_length() < other; } + + template + inline bool operator>(const N& other) const { return other < get_length(); } + + template + inline bool operator<=(const N& other) const { return !operator>(other); } + + template + inline bool operator>=(const N& other) const { return !operator<(other); } }; diff --git a/src/Sprite.cpp b/src/Sprite.cpp index 3a88e0f..da254dc 100644 --- a/src/Sprite.cpp +++ b/src/Sprite.cpp @@ -93,7 +93,7 @@ void Sprite::add_frames(SDL_Texture* frame) all_frames_frameset.clear(); for (std::size_t ii = 0; ii < frames.size(); ii++) { - all_frames_frameset.add_frame_index(ii); + all_frames_frameset.add_frame_indicies(ii); } for (auto& [name, frameset] : framesets) { @@ -782,14 +782,17 @@ Frameset::Frameset() : Frameset(NULL) {} Frameset::Frameset(Sprite* sprite) : sprite(sprite) {} -void Frameset::add_frame_index(int index) +void Frameset::add_frame_indicies(int index) { - add_frame_indicies({index}); + order.push_back(index); } void Frameset::add_frame_indicies(const std::vector& indicies) { - order.insert(order.end(), indicies.begin(), indicies.end()); + for (const int& index : indicies) + { + add_frame_indicies(index); + } } void Frameset::set_frame_length(float length) diff --git a/src/Sprite.hpp b/src/Sprite.hpp index 715d60b..78f3d0a 100644 --- a/src/Sprite.hpp +++ b/src/Sprite.hpp @@ -147,7 +147,7 @@ struct Frameset Frameset(); Frameset(Sprite*); - void add_frame_index(int); + void add_frame_indicies(int); void add_frame_indicies(const std::vector&); void set_frame_length(float); float get_frame_length() const; diff --git a/src/extension.cpp b/src/extension.cpp index 0cb3a66..fa226bf 100644 --- a/src/extension.cpp +++ b/src/extension.cpp @@ -1,32 +1,8 @@ +#include "sdl2-gfx/SDL2_gfxPrimitives.h" + +#include "Pixels.hpp" #include "extension.hpp" -glm::vec2 sfw::get_step(const Segment& segment, float speed) -{ - float angle = glm::atan(segment.end.x - segment.start.x, segment.end.y - segment.start.y); - return glm::vec2(speed * glm::sin(angle), speed * glm::cos(angle)); -} - -glm::vec2 sfw::get_step_relative(const Segment& segment, float relative_length_per_step) -{ - return get_step( - segment, glm::distance(segment.start, segment.end) * relative_length_per_step); -} - -std::vector sfw::get_segments(const Segment& base, int count) -{ - glm::vec2 step = get_step_relative(base, 1.0f / count); - std::vector segments; - segments.reserve(count); - glm::vec2 start = base.start, end; - for (int ii = 0; ii < count; ii++) - { - end = start + step; - segments.emplace_back(start, end); - start = end; - } - return segments; -} - void sfw::set_magnitude(glm::vec2& vector, float magnitude) { vector = glm::normalize(vector) * magnitude; @@ -525,6 +501,23 @@ std::vector sfw::glob(fs::path query) return files; } +SDL_Surface* sfw::get_surface_from_pixels(Pixels& pixels) +{ + SDL_Surface* surface = SDL_CreateRGBSurfaceFrom( + pixels.source, pixels.rect.w, pixels.rect.h, pixels.format->BitsPerPixel, + pixels.get_bytes_per_row(), pixels.format->Rmask, pixels.format->Gmask, pixels.format->Bmask, + pixels.format->Amask); + if (surface == nullptr) + { + print_sdl_error("could not create RGB surface from texture pixel data"); + } + else + { + return surface; + } + return nullptr; +} + fs::path sfw::get_next_file_name( fs::path directory, int zfill, std::string prefix, std::string extension) { diff --git a/src/extension.hpp b/src/extension.hpp index 8a1af74..4947aab 100644 --- a/src/extension.hpp +++ b/src/extension.hpp @@ -25,16 +25,13 @@ #include "Color.hpp" #include "filesystem.hpp" -struct Node; +struct Pixels; namespace sfw { enum scaler {scale2x, xbr}; - glm::vec2 get_step(const Segment&, float); - glm::vec2 get_step_relative(const Segment&, float); - std::vector get_segments(const Segment&, int); void set_magnitude(glm::vec2&, float); Box get_texture_box(SDL_Texture*); std::vector> get_blinds_boxes(glm::vec2, float = 0.05f, int = 4); @@ -58,6 +55,7 @@ namespace sfw SDL_Texture* get_remapped_texture(SDL_Renderer*, SDL_Texture*, const std::map&); SDL_Texture* get_remapped_texture(SDL_Renderer*, const std::string&, const std::map&); SDL_Texture* get_pixel_scaled_texture(SDL_Renderer*, SDL_Texture*, int = 1, int = scaler::scale2x); + SDL_Surface* get_surface_from_pixels(Pixels&); std::vector glob(fs::path); fs::path get_next_file_name( fs::path, int = 0, std::string = "", std::string = ""); @@ -198,7 +196,4 @@ namespace glm } } -#include "Node.hpp" -#include "Pixels.hpp" - #endif