void Magic3D::Object::killChildren() { //std::vector<Object*>::const_iterator it_o = children.begin(); //while (it_o != children.end()) while (!children.empty()) { Object* child = *children.begin(); child->killChildren(); Scene::getInstance()->removeObject(child->getLayer(), child); ResourceManager::getObjects()->remove(child->name); } }
void LayerManager::setCurrentLayer( Layer* layer ) { Object* o = editor()->object(); for ( int i = 0; i < o->getLayerCount(); ++i ) { if ( layer == o->getLayer( i ) ) { setCurrentLayer( i ); return; } } }
int LayerManager::projectLength() { int maxFrame = -1; Object* pObject = editor()->object(); for ( int i = 0; i < pObject->getLayerCount(); i++ ) { int frame = pObject->getLayer( i )->getMaxKeyFramePosition(); if ( frame > maxFrame ) { maxFrame = frame; } } return maxFrame; }
int LayerManager::LastFrameAtFrame( int frameIndex ) { Object* pObj = editor()->object(); for ( int i = frameIndex; i >= 0; i -= 1 ) { for ( int layerIndex = 0; layerIndex < pObj->getLayerCount(); ++layerIndex ) { auto pLayer = pObj->getLayer( layerIndex ); if ( pLayer->keyExists( i ) ) { return i; } } } return -1; }
int LayerManager::firstKeyFrameIndex() { int minPosition = INT_MAX; Object* pObj = editor()->object(); for ( int i = 0; i < pObj->getLayerCount(); ++i ) { Layer* pLayer = pObj->getLayer( i ); int position = pLayer->firstKeyFramePosition(); if ( position < minPosition ) { minPosition = position; } } return minPosition; }
void TimeLineCells::drawContent() { if ( m_pCache == NULL ) { m_pCache = new QPixmap( size() ); if ( m_pCache->isNull() ) { // fail to create cache return; } } QPainter painter( m_pCache ); Object* object = mEditor->object(); Q_ASSERT_X( object != nullptr, "", "" ); Layer* layer = object->getLayer( mEditor->layers()->currentLayerIndex() ); if ( layer == NULL ) return; // grey background of the view painter.setPen( Qt::NoPen ); painter.setBrush( Qt::lightGray ); painter.drawRect( QRect( 0, 0, width(), height() ) ); // --- draw layers of the current object for ( int i = 0; i < object->getLayerCount(); i++ ) { if ( i != mEditor->layers()->currentLayerIndex() ) { Layer* layeri = object->getLayer( i ); if ( layeri != NULL ) { switch ( m_eType ) { case TIMELINE_CELL_TYPE::Tracks: layeri->paintTrack( painter, this, m_offsetX, getLayerY( i ), width() - m_offsetX, getLayerHeight(), false, frameSize ); break; case TIMELINE_CELL_TYPE::Layers: layeri->paintLabel( painter, this, 0, getLayerY( i ), width() - 1, getLayerHeight(), false, mEditor->allLayers() ); break; } } } } if ( abs( getMouseMoveY() ) > 5 ) { if ( m_eType == TIMELINE_CELL_TYPE::Tracks ) { layer->paintTrack( painter, this, m_offsetX, getLayerY( mEditor->layers()->currentLayerIndex() ) + getMouseMoveY(), width() - m_offsetX, getLayerHeight(), true, frameSize ); } if ( m_eType == TIMELINE_CELL_TYPE::Layers ) { layer->paintLabel( painter, this, 0, getLayerY( mEditor->layers()->currentLayerIndex() ) + getMouseMoveY(), width() - 1, getLayerHeight(), true, mEditor->allLayers() ); } painter.setPen( Qt::black ); painter.drawRect( 0, getLayerY( getLayerNumber( endY ) ) - 1, width(), 2 ); } else { if ( m_eType == TIMELINE_CELL_TYPE::Tracks ) { layer->paintTrack( painter, this, m_offsetX, getLayerY( mEditor->layers()->currentLayerIndex() ), width() - m_offsetX, getLayerHeight(), true, frameSize ); } if ( m_eType == TIMELINE_CELL_TYPE::Layers ) { layer->paintLabel( painter, this, 0, getLayerY( mEditor->layers()->currentLayerIndex() ), width() - 1, getLayerHeight(), true, mEditor->allLayers() ); } } // --- draw top painter.setPen( Qt::NoPen ); painter.setBrush( QColor( 220, 220, 220 ) ); painter.drawRect( QRect( 0, 0, width() - 1, m_offsetY - 1 ) ); painter.setPen( Qt::gray ); painter.drawLine( 0, 0, width() - 1, 0 ); painter.drawLine( 0, m_offsetY - 2, width() - 1, m_offsetY - 2 ); painter.setPen( Qt::lightGray ); painter.drawLine( 0, m_offsetY - 3, width() - 1, m_offsetY - 3 ); painter.drawLine( 0, 0, 0, m_offsetY - 3 ); if ( m_eType == TIMELINE_CELL_TYPE::Layers ) { // --- draw circle painter.setPen( Qt::black ); if ( mEditor->allLayers() == 0 ) { painter.setBrush( Qt::NoBrush ); } if ( mEditor->allLayers() == 1 ) { painter.setBrush( Qt::darkGray ); } if ( mEditor->allLayers() == 2 ) { painter.setBrush( Qt::black ); } painter.setRenderHint( QPainter::Antialiasing, true ); painter.drawEllipse( 6, 4, 9, 9 ); painter.setRenderHint( QPainter::Antialiasing, false ); } else if ( m_eType == TIMELINE_CELL_TYPE::Tracks ) { // --- draw ticks painter.setPen( QColor( 70, 70, 70, 255 ) ); painter.setBrush( Qt::darkGray ); painter.setFont( QFont( "helvetica", 10 ) ); int incr = 0; int fps = mEditor->playback()->fps(); for ( int i = frameOffset; i < frameOffset + ( width() - m_offsetX ) / frameSize; i++ ) { incr = ( i < 9 ) ? 4 : 0; if(i + 1 >= timeLine->getRangeLower() && i < timeLine->getRangeUpper()) { painter.setPen( Qt::NoPen ); painter.setBrush( Qt::yellow ); painter.drawRect( getFrameX( i ), 1, frameSize + 1, 2 ); painter.setPen( QColor( 70, 70, 70, 255 ) ); painter.setBrush( Qt::darkGray ); } if ( i%fps == 0 ) { painter.drawLine( getFrameX( i ), 1, getFrameX( i ), 5 ); } else if ( i%fps == fps / 2 ) { painter.drawLine( getFrameX( i ), 1, getFrameX( i ), 5 ); } else { painter.drawLine( getFrameX( i ), 1, getFrameX( i ), 3 ); } if ( i == 0 || i%fps == fps - 1 ) { painter.drawText( QPoint( getFrameX( i ) + incr, 15 ), QString::number( i + 1 ) ); } } // --- draw left border line painter.setPen( Qt::darkGray ); painter.drawLine( 0, 0, 0, height() ); } }
Magic3D::Object* Magic3D::Object::spawn(std::string name, std::string layerName, bool keepChildrenLayer) { void* result = NULL; Layer* layer = Scene::getInstance()->getLayer(layerName); if (!layer) { layer = Scene::getInstance()->getLayer(M3D_MAIN_LAYER_NAME); } result = getObject(name); if (!result && layer) { bool allchildren = true; std::vector<Object*>::const_iterator it_o = children.begin(); while (it_o != children.end()) { Object* child = *it_o++; std::string childName = child->getName(); size_t separator = childName.rfind('.'); childName = name + "." + (separator == childName.npos ? childName : childName.substr(separator + 1)); if (getObject(childName)) { allchildren = false; break; } } if (allchildren) { result = spawn(name); ResourceManager::getObjects()->add(static_cast<Object*>(result)); Scene::getInstance()->addObject(layer, static_cast<Object*>(result)); it_o = children.begin(); while (it_o != children.end()) { Object* child = *it_o++; std::string childName = child->getName(); size_t separator = childName.rfind('.'); childName = name + "." + (separator == childName.npos ? childName : childName.substr(separator + 1)); Object* spawned = child->spawn(childName, keepChildrenLayer && child->getLayer() ? child->getLayer()->getName() : layerName, keepChildrenLayer); if (spawned != child) { spawned->setParent(static_cast<Object*>(result)); if (child->getParentBone() && static_cast<Object*>(result)->getType() == eOBJECT_MODEL) { Bone* bone = static_cast<Model*>(result)->getSkeleton()->getBoneByName(child->getParentBone()->getName()); spawned->setParentBone(bone); } } } } else { result = this; } } if (result && getRigidBody()) { Physics::getInstance()->add(static_cast<Object*>(result)); } return static_cast<Object*>(result); }