static SoCallbackAction::Response processNodesCB(void *userData, SoCallbackAction *ca, const SoNode *node) { #ifdef DEBUG cerr << "The node is of type " << node->getTypeId().getName().getString() << endl; #endif if (node->isOfType(SoShape::getClassTypeId())) { SbPList *data_list = (SbPList *) userData; OSUObjectData *data = new OSUObjectData; data_list->append((void *) data); data->shape = node->copy(); data->shape->ref(); SoVertexShape* vertShape = (SoVertexShape *)data->shape; SoState* state = ca->getState(); SoLazyElement* le = SoLazyElement::getInstance(state); le->print(stderr); int sIndex = 0; if (node->isOfType(SoVertexShape::getClassTypeId())) { #ifdef DEBUG cerr << " Found a Vertex Shape!\n"; #endif const SoCoordinateElement* ce; ce = SoCoordinateElement::getInstance(state); // If we don't start at 0 then why copy those vertices. // We could also check to see just how many points we use and // remove those as well, but that will take a bit more work. if (vertShape->isOfType(SoNonIndexedShape::getClassTypeId())){ sIndex = ((SoNonIndexedShape*)vertShape)->startIndex.getValue(); ((SoNonIndexedShape*)vertShape)->startIndex.setValue(0); } if (ce->is3D() ){ // It's 3D #ifdef DEBUG cerr << " There are " << ce->getNum() << " 3D coords\n"; #endif SoCoordinate3 *Ps = new SoCoordinate3; Ps->point.setValues(0, ce->getNum() - sIndex,&ce->get3(sIndex)); Ps->ref(); data->points = (SoNode *) Ps; } else { // It's 4D #ifdef DEBUG cerr << " There are " << ce->getNum() << " 4D coords\n"; #endif SoCoordinate4 *Ps = new SoCoordinate4; Ps->point.setValues(0, ce->getNum() - sIndex,&ce->get4(sIndex)); Ps->ref(); data->points = (SoNode *) Ps; } const SoNormalElement* ne = SoNormalElement::getInstance(state); SoNormalBinding::Binding nb = (SoNormalBinding::Binding)SoNormalBindingElement::get(state); int startNrmIndex = 0; if (ne != NULL && ne->getNum()>0){ // vp->normalBinding.setValue(nb); if (nb == SoNormalBinding::PER_VERTEX){ startNrmIndex = sIndex; } data->normals = new SoNormal; data->normals->ref(); data->normals->vector.setValues(0, (ne->getNum())-startNrmIndex, &ne->get(startNrmIndex)); } } // End vertex shapes // If there are texture coordinates in the state, //put them into the vertex property node. int startTxtIndex = 0; SoTextureCoordinateBinding::Binding tcb = (SoTextureCoordinateBinding::Binding) SoTextureCoordinateBindingElement::get(state); if (tcb == SoTextureCoordinateBinding::PER_VERTEX) startTxtIndex = sIndex; const SoTextureCoordinateElement* tce = SoTextureCoordinateElement::getInstance(state); if (tce->getType() == SoTextureCoordinateElement::EXPLICIT && (tce->getNum() > 0 )){ data->texture_points = new SoTextureCoordinate2; data->texture_points->ref(); data->texture_points->point.setValues(0, tce->getNum() - startTxtIndex, &tce->get2(startTxtIndex)); // vp->texCoord.setValues(0, tce->getNum() - startTxtIndex, // &tce->get2(startTxtIndex)); } SbVec2s size; int numcomponents, wrapS, wrapT, model; SbColor blendColor(0,0,0); const unsigned char *timage = SoTextureImageElement::get(state, size, numcomponents, wrapS, wrapT, model, blendColor); if (timage) { data->texture = new SoTexture2; data->texture->ref(); // data->texture->filename.setValue(tfilename); // data->texture->image.setValue(size, numcomponents, timage); timage = ca->getTextureImage(size, numcomponents); data->texture->image.setValue(size, numcomponents, timage); data->texture->wrapS = wrapS; data->texture->wrapT = wrapT; data->texture->model = model; data->texture->blendColor.setValue(blendColor); } data->complexity = new SoComplexity; data->complexity->ref(); data->complexity->value = ca->getComplexity(); data->complexity->type = ca->getComplexityType(); data->draw_style = new SoDrawStyle; data->draw_style->ref(); data->draw_style->style = ca->getDrawStyle(); data->draw_style->pointSize = ca->getPointSize(); data->draw_style->lineWidth = ca->getLineWidth(); data->draw_style->linePattern = ca->getLinePattern(); #ifdef DEBUG cerr << "The model matrix is " << ca->getModelMatrix() << endl; #endif SbMatrix const xm = ca->getModelMatrix(); data->transformation = new SoTransform; data->transformation->ref(); data->transformation->setMatrix(xm); SoMaterial *material = new SoMaterial; material->ref(); material->ambientColor = SoLazyElement::getAmbient(state); material->diffuseColor = SoLazyElement::getDiffuse(state, 0); material->specularColor = SoLazyElement::getSpecular(state); material->emissiveColor = SoLazyElement::getEmissive(state); material->shininess = SoLazyElement::getShininess(state); material->transparency = SoLazyElement::getTransparency(state, 0); data->material = material; } return SoCallbackAction::CONTINUE; }