Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Clarify bounce and reflect docs and update param names #89404

Merged
merged 1 commit into from
Apr 10, 2024

Conversation

clayjohn
Copy link
Member

Supersedes: #68392
Fixes: #11678

A large part of the confusion comes from the parameter naming. reflect says it takes a normal vector, but it actually takes a vector that is parallel to the line/plane which is an uncommon way of specifying a plane.

I am fairly certain that changing parameter names doesn't break compat, but I would appreciate confirmation from @dsnopek and @raulsntos just in case.

@clayjohn clayjohn added bug topic:core documentation cherrypick:4.2 Considered for cherry-picking into a future 4.2.x release labels Mar 11, 2024
@clayjohn clayjohn added this to the 4.3 milestone Mar 11, 2024
@clayjohn clayjohn requested review from a team as code owners March 11, 2024 23:33
doc/classes/Vector2.xml Outdated Show resolved Hide resolved
doc/classes/Vector3.xml Outdated Show resolved Hide resolved
Copy link
Member

@Calinou Calinou left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be good to merge after applying suggestions.

To further clarify the difference between bouncing and reflecting, I'll look into creating comparison diagrams we can commit to the godot-docs repository and link here in a future PR.

@raulsntos
Copy link
Member

I am fairly certain that changing parameter names doesn't break compat

In C# it breaks source compat1 because a user could be calling the method with named parameters like this:

new Vector2(100, 100).Reflect(normal: new Vector2(0, -1));

But also, the Variant types are implemented manually in C#, so this PR doesn't affect them.

I don't think we need to be strict on source compat though, it's not as disruptive as binary compat, so if the change is justified I think it's fine.

Footnotes

  1. In case you're not familiar with .NET compatibility terms: https://learn.microsoft.com/en-us/dotnet/core/compatibility/categories

@akien-mga akien-mga merged commit de1f77c into godotengine:master Apr 10, 2024
16 checks passed
@akien-mga
Copy link
Member

Thanks!

<description>
Returns the result of reflecting the vector from a plane defined by the given normal [param n].
Returns the result of reflecting the vector from a plane defined by the given direction vector [param direction].
[b]Note:[/b] [method reflect] differs from what other engines and frameworks call [code skip-lint]reflect()[/code]. In other engines, [code skip-lint]reflect()[/code] takes a normal direction which is a direction perpendicular to the plane. In Godot, you specify a direction parallel to the plane. See also [method bounce] which does what most engines call [code skip-lint]reflect()[/code].
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This doesn't make sense to me. You cannot uniquely define a plane using only a single parallel direction.

The C++ source code still calls the parameter normal:

Vector3 Vector3::reflect(const Vector3 &p_normal) const {

Same thing in 2D. I think this PR should be reverted, because it is not consistent with the C++ code, and for 3D it does not make any sense to define a plane by a parallel direction.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copy link

@hallo1126 hallo1126 Apr 29, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As I mentioned in #89250, this PR should not be reverted. Instead, if the C++ code has the same inconsistency with all other standards like GLSL, it should be corrected as well instead of clinging to an old confusing and honestly simply needlessly nonstandard implementation. I propose that bounce(), on the next major change, absolutely should be switched with reflect(), and until then the documentation should be updated to explain the difference to avoid confusion, both in C# as well as in C++

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@aaronfranke Whether it makes sense to define a plane given by a direction or not is kind of besides the point. That's how our reflect() method works. Calling the parallel direction a "normal" doesn't make it into a normal vector. Nor does it make this function API make sense. The least we can do for users is accurately describe what happens when they call this function.

You cannot uniquely define a plane using only a single parallel direction.

Why would we need to uniquely define a plane? Any plane aligned with this direction will result in the same reflected vector.

Same thing in 2D. I think this PR should be reverted, because it is not consistent with the C++ code, and for 3D it does not make any sense to define a plane by a parallel direction.

The description is consistent with the C++ code, maybe not with the parameter name, but again. The issue here comes from the parameter names being outright wrong and misleading. I am not going to support incorrect documentation just to be internally consistent. If you really care about the C++ parameter names, then please feel free to make a PR that updates the parameter names in the C++ code to something more accurate. Making the documentation inaccurate is not an option.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@clayjohn There are an infinite amount of planes that pass through this parallel direction X axis, how does it determine which plane to use?

plane

This PR does not fix the problem. The problem is that the bounce/reflect names are swapped from what users expect. It also introduces a new problem: not making any sense.

Any plane aligned with this direction will result in the same reflected vector.

That doesn't make sense to me. Reflecting or bouncing over the planes in the GIF will produce different results.

The description is consistent with the C++ code, maybe not with the parameter name, but again.

Yes, that's what I mean. The parameter names are not consistent.

I am not going to support incorrect documentation just to be internally consistent.

But now it's neither correct nor consistent.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@clayjohn There are an infinite amount of planes that pass through this parallel direction X axis, how does it determine which plane to use?

You are right. I was oversimplifying above and can see that now.

When visualizing the direction as a vector across a given plane (with a specific normal) it makes sense. But indeed, for any direction there are an infinite number of possible planes, so you would need the specific normal to know which plane is being used.

For 2D, it works because a line can be defined by a given direction, but that doesn't extend to 3D.

I'll make a PR with a better description!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Vector2.reflect() result is unexpected
7 participants