diff --git a/modules/gfx/src/impl/cartoon_renderer.cc b/modules/gfx/src/impl/cartoon_renderer.cc index b1ec4dad4f0f0cbe5092a16a9f3e654c348b14fb..b9607fc84c98231e8546373afbec385f128a0a60 100644 --- a/modules/gfx/src/impl/cartoon_renderer.cc +++ b/modules/gfx/src/impl/cartoon_renderer.cc @@ -79,13 +79,13 @@ void CartoonRenderer::PrepareRendering(const BackboneTrace& subset, int type=0; const NodeEntry& entry=nl[i]; if(!force_tube_) { - mol::ResidueHandle resh = entry.atom.GetResidue(); - mol::SecStructure sst=resh.GetSecStructure(); - if(sst.IsHelical()) { - type=1; - } else if(sst.IsExtended()) { - type=2; - } + mol::ResidueHandle resh = entry.atom.GetResidue(); + mol::SecStructure sst=resh.GetSecStructure(); + if(sst.IsHelical()) { + type=1; + } else if(sst.IsExtended()) { + type=2; + } } SplineEntry ee(entry.atom.GetPos(),entry.direction, entry.normal, entry.rad, @@ -137,7 +137,7 @@ void CartoonRenderer::PrepareRendering() 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); + id_set.insert(nit->id); } } // now find all matching spline segments @@ -147,28 +147,28 @@ void CartoonRenderer::PrepareRendering() 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++]); - // override with the selection color - nlist.back().color1=sel_color; - nlist.back().color2=sel_color; - } - } 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; - } + 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++]); + // override with the selection color + nlist.back().color1=sel_color; + nlist.back().color2=sel_color; + } + } 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(); + sel_spline_list_list_.push_back(nlist); + nlist.clear(); } } RebuildSplineObj(sel_va_, sel_spline_list_list_, true); @@ -287,17 +287,17 @@ void CartoonRenderer::FudgeSplineObj(SplineEntryListList& olistlist) nlistlist.push_back(nlist); 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(); - + + // 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]); @@ -329,42 +329,42 @@ void CartoonRenderer::FudgeSplineObj(SplineEntryListList& olistlist) for(;lc<olist.size() && olist.at(lc).type==2;++lc,++kend) { nlist.push_back(olist.at(lc)); } - if(kend-kstart<2) { - // dont bother with too short strands - for(unsigned int i=kstart;i<kend;++i) { - nlist.at(i).type=0; - } - } else { - kend-=1; - // these magic numbers are used in RebuildSplineObj for proper arrow rendering - nlist.at(kend-1).type=3; - nlist.at(kend).type=5; - - if(options_->GetStrandMode()==1) { - // smooth the strands for mode 1 - nlist.at(kstart).direction = geom::Normalize(nlist.at(kend).position-nlist.at(kstart).position); - nlist.at(kend).direction=nlist.at(kstart).direction; - float invf=1.0/static_cast<float>(kend-kstart); - for(unsigned int k=kstart;k<=kend;++k) { - float f = static_cast<float>(k-kstart)*invf; - nlist.at(k).position=nlist.at(kstart).position+f*(nlist.at(kend).position-nlist.at(kstart).position); - nlist.at(k).direction=nlist.at(kstart).direction; - geom::Vec3 tmpn=geom::Normalize(nlist.at(kstart).normal+f*(nlist.at(kend).normal-nlist.at(kstart).normal)); - geom::Vec3 tmpx=geom::Normalize(geom::Cross(nlist.at(kstart).direction,tmpn)); - nlist.at(k).normal=geom::Normalize(geom::Cross(tmpx,nlist.at(kstart).direction)); - } - } - - // break nodelist, re-start at arrow tip for both modes - if(lc+1<olist.size()) { - nlistlist.push_back(nlist); - nlist.clear(); - nlist.push_back(nlistlist.back().back()); - nlist.back().type=0; - nlist.back().color1=olist[lc+1].color1; - nlist.back().color2=olist[lc+1].color2; - } - } + if(kend-kstart<2) { + // dont bother with too short strands + for(unsigned int i=kstart;i<kend;++i) { + nlist.at(i).type=0; + } + } else { + kend-=1; + // these magic numbers are used in RebuildSplineObj for proper arrow rendering + nlist.at(kend-1).type=3; + nlist.at(kend).type=5; + + if(options_->GetStrandMode()==1) { + // smooth the strands for mode 1 + nlist.at(kstart).direction = geom::Normalize(nlist.at(kend).position-nlist.at(kstart).position); + nlist.at(kend).direction=nlist.at(kstart).direction; + float invf=1.0/static_cast<float>(kend-kstart); + for(unsigned int k=kstart;k<=kend;++k) { + float f = static_cast<float>(k-kstart)*invf; + nlist.at(k).position=nlist.at(kstart).position+f*(nlist.at(kend).position-nlist.at(kstart).position); + nlist.at(k).direction=nlist.at(kstart).direction; + geom::Vec3 tmpn=geom::Normalize(nlist.at(kstart).normal+f*(nlist.at(kend).normal-nlist.at(kstart).normal)); + geom::Vec3 tmpx=geom::Normalize(geom::Cross(nlist.at(kstart).direction,tmpn)); + nlist.at(k).normal=geom::Normalize(geom::Cross(tmpx,nlist.at(kstart).direction)); + } + + // and break nodelist, re-starting at arrow tip, just for mode 1 + if(lc+1<olist.size()) { + nlistlist.push_back(nlist); + nlist.clear(); + nlist.push_back(nlistlist.back().back()); + nlist.back().type=0; + nlist.back().color1=olist[lc+1].color1; + nlist.back().color2=olist[lc+1].color2; + } + } + } } if(lc<olist.size()) { nlist.push_back(olist.at(lc)); diff --git a/modules/gui/pymod/scene/hsc_widget.py b/modules/gui/pymod/scene/hsc_widget.py index 8a0464841f48d262cb074fed1594ff47be9a6d5b..894c90c682cd594253e273db3af8304a741488fb 100644 --- a/modules/gui/pymod/scene/hsc_widget.py +++ b/modules/gui/pymod/scene/hsc_widget.py @@ -132,7 +132,6 @@ class HSCWidget(RenderModeWidget): self.width_helix_slider_.setTickPosition(QtGui.QSlider.NoTicks) self.width_helix_slider_.setTickInterval(1) - #Helix Ratio ratio_helix_label = QtGui.QLabel("Thickness") @@ -146,7 +145,6 @@ class HSCWidget(RenderModeWidget): self.thickness_helix_slider_.setTickPosition(QtGui.QSlider.NoTicks) self.thickness_helix_slider_.setTickInterval(1) - #Helix ECC ecc_helix_label = QtGui.QLabel("ECC") @@ -165,6 +163,11 @@ class HSCWidget(RenderModeWidget): self.helix_profile_spinbox_ = QtGui.QSpinBox() self.helix_profile_spinbox_.setRange(min_profile, max_profile) + # Helix Rendering Mode + helix_mode_label = QtGui.QLabel("Helix Render Mode") + self.helix_mode_spinbox_ = QtGui.QSpinBox() + self.helix_mode_spinbox_.setRange(0, 1) + #Strand strand_label = QtGui.QLabel("Strand") font = strand_label.font() @@ -183,7 +186,6 @@ class HSCWidget(RenderModeWidget): self.width_strand_slider_.setTickPosition(QtGui.QSlider.NoTicks) self.width_strand_slider_.setTickInterval(1) - #Strand Ratio ratio_strand_label = QtGui.QLabel("Thickness") @@ -197,7 +199,6 @@ class HSCWidget(RenderModeWidget): self.thickness_strand_slider_.setTickPosition(QtGui.QSlider.NoTicks) self.thickness_strand_slider_.setTickInterval(1) - #Strand ECC ecc_strand_label = QtGui.QLabel("ECC") @@ -216,6 +217,12 @@ class HSCWidget(RenderModeWidget): self.strand_profile_spinbox_ = QtGui.QSpinBox() self.strand_profile_spinbox_.setRange(min_profile, max_profile) + # Strand Rendering Mode + strand_mode_label = QtGui.QLabel("Strand Render Mode") + self.strand_mode_spinbox_ = QtGui.QSpinBox() + self.strand_mode_spinbox_.setRange(0, 1) + + # row=1 grid = QtGui.QGridLayout() grid.addWidget(poly_mode_label,row,0,1,1) @@ -257,6 +264,9 @@ class HSCWidget(RenderModeWidget): grid.addWidget(helix_profile_label, row, 0, 1, 3) grid.addWidget(self.helix_profile_spinbox_, row, 4, 1, 1) row+=1 + grid.addWidget(helix_mode_label, row, 0, 1, 3) + grid.addWidget(self.helix_mode_spinbox_, row, 4, 1, 1) + row+=1 grid.addWidget(strand_label, row, 0, 1, 3) row+=1 grid.addWidget(radius_strand_label, row, 0, 1, 1) @@ -273,6 +283,9 @@ class HSCWidget(RenderModeWidget): row+=1 grid.addWidget(strand_profile_label, row, 0, 1, 3) grid.addWidget(self.strand_profile_spinbox_, row, 4, 1, 1) + row+=1 + grid.addWidget(strand_mode_label, row, 0, 1, 3) + grid.addWidget(self.strand_mode_spinbox_, row, 4, 1, 1) grid.setRowStretch(row+1,1) self.setLayout(grid) @@ -294,6 +307,7 @@ class HSCWidget(RenderModeWidget): QtCore.QObject.connect(self.ecc_helix_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateHelixEcc) QtCore.QObject.connect(self.ecc_helix_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderHelixEcc) QtCore.QObject.connect(self.helix_profile_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateHelixProfileType) + QtCore.QObject.connect(self.helix_mode_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateHelixMode) QtCore.QObject.connect(self.width_strand_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateStrandWidth) QtCore.QObject.connect(self.width_strand_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderStrandWidth) @@ -302,6 +316,7 @@ class HSCWidget(RenderModeWidget): QtCore.QObject.connect(self.ecc_strand_spinbox_, QtCore.SIGNAL("valueChanged(double)"), self.UpdateStrandEcc) QtCore.QObject.connect(self.ecc_strand_slider_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateSliderStrandEcc) QtCore.QObject.connect(self.strand_profile_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateStrandProfileType) + QtCore.QObject.connect(self.strand_mode_spinbox_, QtCore.SIGNAL("valueChanged(int)"), self.UpdateStrandMode) self.setMinimumSize(250,420) #14*30 ########/UI######## @@ -318,10 +333,12 @@ class HSCWidget(RenderModeWidget): self.UpdateHelixThicknessGui(options.GetHelixThickness()) self.UpdateHelixEccGui(options.GetHelixEcc()) self.helix_profile_spinbox_.setValue(options.GetHelixProfileType()) + self.helix_mode_spinbox_.setValue(options.GetHelixMode()) self.UpdateStrandWidthGui(options.GetStrandWidth()) self.UpdateStrandThicknessGui(options.GetStrandThickness()) self.UpdateStrandEccGui(options.GetStrandEcc()) self.strand_profile_spinbox_.setValue(options.GetStrandProfileType()) + self.strand_mode_spinbox_.setValue(options.GetStrandMode()) def UpdatePolyMode(self, value): self.GetOptions().SetPolyMode(value) @@ -378,6 +395,10 @@ class HSCWidget(RenderModeWidget): def UpdateHelixProfileType(self, value): self.GetOptions().SetHelixProfileType(value) self.ApplyOptions() + + def UpdateHelixMode(self, value): + self.GetOptions().SetHelixMode(value) + self.ApplyOptions() def UpdateSliderHelixEcc(self, value): self.GetOptions().SetHelixEcc(value/10.0) @@ -411,6 +432,10 @@ class HSCWidget(RenderModeWidget): self.GetOptions().SetStrandProfileType(value) self.ApplyOptions() + def UpdateStrandMode(self, value): + self.GetOptions().SetStrandMode(value) + self.ApplyOptions() + def UpdateTubeRadiusGui(self,value): if(abs(value*10.0 - self.width_tube_slider_.value())>=self.width_tube_spinbox_.singleStep()): self.width_tube_slider_.setValue(value*10.0)