//
//  Vrml 97 library
//  Copyright (C) 1998 Chris Morley
//
//  %W% %G%
//  VrmlNodeCollision.cpp

#include "VrmlNodeCollision.h"
#include "MathUtils.h"
#include "VrmlNodeType.h"


static VrmlNode *creator(VrmlScene *s) { return new VrmlNodeCollision(s); }


// Define the built in VrmlNodeType:: "Collision" fields

VrmlNodeType *VrmlNodeCollision::defineType(VrmlNodeType *t)
{
  static VrmlNodeType *st = 0;

  if (! t)
    {
      if (st) return st;
      t = st = new VrmlNodeType("Collision", creator);
    }

  VrmlNodeGroup::defineType(t);	// Parent class
  t->addExposedField("collide", VrmlField::SFBOOL);
  t->addField("proxy", VrmlField::SFNODE);
  t->addEventOut("collideTime", VrmlField::SFTIME);

  return t;
}

VrmlNodeType *VrmlNodeCollision::nodeType() const { return defineType(0); }


VrmlNodeCollision::VrmlNodeCollision(VrmlScene *scene) :
  VrmlNodeGroup(scene),
  d_collide(true)
{
}

VrmlNodeCollision::~VrmlNodeCollision()
{
}


VrmlNode *VrmlNodeCollision::cloneMe() const
{
  return new VrmlNodeCollision(*this);
}

void VrmlNodeCollision::cloneChildren(VrmlNamespace *ns)
{
  VrmlNodeGroup::cloneChildren(ns);
  if (d_proxy.get())
    d_proxy.set(d_proxy.get()->clone(ns));
}

bool VrmlNodeCollision::isModified() const
{
  return ( (d_proxy.get() && d_proxy.get()->isModified()) ||
	   VrmlNodeGroup::isModified() );
}

void VrmlNodeCollision::clearFlags()
{
  VrmlNodeGroup::clearFlags();
  if (d_proxy.get()) d_proxy.get()->clearFlags();
}


void VrmlNodeCollision::addToScene( VrmlScene *s, const char *rel )
{
  VrmlNodeGroup::addToScene(s, rel);
  if (d_proxy.get()) d_proxy.get()->addToScene(s, rel);
}

// Copy the routes to nodes in the given namespace.

void VrmlNodeCollision::copyRoutes( VrmlNamespace *ns ) const
{
  VrmlNodeGroup::copyRoutes(ns);
  if (d_proxy.get()) d_proxy.get()->copyRoutes(ns);
}

ostream& VrmlNodeCollision::printFields(ostream& os, int indent)
{
  if (! d_collide.get()) PRINT_FIELD(collide);
  if (d_proxy.get()) PRINT_FIELD(proxy);

  VrmlNodeGroup::printFields(os, indent);
  return os;
}


// Set the value of one of the node fields.

void VrmlNodeCollision::setField(const char *fieldName,
				 const VrmlField &fieldValue)
{
  if TRY_FIELD(collide, SFBool)
  else if TRY_SFNODE_FIELD(proxy, Child)
  else
    VrmlNodeGroup::setField(fieldName, fieldValue);
}

