diff --git a/modules/base/src/profile.cc b/modules/base/src/profile.cc index e1dc2d246c32d463c7993f206ae5d1b9b5ea20f6..73b3540418e5716d14b69aebf23efd37f5d3b5c3 100644 --- a/modules/base/src/profile.cc +++ b/modules/base/src/profile.cc @@ -42,7 +42,7 @@ Profile::~Profile() { struct timeval end; gettimeofday(&end,NULL); - std::cout << msg_ << " finished in " <<delta_time(start_, end) + std::cerr << msg_ << " finished in " <<delta_time(start_, end) << "s" << std::endl; } diff --git a/modules/gfx/src/impl/cartoon_renderer.cc b/modules/gfx/src/impl/cartoon_renderer.cc index b52d496f0c32a1b3008098b0c14a599cab98e502..019dbd49b60a459a2411de5799f7ac93cae9e03d 100644 --- a/modules/gfx/src/impl/cartoon_renderer.cc +++ b/modules/gfx/src/impl/cartoon_renderer.cc @@ -31,6 +31,8 @@ #include <ost/gfx/entity.hh> #include <ost/gfx/impl/tabulated_trig.hh> +#include <ost/profile.hh> + namespace ost { namespace gfx { @@ -56,6 +58,7 @@ void CartoonRenderer::PrepareRendering(const BackboneTrace& subset, SplineEntryListList& spline_list_list, bool) { + Profile p0("CartoonRenderer::PrepareRendering(s,va,sll,f)"); if(options_==NULL) { LOG_DEBUG("CartoonRenderer: NULL options, not creating objects"); } @@ -121,6 +124,7 @@ void CartoonRenderer::PrepareRendering(const BackboneTrace& subset, void CartoonRenderer::PrepareRendering() { + Profile p0("CartoonRenderer::PrepareRendering()"); TraceRendererBase::PrepareRendering(); if(state_>0) { va_.Clear(); @@ -382,6 +386,7 @@ void CartoonRenderer::RebuildSplineObj(IndexedVertexArray& va, const SplineEntryListList& spline_list_list, bool is_sel) { + Profile p0("CartoonRenderer::RebuildSplineObj"); LOG_DEBUG("CartoonRenderer: starting profile assembly"); unsigned int detail = std::min(MAX_ARC_DETAIL, std::max(options_->GetArcDetail(), @@ -541,12 +546,14 @@ TraceProfile CartoonRenderer::TransformAndAddProfile(const std::vector<TraceProf namespace { - float spread(const geom::Vec3& v1, geom::Vec3& v2, geom::Vec3& v3, geom::Vec3& v4) + float spread(Real* v1, Real* v2, Real* v3, Real* v4) { - return geom::Dot(geom::Normalize(geom::Cross(geom::Normalize(v3-v1),geom::Normalize(v2-v1))), - geom::Normalize(geom::Cross(geom::Normalize(v3-v4),geom::Normalize(v2-v4)))); + geom::Vec3 a(v3[0]-v1[0],v3[1]-v1[1],v3[2]-v1[2]); + geom::Vec3 b(v2[0]-v1[0],v2[1]-v1[1],v2[2]-v1[2]); + geom::Vec3 c(v3[0]-v4[0],v3[1]-v4[1],v3[2]-v4[2]); + geom::Vec3 d(v2[0]-v4[0],v2[1]-v4[1],v2[2]-v4[2]); + return geom::Dot(geom::Normalize(geom::Cross(a,b)),geom::Normalize(geom::Cross(c,d))); } - } void CartoonRenderer::AssembleProfile(const TraceProfile& prof1, @@ -563,18 +570,19 @@ void CartoonRenderer::AssembleProfile(const TraceProfile& prof1, */ size_t size=prof1.size()-1; +#if 0 // first get the best correction offset float accum[]={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); + Real* v1=va.GetVertP(prof1[i1].id); + Real* v2=va.GetVertP(prof1[i2].id); for(int k=-2;k<=2;++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); + Real* v3=va.GetVertP(prof2[i3].id); + Real* v4=va.GetVertP(prof2[i4].id); accum[k+2]+=spread(v1,v2,v3,v4); } } @@ -588,6 +596,9 @@ void CartoonRenderer::AssembleProfile(const TraceProfile& prof1, } } best_off=(best_off+(size))%(size); +#else + int best_off=0; +#endif // now assemble the triangles for(unsigned int i1=0;i1<size;++i1) { diff --git a/modules/gfx/src/vertex_array.cc b/modules/gfx/src/vertex_array.cc index ce0f4b73139f380ecb3b9b5fdb097d1990e25409..d2acd821d175e8729f4c3de8fa079c5c4f38509c 100644 --- a/modules/gfx/src/vertex_array.cc +++ b/modules/gfx/src/vertex_array.cc @@ -30,17 +30,22 @@ #include "scene.hh" #include "vertex_array_helper.hh" #include "povray.hh" +#include <ost/profile.hh> #if OST_SHADER_SUPPORT_ENABLED #include "shader.hh" #endif +#ifdef NDEBUG +#define VERTEX_ARRAY_CHECK_GL_ERROR(m) +#else #define VERTEX_ARRAY_CHECK_GL_ERROR(m) \ if((glerr=glGetError())!=0) { \ LOG_ERROR("Error during va buffer prep: " << m << " : " << gluErrorString(glerr)); \ return false; \ } +#endif namespace ost { @@ -315,6 +320,12 @@ Vec3 IndexedVertexArray::GetVert(VertexID id) const return nrvo; } +Real* IndexedVertexArray::GetVertP(VertexID id) +{ + if(id>=entry_list_.size()) id=0; + return entry_list_[id].v; +} + void IndexedVertexArray::SetVert(VertexID id, const Vec3& v) { if(id>=entry_list_.size()) return; @@ -388,7 +399,7 @@ void IndexedVertexArray::SetOpacity(float o) void IndexedVertexArray::RenderGL() { static bool use_buff=false; - + if(!initialized_) { LOG_DEBUG("initializing vertex array lists"); #if OST_SHADER_SUPPORT_ENABLED @@ -1073,10 +1084,14 @@ bool IndexedVertexArray::prep_buff() { if(Scene::Instance().InOffscreenMode()) return false; #if OST_SHADER_SUPPORT_ENABLED - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_NORMAL_ARRAY); - glEnableClientState(GL_COLOR_ARRAY); - glEnableClientState(GL_INDEX_ARRAY); + static bool init=false; + if(!init) { + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glEnableClientState(GL_COLOR_ARRAY); + glEnableClientState(GL_INDEX_ARRAY); + init=true; + } int glerr=glGetError(); // clear error flag glBindBuffer(GL_ARRAY_BUFFER, buffer_id_[VA_VERTEX_BUFFER]); diff --git a/modules/gfx/src/vertex_array.hh b/modules/gfx/src/vertex_array.hh index 3883c2abe9e298be14c9f64a7d091d51b52e4bda..ed4cebb2aed96b652902b4ca49b680e82203ed94 100644 --- a/modules/gfx/src/vertex_array.hh +++ b/modules/gfx/src/vertex_array.hh @@ -140,6 +140,8 @@ class DLLEXPORT_OST_GFX IndexedVertexArray { geom::Vec3 GetVert(VertexID id) const; void SetVert(VertexID id, const geom::Vec3& vert); + Real* GetVertP(VertexID id); + geom::Vec3 GetNormal(VertexID id) const; void SetNormal(VertexID id, const geom::Vec3& norm);