Created
May 15, 2022 13:17
-
-
Save 2439905184/3439e4c9b5ce4d7e78a7632488e2f6ee to your computer and use it in GitHub Desktop.
标尺自绘制实现代码(godot)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Code taken and modified from Godot's source code | |
func _draw() -> void: | |
var transform := Transform2D() | |
var ruler_transform := Transform2D() | |
var major_subdivide := Transform2D() | |
var minor_subdivide := Transform2D() | |
var zoom: float = 1 / Global.camera.zoom.x | |
transform.x = Vector2(zoom, zoom) | |
# This tracks the "true" top left corner of the drawing: | |
transform.origin = ( | |
Global.main_viewport.rect_size / 2 | |
+ Global.camera.offset.rotated(-Global.camera.rotation) * -zoom | |
) | |
var proj_size := Global.current_project.size | |
# Calculating the rotated corners of the image, use min to find the farthest left | |
var a := Vector2.ZERO # Top left | |
var b := Vector2(proj_size.x, 0).rotated(-Global.camera.rotation) # Top right | |
var c := Vector2(0, proj_size.y).rotated(-Global.camera.rotation) # Bottom left | |
var d := Vector2(proj_size.x, proj_size.y).rotated(-Global.camera.rotation) # Bottom right | |
transform.origin.x += min(min(a.x, b.x), min(c.x, d.x)) * zoom | |
var basic_rule := 100.0 | |
var i := 0 | |
while basic_rule * zoom > 100: | |
basic_rule /= 5.0 if i % 2 else 2.0 | |
i += 1 | |
i = 0 | |
while basic_rule * zoom < 100: | |
basic_rule *= 2.0 if i % 2 else 5.0 | |
i += 1 | |
ruler_transform = ruler_transform.scaled(Vector2(basic_rule, basic_rule)) | |
major_subdivide = major_subdivide.scaled( | |
Vector2(1.0 / major_subdivision, 1.0 / major_subdivision) | |
) | |
minor_subdivide = minor_subdivide.scaled( | |
Vector2(1.0 / minor_subdivision, 1.0 / minor_subdivision) | |
) | |
first = (transform * ruler_transform * major_subdivide * minor_subdivide).affine_inverse().xform( | |
Vector2.ZERO | |
) | |
last = (transform * ruler_transform * major_subdivide * minor_subdivide).affine_inverse().xform( | |
Global.main_viewport.rect_size | |
) | |
for j in range(ceil(first.x), ceil(last.x)): | |
var position: Vector2 = (transform * ruler_transform * major_subdivide * minor_subdivide).xform( | |
Vector2(j, 0) | |
) | |
if j % (major_subdivision * minor_subdivision) == 0: | |
draw_line( | |
Vector2(position.x + RULER_WIDTH, 0), | |
Vector2(position.x + RULER_WIDTH, RULER_WIDTH), | |
Color.white | |
) | |
var val = (ruler_transform * major_subdivide * minor_subdivide).xform(Vector2(j, 0)).x | |
draw_string( | |
font, Vector2(position.x + RULER_WIDTH + 2, font.get_height() - 4), str(int(val)) | |
) | |
else: | |
if j % minor_subdivision == 0: | |
draw_line( | |
Vector2(position.x + RULER_WIDTH, RULER_WIDTH * 0.33), | |
Vector2(position.x + RULER_WIDTH, RULER_WIDTH), | |
Color.white | |
) | |
else: | |
draw_line( | |
Vector2(position.x + RULER_WIDTH, RULER_WIDTH * 0.66), | |
Vector2(position.x + RULER_WIDTH, RULER_WIDTH), | |
Color.white | |
) |
Author
2439905184
commented
May 15, 2022
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment