2012-10-07 20:41:18 -07:00
/*
2016-01-01 00:11:04 -08:00
* Copyright 2011 - 2016 Branimir Karadzic . All rights reserved .
* License : https : //github.com/bkaradzic/bgfx#license-bsd-2-clause
2012-10-07 20:41:18 -07:00
*/
2013-05-23 22:07:54 -07:00
# include "common.h"
2014-05-03 15:18:28 -07:00
# include "bgfx_utils.h"
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
class ExampleMesh : public entry : : AppI
2012-10-07 20:41:18 -07:00
{
2016-03-06 15:29:22 -08:00
void init ( int _argc , char * * _argv ) BX_OVERRIDE
{
Args args ( _argc , _argv ) ;
m_width = 1280 ;
m_height = 720 ;
m_debug = BGFX_DEBUG_TEXT ;
m_reset = BGFX_RESET_VSYNC ;
2013-01-16 22:44:51 -08:00
2016-03-06 15:29:22 -08:00
bgfx : : init ( args . m_type , args . m_pciId ) ;
bgfx : : reset ( m_width , m_height , m_reset ) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
// Enable debug text.
bgfx : : setDebug ( m_debug ) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
// Set view 0 clear state.
bgfx : : setViewClear ( 0
, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH
, 0x303030ff
, 1.0f
, 0
) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
u_time = bgfx : : createUniform ( " u_time " , bgfx : : UniformType : : Vec4 ) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
// Create program from shaders.
m_program = loadProgram ( " vs_mesh " , " fs_mesh " ) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
m_mesh = meshLoad ( " meshes/bunny.bin " ) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
m_timeOffset = bx : : getHPCounter ( ) ;
}
2013-04-25 23:30:56 -07:00
2016-03-06 15:29:22 -08:00
int shutdown ( ) BX_OVERRIDE
2012-10-07 20:41:18 -07:00
{
2016-03-06 15:29:22 -08:00
meshUnload ( m_mesh ) ;
2014-11-02 00:06:18 -07:00
2016-03-06 15:29:22 -08:00
// Cleanup.
bgfx : : destroyProgram ( m_program ) ;
2014-11-02 00:06:18 -07:00
2016-03-06 15:29:22 -08:00
bgfx : : destroyUniform ( u_time ) ;
2014-11-02 00:06:18 -07:00
2016-03-06 15:29:22 -08:00
// Shutdown bgfx.
bgfx : : shutdown ( ) ;
2014-11-02 00:06:18 -07:00
2016-03-06 15:29:22 -08:00
return 0 ;
}
2014-11-02 00:06:18 -07:00
2016-03-06 15:29:22 -08:00
bool update ( ) BX_OVERRIDE
{
if ( ! entry : : processEvents ( m_width , m_height , m_debug , m_reset ) )
{
2014-11-02 00:06:18 -07:00
// Set view 0 default viewport.
2016-03-06 15:29:22 -08:00
bgfx : : setViewRect ( 0 , 0 , 0 , m_width , m_height ) ;
// This dummy draw call is here to make sure that view 0 is cleared
// if no other draw calls are submitted to view 0.
bgfx : : touch ( 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 ;
float time = ( float ) ( ( bx : : getHPCounter ( ) - m_timeOffset ) / double ( bx : : getHPFrequency ( ) ) ) ;
bgfx : : setUniform ( u_time , & time ) ;
// Use debug font to print information about this example.
bgfx : : dbgTextClear ( ) ;
bgfx : : dbgTextPrintf ( 0 , 1 , 0x4f , " bgfx/examples/04-mesh " ) ;
bgfx : : dbgTextPrintf ( 0 , 2 , 0x6f , " Description: Loading meshes. " ) ;
bgfx : : dbgTextPrintf ( 0 , 3 , 0x0f , " Frame: % 7.3f[ms] " , double ( frameTime ) * toMs ) ;
float at [ 3 ] = { 0.0f , 1.0f , 0.0f } ;
float eye [ 3 ] = { 0.0f , 1.0f , - 2.5f } ;
// Set view and projection matrix for view 0.
const bgfx : : HMD * hmd = bgfx : : getHMD ( ) ;
if ( NULL ! = hmd & & 0 ! = ( hmd - > flags & BGFX_HMD_RENDERING ) )
{
float view [ 16 ] ;
bx : : mtxQuatTranslationHMD ( view , hmd - > eye [ 0 ] . rotation , eye ) ;
float proj [ 16 ] ;
bx : : mtxProj ( proj , hmd - > eye [ 0 ] . fov , 0.1f , 100.0f ) ;
bgfx : : setViewTransform ( 0 , view , proj ) ;
// Set view 0 default viewport.
//
// Use HMD's width/height since HMD's internal frame buffer size
// might be much larger than window size.
bgfx : : setViewRect ( 0 , 0 , 0 , hmd - > width , hmd - > height ) ;
}
else
{
float view [ 16 ] ;
bx : : mtxLookAt ( view , eye , at ) ;
float proj [ 16 ] ;
bx : : mtxProj ( proj , 60.0f , float ( m_width ) / float ( m_height ) , 0.1f , 100.0f ) ;
bgfx : : setViewTransform ( 0 , view , proj ) ;
// Set view 0 default viewport.
bgfx : : setViewRect ( 0 , 0 , 0 , m_width , m_height ) ;
}
float mtx [ 16 ] ;
bx : : mtxRotateXY ( mtx
, 0.0f
, time * 0.37f
) ;
meshSubmit ( m_mesh , 0 , m_program , mtx ) ;
// Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives.
bgfx : : frame ( ) ;
return true ;
2014-11-02 00:06:18 -07:00
}
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
return false ;
2012-10-07 20:41:18 -07:00
}
2016-03-06 15:29:22 -08:00
uint32_t m_width ;
uint32_t m_height ;
uint32_t m_debug ;
uint32_t m_reset ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
int64_t m_timeOffset ;
Mesh * m_mesh ;
bgfx : : ProgramHandle m_program ;
bgfx : : UniformHandle u_time ;
} ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
ENTRY_IMPLEMENT_MAIN ( ExampleMesh ) ;