Skip to content

Conversation

@Annonnymmousss
Copy link
Contributor

@Annonnymmousss Annonnymmousss commented Dec 24, 2025

fix the global state showcase when grabbed even after rotating with an angle
code todo - https://discord.com/channels/731730685944922173/881073965047636018/1399533117441835080

Screen.Recording.2025-12-24.at.6.13.43.AM.1.mov

@Keavon kindly review this

didnt got the issue no.

Comment on lines 568 to 578
let viewport_delta = input.mouse.position - self.mouse_position;
let document_space_transform = self.initial_transform * document_to_viewport.inverse();
let delta_pos = if self.state.is_transforming_in_local_space {
let [local_x_axis, local_y_axis] = self.state.local_transform_axes;
let local_components = DVec2::new(viewport_delta.dot(local_x_axis), viewport_delta.dot(local_y_axis));
document_space_transform.matrix2 * local_components
} else {
document_space_transform.transform_vector2(viewport_delta)
};
let scale = document_to_viewport.y_axis.length();
let delta_scaled = (if self.slow { delta_pos / SLOWING_DIVISOR } else { delta_pos }) / scale;
Copy link
Contributor

Choose a reason for hiding this comment

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

Along with adding significant complexity here, you have also broken the «local x-axis constraint» feature (press G to grab then press X twice.

broken_local_grab.mp4

I don't see why there should be any changes to the functionality of the system, since the issue concerned only changing the overlays.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

letme try this again

@Annonnymmousss
Copy link
Contributor Author

this solved the constraint breakage but now every scale is getting calculated with reference to global axis only
can you help me?

@0HyperCube
Copy link
Contributor

scale is getting calculated with reference to global axis only

The scale by pressing key S then X will scale in viewport space. Pressing X again will scale in local space. This is the intended behaviour.

@Annonnymmousss
Copy link
Contributor Author

Annonnymmousss commented Dec 24, 2025

image

i meant this scale the length. It is calculated with reference to global axis(

@0HyperCube
Copy link
Contributor

0HyperCube commented Dec 24, 2025

This is the issue in #3341 that you are trying to solve in this PR? I am confused since you linked an unrelated discord post…

I assume you are referring to the blue numbers in your screenshot. These are drawn by the overlay_context.translation_box function. If you look at the implementation, you will see that it uses the first argument, translation, to determine the numbers that are drawn. To change these numbers, you can transform the vector:

// A transformation to the local space of the transformation from the document
let document_to_local = glam::DMat2::from_cols(self.state.local_transform_axes[0], self.state.local_transform_axes[1]).inverse();
let transform_local = document_to_local * document_to_viewport.matrix2.inverse() * translation_viewport;
overlay_context.translation_box(transform_local, quad, typed_string);

@Keavon Keavon marked this pull request as draft December 25, 2025 00:30
@Annonnymmousss
Copy link
Contributor Author

yeah sorry for the confusion created due to terminologies ill keep this in mind for my further contributions.
and ill be working on it..

@Annonnymmousss
Copy link
Contributor Author

Screen.Recording.2025-12-25.at.6.37.00.PM.1.mov

I have made some changes i guess it fixes the issue. Please review it and let me know if any breakage is caused or any suggestions.

@Annonnymmousss Annonnymmousss marked this pull request as ready for review December 25, 2025 13:15
Comment on lines 253 to 254
let document_to_local = glam::DMat2::from_cols(self.state.local_transform_axes[0], self.state.local_transform_axes[1]).inverse();
let transform_local = document_to_local * document_to_viewport.matrix2.inverse() * translation_viewport;
Copy link
Contributor

@0HyperCube 0HyperCube Dec 25, 2025

Choose a reason for hiding this comment

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

Suggested change
let document_to_local = glam::DMat2::from_cols(self.state.local_transform_axes[0], self.state.local_transform_axes[1]).inverse();
let transform_local = document_to_local * document_to_viewport.matrix2.inverse() * translation_viewport;
let viewport_to_local = glam::DMat2::from_cols(self.state.local_transform_axes[0], self.state.local_transform_axes[1]).inverse();
let transform_local = viewport_to_local * translation_viewport / document_to_viewport.matrix2.y_axis.length();

I scuffed up the transformations sorry. The local_transform_axes are actually in viewport space.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

ya i will update these changes

Copy link
Contributor

@0HyperCube 0HyperCube left a comment

Choose a reason for hiding this comment

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

Looks good to me; thanks for your work on these changes.

I'm a bit unsure as to if the local space should be shown when transforming on the global X-axis (G then X once). It also breaks the measuring number in that case when you type some digits to choose an exact translation. This is because the exact typed number is used to avoid rounding errors.

@Annonnymmousss
Copy link
Contributor Author

Annonnymmousss commented Dec 25, 2025

okay if that would be the case I will open another PR.

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants