Vec3f calcMinGeometryBounds(GeometryUnrecPtr geo) { if(geo == NULL || geo->getPositions() == NULL || geo->getPositions()->size() == 0) { return Vec3f(); } GeoVectorProperty* Positions(geo->getPositions()); Pnt3f Min(Positions->getValue<Pnt3f>(0)), Max(Positions->getValue<Pnt3f>(0)); for(UInt32 i(1) ; i<Positions->size(); ++i) { Min[0] = osgMin(Min[0], Positions->getValue<Pnt3f>(i)[0]); Min[1] = osgMin(Min[1], Positions->getValue<Pnt3f>(i)[1]); Min[2] = osgMin(Min[2], Positions->getValue<Pnt3f>(i)[2]); Max[0] = osgMax(Max[0], Positions->getValue<Pnt3f>(i)[0]); Max[1] = osgMax(Max[1], Positions->getValue<Pnt3f>(i)[1]); Max[2] = osgMax(Max[2], Positions->getValue<Pnt3f>(i)[2]); } return Max-Min; }
Pnt3f calcGeometryCenter(GeometryUnrecPtr geo) { if(geo == NULL || geo->getPositions() == NULL || geo->getPositions()->size() == 0) { return Pnt3f(); } GeoVectorProperty* Positions(geo->getPositions()); Pnt3f Sum; for(UInt32 i(1) ; i<Positions->size(); ++i) { Sum = Sum + Vec3f(Positions->getValue<Pnt3f>(i)); } return Sum * (1.0f/static_cast<Real32>(Positions->size())); }
void MergeGraphOp::processTransformations(Node * const node) { MFUnrecChildNodePtr::const_iterator mfit = node->getMFChildren()->begin(); MFUnrecChildNodePtr::const_iterator mfen = node->getMFChildren()->end (); std::vector<Node *> toAdd; std::vector<Node *> toSub; for ( ; mfit != mfen; ++mfit ) { bool special=isInExcludeList(*mfit); bool leaf=isLeaf(*mfit); bool empty=true; //if a transformation: if ((*mfit)->getCore()->getType().isDerivedFrom( Transform::getClassType())) { if (!leaf && !special) { //try to apply it to children geometries //move all "moveable" children one level up //if empty after that, delete it MFUnrecChildNodePtr::const_iterator it2 = (*mfit)->getMFChildren()->begin(); MFUnrecChildNodePtr::const_iterator en2 = (*mfit)->getMFChildren()->end (); for ( ; it2 != en2; ++it2 ) { if (!isInExcludeList(*it2)) { //check if geometry if ((*it2)->getCore()->getType().isDerivedFrom( Geometry::getClassType())) { if(!isLeaf(*it2)) { //hmm...bad tree... empty=false; } else { //it is a leaf geometry, so apply the transformation Geometry *geo_old = dynamic_cast<Geometry *>( (*it2)->getCore()); //GeometryPtr geo = geo_old->clone(); GeometryUnrecPtr geo = dynamic_pointer_cast<Geometry>( OSG::deepClone(geo_old, "Material")); Transform *t = dynamic_cast<Transform *>( (*mfit)->getCore()); GeoPnt3fProperty *pos = dynamic_cast<GeoPnt3fProperty *>(geo->getPositions()); GeoVec3fProperty *norm = dynamic_cast<GeoVec3fProperty *>(geo->getNormals()); GeoColor3fProperty *color = dynamic_cast<GeoColor3fProperty *>(geo->getColors()); GeoColor3fProperty *scolor = dynamic_cast<GeoColor3fProperty *>(geo->getSecondaryColors()); GeoVec3fProperty *texcoord0 = dynamic_cast<GeoVec3fProperty *>(geo->getTexCoords()); GeoVec3fProperty *texcoord1 = dynamic_cast<GeoVec3fProperty *>(geo->getTexCoords1()); GeoVec3fProperty *texcoord2 = dynamic_cast<GeoVec3fProperty *>(geo->getTexCoords2()); GeoVec3fProperty * texcoord3 = dynamic_cast<GeoVec3fProperty *>(geo->getTexCoords3()); Matrix m=t->getMatrix(); if(pos!=NULL) { for(UInt32 i = 0; i < pos->size(); ++i) { Pnt3f p=pos->getValue(i); m.multFull(p, p); pos->setValue(p,i); } } if(norm!=NULL) { for(UInt32 i = 0; i < norm->size(); ++i) { Vec3f n=norm->getValue(i); m.mult(n, n); n.normalize(); norm->setValue(n,i); } } if(color != NULL && _color_is_vector) { for(UInt32 i = 0; i < color->size(); ++i) { Color3f c = color->getValue(i); Vec3f v; v.setValue(c.getValuesRGB()); m.mult(v, v); v.normalize(); c.setValuesRGB(v[0], v[1], v[2]); color->setValue(c,i); } } if(scolor != NULL && _secondary_color_is_vector) { for(UInt32 i = 0; i < scolor->size(); ++i) { Color3f c = scolor->getValue(i); Vec3f v; v.setValue(c.getValuesRGB()); m.mult(v, v); v.normalize(); c.setValuesRGB(v[0], v[1], v[2]); scolor->setValue(c,i); } } if(texcoord0 != NULL && _texcoord0_is_vector) { for(UInt32 i = 0; i < texcoord0->size(); ++i) { Vec3f v = texcoord0->getValue(i); m.mult(v, v); v.normalize(); texcoord0->setValue(v,i); } } if(texcoord1 != NULL && _texcoord1_is_vector) { for(UInt32 i = 0; i < texcoord1->size(); ++i) { Vec3f v = texcoord1->getValue(i); m.mult(v, v); v.normalize(); texcoord1->setValue(v,i); } } if(texcoord2 != NULL && _texcoord2_is_vector) { for(UInt32 i = 0; i < texcoord2->size(); ++i) { Vec3f v = texcoord2->getValue(i); m.mult(v, v); v.normalize(); texcoord2->setValue(v,i); } } if (texcoord3 != NULL && _texcoord3_is_vector) { for(UInt32 i = 0; i < texcoord3->size(); i++) { Vec3f v = texcoord3->getValue(i); m.mult(v, v); v.normalize(); texcoord3->setValue(v,i); } } (*it2)->setCore(geo); toAdd.push_back(*it2); } } else empty=false; } else empty=false; } } //now check whether we have to remove it if ((empty||leaf) && !special) { toSub.push_back(*mfit); continue; } if (leaf && special) { //what to do? } if (!leaf && special) { //what to do? } continue; } } std::vector<Node *>::const_iterator vit = toAdd.begin(); std::vector<Node *>::const_iterator ven = toAdd.end (); for ( ; vit != ven; ++vit ) { node->addChild(*vit); } vit = toSub.begin(); ven = toSub.end (); for ( ; vit != ven; ++vit ) { node->subChild(*vit); } }