// // Vrml 97 library // Copyright (C) 1998 Chris Morley // // %W% %G% // VrmlNodeTouchSensor.cpp #include "config.h" #include "VrmlNodeTouchSensor.h" #include "VrmlNodeType.h" #include "MathUtils.h" #include "System.h" #include "Viewer.h" #include "VrmlScene.h" // TouchSensor factory. static VrmlNode *creator( VrmlScene *scene ) { return new VrmlNodeTouchSensor(scene); } // Define the built in VrmlNodeType:: "TouchSensor" fields VrmlNodeType *VrmlNodeTouchSensor::defineType(VrmlNodeType *t) { static VrmlNodeType *st = 0; if (! t) { if (st) return st; // Only define the type once. t = st = new VrmlNodeType("TouchSensor", creator); } VrmlNodeChild::defineType(t); // Parent class t->addExposedField("enabled", VrmlField::SFBOOL); t->addEventOut("hitNormal_changed", VrmlField::SFVEC3F); t->addEventOut("hitPoint_changed", VrmlField::SFVEC3F); t->addEventOut("hitTexCoord_changed", VrmlField::SFVEC2F); t->addEventOut("isActive", VrmlField::SFBOOL); t->addEventOut("isOver", VrmlField::SFBOOL); t->addEventOut("touchTime", VrmlField::SFTIME); return t; } VrmlNodeType *VrmlNodeTouchSensor::nodeType() const { return defineType(0); } VrmlNodeTouchSensor::VrmlNodeTouchSensor( VrmlScene *scene ) : VrmlNodeChild(scene), d_enabled(true), d_isActive(false), d_isOver(false), d_touchTime(0.0) { setModified(); } VrmlNodeTouchSensor::~VrmlNodeTouchSensor() { } VrmlNode *VrmlNodeTouchSensor::cloneMe() const { return new VrmlNodeTouchSensor(*this); } VrmlNodeTouchSensor* VrmlNodeTouchSensor::toTouchSensor() const { return (VrmlNodeTouchSensor*) this; } ostream& VrmlNodeTouchSensor::printFields(ostream& os, int indent) { if (! d_enabled.get()) PRINT_FIELD(enabled); return os; } // Doesn't compute the xxx_changed eventOuts yet... void VrmlNodeTouchSensor::activate( double timeStamp, bool isOver, bool isActive, double * ) { if (isOver && !isActive && d_isActive.get()) { d_touchTime.set(timeStamp); eventOut( timeStamp, "touchTime", d_touchTime); //theSystem->debug("TouchSensor.%s touchTime\n", name()); } if (isOver != d_isOver.get()) { d_isOver.set(isOver); eventOut( timeStamp, "isOver", d_isOver ); } if (isActive != d_isActive.get()) { d_isActive.set(isActive); eventOut( timeStamp, "isActive", d_isActive ); } // if (isOver && any routes from eventOuts) // generate xxx_changed eventOuts... } // Set the value of one of the node fields. void VrmlNodeTouchSensor::setField(const char *fieldName, const VrmlField &fieldValue) { if TRY_FIELD(enabled, SFBool) else VrmlNodeChild::setField(fieldName, fieldValue); }