Skip to content

Commit

Permalink
Allow adding and removing points from models with frame animations
Browse files Browse the repository at this point in the history
  • Loading branch information
zturtleman committed Sep 26, 2021
1 parent 3247cea commit fcf167a
Show file tree
Hide file tree
Showing 5 changed files with 137 additions and 17 deletions.
34 changes: 23 additions & 11 deletions src/libmm3d/model.cc
Original file line number Diff line number Diff line change
Expand Up @@ -705,11 +705,6 @@ int Model::addPoint( const char * name, double x, double y, double z,
{
return -1;
}
if ( m_frameAnims.size() > 0 && !m_forceAddOrDelete)
{
displayFrameAnimPrimitiveError();
return -1;
}

m_changeBits |= AddOther;

Expand Down Expand Up @@ -984,22 +979,39 @@ bool Model::deletePoint( unsigned point )
{
return false;
}
if ( m_frameAnims.size() > 0 && !m_forceAddOrDelete)
{
displayFrameAnimPrimitiveError();
return false;
}

if ( point >= m_points.size() )
{
return false;
}

Point * ptr = m_points[point];
vector<FrameAnimPoint *> *pointAnimFrames = new vector<FrameAnimPoint *>;

vector<FrameAnim *>::iterator ait;
for ( ait = m_frameAnims.begin(); ait != m_frameAnims.end(); ait++ )
{
FrameAnimDataList::iterator fit;
for ( fit = (*ait)->m_frameData.begin(); fit != (*ait)->m_frameData.end(); fit++ )
{
unsigned count;
FrameAnimPointList::iterator pit;
for ( count = 0, pit = (*fit)->m_framePoints->begin(); pit != (*fit)->m_framePoints->end(); pit++ )
{
if ( count == point )
{
pointAnimFrames->push_back( *pit );
break;
}
count++;
}
}
}

removePoint( point );

MU_DeletePoint * undo = new MU_DeletePoint();
undo->deletePoint( point, ptr );
undo->deletePoint( point, ptr, pointAnimFrames );
sendUndo( undo );

setupJoints();
Expand Down
2 changes: 1 addition & 1 deletion src/libmm3d/model.h
Original file line number Diff line number Diff line change
Expand Up @@ -1593,7 +1593,7 @@ class Model
void insertInfluence( const Position & pos, unsigned index, const InfluenceT & influence );
void removeInfluence( const Position & pos, unsigned index );

void insertPoint( unsigned index, Point * point );
void insertPoint( unsigned index, Point * point, vector<FrameAnimPoint *> * pointAnimFrames = NULL );
void removePoint( unsigned index );

void insertProjection( unsigned index, TextureProjection * proj );
Expand Down
98 changes: 97 additions & 1 deletion src/libmm3d/model_insert.cc
Original file line number Diff line number Diff line change
Expand Up @@ -544,7 +544,7 @@ void Model::removeInfluence( const Position & pos, unsigned index )
}
}

void Model::insertPoint( unsigned index, Model::Point * point )
void Model::insertPoint( unsigned index, Model::Point * point, vector<Model::FrameAnimPoint *> * pointAnimFrames )
{
if ( m_animationMode )
{
Expand All @@ -553,9 +553,46 @@ void Model::insertPoint( unsigned index, Model::Point * point )

m_changeBits |= AddOther;

vector<Model::FrameAnimPoint *>::iterator fap;
if ( pointAnimFrames )
{
fap = pointAnimFrames->begin();
}

if ( index == m_points.size() )
{
m_points.push_back( point );

vector<FrameAnim *>::iterator ait;
for ( ait = m_frameAnims.begin(); ait != m_frameAnims.end(); ait++ )
{
FrameAnimDataList::iterator fit;
for ( fit = (*ait)->m_frameData.begin(); fit != (*ait)->m_frameData.end(); fit++ )
{
FrameAnimPoint * add;

if ( pointAnimFrames )
{
add = *fap;
fap++;
if ( fap == pointAnimFrames->end() )
{
pointAnimFrames = NULL;
}
}
else
{
add = FrameAnimPoint::get();
for ( unsigned v = 0; v < 3; v++ )
{
add->m_trans[v] = point->m_trans[v];
add->m_rot[v] = point->m_rot[v];
}
}

(*fit)->m_framePoints->push_back( add );
}
}
}
else if ( index < m_points.size() )
{
Expand All @@ -570,6 +607,46 @@ void Model::insertPoint( unsigned index, Model::Point * point )
}
count++;
}

vector<FrameAnim *>::iterator ait;
for ( ait = m_frameAnims.begin(); ait != m_frameAnims.end(); ait++ )
{
FrameAnimDataList::iterator fit;
for ( fit = (*ait)->m_frameData.begin(); fit != (*ait)->m_frameData.end(); fit++ )
{
FrameAnimPointList::iterator pit;
for ( count = 0, pit = (*fit)->m_framePoints->begin(); pit != (*fit)->m_framePoints->end(); pit++ )
{
if ( count == index )
{
FrameAnimPoint * add;

if ( pointAnimFrames )
{
add = *fap;
fap++;
if ( fap == pointAnimFrames->end() )
{
pointAnimFrames = NULL;
}
}
else
{
add = FrameAnimPoint::get();
for ( unsigned v = 0; v < 3; v++ )
{
add->m_trans[v] = point->m_trans[v];
add->m_rot[v] = point->m_rot[v];
}
}

(*fit)->m_framePoints->insert( pit, add );
break;
}
count++;
}
}
}
}
else
{
Expand Down Expand Up @@ -601,6 +678,25 @@ void Model::removePoint( unsigned point )
}
count++;
}

vector<FrameAnim *>::iterator ait;
for ( ait = m_frameAnims.begin(); ait != m_frameAnims.end(); ait++ )
{
FrameAnimDataList::iterator fit;
for ( fit = (*ait)->m_frameData.begin(); fit != (*ait)->m_frameData.end(); fit++ )
{
FrameAnimPointList::iterator pit;
for ( count = 0, pit = (*fit)->m_framePoints->begin(); pit != (*fit)->m_framePoints->end(); pit++ )
{
if ( count == point )
{
(*fit)->m_framePoints->erase( pit );
break;
}
count++;
}
}
}
}
else
{
Expand Down
17 changes: 14 additions & 3 deletions src/libmm3d/modelundo.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4295,7 +4295,7 @@ MU_DeletePoint::~MU_DeletePoint()
void MU_DeletePoint::undo( Model * model )
{
log_debug( "undo delete point\n" );
model->insertPoint( m_pointNum, m_point );
model->insertPoint( m_pointNum, m_point, m_pointAnimFrames );
}

void MU_DeletePoint::redo( Model * model )
Expand All @@ -4312,17 +4312,28 @@ bool MU_DeletePoint::combine( Undo * u )
void MU_DeletePoint::undoRelease()
{
m_point->release();

if ( m_pointAnimFrames )
{
vector<Model::FrameAnimPoint *>::iterator it;
for ( it = m_pointAnimFrames->begin(); it != m_pointAnimFrames->end(); it++ )
{
(*it)->release();
}
delete m_pointAnimFrames;
}
}

unsigned MU_DeletePoint::size()
{
return sizeof(MU_DeletePoint) + sizeof(Model::Point);
return sizeof(MU_DeletePoint) + sizeof(Model::Point) + sizeof( vector<Model::FrameAnimPoint *> ) + ( m_pointAnimFrames ? m_pointAnimFrames->size() : 0 ) * sizeof( Model::FrameAnimPoint );
}

void MU_DeletePoint::deletePoint( unsigned pointNum, Model::Point * point )
void MU_DeletePoint::deletePoint( unsigned pointNum, Model::Point * point, vector<Model::FrameAnimPoint *> * pointAnimFrames )
{
m_pointNum = pointNum;
m_point = point;
m_pointAnimFrames = pointAnimFrames;
}

MU_DeleteProjection::MU_DeleteProjection()
Expand Down
3 changes: 2 additions & 1 deletion src/libmm3d/modelundo.h
Original file line number Diff line number Diff line change
Expand Up @@ -670,11 +670,12 @@ class MU_DeletePoint : public ModelUndo

unsigned size();

void deletePoint( unsigned pointNum, Model::Point * point );
void deletePoint( unsigned pointNum, Model::Point * point, vector<Model::FrameAnimPoint *> * pointAnimFrames );

private:
unsigned m_pointNum;
Model::Point * m_point;
vector<Model::FrameAnimPoint *> * m_pointAnimFrames;
};

class MU_DeleteProjection : public ModelUndo
Expand Down

0 comments on commit fcf167a

Please sign in to comment.