浏览代码

Added multiple vertex stream example.

Branimir Karadžić 8 年之前
父节点
当前提交
083c67d471
共有 4 个文件被更改,包括 295 次插入1 次删除
  1. 1 1
      examples/01-cubes/cubes.cpp
  2. 293 0
      examples/34-mvs/mvs.cpp
  3. 二进制
      examples/34-mvs/screenshot.png
  4. 1 0
      scripts/genie.lua

+ 1 - 1
examples/01-cubes/cubes.cpp

@@ -254,4 +254,4 @@ public:
 
 } // namespace
 
-ENTRY_IMPLEMENT_MAIN(ExampleCubes, "01-cube", "Rendering simple static mesh.");
+ENTRY_IMPLEMENT_MAIN(ExampleCubes, "01-cubes", "Rendering simple static mesh.");

+ 293 - 0
examples/34-mvs/mvs.cpp

@@ -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.");

二进制
examples/34-mvs/screenshot.png


+ 1 - 0
scripts/genie.lua

@@ -467,6 +467,7 @@ or _OPTIONS["with-combined-examples"] then
 		, "31-rsm"
 		, "32-particles"
 		, "33-pom"
+		, "34-mvs"
 		)
 
 	-- C99 source doesn't compile under WinRT settings