#include "debugscript.h"
+#include "profiler.h"
#include <string>
void DebugScript::ParseAction(View * view, Screen * scr)
{
+ *m_input >> std::ws;
if (m_input == NULL || !m_input->good())
return;
istream & inp = *m_input;
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());
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);
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();
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
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
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.");
}
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;
}