diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 4bfb2a2de1..0358f169b8 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -81,7 +81,6 @@ QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay) QScriptValue direction = vec3toScriptValue(engine, pickRay.direction); obj.setProperty("direction", direction); return obj; - } void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay) { diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 91eb3848c7..130a48cdeb 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -46,5 +46,4 @@ Q_DECLARE_METATYPE(PickRay) QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay); void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay); - #endif diff --git a/libraries/voxels/src/VoxelDetail.cpp b/libraries/voxels/src/VoxelDetail.cpp index d4ab5cafcb..8d9f7df0c5 100644 --- a/libraries/voxels/src/VoxelDetail.cpp +++ b/libraries/voxels/src/VoxelDetail.cpp @@ -9,6 +9,7 @@ void registerVoxelMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, voxelDetailToScriptValue, voxelDetailFromScriptValue); + qScriptRegisterMetaType(engine, rayToVoxelIntersectionResultToScriptValue, rayToVoxelIntersectionResultFromScriptValue); } QScriptValue voxelDetailToScriptValue(QScriptEngine* engine, const VoxelDetail& voxelDetail) { @@ -33,5 +34,71 @@ void voxelDetailFromScriptValue(const QScriptValue &object, VoxelDetail& voxelDe voxelDetail.blue = object.property("blue").toVariant().toInt(); } +RayToVoxelIntersectionResult::RayToVoxelIntersectionResult() : + intersects(false), + voxel(), + distance(0), + face() +{ +}; + +QScriptValue rayToVoxelIntersectionResultToScriptValue(QScriptEngine* engine, const RayToVoxelIntersectionResult& value) { + QScriptValue obj = engine->newObject(); + obj.setProperty("intersects", value.intersects); + QScriptValue voxelValue = voxelDetailToScriptValue(engine, value.voxel); + obj.setProperty("voxel", voxelValue); + obj.setProperty("distance", value.distance); + + QString faceName = ""; + // handle BoxFace + switch (value.face) { + case MIN_X_FACE: + faceName = "MIN_X_FACE"; + break; + case MAX_X_FACE: + faceName = "MAX_X_FACE"; + break; + case MIN_Y_FACE: + faceName = "MIN_Y_FACE"; + break; + case MAX_Y_FACE: + faceName = "MAX_Y_FACE"; + break; + case MIN_Z_FACE: + faceName = "MIN_Z_FACE"; + break; + case MAX_Z_FACE: + faceName = "MAX_Z_FACE"; + break; + } + obj.setProperty("face", faceName); + return obj; +} + +void rayToVoxelIntersectionResultFromScriptValue(const QScriptValue& object, RayToVoxelIntersectionResult& value) { + value.intersects = object.property("intersects").toVariant().toBool(); + QScriptValue voxelValue = object.property("voxel"); + if (voxelValue.isValid()) { + voxelDetailFromScriptValue(voxelValue, value.voxel); + } + value.distance = object.property("distance").toVariant().toFloat(); + + QString faceName = object.property("face").toVariant().toString(); + if (faceName == "MIN_X_FACE") { + value.face = MIN_X_FACE; + } else if (faceName == "MAX_X_FACE") { + value.face = MAX_X_FACE; + } else if (faceName == "MIN_Y_FACE") { + value.face = MIN_Y_FACE; + } else if (faceName == "MAX_Y_FACE") { + value.face = MAX_Y_FACE; + } else if (faceName == "MIN_Z_FACE") { + value.face = MIN_Z_FACE; + } else { + value.face = MAX_Z_FACE; + }; +} + + diff --git a/libraries/voxels/src/VoxelDetail.h b/libraries/voxels/src/VoxelDetail.h index ca1ff3940b..9da2e40776 100644 --- a/libraries/voxels/src/VoxelDetail.h +++ b/libraries/voxels/src/VoxelDetail.h @@ -12,6 +12,7 @@ #include +#include #include #include "VoxelConstants.h" @@ -32,5 +33,18 @@ void registerVoxelMetaTypes(QScriptEngine* engine); QScriptValue voxelDetailToScriptValue(QScriptEngine* engine, const VoxelDetail& color); void voxelDetailFromScriptValue(const QScriptValue &object, VoxelDetail& color); +class RayToVoxelIntersectionResult { +public: + RayToVoxelIntersectionResult(); + bool intersects; + VoxelDetail voxel; + float distance; + BoxFace face; +}; + +Q_DECLARE_METATYPE(RayToVoxelIntersectionResult) + +QScriptValue rayToVoxelIntersectionResultToScriptValue(QScriptEngine* engine, const RayToVoxelIntersectionResult& results); +void rayToVoxelIntersectionResultFromScriptValue(const QScriptValue& object, RayToVoxelIntersectionResult& results); #endif /* defined(__hifi__VoxelDetail__) */ \ No newline at end of file diff --git a/libraries/voxels/src/VoxelsScriptingInterface.cpp b/libraries/voxels/src/VoxelsScriptingInterface.cpp index d82912c44b..34c91c8f60 100644 --- a/libraries/voxels/src/VoxelsScriptingInterface.cpp +++ b/libraries/voxels/src/VoxelsScriptingInterface.cpp @@ -41,3 +41,8 @@ void VoxelsScriptingInterface::eraseVoxel(float x, float y, float z, float scale getVoxelPacketSender()->queueVoxelEditMessages(PacketTypeVoxelErase, 1, &deleteVoxelDetail); } + +RayToVoxelIntersectionResult VoxelsScriptingInterface::findRayIntersection(const PickRay& ray) { + RayToVoxelIntersectionResult result; + return result; +} diff --git a/libraries/voxels/src/VoxelsScriptingInterface.h b/libraries/voxels/src/VoxelsScriptingInterface.h index 877383e0b0..f87e8d0a4c 100644 --- a/libraries/voxels/src/VoxelsScriptingInterface.h +++ b/libraries/voxels/src/VoxelsScriptingInterface.h @@ -12,18 +12,22 @@ #include #include +#include #include "VoxelConstants.h" #include "VoxelEditPacketSender.h" +#include "VoxelTree.h" /// handles scripting of voxel commands from JS passed to assigned clients class VoxelsScriptingInterface : public OctreeScriptingInterface { Q_OBJECT -public: +public: + VoxelsScriptingInterface() : _tree(NULL) {}; VoxelEditPacketSender* getVoxelPacketSender() { return (VoxelEditPacketSender*)getPacketSender(); } virtual NodeType_t getServerNodeType() const { return NodeType::VoxelServer; } virtual OctreeEditPacketSender* createPacketSender() { return new VoxelEditPacketSender(); } + void setVoxelTree(VoxelTree* tree) { _tree = tree; } public slots: /// queues the creation of a voxel which will be sent by calling process on the PacketSender @@ -53,8 +57,12 @@ public slots: /// \param scale the scale of the voxel (in meter units) void eraseVoxel(float x, float y, float z, float scale); + /// If the scripting context has visible voxels, this will determine a ray intersection + RayToVoxelIntersectionResult findRayIntersection(const PickRay& ray); + private: void queueVoxelAdd(PacketType addPacketType, VoxelDetail& addVoxelDetails); + VoxelTree* _tree; }; #endif /* defined(__hifi__VoxelsScriptingInterface__) */