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
}
}
2016-03-06 15:29:22 -08:00
class ExampleRaymarch : 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
2012-10-07 20:41:18 -07:00
{
2016-03-06 15:29:22 -08:00
Args args ( _argc , _argv ) ;
m_width = 1280 ;
m_height = 720 ;
m_debug = BGFX_DEBUG_TEXT ;
m_reset = BGFX_RESET_VSYNC ;
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 ( ) ;
2012-10-07 20:41:18 -07:00
}
2016-03-06 15:29:22 -08:00
int shutdown ( ) BX_OVERRIDE
{
// Cleanup.
bgfx : : destroyProgram ( m_program ) ;
2014-05-03 15:18:28 -07:00
2016-03-06 15:29:22 -08:00
bgfx : : destroyUniform ( u_mtx ) ;
bgfx : : destroyUniform ( u_lightDirTime ) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
// Shutdown bgfx.
bgfx : : shutdown ( ) ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
return 0 ;
}
2013-04-25 23:30:56 -07:00
2016-03-06 15:29:22 -08:00
bool update ( ) BX_OVERRIDE
2013-02-21 21:07:31 -08:00
{
2016-03-06 15:29:22 -08:00
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 ) ;
// Set view 1 default viewport.
bgfx : : setViewRect ( 1 , 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 viewZ 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 ;
// 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 ;
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 ;
bgfx : : UniformHandle u_mtx ;
bgfx : : UniformHandle u_lightDirTime ;
bgfx : : ProgramHandle m_program ;
} ;
2012-10-07 20:41:18 -07:00
2016-03-06 15:29:22 -08:00
ENTRY_IMPLEMENT_MAIN ( ExampleRaymarch ) ;