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
2012-10-07 21:04:03 -07:00
struct PosColorTexCoord0Vertex
{
float m_x ;
float m_y ;
float m_z ;
uint32_t m_abgr ;
float m_u ;
float m_v ;
2012-10-07 20:41:18 -07:00
2014-05-03 15:18:28 -07:00
static void init ( )
2012-10-07 20:41:18 -07:00
{
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 )
. add ( bgfx : : Attrib : : TexCoord0 , 2 , bgfx : : AttribType : : Float )
. end ( ) ;
2012-10-07 20:41:18 -07:00
}
2014-05-03 15:18:28 -07:00
static bgfx : : VertexDecl ms_decl ;
} ;
2012-10-07 20:41:18 -07:00
2014-05-03 15:18:28 -07:00
bgfx : : VertexDecl PosColorTexCoord0Vertex : : ms_decl ;
2012-10-07 20:41:18 -07:00
2014-10-06 07:03:41 +02:00
static bool s_oglNdc = false ;
inline void mtxProj ( float * _result , float _fovy , float _aspect , float _near , float _far )
{
bx : : mtxProj ( _result , _fovy , _aspect , _near , _far , s_oglNdc ) ;
}
2012-10-07 20:41:18 -07:00
void renderScreenSpaceQuad ( uint32_t _view , bgfx : : ProgramHandle _program , float _x , float _y , float _width , float _height )
{
2012-11-11 13:12:16 -08:00
bgfx : : TransientVertexBuffer tvb ;
bgfx : : TransientIndexBuffer tib ;
2012-10-07 20:41:18 -07:00
2014-05-19 22:08:35 -07:00
if ( bgfx : : allocTransientBuffers ( & tvb , PosColorTexCoord0Vertex : : ms_decl , 4 , & tib , 6 ) )
2012-10-07 20:41:18 -07:00
{
2012-11-11 13:12:16 -08:00
PosColorTexCoord0Vertex * vertex = ( PosColorTexCoord0Vertex * ) tvb . data ;
2012-10-07 20:41:18 -07:00
float zz = 0.0f ;
const float minx = _x ;
const float maxx = _x + _width ;
const float miny = _y ;
const float maxy = _y + _height ;
float minu = - 1.0f ;
float minv = - 1.0f ;
float maxu = 1.0f ;
float maxv = 1.0f ;
vertex [ 0 ] . m_x = minx ;
vertex [ 0 ] . m_y = miny ;
vertex [ 0 ] . m_z = zz ;
vertex [ 0 ] . m_abgr = 0xff0000ff ;
vertex [ 0 ] . m_u = minu ;
vertex [ 0 ] . m_v = minv ;
vertex [ 1 ] . m_x = maxx ;
vertex [ 1 ] . m_y = miny ;
vertex [ 1 ] . m_z = zz ;
vertex [ 1 ] . m_abgr = 0xff00ff00 ;
vertex [ 1 ] . m_u = maxu ;
vertex [ 1 ] . m_v = minv ;
vertex [ 2 ] . m_x = maxx ;
vertex [ 2 ] . m_y = maxy ;
vertex [ 2 ] . m_z = zz ;
vertex [ 2 ] . m_abgr = 0xffff0000 ;
vertex [ 2 ] . m_u = maxu ;
vertex [ 2 ] . m_v = maxv ;
vertex [ 3 ] . m_x = minx ;
vertex [ 3 ] . m_y = maxy ;
vertex [ 3 ] . m_z = zz ;
vertex [ 3 ] . m_abgr = 0xffffffff ;
vertex [ 3 ] . m_u = minu ;
vertex [ 3 ] . m_v = maxv ;
2012-11-11 13:12:16 -08:00
uint16_t * indices = ( uint16_t * ) tib . data ;
2012-10-07 20:41:18 -07:00
indices [ 0 ] = 0 ;
2013-02-21 22:05:33 -08:00
indices [ 1 ] = 2 ;
indices [ 2 ] = 1 ;
2012-10-07 20:41:18 -07:00
indices [ 3 ] = 0 ;
2013-02-21 22:05:33 -08:00
indices [ 4 ] = 3 ;
indices [ 5 ] = 2 ;
2012-10-07 20:41:18 -07:00
2013-02-21 22:05:33 -08:00
bgfx : : setState ( BGFX_STATE_DEFAULT ) ;
2012-11-11 13:12:16 -08:00
bgfx : : setIndexBuffer ( & tib ) ;
bgfx : : setVertexBuffer ( & tvb ) ;
2015-07-22 18:05:11 -07:00
bgfx : : submit ( _view , _program ) ;
2012-10-07 20:41:18 -07:00
}
}
2015-10-23 20:52:22 -07:00
int _main_ ( int _argc , char * * _argv )
2012-10-07 20:41:18 -07:00
{
2015-10-23 20:52:22 -07:00
Args args ( _argc , _argv ) ;
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
2015-10-23 20:52:22 -07:00
bgfx : : init ( args . m_type , args . m_pciId ) ;
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-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
) ;
2015-05-28 15:27:00 -07:00
// Setup root path for binary shaders. Shader binaries are different
2012-10-07 20:41:18 -07:00
// for each renderer.
switch ( bgfx : : getRendererType ( ) )
{
2012-11-03 21:29:41 -07:00
default :
2012-10-07 20:41:18 -07:00
break ;
case bgfx : : RendererType : : OpenGL :
2014-03-29 23:12:15 -07:00
case bgfx : : RendererType : : OpenGLES :
2014-10-06 07:03:41 +02:00
s_oglNdc = true ;
2012-10-07 20:41:18 -07:00
break ;
}
// Create vertex stream declaration.
2014-05-03 15:18:28 -07:00
PosColorTexCoord0Vertex : : init ( ) ;
2015-05-28 15:27:00 -07:00
bgfx : : UniformHandle u_mtx = bgfx : : createUniform ( " u_mtx " , bgfx : : UniformType : : Mat4 ) ;
bgfx : : UniformHandle u_lightDirTime = bgfx : : createUniform ( " u_lightDirTime " , bgfx : : UniformType : : Vec4 ) ;
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 raymarching = loadProgram ( " vs_raymarching " , " fs_raymarching " ) ;
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 ) )
2013-02-21 21:07:31 -08:00
{
// Set view 0 default viewport.
bgfx : : setViewRect ( 0 , 0 , 0 , width , height ) ;
// Set view 1 default viewport.
bgfx : : setViewRect ( 1 , 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 viewZ 0.
2015-07-22 18:05:11 -07:00
bgfx : : touch ( 0 ) ;
2012-10-07 20:41:18 -07:00
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 " ) ;
2012-11-10 19:59:23 -08:00
bgfx : : dbgTextPrintf ( 0 , 2 , 0x6f , " Description: Updating shader uniforms. " ) ;
2012-10-07 20:41:18 -07:00
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 } ;
2015-05-28 15:27:00 -07:00
2012-10-07 20:41:18 -07:00
float view [ 16 ] ;
float proj [ 16 ] ;
2014-05-26 19:31:37 -07:00
bx : : mtxLookAt ( view , eye , at ) ;
2014-10-06 07:03:41 +02:00
mtxProj ( proj , 60.0f , float ( width ) / float ( height ) , 0.1f , 100.0f ) ;
2012-10-07 20:41:18 -07:00
// Set view and projection matrix for view 1.
bgfx : : setViewTransform ( 0 , view , proj ) ;
float ortho [ 16 ] ;
2014-05-26 19:31:37 -07:00
bx : : mtxOrtho ( ortho , 0.0f , 1280.0f , 720.0f , 0.0f , 0.0f , 100.0f ) ;
2012-10-07 20:41:18 -07:00
// Set view and projection matrix for view 0.
bgfx : : setViewTransform ( 1 , NULL , ortho ) ;
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
float vp [ 16 ] ;
2014-05-26 19:31:37 -07:00
bx : : mtxMul ( vp , view , proj ) ;
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
, time
, time * 0.37f
2015-05-28 15:27:00 -07:00
) ;
2012-10-07 20:41:18 -07:00
2012-10-08 23:24:10 -07:00
float mtxInv [ 16 ] ;
2014-05-26 19:31:37 -07:00
bx : : mtxInverse ( mtxInv , mtx ) ;
2012-10-08 23:24:10 -07:00
float lightDirModel [ 4 ] = { - 0.4f , - 0.5f , - 1.0f , 0.0f } ;
2013-04-13 11:38:51 -07:00
float lightDirModelN [ 4 ] = { 0.0f , 0.0f , 0.0f , 0.0f } ;
2014-05-26 19:31:37 -07:00
bx : : vec3Norm ( lightDirModelN , lightDirModel ) ;
2015-05-28 15:27:00 -07:00
float lightDirTime [ 4 ] ;
bx : : vec4MulMtx ( lightDirTime , lightDirModelN , mtxInv ) ;
lightDirTime [ 3 ] = time ;
bgfx : : setUniform ( u_lightDirTime , lightDirTime ) ;
2012-10-07 20:41:18 -07:00
float mvp [ 16 ] ;
2014-05-26 19:31:37 -07:00
bx : : mtxMul ( mvp , mtx , vp ) ;
2012-10-07 20:41:18 -07:00
float invMvp [ 16 ] ;
2014-05-26 19:31:37 -07:00
bx : : mtxInverse ( invMvp , mvp ) ;
2012-10-07 20:41:18 -07:00
bgfx : : setUniform ( u_mtx , invMvp ) ;
renderScreenSpaceQuad ( 1 , raymarching , 0.0f , 0.0f , 1280.0f , 720.0f ) ;
2015-05-28 15:27:00 -07:00
// Advance to next frame. Rendering thread will be kicked to
2012-10-07 20:41:18 -07:00
// process submitted rendering primitives.
bgfx : : frame ( ) ;
}
// Cleanup.
bgfx : : destroyProgram ( raymarching ) ;
bgfx : : destroyUniform ( u_mtx ) ;
2015-05-28 15:27:00 -07:00
bgfx : : destroyUniform ( u_lightDirTime ) ;
2012-10-07 20:41:18 -07:00
// Shutdown bgfx.
bgfx : : shutdown ( ) ;
return 0 ;
}