void ramDrawActorCube(ramNodeArray& nodeArray)
{
	if (nodeArray.getNumNode() == 0) return;

	ofVec3f maxPos = nodeArray.getNode(ramActor::JOINT_CHEST).getGlobalPosition();
	ofVec3f minPos = nodeArray.getNode(ramActor::JOINT_CHEST).getGlobalPosition();

	for (int j = 0; j < nodeArray.getNumNode(); j++)
	{
		ofVec3f pos = nodeArray.getNode(j).getGlobalPosition();

		if (maxPos.x <= pos.x) maxPos.x = pos.x;
		if (maxPos.y <= pos.y) maxPos.y = pos.y;
		if (maxPos.z <= pos.z) maxPos.z = pos.z;

		if (minPos.x > pos.x) minPos.x = pos.x;
		if (minPos.y > pos.y) minPos.y = pos.y;
		if (minPos.z > pos.z) minPos.z = pos.z;
	}

	ofVec3f scale, axis;
	scale = (maxPos - minPos);
	axis = (maxPos + minPos) / 2;

	ofPushStyle();
	ofPushMatrix();
	{
		ofTranslate(axis.x, axis.y, axis.z);
		ofScale(scale.x, scale.y, scale.z);
		ofNoFill();
		ofDrawBox(1);
	}
	ofPopMatrix();
	ofPopStyle();
}
void ramDrawNodes(const ramNodeArray& nodeArray)
{
	if (nodeArray.getNumNode() == 0) return;

	if (nodeArray.isActor())
		ramDrawBasicActor((ramActor &)nodeArray);
	else
		ramDrawBasicRigid((ramRigidBody &)nodeArray);
}
void ramDrawNodeCorresponds(const ramNodeArray &a, const ramNodeArray &b)
{
	if (a.getNumNode() == 0) return;

	if (b.getNumNode() == 0) return;

	assert(a.getNumNode() == b.getNumNode());

	for (int i = 0; i < a.getNumNode(); i++)
	{
		ofLine(a.getNode(i).getGlobalPosition(), b.getNode(i).getGlobalPosition());
	}
}
void ramActorsScene::drawNodes(const ramNodeArray &NA)
{
	ofPushStyle();
	
	ofNoFill();
	ofSetRectMode(OF_RECTMODE_CENTER);
	
	glPushAttrib(GL_ALL_ATTRIB_BITS);
	glEnable(GL_CULL_FACE);
	
	ofColor front_color(ofGetStyle().color, 200);
	ofColor back_color(ofGetStyle().color, 150);
	
	for (int i = 0; i < NA.getNumNode(); i++)
	{
		ofSetColor(front_color);
		
		const ramNode &node = NA.getNode(i);
		const ramNode *parent = node.getParent();
		if (parent == NULL) continue;
		
		ramBox(node, 2);
		
		parent->beginTransform();
		
		ofVec3f axis(0, 0, 1);
		ofVec3f c = node.getPosition().normalized().crossed(axis);
		
		ofRotate(90, c.x, c.y, c.z);
		
		ofVec3f p0 = node.getGlobalPosition();
		ofVec3f p1 = parent->getGlobalPosition();
		
		float dist = p0.distance(p1);
		float offset = 0.2;
		
		glNormal3f(0, 0, 0);
		ofLine(ofVec3f(0), ofVec3f(0, 0, -dist));
		
		if (i < 4)
			glScalef(1., 1.8, 1);
		else if (i == 4)
			glScalef(1, 1, 3);
		else
			glScalef(1., 0.8, 1);
		
		glBegin(GL_TRIANGLE_STRIP);
		for (int n = 0; n < 6; n++)
		{
			float d = ofMap(n, 0, 5, 0, 1);
			float dd = ofMap(d, 0, 1, offset, 1 - offset);
			
			float xx = sin(d * PI) * 2 + 4;
			float zz = dd * -dist;
			float w = 5;
			
			glNormal3f(1, 0.5, 0);
			glVertex3f(xx, w, zz);
			glNormal3f(1, -0.5, 0);
			glVertex3f(xx, -w, zz);
		}
		glEnd();
		
		ofSetColor(back_color);
		
		glBegin(GL_TRIANGLE_STRIP);
		for (int n = 0; n < 6; n++)
		{
			float d = ofMap(n, 0, 5, 0, 1);
			float dd = ofMap(d, 0, 1, offset, 1 - offset);
			
			float xx = -sin(d * PI) * 1 - 6;
			float zz = dd * -dist;
			float w = 3;
			
			glNormal3f(-1, 0.5, 0);
			glVertex3f(xx, -w, zz);
			glNormal3f(-1, -0.5, 0);
			glVertex3f(xx, w, zz);
		}
		glEnd();
		
		parent->endTransform();
	}
	
	glPopAttrib();
	
	ofPopStyle();
}