Last active
August 29, 2015 14:14
-
-
Save attilaz/caf77e1b0e1b0a1fbcd0 to your computer and use it in GitHub Desktop.
Bgfx dynamic index/vertex buffer problem (modified cubes.cpp)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Copyright 2011-2015 Branimir Karadzic. All rights reserved. | |
* License: http://www.opensource.org/licenses/BSD-2-Clause | |
*/ | |
#include "common.h" | |
#include "bgfx_utils.h" | |
struct PosColorVertex | |
{ | |
float m_x; | |
float m_y; | |
float m_z; | |
uint32_t m_abgr; | |
uint32_t m_abgr2; | |
static void init() | |
{ | |
ms_decl | |
.begin() | |
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) | |
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) | |
.add(bgfx::Attrib::Color1, 4, bgfx::AttribType::Uint8, true) | |
.end(); | |
}; | |
static bgfx::VertexDecl ms_decl; | |
}; | |
bgfx::VertexDecl PosColorVertex::ms_decl; | |
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] = | |
{ | |
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, | |
}; | |
int _main_(int /*_argc*/, char** /*_argv*/) | |
{ | |
uint32_t width = 1280; | |
uint32_t height = 720; | |
uint32_t debug = BGFX_DEBUG_TEXT; | |
uint32_t reset = BGFX_RESET_VSYNC; | |
bgfx::init(); | |
bgfx::reset(width, height, reset); | |
// Enable debug text. | |
bgfx::setDebug(debug); | |
// Set view 0 clear state. | |
bgfx::setViewClear(0 | |
, BGFX_CLEAR_COLOR|BGFX_CLEAR_DEPTH | |
, 0x303030ff | |
, 1.0f | |
, 0 | |
); | |
// --------------------- | |
{ // create some buffer to mess the default alignment | |
bgfx::VertexDecl decl; | |
decl | |
.begin() | |
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) | |
.end(); | |
bgfx::createDynamicVertexBuffer(bgfx::alloc(15*4), decl); | |
bgfx::createDynamicIndexBuffer(bgfx::alloc(128)); | |
} | |
// ---------------------- | |
// Create vertex stream declaration. | |
PosColorVertex::init(); | |
// Create static vertex buffer. | |
bgfx::DynamicVertexBufferHandle vbh = bgfx::createDynamicVertexBuffer( | |
// Static data can be passed with bgfx::makeRef | |
bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) ) | |
, PosColorVertex::ms_decl | |
); | |
// Create static index buffer. | |
bgfx::DynamicIndexBufferHandle ibh = bgfx::createDynamicIndexBuffer( | |
// Static data can be passed with bgfx::makeRef | |
bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ) | |
); | |
// Create program from shaders. | |
bgfx::ProgramHandle program = loadProgram("vs_cubes", "fs_cubes"); | |
int64_t timeOffset = bx::getHPCounter(); | |
while (!entry::processEvents(width, height, debug, reset) ) | |
{ | |
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-timeOffset)/double(bx::getHPFrequency() ) ); | |
// Use debug font to print information about this example. | |
bgfx::dbgTextClear(); | |
bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/01-cube"); | |
bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Rendering simple static mesh."); | |
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, -35.0f }; | |
// Set view and projection matrix for view 0. | |
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); | |
} | |
// 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); | |
// Submit 11x11 cubes. | |
for (uint32_t yy = 0; yy < 11; ++yy) | |
{ | |
for (uint32_t xx = 0; xx < 11; ++xx) | |
{ | |
float mtx[16]; | |
bx::mtxRotateXY(mtx, time + xx*0.21f, time + yy*0.37f); | |
mtx[12] = -15.0f + float(xx)*3.0f; | |
mtx[13] = -15.0f + float(yy)*3.0f; | |
mtx[14] = 0.0f; | |
// Set model matrix for rendering. | |
bgfx::setTransform(mtx); | |
// Set vertex and fragment shaders. | |
bgfx::setProgram(program); | |
// Set vertex and index buffer. | |
bgfx::setVertexBuffer(vbh); | |
bgfx::setIndexBuffer(ibh,0,36); | |
// Set render states. | |
bgfx::setState(BGFX_STATE_DEFAULT); | |
// Submit primitive for rendering to view 0. | |
bgfx::submit(0); | |
} | |
} | |
// Advance to next frame. Rendering thread will be kicked to | |
// process submitted rendering primitives. | |
bgfx::frame(); | |
} | |
// Cleanup. | |
bgfx::destroyDynamicIndexBuffer(ibh); | |
bgfx::destroyDynamicVertexBuffer(vbh); | |
bgfx::destroyProgram(program); | |
// Shutdown bgfx. | |
bgfx::shutdown(); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment