void Composition::draw(ofCamera *camera, float alpha) { multimap<float,AVLayer*> work; for(vector<AVLayer*>::iterator layer = active_layers_.begin(); layer != active_layers_.end(); ++layer) { AVLayer *l = *layer; if(l->getOpacity() == 0) { continue; } if(l->is3D()) { ofVec3f dist = (*layer)->getNode().getWorldMatrix()->getTranslation(); if(camera) { dist = camera->worldToCamera(dist); dist.z = -dist.z; } work.insert(pair<float,AVLayer*>(dist.z, l)); } else { if(!work.empty()) { if(camera) { camera->begin(); } for(multimap<float,AVLayer*>::iterator w = work.begin(); w != work.end(); ++w) { (*w).second->draw(alpha); } work.clear(); if(camera) { camera->end(); } } l->draw(alpha); } } if(!work.empty()) { if(camera) { camera->begin(); } for(multimap<float,AVLayer*>::iterator w = work.begin(); w != work.end(); ++w) { (*w).second->draw(alpha); } work.clear(); if(camera) { camera->end(); } } }
void Loader::setupAVLayerJson(AVLayer& layer, const ofJson& json) { const ofJson& properties = json["property"]; layer.allocate(json.value("width", 1), json.value("height", 1)); layer.is_3d_ = json.value("is3d", false); layer.is_collapse_ = json.value("isCollapse", false); const string& blend_mode = json.value("blendingMode", "none"); if(blend_mode == "none") { layer.blend_mode_ = OF_BLENDMODE_ALPHA; } if(blend_mode == "add") { layer.blend_mode_ = OF_BLENDMODE_ADD; } if(blend_mode == "subtract") { layer.blend_mode_ = OF_BLENDMODE_SUBTRACT; } setupLayerJson(layer, json); auto masks = properties.find("mask"); if(masks != end(properties) && masks->is_array()) { int mask_count = masks->size(); for(int i = 0; i < mask_count; ++i) { setupMaskJson(*layer.addNewMask("mask"+ofToString(i,2,'0')), (*masks)[i], ofVec2f(layer.getWidth(),layer.getHeight())); } } }
void Composition::update() { bool use_time = is_time_updating_||ofGetTargetFrameRate()==0; int frame = frame_.update(use_time?ofGetLastFrameTime()*frame_rate_:frame_rate_/ofGetTargetFrameRate()); active_layers_.clear(); for(vector<AVLayer*>::iterator layer = av_.begin(); layer != av_.end(); ++layer) { AVLayer *l = *layer; l->setPropertyFrame(frame); if(l->isActive()) { l->update(); active_layers_.push_back(l); } } active_camera_ = NULL; for(vector<CameraLayer*>::iterator camera = camera_.begin(); camera != camera_.end(); ++camera) { CameraLayer *c = *camera; c->setPropertyFrame(frame); if(c->isActive()) { c->update(); if(!active_camera_) { active_camera_ = c; } } } if(active_camera_) { active_camera_->prepare(); } for(vector<MarkerWrapper>::iterator marker = marker_.begin(); marker != marker_.end(); ++marker) { MarkerWrapper &m = *marker; m.is_in_prev = m.is_in; int from = m.ptr->getFrom(); int to = from + m.ptr->getLength()-1; m.is_in = (m.ptr->getFrom() <= frame) && (frame <= from + m.ptr->getLength()-1); } }
void Composition::update() { CameraLayer *active_camera = NULL; for(vector<CameraLayer*>::iterator camera = camera_.begin(); camera != camera_.end(); ++camera) { if((*camera)->isActive()) { (*camera)->update(); if(!active_camera) { active_camera = *camera; } } } vector<AVLayer*> active; for(vector<AVLayer*>::iterator layer = av_.begin(); layer != av_.end(); ++layer) { AVLayer *l = *layer; if(l->isActive()) { l->update(); active.push_back(l); } } fbo_.begin(); ofClear(0); multimap<float,AVLayer*> work; for(vector<AVLayer*>::iterator layer = active.begin(); layer != active.end(); ++layer) { AVLayer *l = *layer; if(l->is3D()) { ofVec3f dist = (*layer)->getNode().getWorldMatrix()->getTranslation(); if(active_camera) { dist = active_camera->worldToCamera(dist); dist.z = -dist.z; } work.insert(pair<float,AVLayer*>(dist.z, l)); } else { if(!work.empty()) { if(active_camera) { active_camera->begin(); } for(multimap<float,AVLayer*>::iterator w = work.begin(); w != work.end(); ++w) { (*w).second->draw(); } work.clear(); if(active_camera) { active_camera->end(); } } l->draw(); } } if(!work.empty()) { if(active_camera) { active_camera->begin(); } for(multimap<float,AVLayer*>::iterator w = work.begin(); w != work.end(); ++w) { (*w).second->draw(); } work.clear(); if(active_camera) { active_camera->end(); } } fbo_.end(); }