int main (int argc, char *argv[])
{
	Vector3f colour_yellow = {{0.8f, 0.8f, 0.1f}};
	Material* mat_yellow = MaterialCreate("yellow", colour_yellow);
	
	Vector3f plane1_dir = {{0.0f, 0.0f, 1.0f}};
	Primative* plane1 = PrimativeCreatePlane(&plane1_dir, 0.0f, mat_yellow);
	
	Vector3f ray_dir = {{0.0f,2.0f,-1.0f}};
	ray_dir = Vector3fNormalize(&ray_dir);
	Vector3f ray_or = {{0.0f, 0.0f, 2.0f}};
	Ray* r = RayCreate(ray_or, ray_dir);
	
	IntersectPoint* ip = PrimativeIntersect(plane1, r);
	int ip_type = IntersectPointGetType(ip);
	float ip_dist = IntersectPointGetDistance(ip);
	Vector3f* ip_pos = IntersectPointGetPos(ip);
	
	printf("iptype = %d\n", ip_type);
	printf("ipdistance = %f\n", ip_dist);
	printf("ip position: \n");
	Vector3fPrint(ip_pos);
	
	return 0;
}
void test_basic_quaternion_to_eulers(void) {
    Vector3F eulers;
    Quaternion q = { 1, 0, 0, 0 };

    QuaternionToEulers(&q, &eulers);
    Vector3fPrint(&eulers);
    assert(eulers.a == 0);
    assert(eulers.b == 0);
    assert(eulers.c == 0);

    q.a = -0.0;
    q.b = 1.0;
    QuaternionToEulers(&q, &eulers);
    Vector3fPrint(&eulers);
    assert(NearEqual(eulers.a, PI, 0.001));
    assert(eulers.b == 0);
    assert(eulers.c == 0);

    q.a = 0.707141;
    q.b = 0.7073;
    QuaternionToEulers(&q, &eulers);
    Vector3fPrint(&eulers);
    assert(NearEqual(eulers.a, PI_DIV_2, 0.001));
    assert(eulers.b == 0);
    assert(eulers.c == 0);

    q.c = q.b;
    q.b = 0;
    QuaternionToEulers(&q, &eulers);
    Vector3fPrint(&eulers);
    assert(eulers.a == 0);
    assert(NearEqual(eulers.b, PI_DIV_2, 0.001));
    assert(eulers.c == 0);

    q.d = q.c;
    q.c = 0;
    QuaternionToEulers(&q, &eulers);
    Vector3fPrint(&eulers);
    assert(eulers.a == 0);
    assert(eulers.b == 0);
    assert(NearEqual(eulers.c, PI_DIV_2, 0.001));
}
void test_quaternion_lerp(void) {
    Quaternion a, b, c;
    QuaternionZero(&a);
    Vector3F eulers = {.1, 0, 0};
    QuaternionFromEulers(&eulers, &b);

    QuaternionLerp(&a, &b, .2, &c);
    QuaternionToEulers(&c, &eulers);
    Vector3fPrint(&eulers);

    assert(NearEqual(eulers.a, 0.02, 0.001));
    assert(eulers.b == 0);
    assert(eulers.c == 0);
}
void test_quaternion_difference(void) {
    Quaternion a, b, c;
    Vector3F eulers;

    eulers.a = 1;
    eulers.b = 0;
    eulers.c = 0;
    QuaternionFromEulers(&eulers, &a);

    eulers.a = .5;
    eulers.b = 0;
    eulers.c = 0;
    QuaternionFromEulers(&eulers, &b);

    QuaternionDifference(&a, &b, &c);
    QuaternionToEulers(&c, &eulers);
    Vector3fPrint(&eulers);
    assert(NearEqual(eulers.a, 0.5, 0.001));
    assert(eulers.b == 0);
    assert(eulers.c == 0);
}