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

  1. //
  2. //    法線生成
  3. //
  4. function _Shade()
  5. {
  6.     PolyShade( NORMAL_CREATE );
  7.     UpdatePers( CLEAR );
  8.     UpdateObject();
  9. }
  10.  
  11. //
  12. //    スムースシェーディング
  13. //
  14. function SmoothShade()
  15. {
  16.     PolyShade( ON );
  17.     UpdatePers( CLEAR );
  18.     UpdateObject();
  19. }
  20.  
  21. //
  22. //    法線削除
  23. //
  24. function UnShade()
  25. {
  26.     PolyShade( OFF );
  27.     UpdatePers( CLEAR );
  28.     UpdateObject();
  29. }
  30.  
  31. function UnMap()
  32. {
  33.     PolyMap( FALSE );
  34.     UpdateObject();
  35. }
  36.  
  37. //
  38. //    簡易マッピング
  39. //
  40. function AutoMap()
  41. {
  42.     var    sel1, sel1s, i, j;
  43.     var    mae_vec, mat, move_vec, u_vec, v_vec;
  44.     var    pos[2], temp, len;
  45.  
  46.     DlogOpen( "簡易マッピング", 1 );
  47.     DlogString( 0, "係数", "1", 8 );
  48.     if( DlogWait())
  49.         len = atof(DlogAnswer(0));
  50.     else
  51.         return;
  52.     sel1 = Select();
  53.     sel1s = SelectPolygons();
  54.     for( i = 0; i< sel1s; i++ )
  55.     {
  56.         mae_vec = vector(0,0,0);
  57.         SelectNumber( sel1, i );
  58.         PolyLoad();
  59.         mae_vec = PolyVector();
  60.         u_vec = unit(Position( PolyGetVertex(1))-Position(PolyGetVertex(0)))*len;
  61.         v_vec = unit(u_vec*mae_vec)*len;
  62.         move_vec = Position( PolyGetVertex(0));
  63.         mat = move(UNIT_MATRIX,move_vec*(-1)) / Matrix( u_vec, v_vec, mae_vec, vector(0,0,0));
  64.         PolyMap( TRUE, mat );
  65.     }
  66.     UpdateObject();
  67. }
  68.  
  69. //
  70. //    点の法線にベクトルを加える
  71. //
  72. function AddVectoNormalVec()
  73. {
  74.     var    prev, pos[200];
  75.     var    i;
  76.  
  77.     i = 0;
  78.     cur = Cursor();
  79.     prev = cur - Vertex( 10, 10, 10 );
  80.     while( TRUE )
  81.     {
  82.         if( cur != PolyVertex( cur ))
  83.             Warning();
  84.         else
  85.         {
  86.             if( cur == prev )
  87.                 break;
  88.             else
  89.             {
  90.                 pos[i] = cur;
  91.                 i++;
  92.             }
  93.         }
  94.     }
  95. }
  96.  
  97. //
  98. //    位置ベクトルを法線ベクトルに(みたいなもんや)
  99. //    中心点(中心軸)を指定するとばらばらと法線をたててくれる
  100. //
  101. function CreateRadialNormalVec()
  102. {
  103.     var    axis[2], axis_pos[2];
  104.     var    key, vers, len, ty, u, v, uv[2];
  105.     var    axis_vec, mae_vec, yoko_vec;
  106.     var    temp, temp_mat, temp_pos, temp_vec;
  107.     var    rot_mat, move_mat;
  108.     var    z_mat, draw_edge;
  109.     var    box[2], b0[3], b1[3], rot_box[8], rot_box_pos[3];
  110.     var    i, j, k, theta;
  111.     var    line[5][2];
  112.     var    pick, draw_flag = ON;
  113.  
  114.     if( SelectPolygons() == 0 )
  115.     {
  116.         Warning();
  117.         if( MESSAGE == ON )
  118.             Message( error_msg3 );
  119.         return;
  120.     }
  121.  
  122.     PushMenu();
  123.     Status_org = Status_title;
  124.     MenuPosition( Menu( " 動作設定(&S)",
  125.             "生成中止    ESC",    MenuQuit
  126.         ), Menu_Title );
  127.     ClearStatus();
  128.     Status_title[0] = "【放射状ベクトル生成中】";
  129.     DrawStatus();
  130.  
  131.     quit_flag = FALSE;
  132.  
  133.     cur = Cursor();
  134.     axis[0] = cur;
  135.     fix_vertex = cur;
  136.     vers = 1;
  137.     pick = cur;
  138.     input_flag = OFF;
  139.     while( TRUE )
  140.     {
  141.         if( draw_flag == ON )
  142.             DrawLine( axis[0], cur );
  143.         key = WaitEvent();
  144.         if( key )
  145.             input_flag = ON;
  146.         key = KeyCode();
  147.         if( key == 0 )
  148.         {
  149.             if( (( ShiftStat() & 1 ) == 1))
  150.             {
  151.                 cur = Cursor();
  152.                 TrimCursor(fix_vertex, MouseWindow());
  153.                 Cursor( cur );
  154.             }
  155.             else
  156.                 cur = Cursor();
  157.         }
  158.         else
  159.             cur = Cursor();
  160.         if( input_flag | key == INPUT_KEY )
  161.         {
  162.             axis[1] = cur;
  163.             break;
  164.         }
  165.         else if( key == ESC | key == BS | quit_flag == TRUE )
  166.         {
  167.             PopandClear( OVERWRITE );
  168.             return;
  169.         }
  170.         else
  171.             temp = KeyProcess( key );
  172.         if( ((key!=0 ) & (key != INPUT_KEY)) | ( pick != Cursor()) )
  173.         {
  174.             draw_flag = ON;
  175.             DrawLine( axis[0], pick );
  176.         }
  177.         else
  178.             draw_flag = OFF;
  179.         pick = Cursor();
  180.         input_flag = OFF;
  181.     }
  182.  
  183.     axis_vec = unit( Position( axis[1]) - Position( axis[0] ));
  184.     axis_pos[0] = Position( axis[0] );
  185.     axis_pos[1] = Position( axis[1] );
  186.     PolyLoadInit();
  187.     while( PolyLoad())
  188.     {
  189.         vers = PolyVertexs();
  190.         for( i = 0; i< vers;i++ )
  191.         {
  192.             temp = PolyGetVertex( i );
  193.             temp_pos = Position( temp );
  194.             Mapping( temp, uv );
  195.             if( axis[0] == axis[1] )
  196.             {
  197.                 if( temp == axis[0] )
  198.                     temp_vec = unit(PolyVector())*VEC_LEN;
  199.                 else
  200.                     temp_vec = unit(temp_pos - axis_pos[0] )*VEC_LEN;
  201.             }
  202.             else
  203.             {
  204.                 if(abs(( axis_pos[0] - temp_pos)*axis_vec) < 0.00001 )
  205.                     temp_vec = PolyVector();
  206.                 else
  207.                     temp_vec = (temp_pos - axis_pos[0] );
  208.                 temp_vec = unit(axis_vec*(temp_vec*axis_vec))*VEC_LEN;
  209.             }
  210.             PolySetVertex( Vertex( temp_pos, temp_vec, uv[0], uv[1] ), i );
  211.         }
  212.         PolyType( PolyType() | POLY_SHADE );
  213.         PolySave();
  214.     }
  215.     UniformNormalVec();
  216.     Clear( OVERWRITE );
  217.     UpdateObject();
  218.     Update( CLEAR, WIN_PERS );
  219.     PopMenu();
  220.     Status_title = Status_org;
  221.     DrawStatus();
  222. }
  223.  
  224. //
  225. //    放射状法線生成
  226. //
  227. function RadialNormalVec()
  228. {
  229.     ClearStatus();
  230.     Status_title[0] = "【モード:放射状法線生成】";
  231.     DrawStatus();
  232.     InputEvent( CreateRadialNormalVec );
  233.     KeyEvent( CreateRadialNormalVec, INPUT_KEY );
  234. }
  235.  
  236. //
  237. //    平面マッピング
  238. //
  239. function MapPlane()
  240. {
  241.     ClearStatus();
  242.     Status_title[0] = "【モード:平面マッピング】";
  243.     DrawStatus();
  244.     InputEvent( _MapPlane );
  245.     KeyEvent( _MapPlane, INPUT_KEY );
  246. }
  247.  
  248. //
  249. //    円筒マッピング
  250. //
  251. function CylinderMap()
  252. {
  253.     ClearStatus();
  254.     Status_title[0] = "【モード:円筒マッピング】";
  255.     DrawStatus();
  256.     InputEvent( _CylinderMap );
  257.     KeyEvent( _CylinderMap, INPUT_KEY );
  258. }
  259.  
  260. MenuPosition(
  261.     Menu( " マップ・シェード(&U)",
  262.         "法線生成(&N)",            _Shade,SelectCheck,
  263.         "スムースシェーディング(&S)",        SmoothShade,SelectCheck,
  264.         "法線削除(&D)",            UnShade,SelectCheck,
  265.         "----------------",        SEPARATE_MENU,
  266.         "放射状法線生成(&R)",        RadialNormalVec,SelectCheck,
  267.         "選択境界の法線変更",        EditNormalVecforSelect,SelectCheck,
  268. //        "点の法線合成",            SumNormalVec,MENU_DISABLE,
  269. //        "点の法線分解",            SeparateNormalVec,MENU_DISABLE,
  270.         "----------------",        SEPARATE_MENU,
  271.         "簡易マッピング(&E)",        AutoMap,SelectCheck,
  272.         "平面マッピング(&P)",        MapPlane,SelectCheck,
  273.         "円筒マッピング(&C)",        CylinderMap,SelectCheck,
  274. //        "立方体マッピング",        SEPARATE_MENU,MENU_DISABLE,
  275.         "マッピング解除(&U)",        UnMap,SelectCheck
  276.     ), Menu_mapandshade
  277. );
  278.