From d5d9ae5acf132b23c6a5f0b2a5a613109fd2ac11 Mon Sep 17 00:00:00 2001 From: Ansgar Philippsen <ansgar.philippsen@gmail.com> Date: Sat, 16 Jul 2011 11:26:05 -0400 Subject: [PATCH] added option for gfx cartoon twist hack --- modules/gfx/pymod/export_render_options.cc | 2 + modules/gfx/src/impl/backbone_trace.cc | 20 +++++++--- modules/gfx/src/impl/backbone_trace.hh | 8 +++- modules/gfx/src/impl/cartoon_renderer.cc | 2 +- modules/gfx/src/impl/line_trace_renderer.cc | 2 +- modules/gfx/src/impl/sline_renderer.cc | 2 +- modules/gfx/src/impl/trace_renderer.cc | 2 +- modules/gfx/src/impl/trace_renderer_base.cc | 5 ++- modules/gfx/src/impl/trace_renderer_base.hh | 2 +- .../render_options/cartoon_render_options.cc | 12 +++++- .../render_options/cartoon_render_options.hh | 38 +++++++++++++++---- 11 files changed, 73 insertions(+), 22 deletions(-) diff --git a/modules/gfx/pymod/export_render_options.cc b/modules/gfx/pymod/export_render_options.cc index b1dbebcc3..2d5d21e23 100644 --- a/modules/gfx/pymod/export_render_options.cc +++ b/modules/gfx/pymod/export_render_options.cc @@ -186,6 +186,8 @@ void export_RenderOptions() .def("GetColorBlendMode", &CartoonRenderOptions::GetColorBlendMode) .add_property("color_blend_mode",&CartoonRenderOptions::GetColorBlendMode, &CartoonRenderOptions::SetColorBlendMode) + .add_property("twist_hack",&CartoonRenderOptions::GetTwistHack, + &CartoonRenderOptions::SetTwistHack) ; class_<TraceRenderOptions, boost::shared_ptr<TraceRenderOptions>, bases<RenderOptions>, boost::noncopyable>("TraceRenderOptions") diff --git a/modules/gfx/src/impl/backbone_trace.cc b/modules/gfx/src/impl/backbone_trace.cc index a872c44c3..01bbfb265 100644 --- a/modules/gfx/src/impl/backbone_trace.cc +++ b/modules/gfx/src/impl/backbone_trace.cc @@ -178,7 +178,7 @@ void BackboneTrace::AddNodeEntryList(const NodeEntryList& l) } } -void BackboneTrace::PrepList(NodeEntryList& nelist) +void BackboneTrace::PrepList(NodeEntryList& nelist) const { // orthogonalize the residue normals with // twist detection; important for later @@ -206,8 +206,10 @@ void BackboneTrace::PrepList(NodeEntryList& nelist) orth=geom::Normalize(geom::Cross(dir,e1->normal)); norm=geom::Normalize(geom::Cross(orth,dir)); // twist check - if(geom::Dot(geom::Cross(e0->normal,dir),geom::Cross(norm,dir))<0.0) { - norm=-norm; + if(twist_hack_) { + if(geom::Dot(geom::Cross(e0->normal,dir),geom::Cross(norm,dir))<0.0) { + norm=-norm; + } } e1->normal=norm; // skip over shift for the last iteration @@ -224,8 +226,10 @@ void BackboneTrace::PrepList(NodeEntryList& nelist) e2->direction=dir; orth=geom::Normalize(geom::Cross(dir,e2->normal)); norm=geom::Normalize(geom::Cross(orth,dir)); - if(geom::Dot(geom::Cross(e1->normal,dir),geom::Cross(norm,dir))<0.0) { - norm=-norm; + if(twist_hack_) { + if(geom::Dot(geom::Cross(e1->normal,dir),geom::Cross(norm,dir))<0.0) { + norm=-norm; + } } e2->normal=norm; } @@ -266,5 +270,11 @@ void BackboneTrace::SetSeqHack(bool f) Rebuild(); } +void BackboneTrace::SetTwistHack(bool f) +{ + twist_hack_=f; + // don't issue Rebuild() +} + }}} // ns diff --git a/modules/gfx/src/impl/backbone_trace.hh b/modules/gfx/src/impl/backbone_trace.hh index 2dfd97e4c..677f02f12 100644 --- a/modules/gfx/src/impl/backbone_trace.hh +++ b/modules/gfx/src/impl/backbone_trace.hh @@ -61,7 +61,7 @@ public: void AddNodeEntryList(const NodeEntryList& entries); // used internally - calculates some derived values for a nodelist - static void PrepList(NodeEntryList& nelist); + void PrepList(NodeEntryList& nelist) const; // re-creates internal nodelist-list based on view /* @@ -77,13 +77,19 @@ public: // this is faster then re-generating a trace BackboneTrace CreateSubset(const mol::EntityView& subview); + // experimental void SetSeqHack(bool f); bool GetSeqHack() const {return seq_hack_;} + + // experimental + void SetTwistHack(bool f); + bool GetTwistHack() const {return twist_hack_;} private: mol::EntityView view_; NodeEntryListList node_list_list_; bool seq_hack_; + bool twist_hack_; }; diff --git a/modules/gfx/src/impl/cartoon_renderer.cc b/modules/gfx/src/impl/cartoon_renderer.cc index e8076db65..9af2bdf80 100644 --- a/modules/gfx/src/impl/cartoon_renderer.cc +++ b/modules/gfx/src/impl/cartoon_renderer.cc @@ -74,7 +74,7 @@ geom::AlignedCuboid CartoonRenderer::GetBoundingBox() const void CartoonRenderer::PrepareRendering() { - TraceRendererBase::PrepareRendering(); + TraceRendererBase::PrepareRendering(options_->GetTwistHack()); if(state_>0) { va_.Clear(); this->prepare_rendering(trace_subset_, va_, spline_list_list_); diff --git a/modules/gfx/src/impl/line_trace_renderer.cc b/modules/gfx/src/impl/line_trace_renderer.cc index 56c362f68..8e650b987 100644 --- a/modules/gfx/src/impl/line_trace_renderer.cc +++ b/modules/gfx/src/impl/line_trace_renderer.cc @@ -60,7 +60,7 @@ LineTraceRenderer::LineTraceRenderer(BackboneTrace* trace): void LineTraceRenderer::PrepareRendering() { - TraceRendererBase::PrepareRendering(); + TraceRendererBase::PrepareRendering(false); va_.Clear(); this->PrepareRendering(trace_subset_, va_, false); sel_va_.Clear(); diff --git a/modules/gfx/src/impl/sline_renderer.cc b/modules/gfx/src/impl/sline_renderer.cc index 4ede7bc3c..eae42acad 100644 --- a/modules/gfx/src/impl/sline_renderer.cc +++ b/modules/gfx/src/impl/sline_renderer.cc @@ -53,7 +53,7 @@ RenderOptionsPtr SlineRenderer::GetOptions() void SlineRenderer::PrepareRendering() { - TraceRendererBase::PrepareRendering(); + TraceRendererBase::PrepareRendering(false); if(state_>0) { prepare_rendering(trace_subset_, va_, spline_list_list_); rebuild_spline_obj(va_, spline_list_list_, false); diff --git a/modules/gfx/src/impl/trace_renderer.cc b/modules/gfx/src/impl/trace_renderer.cc index 1395a3fdd..49ee1c7ab 100644 --- a/modules/gfx/src/impl/trace_renderer.cc +++ b/modules/gfx/src/impl/trace_renderer.cc @@ -37,7 +37,7 @@ TraceRenderer::TraceRenderer(BackboneTrace* trace): void TraceRenderer::PrepareRendering() { - TraceRendererBase::PrepareRendering(); + TraceRendererBase::PrepareRendering(false); va_.Clear(); this->PrepareRendering(trace_subset_, va_, false); sel_va_.Clear(); diff --git a/modules/gfx/src/impl/trace_renderer_base.cc b/modules/gfx/src/impl/trace_renderer_base.cc index ce014610e..443321cc5 100644 --- a/modules/gfx/src/impl/trace_renderer_base.cc +++ b/modules/gfx/src/impl/trace_renderer_base.cc @@ -78,8 +78,11 @@ TraceRendererBase::TraceRendererBase(BackboneTrace* trace, int n): { } -void TraceRendererBase::PrepareRendering() +void TraceRendererBase::PrepareRendering(bool twist_hack) { + trace_->SetTwistHack(twist_hack); + trace_subset_.SetTwistHack(twist_hack); + if(this->HasSelection()) sel_subset_.SetTwistHack(twist_hack); if (state_ & DIRTY_VA) { trace_->OnUpdatedPositions(); trace_subset_.OnUpdatedPositions(); diff --git a/modules/gfx/src/impl/trace_renderer_base.hh b/modules/gfx/src/impl/trace_renderer_base.hh index 7f07cd685..7cba4e752 100644 --- a/modules/gfx/src/impl/trace_renderer_base.hh +++ b/modules/gfx/src/impl/trace_renderer_base.hh @@ -43,7 +43,7 @@ public: virtual geom::AlignedCuboid GetBoundingBox() const; - virtual void PrepareRendering(); + virtual void PrepareRendering(bool twist_hack); virtual bool HasDataToRender() const; virtual void UpdateViews(); virtual void Apply(const gfx::ByElementColorOp& op); diff --git a/modules/gfx/src/render_options/cartoon_render_options.cc b/modules/gfx/src/render_options/cartoon_render_options.cc index 55cc659f4..4b20f63d7 100644 --- a/modules/gfx/src/render_options/cartoon_render_options.cc +++ b/modules/gfx/src/render_options/cartoon_render_options.cc @@ -1,4 +1,3 @@ - //------------------------------------------------------------------------------ // This file is part of the OpenStructure project <www.openstructure.org> // @@ -44,7 +43,8 @@ CartoonRenderOptions::CartoonRenderOptions(bool force_tube): strand_ecc_(0.3), strand_profile_(1), strand_mode_(0), - color_blend_mode_(0) + color_blend_mode_(0), + twist_hack_(true) {} RenderMode::Type CartoonRenderOptions::GetRenderMode(){ @@ -79,6 +79,8 @@ void CartoonRenderOptions::ApplyRenderOptions(RenderOptionsPtr render_options){ strand_ecc_=options->GetStrandEcc(); strand_profile_=options->GetStrandProfileType(); strand_mode_=options->GetStrandMode(); + color_blend_mode_=options->GetColorBlendMode(); + twist_hack_=options->GetTwistHack(); this->NotifyStateChange(); } @@ -289,5 +291,11 @@ float CartoonRenderOptions::GetMaxRad() const{ return max_rad; } +void CartoonRenderOptions::SetTwistHack(bool f) +{ + twist_hack_=f; + this->NotifyStateChange(); +} + }} // ns diff --git a/modules/gfx/src/render_options/cartoon_render_options.hh b/modules/gfx/src/render_options/cartoon_render_options.hh index b4bf7f90c..f279d0026 100644 --- a/modules/gfx/src/render_options/cartoon_render_options.hh +++ b/modules/gfx/src/render_options/cartoon_render_options.hh @@ -40,19 +40,23 @@ public: virtual bool CanApplyRenderOptions(RenderOptionsPtr render_options); virtual void ApplyRenderOptions(RenderOptionsPtr render_options); - // own interface - void SetSplineDetail(uint spline_detail); - uint GetSplineDetail() const; - + /// sets vertex array poly mode void SetPolyMode(uint poly_mode); uint GetPolyMode() const; + /// number of smooth points between spline control points + void SetSplineDetail(uint spline_detail); + uint GetSplineDetail() const; + + /// number of circular profile subdivisions per 90deg void SetArcDetail(uint arc_detail); uint GetArcDetail() const; + /// experimental void SetNormalSmoothFactor(float smooth_factor); float GetNormalSmoothFactor() const; + // tube/coil region void SetTubeRadius(float tube_radius); float GetTubeRadius() const; void SetTubeRatio(float tube_ratio); @@ -60,31 +64,47 @@ public: unsigned int GetTubeProfileType() const; void SetTubeProfileType(unsigned int); + // helix void SetHelixWidth(float helix_width); float GetHelixWidth() const; void SetHelixThickness(float helix_thickness); float GetHelixThickness() const; + /// see helix profile void SetHelixEcc(float helix_ecc); float GetHelixEcc() const; - unsigned int GetHelixProfileType() const; + /// various ways to calculate circular profile with ecc void SetHelixProfileType(unsigned int); + unsigned int GetHelixProfileType() const; + /// 0=normal 1=straight cylinders unsigned int GetHelixMode() const; void SetHelixMode(unsigned int); - + + // strand void SetStrandWidth(float strand_width); float GetStrandWidth() const; void SetStrandThickness(float strand_thickness); float GetStrandThickness() const; + /// see strand profile void SetStrandEcc(float strand_ecc); float GetStrandEcc() const; - unsigned int GetStrandProfileType() const; + /// various ways to calculate circular profile with ecc void SetStrandProfileType(unsigned int); - unsigned int GetStrandMode() const; + unsigned int GetStrandProfileType() const; + /// 0=normal, 1=straightened void SetStrandMode(unsigned int); + unsigned int GetStrandMode() const; + + // misc options + /// 0=smooth transition, 1=sharp transition void SetColorBlendMode(unsigned int); unsigned int GetColorBlendMode() const; + /// experimental + void SetTwistHack(bool); + bool GetTwistHack() const {return twist_hack_;} + + // used internally to calculate autoslab boundaries float GetMaxRad() const; private: @@ -110,6 +130,8 @@ private: unsigned int strand_mode_; unsigned int color_blend_mode_; + + bool twist_hack_; }; typedef boost::shared_ptr<CartoonRenderOptions> CartoonRenderOptionsPtr; -- GitLab