use mvc for the testbed, update almost all tests, bugfixes, improvements, cleanup
Since I started altering the testbed for better maintainability, I prefered to drop this (tested) large change with a single commit. Some changes below: Put some globals in their correct place, Now Testbed uses the MVC pattern (Model-View Controller). This way it becomes better to maintain than using no pattern in my opinion. Fixed some bugs in the debug draw interface. Of course, updated almost all tests because of the differences. Update script.
This commit is contained in:
130
examples/testbed/framework/model.cpp
Normal file
130
examples/testbed/framework/model.cpp
Normal file
@ -0,0 +1,130 @@
|
||||
#include <testbed/framework/model.h>
|
||||
|
||||
Model::Model()
|
||||
{
|
||||
g_debugDraw = &m_debugDraw;
|
||||
g_camera = &m_camera;
|
||||
g_overlayName = "overlay";
|
||||
g_profiler = &m_profiler;
|
||||
g_profilerListener = &m_profilerListener;
|
||||
g_settings = &m_settings;
|
||||
|
||||
m_test = nullptr;
|
||||
|
||||
glFrontFace(GL_CCW);
|
||||
glCullFace(GL_BACK);
|
||||
glEnable(GL_CULL_FACE);
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
glEnable(GL_BLEND);
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
|
||||
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
|
||||
glClearDepth(1.0f);
|
||||
|
||||
m_camera.m_q = b3QuatRotationX(-0.125f * B3_PI);
|
||||
m_camera.m_center.SetZero();
|
||||
m_camera.m_zoom = 20.0f;
|
||||
}
|
||||
|
||||
Model::~Model()
|
||||
{
|
||||
g_debugDraw = nullptr;
|
||||
g_camera = nullptr;
|
||||
g_overlayName = nullptr;
|
||||
g_profiler = nullptr;
|
||||
g_profilerListener = nullptr;
|
||||
g_settings = nullptr;
|
||||
|
||||
delete m_test;
|
||||
}
|
||||
|
||||
void Model::Command_Step()
|
||||
{
|
||||
if (m_settings.testID != m_settings.lastTestID)
|
||||
{
|
||||
delete m_test;
|
||||
m_settings.lastTestID = m_settings.testID;
|
||||
m_test = g_tests[m_settings.testID].create();
|
||||
m_settings.pause = true;
|
||||
}
|
||||
|
||||
glViewport(0, 0, GLsizei(m_camera.m_width), GLsizei(m_camera.m_height));
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
|
||||
if (m_settings.pause)
|
||||
{
|
||||
m_debugDraw.DrawString(b3Color_white, "*PAUSED*");
|
||||
}
|
||||
else
|
||||
{
|
||||
m_debugDraw.DrawString(b3Color_white, "*PLAYING*");
|
||||
}
|
||||
|
||||
if (m_settings.drawGrid)
|
||||
{
|
||||
b3Color color(0.2f, 0.2f, 0.2f, 1.0f);
|
||||
|
||||
b3Vec3 pn(0.0f, 1.0f, 0.0f);
|
||||
b3Vec3 p(0.0f, 0.0f, 0.0f);
|
||||
m_debugDraw.DrawCircle(pn, p, 1.0f, color);
|
||||
|
||||
int n = 20;
|
||||
|
||||
b3Vec3 t;
|
||||
t.x = -0.5f * float32(n);
|
||||
t.y = 0.0f;
|
||||
t.z = -0.5f * float32(n);
|
||||
|
||||
for (int i = 0; i < n; i += 1)
|
||||
{
|
||||
for (int j = 0; j < n; j += 1)
|
||||
{
|
||||
b3Vec3 vs[4];
|
||||
vs[0] = b3Vec3((float32)i, 0.0f, (float32)j);
|
||||
vs[1] = b3Vec3((float32)i, 0.0f, (float32)j + 1);
|
||||
vs[2] = b3Vec3((float32)i + 1, 0.0f, (float32)j + 1);
|
||||
vs[3] = b3Vec3((float32)i + 1, 0.0f, (float32)j);
|
||||
|
||||
vs[0] += t;
|
||||
vs[1] += t;
|
||||
vs[2] += t;
|
||||
vs[3] += t;
|
||||
|
||||
m_debugDraw.DrawPolygon(vs, 4, color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
m_settings.inv_hertz = m_settings.hertz != 0.0f ? 1.0f / m_settings.hertz : 0.0f;
|
||||
|
||||
if (m_settings.pause)
|
||||
{
|
||||
if (m_settings.singleStep)
|
||||
{
|
||||
m_settings.singleStep = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
m_settings.inv_hertz = 0.0f;
|
||||
}
|
||||
}
|
||||
|
||||
m_profiler.Begin();
|
||||
|
||||
m_test->Step();
|
||||
|
||||
m_profiler.End(g_profilerListener);
|
||||
|
||||
if (m_settings.drawProfile)
|
||||
{
|
||||
const b3Array<ProfilerRecord>& records = m_profilerListener.m_recorderProfiler.GetRecords();
|
||||
for (u32 i = 0; i < records.Count(); ++i)
|
||||
{
|
||||
const ProfilerRecord& r = records[i];
|
||||
m_debugDraw.DrawString(b3Color_white, "%s %.4f (%.4f) [ms]", r.name, r.elapsed, r.maxElapsed);
|
||||
}
|
||||
}
|
||||
|
||||
m_debugDraw.Submit();
|
||||
}
|
Reference in New Issue
Block a user