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

3D图形编程

开发平台:

Visual C++

  1. //############################################################
  2. // plvMMCmds.cc
  3. // Jeremy Ginsberg
  4. // Fri Nov 13 18:08:16 CET 1998
  5. //
  6. // ModelMaker scan commands
  7. //############################################################
  8. #include <iostream.h>
  9. #include <stdlib.h>
  10. #include <assert.h>
  11. #include <sys/stat.h>
  12. #include <fstream.h>
  13. #include "Progress.h"
  14. #include "plvMMCmds.h"
  15. #include "DisplayMesh.h"
  16. #include "MMScan.h"
  17. #include "plvScene.h"
  18. #include "RigidScan.h"
  19. #include "plvDrawCmds.h"
  20. #include "FileNameUtils.h"
  21. int
  22. MmsAbsorbXformCmd(ClientData clientData, Tcl_Interp *interp,
  23.      int argc, char *argv[])
  24. {
  25.   if ((argc != 3) && (argc != 2)) {
  26.     printf("syntax: mms_absorbxform meshname [basexformname]n");
  27.     printf("        basexform name is an optional string used ton");
  28.     printf("        construct the names of each xform file. if nonen");
  29.     printf("        is supplied, then the basename of the mesh is used.n");
  30.     return TCL_OK;
  31.   }
  32.   if (strlen(argv[1]) == 0) {
  33.     printf("No mesh selected for mms_absorbxform.n");
  34.     return TCL_OK;
  35.   }
  36.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  37.   assert (dm);
  38.   RigidScan *theMesh = dm->getMeshData();
  39.   assert (theMesh);
  40.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  41.   if (!mm) {
  42.     printf("Selected mesh is not a ModelMaker scan.n");
  43.     return TCL_OK;
  44.   }
  45.   // if we have an alternate basename, use it; otherwise use the mesh name
  46.   if (argc == 3) mm->absorb_xforms(argv[2]);
  47.     else mm->absorb_xforms(argv[1]);
  48.   theScene->invalidateDisplayCaches();
  49.   redraw(true);
  50.   return TCL_OK;
  51. }
  52. int
  53. MmsGetScanFalseColorCmd(ClientData clientData, Tcl_Interp *interp,
  54. int argc, char *argv[])
  55. {
  56.   if (argc != 3) {
  57.     printf("need 3 args for mms_getscanfalsecolor.n");
  58.     return TCL_OK;
  59.   }
  60.   if (strlen(argv[1]) == 0) {
  61.     printf("No mesh selected for mms_getscanfalsecolor.n");
  62.     return TCL_OK;
  63.   }
  64.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  65.   assert (dm);
  66.   RigidScan *theMesh = dm->getMeshData();
  67.   assert (theMesh);
  68.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  69.   char color[20];
  70.   if (!mm) {
  71.     printf("Selected mesh is not a ModelMaker scan.n");
  72.     sprintf(color, "#000000");
  73.   }
  74.   else {
  75.     const vec3uc& diffuse = mm->getScanFalseColor(atoi(argv[2]));
  76.     sprintf (color, "#%02x%02x%02x",
  77.    (unsigned)diffuse[0],
  78.    (unsigned)diffuse[1],
  79.    (unsigned)diffuse[2]);
  80.   }
  81.   Tcl_SetResult (interp, color, TCL_VOLATILE);
  82.   return TCL_OK;
  83. }
  84. int
  85. MmsNumScansCmd(ClientData clientData, Tcl_Interp *interp,
  86. int argc, char *argv[])
  87. {
  88.   if (argc != 2) {
  89.     printf("need 2 args for mms_numscans.n");
  90.     return TCL_OK;
  91.   }
  92.   if (strlen(argv[1]) == 0) {
  93.     printf("No mesh selected for mms_numscans.n");
  94.     return TCL_OK;
  95.   }
  96.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  97.   assert (dm);
  98.   RigidScan *theMesh = dm->getMeshData();
  99.   assert (theMesh);
  100.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  101.   char result[20];
  102.   if (!mm) {
  103.     printf("Selected mesh is not a ModelMaker scan.n");
  104.     return TCL_ERROR;
  105.   }
  106.   else {
  107.     int numScans = mm->num_scans();
  108.     sprintf (result, "%d", numScans);
  109.   }
  110.   Tcl_SetResult (interp, result, TCL_VOLATILE);
  111.   return TCL_OK;
  112. }
  113. int
  114. MmsVripOrientCmd(ClientData clientData, Tcl_Interp *interp, 
  115.   int argc, char *argv[])
  116. {
  117.   if ((argc != 3) && (argc != 4)) {
  118.     printf("usage: mms_vriporient meshname directoryname [-noxform]n");
  119.     return TCL_ERROR;
  120.   }
  121.   if (strlen(argv[1]) == 0) {
  122.     printf("No mesh selected for VRIP alignment.n");
  123.     return TCL_OK;
  124.   }
  125.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  126.   assert (dm);
  127.   RigidScan *theMesh = dm->getMeshData();
  128.   assert (theMesh);
  129.   char* dir = argv[2];
  130.   portable_mkdir (dir, 00775);
  131.   
  132.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  133.   if (!mm) {
  134.     printf("Selected mesh is not a ModelMaker scan.n");
  135.     return TCL_OK;
  136.   }
  137.   crope confLines;
  138.   int numFragsFound;
  139.   printf("Auto-aligning meshes with Z-axis for VRIP...n");
  140.   if (argc == 4) {
  141.     if (strcmp(argv[3], "-noxform") == 0) {
  142.       printf("cancel that... no alignment with Z-axis, only saving pieces.n");
  143.       numFragsFound = mm->write_xform_ply(4, dir, confLines, false);
  144.     }
  145.   }
  146.   else 
  147.      numFragsFound = mm->write_xform_ply(4, dir, confLines, true);
  148.   cout << "Aligned " << numFragsFound << "modelmaker fragments for VRIP"
  149.        << endl;
  150.   printf("All done.n");
  151.   return TCL_OK;
  152. }
  153. int
  154. PlvWriteMMForVripCmd(ClientData clientData, Tcl_Interp *interp, 
  155.      int argc, char *argv[])
  156. {
  157.    if (argc < 3) {
  158.       interp->result = 
  159.  "Usage: plv_write_mm_for_vrip reslevel directory [-noxform]n";
  160.       return TCL_ERROR;
  161.    }
  162.    
  163.    int iRes = atoi (argv[1]);
  164.    char* dir = argv[2];
  165.    portable_mkdir (dir, 00775);
  166.   
  167.    crope result;
  168.    bool success = true;
  169.    
  170.    // vrip can't read tstrips
  171.    char* oldStripVal = Tcl_GetVar (interp, "meshWriteStrips", 
  172.    TCL_GLOBAL_ONLY);
  173.    Tcl_SetVar (interp, "meshWriteStrips", "never", 
  174.        TCL_GLOBAL_ONLY);
  175.    
  176.    Progress* prog = new Progress (theScene->meshSets.size() * 1000,
  177.   "Output plyfiles for vrip", 
  178.   true);
  179.    
  180.    
  181.    DisplayableMesh** dm = theScene->meshSets.begin();
  182.    bool noXform = false;
  183.    if ((argc > 3) && (strcmp(argv[3], "-noxform") == 0)) {
  184.      printf("Not transforming scan fragments; simply writing ply filesn");
  185.      noXform = true;
  186.    }
  187.    for (; dm < theScene->meshSets.end(); dm++) {
  188.       if (!(*dm)->getVisible())
  189.  continue;
  190.       RigidScan* rigidScan = (*dm)->getMeshData();
  191.       MMScan* mmScan = dynamic_cast<MMScan*> (rigidScan);
  192.       if (!mmScan)
  193.  continue;
  194.       
  195.       int numSweeps;
  196.       // functionality to write out ply fragments without x-forms
  197.       
  198.       if (noXform)
  199. numSweeps = mmScan->write_xform_ply(iRes, dir, result, false);
  200.       else
  201.         numSweeps = mmScan->write_xform_ply(iRes, dir, result, true);
  202.       if (!numSweeps) {
  203.  continue;
  204.       }
  205.       printf("Num meshes %dn", numSweeps);
  206.       /*
  207.       for (int i = 0; i < numConfLines; i++) {
  208.  if (!result.empty())
  209.     result += " ";
  210.  //result += confLines[i];
  211.  cout << result << endl;
  212.  //delete confLines[i];
  213.       }
  214.       */
  215.    }
  216.    // cleanup
  217.    delete prog;
  218.    Tcl_SetVar (interp, "meshWriteStrips", oldStripVal, 
  219.        TCL_GLOBAL_ONLY);
  220.    
  221.    if (!success)
  222.       return TCL_ERROR;
  223.    
  224.    Tcl_SetResult (interp, (char*)result.c_str(), TCL_VOLATILE);
  225.    return TCL_OK;
  226. }
  227. int
  228. MmsIsScanVisibleCmd(ClientData clientData, Tcl_Interp *interp,
  229.      int argc, char *argv[])
  230. {
  231.   if (argc != 3) return TCL_ERROR;
  232.   if (strlen(argv[1]) == 0) {
  233.     printf("No mesh selected for MmsIsScanVisible()n");
  234.     return TCL_OK;
  235.   }
  236.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  237.   assert (dm);
  238.   RigidScan *theMesh = dm->getMeshData();
  239.   assert (theMesh);
  240.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  241.   if (!mm) {
  242.     printf("Selected mesh is not a ModelMaker scan.n");
  243.     return TCL_OK;
  244.   }
  245.   int isVis = mm->isScanVisible(atoi(argv[2]));
  246.   char result[20];
  247.   sprintf(result, "%d", isVis);
  248.   Tcl_SetResult (interp, result, TCL_VOLATILE);
  249.   return TCL_OK;
  250. }
  251. int
  252. MmsSetScanVisibleCmd(ClientData clientData, Tcl_Interp *interp,
  253.      int argc, char *argv[])
  254. {
  255.   if (argc != 4) return TCL_ERROR;
  256.   if (strlen(argv[1]) == 0) {
  257.     printf("No mesh selected for MmsSetScanVisible()n");
  258.     return TCL_OK;
  259.   }
  260.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  261.   assert (dm);
  262.   RigidScan *theMesh = dm->getMeshData();
  263.   assert (theMesh);
  264.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  265.   if (!mm) {
  266.     printf("Selected mesh is not a ModelMaker scan.n");
  267.     return TCL_OK;
  268.   }
  269.   mm->setScanVisible(atoi(argv[2]), atoi(argv[3]));
  270.   return TCL_OK;
  271. }
  272. int
  273. MmsResetCacheCmd(ClientData clientData, Tcl_Interp *interp,
  274.       int argc, char *argv[])
  275. {
  276.   if (argc != 2) return TCL_ERROR;
  277.   if (strlen(argv[1]) == 0) {
  278.     printf("No mesh selected for MmsInvalidateCacheCmdn");
  279.     return TCL_OK;
  280.   }
  281.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  282.   assert (dm);
  283.   RigidScan *theMesh = dm->getMeshData();
  284.   assert (theMesh);
  285.   dm->invalidateCachedData();
  286.   theMesh->computeBBox();
  287.   return TCL_OK;
  288. }
  289. int
  290. MmsDeleteScanCmd(ClientData clientData, Tcl_Interp *interp,
  291.      int argc, char *argv[])
  292. {
  293.   if (argc != 3) return TCL_ERROR;
  294.   if (strlen(argv[1]) == 0) {
  295.     printf("No mesh selected for MmsDeleteScan()n");
  296.     return TCL_OK;
  297.   }
  298.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  299.   assert (dm);
  300.   RigidScan *theMesh = dm->getMeshData();
  301.   assert (theMesh);
  302.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  303.   if (!mm) {
  304.     printf("Selected mesh is not a ModelMaker scan.n");
  305.     return TCL_OK;
  306.   }
  307.   mm->deleteScan(atoi(argv[2]));
  308.   dm->invalidateCachedData();
  309.   
  310.   return TCL_OK;
  311. }
  312. int
  313. MmsFlipScanNormsCmd(ClientData clientData, Tcl_Interp *interp,
  314.      int argc, char *argv[])
  315. {
  316.   if (argc != 3) return TCL_ERROR;
  317.   if (strlen(argv[1]) == 0) {
  318.     printf("No mesh selected for MmsFlipScanNormsCmd()n");
  319.     return TCL_OK;
  320.   }
  321.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  322.   assert (dm);
  323.   RigidScan *theMesh = dm->getMeshData();
  324.   assert (theMesh);
  325.   MMScan *mm = dynamic_cast<MMScan *>(theMesh);
  326.   if (!mm) {
  327.     printf("Selected mesh is not a ModelMaker scan.n");
  328.     return TCL_OK;
  329.   }
  330.   mm->flipNormals(atoi(argv[2]));
  331.   dm->invalidateCachedData();
  332.   
  333.   return TCL_OK;
  334. }
  335. /* THIS is the old version of vriporient that expected the user to align
  336.  * the meshes by hand... not used anymore, but code may be useful for other
  337.  * things still.
  338. int
  339. PlvVripOrientCmd(ClientData clientData, Tcl_Interp *interp, 
  340.   int argc, char *argv[])
  341. {
  342.   if (argc != 2) return TCL_ERROR;
  343.   if (strlen(argv[1]) == 0) {
  344.     printf("No mesh selected.n");
  345.     return TCL_OK;
  346.   }
  347.   DisplayableMesh *dm = FindMeshDisplayInfo(argv[1]);
  348.   assert (dm);
  349.   RigidScan *theMesh = dm->getMeshData();
  350.   assert (theMesh);
  351.   if (!theMesh->has_ending(".cta")) return TCL_ERROR;
  352.   FILE *vfile = fopen("vrip.conf", "a");
  353.   if (!vfile) return TCL_ERROR;
  354.   
  355.   float q[4], t[3];
  356.   tbView->getXform(q,t);
  357.   Xform<float> viewer;
  358.   viewer.fromQuaternion(q, t[0], t[1], t[2]);
  359.   viewer.fast_invert();
  360.   Xform<float> combined = theMesh->getXform();
  361.   combined.removeTranslation();
  362.   cout << "mesh xform is: " << endl << theMesh->getXform();
  363.   
  364.   //  combined = viewer * theMesh->getXform();
  365.   // theMesh->setXform(combined);
  366.   MMScan *mm = (MMScan *)theMesh;
  367.   mm->write_xform_ply();
  368.   char fname[PATH_MAX];
  369.   strcpy(fname, theMesh->get_name().c_str());
  370.   char *pExt = strrchr(fname, '.');
  371.   if (pExt == NULL)
  372.     pExt = fname + strlen(fname);
  373.   strcpy(pExt, ".ply");
  374.   combined.fast_invert();
  375.   combined.toQuaternion(q);
  376.   combined.getTranslation(t);
  377.   fprintf(vfile, "bmesh %s %.5f %.5f %.5f %.5f %.5f %.5f %.5fn",
  378.   fname, t[0], t[1], t[2], q[1], q[2], q[3], q[0]);
  379.   fclose(vfile);
  380.   strcpy(pExt, ".xf");
  381.   mm->setXform(combined);
  382.   mm->writeXform(fname);
  383.   cout << "inverted xform is: " << endl << theMesh->getXform();
  384.   return TCL_OK;
  385. }
  386.   
  387. */