home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MACRO / EDITB.M < prev    next >
Text File  |  1996-07-30  |  9KB  |  452 lines

  1. var private const    Mode_pos = 1;
  2. var private    change_flag = OFF;
  3.  
  4. function InputPlane;
  5. function private PolyInterpolation;
  6.  
  7. function private ModeChange()
  8. {
  9.     draw_mode = !draw_mode;
  10.     change_flag = ON;
  11. //    if( draw_mode == ON )
  12. //        Status_title[Mode_pos] = "断面: 表示";
  13. //    else
  14. //        Status_title[Mode_pos] = "断面:非表示";
  15. //    DrawStatus();
  16. }
  17.  
  18. //
  19. //    面を分割する
  20. // sel: 処理する面を示すセレクトクラス
  21. // pos[3]: 平面を表す頂点配列
  22. // obj1, obj2: 分割後のポリゴンが属するオブジェクト番号
  23. //
  24. function ZantePolygons( sel, pos, obj1, obj2 )
  25. {
  26.     var mat1;
  27.     var i, vers, orgsel;
  28.     var z[MAXVERTEX];
  29.     var atemp[3];
  30.     var temp;
  31.     var type;
  32.     var flagp, flagm;
  33.     var flag;
  34.     var p1, p2;
  35.  
  36.     mat1 = move(UNIT_MATRIX, pos[0] * (-1)) / vec(UNIT_MATRIX,
  37.                 pos[1]-pos[0], (pos[1]-pos[0]) * (pos[2]-pos[0]));
  38.  
  39.     orgsel  = Select();
  40.     Select(sel);
  41.  
  42.     while (PolyLoad()) {
  43.         vers = PolyVertexs();
  44.         flagp = TRUE;
  45.         flagm = TRUE;
  46.         for (i = 0; i < vers; i++) {
  47.             element(Position(PolyGetVertex(i))*mat1, atemp);
  48.             z[i] = atemp[2];
  49.             if (z[i] < 0) {
  50.                 flagp = FALSE;
  51.             }
  52.             if (z[i] > 0) {
  53.                 flagm = FALSE;
  54.             }
  55.         }
  56.         z[vers] = z[0];
  57.         if (flagp) {
  58.             PolyObj(obj1);
  59.             PolyAppend();
  60.         } else if (flagm) {
  61.             PolyObj(obj2);
  62.             PolyAppend();
  63.         } else {
  64.             flagp = FALSE;
  65.             if (z[0] > 0) {
  66.                 flagp = TRUE;
  67.                 for (i = 0; i < vers+1; i++) {
  68.                     z[i] = -z[i];
  69.                 }
  70.             }
  71.             flag = 0;
  72.             p1 = -1;
  73.             p2 = -1;
  74.             for (i = 0; i < vers; i++) {
  75.                 if (z[i+1] > 0) {
  76.                     p1 = i;
  77.                     if (z[i] < 0) {
  78.                         PolyInterpolation(i, -(0.0+z[i]) / (z[i+1] - z[i]));
  79.                         flag++;
  80.                         i++;
  81.                         p1++;
  82.                     }
  83.                     break;
  84.                 }
  85.             }
  86.             for (; i < vers; i++) {
  87.                 if (z[i+1] < 0) {
  88.                     p2 = i + flag;
  89.                     if (z[i] > 0) {
  90.                         PolyInterpolation(i+flag, -(0.0+z[i]) / (z[i+1] - z[i]));
  91.                         flag++;
  92.                         i++;
  93.                         p2++;
  94.                     }
  95.                     break;
  96.                 }
  97.             }
  98.             vers += flag;
  99.             if (p1 >= 0 & p2 >= 0) {
  100.  
  101. //print("\nvers=", vers, ", p1=", p1, ", p2=", p2, "PolyVertexs=", PolyVertexs(), "\n");
  102.                 PolyShiftVertex(p1);
  103.                 if (flagp) {
  104.                     PolyObj(obj2);
  105.                 } else {
  106.                     PolyObj(obj1);
  107.                 }
  108.                 PolyVertexs(p2-p1+1);
  109.                 PolyAppend();
  110.  
  111.                 PolyVertexs(vers);
  112.                 PolyShiftVertex(p2-p1);
  113.                 if (flagp) {
  114.                     PolyObj(obj1);
  115.                 } else {
  116.                     PolyObj(obj2);
  117.                 }
  118.                 PolyVertexs(vers-(p2-p1)+1);
  119.                 PolyAppend();
  120.             }
  121. //            PolySave();
  122.         }
  123.     }
  124.  
  125.     Select(orgsel);
  126. }
  127. function private PolyInterpolation(inspos, rate)
  128. {
  129.     var v1, v2, ver;
  130.     var pos, vec, u, v;
  131.     var uv1[2], uv2[2];
  132.     v1 = PolyGetVertex(inspos);
  133.     if (inspos < PolyVertexs() - 1) {
  134.         v2 = PolyGetVertex(inspos+1);
  135.     } else {
  136.         v2 = PolyGetVertex(0);
  137.     }
  138.     pos = Position(v1) * (1.0-rate) + Position(v2) * rate;
  139.     if (PolyType() == POLY_SHADE | PolyType() == POLY_UVSHADE) {
  140.         vec = Vector(v1) * (1.0-rate) + Vector(v2) * rate;
  141.     } else {
  142.         vec = vector(1,1,1);
  143.     }
  144.     if (PolyType() == POLY_UV | PolyType() == POLY_UVSHADE) {
  145.         Mapping(v1, uv1);
  146.         Mapping(v2, uv2);
  147.         u = (0.0+uv1[0]) * (1.0-rate) + (0.0+uv2[0]) * rate;
  148.         v = (0.0+uv1[1]) * (1.0-rate) + (0.0+uv2[1]) * rate;
  149.     } else {
  150.         u = 0;
  151.         v = 0;
  152.     }
  153.     ver = Vertex(pos, vec, u, v);
  154. //print("\n",inspos, "\nv1=", v1, "\nv2=", v2, "\nvr=", ver);
  155.     PolyInsVertex(ver, inspos+1);
  156. }
  157.  
  158. function ZanteEdge( sel, pos )
  159. {
  160.     var edge;
  161.     edge = Edge();
  162.  
  163.     var mat1;
  164.     var i, vers, orgsel;
  165.     var z[MAXVERTEX];
  166.     var atemp[3];
  167.     var temp;
  168.     var type;
  169.     var flagp, flagm;
  170.     var rate;
  171.     var p1, p2;
  172.     var v1, v2;
  173.  
  174.     mat1 = move(UNIT_MATRIX, pos[0] * (-1)) / vec(UNIT_MATRIX,
  175.                 pos[1]-pos[0], (pos[1]-pos[0]) * (pos[2]-pos[0]));
  176.  
  177.     orgsel  = Select();
  178.     Select(sel);
  179.  
  180.     while (PolyLoad()) {
  181.         vers = PolyVertexs();
  182.         flagp = TRUE;
  183.         flagm = TRUE;
  184.         PolySetVertex(PolyGetVertex(0), vers);
  185.         for (i = 0; i < vers; i++) {
  186.             element(Position(PolyGetVertex(i))*mat1, atemp);
  187.             z[i] = atemp[2];
  188.             if (z[i] < 0) {
  189.                 flagp = FALSE;
  190.             }
  191.             if (z[i] > 0) {
  192.                 flagm = FALSE;
  193.             }
  194.         }
  195.         z[vers] = z[0];
  196.         z[vers+1] = z[1];
  197.         if (flagp != TRUE & flagm != TRUE) {
  198.             if (z[0] > 0) {
  199.                 for (i = 0; i < vers+1; i++) {
  200.                     z[i] = -z[i];
  201.                 }
  202.             }
  203.             p1 = -1;
  204.             p2 = -1;
  205.             for (i = 0; i < vers; i++) {
  206.                 if (z[i+1] > 0) {
  207.                     if (z[i] < 0) {
  208.                         v1 = PolyGetVertex(i);
  209.                         v2 = PolyGetVertex(i+1);
  210.                         rate = -(0.0+z[i]) / (z[i+1] - z[i]);
  211.                         p1 = Vertex(Position(v1) * (1.0-rate) + Position(v2) * rate);
  212.                     } else {
  213.                         p1 = PolyGetVertex(i);
  214.                     }
  215.                     break;
  216.                 }
  217.             }
  218.             for (; i < vers+1; i++) {
  219.                 if (z[i+1] < 0) {
  220.                     if (z[i] > 0) {
  221.                         v1 = PolyGetVertex(i);
  222.                         v2 = PolyGetVertex(i+1);
  223.                         rate = -(0.0+z[i]) / (z[i+1] - z[i]);
  224.                         p2 = Vertex(Position(v1) * (1.0-rate) + Position(v2) * rate);
  225.                     } else {
  226.                         p2 = PolyGetVertex(i);
  227.                     }
  228.                     break;
  229.                 }
  230.             }
  231.             if (i == vers+1) {
  232.                 continue;
  233.             }
  234.             edge = edge + Edge(p1, p2);
  235.         }
  236.     }
  237.  
  238.     Select(orgsel);
  239.     return edge;
  240. }
  241.  
  242. function _Zante()
  243. {
  244.     var    const    org_obj_num = "_zan";
  245.     var    obj_num[2], temp;
  246.     var    vers, i, j, k;
  247.     var    point[3], pos[3];
  248.     var    key, prev_sel, work_sel, sel;
  249.     var    edge, edge_temp;
  250.     var    pick, draw_flag = ON;
  251.  
  252.     draw_mode = OFF;
  253.     change_flag = OFF;
  254.     prev_sel = Select();
  255.     if( SelectPolygons() == 0 )
  256.     {
  257.         Warning();
  258.         if( MESSAGE == ON )
  259.             Message( error_msg3 );
  260.         return;
  261.     }
  262.     work_sel = Select();
  263.     Select( prev_sel );
  264.  
  265.     PushMenu();
  266.     Status_org = Status_title;
  267.     MenuPosition( Menu( " 動作設定(&S)",
  268.             "断面表示    C",    ModeChange,CheckMode,
  269.             "--------",        SEPARATE_MENU,
  270.             "切断中止    ESC",    MenuQuit
  271.         ), Menu_Title );
  272.     ClearStatus();
  273.     Status_title[0] = "【面切断中】";
  274. //    if( draw_mode == ON )
  275. //        Status_title[Mode_pos] = "断面: 表示";
  276. //    else
  277. //        Status_title[Mode_pos] = "断面:非表示";
  278.     DrawStatus();
  279.  
  280.     quit_flag = FALSE;
  281.  
  282.     cur = Cursor();
  283.     pick = cur;
  284.     point[0] = cur;
  285.     pos[0] = Position( point[0] );
  286.     vers = 1;
  287.     edge = Edge();
  288.     input_flag = OFF;
  289.     while( TRUE )
  290.     {
  291.         if( draw_flag == ON )
  292.         {
  293.             DrawLine( cur, point[vers-1] );
  294.             if(( draw_mode == ON ) & ( vers == 2 ))
  295.                 DrawEdge(edge);
  296.         }
  297.         key = WaitEvent();
  298.         if( key )
  299.             input_flag = ON;
  300.         if(( ShiftStat() & 1 ) == 1 )
  301.         {
  302.             cur = Cursor();
  303.             TrimCursor(point[vers-1], MouseWindow());
  304.             Cursor( cur );
  305.         }
  306.         else
  307.             cur = Cursor();
  308.         key = KeyCode();
  309.         if ( input_flag | key == INPUT_KEY )
  310.         {
  311.             if( vers == 1 )
  312.             {
  313.                 if( cur == point[0] )
  314.                 {
  315.                     Warning();
  316.                     if( MESSAGE == ON )
  317.                         Message( "最初に指定した点と同じ点です\n"
  318.                             +"別の点を指定してください" );
  319.                 }
  320.                 else
  321.                 {
  322.                     point[1] = cur;
  323.                     pos[1] = Position( point[1] );
  324.                     vers++;
  325.                 }
  326.             }
  327.             else if( vers == 2 )
  328.             {
  329.                 if( cur == point[0] | cur == point[1] )
  330.                 {
  331.                     Warning();
  332.                     if( MESSAGE == ON )
  333.                         Message( "切断する平面を指定してください\n"
  334.                             +"Cキーを押すと切断面を確認できます" );
  335.                 }
  336.                 else
  337.                 {
  338.                     point[2] = cur;
  339.                     pos[2] = Position( point[2] );
  340.                     break;
  341.                 }
  342.             }
  343.         }
  344.         else if( key == ESC | quit_flag == TRUE )
  345.         {
  346.             PopandClear( OVERWRITE );
  347.             return FALSE;
  348.         }
  349.         else if ( key == BS )
  350.         {
  351.             if ( vers == 1 )
  352.             {
  353.                 PopandClear( OVERWRITE );
  354.                 return FALSE;
  355.             }
  356.             else
  357.             {
  358.                 if( cur != point[1] )
  359.                 {
  360.                     DrawEdge(edge);
  361.                     DrawLine( pick, point[0] );
  362.                     DrawLine( cur, point[1] );
  363.                     cur = point[1];
  364.                     vers --;
  365.                     DrawLine( cur, point[0] );
  366.                     Cursor( cur );
  367.                 }
  368.                 else
  369.                     vers --;
  370.                 edge = Edge();
  371.             }
  372.         }
  373.         else if( key == 'c' )
  374.             ModeChange();
  375.         else
  376.             temp = KeyProcess( key );
  377.         if( ((key!=0 ) & (key != INPUT_KEY))
  378.             | ( pick != Cursor())
  379.             | (change_flag == ON ))
  380.         {
  381.             draw_flag = ON;
  382.             edge_temp = edge;
  383.             if( vers == 2 )
  384.             {
  385.                 if((( pick != cur ) & (draw_mode == ON ))
  386.                  | (( change_flag == ON ) & ( draw_mode == ON )))
  387.                 {
  388.                     if((cur != point[0]) & (cur != point[1]))
  389.                     {
  390.                         pos[2] = Position( cur );
  391.                         edge = ZanteEdge(work_sel, pos);
  392.                     }
  393.                     else
  394.                         edge = Edge();
  395.                 }
  396.             }
  397.             if(( draw_mode == ON ) & ( vers == 2 ))
  398.                 DrawEdge(edge_temp);
  399.             DrawLine( pick, point[vers-1] );
  400.         }
  401.         else
  402.             draw_flag = OFF;
  403.         change_flag = OFF;
  404.         pick = Cursor();
  405.         input_flag = OFF;
  406.     }
  407.     Clear( OVERWRITE );
  408.     Select( work_sel );
  409.     for( i = 0; i< 2;i++)
  410.     {
  411.         for( j = 0; j< MAXOBJECT;j++ )
  412.         {
  413.             temp = org_obj_num+substr("0"+tostring(j),-2);
  414.             k = ObjSearch( temp );
  415.             if( k < 0 )
  416.                 break;
  417.         }
  418.         k = ObjCurrent();
  419.         if(( EXPERT == TRUE ) | ( MACHINE != "WINDOWS" ))
  420.             obj_num[i] = ObjAppend( temp, ObjFile( k ));
  421.         else
  422.             obj_num[i] = ObjAppend( temp, MakeFile( temp, "suf" ));
  423.     }
  424.     ZantePolygons( work_sel, pos, obj_num[0], obj_num[1] );
  425.     SelectObj( obj_num[0], TRUE, SELECT_OR );
  426.     SelectObj( obj_num[1], TRUE, SELECT_OR );
  427.     PolyDelete( work_sel );
  428.     work_sel = Select();
  429.     i = 0;
  430.     while( Objects() > i )
  431.     {
  432.         temp = substr( ObjName( i ), (!org_obj_num));
  433.         if( temp != org_obj_num )
  434.             i++;
  435.         else
  436.         {
  437.             SelectObj( i, TRUE, SELECT_UPDATE );
  438.             if( SelectPolygons() == 0 )
  439.                 ObjDelete( i );
  440.             else
  441.                 i++;
  442.         }
  443.     }
  444.     Select( work_sel );
  445.     PopMenu();
  446.     Status_title = Status_org;
  447.     DrawStatus();
  448.     Update( CLEAR );
  449.     UpdateObject();
  450.     return TRUE;
  451. }
  452.