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