//
//  Vrml 97 library
//  Copyright (C) 1998 Chris Morley
//
//  %W% %G%
//  VrmlNodeTextureTransform.cpp

#include "VrmlNodeTextureTransform.h"
#include "VrmlNodeType.h"
#include "MathUtils.h"
#include "Viewer.h"

static VrmlNode *creator( VrmlScene *s ) {
  return new VrmlNodeTextureTransform(s); 
}


// Define the built in VrmlNodeType:: "TextureTransform" fields

VrmlNodeType *VrmlNodeTextureTransform::defineType(VrmlNodeType *t)
{
  static VrmlNodeType *st = 0;

  if (! t)
    {
      if (st) return st;		// Only define the type once.
      t = st = new VrmlNodeType("TextureTransform", creator);
    }

  VrmlNode::defineType(t);	// Parent class
  t->addExposedField("center", VrmlField::SFVEC2F);
  t->addExposedField("rotation", VrmlField::SFFLOAT);
  t->addExposedField("scale", VrmlField::SFVEC2F);
  t->addExposedField("translation", VrmlField::SFVEC2F);

  return t;
}

VrmlNodeType *VrmlNodeTextureTransform::nodeType() const 
{ return defineType(0); }


VrmlNodeTextureTransform::VrmlNodeTextureTransform(VrmlScene *scene) :
  VrmlNode(scene),
  d_center(0.0, 0.0),
  d_rotation(0.0),
  d_scale(1.0, 1.0),
  d_translation(0.0, 0.0)
{
}

VrmlNodeTextureTransform::~VrmlNodeTextureTransform()
{
}


VrmlNode *VrmlNodeTextureTransform::cloneMe() const
{
  return new VrmlNodeTextureTransform(*this);
}


VrmlNodeTextureTransform* VrmlNodeTextureTransform::toTextureTransform() const 
{ return (VrmlNodeTextureTransform*) this; }


ostream& VrmlNodeTextureTransform::printFields(ostream& os, int indent)
{
  if (! FPZERO(d_center.x()) ||
      ! FPZERO(d_center.y()))
    PRINT_FIELD(center);

  if (! FPZERO(d_rotation.get()))
    PRINT_FIELD(rotation);

  if (! FPEQUAL(d_scale.x(), 1.0) ||
      ! FPEQUAL(d_scale.y(), 1.0))
    PRINT_FIELD(scale);
  if (! FPZERO(d_translation.x()) ||
      ! FPZERO(d_translation.y()))
    PRINT_FIELD(translation);
      
  return os;
}


void VrmlNodeTextureTransform::render(Viewer *viewer)
{
  viewer->setTextureTransform( d_center.get(),
			       d_rotation.get(),
			       d_scale.get(),
			       d_translation.get() );
  clearModified();
}


// Set the value of one of the node fields.

void VrmlNodeTextureTransform::setField(const char *fieldName,
					const VrmlField &fieldValue)
{
  if TRY_FIELD(center, SFVec2f)
  else if TRY_FIELD(rotation, SFFloat)
  else if TRY_FIELD(scale, SFVec2f)
  else if TRY_FIELD(translation, SFVec2f)
  else
    VrmlNode::setField(fieldName, fieldValue);
}

