// Copyright (c) 2015, Google Inc. Please see the AUTHORS file for details.
// All rights reserved. Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

library vector_math.test.opengl_matrix_test;

import 'dart:math';
import 'package:test/test.dart';

import 'package:vector_math/vector_math.dart';

import 'test_utils.dart';

void testUnproject() {
  final position = Vector3(0.0, 0.0, 0.0);
  final focusPosition = Vector3(0.0, 0.0, -1.0);
  final upDirection = Vector3(0.0, 1.0, 0.0);
  final lookat = makeViewMatrix(position, focusPosition, upDirection);
  final n = 0.1;
  final f = 1000.0;
  final l = -10.0;
  final r = 10.0;
  final b = -10.0;
  final t = 10.0;
  final frustum = makeFrustumMatrix(l, r, b, t, n, f);
  final C = frustum * lookat as Matrix4;
  final re = Vector3.zero();
  unproject(C, 0.0, 100.0, 0.0, 100.0, 50.0, 50.0, 1.0, re);
}

void testLookAt() {
  final eyePosition = Vector3(0.0, 0.0, 0.0);
  final lookAtPosition = Vector3(0.0, 0.0, -1.0);
  final upDirection = Vector3(0.0, 1.0, 0.0);

  final lookat = makeViewMatrix(eyePosition, lookAtPosition, upDirection);
  assert(lookat.getColumn(0).w == 0.0);
  assert(lookat.getColumn(1).w == 0.0);
  assert(lookat.getColumn(2).w == 0.0);
  assert(lookat.getColumn(3).w == 1.0);

  relativeTest(lookat.getColumn(0), Vector4(1.0, 0.0, 0.0, 0.0));
  relativeTest(lookat.getColumn(1), Vector4(0.0, 1.0, 0.0, 0.0));
  relativeTest(lookat.getColumn(2), Vector4(0.0, 0.0, 1.0, 0.0));
}

void testFrustumMatrix() {
  final n = 0.1;
  final f = 1000.0;
  final l = -1.0;
  final r = 1.0;
  final b = -1.0;
  final t = 1.0;
  final frustum = makeFrustumMatrix(l, r, b, t, n, f);
  relativeTest(frustum.getColumn(0), Vector4(2 * n / (r - l), 0.0, 0.0, 0.0));
  relativeTest(frustum.getColumn(1), Vector4(0.0, 2 * n / (t - b), 0.0, 0.0));
  relativeTest(frustum.getColumn(2),
      Vector4((r + l) / (r - l), (t + b) / (t - b), -(f + n) / (f - n), -1.0));
  relativeTest(
      frustum.getColumn(3), Vector4(0.0, 0.0, -2.0 * f * n / (f - n), 0.0));
}

void testPerspectiveMatrix() {
  final fov = pi / 2;
  final aspectRatio = 2.0;
  final zNear = 1.0;
  final zFar = 100.0;

  final perspective = makePerspectiveMatrix(fov, aspectRatio, zNear, zFar);
  relativeTest(perspective.getColumn(0), Vector4(0.5, 0.0, 0.0, 0.0));
  relativeTest(perspective.getColumn(1), Vector4(0.0, 1.0, 0.0, 0.0));
  relativeTest(
      perspective.getColumn(2), Vector4(0.0, 0.0, -101.0 / 99.0, -1.0));
  relativeTest(perspective.getColumn(3), Vector4(0.0, 0.0, -200.0 / 99.0, 0.0));
}

void testInfiniteMatrix() {
  final fov = pi / 2;
  final aspectRatio = 2.0;
  final zNear = 1.0;

  final infinite = makeInfiniteMatrix(fov, aspectRatio, zNear);
  relativeTest(infinite.getColumn(0), Vector4(0.5, 0.0, 0.0, 0.0));
  relativeTest(infinite.getColumn(1), Vector4(0.0, 1.0, 0.0, 0.0));
  relativeTest(infinite.getColumn(2), Vector4(0.0, 0.0, -1.0, -1.0));
  relativeTest(infinite.getColumn(3), Vector4(0.0, 0.0, -2.0, 0.0));
}

void testOrthographicMatrix() {
  final n = 0.1;
  final f = 1000.0;
  final l = -1.0;
  final r = 1.0;
  final b = -1.0;
  final t = 1.0;
  final ortho = makeOrthographicMatrix(l, r, b, t, n, f);
  relativeTest(ortho.getColumn(0), Vector4(2 / (r - l), 0.0, 0.0, 0.0));
  relativeTest(ortho.getColumn(1), Vector4(0.0, 2 / (t - b), 0.0, 0.0));
  relativeTest(ortho.getColumn(2), Vector4(0.0, 0.0, -2 / (f - n), 0.0));
  relativeTest(ortho.getColumn(3),
      Vector4(-(r + l) / (r - l), -(t + b) / (t - b), -(f + n) / (f - n), 1.0));
}

void testModelMatrix() {
  final view = Matrix4.zero();
  final position = Vector3(1.0, 1.0, 1.0);
  final focus = Vector3(0.0, 0.0, -1.0);
  final up = Vector3(0.0, 1.0, 0.0);

  setViewMatrix(view, position, focus, up);

  final model = Matrix4.zero();

  final forward = focus.clone();
  forward.sub(position);
  forward.normalize();

  final right = forward.cross(up).normalized();
  final u = right.cross(forward).normalized();

  setModelMatrix(model, forward, u, position.x, position.y, position.z);

  final result1 = view.clone();
  result1.multiply(model);

  relativeTest(result1, Matrix4.identity());
}

void main() {
  group('OpenGL', () {
    test('LookAt', testLookAt);
    test('Unproject', testUnproject);
    test('Frustum', testFrustumMatrix);
    test('Perspective', testPerspectiveMatrix);
    test('Infinite', testInfiniteMatrix);
    test('Orthographic', testOrthographicMatrix);
    test('ModelMatrix', testModelMatrix);
  });
}
