Пример #1
0
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();
}