2012-10-07 20:41:18 -07:00
/*
2015-01-01 15:04:46 -08:00
* Copyright 2011 - 2015 Branimir Karadzic . All rights reserved .
2012-10-07 20:41:18 -07:00
* License : http : //www.opensource.org/licenses/BSD-2-Clause
*/
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
2013-03-25 21:13:54 -07:00
int _main_ ( int /*_argc*/ , char * * /*_argv*/ )
2012-10-07 20:41:18 -07:00
{
2013-01-16 22:44:51 -08:00
uint32_t width = 1280 ;
uint32_t height = 720 ;
uint32_t debug = BGFX_DEBUG_TEXT ;
2013-04-27 18:47:18 -07:00
uint32_t reset = BGFX_RESET_VSYNC ;
2013-01-16 22:44:51 -08:00
2012-12-30 20:52:47 -08:00
bgfx : : init ( ) ;
2013-05-08 22:57:54 -07:00
bgfx : : reset ( width , height , reset ) ;
2012-10-07 20:41:18 -07:00
// Enable debug text.
2013-01-16 22:44:51 -08:00
bgfx : : setDebug ( debug ) ;
2012-10-07 20:41:18 -07:00
// Set view 0 clear state.
bgfx : : setViewClear ( 0
2015-01-10 21:39:45 -08:00
, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH
2012-10-07 20:41:18 -07:00
, 0x303030ff
, 1.0f
, 0
) ;
2012-10-27 21:34:41 -07:00
bgfx : : UniformHandle u_time = bgfx : : createUniform ( " u_time " , bgfx : : UniformType : : Uniform1f ) ;
2012-10-07 20:41:18 -07:00
2014-05-03 15:18:28 -07:00
// Create program from shaders.
2012-10-07 20:41:18 -07:00
bgfx : : ProgramHandle program = loadProgram ( " vs_mesh " , " fs_mesh " ) ;
2014-05-03 15:18:28 -07:00
Mesh * mesh = meshLoad ( " meshes/bunny.bin " ) ;
2012-10-07 20:41:18 -07:00
2013-04-25 23:30:56 -07:00
int64_t timeOffset = bx : : getHPCounter ( ) ;
2013-08-07 21:45:56 -07:00
while ( ! entry : : processEvents ( width , height , debug , reset ) )
2012-10-07 20:41:18 -07:00
{
2013-01-16 22:44:51 -08:00
// Set view 0 default viewport.
bgfx : : setViewRect ( 0 , 0 , 0 , width , height ) ;
2012-10-07 20:41:18 -07:00
// 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 : : submit ( 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 ;
2013-04-25 23:30:56 -07:00
float time = ( float ) ( ( bx : : getHPCounter ( ) - timeOffset ) / double ( bx : : getHPFrequency ( ) ) ) ;
2012-10-07 20:41:18 -07:00
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 " ) ;
2012-12-28 17:09:34 -08:00
bgfx : : dbgTextPrintf ( 0 , 2 , 0x6f , " Description: Loading meshes. " ) ;
2012-10-07 20:41:18 -07:00
bgfx : : dbgTextPrintf ( 0 , 3 , 0x0f , " Frame: % 7.3f[ms] " , double ( frameTime ) * toMs ) ;
2014-11-02 00:06:18 -07:00
float at [ 3 ] = { 0.0f , 1.0f , 0.0f } ;
2012-10-07 20:41:18 -07:00
float eye [ 3 ] = { 0.0f , 1.0f , - 2.5f } ;
// Set view and projection matrix for view 0.
2014-11-02 00:06:18 -07:00
const bgfx : : HMD * hmd = bgfx : : getHMD ( ) ;
if ( NULL ! = hmd )
{
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 ( width ) / float ( height ) , 0.1f , 100.0f ) ;
bgfx : : setViewTransform ( 0 , view , proj ) ;
// Set view 0 default viewport.
bgfx : : setViewRect ( 0 , 0 , 0 , width , height ) ;
}
2012-10-07 20:41:18 -07:00
float mtx [ 16 ] ;
2014-05-26 19:31:37 -07:00
bx : : mtxRotateXY ( mtx
2012-10-07 20:41:18 -07:00
, 0.0f
, time * 0.37f
) ;
2014-05-03 15:18:28 -07:00
meshSubmit ( mesh , 0 , program , mtx ) ;
2012-10-07 20:41:18 -07:00
// Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives.
bgfx : : frame ( ) ;
}
2014-05-03 15:18:28 -07:00
meshUnload ( mesh ) ;
2012-12-28 17:09:34 -08:00
2012-10-07 20:41:18 -07:00
// Cleanup.
bgfx : : destroyProgram ( program ) ;
bgfx : : destroyUniform ( u_time ) ;
// Shutdown bgfx.
bgfx : : shutdown ( ) ;
return 0 ;
}