vtkIVExporter.cxx 19.4 KB
Newer Older
Ken Martin's avatar
Ken Martin committed
1 2 3 4 5
/*=========================================================================

  Program:   Visualization Toolkit
  Module:    vtkIVExporter.cxx

6
  Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
7 8
  All rights reserved.
  See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
Ken Martin's avatar
Ken Martin committed
9

10 11
     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
12
     PURPOSE.  See the above copyright notice for more information.
Ken Martin's avatar
Ken Martin committed
13 14 15

=========================================================================*/
#include "vtkIVExporter.h"
16 17

#include "vtkAssemblyNode.h"
Andy Cedilnik's avatar
Andy Cedilnik committed
18
#include "vtkAssemblyPath.h"
19
#include "vtkCamera.h"
20
#include "vtkCellArray.h"
Ken Martin's avatar
Ken Martin committed
21
#include "vtkGeometryFilter.h"
22
#include "vtkImageData.h"
23
#include "vtkLight.h"
24
#include "vtkLightCollection.h"
Ken Martin's avatar
Ken Martin committed
25
#include "vtkMath.h"
26
#include "vtkObjectFactory.h"
Andy Cedilnik's avatar
Andy Cedilnik committed
27
#include "vtkPointData.h"
28
#include "vtkPolyData.h"
29 30
#include "vtkPolyDataMapper.h"
#include "vtkProperty.h"
31
#include "vtkRenderWindow.h"
32
#include "vtkRendererCollection.h"
33
#include "vtkTexture.h"
34
#include "vtkTransform.h"
35
#include "vtkUnsignedCharArray.h"
36

37
vtkCxxRevisionMacro(vtkIVExporter, "1.61");
Brad King's avatar
Brad King committed
38
vtkStandardNewMacro(vtkIVExporter);
39

Ken Martin's avatar
Ken Martin committed
40 41 42 43 44 45 46
vtkIVExporter::vtkIVExporter()
{
  this->FileName = NULL;
}

vtkIVExporter::~vtkIVExporter()
{
Bill Lorensen's avatar
Bill Lorensen committed
47 48 49 50
  if ( this->FileName )
    {
    delete [] this->FileName;
    }
Ken Martin's avatar
Ken Martin committed
51 52 53 54
}

static char indent[256];
int indent_now = 0;
Bill Lorensen's avatar
Bill Lorensen committed
55
#define VTK_INDENT_MORE { indent[indent_now] = ' '; \
56 57
                                          indent_now += 4; \
                                      indent[indent_now] = 0; }
Bill Lorensen's avatar
Bill Lorensen committed
58
#define VTK_INDENT_LESS { indent[indent_now] = ' '; \
59 60
                                          indent_now -= 4; \
                                      indent[indent_now] = 0; }
Ken Martin's avatar
Ken Martin committed
61 62 63 64 65 66 67 68 69 70

void vtkIVExporter::WriteData()
{
  vtkRenderer *ren;
  FILE *fp;
  vtkActorCollection *ac;
  vtkActor *anActor, *aPart;
  vtkLightCollection *lc;
  vtkLight *aLight;
  vtkCamera *cam;
Ken Martin's avatar
Ken Martin committed
71
  double *tempd;
Ken Martin's avatar
Ken Martin committed
72
  
Bill Lorensen's avatar
Bill Lorensen committed
73 74 75 76
  for (int i=0;i<256;i++)
    {
    indent[i] = ' ';
    }
Ken Martin's avatar
Ken Martin committed
77 78 79 80 81 82 83 84 85 86
  indent[indent_now] = 0;

  // make sure the user specified a filename
  if ( this->FileName == NULL)
    {
    vtkErrorMacro(<< "Please specify FileName to use");
    return;
    }

  // first make sure there is only one renderer in this rendering window
87
  if (this->RenderWindow->GetRenderers()->GetNumberOfItems() > 1)
Ken Martin's avatar
Ken Martin committed
88 89 90 91 92 93
    {
    vtkErrorMacro(<< "OpenInventor files only support one renderer per window.");
    return;
    }

  // get the renderer
Ken Martin's avatar
Ken Martin committed
94
  ren = this->RenderWindow->GetRenderers()->GetFirstRenderer();
Ken Martin's avatar
Ken Martin committed
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
  
  // make sure it has at least one actor
  if (ren->GetActors()->GetNumberOfItems() < 1)
    {
    vtkErrorMacro(<< "no actors found for writing OpenInventor file.");
    return;
    }
    
  // try opening the files
  fp = fopen(this->FileName,"w");
  if (!fp)
    {
    vtkErrorMacro(<< "unable to open OpenInventor file " << this->FileName);
    return;
    }
  
  //
  //  Write header
  //
  vtkDebugMacro("Writing OpenInventor file");
  fprintf(fp,"#Inventor V2.0 ascii\n");
  fprintf(fp,"# OpenInventor file written by the visualization toolkit\n\n");

  fprintf(fp, "Separator {\n");
Bill Lorensen's avatar
Bill Lorensen committed
119
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
120 121 122 123 124 125 126 127 128 129 130

  // do the camera
  cam = ren->GetActiveCamera();
  if (cam->GetParallelProjection()) 
    {
    fprintf(fp,"%sOrthographicCamera\n%s{\n", indent, indent);
    } 
  else 
    {
    // this assumes the aspect ratio is 1
    fprintf(fp,"%sPerspectiveCamera\n%s{\n%s    heightAngle %f\n",
131 132
            indent, indent, indent,
            cam->GetViewAngle()*3.1415926/180.0);
Ken Martin's avatar
Ken Martin committed
133
    }
Bill Lorensen's avatar
Bill Lorensen committed
134
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
135 136 137 138
  fprintf(fp,"%snearDistance %f\n",indent, cam->GetClippingRange()[0]);
  fprintf(fp,"%sfarDistance %f\n",indent, cam->GetClippingRange()[1]);
  fprintf(fp,"%sfocalDistance %f\n",indent, cam->GetDistance());
  fprintf(fp,"%sposition %f %f %f\n", indent, cam->GetPosition()[0],
139
          cam->GetPosition()[1], cam->GetPosition()[2]);
Ken Martin's avatar
Ken Martin committed
140
  tempd = cam->GetOrientationWXYZ();
Ken Martin's avatar
Ken Martin committed
141
  fprintf(fp,"%sorientation %g %g %g %g\n%s}\n", indent,
Ken Martin's avatar
Ken Martin committed
142
          tempd[1], tempd[2], tempd[3], tempd[0]*3.1415926/180.0, indent);
Bill Lorensen's avatar
Bill Lorensen committed
143
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
144 145 146 147 148 149 150 151

  // do the lights first the ambient then the others
  fprintf(fp,"# The following environment information is disabled\n");
  fprintf(fp,"# because a popular viewer (Template Graphics Software SceneViewer) has\n");
  fprintf(fp,"# trouble (access violations under Windows NT) with it.\n");
  fprintf(fp,"#%sEnvironment {\n", indent);
  // couldn't figure out a way to do headlight -- seems to be a property of the
  // viewer not the model
Bill Lorensen's avatar
Bill Lorensen committed
152
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
153 154
  fprintf(fp,"#%sambientIntensity 1.0 # ambient light\n", indent);
  fprintf(fp,"#%sambientColor %f %f %f }\n\n", indent,
155
          ren->GetAmbient()[0], ren->GetAmbient()[1], ren->GetAmbient()[2]);
Bill Lorensen's avatar
Bill Lorensen committed
156
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
157 158 159 160

  // make sure we have a default light
  // if we dont then use a headlight
  lc = ren->GetLights();
Ken Martin's avatar
Ken Martin committed
161 162
  vtkCollectionSimpleIterator lsit;
  for (lc->InitTraversal(lsit); (aLight = lc->GetNextLight(lsit)); )
Ken Martin's avatar
Ken Martin committed
163 164 165 166 167 168
    {
    this->WriteALight(aLight, fp);
    }

  // do the actors now
  ac = ren->GetActors();
Will Schroeder's avatar
Will Schroeder committed
169
  vtkAssemblyPath *apath;
Ken Martin's avatar
Ken Martin committed
170 171
  vtkCollectionSimpleIterator ait;
  for (ac->InitTraversal(ait); (anActor = ac->GetNextActor(ait)); )
Ken Martin's avatar
Ken Martin committed
172
    {
173
    for (anActor->InitPathTraversal(); (apath=anActor->GetNextPath()); )
Ken Martin's avatar
Ken Martin committed
174
      {
Will Schroeder's avatar
Will Schroeder committed
175
      aPart=(vtkActor *)apath->GetLastNode()->GetProp();
Ken Martin's avatar
Ken Martin committed
176 177 178 179
      this->WriteAnActor(aPart, fp);
      }
    }

Bill Lorensen's avatar
Bill Lorensen committed
180
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
181 182 183 184 185 186 187
  fprintf(fp, "}\n"); // close Separator

  fclose(fp);
}

void vtkIVExporter::WriteALight(vtkLight *aLight, FILE *fp)
{
Ken Martin's avatar
Ken Martin committed
188
  double *pos, *focus, *color;
Ken Martin's avatar
Ken Martin committed
189 190 191 192 193 194 195 196 197 198 199 200 201
  float dir[3];
  
  pos = aLight->GetPosition();
  focus = aLight->GetFocalPoint();
  color = aLight->GetColor();

  dir[0] = focus[0] - pos[0];
  dir[1] = focus[1] - pos[1];
  dir[2] = focus[2] - pos[2];
  vtkMath::Normalize(dir);
    
  if (aLight->GetPositional())
    {
Ken Martin's avatar
Ken Martin committed
202
    double *attn;
Ken Martin's avatar
Ken Martin committed
203 204 205 206
    
    if (aLight->GetConeAngle() >= 180.0)
      {
      fprintf(fp,"%sPointLight {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
207
      VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
208 209 210 211
      }
    else
      { 
      fprintf(fp,"%sSpotLight {\n", indent);
212
          VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
213 214
      fprintf(fp,"%sdirection %f %f %f\n", indent, dir[0], dir[1], dir[2]);
      fprintf(fp,"%scutOffAngle %f\n", indent, aLight->GetConeAngle());
215 216 217
          // the following ignores linear and quadratic attenuation values
          attn = aLight->GetAttenuationValues();
          fprintf(fp,"%sdropOffRate %f\n", indent, attn[0]);
Ken Martin's avatar
Ken Martin committed
218 219 220 221 222 223
      }
    fprintf(fp,"%slocation %f %f %f\n", indent, pos[0], pos[1], pos[2]);
    }
  else
    {
    fprintf(fp,"%sDirectionalLight {\n", indent);
224
        VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
225 226 227 228 229 230 231 232 233 234 235 236 237
    fprintf(fp,"%sdirection %f %f %f\n", indent, dir[0], dir[1], dir[2]);
    }

  fprintf(fp,"%scolor %f %f %f\n", indent, color[0], color[1], color[2]);
  fprintf(fp,"%sintensity %f\n", indent, aLight->GetIntensity());
  if (aLight->GetSwitch())
    {
    fprintf(fp,"%son TRUE\n%s}\n", indent, indent);
    }
  else
    {
    fprintf(fp,"%son FALSE\n%s}\n", indent, indent);
    }
Bill Lorensen's avatar
Bill Lorensen committed
238
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
239 240 241 242 243 244 245 246
}

void vtkIVExporter::WriteAnActor(vtkActor *anActor, FILE *fp)
{
  vtkDataSet *ds;
  vtkPolyData *pd;
  vtkGeometryFilter *gf = NULL;
  vtkPointData *pntData;
247
  vtkPoints *points;
248 249
  vtkDataArray *normals = NULL;
  vtkDataArray *tcoords = NULL;
Ken Martin's avatar
Ken Martin committed
250 251
  int i;
  vtkProperty *prop;
Ken Martin's avatar
Ken Martin committed
252
  double *tempd;
Ken Martin's avatar
Ken Martin committed
253
  vtkCellArray *cells;
254 255
  vtkIdType npts = 0;
  vtkIdType *indx = 0;
Ken Martin's avatar
Ken Martin committed
256 257
  float tempf2;
  vtkPolyDataMapper *pm;
258
  vtkUnsignedCharArray *colors;
Ken Martin's avatar
Ken Martin committed
259
  double *p;
Ken Martin's avatar
Ken Martin committed
260 261 262
  unsigned char *c;
  vtkTransform *trans;
  
263 264 265 266 267 268
  // see if the actor has a mapper. it could be an assembly
  if (anActor->GetMapper() == NULL)
    {
    return;
    }

Ken Martin's avatar
Ken Martin committed
269
  fprintf(fp,"%sSeparator {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
270
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
271 272

  // first stuff out the transform
273
  trans = vtkTransform::New();
274
  trans->SetMatrix(anActor->vtkProp3D::GetMatrix());
Ken Martin's avatar
Ken Martin committed
275 276
  
  fprintf(fp,"%sTransform {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
277
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
278 279 280 281 282 283 284
  tempd = trans->GetPosition();
  fprintf(fp,"%stranslation %g %g %g\n", indent, tempd[0], tempd[1], tempd[2]);
  tempd = trans->GetOrientationWXYZ();
  fprintf(fp,"%srotation %g %g %g %g\n", indent, tempd[1], tempd[2], 
          tempd[3], tempd[0]*3.1415926/180.0);
  tempd = trans->GetScale();
  fprintf(fp,"%sscaleFactor %g %g %g\n", indent, tempd[0], tempd[1], tempd[2]);
Ken Martin's avatar
Ken Martin committed
285
  fprintf(fp,"%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
286
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
287 288 289
  trans->Delete();
  
  // get the mappers input and matrix
290
  ds = anActor->GetMapper()->GetInput();
Ken Martin's avatar
Ken Martin committed
291 292
  
  // we really want polydata
293
  if ( ds->GetDataObjectType() != VTK_POLY_DATA )
Ken Martin's avatar
Ken Martin committed
294
    {
Bill Lorensen's avatar
Bill Lorensen committed
295
    gf = vtkGeometryFilter::New();
Ken Martin's avatar
Ken Martin committed
296 297 298 299 300 301
    gf->SetInput(ds);
    gf->Update();
    pd = gf->GetOutput();
    }
  else
    {
302
    ds->Update();
Ken Martin's avatar
Ken Martin committed
303 304 305
    pd = (vtkPolyData *)ds;
    }

306
  pm = vtkPolyDataMapper::New();
Ken Martin's avatar
Ken Martin committed
307 308 309 310 311 312 313 314 315
  pm->SetInput(pd);
  pm->SetScalarRange(anActor->GetMapper()->GetScalarRange());
  pm->SetScalarVisibility(anActor->GetMapper()->GetScalarVisibility());
  pm->SetLookupTable(anActor->GetMapper()->GetLookupTable());

  points = pd->GetPoints();
  pntData = pd->GetPointData();
  normals = pntData->GetNormals();
  tcoords = pntData->GetTCoords();
316
  colors  = pm->MapScalars(1.0);
Ken Martin's avatar
Ken Martin committed
317 318
  
  fprintf(fp,"%sMaterial {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
319
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
320 321 322 323 324
  
  // write out the material properties to the mat file
  prop = anActor->GetProperty();
  // the following is based on a guess about how VTK's GetAmbient
  // property corresponds to SoMaterial's ambientColor
325
  tempf2 = prop->GetAmbient();
Ken Martin's avatar
Ken Martin committed
326
  tempd = prop->GetAmbientColor();
327
  fprintf(fp,"%sambientColor %g %g %g\n", indent,
Ken Martin's avatar
Ken Martin committed
328
          tempd[0]*tempf2, tempd[1]*tempf2, tempd[2]*tempf2);
Ken Martin's avatar
Ken Martin committed
329
  tempf2 = prop->GetDiffuse();
Ken Martin's avatar
Ken Martin committed
330
  tempd = prop->GetDiffuseColor();
Ken Martin's avatar
Ken Martin committed
331
  fprintf(fp,"%sdiffuseColor %g %g %g\n", indent,
Ken Martin's avatar
Ken Martin committed
332
          tempd[0]*tempf2, tempd[1]*tempf2, tempd[2]*tempf2);
Ken Martin's avatar
Ken Martin committed
333
  tempf2 = prop->GetSpecular();
Ken Martin's avatar
Ken Martin committed
334
  tempd = prop->GetSpecularColor();
Ken Martin's avatar
Ken Martin committed
335
  fprintf(fp,"%sspecularColor %g %g %g\n", indent,
Ken Martin's avatar
Ken Martin committed
336
          tempd[0]*tempf2, tempd[1]*tempf2, tempd[2]*tempf2);
Ken Martin's avatar
Ken Martin committed
337 338 339
  fprintf(fp,"%sshininess %g\n", indent,prop->GetSpecularPower()/128.0);
  fprintf(fp,"%stransparency %g\n", indent,1.0 - prop->GetOpacity());
  fprintf(fp,"%s}\n", indent); // close matrial
Bill Lorensen's avatar
Bill Lorensen committed
340
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
341 342 343 344 345 346

  // is there a texture map
  if (anActor->GetTexture())
    {
    vtkTexture *aTexture = anActor->GetTexture();
    int *size, xsize, ysize, bpp;
347 348
    vtkDataArray *scalars;
    vtkUnsignedCharArray *mappedScalars;
Ken Martin's avatar
Ken Martin committed
349 350 351 352 353 354 355 356 357 358 359
    unsigned char *txtrData;
    int totalValues;
    
    // make sure it is updated and then get some info
    if (aTexture->GetInput() == NULL)
      {
      vtkErrorMacro(<< "texture has no input!\n");
      return;
      }
    aTexture->GetInput()->Update();
    size = aTexture->GetInput()->GetDimensions();
360
    scalars = aTexture->GetInput()->GetPointData()->GetScalars();
Ken Martin's avatar
Ken Martin committed
361 362 363 364 365 366 367 368 369

    // make sure scalars are non null
    if (!scalars) 
      {
      vtkErrorMacro(<< "No scalar values found for texture input!\n");
      return;
      }

    // make sure using unsigned char data of color scalars type
370
    if (aTexture->GetMapColorScalarsThroughLookupTable () ||
371
        (scalars->GetDataType() != VTK_UNSIGNED_CHAR) )
Ken Martin's avatar
Ken Martin committed
372 373 374 375 376
      {
      mappedScalars = aTexture->GetMappedScalars ();
      }
    else
      {
377
      mappedScalars = static_cast<vtkUnsignedCharArray*>(scalars);
Ken Martin's avatar
Ken Martin committed
378 379 380 381 382 383 384 385 386 387 388 389 390
      }

    // we only support 2d texture maps right now
    // so one of the three sizes must be 1, but it 
    // could be any of them, so lets find it
    if (size[0] == 1)
      {
      xsize = size[1]; ysize = size[2];
      }
    else
      {
      xsize = size[0];
      if (size[1] == 1)
391 392 393
        {
        ysize = size[2];
        }
Ken Martin's avatar
Ken Martin committed
394
      else
395 396 397 398 399 400 401 402
        {
        ysize = size[1];
        if (size[2] != 1)
          {
          vtkErrorMacro(<< "3D texture maps currently are not supported!\n");
          return;
          }
        }
Ken Martin's avatar
Ken Martin committed
403 404 405
      }

    fprintf(fp, "%sTexture2 {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
406
    VTK_INDENT_MORE;
407
    bpp = mappedScalars->GetNumberOfComponents();
Ken Martin's avatar
Ken Martin committed
408
    fprintf(fp, "%simage %d %d %d\n", indent, xsize, ysize, bpp);
Bill Lorensen's avatar
Bill Lorensen committed
409
    VTK_INDENT_MORE;
410
    txtrData = static_cast<vtkUnsignedCharArray *>(mappedScalars)->GetPointer(0);
Ken Martin's avatar
Ken Martin committed
411 412 413 414 415 416 417
    totalValues = xsize*ysize;
    fprintf(fp,"%s",indent);
    for (i = 0; i < totalValues; i++)
      {
      fprintf(fp,"%.2x",*txtrData);
      txtrData++;
      if (bpp > 1)
418 419 420 421
        {
        fprintf(fp,"%.2x",*txtrData);
        txtrData++;
        }
Ken Martin's avatar
Ken Martin committed
422
      if (bpp > 2) 
423 424 425 426
        {
        fprintf(fp,"%.2x",*txtrData);
        txtrData++;
        }
Ken Martin's avatar
Ken Martin committed
427
      if (bpp > 3) 
428 429 430 431
        {
        fprintf(fp,"%.2x",*txtrData);
        txtrData++;
        }
Bill Lorensen's avatar
Bill Lorensen committed
432
      if (i%8 == 0)
433 434 435
        {
        fprintf(fp,"\n%s    ", indent);
        }
Bill Lorensen's avatar
Bill Lorensen committed
436
      else
437 438 439
        {
        fprintf(fp," ");
        }
Ken Martin's avatar
Ken Martin committed
440
      }
Bill Lorensen's avatar
Bill Lorensen committed
441
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
442
    fprintf(fp, "%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
443
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
444 445 446
    }

  // write out point data if any
447
  this->WritePointData(points, normals, tcoords, colors, fp);
Ken Martin's avatar
Ken Martin committed
448 449 450 451 452

  // write out polys if any
  if (pd->GetNumberOfPolys() > 0)
    {
    fprintf(fp,"%sIndexedFaceSet {\n", indent);
453
        VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
454
    fprintf(fp,"%scoordIndex  [\n", indent);
455
        VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
456 457 458 459 460 461
    
    cells = pd->GetPolys();
    for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
      {
      fprintf(fp,"%s", indent);
      for (i = 0; i < npts; i++)
462
        {
Amy Squillacote's avatar
Amy Squillacote committed
463
        // treating vtkIdType as int
464 465 466 467 468 469
        fprintf(fp,"%i, ",(int)indx[i]);
        if (((i+1)%10) == 0)
          {
          fprintf(fp, "\n%s    ", indent);
          }
        }
Ken Martin's avatar
Ken Martin committed
470 471 472
      fprintf(fp,"-1,\n");
      }
    fprintf(fp,"%s]\n", indent);
473
        VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
474
    fprintf(fp,"%s}\n", indent);
475
        VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
476 477 478 479 480 481
  }

  // write out tstrips if any
  if (pd->GetNumberOfStrips() > 0)
    {
    fprintf(fp,"%sIndexedTriangleStripSet {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
482
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
483
    fprintf(fp,"%scoordIndex  [\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
484
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
485 486 487 488 489
    cells = pd->GetStrips();
    for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
      {
      fprintf(fp,"%s", indent);
      for (i = 0; i < npts; i++)
490
        {
Amy Squillacote's avatar
Amy Squillacote committed
491
        // treating vtkIdType as int
492 493 494 495 496 497
        fprintf(fp,"%i, ", (int)indx[i]);
        if (((i+1)%10) == 0)
          {
          fprintf(fp, "\n%s    ", indent);
          }
        }
Ken Martin's avatar
Ken Martin committed
498 499 500
      fprintf(fp,"-1,\n");
      }
    fprintf(fp,"%s]\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
501
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
502
    fprintf(fp,"%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
503
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
504 505 506 507 508 509
    }
  
  // write out lines if any
  if (pd->GetNumberOfLines() > 0)
    {
    fprintf(fp,"%sIndexedLineSet {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
510
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
511
    fprintf(fp,"%scoordIndex  [\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
512
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
513 514 515 516 517
    cells = pd->GetLines();
    for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
      {
      fprintf(fp,"%s", indent);
      for (i = 0; i < npts; i++)
518
        {
Amy Squillacote's avatar
Amy Squillacote committed
519
        // treating vtkIdType as int
520 521 522 523 524 525
        fprintf(fp,"%i, ", (int)indx[i]);
        if (((i+1)%10) == 0)
          {
          fprintf(fp, "\n%s    ", indent);
          }
        }
Ken Martin's avatar
Ken Martin committed
526 527 528
      fprintf(fp,"-1,\n");
      }
    fprintf(fp,"%s]\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
529
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
530
    fprintf(fp,"%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
531
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
532 533 534 535 536 537 538
    }
  
  // write out verts if any
  // (more complex because there is no IndexedPointSet)
  if (pd->GetNumberOfVerts() > 0)
    {
    fprintf(fp, "%sSeparator {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
539
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
540
    fprintf(fp, "%sCoordinate3 {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
541
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
542
    fprintf(fp,"%spoint [", indent);
Bill Lorensen's avatar
Bill Lorensen committed
543
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
544 545 546 547
    cells = pd->GetVerts();
    for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
      {
      for (i = 0; i < npts; i++)
548 549 550 551
        {
        p = points->GetPoint(indx[i]);
        fprintf (fp,"%s%g %g %g,\n", indent, p[0], p[1], p[2]);
        }
Ken Martin's avatar
Ken Martin committed
552 553
      }
    fprintf(fp,"%s]\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
554
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
555
    fprintf(fp,"%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
556
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
557 558 559
    if (colors)
      {
      fprintf(fp,"%sPackedColor {", indent);
Bill Lorensen's avatar
Bill Lorensen committed
560
      VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
561
      fprintf(fp,"%srgba [\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
562
      VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
563
      for (cells->InitTraversal(); cells->GetNextCell(npts,indx); )
564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580
        {
        fprintf(fp,"%s", indent);
        for (i = 0; i < npts; i++)
          {
          c = colors->GetPointer(4*indx[i]);
          fprintf (fp,"%#lx, ", 
                   ((unsigned long)c[3] << 24) |
                   (((unsigned long)c[2])<<16) |
                   (((unsigned long)c[1])<<8) |
                   ((unsigned long)c[0]));

          if (((i+1)%5) == 0)
            {
            fprintf(fp, "\n%s", indent);
            }
          }
        }
Ken Martin's avatar
Ken Martin committed
581
      fprintf(fp,"\n%s]\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
582
      VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
583
      fprintf(fp,"%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
584
      VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
585 586 587 588
      fprintf(fp,"%sMaterialBinding { value PER_VERTEX_INDEXED }\n", indent);
      }
    
    fprintf(fp, "%sPointSet {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
589
    VTK_INDENT_MORE;
Amy Squillacote's avatar
Amy Squillacote committed
590 591
    // treating vtkIdType as int
    fprintf(fp, "%snumPoints %d\n", indent, (int)npts);
Bill Lorensen's avatar
Bill Lorensen committed
592
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
593
    fprintf(fp, "%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
594
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
595
    fprintf(fp,"%s}\n", indent); // close the Separator
Bill Lorensen's avatar
Bill Lorensen committed
596
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
597 598
    }  
  fprintf(fp, "%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
599 600 601 602 603
  VTK_INDENT_LESS;
  if (gf)
    {
    gf->Delete();
    }
Ken Martin's avatar
Ken Martin committed
604 605 606
  pm->Delete();
}

607 608
void vtkIVExporter::WritePointData(vtkPoints *points, vtkDataArray *normals,
                                   vtkDataArray *tcoords, 
609
                                   vtkUnsignedCharArray *colors, FILE *fp)
Ken Martin's avatar
Ken Martin committed
610
{
Ken Martin's avatar
Ken Martin committed
611
  double *p;
Ken Martin's avatar
Ken Martin committed
612 613 614 615 616
  int i;
  unsigned char *c;
  
  // write out the points
  fprintf(fp,"%sCoordinate3 {\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
617
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
618
  fprintf(fp,"%spoint [\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
619
  VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
620 621 622 623 624 625
  for (i = 0; i < points->GetNumberOfPoints(); i++)
    {
    p = points->GetPoint(i);
    fprintf (fp,"%s%g %g %g,\n", indent, p[0], p[1], p[2]);
    }
  fprintf(fp,"%s]\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
626
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
627
  fprintf(fp,"%s}\n", indent);
Bill Lorensen's avatar
Bill Lorensen committed
628
  VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
629 630 631 632 633
  
  // write out the point data
  if (normals)
    {
    fprintf(fp,"%sNormal {\n", indent);
634
        VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
635
    fprintf(fp,"%svector [\n", indent);
636
        VTK_INDENT_MORE;
637
    for (i = 0; i < normals->GetNumberOfTuples(); i++)
Ken Martin's avatar
Ken Martin committed
638
      {
639
      p = normals->GetTuple(i);
Ken Martin's avatar
Ken Martin committed
640 641 642
      fprintf (fp,"%s%g %g %g,\n", indent, p[0], p[1], p[2]);
      }
    fprintf(fp,"%s]\n", indent);
643
        VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
644
    fprintf(fp,"%s}\n", indent);
645
        VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
646 647 648 649 650
  }

  // write out the point data
  if (tcoords)
    {
651 652 653 654 655 656
        fprintf(fp,"%sTextureCoordinateBinding  {\n",indent);
        VTK_INDENT_MORE;
        fprintf(fp,"%svalue PER_VERTEX_INDEXED\n",indent);
        VTK_INDENT_LESS;
        fprintf(fp,"%s}\n",indent);
        fprintf(fp,"%sTextureCoordinate2 {\n", indent);
657
    VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
658
    fprintf(fp,"%spoint [\n", indent);
659
    VTK_INDENT_MORE;
660
    for (i = 0; i < tcoords->GetNumberOfTuples(); i++)
Ken Martin's avatar
Ken Martin committed
661
      {
662
      p = tcoords->GetTuple(i);
Ken Martin's avatar
Ken Martin committed
663 664 665
      fprintf (fp,"%s%g %g,\n", indent, p[0], p[1]);
      }
    fprintf(fp,"%s]\n", indent);
666
        VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
667
    fprintf(fp,"%s}\n", indent);
668
        VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
669 670 671 672 673 674
  }

  // write out the point data
  if (colors)
    {
    fprintf(fp,"%sPackedColor {\n", indent);
675
        VTK_INDENT_MORE;
Ken Martin's avatar
Ken Martin committed
676
    fprintf(fp,"%srgba [\n", indent);
677 678
        VTK_INDENT_MORE;
        fprintf(fp,"%s", indent);
679
    for (i = 0; i < colors->GetNumberOfTuples(); i++)
Ken Martin's avatar
Ken Martin committed
680
      {
681
      c = colors->GetPointer(4*i);
682
      fprintf (fp,"%#lx, ", 
683 684 685 686
               ((unsigned long)c[3] << 24) |
               (((unsigned long)c[2])<<16) |
               (((unsigned long)c[1])<<8) |
               ((unsigned long)c[0]));
687 688

      if (((i+1)%5)==0)
689 690 691
        {
        fprintf(fp, "\n%s", indent);
        }
Ken Martin's avatar
Ken Martin committed
692 693
      }
    fprintf(fp,"\n%s]\n", indent);
694
    VTK_INDENT_LESS;
Ken Martin's avatar
Ken Martin committed
695
    fprintf(fp,"%s}\n", indent);
696 697
    VTK_INDENT_LESS;
    fprintf(fp,"%sMaterialBinding { value PER_VERTEX_INDEXED }\n", indent);
Ken Martin's avatar
Ken Martin committed
698 699 700 701
    }
}


702
void vtkIVExporter::PrintSelf(ostream& os, vtkIndent ind)
Ken Martin's avatar
Ken Martin committed
703
{
Brad King's avatar
Brad King committed
704
  this->Superclass::PrintSelf(os,ind);
Ken Martin's avatar
Ken Martin committed
705
 
706 707 708 709 710 711 712 713
  if (this->FileName)
    {
    os << ind << "FileName: " << this->FileName << "\n";
    }
  else
    {
    os << ind << "FileName: (null)\n";
    }
Ken Martin's avatar
Ken Martin committed
714 715
}