/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ #ifndef TWP_UTIL_H #define TWP_UTIL_H #include "common/formats/json.h" #include "common/hashmap.h" #include "common/rect.h" #include "math/vector2d.h" #include "math/matrix4.h" #include "twp/ids.h" #include "twp/objectanimation.h" namespace Twp { enum class Facing; } namespace Common { template<> struct Hash : public UnaryFunction { uint operator()(Twp::Facing val) const { return (uint)val; } }; } // namespace Common namespace Twp { class Object; struct Vector2i { int x = 0; int y = 0; Vector2i() {} Vector2i(int x_, int y_) : x(x_), y(y_) {} Vector2i(float x_, float y_) : x(round(x_)), y(round(y_)) {} explicit Vector2i(const Math::Vector2d &p) : x(round(p.getX())), y(round(p.getY())) {} explicit operator Math::Vector2d() const { return Math::Vector2d(x, y); } Vector2i operator-(const Vector2i &v) const { return Vector2i(x - v.x, y - v.y); } Vector2i operator+(const Vector2i &v) const { return Vector2i(x + v.x, y + v.y); } Vector2i operator*(float f) const { return Vector2i(x * f, y * f); } Vector2i operator/(float f) const { return Vector2i(x / f, y / f); } }; // general util template > using unique_ptr = Common::ScopedPtr; // game util Facing getFacing(int dir, Facing facing); Facing flip(Facing facing); Facing getFacingToFaceTo(Common::SharedPtr actor, Common::SharedPtr obj); // parsing util bool toBool(const Common::JSONObject &jNode, const Common::String &key); Math::Vector2d parseVec2(const Common::String &s); Common::Rect parseRect(const Common::String &s); void parseObjectAnimations(const Common::JSONArray &jAnims, Common::Array &anims); // array util template size_t find(const Common::Array &array, const T &o) { for (size_t i = 0; i < array.size(); i++) { if (array[i] == o) { return i; } } return (size_t)-1; } template size_t find(const Common::Array > &array, const T *o) { for (size_t i = 0; i < array.size(); i++) { if (array[i].get() == o) { return i; } } return (size_t)-1; } template size_t minIndex(const Common::Array &values) { if (values.empty()) return (size_t)-1; T min = values[0]; size_t index = 0; for (size_t i = 1; i < values.size(); i++) { if (values[i] < min) { index = i; min = values[i]; } } return index; } template Common::Array reverse(const Common::Array &arr) { Common::Array result(arr.size()); for (size_t i = 0; i < arr.size(); i++) { result[arr.size() - 1 - i] = arr[i]; } return result; } // string util Common::String join(const Common::Array &array, const Common::String &sep); Common::String remove(const Common::String &txt, char startC, char endC); Common::String replaceAll(const Common::String &s, const Common::String &what, const Common::String &by); // math util void scale(Math::Matrix4 &m, const Math::Vector2d &v); Math::Vector2d operator*(const Math::Vector2d &v, float f); float distance(const Math::Vector2d &p1, const Math::Vector2d &p2); float distanceSquared(const Math::Vector2d &p1, const Math::Vector2d &p2); float distanceToSegment(const Math::Vector2d &p, const Math::Vector2d &v, const Math::Vector2d &w); float dot(const Math::Vector2d &u, const Math::Vector2d &v); float length(const Math::Vector2d &v); bool lineSegmentsCross(const Math::Vector2d &a, const Math::Vector2d &b, const Math::Vector2d &c, const Math::Vector2d &d); } // namespace Twp #endif