diff --git a/modules/gfx/src/impl/backbone_trace.cc b/modules/gfx/src/impl/backbone_trace.cc index fb4b714cc363bc243f8a77d096d10765e18fcd93..85403263a9b157fc209634078f9be17e8af7f499 100644 --- a/modules/gfx/src/impl/backbone_trace.cc +++ b/modules/gfx/src/impl/backbone_trace.cc @@ -32,7 +32,8 @@ public: TraceBuilder(BackboneTrace* bb_trace): backbone_trace_(bb_trace), last_residue_(), - list_() + list_(), + id_counter_(0) {} virtual bool VisitChain(const mol::ChainHandle& chain) @@ -60,11 +61,11 @@ public: if (ca) { NodeEntry entry={ca, GfxObj::Ele2Color(ca.GetAtomProps().element), GfxObj::Ele2Color(ca.GetAtomProps().element), - geom::Vec3(0.0,0.0,0.0), // this will be set by the gfx trace obj + geom::Vec3(), // this will be set by the gfx trace obj res.GetCentralNormal(), 1.0, - geom::Vec3(),geom::Vec3(),geom::Vec3(), - false}; + geom::Vec3(),geom::Vec3(),geom::Vec3(), // for later use in NA rendering + false,id_counter_++}; list_.push_back(entry); } @@ -85,6 +86,7 @@ private: mol::ResidueHandle last_residue_; mol::ChainHandle last_chain_; NodeEntryList list_; + int id_counter_; }; BackboneTrace::BackboneTrace() diff --git a/modules/gfx/src/impl/cartoon_renderer.cc b/modules/gfx/src/impl/cartoon_renderer.cc index a16e52c8c9967515c10aa4c787d089f069ccb9d8..942bff0ab88f8bd60bfa9029e607ffcb8d129ef2 100644 --- a/modules/gfx/src/impl/cartoon_renderer.cc +++ b/modules/gfx/src/impl/cartoon_renderer.cc @@ -91,7 +91,8 @@ void CartoonRenderer::PrepareRendering(const BackboneTrace& subset, SplineEntry ee(entry.atom.GetPos(),entry.direction, entry.normal, entry.rad, is_sel ? sel_clr : entry.color1, - is_sel ? sel_clr : entry.color2, type); + is_sel ? sel_clr : entry.color2, + type, entry.id); ee.v1 = entry.v1; spl.push_back(ee); } @@ -102,25 +103,68 @@ void CartoonRenderer::PrepareRendering(const BackboneTrace& subset, } if(!force_tube_) { LOGN_DEBUG("CartoonRenderer: adjusting spline-entry-list lists for various modes"); - FudgeSplineObj(va,tmp_sll); + FudgeSplineObj(tmp_sll); } spline_list_list.clear(); unsigned int tmp_count=0; for(SplineEntryListList::const_iterator sit=tmp_sll.begin();sit!=tmp_sll.end();++sit) { - LOGN_DEBUG("CartoonRenderer: generating full spline for spline-entry-list " << tmp_count++); - spline_list_list.push_back(Spline::Generate(*sit,spline_detail)); + if(sit->size()==2 and sit->at(0).type==6) { + // don't intpol cylinders + spline_list_list.push_back(*sit); + } else { + LOGN_DEBUG("CartoonRenderer: generating full spline for spline-entry-list " << tmp_count++); + spline_list_list.push_back(Spline::Generate(*sit,spline_detail)); + } } - RebuildSplineObj(va, spline_list_list, is_sel); - //va.SmoothNormals(options_->GetNormalSmoothFactor()); } void CartoonRenderer::PrepareRendering() { TraceRendererBase::PrepareRendering(); - va_.Clear(); - this->PrepareRendering(trace_subset_, va_, spline_list_list_, false); - if (this->HasSelection()) { - this->PrepareRendering(sel_subset_, sel_va_, sel_spline_list_list_, true); + if(state_>0) { + this->PrepareRendering(trace_subset_, va_, spline_list_list_, false); + RebuildSplineObj(va_, spline_list_list_, false); + } + if (this->HasSelection() && (state_>0 || sel_state_>0)) { + // extract spline segments from list_list that match + // (via id) the selection subset + // first put all ids into a set for fast lookup + std::set<int> id_set; + for(int nlc=0;nlc<sel_subset_.GetListCount();++nlc) { + const NodeEntryList& nelist=sel_subset_.GetList(nlc); + for(NodeEntryList::const_iterator nit=nelist.begin();nit!=nelist.end();++nit) { + id_set.insert(nit->id); + } + } + // now find all matching spline segments + sel_spline_list_list_.clear(); + for(SplineEntryListList::const_iterator sit=spline_list_list_.begin();sit!=spline_list_list_.end();++sit) { + const SplineEntryList& slist=*sit; + SplineEntryList nlist; + unsigned int sc=0; + while(sc<slist.size()) { + int curr_id=slist.at(sc).id; + if(id_set.count(curr_id)>0) { + // if a match is found, add all until a new id is found + while(sc<slist.size() && slist.at(sc).id==curr_id) { + nlist.push_back(slist[sc++]); + } + } else { + // introduce break + if(!nlist.empty()) { + sel_spline_list_list_.push_back(nlist); + nlist.clear(); + } + // and advance to the next id + while(sc<slist.size() && slist.at(sc).id==curr_id) ++sc; + } + } + if(!nlist.empty()) { + sel_spline_list_list_.push_back(nlist); + nlist.clear(); + } + } + RebuildSplineObj(sel_va_, sel_spline_list_list_, true); sel_va_.SetColorMaterial(false); sel_va_.SetLighting(false); } @@ -183,7 +227,7 @@ namespace { } // ns -void CartoonRenderer::FudgeSplineObj(IndexedVertexArray& va, SplineEntryListList& olistlist) +void CartoonRenderer::FudgeSplineObj(SplineEntryListList& olistlist) { SplineEntryListList nlistlist; SplineEntryList nlist; @@ -234,6 +278,16 @@ void CartoonRenderer::FudgeSplineObj(IndexedVertexArray& va, SplineEntryListList nlist.clear(); } + // make a two entry list with the cyl type + nlist.push_back(SplineEntry(cyl.first,geom::Vec3(),geom::Vec3(),0.0, + olist[lstart].color1,olist[lstart].color1, + 6,olist[lstart].id)); + nlist.push_back(SplineEntry(cyl.second,geom::Vec3(),geom::Vec3(),0.0, + olist[lend].color1,olist[lend].color1, + 6,olist[lend].id)); + nlistlist.push_back(nlist); + nlist.clear(); + if(lend+1<olist.size()) { // and get going with an entry at the end of the cylinder SplineEntry tmp_start(olist[lend]); @@ -248,13 +302,6 @@ void CartoonRenderer::FudgeSplineObj(IndexedVertexArray& va, SplineEntryListList } nlist.push_back(tmp_start); } - - // and finally make the cylinder - va.AddCylinder(CylinderPrim(cyl.first,cyl.second, - options_->GetHelixWidth(), - olist[lstart].color1, - olist[lend].color1), - options_->GetArcDetail(),true); } } else { // helix mode 0 // just copy them over @@ -366,6 +413,16 @@ void CartoonRenderer::RebuildSplineObj(IndexedVertexArray& va, SplineEntryList slist=*it; if(slist.empty()) continue; LOGN_DEBUG("CartoonRenderer: assembling fragment " << tmp_count << " with " << slist.size() << " spline segments"); + + if(slist.size()==2 && slist[0].type==6) { + // make a cylinder + va.AddCylinder(CylinderPrim(slist[0].position,slist[1].position, + options_->GetHelixWidth(), + slist[0].color1,slist[1].color1), + options_->GetArcDetail(),true); + continue; + } + TraceProfile tprof1=TransformAndAddProfile(profiles,slist[0],va); CapProfile(tprof1,slist[0],true,va); TraceProfile tprof2; diff --git a/modules/gfx/src/impl/cartoon_renderer.hh b/modules/gfx/src/impl/cartoon_renderer.hh index d8a98f761a800deb13c8f36f893f9b8029e65deb..95a7b3844802e14c9f3fd087b4f67b3021c47ab4 100644 --- a/modules/gfx/src/impl/cartoon_renderer.hh +++ b/modules/gfx/src/impl/cartoon_renderer.hh @@ -54,7 +54,7 @@ private: void PrepareRendering(const BackboneTrace& subset, IndexedVertexArray& va, SplineEntryListList& spline_list_list, bool is_sel); - void FudgeSplineObj(IndexedVertexArray&, SplineEntryListList&); + void FudgeSplineObj(SplineEntryListList&); void RebuildSplineObj(IndexedVertexArray& va, const SplineEntryListList& spline_list_list, diff --git a/modules/gfx/src/impl/debug_renderer.cc b/modules/gfx/src/impl/debug_renderer.cc index c77dca5687203f39c4969ceb5625d641ec1fbef9..574dad2d35a27a1ba71a526d333508ae4f8c57d2 100644 --- a/modules/gfx/src/impl/debug_renderer.cc +++ b/modules/gfx/src/impl/debug_renderer.cc @@ -63,7 +63,7 @@ void DebugRenderer::PrepareRendering() } SplineEntry ee(it->atom.GetPos(),it->direction,it->normal, - it->rad,it->color1,it->color2,type); + it->rad,it->color1,it->color2,type,it->id); ee.v1 = it->v1; spl.push_back(ee); } diff --git a/modules/gfx/src/impl/entity_detail.cc b/modules/gfx/src/impl/entity_detail.cc index ec863e8484635c1c4cf1c2d609a23c8a8cc8c291..399c342c2895134eb6ea850252a817c24bc6f040 100644 --- a/modules/gfx/src/impl/entity_detail.cc +++ b/modules/gfx/src/impl/entity_detail.cc @@ -230,6 +230,7 @@ SplineEntryList Spline::Generate(const SplineEntryList& entry_list, int nsub) sublist.at(c*nsub+d).type1=type1; sublist.at(c*nsub+d).type2=type2; sublist.at(c*nsub+d).frac=float(d)/float(nsub); + sublist.at(c*nsub+d).id=entry_list[c].id; } } int type1=entry_list.back().type; diff --git a/modules/gfx/src/impl/entity_detail.hh b/modules/gfx/src/impl/entity_detail.hh index a077d2d54c61147c638be5de34e03a564b19f5e6..0b539993d35a859b64fd2a64ea448c1d07718ddc 100644 --- a/modules/gfx/src/impl/entity_detail.hh +++ b/modules/gfx/src/impl/entity_detail.hh @@ -90,6 +90,7 @@ struct DLLEXPORT_OST_GFX NodeEntry { float rad; geom::Vec3 v0,v1,v2; // helper vectors bool nflip; + int id; }; typedef std::vector<NodeEntry> NodeEntryList; @@ -122,7 +123,8 @@ struct DLLEXPORT_OST_GFX SplineEntry { v0(1.0,0.0,0.0), v1(0.0,1.0,0.0), v2(0.0,0.0,1.0), - nflip(false) + nflip(false), + id(-1) { } SplineEntry(const geom::Vec3& p, @@ -130,9 +132,9 @@ struct DLLEXPORT_OST_GFX SplineEntry { const geom::Vec3& n, float r, const Color& c1, const Color& c2, - unsigned int t): + unsigned int t, int i): position(p),direction(d),normal(n),color1(c1),color2(c2),rad(r),type(t), - type1(t),type2(t),frac(0.0),v0(),v1(),v2(),nflip(false) + type1(t),type2(t),frac(0.0),v0(),v1(),v2(),nflip(false),id(i) { } @@ -144,6 +146,7 @@ struct DLLEXPORT_OST_GFX SplineEntry { float frac; geom::Vec3 v0,v1,v2; // helper vectors bool nflip; + int id; }; typedef std::vector<SplineEntry> SplineEntryList; diff --git a/modules/gfx/src/impl/entity_renderer.hh b/modules/gfx/src/impl/entity_renderer.hh index 4d90f97e0a3542b50473956b378a923268af3121..b80bd9ecded901e321d76c27cd2e9b181ee955e1 100644 --- a/modules/gfx/src/impl/entity_renderer.hh +++ b/modules/gfx/src/impl/entity_renderer.hh @@ -56,11 +56,11 @@ namespace ost { namespace gfx { namespace impl { typedef enum { - DIRTY_VIEW =1, - DIRTY_VA =2, + DIRTY_VIEW = 0x1, + DIRTY_VA = 0x2 } DirtyFlag; -typedef char DirtyFlags; +typedef unsigned int DirtyFlags; /// \internal class DLLEXPORT_OST_GFX EntityRenderer { diff --git a/modules/gfx/src/impl/sline_renderer.cc b/modules/gfx/src/impl/sline_renderer.cc index 7ae7f937a99eaf5dd374486f9976ccf41b0938e6..62ef7ba45aa756d0ce5c4f45d4e4b22c0418b78a 100644 --- a/modules/gfx/src/impl/sline_renderer.cc +++ b/modules/gfx/src/impl/sline_renderer.cc @@ -71,7 +71,8 @@ void SlineRenderer::PrepareRendering(const BackboneTrace& trace_subset, SplineEntry ee(entry.atom.GetPos(), entry.direction, entry.normal, entry.rad, is_sel ? sel_clr : entry.color1, - is_sel ? sel_clr : entry.color2, 0); + is_sel ? sel_clr : entry.color2, + 0, entry.id); ee.v1 = entry.v1; spl.push_back(ee); }