14 #ifndef hifi_RegisteredMetaTypes_h
15 #define hifi_RegisteredMetaTypes_h
17 #include <QtCore/QUuid>
18 #include <QtCore/QUrl>
20 #include <glm/glm.hpp>
21 #include <glm/gtc/quaternion.hpp>
24 #include "ShapeInfo.h"
25 #include "SharedUtil.h"
26 #include "shared/Bilateral.h"
27 #include "Transform.h"
28 #include "PhysicsCollisionGroups.h"
29 #include "StencilMaskMode.h"
34 Q_DECLARE_METATYPE(uint16_t)
35 Q_DECLARE_METATYPE(glm::vec2)
36 Q_DECLARE_METATYPE(glm::u8vec3)
37 Q_DECLARE_METATYPE(glm::vec3)
38 Q_DECLARE_METATYPE(glm::vec4)
39 Q_DECLARE_METATYPE(glm::quat)
40 Q_DECLARE_METATYPE(glm::mat4)
41 Q_DECLARE_METATYPE(QVector<float>)
42 Q_DECLARE_METATYPE(
unsigned int)
43 Q_DECLARE_METATYPE(QVector<unsigned int>)
44 Q_DECLARE_METATYPE(AACube)
45 Q_DECLARE_METATYPE(std::function<
void()>);
46 Q_DECLARE_METATYPE(std::function<QVariant()>);
70 QVariant mat4ToVariant(
const glm::mat4& mat4);
71 glm::mat4 mat4FromVariant(
const QVariant&
object,
bool& valid);
72 glm::mat4 mat4FromVariant(
const QVariant&
object);
88 QVariant vec2ToVariant(
const glm::vec2& vec2);
89 glm::vec2 vec2FromVariant(
const QVariant&
object,
bool& valid);
90 glm::vec2 vec2FromVariant(
const QVariant&
object);
112 QVariant vec3toVariant(
const glm::vec3& vec3);
113 glm::vec3 vec3FromVariant(
const QVariant &
object,
bool& valid);
114 glm::vec3 vec3FromVariant(
const QVariant &
object);
154 QVariant u8vec3toVariant(
const glm::u8vec3& vec3);
155 QVariant u8vec3ColortoVariant(
const glm::u8vec3& vec3);
156 glm::u8vec3 u8vec3FromVariant(
const QVariant &
object,
bool& valid);
157 glm::u8vec3 u8vec3FromVariant(
const QVariant &
object);
168 QVariant vec4toVariant(
const glm::vec4& vec4);
169 glm::vec4 vec4FromVariant(
const QVariant &
object,
bool& valid);
170 glm::vec4 vec4FromVariant(
const QVariant &
object);
173 QVariant quatToVariant(
const glm::quat& quat);
174 glm::quat quatFromVariant(
const QVariant &
object,
bool& isValid);
175 glm::quat quatFromVariant(
const QVariant &
object);
185 QRect qRectFromVariant(
const QVariant&
object,
bool& isValid);
186 QRect qRectFromVariant(
const QVariant&
object);
187 QVariant qRectToVariant(
const QRect& rect);
189 QRectF qRectFFromVariant(
const QVariant&
object,
bool& isValid);
190 QRectF qRectFFromVariant(
const QVariant&
object);
191 QVariant qRectFToVariant(
const QRectF& rect);
196 virtual ~MathPick() {}
197 virtual operator bool()
const = 0;
198 virtual QVariantMap toVariantMap()
const = 0;
209 class PickRay :
public MathPick {
211 PickRay() : origin(NAN), direction(NAN) { }
212 PickRay(
const QVariantMap& pickVariant) : origin(vec3FromVariant(pickVariant[
"origin"])), direction(vec3FromVariant(pickVariant[
"direction"])) {}
213 PickRay(
const glm::vec3& origin,
const glm::vec3 direction) : origin(origin), direction(direction) {}
217 operator bool()
const override {
218 return !(glm::any(glm::isnan(origin)) || glm::any(glm::isnan(direction)));
220 bool operator==(
const PickRay& other)
const {
221 return (origin == other.origin && direction == other.direction);
223 QVariantMap toVariantMap()
const override {
225 pickRay[
"origin"] = vec3toVariant(origin);
226 pickRay[
"direction"] = vec3toVariant(direction);
230 Q_DECLARE_METATYPE(PickRay)
243 class StylusTip :
public MathPick {
245 StylusTip() : position(NAN), velocity(NAN) {}
246 StylusTip(
const bilateral::Side& side,
const glm::vec3& tipOffset = Vectors::ZERO ,
const glm::vec3& position = Vectors::ZERO,
247 const glm::quat& orientation = Quaternions::IDENTITY,
const glm::vec3& velocity = Vectors::ZERO) :
248 side(side), tipOffset(tipOffset), position(position), orientation(orientation), velocity(velocity) {}
249 StylusTip(
const QVariantMap& pickVariant) : side(bilateral::Side(pickVariant[
"side"].toInt())), tipOffset(vec3FromVariant(pickVariant[
"tipOffset"])),
250 position(vec3FromVariant(pickVariant[
"position"])), orientation(quatFromVariant(pickVariant[
"orientation"])), velocity(vec3FromVariant(pickVariant[
"velocity"])) {}
252 bilateral::Side side { bilateral::Side::Invalid };
255 glm::quat orientation;
258 operator bool()
const override {
return side != bilateral::Side::Invalid; }
260 bool operator==(
const StylusTip& other)
const {
261 return (side == other.side && tipOffset == other.tipOffset && position == other.position && orientation == other.orientation && velocity == other.velocity);
264 QVariantMap toVariantMap()
const override {
265 QVariantMap stylusTip;
266 stylusTip[
"side"] = (int)side;
267 stylusTip[
"tipOffset"] = vec3toVariant(tipOffset);
268 stylusTip[
"position"] = vec3toVariant(position);
269 stylusTip[
"orientation"] = quatToVariant(orientation);
270 stylusTip[
"velocity"] = vec3toVariant(velocity);
287 class PickParabola :
public MathPick {
289 PickParabola() : origin(NAN), velocity(NAN), acceleration(NAN) { }
290 PickParabola(
const QVariantMap& pickVariant) : origin(vec3FromVariant(pickVariant[
"origin"])), velocity(vec3FromVariant(pickVariant[
"velocity"])), acceleration(vec3FromVariant(pickVariant[
"acceleration"])) {}
291 PickParabola(
const glm::vec3& origin,
const glm::vec3 velocity,
const glm::vec3 acceleration) : origin(origin), velocity(velocity), acceleration(acceleration) {}
294 glm::vec3 acceleration;
296 operator bool()
const override {
297 return !(glm::any(glm::isnan(origin)) || glm::any(glm::isnan(velocity)) || glm::any(glm::isnan(acceleration)));
299 bool operator==(
const PickParabola& other)
const {
300 return (origin == other.origin && velocity == other.velocity && acceleration == other.acceleration);
302 QVariantMap toVariantMap()
const override {
303 QVariantMap pickParabola;
304 pickParabola[
"origin"] = vec3toVariant(origin);
305 pickParabola[
"velocity"] = vec3toVariant(velocity);
306 pickParabola[
"acceleration"] = vec3toVariant(acceleration);
311 class CollisionRegion :
public MathPick {
313 CollisionRegion() { }
315 CollisionRegion(
const CollisionRegion& collisionRegion) :
316 loaded(collisionRegion.loaded),
317 modelURL(collisionRegion.modelURL),
318 shapeInfo(std::make_shared<ShapeInfo>()),
319 transform(collisionRegion.transform),
320 threshold(collisionRegion.threshold),
321 collisionGroup(collisionRegion.collisionGroup)
323 shapeInfo->setParams(collisionRegion.shapeInfo->getType(), collisionRegion.shapeInfo->getHalfExtents(), collisionRegion.modelURL.toString());
326 CollisionRegion(
const QVariantMap& pickVariant) {
328 if (pickVariant[
"shape"].isValid()) {
329 auto shape = pickVariant[
"shape"].toMap();
330 if (!shape.empty()) {
331 ShapeType shapeType = SHAPE_TYPE_NONE;
332 if (shape[
"shapeType"].isValid()) {
333 shapeType = ShapeInfo::getShapeTypeForName(shape[
"shapeType"].toString());
335 if (shapeType >= SHAPE_TYPE_COMPOUND && shapeType <= SHAPE_TYPE_STATIC_MESH && shape[
"modelURL"].isValid()) {
336 QString newURL = shape[
"modelURL"].toString();
337 modelURL.setUrl(newURL);
342 if (shape[
"dimensions"].isValid()) {
343 transform.setScale(vec3FromVariant(shape[
"dimensions"]));
346 shapeInfo->setParams(shapeType, transform.getScale() / 2.0f, modelURL.toString());
350 if (pickVariant[
"threshold"].isValid()) {
351 threshold = glm::max(0.0f, pickVariant[
"threshold"].toFloat());
354 if (pickVariant[
"position"].isValid()) {
355 transform.setTranslation(vec3FromVariant(pickVariant[
"position"]));
357 if (pickVariant[
"orientation"].isValid()) {
358 transform.setRotation(quatFromVariant(pickVariant[
"orientation"]));
360 if (pickVariant[
"collisionGroup"].isValid()) {
361 collisionGroup = pickVariant[
"collisionGroup"].toUInt();
389 QVariantMap toVariantMap()
const override {
390 QVariantMap collisionRegion;
393 shape[
"shapeType"] = ShapeInfo::getNameForShapeType(shapeInfo->getType());
394 shape[
"modelURL"] = modelURL.toString();
395 shape[
"dimensions"] = vec3toVariant(transform.getScale());
397 collisionRegion[
"shape"] = shape;
398 collisionRegion[
"loaded"] = loaded;
400 collisionRegion[
"threshold"] = threshold;
401 collisionRegion[
"collisionGroup"] = collisionGroup;
403 collisionRegion[
"position"] = vec3toVariant(transform.getTranslation());
404 collisionRegion[
"orientation"] = quatToVariant(transform.getRotation());
406 return collisionRegion;
409 operator bool()
const override {
410 return !std::isnan(threshold) &&
411 !(glm::any(glm::isnan(transform.getTranslation())) ||
412 glm::any(glm::isnan(transform.getRotation())) ||
413 shapeInfo->getType() == SHAPE_TYPE_NONE ||
414 collisionGroup == 0);
417 bool operator==(
const CollisionRegion& other)
const {
418 return loaded == other.loaded &&
419 threshold == other.threshold &&
420 collisionGroup == other.collisionGroup &&
421 glm::all(glm::equal(transform.getTranslation(), other.transform.getTranslation())) &&
422 glm::all(glm::equal(transform.getRotation(), other.transform.getRotation())) &&
423 glm::all(glm::equal(transform.getScale(), other.transform.getScale())) &&
424 shapeInfo->getType() == other.shapeInfo->getType() &&
425 modelURL == other.modelURL;
428 bool shouldComputeShapeInfo()
const {
429 if (!(shapeInfo->getType() == SHAPE_TYPE_HULL ||
430 (shapeInfo->getType() >= SHAPE_TYPE_COMPOUND &&
431 shapeInfo->getType() <= SHAPE_TYPE_STATIC_MESH)
436 if (collisionGroup == 0) {
440 return !shapeInfo->getPointCollection().size();
444 bool loaded {
false };
448 std::shared_ptr<ShapeInfo> shapeInfo = std::make_shared<ShapeInfo>();
450 float threshold { 0.0f };
451 uint16_t collisionGroup { USER_COLLISION_GROUP_MY_AVATAR };
455 inline void hash_combine(std::size_t& seed) { }
457 template <
typename T,
typename... Rest>
458 inline void hash_combine(std::size_t& seed,
const T& v, Rest... rest) {
460 seed ^= hasher(v) + 0x9e3779b9 + (seed<<6) + (seed>>2);
461 hash_combine(seed, rest...);
465 struct hash<bilateral::Side> {
466 size_t operator()(
const bilateral::Side& a)
const {
467 return std::hash<int>()((int)a);
472 struct hash<glm::vec3> {
473 size_t operator()(
const glm::vec3& a)
const {
475 hash_combine(result, a.x, a.y, a.z);
481 struct hash<glm::quat> {
482 size_t operator()(
const glm::quat& a)
const {
484 hash_combine(result, a.x, a.y, a.z, a.w);
490 struct hash<Transform> {
491 size_t operator()(
const Transform& a)
const {
493 hash_combine(result, a.getTranslation(), a.getRotation(), a.getScale());
499 struct hash<PickRay> {
500 size_t operator()(
const PickRay& a)
const {
502 hash_combine(result, a.origin, a.direction);
508 struct hash<StylusTip> {
509 size_t operator()(
const StylusTip& a)
const {
511 hash_combine(result, a.side, a.position, a.orientation, a.velocity);
517 struct hash<PickParabola> {
518 size_t operator()(
const PickParabola& a)
const {
520 hash_combine(result, a.origin, a.velocity, a.acceleration);
526 struct hash<CollisionRegion> {
527 size_t operator()(
const CollisionRegion& a)
const {
529 hash_combine(result, a.transform, (
int)a.shapeInfo->getType(), qHash(a.modelURL));
534 #if (QT_VERSION < QT_VERSION_CHECK(5, 14, 0))
536 struct hash<QString> {
537 size_t operator()(
const QString& a)
const {
558 enum ContactEventType {
559 CONTACT_EVENT_TYPE_START,
560 CONTACT_EVENT_TYPE_CONTINUE,
561 CONTACT_EVENT_TYPE_END
566 Collision() : type(CONTACT_EVENT_TYPE_START), idA(), idB(), contactPoint(0.0f), penetration(0.0f), velocityChange(0.0f) { }
567 Collision(ContactEventType cType,
const QUuid& cIdA,
const QUuid& cIdB,
const glm::vec3& cPoint,
568 const glm::vec3& cPenetration,
const glm::vec3& velocityChange)
569 : type(cType), idA(cIdA), idB(cIdB), contactPoint(cPoint), penetration(cPenetration), velocityChange(velocityChange) { }
573 ContactEventType type;
576 glm::vec3 contactPoint;
577 glm::vec3 penetration;
578 glm::vec3 velocityChange;
580 Q_DECLARE_METATYPE(Collision)
582 class AnimationDetails {
585 AnimationDetails(QString role, QUrl url,
float fps,
float priority,
bool loop,
586 bool hold,
bool startAutomatically,
float firstFrame,
float lastFrame,
bool running,
float currentFrame,
bool allowTranslation);
594 bool startAutomatically;
599 bool allowTranslation;
601 Q_DECLARE_METATYPE(AnimationDetails);
607 using MeshPointer = std::shared_ptr<graphics::Mesh>;
623 class MeshProxy :
public QObject {
627 virtual MeshPointer getMeshPointer()
const = 0;
634 Q_INVOKABLE
virtual int getNumVertices()
const = 0;
642 Q_INVOKABLE
virtual glm::vec3 getPos(
int index)
const = 0;
643 Q_INVOKABLE
virtual glm::vec3 getPos3(
int index)
const {
return getPos(index); }
646 Q_DECLARE_METATYPE(MeshProxy*);
648 class MeshProxyList :
public QList<MeshProxy*> {};
649 Q_DECLARE_METATYPE(MeshProxyList);
658 QVector<uint32_t> vertexIndices;
662 Q_DECLARE_METATYPE(MeshFace)
663 Q_DECLARE_METATYPE(QVector<MeshFace>)
665 QVariantMap parseTexturesToMap(QString textures,
const QVariantMap& defaultTextures);
667 Q_DECLARE_METATYPE(StencilMaskMode)