Skip to content

Commit 2575447

Browse files
committed
Fixed event generation in component to only fire when the value changes.
1 parent 78ad609 commit 2575447

3 files changed

Lines changed: 34 additions & 5 deletions

File tree

src/Engine/2D/position.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -771,6 +771,19 @@ namespace pg
771771
return areNotAlmostEqual(oldX, x) or areNotAlmostEqual(oldY, y) or areNotAlmostEqual(oldZ, z) or areNotAlmostEqual(oldWidth, width) or areNotAlmostEqual(oldHeight, height);
772772
}
773773

774+
void PositionComponent::setVisibility(const bool& value)
775+
{
776+
if (visible != value)
777+
{
778+
visible = value;
779+
780+
if (ecsRef)
781+
{
782+
ecsRef->sendEvent(PositionComponentChangedEvent{entityId});
783+
}
784+
}
785+
}
786+
774787
void PositionComponentSystem::pushChildrenInChange(std::set<_unique_id>& set, _unique_id parentId)
775788
{
776789
for (const auto& child : parentalMap[parentId])

src/Engine/Components/PositionComponent.pgcomp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ methods:
5555
- "bool isObservable() const { return observable; }"
5656
- "bool isRenderable() const { return visible and observable; }"
5757
- "bool updatefromAnchor(const UiAnchor& anchor);"
58-
- "void setVisibility(const bool& visible) { this->visible = visible; }"
58+
- "void setVisibility(const bool& value);"
5959

6060
events:
6161
- PositionComponentChangedEvent

tools/component_generator.pg

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -636,9 +636,24 @@ class CppGenerator
636636
}
637637
else if (setterMode == "event")
638638
{
639-
// Event setter: assign + send event
640-
code += " " + fieldName + " = value;\n\n"
641-
code += " if (ecsRef)\n {\n"
639+
// Event setter: check if changed, then assign + send event
640+
// Use areNotAlmostEqual for floats/doubles
641+
var comparisonCheck = ""
642+
if (fieldType == "float" or fieldType == "double")
643+
{
644+
comparisonCheck = "areNotAlmostEqual(" + fieldName + ", value)"
645+
}
646+
else
647+
{
648+
comparisonCheck = fieldName + " != value"
649+
}
650+
651+
code += " if (" + comparisonCheck + ")\n"
652+
code += " {\n"
653+
code += " " + fieldName + " = value;\n\n"
654+
code += " if (ecsRef)\n"
655+
code += " {\n"
656+
642657
// Get the event name from schema or use default
643658
var eventName = ""
644659

@@ -651,7 +666,8 @@ class CppGenerator
651666
eventName = schema.name + "Changed"
652667
}
653668

654-
code += " ecsRef->sendEvent(" + eventName + "{entityId});\n"
669+
code += " ecsRef->sendEvent(" + eventName + "{entityId});\n"
670+
code += " }\n"
655671
code += " }\n"
656672
}
657673
else if (setterMode == "custom_event")

0 commit comments

Comments
 (0)