#include "ImageCanvasComponent.hpp" #include "Helpers/ConvertVec.hpp" #include "Helpers/MathExtras.hpp" #include "Helpers/SCollision.hpp" #include "../SharedTypes.hpp" #include "../World.hpp" #include "../MainProgram.hpp" #include #include "../DrawCollision.hpp" #include "CanvasComponentContainer.hpp" CanvasComponentType ImageCanvasComponent::get_type() const { return CanvasComponentType::IMAGE; } void ImageCanvasComponent::save(cereal::PortableBinaryOutputArchive& a) const { a(d.p1, d.p2, d.imageID); } void ImageCanvasComponent::load(cereal::PortableBinaryInputArchive& a) { a(d.p1, d.p2, d.imageID); } void ImageCanvasComponent::save_file(cereal::PortableBinaryOutputArchive& a) const { a(d.p1, d.p2, d.imageID); } void ImageCanvasComponent::load_file(cereal::PortableBinaryInputArchive& a, VersionNumber version) { a(d.p1, d.p2, d.imageID); } void ImageCanvasComponent::draw_download_progress_bar(SkCanvas* canvas, const DrawData& drawData, float progress) const { if(progress == 0.0f) return; if(compContainer->should_draw(drawData)) { canvas->save(); compContainer->canvas_do_transform(canvas, compContainer->calculate_draw_transform(drawData)); SkPaint p; p.setStroke(true); p.setStrokeWidth(10.0f); p.setStrokeCap(SkPaint::kRound_Cap); p.setColor4f(drawData.main->toolbar.io->theme->fillColor1); Vector2f center = convert_vec2(imRect.center()); const float DOWNLOAD_ARC_RADIUS = 50.0f; canvas->drawArc(SkRect::MakeLTRB(center.x() - DOWNLOAD_ARC_RADIUS, center.y() - DOWNLOAD_ARC_RADIUS, center.x() + DOWNLOAD_ARC_RADIUS, center.y() + DOWNLOAD_ARC_RADIUS), 0.0f, progress * 360.0f, false, p); canvas->restore(); } } void ImageCanvasComponent::set_data_from(const CanvasComponent& other) { auto& otherImage = static_cast(other); d = otherImage.d; } void ImageCanvasComponent::draw(SkCanvas* canvas, const DrawData& drawData) const { ResourceDisplay* display = drawData.rMan->get_display_data(d.imageID); if(display) display->draw(canvas, drawData, imRect); else canvas->drawRect(imRect, SkPaint({0.5f, 0.5f, 0.5f, 0.5f})); } void ImageCanvasComponent::update(DrawingProgram& drawP) { ResourceDisplay* display = drawP.world.drawData.rMan->get_display_data(d.imageID); if(display) { if(display->update_draw()) drawP.drawCache.invalidate_cache_at_aabb(compContainer->get_world_bounds()); } } void ImageCanvasComponent::initialize_draw_data(DrawingProgram& drawP) { create_draw_data(); create_collider(); } bool ImageCanvasComponent::collides_within_coords(const SCollision::ColliderCollection& checkAgainst) const { return collisionTree.is_collide(checkAgainst); } void ImageCanvasComponent::create_draw_data() { imRect = SkRect::MakeLTRB(d.p1.x(), d.p1.y(), d.p2.x(), d.p2.y()); } void ImageCanvasComponent::create_collider() { using namespace SCollision; ColliderCollection strokeObjects; std::array newT = triangle_from_rect_points(d.p1, d.p2); strokeObjects.triangle.emplace_back(newT[0], newT[1], newT[2]); strokeObjects.triangle.emplace_back(newT[2], newT[3], newT[0]); collisionTree.clear(); collisionTree.calculate_bvh_recursive(strokeObjects); } SCollision::AABB ImageCanvasComponent::get_obj_coord_bounds() const { return collisionTree.objects.bounds; }