summaryrefslogtreecommitdiffhomepage
path: root/quad_camera_tracker.rb
diff options
context:
space:
mode:
Diffstat (limited to 'quad_camera_tracker.rb')
-rw-r--r--quad_camera_tracker.rb248
1 files changed, 0 insertions, 248 deletions
diff --git a/quad_camera_tracker.rb b/quad_camera_tracker.rb
deleted file mode 100644
index 95f6cbd..0000000
--- a/quad_camera_tracker.rb
+++ /dev/null
@@ -1,248 +0,0 @@
-# frozen_string_literal: true
-
-module QuadCameraTracker
- def update(options = {})
- if options[:x] and options[:y]
- @x1 -= options[:x]
- @x2 -= options[:x]
- @x3 -= options[:x]
- @x4 -= options[:x]
- @y1 -= options[:y]
- @y2 -= options[:y]
- @y3 -= options[:y]
- @y4 -= options[:y]
- end
- if options[:zoom]
- @x1 *= options[:zoom]
- @x2 *= options[:zoom]
- @x3 *= options[:zoom]
- @x4 *= options[:zoom]
- @y1 *= options[:zoom]
- @y2 *= options[:zoom]
- @y3 *= options[:zoom]
- @y4 *= options[:zoom]
- end
- if options[:rotate]
- x_pivot = -x
- y_pivot = -y
- calc_angle = (Math::PI * options[:rotate]) / 180
- x_shifted1 = x1 - x_pivot
- y_shifted1 = y1 - y_pivot
- x_shifted2 = x2 - x_pivot
- y_shifted2 = y2 - y_pivot
- x_shifted3 = x3 - x_pivot
- y_shifted3 = y3 - y_pivot
- x_shifted4 = x4 - x_pivot
- y_shifted4 = y4 - y_pivot
-
- self.x1 = x_pivot + (x_shifted1 * Math.cos(calc_angle) - y_shifted1 * Math.sin(calc_angle))
- self.y1 = y_pivot + (x_shifted1 * Math.sin(calc_angle) + y_shifted1 * Math.cos(calc_angle))
-
- self.x2 = x_pivot + (x_shifted2 * Math.cos(calc_angle) - y_shifted2 * Math.sin(calc_angle))
- self.y2 = y_pivot + (x_shifted2 * Math.sin(calc_angle) + y_shifted2 * Math.cos(calc_angle))
-
- self.x3 = x_pivot + (x_shifted3 * Math.cos(calc_angle) - y_shifted3 * Math.sin(calc_angle))
- self.y3 = y_pivot + (x_shifted3 * Math.sin(calc_angle) + y_shifted3 * Math.cos(calc_angle))
-
- self.x4 = x_pivot + (x_shifted4 * Math.cos(calc_angle) - y_shifted4 * Math.sin(calc_angle))
- self.y4 = y_pivot + (x_shifted4 * Math.sin(calc_angle) + y_shifted4 * Math.cos(calc_angle))
- end
- end
-
- # Uses a 'fast' method of getting the center
- # perfectly accurate for squares and rectangles
- # may be inaccurate for other quadrilaterals
- def lazy_center
- [([@x1, @x2, @x3, @x4].min + [@x1, @x2, @x3, @x4].max) / 2,
- ([@y1, @y2, @y3, @y4].min + [@y1, @y2, @y3, @y4].max) / 2]
- end
-
- def width
- [@x1, @x2, @x3, @x4].max - [@x1, @x2, @x3, @x4].min
- end
-
- def height
- [@y1, @y2, @y3, @y4].max - [@y1, @y2, @y3, @y4].min
- end
-
- def x
- @x ||= @x1 / Camera.zoom_level + Camera.camera_position[0]
- end
-
- def x=(x)
- diff = x - self.x
- self.x1 += diff
- self.x2 += diff
- self.x3 += diff
- self.x4 += diff
- @x = x
- end
-
- def y
- @y ||= @y1 / Camera.zoom_level + Camera.camera_position[1]
- end
-
- def y=(y)
- diff = y - self.y
- self.y1 += diff
- self.y2 += diff
- self.y3 += diff
- self.y4 += diff
- @y = y
- end
-
- def size
- @size ||= 1
- end
-
- def size=(size)
- # should resize based on the top left point
- # offset rotation to shape
- end
-
- def x1_debug
- @x1
- end
-
- def x1
- temp_angle = (Math::PI * -Camera.rotation_degrees) / 180
- rotatedx = (@x1 * Math.cos(temp_angle) - @y1 * Math.sin(temp_angle))
-
- #rotatedx / Camera.zoom_level + Camera.camera_position[0] - x
- temp_move_x = @x1 / Camera.zoom_level + Camera.camera_position[0] - x
- temp_move_y = @y1 / Camera.zoom_level + Camera.camera_position[1] - y
- temp_move_x * Math.cos(temp_angle) - temp_move_y * Math.sin(temp_angle)
- #@y = (x_shifted * Math.sin(@angle) + @y1 * Math.cos(@angle))
- # undo rotation/translation/zoom
- end
-
- # Should modify the x1 methods so they move everything else isntead
- # this is so that x1 is always the "origin" aka 0,0 of the shape
- def x1=(x1)
- temp_angle = (Math::PI * -Camera.rotation_degrees) / 180
- @x1 = ((x1 + x) - Camera.camera_position[0]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- def y1
- @y1 / Camera.zoom_level + Camera.camera_position[1] - y
- # undo rotation/translation/zoom
- end
-
- def y1=(y1)
- @y1 = ((y1 + y) - Camera.camera_position[1]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- def x2
- (@x2) / Camera.zoom_level + Camera.camera_position[0] - x
- # undo rotation/translation/zoom
- end
-
- def x2=(x2)
- @x2 = ((x2 + x) - Camera.camera_position[0]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- def y2
- (@y2) / Camera.zoom_level + Camera.camera_position[1] - y
- # undo rotation/translation/zoom
- end
-
- def y2=(y2)
- @y2 = ((y2 + y) - Camera.camera_position[1]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- def x3
- (@x3) / Camera.zoom_level + Camera.camera_position[0] - x
- # undo rotation/translation/zoom
- end
-
- def x3=(x3)
- @x3 = ((x3 + x) - Camera.camera_position[0]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- def y3
- (@y3) / Camera.zoom_level + Camera.camera_position[1] - y
- # undo rotation/translation/zoom
- end
-
- def y3=(y3)
- @y3 = ((y3 + y) - Camera.camera_position[1]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- def x4
- @x4 / Camera.zoom_level + Camera.camera_position[0] - x
- # undo rotation/translation/zoom
- end
-
- def x4=(x4)
- @x4 = ((x4 + x) - Camera.camera_position[0]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- def y4
- @y4 / Camera.zoom_level + Camera.camera_position[1] - y
- # undo rotation/translation/zoom
- end
-
- def y4=(y4)
- @y4 = ((y4 + y) - Camera.camera_position[1]) * Camera.zoom_level
- # add rotation level
- # apply rotation/translation/zoom then pass to super
- end
-
- attr_writer :rotation_degrees
-
- def rotation_degrees
- @rotation_degrees ||= 0
- end
-
- def rotate_relative(x_pivot, y_pivot, angle)
- self.rotation_degrees += angle
- self.rotation_degrees %= 360
- calc_angle = (Math::PI * angle) / 180
- x_shifted1 = self.x1 - x_pivot
- y_shifted1 = self.y1 - y_pivot
- x_shifted2 = self.x2 - x_pivot
- y_shifted2 = self.y2 - y_pivot
- x_shifted3 = self.x3 - x_pivot
- y_shifted3 = self.y3 - y_pivot
- x_shifted4 = self.x4 - x_pivot
- y_shifted4 = self.y4 - y_pivot
-
- # Used to update x and y later in the code
- x1_old = self.x1
- y1_old = self.y1
-
- self.x1 = x_pivot + (x_shifted1 * Math.cos(calc_angle) - y_shifted1 * Math.sin(calc_angle))
- self.y1 = y_pivot + (x_shifted1 * Math.sin(calc_angle) + y_shifted1 * Math.cos(calc_angle))
-
- self.x2 = x_pivot + (x_shifted2 * Math.cos(calc_angle) - y_shifted2 * Math.sin(calc_angle))
- self.y2 = y_pivot + (x_shifted2 * Math.sin(calc_angle) + y_shifted2 * Math.cos(calc_angle))
-
- self.x3 = x_pivot + (x_shifted3 * Math.cos(calc_angle) - y_shifted3 * Math.sin(calc_angle))
- self.y3 = y_pivot + (x_shifted3 * Math.sin(calc_angle) + y_shifted3 * Math.cos(calc_angle))
-
- self.x4 = x_pivot + (x_shifted4 * Math.cos(calc_angle) - y_shifted4 * Math.sin(calc_angle))
- self.y4 = y_pivot + (x_shifted4 * Math.sin(calc_angle) + y_shifted4 * Math.cos(calc_angle))
-
- # Updates x and y to be on the origin correctly
- @x += -x1_old + self.x1
- @y += -y1_old + self.y1
- end
-
- def rotate(angle)
- rotate_relative(0, 0, angle)
- end
-end