#include "GL_SimpleAnimatorGeometry3DVisitor.h" #include #include using namespace std; namespace X3DTK { namespace GL { SimpleAnimatorGeometry3DVisitor::SimpleAnimatorGeometry3DVisitor() : Geometry3DVisitor() { // Enter functions. define(Recorder::getEnterFunction(&SimpleAnimatorGeometry3DVisitor::enterIndexedFaceSet)); } void SimpleAnimatorGeometry3DVisitor::enterIndexedFaceSet(IndexedFaceSet *I) { // StateVariables assignation. SimpleAnimatorStateVariables *stateVariables = Singleton::getInstance(); // Parameters for the animation. SFVec3f size = stateVariables->getBBoxSize(); float mz = size.z; float mxy = (size.x < size.y ? size.y : size.x); float a = mxy*mxy*mz*0.1f*cosf(stateVariables->getTime()); float b = mxy*mxy; float c = 1.0f; float d = a/b; // switching to the appropriate case. 8 cases: 4 vertex formats, plus the fact that // the vertices can be duplicated when necessary. When duplicated, it means that two // vertices have the same coordinates, but different other properties like color... if (I->getVertexFormat() == GL_N3F_V3F) { vector &vertexArray = I->N3F_V3F_vertexArray(); for (vector::iterator itVertex = vertexArray.begin(); itVertex != vertexArray.end(); ++itVertex) (*itVertex).vertex.y = (*itVertex).vertex.y - d + a/(b + c*((*itVertex).vertex.x*(*itVertex).vertex.x + (*itVertex).vertex.z*(*itVertex).vertex.z)); } if (I->getVertexFormat() == GL_C4F_N3F_V3F) { vector &vertexArray = I->C4F_N3F_V3F_vertexArray(); for (vector::iterator itVertex = vertexArray.begin(); itVertex != vertexArray.end(); ++itVertex) (*itVertex).vertex.y = (*itVertex).vertex.y - d + a/(b + c*((*itVertex).vertex.x*(*itVertex).vertex.x + (*itVertex).vertex.z*(*itVertex).vertex.z)); } if (I->getVertexFormat() == GL_T2F_N3F_V3F) { vector &vertexArray = I->T2F_N3F_V3F_vertexArray(); for (vector::iterator itVertex = vertexArray.begin(); itVertex != vertexArray.end(); ++itVertex) (*itVertex).vertex.y = (*itVertex).vertex.y - d + a/(b + c*((*itVertex).vertex.x*(*itVertex).vertex.x + (*itVertex).vertex.z*(*itVertex).vertex.z)); } if (I->getVertexFormat() == GL_T2F_C4F_N3F_V3F) { vector &vertexArray = I->T2F_C4F_N3F_V3F_vertexArray(); for (vector::iterator itVertex = vertexArray.begin(); itVertex != vertexArray.end(); ++itVertex) (*itVertex).vertex.y = (*itVertex).vertex.y - d + a/(b + c*((*itVertex).vertex.x*(*itVertex).vertex.x + (*itVertex).vertex.z*(*itVertex).vertex.z)); } // recomputing the normals to have a smooth rendering. I->computeNormals(); } } }