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(); }