Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "stdafx.h"
- void CVertexHandle::AddVertex( int g, int e, int f, int v )
- {
- for( int i = 0; i < ( int )m_iGroupsArray.size(); i++ )
- {
- int gi = m_iGroupsArray[i];
- int ei = m_iElementsArray[i];
- int fi = m_iFacesArray[i];
- int vi = m_iVertexesArray[i];
- if( gi == g && ei == e && fi == f && vi == v )
- return;
- }
- m_iGroupsArray.push_back( g );
- m_iElementsArray.push_back( e );
- m_iFacesArray.push_back( f );
- m_iVertexesArray.push_back( v );
- }
- void CVertexHandle::ReCalcHandle()
- {
- if( m_bEdgeHandle )
- {
- for( int i = 0; i < ( int )m_iGroupsArray.size(); i++ )
- {
- int g = m_iGroupsArray[i];
- int e = m_iElementsArray[i];
- int f = m_iFacesArray[i];
- int v = m_iVertexesArray[i];
- CMesh mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = brush->mesh;
- else if( triger )
- mesh = triger->mesh;
- Vector vec = mesh.faces[f].vertexes[v];
- if( i == 0 )
- {
- v1 = vec;
- v2 = vec;
- }
- else
- {
- if( ( vec - v1 ).Length() > EPS )
- v2 = vec;
- }
- origin = ( v1 + v2 ) / 2;
- }
- }
- else
- {
- int g = m_iGroupsArray[0];
- int e = m_iElementsArray[0];
- int f = m_iFacesArray[0];
- int v = m_iVertexesArray[0];
- CMesh mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = brush->mesh;
- else if( triger )
- mesh = triger->mesh;
- origin = v1 = v2 = mesh.faces[f].vertexes[v];
- }
- }
- void CVertexHandle::Draw( int viewportIndex )
- {
- glColor4f( 0.0f, 0.0f, 0.0f, 1.0f );
- if( viewportIndex )
- {
- glBegin( GL_QUADS );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( -4, 4, 0 ) )[0] );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( -4, -4, 0 ) )[0] );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( 4, -4, 0 ) )[0] );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( 4, 4, 0 ) )[0] );
- glEnd();
- }
- else
- {
- glPointSize( 8.0f );
- glBegin( GL_POINTS );
- glVertex3fv( &origin[0] );
- glEnd();
- }
- if( selected )
- glColor4f( 1.0f, 0.0f, 0.0f, 1.0f );
- else if( m_bEdgeHandle )
- glColor4f( 1.0f, 0.5f, 0.0f, 1.0f );
- else
- glColor4f( 1.0f, 1.0f, 1.0f, 1.0f );
- if( viewportIndex )
- {
- glBegin( GL_QUADS );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( -2.5f, 2.5f, 0 ) )[0] );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( -2.5f, -2.5f, 0 ) )[0] );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( 2.5f, -2.5f, 0 ) )[0] );
- glVertex3fv( &Vector( gViewports[ viewportIndex ]->WorldToScreen( origin ) + Vector( 2.5f, 2.5f, 0 ) )[0] );
- glEnd();
- }
- else
- {
- glPointSize( 5.0f );
- glBegin( GL_POINTS );
- glVertex3fv( &origin[0] );
- glEnd();
- }
- }
- void CVertexHandle::Shift( Vector shift )
- {
- for( int i = 0; i < ( int )m_iGroupsArray.size(); i++ )
- {
- int g = m_iGroupsArray[i];
- int e = m_iElementsArray[i];
- int f = m_iFacesArray[i];
- int v = m_iVertexesArray[i];
- handleVertex hv;
- hv.g = g;
- hv.e = e;
- hv.f = f;
- hv.v = v;
- hv.shift = shift;
- bool found = false;
- for( int j = 0; j < ( int )( ( CVertexTool * )gToolManager.m_pCurrentTool )->ShiftVerts.size(); j++ )
- {
- if( ( ( CVertexTool * )gToolManager.m_pCurrentTool )->ShiftVerts[j].g == hv.g &&
- ( ( CVertexTool * )gToolManager.m_pCurrentTool )->ShiftVerts[j].e == hv.e &&
- ( ( CVertexTool * )gToolManager.m_pCurrentTool )->ShiftVerts[j].f == hv.f &&
- ( ( CVertexTool * )gToolManager.m_pCurrentTool )->ShiftVerts[j].v == hv.v )
- {
- found = true;
- break;
- }
- }
- if( !found )
- ( ( CVertexTool * )gToolManager.m_pCurrentTool )->ShiftVerts.push_back( hv );
- }
- }
- bool CVertexHandle::IsHaveVertex( int g, int e, int f, int v )
- {
- for( int i = 0; i < ( int )m_iGroupsArray.size(); i++ )
- {
- int gi = m_iGroupsArray[i];
- int ei = m_iElementsArray[i];
- int fi = m_iFacesArray[i];
- int vi = m_iVertexesArray[i];
- if( gi == g && ei == e && fi == f && vi == v )
- return true;
- }
- return false;
- }
- class CHotKeyVertexToolCtrlF : public CHotKeyAction
- {
- public:
- virtual void Action()
- {
- ( ( CVertexTool * )gToolManager.m_pCurrentTool )->CreateEdge();
- }
- };
- CVertexTool::CVertexTool()
- {
- state = VTS_NONE;
- }
- void CVertexTool::Activated()
- {
- state = VTS_NONE;
- BuildHandles();
- gActionTracker.StartTransaction();
- for( vector < CGroup * >::iterator i = gGroups.begin(); i != gGroups.end(); i++ )
- {
- if( ( *i )->IsSelected() )
- {
- gActionTracker.RegisterStartChanges( *i );
- ( *i )->DrawBackFaces( true );
- }
- }
- ShiftVerts.clear();
- CtrlF = gHotKeysManager.RegisterHotKey( "Ctrl+F", new CHotKeyVertexToolCtrlF() );
- }
- void CVertexTool::Deactivated()
- {
- for( vector < CGroup * >::reverse_iterator i = gGroups.rbegin(); i != gGroups.rend(); i++ )
- {
- if( ( *i )->IsSelected() )
- {
- int color = RandomLong( 0, 9 );
- ( *i )->SetColor( wireframeColors[ color ][ 0 ], wireframeColors[ color ][ 1 ], wireframeColors[ color ][ 2 ] );
- ( *i )->DrawBackFaces( false );
- gActionTracker.RegisterEndChanges( *i );
- }
- }
- gActionTracker.EndTransaction();
- UnSelectAll();
- handles.clear();
- gHotKeysManager.UnRegisterHotKey( CtrlF );
- }
- bool CVertexTool::OnMouseDown( int key )
- {
- if( g_iActiveViewport == -1 )
- return false;
- int v = g_iActiveViewport;
- m_iViewportIndex = g_iActiveViewport;
- int x = gViewports[ m_iViewportIndex ]->m_iAxisX;
- int y = gViewports[ m_iViewportIndex ]->m_iAxisY;
- int z = gViewports[ m_iViewportIndex ]->m_iAxisZ;
- if( key == VK_LBUTTON )
- {
- if( g_iActiveViewport == 0 )
- {
- if( !gInput.IsKeyPressed( VK_CONTROL ) )
- UnSelectHandles();
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- if( DotProduct( gViewports[v]->camMatrix.GetForwardVector(), handles[i].origin - gViewports[v]->origin ) > 0.0f )
- continue;
- double ox;
- double oy;
- double oz;
- gluProject( handles[i].origin.x,
- handles[i].origin.y,
- handles[i].origin.z,
- gViewports[v]->modelview,
- gViewports[v]->projection,
- gViewports[v]->viewport,
- &ox, &oy, &oz );
- Vector point1( ( float )ox, ( float )oy, 0 );
- Vector point2( ( float )gViewports[v]->m_iMousePosX, ( float )gViewports[v]->m_iMousePosY, 0.0f );
- if( ( point1 - point2 ).Length() < 3 )
- handles[i].selected = !handles[i].selected;
- }
- }
- else
- {
- bool s = false;
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- Vector point1 = gViewports[v]->WorldToScreen( handles[i].origin );
- Vector point2( ( float )( gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX ),
- ( float )( gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY ), 0.0f );
- if( ( point1 - point2 ).Length() < 3 && handles[i].selected )
- s = true;
- }
- if( !s )
- {
- if( !gInput.IsKeyPressed( VK_CONTROL ) )
- UnSelectHandles();
- vector < handleVertex > tShiftVerts = ShiftVerts;
- ShiftVerts.clear();
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- Vector point1 = gViewports[v]->WorldToScreen( handles[i].origin );
- Vector point2( ( float )( gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX ),
- ( float )( gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY ), 0.0f );
- if( ( point1 - point2 ).Length() < 3 )
- {
- handles[i].selected = !handles[i].selected;
- state = VTS_DRAGED;
- draged = false;
- m_vStartPos = m_vLastPos =
- gViewports[v]->ScreenToWorld( Vector( ( float )gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX,
- ( float )gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY, 0.0f ) );
- m_vStartPos[z] = 0;
- m_vLastPos[z] = 0;
- m_vLastPos = gViewports[v]->SnapToGrid( m_vLastPos );
- m_vStartPos = gViewports[v]->SnapToGrid( m_vStartPos );
- Vector shift = m_vStartPos - handles[i].origin;
- shift[z] = 0;
- handles[i].Shift( shift );
- }
- }
- ShiftAll();
- ShiftVerts = tShiftVerts;
- for( int i = 0; i < ( int )handles.size(); i++ )
- handles[i].ReCalcHandle();
- }
- else
- {
- vector < handleVertex > tShiftVerts = ShiftVerts;
- ShiftVerts.clear();
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- Vector point1 = gViewports[v]->WorldToScreen( handles[i].origin );
- Vector point2( ( float )( gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX ),
- ( float )( gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY ), 0.0f );
- if( ( point1 - point2 ).Length() < 3 )
- {
- state = VTS_DRAGED;
- draged = false;
- m_vStartPos = m_vLastPos =
- gViewports[v]->ScreenToWorld( Vector( ( float )gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX,
- ( float )gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY, 0.0f ) );
- m_vStartPos[z] = 0;
- m_vLastPos[z] = 0;
- m_vLastPos = gViewports[v]->SnapToGrid( m_vLastPos );
- m_vStartPos = gViewports[v]->SnapToGrid( m_vStartPos );
- Vector shift = m_vStartPos - handles[i].origin;
- shift[z] = 0;
- handles[i].Shift( shift );
- }
- }
- ShiftAll();
- ShiftVerts = tShiftVerts;
- for( int i = 0; i < ( int )handles.size(); i++ )
- handles[i].ReCalcHandle();
- }
- }
- }
- else
- {
- return false;
- }
- return false;
- }
- bool CVertexTool::OnMouseUp( int key )
- {
- if( state != VTS_DRAGED )
- return false;
- if( key == VK_LBUTTON )
- {
- state = VTS_NONE;
- int v = m_iViewportIndex;
- Vector vCurrentPos;
- vCurrentPos = gViewports[v]->ScreenToWorld( Vector( ( float )gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX,
- ( float )gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY, 0.0f ) );
- vCurrentPos = gViewports[v]->SnapToGrid( vCurrentPos );
- if( !draged )
- {
- if( !gInput.IsKeyPressed( VK_CONTROL ) )
- UnSelectHandles();
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- Vector point1 = gViewports[v]->WorldToScreen( handles[i].origin );
- Vector point2( ( float )( gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX ),
- ( float )( gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY ), 0.0f );
- if( ( point1 - point2 ).Length() < 3 )
- handles[i].selected = true;
- }
- }
- if( NeedMerge() )
- {
- if( MessageBox::Show( L"Совместить вершины?", "", MessageBoxButtons::YesNo ) == ::DialogResult::Yes )
- {
- MergeVerts();
- BuildHandles();
- }
- }
- }
- else
- {
- return false;
- }
- return false;
- }
- bool CVertexTool::OnKeyDown( int key )
- {
- return false;
- }
- bool CVertexTool::OnKeyUp( int key )
- {
- return false;
- }
- void CVertexTool::Think()
- {
- if( state != VTS_DRAGED )
- return;
- int v = m_iViewportIndex;
- int x = gViewports[ m_iViewportIndex ]->m_iAxisX;
- int y = gViewports[ m_iViewportIndex ]->m_iAxisY;
- int z = gViewports[ m_iViewportIndex ]->m_iAxisZ;
- Vector vCurrentPos;
- vCurrentPos = gViewports[v]->ScreenToWorld( Vector( ( float )gViewports[v]->m_iMousePosX - gViewports[v]->m_iCenterX,
- ( float )gViewports[v]->m_iMousePosY - gViewports[v]->m_iCenterY, 0.0f ) );
- vCurrentPos[z] = 0;
- vCurrentPos = gViewports[v]->SnapToGrid( vCurrentPos );
- if( ( vCurrentPos - m_vLastPos ).Length() < EPS )
- /*return*/;
- else
- draged = true;
- ShiftVerts.clear();
- for( int i = 0; i < ( int )handles.size(); i++ )
- if( handles[i].selected )
- handles[i].Shift( vCurrentPos - m_vLastPos );
- m_vLastPos = vCurrentPos;
- ShiftAll();
- for( int i = 0; i < ( int )handles.size(); i++ )
- handles[i].ReCalcHandle();
- for( int i = 0; i < ( int )gGroups.size(); i++ )
- if( gGroups[ i ]->IsSelected() )
- gGroups[i]->ReCalcInfo();
- }
- void CVertexTool::Draw( int viewportIndex )
- {
- glDisable( GL_DEPTH_TEST );
- for( int i = 0; i < ( int )handles.size(); i++ )
- if( !handles[i].selected )
- handles[i].Draw( viewportIndex );
- for( int i = 0; i < ( int )handles.size(); i++ )
- if( handles[i].selected )
- handles[i].Draw( viewportIndex );
- glEnable( GL_DEPTH_TEST );
- }
- void CVertexTool::AddVertex( int g, int e, int f, int v )
- {
- Vector vec;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- vec = brush->mesh.faces[f].vertexes[v];
- else if( triger )
- vec = triger->mesh.faces[f].vertexes[v];
- else
- return;
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- if( handles[i].m_bEdgeHandle )
- {
- if( ( vec - handles[i].v1 ).Length() < EPS || ( vec - handles[i].v2 ).Length() < EPS )
- {
- handles[i].AddVertex( g, e, f, v );
- }
- }
- }
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- if( !handles[i].m_bEdgeHandle )
- {
- if( ( vec - handles[i].v1 ).Length() < EPS || ( vec - handles[i].v2 ).Length() < EPS )
- {
- handles[i].AddVertex( g, e, f, v );
- return;
- }
- }
- }
- CVertexHandle handle;
- handle.selected = false;
- handle.m_bEdgeHandle = false;
- handle.v1 = handle.v2 = handle.origin = vec;
- handle.AddVertex( g, e, f, v );
- handles.push_back( handle );
- }
- void CVertexTool::AddEdge( int g1, int e1, int f1, int v1, int g2, int e2, int f2, int v2 )
- {
- Vector vec1, vec2;
- CBrush *brush1 = dynamic_cast < CBrush * > ( gGroups[g1]->elements[e1] );
- CTriger *triger1 = dynamic_cast < CTriger * > ( gGroups[g1]->elements[e1] );
- CBrush *brush2 = dynamic_cast < CBrush * > ( gGroups[g2]->elements[e2] );
- CTriger *triger2 = dynamic_cast < CTriger * > ( gGroups[g2]->elements[e2] );
- if( brush1 )
- vec1 = brush1->mesh.faces[f1].vertexes[v1];
- else if( triger1 )
- vec1 = triger1->mesh.faces[f1].vertexes[v1];
- else
- return;
- if( brush2 )
- vec2 = brush2->mesh.faces[f2].vertexes[v2];
- else if( triger2 )
- vec2 = triger2->mesh.faces[f2].vertexes[v2];
- else
- return;
- Vector vec = ( vec1 + vec2 ) / 2;
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- if( handles[i].m_bEdgeHandle )
- {
- if( ( vec - handles[i].origin ).Length() < EPS )
- {
- handles[i].AddVertex( g1, e1, f1, v1 );
- handles[i].AddVertex( g2, e2, f2, v2 );
- return;
- }
- }
- }
- CVertexHandle handle;
- handle.selected = false;
- handle.m_bEdgeHandle = true;
- handle.v1 = vec1;
- handle.v2 = vec2;
- handle.origin = vec;
- handle.AddVertex( g1, e1, f1, v1 );
- handle.AddVertex( g2, e2, f2, v2 );
- handles.push_back( handle );
- }
- void CVertexTool::UnSelectHandles()
- {
- for( int i = 0; i < ( int )handles.size(); i++ )
- handles[i].selected = false;
- }
- void CVertexTool::BuildHandles()
- {
- handles.clear();
- for( int g = 0; g < ( int )gGroups.size(); g++ )
- {
- if( !gGroups[g]->IsSelected() )
- continue;
- for( int e = 0; e < ( int )gGroups[g]->elements.size(); e++ )
- {
- CMesh mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = brush->mesh;
- else if( triger )
- mesh = triger->mesh;
- else
- continue;
- for( int f = 0; f < mesh.numFaces; f++ )
- {
- for( int v = 0; v < mesh.faces[f].numVerts; v++ )
- {
- if( v == mesh.faces[f].numVerts - 1 )
- AddEdge( g, e, f, v, g, e, f, 0 );
- else
- AddEdge( g, e, f, v, g, e, f, v + 1 );
- }
- }
- }
- }
- for( int g = 0; g < ( int )gGroups.size(); g++ )
- {
- if( !gGroups[g]->IsSelected() )
- continue;
- for( int e = 0; e < ( int )gGroups[g]->elements.size(); e++ )
- {
- CMesh mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = brush->mesh;
- else if( triger )
- mesh = triger->mesh;
- else
- continue;
- for( int f = 0; f < mesh.numFaces; f++ )
- {
- for( int v = 0; v < mesh.faces[f].numVerts; v++ )
- {
- AddVertex( g, e, f, v );
- }
- }
- }
- }
- }
- void CVertexTool::MergeVerts()
- {
- for( int i = 0; i < ( int )gGroups.size(); i++ )
- {
- if( !gGroups[i]->IsSelected() )
- continue;
- for( int j = 0; j < ( int )gGroups[i]->elements.size(); j++ )
- {
- CMesh mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[i]->elements[j] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[i]->elements[j] );
- if( brush )
- {
- mesh = brush->mesh;
- mesh = MergeVertsInMesh( mesh );
- brush->mesh = mesh;
- }
- else if( triger )
- {
- mesh = triger->mesh;
- mesh = MergeVertsInMesh( mesh );
- triger->mesh = mesh;
- }
- }
- gGroups[i]->ReCalcInfo();
- gGroups[i]->Select();
- }
- }
- CMesh CVertexTool::MergeVertsInMesh( CMesh mesh )
- {
- CMesh res;
- vector < CFace > faces;
- for( int i = 0; i < mesh.numFaces; i++ )
- {
- CFace face = MergeVertsInFace( mesh.faces[i] );
- if( face.numVerts >= 3 )
- faces.push_back( face );
- }
- res.numFaces = ( int )faces.size();
- res.faces = new CFace[ ( int )faces.size() ];
- for( int i = 0; i < ( int )faces.size(); i++ )
- res.faces[i] = faces[i];
- return res;
- }
- CFace CVertexTool::MergeVertsInFace( CFace face )
- {
- CFace res;
- vector < Vector > verts;
- for( int i = 0; i < face.numVerts; i++ )
- {
- bool push = true;
- for( int j = 0; j < ( int )verts.size(); j++ )
- {
- if( ( verts[j] - face.vertexes[i] ).Length() < EPS )
- {
- push = false;
- break;
- }
- }
- if( push )
- verts.push_back( face.vertexes[i] );
- }
- res = face;
- Vector *vertexes = new Vector[ ( int )verts.size() ];
- for( int j = 0; j < ( int )verts.size(); j++ )
- vertexes[j] = verts[j];
- res.MakeFace( vertexes, ( int )verts.size() );
- return res;
- }
- bool CVertexTool::NeedMerge()
- {
- for( int i = 0; i < ( int )handles.size(); i++ )
- for( int j = i + 1; j < ( int )handles.size(); j++ )
- if( !handles[i].m_bEdgeHandle && !handles[j].m_bEdgeHandle &&
- ( handles[i].origin - handles[j].origin ).Length() < EPS )
- return true;
- return false;
- }
- void CVertexTool::ShiftAll()
- {
- for( vector < handleVertex >::iterator i = ShiftVerts.begin(); i != ShiftVerts.end(); i++ )
- {
- int g = ( *i ).g;
- int e = ( *i ).e;
- int f = ( *i ).f;
- int v = ( *i ).v;
- CMesh *mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = &brush->mesh;
- else
- mesh = &triger->mesh;
- mesh->faces[f].vertexes[v] += ( *i ).shift;
- }
- ShiftVerts.clear();
- }
- void CVertexTool::CreateEdge()
- {
- CVertexHandle hnd1, hnd2;
- int n = 0;
- for( int i = 0; i < ( int )handles.size(); i++ )
- {
- if( handles[i].selected )
- {
- n++;
- if( n == 1 )
- hnd1 = handles[i];
- else if( n == 2 )
- hnd2 = handles[i];
- else
- return;
- }
- }
- if( n != 2 )
- return;
- bool bFindCommon = false;
- Vector v1 = hnd1.origin, v2 = hnd2.origin;
- for( int i = 0; i < ( int )hnd1.m_iGroupsArray.size(); i++ )
- {
- for( int j = 0; j < ( int )hnd2.m_iGroupsArray.size(); j++ )
- {
- if( hnd1.m_iGroupsArray[i] == hnd2.m_iGroupsArray[j] &&
- hnd1.m_iElementsArray[i] == hnd2.m_iElementsArray[j] &&
- hnd1.m_iFacesArray[i] == hnd2.m_iFacesArray[j] )
- {
- int g, e, f;
- g = hnd1.m_iGroupsArray[i];
- e = hnd1.m_iElementsArray[i];
- f = hnd1.m_iFacesArray[i];
- CMesh *mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = &brush->mesh;
- else
- mesh = &triger->mesh;
- CFace face = mesh->faces[f];
- Vector vec = v1;
- bool bAdd = false;
- for( int i = 0; i < face.numVerts; i++ )
- {
- int a = i;
- int b = i + 1;
- if( b == face.numVerts )
- b = 0;
- if( fabs( ( vec - face.vertexes[a] ).Length() + ( face.vertexes[b] - vec ).Length() - ( face.vertexes[a] - face.vertexes[b] ).Length() ) < EPS )
- {
- bAdd = true;
- break;
- }
- }
- if( !bAdd )
- continue;
- vec = v2;
- bAdd = false;
- for( int i = 0; i < face.numVerts; i++ )
- {
- int a = i;
- int b = i + 1;
- if( b == face.numVerts )
- b = 0;
- if( fabs( ( vec - face.vertexes[a] ).Length() + ( face.vertexes[b] - vec ).Length() - ( face.vertexes[a] - face.vertexes[b] ).Length() ) < EPS )
- {
- bAdd = true;
- break;
- }
- }
- if( !bAdd )
- continue;
- bFindCommon = true;
- break;
- }
- }
- if( bFindCommon )
- break;
- }
- if( !bFindCommon )
- return;
- if( hnd1.m_bEdgeHandle )
- {
- for( int i = 0; i < ( int )hnd1.m_iGroupsArray.size(); i++ )
- {
- bool bAdd = true;
- for( int j = i + 1; j < ( int )hnd1.m_iGroupsArray.size(); j++ )
- {
- if( hnd1.m_iGroupsArray[i] == hnd1.m_iGroupsArray[j] &&
- hnd1.m_iElementsArray[i] == hnd1.m_iElementsArray[j] &&
- hnd1.m_iFacesArray[i] == hnd1.m_iFacesArray[j] )
- {
- bAdd = false;
- break;
- }
- }
- if( bAdd )
- AddVertexToFace( hnd1.m_iGroupsArray[i], hnd1.m_iElementsArray[i], hnd1.m_iFacesArray[i], v1 );
- }
- }
- if( hnd2.m_bEdgeHandle )
- {
- for( int i = 0; i < ( int )hnd2.m_iGroupsArray.size(); i++ )
- {
- bool bAdd = true;
- for( int j = i + 1; j < ( int )hnd2.m_iGroupsArray.size(); j++ )
- {
- if( hnd2.m_iGroupsArray[i] == hnd2.m_iGroupsArray[j] &&
- hnd2.m_iElementsArray[i] == hnd2.m_iElementsArray[j] &&
- hnd2.m_iFacesArray[i] == hnd2.m_iFacesArray[j] )
- {
- bAdd = false;
- break;
- }
- }
- if( bAdd )
- AddVertexToFace( hnd2.m_iGroupsArray[i], hnd2.m_iElementsArray[i], hnd2.m_iFacesArray[i], v2 );
- }
- }
- for( int i = 0; i < ( int )hnd1.m_iGroupsArray.size(); i++ )
- {
- bool bAdd = true;
- for( int j = i + 1; j < ( int )hnd1.m_iGroupsArray.size(); j++ )
- {
- if( hnd1.m_iGroupsArray[i] == hnd1.m_iGroupsArray[j] &&
- hnd1.m_iElementsArray[i] == hnd1.m_iElementsArray[j] &&
- hnd1.m_iFacesArray[i] == hnd1.m_iFacesArray[j] )
- {
- bAdd = false;
- break;
- }
- }
- if( bAdd )
- {
- bool bCanAdd = false;
- for( int j = 0; j < ( int )hnd2.m_iGroupsArray.size(); j++ )
- {
- if( hnd1.m_iGroupsArray[i] == hnd2.m_iGroupsArray[j] &&
- hnd1.m_iElementsArray[i] == hnd2.m_iElementsArray[j] &&
- hnd1.m_iFacesArray[i] == hnd2.m_iFacesArray[j] )
- {
- bCanAdd = true;
- break;
- }
- }
- if( bCanAdd )
- if( AddEdgeToFace( hnd1.m_iGroupsArray[i], hnd1.m_iElementsArray[i], hnd1.m_iFacesArray[i], v1, v2 ) )
- break;
- }
- }
- BuildHandles();
- }
- void CVertexTool::AddVertexToFace( int g, int e, int f, Vector vec )
- {
- CMesh *mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = &brush->mesh;
- else
- mesh = &triger->mesh;
- CFace face = mesh->faces[f];
- if( fabs( DotProduct( vec - face.vertexes[0], face.normal ) ) > EPS )
- return;
- bool bAdd = false;
- for( int i = 0; i < face.numVerts; i++ )
- {
- int a = i;
- int b = i + 1;
- if( b == face.numVerts )
- b = 0;
- if( fabs( ( vec - face.vertexes[a] ).Length() + ( face.vertexes[b] - vec ).Length() - ( face.vertexes[b] - face.vertexes[a] ).Length() ) < EPS )
- {
- bAdd = true;
- break;
- }
- }
- if( !bAdd )
- return;
- Vector *vertexes = new Vector[ face.numVerts + 1 ];
- memcpy( vertexes, face.vertexes, face.numVerts * sizeof( Vector ) );
- vertexes[ face.numVerts ] = vec;
- sort_by_polar_angle( vertexes, face.numVerts + 1, face.normal );
- mesh->faces[f].MakeFace( vertexes, face.numVerts + 1 );
- delete [] vertexes;
- }
- bool CVertexTool::AddEdgeToFace( int g, int e, int f, Vector vec1, Vector vec2 )
- {
- CMesh *mesh;
- CBrush *brush = dynamic_cast < CBrush * > ( gGroups[g]->elements[e] );
- CTriger *triger = dynamic_cast < CTriger * > ( gGroups[g]->elements[e] );
- if( brush )
- mesh = &brush->mesh;
- else
- mesh = &triger->mesh;
- CFace face = mesh->faces[f];
- bool find1 = false;
- bool find2 = false;
- for( int i = 0; i < face.numVerts; i++ )
- {
- if( ( face.vertexes[i] - vec1 ).Length() < EPS )
- find1 = true;
- if( ( face.vertexes[i] - vec2 ).Length() < EPS )
- find2 = true;
- }
- if( !find1 || !find2 )
- return false;
- Vector planeNormal = CrossProduct( vec2 - vec1, face.normal );
- planeNormal.Normalize();
- CPlane clipPlane( planeNormal, vec1 );
- CFace *frontFace;
- CFace *backFace;
- cliper::ClipFace( clipPlane, face, &frontFace, &backFace );
- if( !frontFace || !backFace )
- return true;
- CFace f1 = CFace( *frontFace );
- CFace f2 = CFace( *backFace );
- delete frontFace;
- delete backFace;
- CFace *faces = new CFace[ mesh->numFaces + 1 ];
- for( int i = 0; i < mesh->numFaces; i++ )
- faces[i] = mesh->faces[i];
- faces[ f ] = f1;
- faces[ mesh->numFaces ] = f2;
- delete [] mesh->faces;
- mesh->numFaces++;
- mesh->faces = new CFace[ mesh->numFaces ];
- for( int i = 0; i < mesh->numFaces; i++ )
- mesh->faces[i] = faces[i];
- delete [] faces;
- return true;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement