/* BBAtomShape.m				 
 *
 * This generates a RenderMan shape that represents an Atom. Normally we only
 * show up as a sphere in a certain color which is determind by the region
 * we are painted for. To speed up the drawing we store the useful data.
 *
 * For more interface-info see the header file. More in depth information
 * can be found in the source-code.
 *
 * Written by: 		Thomas Engel
 * Created:    		25.12.1993 (Copyleft)
 * Last modified: 	25.05.1994
 */

#import "BBAtomShape.h"
#import "BBAtom.h"
#import "BBMolecule.h"
#import "BBRegionShape.h"

@implementation BBAtomShape

- initFrom:anAtom asPartOf:aRegionShape;
{
	self = [super init];
	if( !self ) return self;

	// OK. We really are an object...here we go with our init.

	ourAtom = anAtom;
	ourRegionShape = aRegionShape;
	[self update];
	
	return self;
}

- renderSelf:(N3DCamera *)theCamera
{
	// Very simple. Just take what we have.
	
	RiColor( color );
	RiTranslate( x, y, z );
	RiSphere( radius, -radius, radius, 360.0, RI_NULL );

	return self;
}

- renderSelfAsBox:(N3DCamera *)theCamera
{
	// Just set the right color for the box !

	RiColor( color );	
	return [super renderSelfAsBox:theCamera];
}

- update
{
	// We just update (or init) everything we need for drawing.
	
	x = (float)[ourAtom xPos];
	y = (float)[ourAtom yPos];
	z = (float)[ourAtom zPos];
	
	// Now let's ask for all the other style settings.
	// What color should we take ? The regions color or the atoms color.
	
	radius = (RtFloat)[ourRegionShape atomRadius:self];
	
	if( [[ourRegionShape region] shapesInRegionColor] )
 			NXConvertColorToRGB( [[ourRegionShape region] color],
								 &color[0], &color[1], &color[2] );
	else	NXConvertColorToRGB( [ourAtom color],
								 &color[0], &color[1], &color[2] );
	
	// If we are selected be will use another color anyway;
/*	
	if( [ourAtom isSelected] )
			NXConvertColorToRGB( [ourRegionShape selectionColor],
								 &color[0], &color[1], &color[2] );
*/
	// To be able to draw boundings we have to set our bounding box here.
	
	boundingBox[0] = x - radius;
	boundingBox[1] = x + radius;
	boundingBox[2] = y - radius;
	boundingBox[3] = y + radius;
	boundingBox[4] = z - radius;
	boundingBox[5] = z + radius;
	
	return self;
}

- atom
{
	return ourAtom;
}

@end

/*
 * History: 23.05.94 Small changes to work with the new shape stuff.
 *					 Sets its bounding box correctly.
 *
 *			07.05.94 Changed the name:BBAtomShape and the init method.
 *
 *			03.01.94 Added NXColor support to this object
 *
 *
 * Bugs: Hmmm
 */