Skip to content

Commit 2261e3a

Browse files
committed
Jenova Runtime Update v0.3.8.0 Hotfix 5
- Bug Fix : Malfunctioning Default Properties in Godot 4.5 - Minor Improvements
1 parent 532947b commit 2261e3a

3 files changed

Lines changed: 71 additions & 5 deletions

File tree

Source/Jenova.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -991,6 +991,7 @@ namespace jenova
991991
void* AllocateVariantBasedProperty(const std::string& typeName);
992992
bool SetPropertyPointerValueFromVariant(jenova::PropertyPointer propertyPointer, const Variant& variantValue);
993993
bool GetVariantFromPropertyPointer(const jenova::PropertyPointer propertyPointer, godot::Variant& variantValue, const Variant::Type& variantType);
994+
Variant CreateDefaultVariantFromType(Variant::Type variantType);
994995
std::string ParseClassNameFromScriptSource(const std::string& sourceCode);
995996
jenova::ScriptFileState BackupScriptFileState(const std::string& scriptFilePath);
996997
bool RestoreScriptFileState(const std::string& scriptFilePath, const jenova::ScriptFileState& scriptFileState);

Source/jenova.cpp

Lines changed: 59 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7606,7 +7606,7 @@ namespace jenova
76067606
}
76077607
std::string ResolveVariantValueAsString(const Variant* variantValue, jenova::PointerList& ptrList)
76087608
{
7609-
// Atomic types
7609+
// Atomic Types
76107610
if (variantValue->get_type() == Variant::BOOL) return (bool(*variantValue)) ? "true" : "false";
76117611
if (variantValue->get_type() == Variant::FLOAT) return jenova::Format("%lf", double(*variantValue));
76127612
if (variantValue->get_type() == Variant::INT) return jenova::Format("%lld", int64_t(*variantValue));
@@ -7617,7 +7617,7 @@ namespace jenova
76177617
return jenova::Format("(void*)0x%llx", value);
76187618
}
76197619

7620-
// Math types
7620+
// Math Types
76217621
if (variantValue->get_type() == Variant::VECTOR2)
76227622
{
76237623
Vector2* value = new Vector2(*variantValue);
@@ -7709,7 +7709,7 @@ namespace jenova
77097709
return jenova::Format("(void*)0x%llx", value);
77107710
}
77117711

7712-
// Misc types
7712+
// Misc Types
77137713
if (variantValue->get_type() == Variant::COLOR)
77147714
{
77157715
Color* value = new Color(*variantValue);
@@ -7763,7 +7763,7 @@ namespace jenova
77637763
return jenova::Format("(void*)0x%llx", value);
77647764
}
77657765

7766-
// Typed arrays
7766+
// Typed Arrays
77677767
if (variantValue->get_type() == Variant::PACKED_BYTE_ARRAY)
77687768
{
77697769
PackedByteArray* value = new PackedByteArray(*variantValue);
@@ -8424,6 +8424,7 @@ namespace jenova
84248424
scriptProp.propertyName = String(scriptProperty["PropertyName"].get<std::string>().c_str());
84258425
scriptProp.propertyInfo.type = jenova::GetVariantTypeFromStdString(scriptProperty["PropertyType"].get<std::string>());
84268426
scriptProp.defaultValue = UtilityFunctions::str_to_var(String(scriptProperty["PropertyDefault"].get<std::string>().c_str()));
8427+
if (scriptProp.defaultValue.get_type() == Variant::NIL) scriptProp.defaultValue = jenova::CreateDefaultVariantFromType(scriptProp.propertyInfo.type);
84278428
scriptProp.propertyInfo.name = bool(scriptProperty.contains("PropertyGroup")) ?
84288429
StringName(String(scriptProperty["PropertyGroup"].get<std::string>().c_str()) + "/" + String(scriptProperty["PropertyName"].get<std::string>().c_str())) :
84298430
StringName(String(scriptProperty["PropertyName"].get<std::string>().c_str()));
@@ -8870,6 +8871,60 @@ namespace jenova
88708871
// All Good
88718872
return true;
88728873
}
8874+
Variant CreateDefaultVariantFromType(Variant::Type variantType)
8875+
{
8876+
switch (variantType)
8877+
{
8878+
// Atomic Types
8879+
case Variant::BOOL: return Variant(false);
8880+
case Variant::INT: return Variant(int64_t(0));
8881+
case Variant::FLOAT: return Variant(0.0f);
8882+
case Variant::STRING: return Variant(String());
8883+
8884+
// Math Types
8885+
case Variant::VECTOR2: return Variant(Vector2());
8886+
case Variant::VECTOR2I: return Variant(Vector2i());
8887+
case Variant::RECT2: return Variant(Rect2());
8888+
case Variant::RECT2I: return Variant(Rect2i());
8889+
case Variant::VECTOR3: return Variant(Vector3());
8890+
case Variant::VECTOR3I: return Variant(Vector3i());
8891+
case Variant::TRANSFORM2D: return Variant(Transform2D());
8892+
case Variant::VECTOR4: return Variant(Vector4());
8893+
case Variant::VECTOR4I: return Variant(Vector4i());
8894+
case Variant::PLANE: return Variant(Plane());
8895+
case Variant::QUATERNION: return Variant(Quaternion());
8896+
case Variant::AABB: return Variant(AABB());
8897+
case Variant::BASIS: return Variant(Basis());
8898+
case Variant::TRANSFORM3D: return Variant(Transform3D());
8899+
case Variant::PROJECTION: return Variant(Projection());
8900+
8901+
// Misc Types
8902+
case Variant::COLOR: return Variant(Color());
8903+
case Variant::STRING_NAME: return Variant(StringName());
8904+
case Variant::NODE_PATH: return Variant(NodePath());
8905+
case Variant::RID: return Variant(RID());
8906+
case Variant::OBJECT: return Variant((Object*)nullptr);
8907+
case Variant::CALLABLE: return Variant(Callable());
8908+
case Variant::SIGNAL: return Variant(Signal());
8909+
case Variant::DICTIONARY: return Variant(Dictionary());
8910+
case Variant::ARRAY: return Variant(Array());
8911+
8912+
// Typed Arrays
8913+
case Variant::PACKED_BYTE_ARRAY: return Variant(PackedByteArray());
8914+
case Variant::PACKED_INT32_ARRAY: return Variant(PackedInt32Array());
8915+
case Variant::PACKED_INT64_ARRAY: return Variant(PackedInt64Array());
8916+
case Variant::PACKED_FLOAT32_ARRAY: return Variant(PackedFloat32Array());
8917+
case Variant::PACKED_FLOAT64_ARRAY: return Variant(PackedFloat64Array());
8918+
case Variant::PACKED_STRING_ARRAY: return Variant(PackedStringArray());
8919+
case Variant::PACKED_VECTOR2_ARRAY: return Variant(PackedVector2Array());
8920+
case Variant::PACKED_VECTOR3_ARRAY: return Variant(PackedVector3Array());
8921+
case Variant::PACKED_COLOR_ARRAY: return Variant(PackedColorArray());
8922+
case Variant::PACKED_VECTOR4_ARRAY: return Variant(PackedVector4Array());
8923+
8924+
// Fallback to NIL
8925+
default: return Variant();
8926+
}
8927+
}
88738928
std::string ParseClassNameFromScriptSource(const std::string& sourceCode)
88748929
{
88758930
std::regex pattern(R"(JENOVA_CLASS_NAME\s*\(\s*\"([^\"]+)\"\s*\))");

Source/script_instance.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,17 @@ Variant CPPScriptInstance::callp(const StringName &p_method, const Variant **p_a
245245
for (size_t i = 0; i < propContainer.scriptProperties.size(); i++)
246246
{
247247
jenova::ScriptProperty scriptProperty = propContainer.scriptProperties[i];
248-
if (!this->instanceProperties.has(scriptProperty.propertyInfo.name)) this->instanceProperties[scriptProperty.propertyInfo.name] = scriptProperty.defaultValue;
248+
if (!this->instanceProperties.has(scriptProperty.propertyInfo.name))
249+
{
250+
this->instanceProperties[scriptProperty.propertyInfo.name] = scriptProperty.defaultValue;
251+
}
252+
else
253+
{
254+
if (instanceProperties[scriptProperty.propertyInfo.name].get_type() == Variant::NIL)
255+
{
256+
this->instanceProperties[scriptProperty.propertyInfo.name] = scriptProperty.defaultValue;
257+
}
258+
}
249259
}
250260
}
251261

0 commit comments

Comments
 (0)