/*	TransformController.m - Determine current transformation.
 *	Copyright (C) 1993 Corona Design, Inc. All rights reserved.
 *
 *	Abstract
 *		Encapsulates the interface for specifying viewing angle. This is
 *		done via CircularSliders specifying Latitude and Longitude.
 *
 *	RCS path: 
 *		$Source: /Users/pkron/Projects/voxel/Pyramid/RCS/TransformController.m,v $
 *	Modified: $Date: 93/09/15 12:35:26 $ by $Author: pkron $
 *	Current State: $State: Exp $ locked by $Locker:  $
 */

#import	"TransformController.h"
#import	"standard.h"

								// add some trigononmetry to standard Controls
@implementation Control( radians)

#define	PI				3.1415926536
#define	RAD(degrees)	((degrees)/180.*PI)

- (float)radiansValue
	{
	return( RAD( [self floatValue]));
	}
	

- (float)cosValue
	{
	return( cos( [self radiansValue]));
	}
	

- (float)sinValue
	{
	return( sin( [self radiansValue]));
	}
	

@end

@implementation TransformController

- init
	{
	[super init];
	transform = allocIdentity();
	return( self);
	}

	
#define	DISTANCE		([distance floatValue]+1)

- (MATRIX)transform
	{
	POINT	aPoint;
	POINT	up;
	float	cosLatitude = [latitude  cosValue];

								// compute normal from latitude/longitude
								// vector has length 1 and is normal to
								// viewing plane
	aPoint[2] = [latitude  sinValue];
	aPoint[0] = cosLatitude * [longitude cosValue];
	aPoint[1] = cosLatitude * [longitude sinValue];
	aPoint[3] = 0;

								// define UP. Note it must change as the
								// viewing angle gets upside-down		
	up[0] = 0;
	up[1] = 0;
	up[2] = cosLatitude GE 0 ? 1 : -1;
	up[3] = 0;

								// create a new matrix with this setting
	freeMatrix( transform);
	transform = allocIdentity();
	orient( transform, &aPoint, &up);
	viewDistance( transform, DISTANCE);
	
	return( transform);
	}
	

@end

#ifdef	_LOG
/*
 *	$Log:	TransformController.m,v $
Revision 1.1  93/09/15  12:35:26  pkron
Created.

 */
#endif		
