plvCybCmds.cc
上传用户:kellyonhid
上传日期:2013-10-12
资源大小:932k
文件大小:9k
源码类别:

3D图形编程

开发平台:

Visual C++

  1. #include <vector.h>
  2. #include "plvGlobals.h"
  3. #include "plvCybCmds.h"
  4. #include "plvMeshCmds.h"
  5. #include "RangeGrid.h"
  6. #include "plvImageCmds.h"
  7. #include "plvScene.h"
  8. #include "DisplayMesh.h"
  9. #include "GenericScan.h"
  10. #include "Mesh.h"
  11. int
  12. PlvReadCybCmd(ClientData clientData, Tcl_Interp *interp, 
  13.       int argc, char *argv[])
  14. {
  15.   //char *texFile = NULL;
  16.     
  17.   RangeGrid rangeGrid;
  18.   if (rangeGrid.readCyfile(argv[1]) == 0)
  19.     return TCL_ERROR;
  20.   //if (argc > 2) {
  21.   //if (EQSTR(argv[2], "-tex")) {
  22.   //  texFile = argv[3];
  23.   //}
  24.   //}
  25.   // BUGBUG need a smart factory for file reading
  26.   GenericScan *meshSet = new GenericScan;
  27.   meshSet->read(argv[1]);
  28.   DisplayableMesh* dm = theScene->addMeshSet(meshSet);
  29.   /*
  30.   if (texFile != NULL) {
  31.     strcpy(meshSet->texFileName, texFile);
  32.     for (int i = 0; i < numMeshes; i++)
  33.       meshSet->meshes[i]->setName(texFile);
  34.     loadTexture(meshSet, texFile, rangeGrid.isLinearScan);
  35.   }
  36.   */
  37.   Tcl_SetResult(interp, (char*)dm->getName(), TCL_VOLATILE);
  38.   return TCL_OK;
  39. }
  40. int
  41. PlvShadeCybCmd(ClientData clientData, Tcl_Interp *interp, 
  42.        int argc, char *argv[])
  43. {
  44. #if 1
  45.   cerr << "Command disabled" << endl;
  46.   return TCL_ERROR;
  47. #else
  48.   int i, j, in1, vin1, hasTexture;
  49.   char *texFile;
  50.   float lx, ly, lz;
  51.     
  52.     //numMeshes = 4;
  53.   RangeGrid rangeGrid;
  54.   if (rangeGrid.readCyfile(argv[1]) == 0)
  55.     return TCL_ERROR;
  56.   hasTexture = FALSE;
  57.   texFile = argv[2];
  58.   lx = 0;
  59.   ly = 0;
  60.   lz = 1;
  61.   if (argc > 3) {
  62.     lx = atof(argv[3]);
  63.     ly = atof(argv[4]);
  64.     lz = atof(argv[5]);
  65.   }
  66.   printf("Building mesh level 1n");
  67.   Mesh *mesh = rangeGrid.toMesh(1, hasTexture);
  68.   int subSamp = 1;
  69.   int nlt = rangeGrid.nlt;
  70.   int nlg = rangeGrid.nlg;
  71.   int ltMax = rangeGrid.ltMax;
  72.   int ltMin = ltMax - (ltMax/subSamp)*1;
  73.     
  74.   int lgMax = rangeGrid.lgMax;
  75.   int lgMin = rangeGrid.lgMin;
  76.     
  77.   int *vert_index = new int[rangeGrid.numSamples];
  78.   for (i = 0; i < rangeGrid.numSamples; i++)
  79.     vert_index[i] = -1;
  80.   /* Extra column of vertices for wrap-around */
  81.   int *vert_index_extra = new int[nlt];
  82.   for (i = ltMin; i <= ltMax; i++)
  83.     vert_index_extra[i] = -1;
  84.   /* see which vertices will be used in a triangle */
  85.   int count = 0;
  86.   for (j = ltMin; j <= ltMax; j += subSamp) {
  87.     for (i = lgMin; i <= lgMax; i += subSamp) {
  88.       in1 = rangeGrid.indices[i + j * nlg];
  89.       if (in1 >= 0) {
  90. vert_index[in1] = 1;
  91. count++;
  92.       }
  93.     }
  94.     if (!rangeGrid.isLinearScan) {
  95.       i = lgMin;
  96.       in1 = rangeGrid.indices[i + j * rangeGrid.nlg];
  97.       if (in1 >= 0) {
  98. vert_index_extra[j] = 1;
  99. count++;
  100.       }
  101.     }
  102.   }
  103.   count = 0;
  104.   for (j = ltMin; j <= ltMax; j += subSamp) {
  105.     for (i = lgMin; i <= lgMax; i += subSamp) {
  106.       in1 = rangeGrid.indices[i + j * nlg];
  107.       if (in1 >= 0) {
  108. vert_index[in1] = count;
  109. mesh->verts[count].coord = rangeGrid.coords[in1];
  110. if (rangeGrid.hasConfidence)
  111.   mesh->vertConfidence[count] = rangeGrid.confidence[in1];
  112. if (rangeGrid.hasIntensity)
  113.   mesh->vertIntensity[count] = rangeGrid.intensity[in1];
  114. if (rangeGrid.hasColor) {
  115.   mesh->vertMatDiff[count][0] = rangeGrid.matDiff[in1][0];
  116.   mesh->vertMatDiff[count][1] = rangeGrid.matDiff[in1][1];
  117.   mesh->vertMatDiff[count][2] = rangeGrid.matDiff[in1][2];
  118. }
  119. count++;
  120.       }
  121.     }
  122.     if (!rangeGrid.isLinearScan) {
  123.       i = lgMin;
  124.       in1 = rangeGrid.indices[i + j * rangeGrid.nlg];
  125.       if (in1 >= 0) {
  126. vert_index_extra[j] = count;
  127. mesh->verts[count].coord = rangeGrid.coords[in1];
  128. if (rangeGrid.hasConfidence)
  129.   mesh->vertConfidence[count] = rangeGrid.confidence[in1];
  130. if (rangeGrid.hasIntensity)
  131.   mesh->vertIntensity[count] = rangeGrid.intensity[in1];
  132. if (rangeGrid.hasColor) {
  133.   mesh->vertMatDiff[count][0] = rangeGrid.matDiff[in1][0];
  134.   mesh->vertMatDiff[count][1] = rangeGrid.matDiff[in1][1];
  135.   mesh->vertMatDiff[count][2] = rangeGrid.matDiff[in1][2];
  136. }
  137. count++;
  138.       }
  139.     }
  140.   }
  141.   printf ("%f %f %fn", lx, ly, lz);
  142.   int color;
  143.   ImgUchar *img = new ImgUchar(rangeGrid.nlg, rangeGrid.nlt, 1);
  144.   for (j = ltMin; j <= ltMax; j += 1) {
  145.     for (i = lgMin; i <= lgMax; i += 1) {
  146.       in1 = rangeGrid.indices[i + j * nlg];
  147.       if (in1 >= 0) {
  148. vin1 = vert_index[in1];
  149. color = int(mesh->verts[vin1].norm[0]*lx*255 + 
  150.     mesh->verts[vin1].norm[2]*lz*255);
  151. if (color < 0) color = 0;
  152. if (color > 255) color = 255;
  153. img->elem(i,j) = uchar(color);
  154.       }
  155.     }
  156.     /*
  157.       if (!rangeGrid.isLinearScan) {
  158.       i = lgMin;
  159.       in1 = rangeGrid.indices[i + j * rangeGrid.nlg];
  160.       if (in1 >= 0) {
  161.       vin1 = vert_index_extra[j];
  162.       mesh->texture[vin1][0] = 1 + 1.0/(lgMax - lgMin + 1);
  163.       mesh->texture[vin1][1] = float(j)/nlt;
  164.       count++;
  165.       }
  166.       }
  167.     */
  168.   }
  169.   /*
  170.     int xx, yy, color;
  171.     ImgUchar *img = new ImgUchar(rangeGrid.nlg, rangeGrid.nlt, 1);
  172.     for (yy = 0; yy < rangeGrid.nlt; yy++) {
  173.        for (xx = 0; xx < rangeGrid.nlg; xx++) {
  174.   color = -mesh->verts[xx+yy*rangeGrid.nlg].norm[2]*255;
  175.   if (color < 0) color = 0;
  176.   if (color > 255) color = 255;
  177.   img->elem(xx,yy) = uchar(color);
  178.        }
  179.     }
  180.     */
  181.   img->writeIris(texFile);
  182.   delete mesh;
  183.   delete img;
  184.   return TCL_OK;
  185. #endif
  186. }
  187. int
  188. PlvBumpCybCmd(ClientData clientData, Tcl_Interp *interp, 
  189.       int argc, char *argv[])
  190. {
  191. #if 1
  192.   cerr << "Command disabled" << endl;
  193.   return TCL_ERROR;
  194. #else
  195.   int i, j, in1, vin1, hasTexture;
  196.   char *texFile;
  197.     
  198.   //numMeshes = 4;
  199.   RangeGrid rangeGrid;
  200.   if (rangeGrid.readCyfile(argv[1]) == 0)
  201.     return TCL_ERROR;
  202.   hasTexture = FALSE;
  203.   texFile = argv[2];
  204.   printf("Building mesh level 1n");
  205.   Mesh *mesh = rangeGrid.toMesh(1, hasTexture);
  206.   int subSamp = 1;
  207.   int nlt = rangeGrid.nlt;
  208.   int nlg = rangeGrid.nlg;
  209.   int ltMax = rangeGrid.ltMax;
  210.   int ltMin = ltMax - (ltMax/subSamp)*1;
  211.     
  212.   int lgMax = rangeGrid.lgMax;
  213.   int lgMin = rangeGrid.lgMin;
  214.     
  215.   int *vert_index = new int[rangeGrid.numSamples];
  216.   for (i = 0; i < rangeGrid.numSamples; i++)
  217.     vert_index[i] = -1;
  218.   /* Extra column of vertices for wrap-around */
  219.   int *vert_index_extra = new int[nlt];
  220.   for (i = ltMin; i <= ltMax; i++)
  221.     vert_index_extra[i] = -1;
  222.   /* see which vertices will be used in a triangle */
  223.   int count = 0;
  224.   for (j = ltMin; j <= ltMax; j += subSamp) {
  225.     for (i = lgMin; i <= lgMax; i += subSamp) {
  226.       in1 = rangeGrid.indices[i + j * nlg];
  227.       if (in1 >= 0) {
  228. vert_index[in1] = 1;
  229. count++;
  230.       }
  231.     }
  232.     if (!rangeGrid.isLinearScan) {
  233.       i = lgMin;
  234.       in1 = rangeGrid.indices[i + j * rangeGrid.nlg];
  235.       if (in1 >= 0) {
  236. vert_index_extra[j] = 1;
  237. count++;
  238.       }
  239.     }
  240.   }
  241.   count = 0;
  242.   for (j = ltMin; j <= ltMax; j += subSamp) {
  243.     for (i = lgMin; i <= lgMax; i += subSamp) {
  244.       in1 = rangeGrid.indices[i + j * nlg];
  245.       if (in1 >= 0) {
  246. vert_index[in1] = count;
  247. mesh->verts[count].coord = rangeGrid.coords[in1];
  248. if (rangeGrid.hasConfidence)
  249.   mesh->vertConfidence[count] = rangeGrid.confidence[in1];
  250. if (rangeGrid.hasIntensity)
  251.   mesh->vertIntensity[count] = rangeGrid.intensity[in1];
  252. if (rangeGrid.hasColor) {
  253.   mesh->vertMatDiff[count][0] = rangeGrid.matDiff[in1][0];
  254.   mesh->vertMatDiff[count][1] = rangeGrid.matDiff[in1][1];
  255.   mesh->vertMatDiff[count][2] = rangeGrid.matDiff[in1][2];
  256. }
  257. count++;
  258.       }
  259.     }
  260.     if (!rangeGrid.isLinearScan) {
  261.       i = lgMin;
  262.       in1 = rangeGrid.indices[i + j * rangeGrid.nlg];
  263.       if (in1 >= 0) {
  264. vert_index_extra[j] = count;
  265. mesh->verts[count].coord = rangeGrid.coords[in1];
  266. if (rangeGrid.hasConfidence)
  267.   mesh->vertConfidence[count] = rangeGrid.confidence[in1];
  268. if (rangeGrid.hasIntensity)
  269.   mesh->vertIntensity[count] = rangeGrid.intensity[in1];
  270. if (rangeGrid.hasColor) {
  271.   mesh->vertMatDiff[count][0] = rangeGrid.matDiff[in1][0];
  272.   mesh->vertMatDiff[count][1] = rangeGrid.matDiff[in1][1];
  273.   mesh->vertMatDiff[count][2] = rangeGrid.matDiff[in1][2];
  274. }
  275. count++;
  276.       }
  277.     }
  278.   }
  279.   //printf ("%f %f %fn", lx, ly, lz);
  280.   int color;
  281.   ImgUchar *img = new ImgUchar(rangeGrid.nlg, rangeGrid.nlt, 3);
  282.   for (j = ltMin; j <= ltMax; j += 1) {
  283.     for (i = lgMin; i <= lgMax; i += 1) {
  284.       in1 = rangeGrid.indices[i + j * nlg];
  285.       if (in1 >= 0) {
  286. vin1 = vert_index[in1];
  287. color = int(mesh->verts[vin1].norm[0]*127 + 127);
  288. if (color < 0) color = 0;
  289. if (color > 255) color = 255;
  290. img->elem(i,j,0) = char(color);
  291. color = int(mesh->verts[vin1].norm[1]*127 + 127);
  292. if (color < 0) color = 0;
  293. if (color > 255) color = 255;
  294. img->elem(i,j,1) = char(color);
  295. color = int(mesh->verts[vin1].norm[2]*127 + 127);
  296. if (color < 0) color = 0;
  297. if (color > 255) color = 255;
  298. img->elem(i,j,2) = char(color);
  299.       }
  300.     }
  301.     /*
  302.       if (!rangeGrid.isLinearScan) {
  303.       i = lgMin;
  304.       in1 = rangeGrid.indices[i + j * rangeGrid.nlg];
  305.       if (in1 >= 0) {
  306.       vin1 = vert_index_extra[j];
  307.       mesh->texture[vin1][0] = 1 + 1.0/(lgMax - lgMin + 1);
  308.       mesh->texture[vin1][1] = float(j)/nlt;
  309.       count++;
  310.       }
  311.       }
  312.     */
  313.   }
  314.   /*
  315.     int xx, yy, color;
  316.     ImgUchar *img = new ImgUchar(rangeGrid.nlg, rangeGrid.nlt, 1);
  317.     for (yy = 0; yy < rangeGrid.nlt; yy++) {
  318.        for (xx = 0; xx < rangeGrid.nlg; xx++) {
  319.   color = -mesh->verts[xx+yy*rangeGrid.nlg].norm[2]*255;
  320.   if (color < 0) color = 0;
  321.   if (color > 255) color = 255;
  322.   img->elem(xx,yy) = uchar(color);
  323.        }
  324.     }
  325.     */
  326.   img->writeIris(texFile);
  327.   delete mesh;
  328.   delete img;
  329.   return TCL_OK;
  330. #endif
  331. }