diff --git a/modules/gfx/src/impl/entity_detail.cc b/modules/gfx/src/impl/entity_detail.cc index 40ba7351876fbf25ea823b383fdaca532fef41d6..94981a4fb282b90d2d817dcd98df32349ce7aa9c 100644 --- a/modules/gfx/src/impl/entity_detail.cc +++ b/modules/gfx/src/impl/entity_detail.cc @@ -304,6 +304,102 @@ SplineEntryList Spline::Generate(const SplineEntryList& entry_list, int nsub, ui SPLINE_ENTRY_INTERPOLATE(rad); LOG_DEBUG("SplineGenerate: assigning direction and normal components"); + +#if 0 + std::vector<Quat> quats(size+3); + + Vec3 prevn; + for(int c=0;c<size;++c) { + Vec3 d1,d2; + if(c==0) { + d1=Normalize(entry_list.at(c).position-entry_list.at(c+1).position); + d2=Normalize(entry_list.at(c+1).position-entry_list.at(c+2).position); + } else if(c==size-1) { + d1=Normalize(entry_list.at(c-2).position-entry_list.at(c-1).position); + d2=Normalize(entry_list.at(c-1).position-entry_list.at(c).position); + } else { + d1=Normalize(entry_list.at(c-1).position-entry_list.at(c).position); + d2=Normalize(entry_list.at(c).position-entry_list.at(c+1).position); + } + Vec3 d=d2; + Vec3 n=Normalize(Cross(d1,d2)); + //Vec3 n=entry_list.at(c).v1; + Vec3 o = Normalize(Cross(d,n)); + + if(c>0) { + if(Dot(Normalize(Cross(d,prevn)),Normalize(Cross(d,n)))<0.0) { + n=-n; + o=-o; + } + } + prevn=n; + + //n = Normalize(Cross(o,d)); + Quat q(Mat3(d[0],n[0],o[0], + d[1],n[1],o[1], + d[2],n[2],o[2])); + quats[c+1]=q; + } + quats.at(0)=quats.at(1); + quats.at(size)=quats.at(size-1); + quats.at(size+1)=quats.at(size-1); + + std::vector<Quat> squats(size*nsub); + // now for the quaternion interpolation, using squad + for(int c=0;c<size;++c) { + Quat q0=quats.at(c+0); + Quat q1=quats.at(c+1); + Quat q2=quats.at(c+2); + Quat q3=quats.at(c+3); + + Quat s1=q1*Exp(-0.25*Log(Inv(q1)*q2)+Log(Inv(q1)*q0)); + Quat s2=q2*Exp(-0.25*Log(Inv(q2)*q3)+Log(Inv(q2)*q1)); + + for(int d=0;d<nsub;++d) { + float u=static_cast<float>(d)*i_nsub; + squats.at(c*nsub+d) = Slerp(Slerp(q1,q2,u),Slerp(s1,s2,u),2.0*u*(1.0-u)); + } + } + + assert(sublist.size()<=squats.size()); + + for(unsigned int i=0;i<sublist.size();++i) { + Mat3 m=squats[i].ToRotationMatrix(); + sublist.at(i).direction=Normalize(Vec3(m(0,0),m(1,0),m(2,0))); + sublist.at(i).normal=Normalize(Vec3(m(0,1),m(1,1),m(2,1))); + sublist.at(i).v2=Normalize(Vec3(m(0,2),m(1,2),m(2,2))); + } + + std::vector<Vec3> nlist(sublist.size()); + for(uint i=0;i<sublist.size();++i) { + Vec3 p0,p1; + if(i<sublist.size()-1) { + p0 = sublist.at(i).position; + p1 = sublist.at(i+1).position; + } else { + p0 = sublist.at(i-1).position; + p1 = sublist.at(i).position; + } + sublist.at(i).direction=Normalize(p1-p0); + Vec3 orth = Normalize(Cross(sublist.at(i).direction,sublist.at(i).normal)); + nlist[i] = Normalize(Cross(orth,sublist.at(i).direction)); + sublist.at(i).v2=orth; + if(i>0) { + if(Dot(Normalize(Cross(sublist.at(i).direction,nlist[i-1])),orth)<0.0) { + nlist[i]=-nlist[i]; + sublist.at(i).v2=-sublist.at(i).v2; + } + } + } + + sublist.at(0).normal=nlist[0]; + sublist.back().normal=nlist.back(); + for(uint i=1;i<sublist.size()-1;++i) { + sublist.at(i).normal=Normalize((nlist[i-1]+nlist[i]+nlist[i+1])/3.0); + } + +#else + // assign direction and normal // entity trace has the same algorithm @@ -367,6 +463,8 @@ SplineEntryList Spline::Generate(const SplineEntryList& entry_list, int nsub, ui sublist.at(i).normal = sublist.at(i).v0; } +#endif + LOG_DEBUG("SplineGenerate: assigning non-interpolated entry components"); // finally the non-interpolated type // with some tweaks for proper strand rendering diff --git a/modules/gfx/src/impl/sline_renderer.cc b/modules/gfx/src/impl/sline_renderer.cc index 2b54046dd634acc1da4413aa9d69b7f4960889a9..4d26f46e268ee05f0656ab58d4c6210efd8a8116 100644 --- a/modules/gfx/src/impl/sline_renderer.cc +++ b/modules/gfx/src/impl/sline_renderer.cc @@ -83,7 +83,7 @@ void SlineRenderer::PrepareRendering(const BackboneTrace& trace_subset, VertexID p1 = va.Add(sit->position, geom::Vec3(),sit->color1); va.AddLine(p0,p1); p0=p1; -#if 0 +#if 1 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));