Skip to content
Snippets Groups Projects
Commit 1234fe55 authored by Ansgar Philippsen's avatar Ansgar Philippsen
Browse files

added prim_list pov export; fixed some debug leftovers and tabs

parent 1c80e067
No related branches found
No related tags found
No related merge requests found
......@@ -38,6 +38,8 @@ bool in_sequence(const mol::ResidueHandle& r1, const mol::ResidueHandle& r2)
if(n2.GetInsCode()!='\0') {
if(n1.NextInsertionCode()==n2) return true;
}
if(mol::InSequence(r1,r2)) return true;
// fallback, perhaps the wrong thing to do
if(n1.GetNum()+1==n2.GetNum()) return true;
return false;
}
......@@ -176,7 +178,7 @@ void BackboneTrace::PrepList(NodeEntryList& nelist)
e0->v1 = e0->normal;
//reference normal to avoid twisting
geom::Vec3 nref=geom::Normalize(geom::Cross(p0-p1,p2-p1));
//geom::Vec3 nref=geom::Normalize(geom::Cross(p0-p1,p2-p1));
// start loop with the second
unsigned int i=1;
......
......@@ -79,19 +79,19 @@ 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,
entry.color1,
entry.color2,
type, entry.id);
entry.normal, entry.rad,
entry.color1,
entry.color2,
type, entry.id);
ee.v1 = entry.v1;
spl.push_back(ee);
}
......@@ -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));
}
}
// 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(lc<olist.size()) {
nlist.push_back(olist.at(lc));
......@@ -385,40 +385,40 @@ void CartoonRenderer::RebuildSplineObj(IndexedVertexArray& va,
LOG_DEBUG("CartoonRenderer: starting profile assembly");
unsigned int detail = std::min(MAX_ARC_DETAIL,
std::max(options_->GetArcDetail(),
(unsigned int)1));
(unsigned int)1));
std::vector<TraceProfile> profiles;
float factor=is_sel ? 0.2 : 0.0;
profiles.push_back(GetCircProfile(detail,
options_->GetTubeRadius()*options_->GetTubeRatio()+factor,
options_->GetTubeRadius()+factor,
options_->GetTubeProfileType(),
1.0)); // profile 0 = tube
options_->GetTubeRadius()*options_->GetTubeRatio()+factor,
options_->GetTubeRadius()+factor,
options_->GetTubeProfileType(),
1.0)); // profile 0 = tube
if (!force_tube_) {
profiles.push_back(GetCircProfile(detail,
options_->GetHelixWidth()+factor,
options_->GetHelixThickness()+factor,
options_->GetHelixProfileType(),
options_->GetHelixEcc())); // profile 1 = helix
options_->GetHelixWidth()+factor,
options_->GetHelixThickness()+factor,
options_->GetHelixProfileType(),
options_->GetHelixEcc())); // profile 1 = helix
profiles.push_back(GetCircProfile(detail,
options_->GetStrandWidth()+factor,
options_->GetStrandThickness()+factor,
options_->GetStrandProfileType(),
options_->GetStrandEcc())); // profile 2 = strand
options_->GetStrandWidth()+factor,
options_->GetStrandThickness()+factor,
options_->GetStrandProfileType(),
options_->GetStrandEcc())); // profile 2 = strand
profiles.push_back(profiles.back()); // profile 3==2, strand
profiles.push_back(GetCircProfile(detail,
1.7*options_->GetStrandWidth()+factor,
1.1*options_->GetStrandThickness()+factor,
options_->GetStrandProfileType(),
options_->GetStrandEcc())); // profile 4 = arrow start
1.7*options_->GetStrandWidth()+factor,
1.1*options_->GetStrandThickness()+factor,
options_->GetStrandProfileType(),
options_->GetStrandEcc())); // profile 4 = arrow start
profiles.push_back(GetCircProfile(detail,
0.01*options_->GetStrandWidth()+factor,
1.1*options_->GetStrandThickness()+factor,
options_->GetStrandProfileType(),
options_->GetStrandEcc())); // profile 5 = arrow end
0.01*options_->GetStrandWidth()+factor,
1.1*options_->GetStrandThickness()+factor,
options_->GetStrandProfileType(),
options_->GetStrandEcc())); // profile 5 = arrow end
}
// iterate over all spline segments
#if !defined(NDEBUG)
......@@ -434,13 +434,13 @@ void CartoonRenderer::RebuildSplineObj(IndexedVertexArray& va,
SplineEntryList slist=*it;
if(slist.empty()) continue;
LOG_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);
options_->GetHelixWidth(),
slist[0].color1,slist[1].color1),
options_->GetArcDetail(),true);
continue;
}
......@@ -564,25 +564,25 @@ void CartoonRenderer::AssembleProfile(const TraceProfile& prof1,
size_t size=prof1.size()-1;
// first get the best correction offset
float accum[]={0.0,0.0,0.0,0.0,0.0};
float accum[]={0.0,0.0,0.0,0.0,0.0,0.0,0.0};
for(size_t i=0;i<size;++i) {
int i1=(i+0)%(size);
int i2=(i+1)%(size);
geom::Vec3 v1=va.GetVert(prof1[i1].id);
geom::Vec3 v2=va.GetVert(prof1[i2].id);
for(int k=-2;k<=2;++k) {
for(int k=-3;k<=3;++k) {
int i3=(i+k+0+size)%(size);
int i4=(i+k+1+size)%(size);
geom::Vec3 v3=va.GetVert(prof2[i3].id);
geom::Vec3 v4=va.GetVert(prof2[i4].id);
accum[k+2]+=spread(v1,v2,v3,v4);
accum[k+3]+=spread(v1,v2,v3,v4);
}
}
float best_spread=accum[0];
int best_off=-2;
for(int k=-1;k<=2;++k) {
if(accum[k+2]<best_spread) {
int best_off=-3;
for(int k=-2;k<=3;++k) {
if(accum[k+3]<best_spread) {
best_spread=accum[k+2];
best_off=k;
}
......
......@@ -81,14 +81,16 @@ void SlineRenderer::PrepareRendering(const BackboneTrace& trace_subset,
VertexID p0=va.Add(sit->position, geom::Vec3(),sit->color1);
for (++sit; sit!=sel.end(); ++sit) {
VertexID p1 = va.Add(sit->position, geom::Vec3(),sit->color1);
//va.AddLine(p0,p1);
va.AddLine(p0,p1);
p0=p1;
#if 0
VertexID p2 = va.Add(sit->position+sit->direction,geom::Vec3(),Color(0,1,0));
VertexID p3 = va.Add(sit->position+sit->normal,geom::Vec3(),Color(1,0,0));
VertexID p4 = va.Add(sit->position+sit->v2,geom::Vec3(),Color(1,0,1));
va.AddLine(p0,p2);
va.AddLine(p0,p3);
va.AddLine(p0,p4);
#endif
}
}
}
......
......@@ -61,55 +61,55 @@ void TraceRenderer::PrepareRendering(BackboneTrace& trace_subset,
if(is_sel) {
va.SetOpacity(GetSelectionColor().Alpha());
for (int node_list=0; node_list<trace_subset.GetListCount(); ++node_list) {
const NodeEntryList& nl=trace_subset.GetList(node_list);
for(unsigned int i=0;i<nl.size();++i) {
mol::AtomHandle ah=nl[i].atom;
if(sel_.FindAtom(ah).IsValid()) {
geom::Vec3 apos = ah.GetPos();
va.AddSphere(SpherePrim(apos,
options_->GetTubeRadius()+0.05,
sel_clr),
options_->GetArcDetail());
if(i>0) {
va.AddCylinder(CylinderPrim(apos+0.5*(nl[i-1].atom.GetPos()-apos),
apos,
options_->GetTubeRadius()+0.05,
sel_clr),
options_->GetArcDetail());
}
if(i<nl.size()-1) {
va.AddCylinder(CylinderPrim(apos,
apos+0.5*(nl[i+1].atom.GetPos()-apos),
options_->GetTubeRadius()+0.05,
sel_clr),
options_->GetArcDetail());
}
}
}
const NodeEntryList& nl=trace_subset.GetList(node_list);
for(unsigned int i=0;i<nl.size();++i) {
mol::AtomHandle ah=nl[i].atom;
if(sel_.FindAtom(ah).IsValid()) {
geom::Vec3 apos = ah.GetPos();
va.AddSphere(SpherePrim(apos,
options_->GetTubeRadius()+0.05,
sel_clr),
options_->GetArcDetail());
if(i>0) {
va.AddCylinder(CylinderPrim(apos+0.5*(nl[i-1].atom.GetPos()-apos),
apos,
options_->GetTubeRadius()+0.05,
sel_clr),
options_->GetArcDetail());
}
if(i<nl.size()-1) {
va.AddCylinder(CylinderPrim(apos,
apos+0.5*(nl[i+1].atom.GetPos()-apos),
options_->GetTubeRadius()+0.05,
sel_clr),
options_->GetArcDetail());
}
}
}
}
} else {
for (int node_list=0; node_list<trace_subset.GetListCount(); ++node_list) {
const NodeEntryList& nl=trace_subset.GetList(node_list);
mol::AtomHandle a1=nl[0].atom;
va.AddSphere(SpherePrim(a1.GetPos(),
options_->GetTubeRadius(),
nl[0].color1),
options_->GetArcDetail());
for(unsigned int i=1;i<nl.size();++i) {
mol::AtomHandle a2=nl[i].atom;
va.AddSphere(SpherePrim(a2.GetPos(),
options_->GetTubeRadius(),
nl[i].color1),
options_->GetArcDetail());
const geom::Vec3& p0=a1.GetPos();
const geom::Vec3& p2=a2.GetPos();
geom::Vec3 p1=(p0+p2)*0.5;
va.AddCylinder(CylinderPrim(p0,p1,options_->GetTubeRadius(),nl[i-1].color1),
options_->GetArcDetail());
va.AddCylinder(CylinderPrim(p1,p2,options_->GetTubeRadius(),nl[i].color1),
options_->GetArcDetail());
a1=a2;
}
const NodeEntryList& nl=trace_subset.GetList(node_list);
mol::AtomHandle a1=nl[0].atom;
va.AddSphere(SpherePrim(a1.GetPos(),
options_->GetTubeRadius(),
nl[0].color1),
options_->GetArcDetail());
for(unsigned int i=1;i<nl.size();++i) {
mol::AtomHandle a2=nl[i].atom;
va.AddSphere(SpherePrim(a2.GetPos(),
options_->GetTubeRadius(),
nl[i].color1),
options_->GetArcDetail());
const geom::Vec3& p0=a1.GetPos();
const geom::Vec3& p2=a2.GetPos();
geom::Vec3 p1=(p0+p2)*0.5;
va.AddCylinder(CylinderPrim(p0,p1,options_->GetTubeRadius(),nl[i-1].color1),
options_->GetArcDetail());
va.AddCylinder(CylinderPrim(p1,p2,options_->GetTubeRadius(),nl[i].color1),
options_->GetArcDetail());
a1=a2;
}
}
}
}
......
......@@ -23,6 +23,7 @@
#include "scene.hh"
#include "prim_list.hh"
#include "povray.hh"
namespace ost { namespace gfx {
......@@ -31,7 +32,6 @@ PrimList::PrimList(const String& name):
points_(),
lines_(),
radius_(0.5),
diameter_(0.5),
sphere_detail_(4),
arc_detail_(4)
{}
......@@ -136,7 +136,18 @@ void PrimList::CustomRenderGL(RenderPass pass)
void PrimList::CustomRenderPov(PovState& pov)
{
// TODO: add primlist pov export
if(points_.empty() && lines_.empty()) return;
pov.write_merge_or_union(GetName());
for(PointEntryList::const_iterator it=points_.begin();it!=points_.end();++it) {
pov.write_sphere(it->pos,radius_,it->color,GetName());
}
for(LineEntryList::const_iterator it=lines_.begin();it!=lines_.end();++it) {
pov.write_sphere(it->pos1,radius_,it->color,GetName());
pov.write_sphere(it->pos2,radius_,it->color,GetName());
pov.write_cyl(it->pos1,it->pos2,radius_,it->color,GetName(),true);
}
pov.inc() << " }\n";
}
void PrimList::AddPoint(geom::Vec3& p, const Color& col)
......@@ -155,7 +166,7 @@ void PrimList::AddLine(geom::Vec3& p1, geom::Vec3& p2, const Color& col)
void PrimList::SetDiameter(float d)
{
diameter_=d;
radius_=d*0.5;
Scene::Instance().RequestRedraw();
FlagRebuild();
}
......@@ -229,11 +240,11 @@ void PrimList::render_custom()
}
for(LineEntryList::const_iterator it=lines_.begin();it!=lines_.end();++it) {
va_.AddSphere(SpherePrim(it->pos1, diameter_/2.0, it->color),
va_.AddSphere(SpherePrim(it->pos1, radius_, it->color),
GetSphereDetail());
va_.AddSphere(SpherePrim(it->pos2, diameter_/2.0, it->color),
va_.AddSphere(SpherePrim(it->pos2, radius_, it->color),
GetSphereDetail());
va_.AddCylinder(CylinderPrim(it->pos1,it->pos2,diameter_/2.0,it->color),
va_.AddCylinder(CylinderPrim(it->pos1,it->pos2,radius_,it->color),
GetArcDetail());
}
}
......
......@@ -74,6 +74,7 @@ class DLLEXPORT_OST_GFX PrimList: public GfxObj
const mol::Transform& tf) const;
/// \brief get center
virtual geom::Vec3 GetCenter() const;
virtual void CustomRenderPov(PovState& pov);
virtual void CustomRenderGL(RenderPass pass);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment