2012-10-08 23:24:10 -07:00
/*
2015-01-01 15:04:46 -08:00
* Copyright 2011 - 2015 Branimir Karadzic . All rights reserved .
2012-10-08 23:24:10 -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-08 23:24:10 -07:00
struct PosColorVertex
{
float m_x ;
float m_y ;
float m_z ;
uint32_t m_abgr ;
2014-05-03 15:18:28 -07:00
static void init ( )
{
2014-05-10 20:51:44 -07:00
ms_decl
. begin ( )
. add ( bgfx : : Attrib : : Position , 3 , bgfx : : AttribType : : Float )
. add ( bgfx : : Attrib : : Color0 , 4 , bgfx : : AttribType : : Uint8 , true )
. end ( ) ;
2014-05-03 15:18:28 -07:00
} ;
static bgfx : : VertexDecl ms_decl ;
2012-10-08 23:24:10 -07:00
} ;
2014-05-03 15:18:28 -07:00
bgfx : : VertexDecl PosColorVertex : : ms_decl ;
2012-10-08 23:24:10 -07:00
static PosColorVertex s_cubeVertices [ 8 ] =
{
{ - 1.0f , 1.0f , 1.0f , 0xff000000 } ,
{ 1.0f , 1.0f , 1.0f , 0xff0000ff } ,
{ - 1.0f , - 1.0f , 1.0f , 0xff00ff00 } ,
{ 1.0f , - 1.0f , 1.0f , 0xff00ffff } ,
{ - 1.0f , 1.0f , - 1.0f , 0xffff0000 } ,
{ 1.0f , 1.0f , - 1.0f , 0xffff00ff } ,
{ - 1.0f , - 1.0f , - 1.0f , 0xffffff00 } ,
{ 1.0f , - 1.0f , - 1.0f , 0xffffffff } ,
} ;
static const uint16_t s_cubeIndices [ 36 ] =
{
2013-02-21 22:05:33 -08:00
0 , 1 , 2 , // 0
1 , 3 , 2 ,
4 , 6 , 5 , // 2
5 , 6 , 7 ,
0 , 2 , 4 , // 4
4 , 2 , 6 ,
1 , 5 , 3 , // 6
5 , 7 , 3 ,
0 , 4 , 1 , // 8
4 , 5 , 1 ,
2 , 3 , 6 , // 10
6 , 3 , 7 ,
2012-10-08 23:24:10 -07:00
} ;
2013-03-25 21:13:54 -07:00
int _main_ ( int /*_argc*/ , char * * /*_argv*/ )
2012-10-08 23:24:10 -07:00
{
2013-02-21 21:07:31 -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-02-21 21:07:31 -08:00
bgfx : : init ( ) ;
2013-05-08 22:57:54 -07:00
bgfx : : reset ( width , height , reset ) ;
2013-02-21 21:07:31 -08:00
// Enable debug text.
bgfx : : setDebug ( debug ) ;
2012-10-08 23:24:10 -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-08 23:24:10 -07:00
, 0x303030ff
, 1.0f
, 0
) ;
2013-10-10 18:29:57 -07:00
// Get renderer capabilities info.
const bgfx : : Caps * caps = bgfx : : getCaps ( ) ;
2012-10-08 23:24:10 -07:00
// Create vertex stream declaration.
2014-05-03 15:18:28 -07:00
PosColorVertex : : init ( ) ;
2012-10-08 23:24:10 -07:00
const bgfx : : Memory * mem ;
// Create static vertex buffer.
mem = bgfx : : makeRef ( s_cubeVertices , sizeof ( s_cubeVertices ) ) ;
2014-05-03 15:18:28 -07:00
bgfx : : VertexBufferHandle vbh = bgfx : : createVertexBuffer ( mem , PosColorVertex : : ms_decl ) ;
2012-10-08 23:24:10 -07:00
// Create static index buffer.
mem = bgfx : : makeRef ( s_cubeIndices , sizeof ( s_cubeIndices ) ) ;
bgfx : : IndexBufferHandle ibh = bgfx : : createIndexBuffer ( mem ) ;
// Create program from shaders.
2014-05-03 15:18:28 -07:00
bgfx : : ProgramHandle program = loadProgram ( " vs_instancing " , " fs_instancing " ) ;
2012-10-08 23:24:10 -07:00
2013-04-27 12:43:18 -07:00
int64_t timeOffset = bx : : getHPCounter ( ) ;
2013-08-07 21:45:56 -07:00
while ( ! entry : : processEvents ( width , height , debug , reset ) )
2013-02-21 21:07:31 -08:00
{
// Set view 0 default viewport.
bgfx : : setViewRect ( 0 , 0 , 0 , width , height ) ;
2012-10-08 23:24:10 -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-27 12:43:18 -07:00
float time = ( float ) ( ( now - timeOffset ) / double ( bx : : getHPFrequency ( ) ) ) ;
2012-10-08 23:24:10 -07:00
// Use debug font to print information about this example.
bgfx : : dbgTextClear ( ) ;
bgfx : : dbgTextPrintf ( 0 , 1 , 0x4f , " bgfx/examples/05-instancing " ) ;
bgfx : : dbgTextPrintf ( 0 , 2 , 0x6f , " Description: Geometry instancing. " ) ;
bgfx : : dbgTextPrintf ( 0 , 3 , 0x0f , " Frame: % 7.3f[ms] " , double ( frameTime ) * toMs ) ;
2013-10-10 18:29:57 -07:00
// Check if instancing is supported.
if ( 0 = = ( BGFX_CAPS_INSTANCING & caps - > supported ) )
2012-10-08 23:24:10 -07:00
{
2013-10-10 18:29:57 -07:00
// When instancing is not supported by GPU, implement alternative
// code path that doesn't use instancing.
bool blink = uint32_t ( time * 3.0f ) & 1 ;
bgfx : : dbgTextPrintf ( 0 , 5 , blink ? 0x1f : 0x01 , " Instancing is not supported by GPU. " ) ;
}
else
{
2014-11-02 00:06:18 -07:00
float at [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
2013-10-10 18:29:57 -07:00
float eye [ 3 ] = { 0.0f , 0.0f , - 35.0f } ;
// 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 ) ;
}
2013-10-10 18:29:57 -07:00
const uint16_t instanceStride = 80 ;
const bgfx : : InstanceDataBuffer * idb = bgfx : : allocInstanceDataBuffer ( 121 , instanceStride ) ;
if ( NULL ! = idb )
2012-10-08 23:24:10 -07:00
{
2013-10-10 18:29:57 -07:00
uint8_t * data = idb - > data ;
// Write instance data for 11x11 cubes.
for ( uint32_t yy = 0 ; yy < 11 ; + + yy )
2012-10-13 22:21:02 -07:00
{
2013-10-10 18:29:57 -07:00
for ( uint32_t xx = 0 ; xx < 11 ; + + xx )
{
float * mtx = ( float * ) data ;
2014-05-26 19:31:37 -07:00
bx : : mtxRotateXY ( mtx , time + xx * 0.21f , time + yy * 0.37f ) ;
2013-10-10 18:29:57 -07:00
mtx [ 12 ] = - 15.0f + float ( xx ) * 3.0f ;
mtx [ 13 ] = - 15.0f + float ( yy ) * 3.0f ;
mtx [ 14 ] = 0.0f ;
float * color = ( float * ) & data [ 64 ] ;
2015-03-29 11:47:32 -07:00
color [ 0 ] = sinf ( time + float ( xx ) / 11.0f ) * 0.5f + 0.5f ;
color [ 1 ] = cosf ( time + float ( yy ) / 11.0f ) * 0.5f + 0.5f ;
color [ 2 ] = sinf ( time * 3.0f ) * 0.5f + 0.5f ;
2013-10-10 18:29:57 -07:00
color [ 3 ] = 1.0f ;
data + = instanceStride ;
}
2012-10-13 22:21:02 -07:00
}
2012-10-08 23:24:10 -07:00
2013-10-10 18:29:57 -07:00
// Set vertex and fragment shaders.
bgfx : : setProgram ( program ) ;
2012-10-08 23:24:10 -07:00
2013-10-10 18:29:57 -07:00
// Set vertex and index buffer.
bgfx : : setVertexBuffer ( vbh ) ;
bgfx : : setIndexBuffer ( ibh ) ;
2012-10-08 23:24:10 -07:00
2013-10-10 18:29:57 -07:00
// Set instance data buffer.
bgfx : : setInstanceDataBuffer ( idb ) ;
2012-10-08 23:24:10 -07:00
2013-10-10 18:29:57 -07:00
// Set render states.
bgfx : : setState ( BGFX_STATE_DEFAULT ) ;
2012-10-08 23:24:10 -07:00
2013-10-10 18:29:57 -07:00
// Submit primitive for rendering to view 0.
bgfx : : submit ( 0 ) ;
}
2012-10-13 22:21:02 -07:00
}
2012-10-08 23:24:10 -07:00
// Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives.
bgfx : : frame ( ) ;
}
// Cleanup.
bgfx : : destroyIndexBuffer ( ibh ) ;
bgfx : : destroyVertexBuffer ( vbh ) ;
bgfx : : destroyProgram ( program ) ;
// Shutdown bgfx.
bgfx : : shutdown ( ) ;
return 0 ;
}