From dba0925a1c7aed8dbeae216522a465582d38a3bc Mon Sep 17 00:00:00 2001 From: ksuprynowicz Date: Sat, 1 Apr 2023 17:26:29 +0200 Subject: [PATCH] vec3FromScriptValue replacement attempt --- interface/src/ui/overlays/Overlays.cpp | 18 ++++++++++++++++-- libraries/animation/src/AnimVariant.cpp | 5 +++++ libraries/audio/src/AudioInjectorOptions.cpp | 9 +++++++++ libraries/avatars/src/AvatarData.cpp | 17 +++++++++++++++++ libraries/controllers/src/controllers/Pose.cpp | 17 +++++++++++++++++ .../src/ModelScriptingInterface.cpp | 5 +++++ .../entities/src/EntityItemPropertiesMacros.h | 13 +++++++++++++ .../entities/src/EntityScriptingInterface.cpp | 15 ++++++++++++++- libraries/script-engine/src/PointerEvent.cpp | 9 +++++++++ .../script-engine/src/ScriptValueUtils.cpp | 17 ++++++++++++----- libraries/script-engine/src/SpatialEvent.cpp | 12 +++++++++++- .../src/v8/FastScriptValueUtils.h | 6 +++++- 12 files changed, 133 insertions(+), 10 deletions(-) diff --git a/interface/src/ui/overlays/Overlays.cpp b/interface/src/ui/overlays/Overlays.cpp index 42cec567dc..75e4730995 100644 --- a/interface/src/ui/overlays/Overlays.cpp +++ b/interface/src/ui/overlays/Overlays.cpp @@ -32,6 +32,7 @@ #include #include #include +#include #include #include "VariantMapToScriptValue.h" @@ -1143,9 +1144,14 @@ ScriptValue RayToOverlayIntersectionResultToScriptValue(ScriptEngine* engine, co obj.setProperty("distance", value.distance); obj.setProperty("face", boxFaceToString(value.face)); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + ScriptValue intersection = vec3ToScriptValueFast(engine, value.intersection); + ScriptValue surfaceNormal = vec3ToScriptValueFast(engine, value.surfaceNormal); +#else ScriptValue intersection = vec3ToScriptValue(engine, value.intersection); - obj.setProperty("intersection", intersection); ScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); +#endif + obj.setProperty("intersection", intersection); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -1160,11 +1166,19 @@ bool RayToOverlayIntersectionResultFromScriptValue(const ScriptValue& object, Ra ScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(intersection, value.intersection); +#else vec3FromScriptValue(intersection, value.intersection); +#endif } ScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { - vec3FromScriptValue(surfaceNormal, value.surfaceNormal); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(surfaceNormal, value.surfaceNormal); +#else + vec3FromScriptValue(intersection, value.intersection); +#endif } value.extraInfo = object.property("extraInfo").toVariant().toMap(); return true; diff --git a/libraries/animation/src/AnimVariant.cpp b/libraries/animation/src/AnimVariant.cpp index 3d38252407..4336f7d348 100644 --- a/libraries/animation/src/AnimVariant.cpp +++ b/libraries/animation/src/AnimVariant.cpp @@ -17,6 +17,7 @@ #include #include #include +#include const AnimVariant AnimVariant::False = AnimVariant(); @@ -42,7 +43,11 @@ ScriptValue AnimVariantMap::animVariantMapToScriptValue(ScriptEngine* engine, co target.setProperty(name, value.getString()); break; case AnimVariant::Type::Vec3: +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + target.setProperty(name, vec3ToScriptValueFast(engine, value.getVec3())); +#else target.setProperty(name, vec3ToScriptValue(engine, value.getVec3())); +#endif break; case AnimVariant::Type::Quat: target.setProperty(name, quatToScriptValue(engine, value.getQuat())); diff --git a/libraries/audio/src/AudioInjectorOptions.cpp b/libraries/audio/src/AudioInjectorOptions.cpp index 39fdfb0a61..dc725d302a 100644 --- a/libraries/audio/src/AudioInjectorOptions.cpp +++ b/libraries/audio/src/AudioInjectorOptions.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include "AudioLogging.h" @@ -37,7 +38,11 @@ AudioInjectorOptions::AudioInjectorOptions() : ScriptValue injectorOptionsToScriptValue(ScriptEngine* engine, const AudioInjectorOptions& injectorOptions) { ScriptValue obj = engine->newObject(); if (injectorOptions.positionSet) { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + obj.setProperty("position", vec3ToScriptValueFast(engine, injectorOptions.position)); +#else obj.setProperty("position", vec3ToScriptValue(engine, injectorOptions.position)); +#endif } obj.setProperty("volume", injectorOptions.volume); obj.setProperty("loop", injectorOptions.loop); @@ -84,7 +89,11 @@ bool injectorOptionsFromScriptValue(const ScriptValue& object, AudioInjectorOpti it->next(); if (it->name() == "position") { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(object.property("position"), injectorOptions.position); +#else vec3FromScriptValue(object.property("position"), injectorOptions.position); +#endif injectorOptions.positionSet = true; } else if (it->name() == "orientation") { quatFromScriptValue(object.property("orientation"), injectorOptions.orientation); diff --git a/libraries/avatars/src/AvatarData.cpp b/libraries/avatars/src/AvatarData.cpp index c71da50b1a..f059949c85 100644 --- a/libraries/avatars/src/AvatarData.cpp +++ b/libraries/avatars/src/AvatarData.cpp @@ -42,6 +42,7 @@ #include #include #include +#include #include #include #include @@ -3184,10 +3185,18 @@ ScriptValue RayToAvatarIntersectionResultToScriptValue(ScriptEngine* engine, con obj.setProperty("distance", value.distance); Q_ASSERT(value.face < 7); obj.setProperty("face", boxFaceToString(value.face)); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + ScriptValue intersection = vec3ToScriptValueFast(engine, value.intersection); +#else ScriptValue intersection = vec3ToScriptValue(engine, value.intersection); +#endif obj.setProperty("intersection", intersection); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + ScriptValue surfaceNormal = vec3ToScriptValueFast(engine, value.surfaceNormal); +#else ScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); +#endif obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("jointIndex", value.jointIndex); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); @@ -3204,11 +3213,19 @@ bool RayToAvatarIntersectionResultFromScriptValue(const ScriptValue& object, Ray ScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(intersection, value.intersection); +#else vec3FromScriptValue(intersection, value.intersection); +#endif } ScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(surfaceNormal, value.surfaceNormal); +#else vec3FromScriptValue(surfaceNormal, value.surfaceNormal); +#endif } value.jointIndex = object.property("jointIndex").toInt32(); value.extraInfo = object.property("extraInfo").toVariant().toMap(); diff --git a/libraries/controllers/src/controllers/Pose.cpp b/libraries/controllers/src/controllers/Pose.cpp index 4d5703f622..d4ad19018f 100644 --- a/libraries/controllers/src/controllers/Pose.cpp +++ b/libraries/controllers/src/controllers/Pose.cpp @@ -15,6 +15,7 @@ #include #include +#include namespace controller { @@ -44,10 +45,18 @@ namespace controller { */ ScriptValue Pose::toScriptValue(ScriptEngine* engine, const Pose& pose) { ScriptValue obj = engine->newObject(); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + obj.setProperty("translation", vec3ToScriptValueFast(engine, pose.translation)); + //V8TODO: Optimize + obj.setProperty("rotation", quatToScriptValue(engine, pose.rotation)); + obj.setProperty("velocity", vec3ToScriptValueFast(engine, pose.velocity)); + obj.setProperty("angularVelocity", vec3ToScriptValueFast(engine, pose.angularVelocity)); +#else obj.setProperty("translation", vec3ToScriptValue(engine, pose.translation)); obj.setProperty("rotation", quatToScriptValue(engine, pose.rotation)); obj.setProperty("velocity", vec3ToScriptValue(engine, pose.velocity)); obj.setProperty("angularVelocity", vec3ToScriptValue(engine, pose.angularVelocity)); +#endif obj.setProperty("valid", pose.valid); return obj; } @@ -61,10 +70,18 @@ namespace controller { rotation.isValid() && velocity.isValid() && angularVelocity.isValid()) { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(translation, pose.translation); + //V8TODO: optimize + quatFromScriptValue(rotation, pose.rotation); + vec3FromScriptValueFast(velocity, pose.velocity); + vec3FromScriptValueFast(angularVelocity, pose.angularVelocity); +#else vec3FromScriptValue(translation, pose.translation); quatFromScriptValue(rotation, pose.rotation); vec3FromScriptValue(velocity, pose.velocity); vec3FromScriptValue(angularVelocity, pose.angularVelocity); +#endif pose.valid = true; } else { pose.valid = false; diff --git a/libraries/entities-renderer/src/ModelScriptingInterface.cpp b/libraries/entities-renderer/src/ModelScriptingInterface.cpp index 20638cac29..d57cc8c090 100644 --- a/libraries/entities-renderer/src/ModelScriptingInterface.cpp +++ b/libraries/entities-renderer/src/ModelScriptingInterface.cpp @@ -18,6 +18,7 @@ #include #include #include +#include #include STATIC_SCRIPT_TYPES_INITIALIZER((+[](ScriptManager* manager){ @@ -203,7 +204,11 @@ ScriptValue ModelScriptingInterface::getVertex(MeshProxy* meshProxy, int vertexI } glm::vec3 pos = vertexBufferView.get(vertexIndex); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + return vec3ToScriptValueFast(_modelScriptEngine.get(), pos); +#else return vec3ToScriptValue(_modelScriptEngine.get(), pos); +#endif } diff --git a/libraries/entities/src/EntityItemPropertiesMacros.h b/libraries/entities/src/EntityItemPropertiesMacros.h index 92e3481ffa..527e9d8588 100644 --- a/libraries/entities/src/EntityItemPropertiesMacros.h +++ b/libraries/entities/src/EntityItemPropertiesMacros.h @@ -20,6 +20,7 @@ #include #include #include +#include #define APPEND_ENTITY_PROPERTY(P,V) \ if (requestedProperties.getHasProperty(P)) { \ @@ -105,7 +106,11 @@ } inline ScriptValue convertScriptValue(ScriptEngine* e, const glm::vec2& v) { return vec2ToScriptValue(e, v); } +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 +inline ScriptValue convertScriptValue(ScriptEngine* e, const glm::vec3& v) { return vec3ToScriptValueFast(e, v); } +#else inline ScriptValue convertScriptValue(ScriptEngine* e, const glm::vec3& v) { return vec3ToScriptValue(e, v); } +#endif inline ScriptValue vec3Color_convertScriptValue(ScriptEngine* e, const glm::vec3& v) { return vec3ColorToScriptValue(e, v); } inline ScriptValue convertScriptValue(ScriptEngine* e, const glm::u8vec3& v) { return u8vec3ToScriptValue(e, v); } inline ScriptValue u8vec3Color_convertScriptValue(ScriptEngine* e, const glm::u8vec3& v) { return u8vec3ColorToScriptValue(e, v); } @@ -255,14 +260,22 @@ inline glm::vec2 vec2_convertFromScriptValue(const ScriptValue& v, bool& isValid inline glm::vec3 vec3_convertFromScriptValue(const ScriptValue& v, bool& isValid) { isValid = true; glm::vec3 vec3; +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(v, vec3); +#else vec3FromScriptValue(v, vec3); +#endif return vec3; } inline glm::vec3 vec3Color_convertFromScriptValue(const ScriptValue& v, bool& isValid) { isValid = true; glm::vec3 vec3; +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(v, vec3); +#else vec3FromScriptValue(v, vec3); +#endif return vec3; } diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index 605c0b8d86..2d08223212 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -1698,9 +1698,14 @@ ScriptValue RayToEntityIntersectionResultToScriptValue(ScriptEngine* engine, con obj.setProperty("face", boxFaceToString(value.face)); Q_ASSERT(value.face < 7); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + ScriptValue intersection = vec3ToScriptValueFast(engine, value.intersection); + ScriptValue surfaceNormal = vec3ToScriptValueFast(engine, value.surfaceNormal); +#else ScriptValue intersection = vec3ToScriptValue(engine, value.intersection); - obj.setProperty("intersection", intersection); ScriptValue surfaceNormal = vec3ToScriptValue(engine, value.surfaceNormal); +#endif + obj.setProperty("intersection", intersection); obj.setProperty("surfaceNormal", surfaceNormal); obj.setProperty("extraInfo", engine->toScriptValue(value.extraInfo)); return obj; @@ -1717,11 +1722,19 @@ bool RayToEntityIntersectionResultFromScriptValue(const ScriptValue& object, Ray ScriptValue intersection = object.property("intersection"); if (intersection.isValid()) { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(intersection, value.intersection); +#else vec3FromScriptValue(intersection, value.intersection); +#endif } ScriptValue surfaceNormal = object.property("surfaceNormal"); if (surfaceNormal.isValid()) { +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(surfaceNormal, value.surfaceNormal); +#else vec3FromScriptValue(surfaceNormal, value.surfaceNormal); +#endif } value.extraInfo = object.property("extraInfo").toVariant().toMap(); return true; diff --git a/libraries/script-engine/src/PointerEvent.cpp b/libraries/script-engine/src/PointerEvent.cpp index bc89138599..f2701ce5c2 100644 --- a/libraries/script-engine/src/PointerEvent.cpp +++ b/libraries/script-engine/src/PointerEvent.cpp @@ -17,6 +17,7 @@ #include "ScriptEngine.h" #include "ScriptValue.h" #include "ScriptValueUtils.h" +#include "v8/FastScriptValueUtils.h" static bool areFlagsSet(uint32_t flags, uint32_t mask) { return (flags & mask) != 0; @@ -231,10 +232,18 @@ bool PointerEvent::fromScriptValue(const ScriptValue& object, PointerEvent& even ScriptValue id = object.property("id"); event._id = id.isNumber() ? (uint32_t)id.toNumber() : 0; +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + //V8TODO: optimize + vec2FromScriptValue(object.property("pos2D"), event._pos2D); + vec3FromScriptValueFast(object.property("pos3D"), event._pos3D); + vec3FromScriptValueFast(object.property("normal"), event._normal); + vec3FromScriptValueFast(object.property("direction"), event._direction); +#else vec2FromScriptValue(object.property("pos2D"), event._pos2D); vec3FromScriptValue(object.property("pos3D"), event._pos3D); vec3FromScriptValue(object.property("normal"), event._normal); vec3FromScriptValue(object.property("direction"), event._direction); +#endif ScriptValue button = object.property("button"); QString buttonStr = type.isString() ? button.toString() : "NoButtons"; diff --git a/libraries/script-engine/src/ScriptValueUtils.cpp b/libraries/script-engine/src/ScriptValueUtils.cpp index 4929093821..be6f2cd317 100644 --- a/libraries/script-engine/src/ScriptValueUtils.cpp +++ b/libraries/script-engine/src/ScriptValueUtils.cpp @@ -33,12 +33,7 @@ #include "ScriptEngineCast.h" #include "ScriptValueIterator.h" #include "ScriptEngineLogging.h" - -#define CONVERSIONS_OPTIMIZED_FOR_V8 - -#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 #include "v8/FastScriptValueUtils.h" -#endif bool isListOfStrings(const ScriptValue& arg) { if (!arg.isArray()) { @@ -136,7 +131,11 @@ ScriptValue qVector3DToScriptValue(ScriptEngine* engine, const QVector3D& qVecto bool qVector3DFromScriptValue(const ScriptValue& object, QVector3D& qVector3D) { glm::vec3 vec3; +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + if (vec3FromScriptValueFast(object, vec3)) { +#else if (vec3FromScriptValue(object, vec3)) { +#endif qVector3D.setX(vec3.x); qVector3D.setY(vec3.y); qVector3D.setZ(vec3.z); @@ -485,7 +484,11 @@ QVector qVectorVec3FromScriptValue(const ScriptValue& array) { for (int i = 0; i < length; i++) { glm::vec3 newVec3 = glm::vec3(); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(array.property(i), newVec3); +#else vec3FromScriptValue(array.property(i), newVec3); +#endif newVector << newVec3; } return newVector; @@ -496,7 +499,11 @@ bool qVectorVec3FromScriptValue(const ScriptValue& array, QVector& ve for (int i = 0; i < length; i++) { glm::vec3 newVec3 = glm::vec3(); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + vec3FromScriptValueFast(array.property(i), newVec3); +#else vec3FromScriptValue(array.property(i), newVec3); +#endif vector << newVec3; } return true; diff --git a/libraries/script-engine/src/SpatialEvent.cpp b/libraries/script-engine/src/SpatialEvent.cpp index 1e675b5dcf..d47326f14f 100644 --- a/libraries/script-engine/src/SpatialEvent.cpp +++ b/libraries/script-engine/src/SpatialEvent.cpp @@ -17,6 +17,7 @@ #include "ScriptEngine.h" #include "ScriptValueUtils.h" #include "ScriptValue.h" +#include "v8/FastScriptValueUtils.h" SpatialEvent::SpatialEvent() : locTranslation(0.0f), @@ -38,11 +39,20 @@ SpatialEvent::SpatialEvent(const SpatialEvent& event) { ScriptValue SpatialEvent::toScriptValue(ScriptEngine* engine, const SpatialEvent& event) { ScriptValue obj = engine->newObject(); +#ifdef CONVERSIONS_OPTIMIZED_FOR_V8 + obj.setProperty("locTranslation", vec3ToScriptValueFast(engine, event.locTranslation) ); + //V8TODO: optimize + obj.setProperty("locRotation", quatToScriptValue(engine, event.locRotation) ); + obj.setProperty("absTranslation", vec3ToScriptValueFast(engine, event.absTranslation)); + //V8TODO: optimize + obj.setProperty("absRotation", quatToScriptValue(engine, event.absRotation)); +#else obj.setProperty("locTranslation", vec3ToScriptValue(engine, event.locTranslation) ); obj.setProperty("locRotation", quatToScriptValue(engine, event.locRotation) ); obj.setProperty("absTranslation", vec3ToScriptValue(engine, event.absTranslation)); obj.setProperty("absRotation", quatToScriptValue(engine, event.absRotation)); - +#endif + return obj; } diff --git a/libraries/script-engine/src/v8/FastScriptValueUtils.h b/libraries/script-engine/src/v8/FastScriptValueUtils.h index 8401f9ab36..46fcdee65f 100644 --- a/libraries/script-engine/src/v8/FastScriptValueUtils.h +++ b/libraries/script-engine/src/v8/FastScriptValueUtils.h @@ -9,7 +9,9 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -// Contains V8-specific implementations of th +// Contains V8-specific implementations of the function converting Overte datatypes to and from script values. +// These are used instead of generic implementations if CONVERSIONS_OPTIMIZED_FOR_V8 is defined. +// V8-specific implementations can make script engine several times faster. #ifndef overte_FastScriptValueUtils_h #define overte_FastScriptValueUtils_h @@ -19,6 +21,8 @@ #include "../ScriptValue.h" +#define CONVERSIONS_OPTIMIZED_FOR_V8 + ScriptValue vec3ToScriptValueFast(ScriptEngine* engine, const glm::vec3& vec3); bool vec3FromScriptValueFast(const ScriptValue& object, glm::vec3& vec3);