2012-09-16 17:36:08 -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-09-16 17:36:08 -07:00
*/
2013-05-23 22:07:54 -07:00
# include "common.h"
2015-10-23 20:52:22 -07:00
# include "bgfx_utils.h"
2012-09-16 17:36:08 -07:00
2013-05-20 20:10:52 -07:00
// embedded shaders
# include "vs_metaballs.bin.h"
# include "fs_metaballs.bin.h"
2012-09-16 17:36:08 -07:00
struct PosNormalColorVertex
{
float m_pos [ 3 ] ;
float m_normal [ 3 ] ;
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 : : Normal , 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-09-16 17:36:08 -07:00
} ;
2014-05-03 15:18:28 -07:00
bgfx : : VertexDecl PosNormalColorVertex : : ms_decl ;
2012-09-16 17:36:08 -07:00
struct Grid
{
Grid ( )
: m_val ( 0.0f )
{
m_normal [ 0 ] = 0.0f ;
m_normal [ 1 ] = 0.0f ;
m_normal [ 2 ] = 0.0f ;
}
float m_val ;
float m_normal [ 3 ] ;
} ;
// Triangulation tables taken from:
// http://paulbourke.net/geometry/polygonise/
static const uint16_t s_edges [ 256 ] =
{
0x000 , 0x109 , 0x203 , 0x30a , 0x406 , 0x50f , 0x605 , 0x70c ,
0x80c , 0x905 , 0xa0f , 0xb06 , 0xc0a , 0xd03 , 0xe09 , 0xf00 ,
0x190 , 0x099 , 0x393 , 0x29a , 0x596 , 0x49f , 0x795 , 0x69c ,
0x99c , 0x895 , 0xb9f , 0xa96 , 0xd9a , 0xc93 , 0xf99 , 0xe90 ,
0x230 , 0x339 , 0x033 , 0x13a , 0x636 , 0x73f , 0x435 , 0x53c ,
0xa3c , 0xb35 , 0x83f , 0x936 , 0xe3a , 0xf33 , 0xc39 , 0xd30 ,
0x3a0 , 0x2a9 , 0x1a3 , 0x0aa , 0x7a6 , 0x6af , 0x5a5 , 0x4ac ,
0xbac , 0xaa5 , 0x9af , 0x8a6 , 0xfaa , 0xea3 , 0xda9 , 0xca0 ,
0x460 , 0x569 , 0x663 , 0x76a , 0x66 , 0x16f , 0x265 , 0x36c ,
0xc6c , 0xd65 , 0xe6f , 0xf66 , 0x86a , 0x963 , 0xa69 , 0xb60 ,
0x5f0 , 0x4f9 , 0x7f3 , 0x6fa , 0x1f6 , 0x0ff , 0x3f5 , 0x2fc ,
0xdfc , 0xcf5 , 0xfff , 0xef6 , 0x9fa , 0x8f3 , 0xbf9 , 0xaf0 ,
0x650 , 0x759 , 0x453 , 0x55a , 0x256 , 0x35f , 0x055 , 0x15c ,
0xe5c , 0xf55 , 0xc5f , 0xd56 , 0xa5a , 0xb53 , 0x859 , 0x950 ,
0x7c0 , 0x6c9 , 0x5c3 , 0x4ca , 0x3c6 , 0x2cf , 0x1c5 , 0x0cc ,
0xfcc , 0xec5 , 0xdcf , 0xcc6 , 0xbca , 0xac3 , 0x9c9 , 0x8c0 ,
0x8c0 , 0x9c9 , 0xac3 , 0xbca , 0xcc6 , 0xdcf , 0xec5 , 0xfcc ,
0x0cc , 0x1c5 , 0x2cf , 0x3c6 , 0x4ca , 0x5c3 , 0x6c9 , 0x7c0 ,
0x950 , 0x859 , 0xb53 , 0xa5a , 0xd56 , 0xc5f , 0xf55 , 0xe5c ,
0x15c , 0x55 , 0x35f , 0x256 , 0x55a , 0x453 , 0x759 , 0x650 ,
0xaf0 , 0xbf9 , 0x8f3 , 0x9fa , 0xef6 , 0xfff , 0xcf5 , 0xdfc ,
0x2fc , 0x3f5 , 0x0ff , 0x1f6 , 0x6fa , 0x7f3 , 0x4f9 , 0x5f0 ,
0xb60 , 0xa69 , 0x963 , 0x86a , 0xf66 , 0xe6f , 0xd65 , 0xc6c ,
0x36c , 0x265 , 0x16f , 0x066 , 0x76a , 0x663 , 0x569 , 0x460 ,
0xca0 , 0xda9 , 0xea3 , 0xfaa , 0x8a6 , 0x9af , 0xaa5 , 0xbac ,
0x4ac , 0x5a5 , 0x6af , 0x7a6 , 0x0aa , 0x1a3 , 0x2a9 , 0x3a0 ,
0xd30 , 0xc39 , 0xf33 , 0xe3a , 0x936 , 0x83f , 0xb35 , 0xa3c ,
0x53c , 0x435 , 0x73f , 0x636 , 0x13a , 0x033 , 0x339 , 0x230 ,
0xe90 , 0xf99 , 0xc93 , 0xd9a , 0xa96 , 0xb9f , 0x895 , 0x99c ,
0x69c , 0x795 , 0x49f , 0x596 , 0x29a , 0x393 , 0x099 , 0x190 ,
0xf00 , 0xe09 , 0xd03 , 0xc0a , 0xb06 , 0xa0f , 0x905 , 0x80c ,
0x70c , 0x605 , 0x50f , 0x406 , 0x30a , 0x203 , 0x109 , 0x000 ,
} ;
static const int8_t s_indices [ 256 ] [ 16 ] =
{
{ - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 1 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 8 , 3 , 9 , 8 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 3 , 1 , 2 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 2 , 10 , 0 , 2 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 8 , 3 , 2 , 10 , 8 , 10 , 9 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 11 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 11 , 2 , 8 , 11 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 9 , 0 , 2 , 3 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 11 , 2 , 1 , 9 , 11 , 9 , 8 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 10 , 1 , 11 , 10 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 10 , 1 , 0 , 8 , 10 , 8 , 11 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 9 , 0 , 3 , 11 , 9 , 11 , 10 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 8 , 10 , 10 , 8 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 7 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 3 , 0 , 7 , 3 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 1 , 9 , 8 , 4 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 1 , 9 , 4 , 7 , 1 , 7 , 3 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 10 , 8 , 4 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 4 , 7 , 3 , 0 , 4 , 1 , 2 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 2 , 10 , 9 , 0 , 2 , 8 , 4 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 10 , 9 , 2 , 9 , 7 , 2 , 7 , 3 , 7 , 9 , 4 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 4 , 7 , 3 , 11 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 4 , 7 , 11 , 2 , 4 , 2 , 0 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 0 , 1 , 8 , 4 , 7 , 2 , 3 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 7 , 11 , 9 , 4 , 11 , 9 , 11 , 2 , 9 , 2 , 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 10 , 1 , 3 , 11 , 10 , 7 , 8 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 11 , 10 , 1 , 4 , 11 , 1 , 0 , 4 , 7 , 11 , 4 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 7 , 8 , 9 , 0 , 11 , 9 , 11 , 10 , 11 , 0 , 3 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 7 , 11 , 4 , 11 , 9 , 9 , 11 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 4 , 0 , 8 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 5 , 4 , 1 , 5 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 5 , 4 , 8 , 3 , 5 , 3 , 1 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 10 , 9 , 5 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 0 , 8 , 1 , 2 , 10 , 4 , 9 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 2 , 10 , 5 , 4 , 2 , 4 , 0 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 10 , 5 , 3 , 2 , 5 , 3 , 5 , 4 , 3 , 4 , 8 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 4 , 2 , 3 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 11 , 2 , 0 , 8 , 11 , 4 , 9 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 5 , 4 , 0 , 1 , 5 , 2 , 3 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 1 , 5 , 2 , 5 , 8 , 2 , 8 , 11 , 4 , 8 , 5 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 3 , 11 , 10 , 1 , 3 , 9 , 5 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 9 , 5 , 0 , 8 , 1 , 8 , 10 , 1 , 8 , 11 , 10 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 4 , 0 , 5 , 0 , 11 , 5 , 11 , 10 , 11 , 0 , 3 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 4 , 8 , 5 , 8 , 10 , 10 , 8 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 7 , 8 , 5 , 7 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 3 , 0 , 9 , 5 , 3 , 5 , 7 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 7 , 8 , 0 , 1 , 7 , 1 , 5 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 5 , 3 , 3 , 5 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 7 , 8 , 9 , 5 , 7 , 10 , 1 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 1 , 2 , 9 , 5 , 0 , 5 , 3 , 0 , 5 , 7 , 3 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 0 , 2 , 8 , 2 , 5 , 8 , 5 , 7 , 10 , 5 , 2 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 10 , 5 , 2 , 5 , 3 , 3 , 5 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 9 , 5 , 7 , 8 , 9 , 3 , 11 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 7 , 9 , 7 , 2 , 9 , 2 , 0 , 2 , 7 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 3 , 11 , 0 , 1 , 8 , 1 , 7 , 8 , 1 , 5 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 2 , 1 , 11 , 1 , 7 , 7 , 1 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 8 , 8 , 5 , 7 , 10 , 1 , 3 , 10 , 3 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 7 , 0 , 5 , 0 , 9 , 7 , 11 , 0 , 1 , 0 , 10 , 11 , 10 , 0 , - 1 } ,
{ 11 , 10 , 0 , 11 , 0 , 3 , 10 , 5 , 0 , 8 , 0 , 7 , 5 , 7 , 0 , - 1 } ,
{ 11 , 10 , 5 , 7 , 11 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 6 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 3 , 5 , 10 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 0 , 1 , 5 , 10 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 8 , 3 , 1 , 9 , 8 , 5 , 10 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 6 , 5 , 2 , 6 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 6 , 5 , 1 , 2 , 6 , 3 , 0 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 6 , 5 , 9 , 0 , 6 , 0 , 2 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 9 , 8 , 5 , 8 , 2 , 5 , 2 , 6 , 3 , 2 , 8 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 3 , 11 , 10 , 6 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 0 , 8 , 11 , 2 , 0 , 10 , 6 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 1 , 9 , 2 , 3 , 11 , 5 , 10 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 10 , 6 , 1 , 9 , 2 , 9 , 11 , 2 , 9 , 8 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 3 , 11 , 6 , 5 , 3 , 5 , 1 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 11 , 0 , 11 , 5 , 0 , 5 , 1 , 5 , 11 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 11 , 6 , 0 , 3 , 6 , 0 , 6 , 5 , 0 , 5 , 9 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 5 , 9 , 6 , 9 , 11 , 11 , 9 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 10 , 6 , 4 , 7 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 3 , 0 , 4 , 7 , 3 , 6 , 5 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 9 , 0 , 5 , 10 , 6 , 8 , 4 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 6 , 5 , 1 , 9 , 7 , 1 , 7 , 3 , 7 , 9 , 4 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 1 , 2 , 6 , 5 , 1 , 4 , 7 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 5 , 5 , 2 , 6 , 3 , 0 , 4 , 3 , 4 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 4 , 7 , 9 , 0 , 5 , 0 , 6 , 5 , 0 , 2 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 3 , 9 , 7 , 9 , 4 , 3 , 2 , 9 , 5 , 9 , 6 , 2 , 6 , 9 , - 1 } ,
{ 3 , 11 , 2 , 7 , 8 , 4 , 10 , 6 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 10 , 6 , 4 , 7 , 2 , 4 , 2 , 0 , 2 , 7 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 1 , 9 , 4 , 7 , 8 , 2 , 3 , 11 , 5 , 10 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 2 , 1 , 9 , 11 , 2 , 9 , 4 , 11 , 7 , 11 , 4 , 5 , 10 , 6 , - 1 } ,
{ 8 , 4 , 7 , 3 , 11 , 5 , 3 , 5 , 1 , 5 , 11 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 1 , 11 , 5 , 11 , 6 , 1 , 0 , 11 , 7 , 11 , 4 , 0 , 4 , 11 , - 1 } ,
{ 0 , 5 , 9 , 0 , 6 , 5 , 0 , 3 , 6 , 11 , 6 , 3 , 8 , 4 , 7 , - 1 } ,
{ 6 , 5 , 9 , 6 , 9 , 11 , 4 , 7 , 9 , 7 , 11 , 9 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 4 , 9 , 6 , 4 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 10 , 6 , 4 , 9 , 10 , 0 , 8 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 0 , 1 , 10 , 6 , 0 , 6 , 4 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 3 , 1 , 8 , 1 , 6 , 8 , 6 , 4 , 6 , 1 , 10 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 4 , 9 , 1 , 2 , 4 , 2 , 6 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 0 , 8 , 1 , 2 , 9 , 2 , 4 , 9 , 2 , 6 , 4 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 2 , 4 , 4 , 2 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 3 , 2 , 8 , 2 , 4 , 4 , 2 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 4 , 9 , 10 , 6 , 4 , 11 , 2 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 2 , 2 , 8 , 11 , 4 , 9 , 10 , 4 , 10 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 11 , 2 , 0 , 1 , 6 , 0 , 6 , 4 , 6 , 1 , 10 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 4 , 1 , 6 , 1 , 10 , 4 , 8 , 1 , 2 , 1 , 11 , 8 , 11 , 1 , - 1 } ,
{ 9 , 6 , 4 , 9 , 3 , 6 , 9 , 1 , 3 , 11 , 6 , 3 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 11 , 1 , 8 , 1 , 0 , 11 , 6 , 1 , 9 , 1 , 4 , 6 , 4 , 1 , - 1 } ,
{ 3 , 11 , 6 , 3 , 6 , 0 , 0 , 6 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 4 , 8 , 11 , 6 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 10 , 6 , 7 , 8 , 10 , 8 , 9 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 7 , 3 , 0 , 10 , 7 , 0 , 9 , 10 , 6 , 7 , 10 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 6 , 7 , 1 , 10 , 7 , 1 , 7 , 8 , 1 , 8 , 0 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 6 , 7 , 10 , 7 , 1 , 1 , 7 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 6 , 1 , 6 , 8 , 1 , 8 , 9 , 8 , 6 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 6 , 9 , 2 , 9 , 1 , 6 , 7 , 9 , 0 , 9 , 3 , 7 , 3 , 9 , - 1 } ,
{ 7 , 8 , 0 , 7 , 0 , 6 , 6 , 0 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 3 , 2 , 6 , 7 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 3 , 11 , 10 , 6 , 8 , 10 , 8 , 9 , 8 , 6 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 0 , 7 , 2 , 7 , 11 , 0 , 9 , 7 , 6 , 7 , 10 , 9 , 10 , 7 , - 1 } ,
{ 1 , 8 , 0 , 1 , 7 , 8 , 1 , 10 , 7 , 6 , 7 , 10 , 2 , 3 , 11 , - 1 } ,
{ 11 , 2 , 1 , 11 , 1 , 7 , 10 , 6 , 1 , 6 , 7 , 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 9 , 6 , 8 , 6 , 7 , 9 , 1 , 6 , 11 , 6 , 3 , 1 , 3 , 6 , - 1 } ,
{ 0 , 9 , 1 , 11 , 6 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 8 , 0 , 7 , 0 , 6 , 3 , 11 , 0 , 11 , 6 , 0 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 11 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 6 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 0 , 8 , 11 , 7 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 1 , 9 , 11 , 7 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 1 , 9 , 8 , 3 , 1 , 11 , 7 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 1 , 2 , 6 , 11 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 10 , 3 , 0 , 8 , 6 , 11 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 9 , 0 , 2 , 10 , 9 , 6 , 11 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 11 , 7 , 2 , 10 , 3 , 10 , 8 , 3 , 10 , 9 , 8 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 2 , 3 , 6 , 2 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 0 , 8 , 7 , 6 , 0 , 6 , 2 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 7 , 6 , 2 , 3 , 7 , 0 , 1 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 6 , 2 , 1 , 8 , 6 , 1 , 9 , 8 , 8 , 7 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 7 , 6 , 10 , 1 , 7 , 1 , 3 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 7 , 6 , 1 , 7 , 10 , 1 , 8 , 7 , 1 , 0 , 8 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 3 , 7 , 0 , 7 , 10 , 0 , 10 , 9 , 6 , 10 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 6 , 10 , 7 , 10 , 8 , 8 , 10 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 8 , 4 , 11 , 8 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 6 , 11 , 3 , 0 , 6 , 0 , 4 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 6 , 11 , 8 , 4 , 6 , 9 , 0 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 4 , 6 , 9 , 6 , 3 , 9 , 3 , 1 , 11 , 3 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 8 , 4 , 6 , 11 , 8 , 2 , 10 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 10 , 3 , 0 , 11 , 0 , 6 , 11 , 0 , 4 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 11 , 8 , 4 , 6 , 11 , 0 , 2 , 9 , 2 , 10 , 9 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 9 , 3 , 10 , 3 , 2 , 9 , 4 , 3 , 11 , 3 , 6 , 4 , 6 , 3 , - 1 } ,
{ 8 , 2 , 3 , 8 , 4 , 2 , 4 , 6 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 4 , 2 , 4 , 6 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 9 , 0 , 2 , 3 , 4 , 2 , 4 , 6 , 4 , 3 , 8 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 9 , 4 , 1 , 4 , 2 , 2 , 4 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 1 , 3 , 8 , 6 , 1 , 8 , 4 , 6 , 6 , 10 , 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 1 , 0 , 10 , 0 , 6 , 6 , 0 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 6 , 3 , 4 , 3 , 8 , 6 , 10 , 3 , 0 , 3 , 9 , 10 , 9 , 3 , - 1 } ,
{ 10 , 9 , 4 , 6 , 10 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 9 , 5 , 7 , 6 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 3 , 4 , 9 , 5 , 11 , 7 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 0 , 1 , 5 , 4 , 0 , 7 , 6 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 7 , 6 , 8 , 3 , 4 , 3 , 5 , 4 , 3 , 1 , 5 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 4 , 10 , 1 , 2 , 7 , 6 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 11 , 7 , 1 , 2 , 10 , 0 , 8 , 3 , 4 , 9 , 5 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 6 , 11 , 5 , 4 , 10 , 4 , 2 , 10 , 4 , 0 , 2 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 4 , 8 , 3 , 5 , 4 , 3 , 2 , 5 , 10 , 5 , 2 , 11 , 7 , 6 , - 1 } ,
{ 7 , 2 , 3 , 7 , 6 , 2 , 5 , 4 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 4 , 0 , 8 , 6 , 0 , 6 , 2 , 6 , 8 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 6 , 2 , 3 , 7 , 6 , 1 , 5 , 0 , 5 , 4 , 0 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 2 , 8 , 6 , 8 , 7 , 2 , 1 , 8 , 4 , 8 , 5 , 1 , 5 , 8 , - 1 } ,
{ 9 , 5 , 4 , 10 , 1 , 6 , 1 , 7 , 6 , 1 , 3 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 6 , 10 , 1 , 7 , 6 , 1 , 0 , 7 , 8 , 7 , 0 , 9 , 5 , 4 , - 1 } ,
{ 4 , 0 , 10 , 4 , 10 , 5 , 0 , 3 , 10 , 6 , 10 , 7 , 3 , 7 , 10 , - 1 } ,
{ 7 , 6 , 10 , 7 , 10 , 8 , 5 , 4 , 10 , 4 , 8 , 10 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 9 , 5 , 6 , 11 , 9 , 11 , 8 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 6 , 11 , 0 , 6 , 3 , 0 , 5 , 6 , 0 , 9 , 5 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 11 , 8 , 0 , 5 , 11 , 0 , 1 , 5 , 5 , 6 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 6 , 11 , 3 , 6 , 3 , 5 , 5 , 3 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 10 , 9 , 5 , 11 , 9 , 11 , 8 , 11 , 5 , 6 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 11 , 3 , 0 , 6 , 11 , 0 , 9 , 6 , 5 , 6 , 9 , 1 , 2 , 10 , - 1 } ,
{ 11 , 8 , 5 , 11 , 5 , 6 , 8 , 0 , 5 , 10 , 5 , 2 , 0 , 2 , 5 , - 1 } ,
{ 6 , 11 , 3 , 6 , 3 , 5 , 2 , 10 , 3 , 10 , 5 , 3 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 8 , 9 , 5 , 2 , 8 , 5 , 6 , 2 , 3 , 8 , 2 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 5 , 6 , 9 , 6 , 0 , 0 , 6 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 5 , 8 , 1 , 8 , 0 , 5 , 6 , 8 , 3 , 8 , 2 , 6 , 2 , 8 , - 1 } ,
{ 1 , 5 , 6 , 2 , 1 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 3 , 6 , 1 , 6 , 10 , 3 , 8 , 6 , 5 , 6 , 9 , 8 , 9 , 6 , - 1 } ,
{ 10 , 1 , 0 , 10 , 0 , 6 , 9 , 5 , 0 , 5 , 6 , 0 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 3 , 8 , 5 , 6 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 5 , 6 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 5 , 10 , 7 , 5 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 5 , 10 , 11 , 7 , 5 , 8 , 3 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 11 , 7 , 5 , 10 , 11 , 1 , 9 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 7 , 5 , 10 , 11 , 7 , 9 , 8 , 1 , 8 , 3 , 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 1 , 2 , 11 , 7 , 1 , 7 , 5 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 3 , 1 , 2 , 7 , 1 , 7 , 5 , 7 , 2 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 7 , 5 , 9 , 2 , 7 , 9 , 0 , 2 , 2 , 11 , 7 , - 1 , - 1 , - 1 , - 1 } ,
{ 7 , 5 , 2 , 7 , 2 , 11 , 5 , 9 , 2 , 3 , 2 , 8 , 9 , 8 , 2 , - 1 } ,
{ 2 , 5 , 10 , 2 , 3 , 5 , 3 , 7 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 2 , 0 , 8 , 5 , 2 , 8 , 7 , 5 , 10 , 2 , 5 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 0 , 1 , 5 , 10 , 3 , 5 , 3 , 7 , 3 , 10 , 2 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 8 , 2 , 9 , 2 , 1 , 8 , 7 , 2 , 10 , 2 , 5 , 7 , 5 , 2 , - 1 } ,
{ 1 , 3 , 5 , 3 , 7 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 7 , 0 , 7 , 1 , 1 , 7 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 0 , 3 , 9 , 3 , 5 , 5 , 3 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 8 , 7 , 5 , 9 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 8 , 4 , 5 , 10 , 8 , 10 , 11 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 0 , 4 , 5 , 11 , 0 , 5 , 10 , 11 , 11 , 3 , 0 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 1 , 9 , 8 , 4 , 10 , 8 , 10 , 11 , 10 , 4 , 5 , - 1 , - 1 , - 1 , - 1 } ,
{ 10 , 11 , 4 , 10 , 4 , 5 , 11 , 3 , 4 , 9 , 4 , 1 , 3 , 1 , 4 , - 1 } ,
{ 2 , 5 , 1 , 2 , 8 , 5 , 2 , 11 , 8 , 4 , 5 , 8 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 4 , 11 , 0 , 11 , 3 , 4 , 5 , 11 , 2 , 11 , 1 , 5 , 1 , 11 , - 1 } ,
{ 0 , 2 , 5 , 0 , 5 , 9 , 2 , 11 , 5 , 4 , 5 , 8 , 11 , 8 , 5 , - 1 } ,
{ 9 , 4 , 5 , 2 , 11 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 5 , 10 , 3 , 5 , 2 , 3 , 4 , 5 , 3 , 8 , 4 , - 1 , - 1 , - 1 , - 1 } ,
{ 5 , 10 , 2 , 5 , 2 , 4 , 4 , 2 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 10 , 2 , 3 , 5 , 10 , 3 , 8 , 5 , 4 , 5 , 8 , 0 , 1 , 9 , - 1 } ,
{ 5 , 10 , 2 , 5 , 2 , 4 , 1 , 9 , 2 , 9 , 4 , 2 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 4 , 5 , 8 , 5 , 3 , 3 , 5 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 4 , 5 , 1 , 0 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 8 , 4 , 5 , 8 , 5 , 3 , 9 , 0 , 5 , 0 , 3 , 5 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 4 , 5 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 11 , 7 , 4 , 9 , 11 , 9 , 10 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 8 , 3 , 4 , 9 , 7 , 9 , 11 , 7 , 9 , 10 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 10 , 11 , 1 , 11 , 4 , 1 , 4 , 0 , 7 , 4 , 11 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 1 , 4 , 3 , 4 , 8 , 1 , 10 , 4 , 7 , 4 , 11 , 10 , 11 , 4 , - 1 } ,
{ 4 , 11 , 7 , 9 , 11 , 4 , 9 , 2 , 11 , 9 , 1 , 2 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 7 , 4 , 9 , 11 , 7 , 9 , 1 , 11 , 2 , 11 , 1 , 0 , 8 , 3 , - 1 } ,
{ 11 , 7 , 4 , 11 , 4 , 2 , 2 , 4 , 0 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 11 , 7 , 4 , 11 , 4 , 2 , 8 , 3 , 4 , 3 , 2 , 4 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 9 , 10 , 2 , 7 , 9 , 2 , 3 , 7 , 7 , 4 , 9 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 10 , 7 , 9 , 7 , 4 , 10 , 2 , 7 , 8 , 7 , 0 , 2 , 0 , 7 , - 1 } ,
{ 3 , 7 , 10 , 3 , 10 , 2 , 7 , 4 , 10 , 1 , 10 , 0 , 4 , 0 , 10 , - 1 } ,
{ 1 , 10 , 2 , 8 , 7 , 4 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 9 , 1 , 4 , 1 , 7 , 7 , 1 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 9 , 1 , 4 , 1 , 7 , 0 , 8 , 1 , 8 , 7 , 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 0 , 3 , 7 , 4 , 3 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 4 , 8 , 7 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 10 , 8 , 10 , 11 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 0 , 9 , 3 , 9 , 11 , 11 , 9 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 1 , 10 , 0 , 10 , 8 , 8 , 10 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 1 , 10 , 11 , 3 , 10 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 2 , 11 , 1 , 11 , 9 , 9 , 11 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 0 , 9 , 3 , 9 , 11 , 1 , 2 , 9 , 2 , 11 , 9 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 2 , 11 , 8 , 0 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 3 , 2 , 11 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 3 , 8 , 2 , 8 , 10 , 10 , 8 , 9 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 9 , 10 , 2 , 0 , 9 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 2 , 3 , 8 , 2 , 8 , 10 , 0 , 1 , 8 , 1 , 10 , 8 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 10 , 2 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 1 , 3 , 8 , 9 , 1 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 9 , 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ 0 , 3 , 8 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
{ - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 , - 1 } ,
} ;
static const float s_cube [ 8 ] [ 3 ] =
{
{ 0.0f , 1.0f , 1.0f } , // 0
{ 1.0f , 1.0f , 1.0f } , // 1
{ 1.0f , 1.0f , 0.0f } , // 2
{ 0.0f , 1.0f , 0.0f } , // 3
{ 0.0f , 0.0f , 1.0f } , // 4
{ 1.0f , 0.0f , 1.0f } , // 5
{ 1.0f , 0.0f , 0.0f } , // 6
{ 0.0f , 0.0f , 0.0f } , // 7
} ;
float vertLerp ( float * __restrict _result , float _iso , uint32_t _idx0 , float _v0 , uint32_t _idx1 , float _v1 )
{
const float * __restrict edge0 = s_cube [ _idx0 ] ;
const float * __restrict edge1 = s_cube [ _idx1 ] ;
if ( fabsf ( _iso - _v1 ) < 0.00001f )
{
_result [ 0 ] = edge1 [ 0 ] ;
_result [ 1 ] = edge1 [ 1 ] ;
_result [ 2 ] = edge1 [ 2 ] ;
return 1.0f ;
}
if ( fabsf ( _iso - _v0 ) < 0.00001f
| | fabsf ( _v0 - _v1 ) < 0.00001f )
{
_result [ 0 ] = edge0 [ 0 ] ;
_result [ 1 ] = edge0 [ 1 ] ;
_result [ 2 ] = edge0 [ 2 ] ;
return 0.0f ;
}
float lerp = ( _iso - _v0 ) / ( _v1 - _v0 ) ;
_result [ 0 ] = edge0 [ 0 ] + lerp * ( edge1 [ 0 ] - edge0 [ 0 ] ) ;
_result [ 1 ] = edge0 [ 1 ] + lerp * ( edge1 [ 1 ] - edge0 [ 1 ] ) ;
_result [ 2 ] = edge0 [ 2 ] + lerp * ( edge1 [ 2 ] - edge0 [ 2 ] ) ;
return lerp ;
}
uint32_t triangulate ( uint8_t * _result , uint32_t _stride , const float * __restrict _rgb , const float * __restrict _xyz , const Grid * _val [ 8 ] , float _iso )
{
uint8_t cubeindex = 0 ;
cubeindex | = ( _val [ 0 ] - > m_val < _iso ) ? 0x01 : 0 ;
cubeindex | = ( _val [ 1 ] - > m_val < _iso ) ? 0x02 : 0 ;
cubeindex | = ( _val [ 2 ] - > m_val < _iso ) ? 0x04 : 0 ;
cubeindex | = ( _val [ 3 ] - > m_val < _iso ) ? 0x08 : 0 ;
cubeindex | = ( _val [ 4 ] - > m_val < _iso ) ? 0x10 : 0 ;
cubeindex | = ( _val [ 5 ] - > m_val < _iso ) ? 0x20 : 0 ;
cubeindex | = ( _val [ 6 ] - > m_val < _iso ) ? 0x40 : 0 ;
cubeindex | = ( _val [ 7 ] - > m_val < _iso ) ? 0x80 : 0 ;
if ( 0 = = s_edges [ cubeindex ] )
{
return 0 ;
}
float verts [ 12 ] [ 6 ] ;
uint16_t flags = s_edges [ cubeindex ] ;
for ( uint32_t ii = 0 ; ii < 12 ; + + ii )
{
if ( flags & ( 1 < < ii ) )
{
uint32_t idx0 = ii & 7 ;
uint32_t idx1 = " \ x1 \ x2 \ x3 \ x0 \ x5 \ x6 \ x7 \ x4 \ x4 \ x5 \ x6 \ x7 " [ ii ] ;
float * vertex = verts [ ii ] ;
float lerp = vertLerp ( vertex , _iso , idx0 , _val [ idx0 ] - > m_val , idx1 , _val [ idx1 ] - > m_val ) ;
const float * na = _val [ idx0 ] - > m_normal ;
const float * nb = _val [ idx1 ] - > m_normal ;
vertex [ 3 ] = na [ 0 ] + lerp * ( nb [ 0 ] - na [ 0 ] ) ;
vertex [ 4 ] = na [ 1 ] + lerp * ( nb [ 1 ] - na [ 1 ] ) ;
vertex [ 5 ] = na [ 2 ] + lerp * ( nb [ 2 ] - na [ 2 ] ) ;
}
}
float dr = _rgb [ 3 ] - _rgb [ 0 ] ;
float dg = _rgb [ 4 ] - _rgb [ 1 ] ;
float db = _rgb [ 5 ] - _rgb [ 2 ] ;
uint32_t num = 0 ;
const int8_t * indices = s_indices [ cubeindex ] ;
for ( uint32_t ii = 0 ; indices [ ii ] ! = - 1 ; + + ii )
{
2014-08-27 20:10:39 -07:00
const float * vertex = verts [ uint8_t ( indices [ ii ] ) ] ;
2012-09-16 17:36:08 -07:00
float * xyz = ( float * ) _result ;
xyz [ 0 ] = _xyz [ 0 ] + vertex [ 0 ] ;
xyz [ 1 ] = _xyz [ 1 ] + vertex [ 1 ] ;
xyz [ 2 ] = _xyz [ 2 ] + vertex [ 2 ] ;
xyz [ 3 ] = vertex [ 3 ] ;
xyz [ 4 ] = vertex [ 4 ] ;
xyz [ 5 ] = vertex [ 5 ] ;
uint32_t rr = uint8_t ( ( _rgb [ 0 ] + vertex [ 0 ] * dr ) * 255.0f ) ;
uint32_t gg = uint8_t ( ( _rgb [ 1 ] + vertex [ 1 ] * dg ) * 255.0f ) ;
uint32_t bb = uint8_t ( ( _rgb [ 2 ] + vertex [ 2 ] * db ) * 255.0f ) ;
uint32_t * abgr = ( uint32_t * ) & _result [ 24 ] ;
* abgr = 0xff000000
| ( bb < < 16 )
| ( gg < < 8 )
| rr
;
_result + = _stride ;
+ + num ;
}
return num ;
}
2015-08-21 20:08:03 -07:00
# define DIMS 32
2016-03-06 15:29:22 -08:00
class ExampleMetaballs : public entry : : AppI
2012-09-16 17:36:08 -07:00
{
2015-10-23 20:52:22 -07:00
void init ( int _argc , char * * _argv ) BX_OVERRIDE
2015-08-21 20:08:03 -07:00
{
2015-10-23 20:52:22 -07:00
Args args ( _argc , _argv ) ;
2016-03-06 15:07:35 -08:00
m_width = 1280 ;
2015-08-21 20:08:03 -07:00
m_height = 720 ;
2016-03-06 15:07:35 -08:00
m_debug = BGFX_DEBUG_TEXT ;
m_reset = BGFX_RESET_VSYNC ;
2013-01-16 22:44:51 -08:00
2015-10-23 20:52:22 -07:00
bgfx : : init ( args . m_type , args . m_pciId ) ;
2015-08-21 20:08:03 -07:00
bgfx : : reset ( m_width , m_height , m_reset ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Enable debug text.
bgfx : : setDebug ( m_debug ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Set view 0 clear state.
bgfx : : setViewClear ( 0
, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH
, 0x303030ff
, 1.0f
, 0
) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Create vertex stream declaration.
PosNormalColorVertex : : init ( ) ;
2013-05-20 20:10:52 -07:00
2015-08-21 20:08:03 -07:00
const bgfx : : Memory * vs_metaballs ;
const bgfx : : Memory * fs_metaballs ;
2013-05-20 20:10:52 -07:00
2015-08-21 20:08:03 -07:00
switch ( bgfx : : getRendererType ( ) )
{
case bgfx : : RendererType : : Direct3D9 :
vs_metaballs = bgfx : : makeRef ( vs_metaballs_dx9 , sizeof ( vs_metaballs_dx9 ) ) ;
fs_metaballs = bgfx : : makeRef ( fs_metaballs_dx9 , sizeof ( fs_metaballs_dx9 ) ) ;
break ;
case bgfx : : RendererType : : Direct3D11 :
case bgfx : : RendererType : : Direct3D12 :
vs_metaballs = bgfx : : makeRef ( vs_metaballs_dx11 , sizeof ( vs_metaballs_dx11 ) ) ;
fs_metaballs = bgfx : : makeRef ( fs_metaballs_dx11 , sizeof ( fs_metaballs_dx11 ) ) ;
break ;
2015-10-07 15:05:00 -07:00
case bgfx : : RendererType : : Metal :
vs_metaballs = bgfx : : makeRef ( vs_metaballs_mtl , sizeof ( vs_metaballs_mtl ) ) ;
fs_metaballs = bgfx : : makeRef ( fs_metaballs_mtl , sizeof ( fs_metaballs_mtl ) ) ;
break ;
2015-08-21 20:08:03 -07:00
default :
vs_metaballs = bgfx : : makeRef ( vs_metaballs_glsl , sizeof ( vs_metaballs_glsl ) ) ;
fs_metaballs = bgfx : : makeRef ( fs_metaballs_glsl , sizeof ( fs_metaballs_glsl ) ) ;
break ;
}
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
bgfx : : ShaderHandle vsh = bgfx : : createShader ( vs_metaballs ) ;
bgfx : : ShaderHandle fsh = bgfx : : createShader ( fs_metaballs ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Create program from shaders.
m_program = bgfx : : createProgram ( vsh , fsh , true /* destroy shaders when program is destroyed */ ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
m_grid = new Grid [ DIMS * DIMS * DIMS ] ;
m_timeOffset = bx : : getHPCounter ( ) ;
}
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
int shutdown ( ) BX_OVERRIDE
{
delete [ ] m_grid ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Cleanup.
bgfx : : destroyProgram ( m_program ) ;
2013-04-27 12:43:18 -07:00
2015-08-21 20:08:03 -07:00
// Shutdown bgfx.
bgfx : : shutdown ( ) ;
2014-11-02 00:06:18 -07:00
2015-08-21 20:08:03 -07:00
return 0 ;
}
2014-11-02 00:06:18 -07:00
2015-08-21 20:08:03 -07:00
bool update ( ) BX_OVERRIDE
{
const uint32_t ypitch = DIMS ;
const uint32_t zpitch = DIMS * DIMS ;
const float invdim = 1.0f / float ( DIMS - 1 ) ;
2014-11-02 00:06:18 -07:00
2015-08-21 20:08:03 -07:00
if ( ! entry : : processEvents ( m_width , m_height , m_debug , m_reset ) )
2014-11-02 00:06:18 -07:00
{
2015-08-21 20:08:03 -07:00
// Set view 0 default viewport.
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 ) ( ( now - m_timeOffset ) / double ( bx : : getHPFrequency ( ) ) ) ;
// Use debug font to print information about this example.
bgfx : : dbgTextClear ( ) ;
bgfx : : dbgTextPrintf ( 0 , 1 , 0x4f , " bgfx/examples/02-metaball " ) ;
bgfx : : dbgTextPrintf ( 0 , 2 , 0x6f , " Description: Rendering with transient buffers and embedding shaders. " ) ;
float at [ 3 ] = { 0.0f , 0.0f , 0.0f } ;
float eye [ 3 ] = { 0.0f , 0.0f , - 50.0f } ;
// 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 ) ;
2014-11-02 00:06:18 -07:00
2015-08-21 20:08:03 -07:00
float proj [ 16 ] ;
bx : : mtxProj ( proj , hmd - > eye [ 0 ] . fov , 0.1f , 100.0f ) ;
2014-11-02 00:06:18 -07:00
2015-08-21 20:08:03 -07:00
bgfx : : setViewTransform ( 0 , view , proj ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// 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 ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
float proj [ 16 ] ;
bx : : mtxProj ( proj , 60.0f , float ( m_width ) / float ( m_height ) , 0.1f , 100.0f ) ;
bgfx : : setViewTransform ( 0 , view , proj ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Set view 0 default viewport.
bgfx : : setViewRect ( 0 , 0 , 0 , m_width , m_height ) ;
}
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Stats.
uint32_t numVertices = 0 ;
int64_t profUpdate = 0 ;
int64_t profNormal = 0 ;
int64_t profTriangulate = 0 ;
2015-02-16 21:58:13 -08:00
2015-08-21 20:08:03 -07:00
// Allocate 32K vertices in transient vertex buffer.
uint32_t maxVertices = ( 32 < < 10 ) ;
bgfx : : TransientVertexBuffer tvb ;
bgfx : : allocTransientVertexBuffer ( & tvb , maxVertices , PosNormalColorVertex : : ms_decl ) ;
const uint32_t numSpheres = 16 ;
float sphere [ numSpheres ] [ 4 ] ;
for ( uint32_t ii = 0 ; ii < numSpheres ; + + ii )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
sphere [ ii ] [ 0 ] = sinf ( time * ( ii * 0.21f ) + ii * 0.37f ) * ( DIMS * 0.5f - 8.0f ) ;
sphere [ ii ] [ 1 ] = sinf ( time * ( ii * 0.37f ) + ii * 0.67f ) * ( DIMS * 0.5f - 8.0f ) ;
sphere [ ii ] [ 2 ] = cosf ( time * ( ii * 0.11f ) + ii * 0.13f ) * ( DIMS * 0.5f - 8.0f ) ;
sphere [ ii ] [ 3 ] = 1.0f / ( 2.0f + ( sinf ( time * ( ii * 0.13f ) ) * 0.5f + 0.5f ) * 2.0f ) ;
}
profUpdate = bx : : getHPCounter ( ) ;
2012-11-10 19:59:23 -08:00
2015-08-21 20:08:03 -07:00
for ( uint32_t zz = 0 ; zz < DIMS ; + + zz )
{
for ( uint32_t yy = 0 ; yy < DIMS ; + + yy )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
uint32_t offset = ( zz * DIMS + yy ) * DIMS ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
for ( uint32_t xx = 0 ; xx < DIMS ; + + xx )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
uint32_t xoffset = offset + xx ;
float dist = 0.0f ;
float prod = 1.0f ;
for ( uint32_t ii = 0 ; ii < numSpheres ; + + ii )
{
const float * pos = sphere [ ii ] ;
float dx = pos [ 0 ] - ( - DIMS * 0.5f + float ( xx ) ) ;
float dy = pos [ 1 ] - ( - DIMS * 0.5f + float ( yy ) ) ;
float dz = pos [ 2 ] - ( - DIMS * 0.5f + float ( zz ) ) ;
float invr = pos [ 3 ] ;
float dot = dx * dx + dy * dy + dz * dz ;
dot * = invr * invr ;
dist * = dot ;
dist + = prod ;
prod * = dot ;
}
m_grid [ xoffset ] . m_val = dist / prod - 1.0f ;
2012-09-16 17:36:08 -07:00
}
}
}
2015-08-21 20:08:03 -07:00
profUpdate = bx : : getHPCounter ( ) - profUpdate ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
profNormal = bx : : getHPCounter ( ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
for ( uint32_t zz = 1 ; zz < DIMS - 1 ; + + zz )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
for ( uint32_t yy = 1 ; yy < DIMS - 1 ; + + yy )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
uint32_t offset = ( zz * DIMS + yy ) * DIMS ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
for ( uint32_t xx = 1 ; xx < DIMS - 1 ; + + xx )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
uint32_t xoffset = offset + xx ;
Grid * grid = m_grid ;
float normal [ 3 ] =
{
grid [ xoffset - 1 ] . m_val - grid [ xoffset + 1 ] . m_val ,
grid [ xoffset - ypitch ] . m_val - grid [ xoffset + ypitch ] . m_val ,
grid [ xoffset - zpitch ] . m_val - grid [ xoffset + zpitch ] . m_val ,
} ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
bx : : vec3Norm ( grid [ xoffset ] . m_normal , normal ) ;
}
2012-09-16 17:36:08 -07:00
}
}
2015-08-21 20:08:03 -07:00
profNormal = bx : : getHPCounter ( ) - profNormal ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
profTriangulate = bx : : getHPCounter ( ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
PosNormalColorVertex * vertex = ( PosNormalColorVertex * ) tvb . data ;
2012-11-10 19:59:23 -08:00
2015-08-21 20:08:03 -07:00
for ( uint32_t zz = 0 ; zz < DIMS - 1 & & numVertices + 12 < maxVertices ; + + zz )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
float rgb [ 6 ] ;
rgb [ 2 ] = zz * invdim ;
rgb [ 5 ] = ( zz + 1 ) * invdim ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
for ( uint32_t yy = 0 ; yy < DIMS - 1 & & numVertices + 12 < maxVertices ; + + yy )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
uint32_t offset = ( zz * DIMS + yy ) * DIMS ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
rgb [ 1 ] = yy * invdim ;
rgb [ 4 ] = ( yy + 1 ) * invdim ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
for ( uint32_t xx = 0 ; xx < DIMS - 1 & & numVertices + 12 < maxVertices ; + + xx )
2012-09-16 17:36:08 -07:00
{
2015-08-21 20:08:03 -07:00
uint32_t xoffset = offset + xx ;
rgb [ 0 ] = xx * invdim ;
rgb [ 3 ] = ( xx + 1 ) * invdim ;
float pos [ 3 ] =
{
- DIMS * 0.5f + float ( xx ) ,
- DIMS * 0.5f + float ( yy ) ,
- DIMS * 0.5f + float ( zz )
} ;
const Grid * grid = m_grid ;
const Grid * val [ 8 ] = {
& grid [ xoffset + zpitch + ypitch ] ,
& grid [ xoffset + zpitch + ypitch + 1 ] ,
& grid [ xoffset + ypitch + 1 ] ,
& grid [ xoffset + ypitch ] ,
& grid [ xoffset + zpitch ] ,
& grid [ xoffset + zpitch + 1 ] ,
& grid [ xoffset + 1 ] ,
& grid [ xoffset ] ,
} ;
uint32_t num = triangulate ( ( uint8_t * ) vertex , PosNormalColorVertex : : ms_decl . getStride ( ) , rgb , pos , val , 0.5f ) ;
vertex + = num ;
numVertices + = num ;
}
2012-09-16 17:36:08 -07:00
}
}
2015-08-21 20:08:03 -07:00
profTriangulate = bx : : getHPCounter ( ) - profTriangulate ;
float mtx [ 16 ] ;
bx : : mtxRotateXY ( mtx , time * 0.67f , time ) ;
// Set model matrix for rendering.
bgfx : : setTransform ( mtx ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Set vertex and index buffer.
bgfx : : setVertexBuffer ( & tvb , 0 , numVertices ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Set render states.
bgfx : : setState ( BGFX_STATE_DEFAULT ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Submit primitive for rendering to view 0.
bgfx : : submit ( 0 , m_program ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
// Display stats.
bgfx : : dbgTextPrintf ( 1 , 4 , 0x0f , " Num vertices: %5d (%6.4f%%) " , numVertices , float ( numVertices ) / maxVertices * 100 ) ;
bgfx : : dbgTextPrintf ( 1 , 5 , 0x0f , " Update: % 7.3f[ms] " , double ( profUpdate ) * toMs ) ;
bgfx : : dbgTextPrintf ( 1 , 6 , 0x0f , " Calc normals: % 7.3f[ms] " , double ( profNormal ) * toMs ) ;
bgfx : : dbgTextPrintf ( 1 , 7 , 0x0f , " Triangulate: % 7.3f[ms] " , double ( profTriangulate ) * toMs ) ;
bgfx : : dbgTextPrintf ( 1 , 8 , 0x0f , " Frame: % 7.3f[ms] " , double ( frameTime ) * toMs ) ;
2014-10-25 18:07:51 -07:00
2015-08-21 20:08:03 -07:00
// Advance to next frame. Rendering thread will be kicked to
// process submitted rendering primitives.
bgfx : : frame ( ) ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
return true ;
}
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
return false ;
2012-09-16 17:36:08 -07:00
}
2015-08-21 20:08:03 -07:00
uint32_t m_width ;
uint32_t m_height ;
uint32_t m_debug ;
uint32_t m_reset ;
bgfx : : ProgramHandle m_program ;
2012-09-16 17:36:08 -07:00
2015-08-21 20:08:03 -07:00
Grid * m_grid ;
int64_t m_timeOffset ;
} ;
2012-09-16 17:36:08 -07:00
2016-03-06 15:29:22 -08:00
ENTRY_IMPLEMENT_MAIN ( ExampleMetaballs ) ;