X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fdebugscript.cpp;h=434743d054fc41d3358187e6edc826e337e44992;hp=59631aa79b7083ad8d2e31f0065cf05723c5f7b4;hb=HEAD;hpb=c786732a062b493be1e53c0223d7cb1858fd3d0f diff --git a/src/debugscript.cpp b/src/debugscript.cpp index 59631aa..434743d 100644 --- a/src/debugscript.cpp +++ b/src/debugscript.cpp @@ -1,4 +1,5 @@ #include "debugscript.h" +#include "profiler.h" #include @@ -7,6 +8,7 @@ using namespace std; void DebugScript::ParseAction(View * view, Screen * scr) { + *m_input >> std::ws; if (m_input == NULL || !m_input->good()) return; istream & inp = *m_input; @@ -171,6 +173,29 @@ void DebugScript::ParseAction(View * view, Screen * scr) currentAction.type = AT_ScreenShot; inp >> currentAction.textargs; } + else if (actionType == "printspf") + { + currentAction.type = AT_PrintSPF; + currentAction.iz = currentAction.loops; + m_spf_cpu_mean = 0; + m_spf_gpu_mean = 0; + m_spf_cpu_stddev = 0; + m_spf_gpu_stddev = 0; + } + else if (actionType == "printbounds") + { + currentAction.type = AT_PrintBounds; + } + else if (actionType == "profileon") + { + currentAction.type = AT_ProfileDisplay; + currentAction.iz = 1; + } + else if (actionType == "profileoff") + { + currentAction.type = AT_ProfileDisplay; + currentAction.iz = 0; + } else Fatal("Unknown action %s", actionType.c_str()); @@ -201,16 +226,16 @@ bool DebugScript::Execute(View *view, Screen *scr) case AT_WaitFrame: break; case AT_Translate: - view->Translate(currentAction.x, currentAction.y); + view->Translate(Double(currentAction.x), Double(currentAction.y)); break; case AT_TranslatePx: view->Translate(Real(currentAction.ix)/Real(scr->ViewportWidth()), Real(currentAction.iy)/Real(scr->ViewportHeight())); break; case AT_Zoom: - view->ScaleAroundPoint(currentAction.x, currentAction.y, currentAction.z); + view->ScaleAroundPoint(Double(currentAction.x), Double(currentAction.y), Double(currentAction.z)); break; case AT_ZoomPx: - view->ScaleAroundPoint(Real(currentAction.ix)/Real(scr->ViewportWidth()),Real(currentAction.iy)/Real(scr->ViewportHeight()), Real(expf(-currentAction.iz/20.f))); + view->ScaleAroundPoint(Real(currentAction.ix)/Real(scr->ViewportWidth()),Real(currentAction.iy)/Real(scr->ViewportHeight()), exp(Real(-currentAction.iz)/Real(20))); break; case AT_SetGPURendering: view->SetGPURendering(true); @@ -226,12 +251,21 @@ bool DebugScript::Execute(View *view, Screen *scr) break; case AT_LoadSVG: { +#ifndef QUADTREE_DISABLED + view->Doc().SetQuadtreeInsertNode(view->GetCurrentQuadtreeNode()); +#endif #ifdef TRANSFORM_OBJECTS_NOT_VIEW view->Doc().LoadSVG(currentAction.textargs, Rect(Real(1)/Real(2),Real(1)/Real(2),Real(1)/Real(800),Real(1)/Real(600))); #else const Rect & bounds = view->GetBounds(); view->Doc().LoadSVG(currentAction.textargs, Rect(bounds.x+bounds.w/Real(2),bounds.y+bounds.h/Real(2),bounds.w/Real(800),bounds.h/Real(600))); #endif +#ifndef QUADTREE_DISABLED + view->Doc().PropagateQuadChanges(view->GetCurrentQuadtreeNode()); + view->Doc().PropagateQuadChanges(view->Doc().GetQuadTree().GetNeighbour(view->GetCurrentQuadtreeNode(), 0, 1, 0)); + view->Doc().PropagateQuadChanges(view->Doc().GetQuadTree().GetNeighbour(view->GetCurrentQuadtreeNode(), 1, 0, 0)); + view->Doc().PropagateQuadChanges(view->Doc().GetQuadTree().GetNeighbour(view->GetCurrentQuadtreeNode(), 1, 1, 0)); +#endif currentAction.type = AT_WaitFrame; view->ForceRenderDirty(); view->ForceBufferDirty(); @@ -286,13 +320,13 @@ bool DebugScript::Execute(View *view, Screen *scr) VReal s = target.w/(view->GetBounds().w); - if (Real(s) != 1) + if (s != VReal(1)) { VReal x0; VReal y0; x0 = (view->GetBounds().x - target.x)/((s - VReal(1))*view->GetBounds().w); y0 = (view->GetBounds().y - target.y)/((s - VReal(1))*view->GetBounds().h); - view->ScaleAroundPoint(x0, y0, s); + view->ScaleAroundPoint(Double(x0), Double(y0), Double(s)); currentAction.loops++; } else @@ -310,13 +344,13 @@ bool DebugScript::Execute(View *view, Screen *scr) target.w += view->GetBounds().w; target.h += view->GetBounds().h; VReal s = target.w/(view->GetBounds().w); - if (Real(s) != 1) + if (s != VReal(1)) { VReal x0; VReal y0; x0 = (view->GetBounds().x - target.x)/((s - VReal(1))*view->GetBounds().w); y0 = (view->GetBounds().y - target.y)/((s - VReal(1))*view->GetBounds().h); - view->ScaleAroundPoint(x0, y0, s); + view->ScaleAroundPoint(Double(x0), Double(y0), Double(s)); currentAction.loops++; } else @@ -345,6 +379,53 @@ bool DebugScript::Execute(View *view, Screen *scr) currentAction.loops = 1; break; } + case AT_PrintSPF: + { + // Using a (apparently) Soviet trick to calculate the stddev in one pass + // This was my favourite algorithm in my Physics honours project + // Ah the memories + // The horrible horrible memories + // At least things won't get that bad + // Right? + if (currentAction.loops <= 1) + { + double n = double(currentAction.iz); + m_spf_cpu_mean /= n; + m_spf_gpu_mean /= n; + + m_spf_cpu_stddev = sqrt(m_spf_cpu_stddev / n - m_spf_cpu_mean*m_spf_cpu_mean); + m_spf_gpu_stddev = sqrt(m_spf_gpu_stddev / n - m_spf_gpu_mean*m_spf_gpu_mean); + + + + printf("%d\t%f\t%f\t%f\t%f\n", currentAction.iz, + m_spf_gpu_mean, m_spf_gpu_stddev, + m_spf_cpu_mean, m_spf_cpu_stddev); + } + else + { + + double spf_cpu = scr->GetLastFrameTimeCPU(); + double spf_gpu = scr->GetLastFrameTimeGPU(); + + m_spf_cpu_mean += spf_cpu; + m_spf_gpu_mean += spf_gpu; + + m_spf_cpu_stddev += spf_cpu*spf_cpu; + m_spf_gpu_stddev += spf_gpu*spf_gpu; + } + break; + } + case AT_PrintBounds: + { + printf("%s\t%s\t%s\t%s\t%s\t%s\n", Str(view->GetBounds().x).c_str(), Str(view->GetBounds().y).c_str(), Str(view->GetBounds().w).c_str(), Str(view->GetBounds().h).c_str(), Str(Log10(view->GetBounds().w)).c_str(), Str(Log10(view->GetBounds().h)).c_str()); + break; + } + case AT_ProfileDisplay: + { + g_profiler.Enable(currentAction.iz); + break; + } default: Fatal("Unknown script command in queue."); } @@ -368,14 +449,15 @@ void DebugScript::PrintPerformance(View * view, Screen * scr) now.view_bounds = view->GetBounds(); // object_count clock delta_clock x Log10(x) y Log10(y) w Log10(w) Size(w) - #ifdef QUADTREE_DISABLED + //#ifdef QUADTREE_DISABLED printf("%d\t%llu\t%llu\t%s\t%s\t%s\t%s\t%s\t%s\t%u\n", now.object_count, (long long unsigned)now.clock, (long long unsigned)(now.clock - m_perf_last.clock), - Str(now.view_bounds.x).c_str(), Str(Log10(Abs(now.view_bounds.x))).c_str(), + "", "", "", "", "", "", 0); + /*Str(now.view_bounds.x).c_str(), Str(Log10(Abs(now.view_bounds.x))).c_str(), Str(now.view_bounds.y).c_str(), Str(Log10(Abs(now.view_bounds.y))).c_str(), Str(now.view_bounds.w).c_str(), Str(Log10(now.view_bounds.w)).c_str(), - (unsigned)Size(now.view_bounds.w)); - #endif + (unsigned)Size(now.view_bounds.w));*/ + //#endif m_perf_last = now; }