-
Notifications
You must be signed in to change notification settings - Fork 2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Added multiple vertex stream example.
- Loading branch information
Showing
4 changed files
with
295 additions
and
1 deletion.
There are no files selected for viewing
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
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
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,293 @@ | ||
/* | ||
* Copyright 2011-2017 Branimir Karadzic. All rights reserved. | ||
* License: https://github.com/bkaradzic/bgfx#license-bsd-2-clause | ||
*/ | ||
|
||
#include "common.h" | ||
#include "bgfx_utils.h" | ||
#include "imgui/imgui.h" | ||
|
||
namespace | ||
{ | ||
|
||
struct PosVertex | ||
{ | ||
float m_x; | ||
float m_y; | ||
float m_z; | ||
|
||
static void init() | ||
{ | ||
ms_decl | ||
.begin() | ||
.add(bgfx::Attrib::Position, 3, bgfx::AttribType::Float) | ||
.end(); | ||
}; | ||
|
||
static bgfx::VertexDecl ms_decl; | ||
}; | ||
|
||
bgfx::VertexDecl PosVertex::ms_decl; | ||
|
||
struct ColorVertex | ||
{ | ||
uint32_t m_abgr; | ||
|
||
static void init() | ||
{ | ||
ms_decl | ||
.begin() | ||
.add(bgfx::Attrib::Color0, 4, bgfx::AttribType::Uint8, true) | ||
.end(); | ||
}; | ||
|
||
static bgfx::VertexDecl ms_decl; | ||
}; | ||
|
||
bgfx::VertexDecl ColorVertex::ms_decl; | ||
|
||
static PosVertex s_cubePosVertices[] = | ||
{ | ||
{-1.0f, 1.0f, 1.0f }, | ||
{ 1.0f, 1.0f, 1.0f }, | ||
{-1.0f, -1.0f, 1.0f }, | ||
{ 1.0f, -1.0f, 1.0f }, | ||
{-1.0f, 1.0f, -1.0f }, | ||
{ 1.0f, 1.0f, -1.0f }, | ||
{-1.0f, -1.0f, -1.0f }, | ||
{ 1.0f, -1.0f, -1.0f }, | ||
}; | ||
|
||
static ColorVertex s_cubeColorVertices[] = | ||
{ | ||
{ 0xff000000 }, | ||
{ 0xff0000ff }, | ||
{ 0xff00ff00 }, | ||
{ 0xff00ffff }, | ||
{ 0xffff0000 }, | ||
{ 0xffff00ff }, | ||
{ 0xffffff00 }, | ||
{ 0xffffffff }, | ||
}; | ||
|
||
static const uint16_t s_cubeTriList[] = | ||
{ | ||
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, | ||
}; | ||
|
||
static const uint16_t s_cubeTriStrip[] = | ||
{ | ||
0, 1, 2, | ||
3, | ||
7, | ||
1, | ||
5, | ||
0, | ||
4, | ||
2, | ||
6, | ||
7, | ||
4, | ||
5, | ||
}; | ||
|
||
class ExampleMvs : public entry::AppI | ||
{ | ||
public: | ||
ExampleMvs(const char* _name, const char* _description) | ||
: entry::AppI(_name, _description) | ||
{ | ||
} | ||
|
||
void init(int32_t _argc, const char* const* _argv, uint32_t _width, uint32_t _height) override | ||
{ | ||
BX_UNUSED(s_cubeTriList, s_cubeTriStrip); | ||
|
||
Args args(_argc, _argv); | ||
|
||
m_width = _width; | ||
m_height = _height; | ||
m_debug = BGFX_DEBUG_NONE; | ||
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 | ||
); | ||
|
||
// Create vertex stream declaration. | ||
PosVertex::init(); | ||
ColorVertex::init(); | ||
|
||
// Create static vertex buffer. | ||
m_vbh[0] = bgfx::createVertexBuffer( | ||
// Static data can be passed with bgfx::makeRef | ||
bgfx::makeRef(s_cubePosVertices, sizeof(s_cubePosVertices) ) | ||
, PosVertex::ms_decl | ||
); | ||
|
||
m_vbh[1] = bgfx::createVertexBuffer( | ||
// Static data can be passed with bgfx::makeRef | ||
bgfx::makeRef(s_cubeColorVertices, sizeof(s_cubeColorVertices) ) | ||
, ColorVertex::ms_decl | ||
); | ||
|
||
// Create static index buffer. | ||
m_ibh = bgfx::createIndexBuffer( | ||
// Static data can be passed with bgfx::makeRef | ||
bgfx::makeRef(s_cubeTriStrip, sizeof(s_cubeTriStrip) ) | ||
); | ||
|
||
// Create program from shaders. | ||
m_program = loadProgram("vs_cubes", "fs_cubes"); | ||
|
||
m_timeOffset = bx::getHPCounter(); | ||
|
||
imguiCreate(); | ||
} | ||
|
||
virtual int shutdown() override | ||
{ | ||
imguiDestroy(); | ||
|
||
// Cleanup. | ||
bgfx::destroy(m_ibh); | ||
bgfx::destroy(m_vbh[0]); | ||
bgfx::destroy(m_vbh[1]); | ||
bgfx::destroy(m_program); | ||
|
||
// Shutdown bgfx. | ||
bgfx::shutdown(); | ||
|
||
return 0; | ||
} | ||
|
||
bool update() override | ||
{ | ||
if (!entry::processEvents(m_width, m_height, m_debug, m_reset, &m_mouseState) ) | ||
{ | ||
imguiBeginFrame(m_mouseState.m_mx | ||
, m_mouseState.m_my | ||
, (m_mouseState.m_buttons[entry::MouseButton::Left ] ? IMGUI_MBUT_LEFT : 0) | ||
| (m_mouseState.m_buttons[entry::MouseButton::Right ] ? IMGUI_MBUT_RIGHT : 0) | ||
| (m_mouseState.m_buttons[entry::MouseButton::Middle] ? IMGUI_MBUT_MIDDLE : 0) | ||
, m_mouseState.m_mz | ||
, uint16_t(m_width) | ||
, uint16_t(m_height) | ||
); | ||
|
||
showExampleDialog(this); | ||
|
||
imguiEndFrame(); | ||
|
||
float time = (float)( (bx::getHPCounter()-m_timeOffset)/double(bx::getHPFrequency() ) ); | ||
|
||
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 && 0 != (hmd->flags & BGFX_HMD_RENDERING) ) | ||
{ | ||
float view[16]; | ||
bx::mtxQuatTranslationHMD(view, hmd->eye[0].rotation, eye); | ||
bgfx::setViewTransform(0, view, hmd->eye[0].projection, BGFX_VIEW_STEREO, hmd->eye[1].projection); | ||
|
||
// 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(m_width)/float(m_height), 0.1f, 100.0f, bgfx::getCaps()->homogeneousDepth); | ||
bgfx::setViewTransform(0, view, proj); | ||
|
||
// Set view 0 default viewport. | ||
bgfx::setViewRect(0, 0, 0, uint16_t(m_width), uint16_t(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); | ||
|
||
// 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 index buffer. | ||
bgfx::setVertexBuffer(0, m_vbh[0]); | ||
bgfx::setVertexBuffer(1, m_vbh[1]); | ||
bgfx::setIndexBuffer(m_ibh); | ||
|
||
// Set render states. | ||
bgfx::setState(0 | ||
| BGFX_STATE_DEFAULT | ||
| BGFX_STATE_PT_TRISTRIP | ||
); | ||
|
||
// Submit primitive for rendering to view 0. | ||
bgfx::submit(0, m_program); | ||
} | ||
} | ||
|
||
// Advance to next frame. Rendering thread will be kicked to | ||
// process submitted rendering primitives. | ||
bgfx::frame(); | ||
|
||
return true; | ||
} | ||
|
||
return false; | ||
} | ||
|
||
entry::MouseState m_mouseState; | ||
|
||
uint32_t m_width; | ||
uint32_t m_height; | ||
uint32_t m_debug; | ||
uint32_t m_reset; | ||
bgfx::VertexBufferHandle m_vbh[2]; | ||
bgfx::IndexBufferHandle m_ibh; | ||
bgfx::ProgramHandle m_program; | ||
int64_t m_timeOffset; | ||
}; | ||
|
||
} // namespace | ||
|
||
ENTRY_IMPLEMENT_MAIN(ExampleMvs, "34-mvc", "Multiple vertex streams."); |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
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