home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
DOS/V Power Report 1997 March
/
VPR9703A.ISO
/
VPR_DATA
/
DOGA
/
SOURCES
/
POLYEDIT.LZH
/
MACRO
/
UVSHADEB.M
< prev
next >
Wrap
Text File
|
1996-07-31
|
4KB
|
214 lines
//
// 法線方向を面単位で揃える
//
function UniformNormalVec()
{
var i, vers;
var temp, temp_pos, temp_vec, uv[2];
PolyLoadInit();
while( PolyLoad())
{
vers = PolyVertexs();
if( PolyType() & POLY_SHADE )
{
for( i = 0; i< vers; i++ )
{
temp = PolyGetVertex( i );
temp_pos = Position( temp );
temp_vec = Vector( temp );
Mapping( temp, uv );
if( PolyVector().temp_vec < 0 )
{
temp = Vertex( temp_pos, temp_vec*(-1), uv[0], uv[1] );
PolySetVertex( temp, i );
}
}
PolySave();
}
}
}
//
// 選択範囲の境界面の法線方向を変更する
//
function EditNormalVecforSelect()
{
var type, msg[3], temp, temp2, temp3, points1, points2;
var points, temp_points, new_points, uv[2];
var prev_sel, sel1, sel2;
var i, j;
if( SelectPolygons() == 0 )
{
Warning();
if( MESSAGE == ON )
Message( error_msg3 );
return;
}
DlogOpen( "選択境界の法線変更",2 );
msg[0] = " 平均化 ";
msg[1] = " 選択面に同化 ";
msg[2] = "非選択面に同化";
DlogSelect( 1, "法線修正方法", msg, 0 );
if( DlogWait())
type = DlogAnswer( 1 );
else
{
Warning();
return;
}
prev_sel = Select();
sel1 = SelectAdjoint(Select())^prev_sel;
Select( sel1 );
points1 = VertexSelect();
Select( prev_sel );
SelectAll( TRUE, SELECT_XOR );
sel2 = SelectAdjoint(Select())&prev_sel;
Select( sel2 );
points2 = VertexSelect();
points = VertexPositionVertex( points1 ) & VertexPositionVertex( points2 );
new_points = VertexSet();
for( i = 0; i< Vertexs( points ); i++ )
{
temp = VertexGetVertex( points, i );
if( type == 0 )
{
temp_points = VertexSelectPosition( points1, temp );
temp_points = temp_points | VertexSelectPosition( points2, temp );
}
else if( type == 1 )
temp_points = VertexSelectPosition( points2, temp );
else
temp_points = VertexSelectPosition( points1, temp );
temp2 = vector( 0, 0, 0 );
for( j = 0; j < Vertexs( temp_points ); j++ )
{
temp3 = Vector( VertexGetVertex( temp_points, j ));
if( temp2.temp3 < 0 )
temp3 = -temp3;
temp2 += temp3;
}
temp2 = unit( temp2 )*VEC_LEN;
new_points = new_points | VertexSet(Vertex( Position( temp ), temp2 ));
}
if( type == 0 )
sel1 = sel1 | sel2;
else if( type == 1 )
sel1 = sel1;
else
sel1 = sel2;
SelectPolyType( POLY_SHADE, TRUE, SELECT_UPDATE );
SelectPolyType( POLY_UVSHADE, TRUE, SELECT_OR );
sel1 = sel1 & Select();
Select( sel1 );
PolyLoadInit();
while( PolyLoad())
{
for( i = 0; i< PolyVertexs(); i++ )
{
temp = PolyGetVertex( i );
Mapping( temp, uv );
temp = Position( temp );
temp = VertexGetVertex( points, temp );
if( temp >= 0 )
{
temp2 = VertexGetVertex( new_points, temp );
PolySetVertex (Vertex( Position( temp2 ), Vector( temp2 ), uv ), i );
}
}
PolySave();
}
Select( sel1 );
UniformNormalVec();
Select( prev_sel );
Update( CLEAR, WIN_PERS );
UpdateObject();
}
function SumNormalVec()
{
}
function SeparateNormalVec()
{
}
//
// 点の法線を編集する
//
function EditNormalVec()
{
var point_temp[2];
var v, cur_vec, cur_map[2];
var j, vers, key, temp;
var pick, draw_flag = ON, plane[3];
var prev;
var i;
var prev_sel, sel, temp_sel;
var flag;
prev = Cursor();
if( prev != PolyVertex( prev ))
{
Warning();
if( MESSAGE == ON )
Message( error_msg1 );
return;
}
prev_sel = Select();
SelectAll( TRUE );
SelectArea( TRUE, SELECT_AND | SELECT_SUB, prev, prev );
sel = Select();
Select( prev_sel );
flag = FALSE;
temp_sel = sel ^ sel;
for( i = 0; i< SelectPolygons( sel ); i++ )
{
PolyLoad( sel, i );
if(( PolyType() == POLY_SHADE )|( PolyType() == POLY_UVSHADE ))
flag = TRUE;
else
temp_sel = temp_sel | SelectCurrent();
}
sel = sel ^ temp_sel;
if( flag == FALSE )
{
Warning();
if( MESSAGE == ON )
{
Message( "法線の立っている面はありません" );
}
return;
}
PushMenu();
Status_org = Status_title;
MenuPosition( Menu( " 動作設定(&S)",
"移動中止 ESC", MenuQuit
), Menu_Title );
ClearStatus();
Status_title[0] = "【法線変更中】";
DrawStatus();
quit_flag = FALSE;
Select( prev_sel );
Update( CLEAR );
UpdateObject();
pers_rotation_flag = FALSE;
PopMenu();
Status_title = Status_org;
DrawStatus();
}