diff --git a/src/transformations.nim b/src/transformations.nim index d77d743..99c9378 100644 --- a/src/transformations.nim +++ b/src/transformations.nim @@ -1,17 +1,42 @@ import "./matrix" +from "./tuple" import Tuple4 import math -proc translation*(x, y, z: float): Matrix = matrix(@[1.0, 0.0, 0.0, x, 0.0, 1.0, 0.0, y, 0.0, 0.0, 1.0, z, 0.0, 0.0, 0.0, 1.0], 4, 4) +proc translation(x, y, z: float): Matrix = matrix(@[1.0, 0.0, 0.0, x, 0.0, 1.0, 0.0, y, 0.0, 0.0, 1.0, z, 0.0, 0.0, 0.0, 1.0], 4, 4) -proc scaling*(x, y, z: float): Matrix = matrix(@[x, 0.0, 0.0, 0.0, 0.0, y, 0.0, 0.0, 0.0, 0.0, z, 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) +proc translate*(mat: Matrix, x, y, z : float): Matrix = translation(x, y, z) * mat -proc rotationX*(radians: float): Matrix = matrix(@[1.0, 0.0, 0.0, 0.0, 0.0, cos(radians), -sin(radians), 0.0, 0.0, sin(radians), cos(radians), 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) +proc translate*(tup: Tuple4, x, y, z : float): Tuple4 = translation(x, y, z) * tup -proc rotationY*(radians: float): Matrix = matrix(@[cos(radians), 0.0, sin(radians), 0.0, 0.0, 1.0, 0.0, 0.0, -sin(radians), 0.0, cos(radians), 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) +proc scaling(x, y, z: float): Matrix = matrix(@[x, 0.0, 0.0, 0.0, 0.0, y, 0.0, 0.0, 0.0, 0.0, z, 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) -proc rotationZ*(radians: float): Matrix = matrix(@[cos(radians), -sin(radians), 0.0, 0.0, sin(radians), cos(radians), 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) +proc scale*(mat: Matrix, x, y, z: float): Matrix = scaling(x, y, z) * mat -proc shearing*(x_y, x_z, y_x, y_z, z_x, z_y: float): Matrix = matrix(@[1.0, x_y, x_z, 0.0, y_x, 1.0, y_z, 0.0, z_x, z_y, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) +proc scale*(tup: Tuple4, x, y, z: float): Tuple4 = scaling(x, y, z) * tup + +proc rotationX(radians: float): Matrix = matrix(@[1.0, 0.0, 0.0, 0.0, 0.0, cos(radians), -sin(radians), 0.0, 0.0, sin(radians), cos(radians), 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) + +proc rotateX*(mat: Matrix, radians: float): Matrix = rotationX(radians) * mat + +proc rotateX*(tup: Tuple4, radians: float): Tuple4 = rotationX(radians) * tup + +proc rotationY(radians: float): Matrix = matrix(@[cos(radians), 0.0, sin(radians), 0.0, 0.0, 1.0, 0.0, 0.0, -sin(radians), 0.0, cos(radians), 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) + +proc rotateY*(mat: Matrix, radians: float): Matrix = rotationY(radians) * mat + +proc rotateY*(tup: Tuple4, radians: float): Tuple4 = rotationY(radians) * tup + +proc rotationZ(radians: float): Matrix = matrix(@[cos(radians), -sin(radians), 0.0, 0.0, sin(radians), cos(radians), 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) + +proc rotateZ*(mat: Matrix, radians: float): Matrix = rotationZ(radians) * mat + +proc rotateZ*(tup: Tuple4, radians: float): Tuple4 = rotationZ(radians) * tup + +proc shearing(x_y, x_z, y_x, y_z, z_x, z_y: float): Matrix = matrix(@[1.0, x_y, x_z, 0.0, y_x, 1.0, y_z, 0.0, z_x, z_y, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0], 4, 4) + +proc shear*(mat: Matrix, x_y, x_z, y_x, y_z, z_x, z_y: float): Matrix = shearing(x_y, x_z, y_x, y_z, z_x, z_y) * mat + +proc shear*(tup: Tuple4, x_y, x_z, y_x, y_z, z_x, z_y: float): Tuple4 = shearing(x_y, x_z, y_x, y_z, z_x, z_y) * tup when isMainModule: import unittest