mirror of
https://github.com/bkaradzic/bgfx.git
synced 2026-02-17 20:52:36 +01:00
Cleanup.
This commit is contained in:
@@ -102,138 +102,163 @@ void renderScreenSpaceQuad(uint32_t _view, bgfx::ProgramHandle _program, float _
|
||||
}
|
||||
}
|
||||
|
||||
int _main_(int _argc, char** _argv)
|
||||
class ExampleRaymarch : public entry::AppI
|
||||
{
|
||||
Args args(_argc, _argv);
|
||||
|
||||
uint32_t width = 1280;
|
||||
uint32_t height = 720;
|
||||
uint32_t debug = BGFX_DEBUG_TEXT;
|
||||
uint32_t reset = BGFX_RESET_VSYNC;
|
||||
|
||||
bgfx::init(args.m_type, args.m_pciId);
|
||||
bgfx::reset(width, height, reset);
|
||||
|
||||
// Enable debug text.
|
||||
bgfx::setDebug(debug);
|
||||
|
||||
// Set view 0 clear state.
|
||||
bgfx::setViewClear(0
|
||||
, BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
|
||||
, 0x303030ff
|
||||
, 1.0f
|
||||
, 0
|
||||
);
|
||||
|
||||
// Setup root path for binary shaders. Shader binaries are different
|
||||
// for each renderer.
|
||||
switch (bgfx::getRendererType() )
|
||||
void init(int _argc, char** _argv) BX_OVERRIDE
|
||||
{
|
||||
default:
|
||||
break;
|
||||
Args args(_argc, _argv);
|
||||
|
||||
m_width = 1280;
|
||||
m_height = 720;
|
||||
m_debug = BGFX_DEBUG_TEXT;
|
||||
m_reset = BGFX_RESET_VSYNC;
|
||||
|
||||
case bgfx::RendererType::OpenGL:
|
||||
case bgfx::RendererType::OpenGLES:
|
||||
s_oglNdc = true;
|
||||
break;
|
||||
bgfx::init(args.m_type, args.m_pciId);
|
||||
bgfx::reset(m_width, m_height, m_reset);
|
||||
|
||||
// Enable debug text.
|
||||
bgfx::setDebug(m_debug);
|
||||
|
||||
// Set view 0 clear state.
|
||||
bgfx::setViewClear(0
|
||||
, BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH
|
||||
, 0x303030ff
|
||||
, 1.0f
|
||||
, 0
|
||||
);
|
||||
|
||||
// Setup root path for binary shaders. Shader binaries are different
|
||||
// for each renderer.
|
||||
switch (bgfx::getRendererType() )
|
||||
{
|
||||
default:
|
||||
break;
|
||||
|
||||
case bgfx::RendererType::OpenGL:
|
||||
case bgfx::RendererType::OpenGLES:
|
||||
s_oglNdc = true;
|
||||
break;
|
||||
}
|
||||
|
||||
// Create vertex stream declaration.
|
||||
PosColorTexCoord0Vertex::init();
|
||||
|
||||
u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4);
|
||||
u_lightDirTime = bgfx::createUniform("u_lightDirTime", bgfx::UniformType::Vec4);
|
||||
|
||||
// Create program from shaders.
|
||||
m_program = loadProgram("vs_raymarching", "fs_raymarching");
|
||||
|
||||
m_timeOffset = bx::getHPCounter();
|
||||
}
|
||||
|
||||
// Create vertex stream declaration.
|
||||
PosColorTexCoord0Vertex::init();
|
||||
|
||||
bgfx::UniformHandle u_mtx = bgfx::createUniform("u_mtx", bgfx::UniformType::Mat4);
|
||||
bgfx::UniformHandle u_lightDirTime = bgfx::createUniform("u_lightDirTime", bgfx::UniformType::Vec4);
|
||||
|
||||
// Create program from shaders.
|
||||
bgfx::ProgramHandle raymarching = loadProgram("vs_raymarching", "fs_raymarching");
|
||||
|
||||
int64_t timeOffset = bx::getHPCounter();
|
||||
|
||||
while (!entry::processEvents(width, height, debug, reset) )
|
||||
int shutdown() BX_OVERRIDE
|
||||
{
|
||||
// Set view 0 default viewport.
|
||||
bgfx::setViewRect(0, 0, 0, width, height);
|
||||
// Cleanup.
|
||||
bgfx::destroyProgram(m_program);
|
||||
|
||||
// Set view 1 default viewport.
|
||||
bgfx::setViewRect(1, 0, 0, width, height);
|
||||
bgfx::destroyUniform(u_mtx);
|
||||
bgfx::destroyUniform(u_lightDirTime);
|
||||
|
||||
// This dummy draw call is here to make sure that view 0 is cleared
|
||||
// if no other draw calls are submitted to viewZ 0.
|
||||
bgfx::touch(0);
|
||||
// Shutdown bgfx.
|
||||
bgfx::shutdown();
|
||||
|
||||
int64_t now = bx::getHPCounter();
|
||||
static int64_t last = now;
|
||||
const int64_t frameTime = now - last;
|
||||
last = now;
|
||||
const double freq = double(bx::getHPFrequency() );
|
||||
const double toMs = 1000.0/freq;
|
||||
|
||||
// Use debug font to print information about this example.
|
||||
bgfx::dbgTextClear();
|
||||
bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/03-raymarch");
|
||||
bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Updating shader uniforms.");
|
||||
bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
|
||||
|
||||
float at[3] = { 0.0f, 0.0f, 0.0f };
|
||||
float eye[3] = { 0.0f, 0.0f, -15.0f };
|
||||
|
||||
float view[16];
|
||||
float proj[16];
|
||||
bx::mtxLookAt(view, eye, at);
|
||||
mtxProj(proj, 60.0f, float(width)/float(height), 0.1f, 100.0f);
|
||||
|
||||
// Set view and projection matrix for view 1.
|
||||
bgfx::setViewTransform(0, view, proj);
|
||||
|
||||
float ortho[16];
|
||||
bx::mtxOrtho(ortho, 0.0f, 1280.0f, 720.0f, 0.0f, 0.0f, 100.0f);
|
||||
|
||||
// Set view and projection matrix for view 0.
|
||||
bgfx::setViewTransform(1, NULL, ortho);
|
||||
|
||||
float time = (float)( (bx::getHPCounter()-timeOffset)/double(bx::getHPFrequency() ) );
|
||||
|
||||
float vp[16];
|
||||
bx::mtxMul(vp, view, proj);
|
||||
|
||||
float mtx[16];
|
||||
bx::mtxRotateXY(mtx
|
||||
, time
|
||||
, time*0.37f
|
||||
);
|
||||
|
||||
float mtxInv[16];
|
||||
bx::mtxInverse(mtxInv, mtx);
|
||||
float lightDirModel[4] = { -0.4f, -0.5f, -1.0f, 0.0f };
|
||||
float lightDirModelN[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
|
||||
bx::vec3Norm(lightDirModelN, lightDirModel);
|
||||
float lightDirTime[4];
|
||||
bx::vec4MulMtx(lightDirTime, lightDirModelN, mtxInv);
|
||||
lightDirTime[3] = time;
|
||||
bgfx::setUniform(u_lightDirTime, lightDirTime);
|
||||
|
||||
float mvp[16];
|
||||
bx::mtxMul(mvp, mtx, vp);
|
||||
|
||||
float invMvp[16];
|
||||
bx::mtxInverse(invMvp, mvp);
|
||||
bgfx::setUniform(u_mtx, invMvp);
|
||||
|
||||
renderScreenSpaceQuad(1, raymarching, 0.0f, 0.0f, 1280.0f, 720.0f);
|
||||
|
||||
// Advance to next frame. Rendering thread will be kicked to
|
||||
// process submitted rendering primitives.
|
||||
bgfx::frame();
|
||||
return 0;
|
||||
}
|
||||
|
||||
// Cleanup.
|
||||
bgfx::destroyProgram(raymarching);
|
||||
bool update() BX_OVERRIDE
|
||||
{
|
||||
if (!entry::processEvents(m_width, m_height, m_debug, m_reset) )
|
||||
{
|
||||
// Set view 0 default viewport.
|
||||
bgfx::setViewRect(0, 0, 0, m_width, m_height);
|
||||
|
||||
bgfx::destroyUniform(u_mtx);
|
||||
bgfx::destroyUniform(u_lightDirTime);
|
||||
// Set view 1 default viewport.
|
||||
bgfx::setViewRect(1, 0, 0, m_width, m_height);
|
||||
|
||||
// Shutdown bgfx.
|
||||
bgfx::shutdown();
|
||||
// This dummy draw call is here to make sure that view 0 is cleared
|
||||
// if no other draw calls are submitted to viewZ 0.
|
||||
bgfx::touch(0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
int64_t now = bx::getHPCounter();
|
||||
static int64_t last = now;
|
||||
const int64_t frameTime = now - last;
|
||||
last = now;
|
||||
const double freq = double(bx::getHPFrequency() );
|
||||
const double toMs = 1000.0/freq;
|
||||
|
||||
// Use debug font to print information about this example.
|
||||
bgfx::dbgTextClear();
|
||||
bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/03-raymarch");
|
||||
bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Updating shader uniforms.");
|
||||
bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
|
||||
|
||||
float at[3] = { 0.0f, 0.0f, 0.0f };
|
||||
float eye[3] = { 0.0f, 0.0f, -15.0f };
|
||||
|
||||
float view[16];
|
||||
float proj[16];
|
||||
bx::mtxLookAt(view, eye, at);
|
||||
mtxProj(proj, 60.0f, float(m_width)/float(m_height), 0.1f, 100.0f);
|
||||
|
||||
// Set view and projection matrix for view 1.
|
||||
bgfx::setViewTransform(0, view, proj);
|
||||
|
||||
float ortho[16];
|
||||
bx::mtxOrtho(ortho, 0.0f, 1280.0f, 720.0f, 0.0f, 0.0f, 100.0f);
|
||||
|
||||
// Set view and projection matrix for view 0.
|
||||
bgfx::setViewTransform(1, NULL, ortho);
|
||||
|
||||
float time = (float)( (bx::getHPCounter()-m_timeOffset)/double(bx::getHPFrequency() ) );
|
||||
|
||||
float vp[16];
|
||||
bx::mtxMul(vp, view, proj);
|
||||
|
||||
float mtx[16];
|
||||
bx::mtxRotateXY(mtx
|
||||
, time
|
||||
, time*0.37f
|
||||
);
|
||||
|
||||
float mtxInv[16];
|
||||
bx::mtxInverse(mtxInv, mtx);
|
||||
float lightDirModel[4] = { -0.4f, -0.5f, -1.0f, 0.0f };
|
||||
float lightDirModelN[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
|
||||
bx::vec3Norm(lightDirModelN, lightDirModel);
|
||||
float lightDirTime[4];
|
||||
bx::vec4MulMtx(lightDirTime, lightDirModelN, mtxInv);
|
||||
lightDirTime[3] = time;
|
||||
bgfx::setUniform(u_lightDirTime, lightDirTime);
|
||||
|
||||
float mvp[16];
|
||||
bx::mtxMul(mvp, mtx, vp);
|
||||
|
||||
float invMvp[16];
|
||||
bx::mtxInverse(invMvp, mvp);
|
||||
bgfx::setUniform(u_mtx, invMvp);
|
||||
|
||||
renderScreenSpaceQuad(1, m_program, 0.0f, 0.0f, 1280.0f, 720.0f);
|
||||
|
||||
// Advance to next frame. Rendering thread will be kicked to
|
||||
// process submitted rendering primitives.
|
||||
bgfx::frame();
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
uint32_t m_width;
|
||||
uint32_t m_height;
|
||||
uint32_t m_debug;
|
||||
uint32_t m_reset;
|
||||
|
||||
int64_t m_timeOffset;
|
||||
bgfx::UniformHandle u_mtx;
|
||||
bgfx::UniformHandle u_lightDirTime;
|
||||
bgfx::ProgramHandle m_program;
|
||||
};
|
||||
|
||||
ENTRY_IMPLEMENT_MAIN(ExampleRaymarch);
|
||||
|
||||
Reference in New Issue
Block a user