void lucScalarFieldCrossSection_DrawCrossSection( void* drawingObject, lucDatabase* database, Bool backFacing) { lucScalarFieldCrossSection* self = (lucScalarFieldCrossSection*)drawingObject; /* Sample the 2d cross-section */ lucCrossSection_SampleField(self, backFacing); /* Calibrate Colour Map */ if (self->colourMap) lucColourMap_CalibrateFromFieldVariable(self->colourMap, self->fieldVariable); if (self->context->rank == 0) { int d; int count = self->resolutionA * self->resolutionB; lucDatabase_AddGridVertices(database, count, self->resolutionB, &self->vertices[0][0][0]); lucDatabase_AddValues(database, count, lucGridType, lucColourValueData, self->colourMap, &self->values[0][0][0]); /* Flip normal if back facing */ if (backFacing) for (d=0; d<3; d++) self->normal[d] = 0 - self->normal[d]; /* Add a single normal value */ lucDatabase_AddNormal(database, lucGridType, self->normal); } /* Free memory */ lucCrossSection_FreeSampleData(self); /* Start new geometry section - when used with multiple sections */ lucDatabase_OutputGeometry(database, self->id); }
void _lucIsosurface_Draw( void* drawingObject, lucDatabase* database, void* _context ) { lucIsosurface* self = (lucIsosurface*)drawingObject; /* Calibrate Colour Map */ if (self->colourMap) { if (self->colourField ) lucColourMap_CalibrateFromFieldVariable( self->colourMap, self->colourField ); else /* Colour based on isovalue */ lucColourMap_CalibrateFromFieldVariable( self->colourMap, self->isosurfaceField ); } /* Export triangles, separating walls and surface into two geometry objects */ /* Export surface triangles */ _lucIsosurface_Write(self, database, False); /* Start new geometry section */ lucDatabase_OutputGeometry(database, self->id); /* Export wall triangles */ _lucIsosurface_Write(self, database, True); }