void SoUnknownNode::write(SoWriteAction *action) // //////////////////////////////////////////////////////////////////////// { int i; SbBool saveNotify = enableNotify(FALSE); // Remember alternateRep, if set: SoNode *alternateRep = NULL; if (hasChildren) { if (getNumChildren() != 0) { alternateRep = getChild(0); alternateRep->ref(); } // Add hiddenChildren to regular child list temporarily: removeAllChildren(); for (i = 0; i < hiddenChildren.getLength(); i++) { addChild(hiddenChildren[i]); } // Now write: SoGroup::write(action); removeAllChildren(); } else { SoNode::write(action); } if (alternateRep != NULL) { addChild(alternateRep); alternateRep->unref(); } enableNotify(saveNotify); }
void SoColorShape::compute() { enableNotify(false); // alles schoen auf nichts zurücksetzen if (_vertexPropArray) { delete[] _vertexPropArray; _vertexPropArray = 0; } if (_sizeCoordinate3) { delete[] _sizeCoordinate3; _sizeCoordinate3 = 0; } if (_vertexSet) { for (int index = 0; index < (_extentX * _extentY * _extentZ); index++) _vertexSet[index].clear(); delete[] _vertexSet; _vertexSet = 0; } if (_triangleSet) { for (int index = 0; index < (_extentX * _extentY * _extentZ); index++) _triangleSet[index].clear(); delete[] _triangleSet; _triangleSet = 0; } if (_edgeSet) { for (int index = 0; index < (_extentX * _extentY * _extentZ); index++) _edgeSet[index].clear(); delete[] _edgeSet; _edgeSet = 0; } removeAllChildren(); if (input.getValue() != 0) { // Bounding Box bestimmen SoComputeBoundingBox* bbact = new SoComputeBoundingBox; SoTranslation *min = new SoTranslation, *max = new SoTranslation; min->ref(); max->ref(); bbact->ref(); bbact->node = input.getValue(); min->translation.connectFrom(&bbact->min); max->translation.connectFrom(&bbact->max); SbBox3f bBox(min->translation.getValue(), max->translation.getValue()); min->unref(), max->unref(); bbact->unref(); // Eingang hat sich geändert if (!bBox.isEmpty()) { // Array fuer _edgeSet und _triangleSet set-Instanzen initialisieren float xSize, ySize, zSize; bBox.getSize(xSize, ySize, zSize); _offSet = bBox.getMin(); _extentX = xSize / (float) HASH_PARTITION + 1; _extentY = ySize / (float) HASH_PARTITION + 1; _extentZ = zSize / (float) HASH_PARTITION + 1; _vertexSet = new std::set<Vertex*, ltVertex>[_extentX * _extentY * _extentZ]; _edgeSet = new std::set<Edge*, ltEdge >[_extentX * _extentY * _extentZ]; _triangleSet = new std::set<Triangle* >[_extentX * _extentY * _extentZ]; _vertexPropArray = new SoVertexProperty*[_extentX * _extentY * _extentZ]; int index = 0; for (index = 0; index < (_extentX * _extentY * _extentZ); index++) _vertexPropArray[index] = 0; _sizeCoordinate3 = new int[_extentX * _extentY * _extentZ]; for (index = 0; index < (_extentX * _extentY * _extentZ); index++) _sizeCoordinate3[index] = -1; // Dreiecke aufsammeln _myAction->apply(input.getValue()); // SoIndexedTriangleStripSet erstellen generateITSS(); } } enableNotify(true); touch(); }