1
0
mirror of https://github.com/thes3m/XNI synced 2024-12-26 13:26:06 +01:00
Matej Jan a5e7c0f9ff Lerp added to vectors.
git-svn-id: http://xni.googlecode.com/svn/XNI@115 ac433895-eea3-a490-d80a-17149a75e588
2012-09-25 11:47:02 +00:00

187 lines
4.5 KiB
Objective-C

//
// Vector2.m
// XNI
//
// Created by Matej Jan on 9.9.10.
// Copyright 2010 Retronator. All rights reserved.
//
#import "Vector2.h"
#import "Retronator.Xni.Framework.h"
@implementation Vector2
// CONSTRUCTORS
- (id) initWithX:(float)x y:(float)y {
if (self = [super init]) {
data = Vector2Make(x, y);
}
return self;
}
- (id) initWithVector2Struct: (Vector2Struct*)vectorData {
if (self = [super init]) {
data = *vectorData;
}
return self;
}
- (id) initWithVector2: (Vector2*)vector {
return [self initWithVector2Struct:vector.data];
}
+ (Vector2*) vectorWithX:(float)x y:(float)y{
return [[[Vector2 alloc] initWithX:x y:y] autorelease];
}
+ (Vector2*) vectorWithStruct: (Vector2Struct*)vectorData {
return [[[Vector2 alloc] initWithVector2Struct:vectorData] autorelease];
}
+ (Vector2*) vectorWithVector: (Vector2*)vector {
return [[[Vector2 alloc] initWithVector2:vector] autorelease];
}
// PROPERTIES
- (float) x {return data.x;}
- (void) setX:(float)value {data.x = value;}
- (float) y {return data.y;}
- (void) setY:(float)value {data.y = value;}
- (Vector2Struct*) data {return &data;}
// METHODS
+ (Vector2*) normalize:(Vector2*)value {
Vector2Struct resultData = *value.data;
Vector2Normalize(&resultData);
return [Vector2 vectorWithStruct:&resultData];
}
+ (Vector2*) negate:(Vector2*)value {
Vector2Struct resultData = *value.data;
Vector2Negate(&resultData);
return [Vector2 vectorWithStruct:&resultData];
}
+ (Vector2*) add:(Vector2*)value1 to:(Vector2*)value2 {
Vector2Struct resultData;
Vector2Add(value1.data, value2.data, &resultData);
return [Vector2 vectorWithStruct:&resultData];
}
+ (Vector2*) subtract:(Vector2*)value1 by:(Vector2*)value2 {
Vector2Struct resultData;
Vector2Subtract(value1.data, value2.data, &resultData);
return [Vector2 vectorWithStruct:&resultData];
}
+ (Vector2*) multiply:(Vector2*)value by:(float)scalar {
Vector2Struct resultData;
Vector2Multiply(value.data, scalar, &resultData);
return [Vector2 vectorWithStruct:&resultData];
}
+ (float) dotProductOf:(Vector2*)value1 with:(Vector2*)value2 {
return Vector2DotProduct(value1.data, value2.data);
}
+ (Vector2*) transform:(Vector2*)value with:(Matrix*)matrix {
Vector2Struct resultData;
Vector2Transform(value.data, matrix.data, &resultData);
return [Vector2 vectorWithStruct:&resultData];
}
+ (Vector2*) transformNormal:(Vector2*)value with:(Matrix*)matrix {
Vector2Struct resultData;
Vector2TransformNormal(value.data, matrix.data, &resultData);
return [Vector2 vectorWithStruct:&resultData];
}
+ (Vector2*) lerp:(Vector2*)value1 to:(Vector2*)value2 by:(float)amount {
Vector2Struct resultData;
Vector2Lerp(value1.data, value2.data, amount, &resultData);
return [Vector2 vectorWithStruct:&resultData];
}
- (float) length {
return Vector2Length(self.data);
}
- (float) lengthSquared {
return Vector2LengthSquared(self.data);
}
- (Vector2*) normalize {
Vector2Normalize(&data);
return self;
}
- (Vector2*) negate {
Vector2Negate(&data);
return self;
}
- (Vector2*) set:(Vector2 *)value {
data = *value.data;
return self;
}
- (Vector2*) add:(Vector2*)value {
Vector2Add(self.data, value.data, self.data);
return self;
}
- (Vector2*) subtract:(Vector2*)value {
Vector2Subtract(self.data, value.data, self.data);
return self;
}
- (Vector2*) multiplyBy:(float)scalar {
Vector2Multiply(self.data, scalar, self.data);
return self;
}
- (Vector2*) transformWith:(Matrix*)matrix {
Vector2Transform(self.data, matrix.data, self.data);
return self;
}
- (Vector2*) transformNormalWith:(Matrix*)matrix {
Vector2TransformNormal(self.data, matrix.data, self.data);
return self;
}
- (id) copyWithZone:(NSZone *)zone {
return [[Vector2 allocWithZone:zone] initWithVector2Struct:&data];
}
- (BOOL) equals:(Vector2*)vector {
if (!vector) return NO;
return vector.data->x == data.x && vector.data->y == data.y;
}
- (BOOL) isEqual:(id)object {
if ([object isKindOfClass:[Vector2 class]]) {
return [self equals:object];
}
return NO;
}
- (NSString *) description {
return [NSString stringWithFormat:@"Vector(%f, %f)", data.x, data.y];
}
// Constants
+ (Vector2*) zero {return [Vector2 vectorWithX:0 y:0];}
+ (Vector2*) one {return [Vector2 vectorWithX:1 y:1];}
+ (Vector2*) unitX {return [Vector2 vectorWithX:1 y:0];}
+ (Vector2*) unitY {return [Vector2 vectorWithX:0 y:1];}
@end