home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MACRO / EDITF.M < prev    next >
Text File  |  1996-08-01  |  10KB  |  447 lines

  1. //
  2. //    面を膨らませる
  3. //
  4.  
  5. function PuffCenter(ver1, ver2)
  6. {
  7.     var pos1, pos2;
  8.     var vec1, vec2;
  9.     var pos, vec, ver;
  10.     var pv;
  11.     var cos1, cos2, sin1, sin2;
  12.     var uv1[2], uv2[2];
  13.     var theta;
  14.     var nv;
  15.     var l;
  16.  
  17.     pos1 = Position(ver1);
  18.     pos2 = Position(ver2);
  19.  
  20.     vec1 = Vector(ver1);
  21.     vec2 = Vector(ver2);
  22.     vec = (vec1 + vec2);
  23.  
  24.     Mapping(ver1, uv1);
  25.     Mapping(ver2, uv2);
  26.  
  27.     l = abs(vec1);
  28.     if (l < 0.0001) return FALSE;
  29.     vec1 = vec1 * (1.0/l);
  30.  
  31.     l = abs(vec2);
  32.     if (l < 0.0001) return FALSE;
  33.     vec2 = vec2 * (1.0/l);
  34.  
  35.     l = abs(vec);
  36.     if (l < 0.0001) return FALSE;
  37.     vec = vec * (1.0/l);
  38.  
  39.     pv = pos2 - pos1;
  40.     nv = (pv * vec) * pv;
  41.     l = abs(nv);
  42.     if (l < 0.0001) return FALSE;
  43.     nv = nv * (1.0/l);
  44.  
  45.     l = abs(pv);
  46.     if (l < 0.0001) return FALSE;
  47.     pv = pv * (1.0/l);
  48.  
  49.     cos1 =   pv . vec1;
  50.     cos2 = - pv . vec2;
  51.  
  52.     sin1 = abs( pv * vec1 );
  53.     sin2 = abs( pv * vec2 );
  54.  
  55.     theta = (atan2(sin1, cos1) + atan2(sin2, cos2) - PI) / 4.0;
  56.  
  57.     if ((PI/2-0.0001) < theta & theta < (PI/2+0.0001)) return FALSE;
  58.  
  59.     if (-0.01 < theta & theta < 0.01)
  60.         return TRUE;
  61.  
  62.     pos = ((pos1 + pos2) * 0.5) + nv * (l * 0.5 * tan(theta));
  63.     ver = Vertex(pos, vec * 256.0, (uv1[0]+uv2[0])/2, (uv1[1]+uv2[1])/2);
  64.     return ver;
  65. }
  66.  
  67. function Puff3()
  68. {
  69.     var vec1,vec2, vec3, vec12, vec23, vec31;
  70.     vec1 = PolyGetVertex(0);
  71.     vec2 = PolyGetVertex(1);
  72.     vec3 = PolyGetVertex(2);
  73.  
  74.     vec12 = PuffCenter(vec1, vec2);
  75.     vec23 = PuffCenter(vec2, vec3);
  76.     vec31 = PuffCenter(vec3, vec1);
  77.  
  78. //    if (typeof(vec12) == BOOLEAN | typeof(vec23) == BOOLEAN | typeof(vec31) == BOOLEAN)
  79. //        return;
  80.  
  81.  
  82.     if (typeof(vec12) == BOOLEAN) {
  83.         if (typeof(vec23) == BOOLEAN) {
  84.             if (typeof(vec31) == BOOLEAN) {
  85.                 return;
  86.             } else {
  87. // 1 - 2 - 31, 31 - 2 - 3
  88. //                PolySetVertex(vec1,  0);
  89. //                PolySetVertex(vec2,  1);
  90.                 PolySetVertex(vec31, 2);
  91.                 PolyAppend(TRUE);
  92.  
  93.                 PolySetVertex(vec31, 0);
  94. //                PolySetVertex(vec2,  1);
  95.                 PolySetVertex(vec3,  2);
  96.                 PolySave();
  97.             }
  98.         } else {
  99.             if (typeof(vec31) == BOOLEAN) {
  100. // 1 - 2 - 23, 1 - 23 - 3
  101. //                PolySetVertex(vec1,  0);
  102. //                PolySetVertex(vec2,  1);
  103.                 PolySetVertex(vec23, 2);
  104.                 PolyAppend(TRUE);
  105.  
  106. //                PolySetVertex(vec1,  0);
  107.                 PolySetVertex(vec23, 1);
  108.                 PolySetVertex(vec3,  2);
  109.                 PolySave();
  110.  
  111.             } else {
  112. // 1 - 2 - 23 - 31, 31 - 23 - 3
  113.                 PolySetVertex(vec31, 0);
  114.                 PolySetVertex(vec23, 1);
  115. //                PolySetVertex(vec3,  2);
  116.                 PolyAppend(TRUE);
  117.  
  118.                 PolyVertexs(4);
  119.                 PolySetVertex(vec1,  0);
  120.                 PolySetVertex(vec2,  1);
  121.                 PolySetVertex(vec23, 2);
  122.                 PolySetVertex(vec31, 3);
  123.                 PolySave();
  124.             }
  125.         }
  126.     } else {
  127.         if (typeof(vec23) == BOOLEAN) {
  128.             if (typeof(vec31) == BOOLEAN) {
  129. // 1 - 12 - 3, 12 - 2 - 3
  130. //                PolySetVertex(vec1,  0);
  131.                 PolySetVertex(vec12, 1);
  132. //                PolySetVertex(vec3,  2);
  133.                 PolyAppend(TRUE);
  134.  
  135.                 PolySetVertex(vec12, 0);
  136.                 PolySetVertex(vec2,  1);
  137. //                PolySetVertex(vec3,  2);
  138.                 PolySave();
  139.             } else {
  140. // 1 - 12 - 31, 12 - 2 - 3 - 31
  141. //                PolySetVertex(vec1,  0);
  142.                 PolySetVertex(vec12, 1);
  143.                 PolySetVertex(vec31, 2);
  144.                 PolyAppend(TRUE);
  145.  
  146.                 PolyVertexs(4);
  147.                 PolySetVertex(vec12, 0);
  148.                 PolySetVertex(vec2,  1);
  149.                 PolySetVertex(vec3,  2);
  150.                 PolySetVertex(vec31, 3);
  151.                 PolySave();
  152.             }
  153.         } else {
  154.             if (typeof(vec31) == BOOLEAN) {
  155. // 1 - 12 - 23 - 3, 12 - 2 - 23
  156.                 PolySetVertex(vec12, 0);
  157. //                PolySetVertex(vec2,  1);
  158.                 PolySetVertex(vec23, 2);
  159.                 PolyAppend(TRUE);
  160.  
  161.                 PolyVertexs(4);
  162.                 PolySetVertex(vec1,  0);
  163.                 PolySetVertex(vec12, 1);
  164. //                PolySetVertex(vec23, 2);
  165.                 PolySetVertex(vec3,  3);
  166.                 PolySave();
  167.             } else {
  168. // 1 - 12 - 31, 12 - 2 - 23, 12 - 23 - 31, 31 - 23 - 3
  169. //                PolySetVertex(vec1,  0);
  170.                 PolySetVertex(vec12, 1);
  171.                 PolySetVertex(vec31, 2);
  172.                 PolyAppend(TRUE);
  173.  
  174.                 PolySetVertex(vec12, 0);
  175.                 PolySetVertex(vec2,  1);
  176.                 PolySetVertex(vec23, 2);
  177.                 PolyAppend(TRUE);
  178.  
  179.                 PolySetVertex(vec12, 0);
  180.                 PolySetVertex(vec23, 1);
  181.                 PolySetVertex(vec31, 2);
  182.                 PolyAppend(TRUE);
  183.  
  184.                 PolySetVertex(vec31, 0);
  185.                 PolySetVertex(vec23, 1);
  186.                 PolySetVertex(vec3,  2);
  187.                 PolySave();
  188.             }
  189.         }
  190.     }
  191. }
  192.  
  193. function Puff4()
  194. {
  195.     var vec1,vec2, vec3, vec4;
  196.     var vec12, vec23, vec34, vec41, vec1234;
  197.     var vec2341;
  198.     var p, v, uv[2];
  199.     var type;
  200.     vec1 = PolyGetVertex(0);
  201.     vec2 = PolyGetVertex(1);
  202.     vec3 = PolyGetVertex(2);
  203.     vec4 = PolyGetVertex(3);
  204.  
  205.     vec12 = PuffCenter(vec1, vec2);
  206.     vec23 = PuffCenter(vec2, vec3);
  207.     vec34 = PuffCenter(vec3, vec4);
  208.     vec41 = PuffCenter(vec4, vec1);
  209.  
  210. //    if (typeof(vec12) == BOOLEAN | typeof(vec23) == BOOLEAN
  211. //      | typeof(vec34) == BOOLEAN | typeof(vec41) == BOOLEAN)
  212. //        return;
  213.  
  214.     type = 0;
  215.     if (typeof(vec12) != BOOLEAN) type += 8;
  216.     if (typeof(vec23) != BOOLEAN) type += 4;
  217.     if (typeof(vec34) != BOOLEAN) type += 2;
  218.     if (typeof(vec41) != BOOLEAN) type += 1;
  219.  
  220. //print ("type=", type);
  221.  
  222.     if (type == 0) {
  223.         return;
  224.     } else if (type == 1) {
  225.         PolyShiftVertex(3);
  226.         vec12 = vec41;
  227.         type = 8;
  228.     } else if (type == 2) {
  229.         PolyShiftVertex(2);
  230.         vec12 = vec34;
  231.         type = 8;
  232.     } else if (type == 3) {
  233.         PolyShiftVertex(2);
  234.         vec12 = vec34;
  235.         vec23 = vec41;
  236.         type = 12;
  237.     } else if (type == 4) {
  238.         PolyShiftVertex(1);
  239.         vec12 = vec23;
  240.         type = 8;
  241.     } else if (type == 5) {
  242.         PolyShiftVertex(1);
  243.         vec12 = vec23;
  244.         vec34 = vec41;
  245.         type = 10;
  246.     } else if (type == 6) {
  247.         PolyShiftVertex(1);
  248.         vec12 = vec23;
  249.         vec23 = vec34;
  250.         type = 12;
  251.     } else if (type == 7) {
  252.         PolyShiftVertex(1);
  253.         vec12 = vec23;
  254.         vec23 = vec34;
  255.         vec34 = vec41;
  256.         type = 14;
  257.     } else if (type == 8) {
  258.     } else if (type == 9) {
  259.         PolyShiftVertex(3);
  260.         vec23 = vec12;
  261.         vec12 = vec41;
  262.         type = 12;
  263.     } else if (type == 10) {
  264.     } else if (type == 11) {
  265.         PolyShiftVertex    (2);
  266. //        vec12 = vec34;
  267. //        vec23 = vec41;
  268. //        vec34 = vec12;
  269.         vec23 = vec41;
  270.         vec41 = vec12;
  271.         vec12 = vec34;
  272.         vec34 = vec41;
  273.         type = 14;
  274.     } else if (type == 12) {
  275.     } else if (type == 13) {
  276.         PolyShiftVertex    (3);
  277.         vec34 = vec23;
  278.         vec23 = vec12;
  279.         vec12 = vec41;
  280.         type = 14;
  281.     } else if (type == 14) {
  282.     } else if (type == 15) {
  283.         vec1234 = PuffCenter(vec12, vec34);
  284.         vec2341 = PuffCenter(vec23, vec41);
  285.         if (typeof(vec1234) == BOOLEAN | typeof(vec2341) == BOOLEAN)
  286.             return;
  287.         Mapping(vec1234, uv);
  288.         vec1234 = Vertex((Position(vec1234) + Position(vec2341))*0.5,
  289.                  (Vector(vec1234) + Vector(vec2341))*0.5, uv[0], uv[1]);
  290.  
  291. //        PolySetVertex(vec1,    0);
  292.         PolySetVertex(vec12,   1);
  293.         PolySetVertex(vec1234, 2);
  294.         PolySetVertex(vec41,   3);
  295.         PolyAppend(TRUE);
  296.  
  297.         PolySetVertex(vec12,   0);
  298.         PolySetVertex(vec2,    1);
  299.         PolySetVertex(vec23,   2);
  300.         PolySetVertex(vec1234, 3);
  301.         PolyAppend(TRUE);
  302.  
  303.         PolySetVertex(vec41,   0);
  304.         PolySetVertex(vec1234, 1);
  305.         PolySetVertex(vec34,   2);
  306.         PolySetVertex(vec4,    3);
  307.         PolyAppend(TRUE);
  308.  
  309.         PolySetVertex(vec1234, 0);
  310.         PolySetVertex(vec23,   1);
  311.         PolySetVertex(vec3,    2);
  312.         PolySetVertex(vec34,   3);
  313.         PolySave();
  314.     }
  315.  
  316. //print ("->", type, "\n");
  317.  
  318.  
  319.     vec1 = PolyGetVertex(0);
  320.     vec2 = PolyGetVertex(1);
  321.     vec3 = PolyGetVertex(2);
  322.     vec4 = PolyGetVertex(3);
  323.  
  324.     if (type == 8) {
  325.         PolyVertexs(3);
  326.         PolySetVertex(vec1,  0);
  327.         PolySetVertex(vec12, 1);
  328.         PolySetVertex(vec4,  2);
  329.         PolyAppend(TRUE);
  330.  
  331.         PolySetVertex(vec12, 0);
  332.         PolySetVertex(vec3,  1);
  333.         PolySetVertex(vec4,  2);
  334.         PolyAppend(TRUE);
  335.  
  336.         PolySetVertex(vec12, 0);
  337.         PolySetVertex(vec2,  1);
  338.         PolySetVertex(vec3,  2);
  339.         PolySave();
  340.     } else if (type == 10) {
  341.         PolySetVertex(vec1,  0);
  342.         PolySetVertex(vec12, 1);
  343.         PolySetVertex(vec34, 2);
  344.         PolySetVertex(vec4,  3);
  345.         PolyAppend(TRUE);
  346.  
  347.         PolySetVertex(vec12, 0);
  348.         PolySetVertex(vec2,  1);
  349.         PolySetVertex(vec3,  2);
  350.         PolySetVertex(vec34, 3);
  351.         PolySave();
  352.     } else if (type == 12) {
  353.         PolyVertexs(3);
  354.  
  355.         PolySetVertex(vec1,  0);
  356.         PolySetVertex(vec12, 1);
  357.         PolySetVertex(vec4,  2);
  358.         PolyAppend(TRUE);
  359.  
  360.         PolySetVertex(vec12, 0);
  361.         PolySetVertex(vec2,  1);
  362.         PolySetVertex(vec23, 2);
  363.         PolyAppend(TRUE);
  364.  
  365.         PolySetVertex(vec12, 0);
  366.         PolySetVertex(vec23, 1);
  367.         PolySetVertex(vec4,  2);
  368.         PolyAppend(TRUE);
  369.  
  370.         PolySetVertex(vec23, 0);
  371.         PolySetVertex(vec3,  1);
  372.         PolySetVertex(vec4,  2);
  373.         PolySave();
  374.     } else if (type == 14) {
  375.         PolySetVertex(vec1,  0);
  376.         PolySetVertex(vec12, 1);
  377.         PolySetVertex(vec34, 2);
  378.         PolySetVertex(vec4,  3);
  379.         PolyAppend(TRUE);
  380.  
  381.         PolyVertexs(3);
  382.  
  383.         PolySetVertex(vec12, 0);
  384.         PolySetVertex(vec2,  1);
  385.         PolySetVertex(vec23, 2);
  386.         PolyAppend(TRUE);
  387.  
  388.         PolySetVertex(vec12, 0);
  389.         PolySetVertex(vec23,  1);
  390.         PolySetVertex(vec34, 2);
  391.         PolyAppend(TRUE);
  392.  
  393.         PolySetVertex(vec23, 0);
  394.         PolySetVertex(vec3,  1);
  395.         PolySetVertex(vec34, 2);
  396.         PolySave();
  397.     }
  398. }
  399.  
  400. function PuffPolygons()
  401. {
  402.     var    i, polys, vers;
  403.  
  404.     polys = SelectPolygons();
  405.     PolyLoadInit();
  406.     for (i = 0; i < polys; i++) {
  407.         vers = PolyLoad();
  408.         vers = PolyVertexs();
  409.         if (PolyType() ==  POLY_SHADE | PolyType() == POLY_UVSHADE) {
  410.             if (vers == 3) {
  411.                 Puff3();
  412.             } else if (vers == 4) {
  413.                 Puff4();
  414.             } else {
  415.                 Message("5角形以上の面があります。");
  416.             }
  417.         }
  418.     }
  419.     Update( CLEAR );
  420. }
  421.  
  422. MenuPosition(
  423.     Menu( " 編集(&E)",
  424.         "平行移動(&M)    M",    Move,SelectCheck,
  425.         "回転(&R)",            Rotate,SelectCheck,
  426.         "拡大縮小(&S)",        Scale,SelectCheck,
  427.         "-------------",    SEPARATE_MENU,
  428.         "削除(&D)    DEL",    Delete,SelectCheck,
  429.         "同一面削除(&U)",    DeleteSamePolygons,SelectCheck,
  430.         "-------------",    SEPARATE_MENU,
  431.         "複写(&C)",            Copy,SelectCheck,
  432.         "グリッド複写(&G)",    GridCopy,SelectCheck,
  433.         "ミラー複写(&M)",        Mirr,SelectCheck,
  434.         "-------------",    SEPARATE_MENU,
  435.         "面方向統一   ",    UnityPoly,SelectCheck,
  436.         "面方向反転   ",    InversePoly,SelectCheck,
  437.         "面二重化     ",    DuplicatePolygon,SelectCheck,
  438.         "-------------",    SEPARATE_MENU,
  439.         "面スムージング   ",    PuffPolygons,SelectCheck,
  440.         "面分割           B",    Separate,SelectCheck,
  441.         "面合成           J",    Joint,SelectCheck,
  442.         "面自動分割",        Calipoly,SelectCheck,
  443.         "面切断(&Z)",        Zante,SelectCheck
  444.     ), Menu_edit
  445. );
  446.  
  447.