// // Vrml 97 library // Copyright (C) 1998 Chris Morley // // %W% %G% // VrmlNodePositionInt.cpp #include "VrmlNodePositionInt.h" #include "VrmlNodeType.h" #include "VrmlScene.h" // PositionInt factory. static VrmlNode *creator( VrmlScene *scene ) { return new VrmlNodePositionInt(scene); } // Define the built in VrmlNodeType:: "PositionInt" fields VrmlNodeType *VrmlNodePositionInt::defineType(VrmlNodeType *t) { static VrmlNodeType *st = 0; if (! t) { if (st) return st; // Only define the type once. t = st = new VrmlNodeType("PositionInterpolator", creator); } VrmlNodeChild::defineType(t); // Parent class t->addEventIn("set_fraction", VrmlField::SFFLOAT); t->addExposedField("key", VrmlField::MFFLOAT); t->addExposedField("keyValue", VrmlField::MFVEC3F); t->addEventOut("value_changed", VrmlField::SFVEC3F); return t; } VrmlNodeType *VrmlNodePositionInt::nodeType() const { return defineType(0); } VrmlNodePositionInt::VrmlNodePositionInt( VrmlScene *scene ) : VrmlNodeChild(scene) { } VrmlNodePositionInt::~VrmlNodePositionInt() { } VrmlNode *VrmlNodePositionInt::cloneMe() const { return new VrmlNodePositionInt(*this); } ostream& VrmlNodePositionInt::printFields(ostream& os, int indent) { if (d_key.size() > 0) PRINT_FIELD(key); if (d_keyValue.size() > 0) PRINT_FIELD(keyValue); return os; } void VrmlNodePositionInt::eventIn(double timeStamp, const char *eventName, const VrmlField *fieldValue) { if (strcmp(eventName, "set_fraction") == 0) { if (! fieldValue->toSFFloat() ) { theSystem->error ("Invalid type for %s eventIn %s (expected SFFloat).\n", nodeType()->getName(), eventName); return; } float f = fieldValue->toSFFloat()->get(); int n = d_key.size() - 1; if (f < d_key[0]) d_value.set( d_keyValue[0][0], d_keyValue[0][1], d_keyValue[0][2] ); else if (f > d_key[n]) d_value.set( d_keyValue[n][0], d_keyValue[n][1], d_keyValue[n][2] ); else { // should cache the last index used... for (int i=0; i