// // Vrml 97 library // Copyright (C) 1998 Chris Morley // // %W% %G% // VrmlNodeDirLight.cpp #include "VrmlNodeDirLight.h" #include "VrmlNodeType.h" #include "MathUtils.h" #include "Viewer.h" // Return a new VrmlNodeDirLight static VrmlNode *creator( VrmlScene *s ) { return new VrmlNodeDirLight(s); } // Define the built in VrmlNodeType:: "DirLight" fields VrmlNodeType *VrmlNodeDirLight::defineType(VrmlNodeType *t) { static VrmlNodeType *st = 0; if (! t) { if (st) return st; t = st = new VrmlNodeType("DirectionalLight", creator); } VrmlNodeLight::defineType(t); // Parent class t->addExposedField("direction", VrmlField::SFVEC3F); return t; } VrmlNodeType *VrmlNodeDirLight::nodeType() const { return defineType(0); } VrmlNodeDirLight::VrmlNodeDirLight(VrmlScene *scene) : VrmlNodeLight(scene), d_direction(0.0, 0.0, -1.0) { } VrmlNodeDirLight::~VrmlNodeDirLight() { } VrmlNode *VrmlNodeDirLight::cloneMe() const { return new VrmlNodeDirLight(*this); } ostream& VrmlNodeDirLight::printFields(ostream& os, int indent) { VrmlNodeLight::printFields(os, indent); if (! FPZERO(d_direction.x()) || ! FPZERO(d_direction.y()) || ! FPEQUAL(d_direction.z(), -1.0) ) PRINT_FIELD(direction); return os; } // This should be called before rendering any sibling nodes. void VrmlNodeDirLight::render(Viewer *viewer) { if ( d_on.get() ) viewer->insertDirLight( d_ambientIntensity.get(), d_intensity.get(), d_color.get(), d_direction.get() ); clearModified(); } // Set the value of one of the node fields. void VrmlNodeDirLight::setField(const char *fieldName, const VrmlField &fieldValue) { if TRY_FIELD(direction, SFVec3f) else VrmlNodeLight::setField(fieldName, fieldValue); } const VrmlSFVec3f& VrmlNodeDirLight::getDirection() const // LarryD Mar 04/99 { return d_direction; } VrmlNodeDirLight *VrmlNodeDirLight::toDirLight() const // LarryD Mar 04/99 { return (VrmlNodeDirLight*) this; }