void ccGenericMesh::applyGLTransformation(const ccGLMatrix& trans) { //vertices should be handled another way! //we must take care of the triangle normals! if (m_triNormals && (!getParent() || !getParent()->isKindOf(CC_MESH))) { bool recoded = false; //if there is more triangle normals than the size of the compressed //normals array, we recompress the array instead of recompressing each normal unsigned i,numTriNormals = m_triNormals->currentSize(); if (numTriNormals>ccNormalVectors::GetNumberOfVectors()) { NormsIndexesTableType* newNorms = new NormsIndexesTableType; if (newNorms->reserve(ccNormalVectors::GetNumberOfVectors())) { for (i=0; i<ccNormalVectors::GetNumberOfVectors(); i++) { CCVector3 new_n(ccNormalVectors::GetNormal(i)); trans.applyRotation(new_n); normsType newNormIndex = ccNormalVectors::GetNormIndex(new_n.u); newNorms->addElement(newNormIndex); } m_triNormals->placeIteratorAtBegining(); for (i=0; i<numTriNormals; i++) { m_triNormals->setValue(i,newNorms->getValue(m_triNormals->getCurrentValue())); m_triNormals->forwardIterator(); } recoded=true; } newNorms->clear(); newNorms->release(); newNorms=0; } //if there is less triangle normals than the compressed normals array size //(or if there is not enough memory to instantiate the temporary array), //we recompress each normal ... if (!recoded) { //on recode direct chaque normale m_triNormals->placeIteratorAtBegining(); for (i=0; i<numTriNormals; i++) { normsType* _theNormIndex = m_triNormals->getCurrentValuePtr(); CCVector3 new_n(ccNormalVectors::GetNormal(*_theNormIndex)); trans.applyRotation(new_n.u); *_theNormIndex = ccNormalVectors::GetNormIndex(new_n.u); m_triNormals->forwardIterator(); } } } else { //TODO: process failed! } }
void ccFacet::applyGLTransformation(const ccGLMatrix &trans) { ccHObject::applyGLTransformation(trans); // move/rotate the center to its new location trans.apply(m_center); // apply the rotation to the normal of the plane equation trans.applyRotation(m_planeEquation); // compute new d-parameter from the updated values CCVector3 n(m_planeEquation); m_planeEquation[3] = n.dot(m_center); }