Browse Source

Fixed 06-bump for Emscripten.

Branimir Karadžić 10 years ago
parent
commit
2234678dde
1 changed files with 244 additions and 211 deletions
  1. 244 211
      examples/06-bump/bump.cpp

+ 244 - 211
examples/06-bump/bump.cpp

@@ -103,253 +103,286 @@ static const uint16_t s_cubeIndices[36] =
 	21, 23, 22,
 };
 
-int _main_(int /*_argc*/, char** /*_argv*/)
+class Bump : public entry::AppI
 {
-	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
-		);
-
-	// Get renderer capabilities info.
-	const bgfx::Caps* caps = bgfx::getCaps();
-	bool instancingSupported = 0 != (caps->supported & BGFX_CAPS_INSTANCING);
-
-	// Create vertex stream declaration.
-	PosNormalTangentTexcoordVertex::init();
-
-	calcTangents(s_cubeVertices
-		, BX_COUNTOF(s_cubeVertices)
-		, PosNormalTangentTexcoordVertex::ms_decl
-		, s_cubeIndices
-		, BX_COUNTOF(s_cubeIndices)
-		);
-
-	// Create static vertex buffer.
-	bgfx::VertexBufferHandle vbh = bgfx::createVertexBuffer(
-		  bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) )
-		, PosNormalTangentTexcoordVertex::ms_decl
-		);
+	void init(int /*_argc*/, char** /*_argv*/) BX_OVERRIDE
+	{
+		m_width  = 1280;
+		m_height = 720;
+		m_debug  = BGFX_DEBUG_TEXT;
+		m_reset  = BGFX_RESET_VSYNC;
+
+		bgfx::init();
+		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
+				);
+
+		// Get renderer capabilities info.
+		const bgfx::Caps* caps = bgfx::getCaps();
+		m_instancingSupported = 0 != (caps->supported & BGFX_CAPS_INSTANCING);
+
+		// Create vertex stream declaration.
+		PosNormalTangentTexcoordVertex::init();
+
+		calcTangents(s_cubeVertices
+				, BX_COUNTOF(s_cubeVertices)
+				, PosNormalTangentTexcoordVertex::ms_decl
+				, s_cubeIndices
+				, BX_COUNTOF(s_cubeIndices)
+				);
+
+		// Create static vertex buffer.
+		m_vbh = bgfx::createVertexBuffer(
+					  bgfx::makeRef(s_cubeVertices, sizeof(s_cubeVertices) )
+					, PosNormalTangentTexcoordVertex::ms_decl
+					);
+
+		// Create static index buffer.
+		m_ibh = bgfx::createIndexBuffer(bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ) );
+
+		// Create texture sampler uniforms.
+		s_texColor  = bgfx::createUniform("s_texColor",  bgfx::UniformType::Int1);
+		s_texNormal = bgfx::createUniform("s_texNormal", bgfx::UniformType::Int1);
+
+		m_numLights = 4;
+		u_lightPosRadius = bgfx::createUniform("u_lightPosRadius", bgfx::UniformType::Vec4, m_numLights);
+		u_lightRgbInnerR = bgfx::createUniform("u_lightRgbInnerR", bgfx::UniformType::Vec4, m_numLights);
+
+		// Create program from shaders.
+		m_program = loadProgram(m_instancingSupported ? "vs_bump_instanced" : "vs_bump", "fs_bump");
+
+		// Load diffuse texture.
+		m_textureColor = loadTexture("fieldstone-rgba.dds");
+
+		// Load normal texture.
+		m_textureNormal = loadTexture("fieldstone-n.dds");
+
+		m_timeOffset = bx::getHPCounter();
+	}
 
-	// Create static index buffer.
-	bgfx::IndexBufferHandle ibh = bgfx::createIndexBuffer(bgfx::makeRef(s_cubeIndices, sizeof(s_cubeIndices) ) );
+	virtual int shutdown() BX_OVERRIDE
+	{
+		// Cleanup.
+		bgfx::destroyIndexBuffer(m_ibh);
+		bgfx::destroyVertexBuffer(m_vbh);
+		bgfx::destroyProgram(m_program);
+		bgfx::destroyTexture(m_textureColor);
+		bgfx::destroyTexture(m_textureNormal);
+		bgfx::destroyUniform(s_texColor);
+		bgfx::destroyUniform(s_texNormal);
+		bgfx::destroyUniform(u_lightPosRadius);
+		bgfx::destroyUniform(u_lightRgbInnerR);
+
+		// Shutdown bgfx.
+		bgfx::shutdown();
+
+		return 0;
+	}
 
-	// Create texture sampler uniforms.
-	bgfx::UniformHandle s_texColor  = bgfx::createUniform("s_texColor",  bgfx::UniformType::Int1);
-	bgfx::UniformHandle s_texNormal = bgfx::createUniform("s_texNormal", bgfx::UniformType::Int1);
+	bool update() BX_OVERRIDE
+	{
+		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);
 
-	uint16_t numLights = 4;
-	bgfx::UniformHandle u_lightPosRadius = bgfx::createUniform("u_lightPosRadius", bgfx::UniformType::Vec4, numLights);
-	bgfx::UniformHandle u_lightRgbInnerR = bgfx::createUniform("u_lightRgbInnerR", bgfx::UniformType::Vec4, numLights);
+			// 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);
 
-	// Create program from shaders.
-	bgfx::ProgramHandle program = loadProgram(instancingSupported ? "vs_bump_instanced" : "vs_bump", "fs_bump");
+			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;
 
-	// Load diffuse texture.
-	bgfx::TextureHandle textureColor = loadTexture("fieldstone-rgba.dds");
+			float time = (float)( (now-m_timeOffset)/freq);
 
-	// Load normal texture.
-	bgfx::TextureHandle textureNormal = loadTexture("fieldstone-n.dds");
+			// Use debug font to print information about this example.
+			bgfx::dbgTextClear();
+			bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/06-bump");
+			bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Loading textures.");
+			bgfx::dbgTextPrintf(0, 3, 0x0f, "Frame: % 7.3f[ms]", double(frameTime)*toMs);
 
-	int64_t timeOffset = bx::getHPCounter();
+			float at[3]  = { 0.0f, 0.0f,  0.0f };
+			float eye[3] = { 0.0f, 0.0f, -7.0f };
 
-	while (!entry::processEvents(width, height, debug, reset) )
-	{
-		// 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::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-timeOffset)/freq);
-
-		// Use debug font to print information about this example.
-		bgfx::dbgTextClear();
-		bgfx::dbgTextPrintf(0, 1, 0x4f, "bgfx/examples/06-bump");
-		bgfx::dbgTextPrintf(0, 2, 0x6f, "Description: Loading textures.");
-		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, -7.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);
+			// 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);
 
-			float proj[16];
-			bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f);
+				float proj[16];
+				bx::mtxProj(proj, hmd->eye[0].fov, 0.1f, 100.0f);
 
-			bgfx::setViewTransform(0, view, proj);
+				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);
+				// 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);
+				float proj[16];
+				bx::mtxProj(proj, 60.0f, float(m_width)/float(m_height), 0.1f, 100.0f);
+				bgfx::setViewTransform(0, view, proj);
 
-			// Set view 0 default viewport.
-			bgfx::setViewRect(0, 0, 0, width, height);
-		}
+				// Set view 0 default viewport.
+				bgfx::setViewRect(0, 0, 0, m_width, m_height);
+			}
 
-		float lightPosRadius[4][4];
-		for (uint32_t ii = 0; ii < numLights; ++ii)
-		{
-			lightPosRadius[ii][0] = sinf( (time*(0.1f + ii*0.17f) + ii*bx::piHalf*1.37f ) )*3.0f;
-			lightPosRadius[ii][1] = cosf( (time*(0.2f + ii*0.29f) + ii*bx::piHalf*1.49f ) )*3.0f;
-			lightPosRadius[ii][2] = -2.5f;
-			lightPosRadius[ii][3] = 3.0f;
-		}
+			float lightPosRadius[4][4];
+			for (uint32_t ii = 0; ii < m_numLights; ++ii)
+			{
+				lightPosRadius[ii][0] = sinf( (time*(0.1f + ii*0.17f) + ii*bx::piHalf*1.37f ) )*3.0f;
+				lightPosRadius[ii][1] = cosf( (time*(0.2f + ii*0.29f) + ii*bx::piHalf*1.49f ) )*3.0f;
+				lightPosRadius[ii][2] = -2.5f;
+				lightPosRadius[ii][3] = 3.0f;
+			}
 
-		bgfx::setUniform(u_lightPosRadius, lightPosRadius, numLights);
+			bgfx::setUniform(u_lightPosRadius, lightPosRadius, m_numLights);
 
-		float lightRgbInnerR[4][4] =
-		{
-			{ 1.0f, 0.7f, 0.2f, 0.8f },
-			{ 0.7f, 0.2f, 1.0f, 0.8f },
-			{ 0.2f, 1.0f, 0.7f, 0.8f },
-			{ 1.0f, 0.4f, 0.2f, 0.8f },
-		};
+			float lightRgbInnerR[4][4] =
+			{
+				{ 1.0f, 0.7f, 0.2f, 0.8f },
+				{ 0.7f, 0.2f, 1.0f, 0.8f },
+				{ 0.2f, 1.0f, 0.7f, 0.8f },
+				{ 1.0f, 0.4f, 0.2f, 0.8f },
+			};
 
-		bgfx::setUniform(u_lightRgbInnerR, lightRgbInnerR, numLights);
+			bgfx::setUniform(u_lightRgbInnerR, lightRgbInnerR, m_numLights);
 
-		const uint16_t instanceStride = 64;
-		const uint16_t numInstances = 3;
+			const uint16_t instanceStride = 64;
+			const uint16_t numInstances = 3;
 
-		if (instancingSupported)
-		{
-			// Write instance data for 3x3 cubes.
-			for (uint32_t yy = 0; yy < 3; ++yy)
+			if (m_instancingSupported)
 			{
-				const bgfx::InstanceDataBuffer* idb = bgfx::allocInstanceDataBuffer(numInstances, instanceStride);
-				if (NULL != idb)
+				// Write instance data for 3x3 cubes.
+				for (uint32_t yy = 0; yy < 3; ++yy)
+				{
+					const bgfx::InstanceDataBuffer* idb = bgfx::allocInstanceDataBuffer(numInstances, instanceStride);
+					if (NULL != idb)
+					{
+						uint8_t* data = idb->data;
+
+						for (uint32_t xx = 0; xx < 3; ++xx)
+						{
+							float* mtx = (float*)data;
+							bx::mtxRotateXY(mtx, time*0.023f + xx*0.21f, time*0.03f + yy*0.37f);
+							mtx[12] = -3.0f + float(xx)*3.0f;
+							mtx[13] = -3.0f + float(yy)*3.0f;
+							mtx[14] = 0.0f;
+
+							data += instanceStride;
+						}
+
+						// Set instance data buffer.
+						bgfx::setInstanceDataBuffer(idb, numInstances);
+
+						// Set vertex and index buffer.
+						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setIndexBuffer(m_ibh);
+
+						// Bind textures.
+						bgfx::setTexture(0, s_texColor,  m_textureColor);
+						bgfx::setTexture(1, s_texNormal, m_textureNormal);
+
+						// Set render states.
+						bgfx::setState(0
+								| BGFX_STATE_RGB_WRITE
+								| BGFX_STATE_ALPHA_WRITE
+								| BGFX_STATE_DEPTH_WRITE
+								| BGFX_STATE_DEPTH_TEST_LESS
+								| BGFX_STATE_MSAA
+								);
+
+						// Submit primitive for rendering to view 0.
+						bgfx::submit(0, m_program);
+					}
+				}
+			}
+			else
+			{
+				for (uint32_t yy = 0; yy < 3; ++yy)
 				{
-					uint8_t* data = idb->data;
-
 					for (uint32_t xx = 0; xx < 3; ++xx)
 					{
-						float* mtx = (float*)data;
+						float mtx[16];
 						bx::mtxRotateXY(mtx, time*0.023f + xx*0.21f, time*0.03f + yy*0.37f);
 						mtx[12] = -3.0f + float(xx)*3.0f;
 						mtx[13] = -3.0f + float(yy)*3.0f;
 						mtx[14] = 0.0f;
 
-						data += instanceStride;
-					}
-
-					// Set instance data buffer.
-					bgfx::setInstanceDataBuffer(idb, numInstances);
+						// Set transform for draw call.
+						bgfx::setTransform(mtx);
 
-					// Set vertex and index buffer.
-					bgfx::setVertexBuffer(vbh);
-					bgfx::setIndexBuffer(ibh);
+						// Set vertex and index buffer.
+						bgfx::setVertexBuffer(m_vbh);
+						bgfx::setIndexBuffer(m_ibh);
 
-					// Bind textures.
-					bgfx::setTexture(0, s_texColor, textureColor);
-					bgfx::setTexture(1, s_texNormal, textureNormal);
+						// Bind textures.
+						bgfx::setTexture(0, s_texColor,  m_textureColor);
+						bgfx::setTexture(1, s_texNormal, m_textureNormal);
 
-					// Set render states.
-					bgfx::setState(0
-						| BGFX_STATE_RGB_WRITE
-						| BGFX_STATE_ALPHA_WRITE
-						| BGFX_STATE_DEPTH_WRITE
-						| BGFX_STATE_DEPTH_TEST_LESS
-						| BGFX_STATE_MSAA
-						);
+						// Set render states.
+						bgfx::setState(0
+								| BGFX_STATE_RGB_WRITE
+								| BGFX_STATE_ALPHA_WRITE
+								| BGFX_STATE_DEPTH_WRITE
+								| BGFX_STATE_DEPTH_TEST_LESS
+								| BGFX_STATE_MSAA
+								);
 
-					// Submit primitive for rendering to view 0.
-					bgfx::submit(0, program);
-				}
-			}
-		}
-		else
-		{
-			for (uint32_t yy = 0; yy < 3; ++yy)
-			{
-				for (uint32_t xx = 0; xx < 3; ++xx)
-				{
-					float mtx[16];
-					bx::mtxRotateXY(mtx, time*0.023f + xx*0.21f, time*0.03f + yy*0.37f);
-					mtx[12] = -3.0f + float(xx)*3.0f;
-					mtx[13] = -3.0f + float(yy)*3.0f;
-					mtx[14] = 0.0f;
-
-					// Set transform for draw call.
-					bgfx::setTransform(mtx);
-
-					// Set vertex and index buffer.
-					bgfx::setVertexBuffer(vbh);
-					bgfx::setIndexBuffer(ibh);
-
-					// Bind textures.
-					bgfx::setTexture(0, s_texColor, textureColor);
-					bgfx::setTexture(1, s_texNormal, textureNormal);
-
-					// Set render states.
-					bgfx::setState(0
-						| BGFX_STATE_RGB_WRITE
-						| BGFX_STATE_ALPHA_WRITE
-						| BGFX_STATE_DEPTH_WRITE
-						| BGFX_STATE_DEPTH_TEST_LESS
-						| BGFX_STATE_MSAA
-						);
-
-					// Submit primitive for rendering to view 0.
-					bgfx::submit(0, program);
+						// 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;
 		}
 
-		// Advance to next frame. Rendering thread will be kicked to
-		// process submitted rendering primitives.
-		bgfx::frame();
+		return false;
 	}
 
-	// Cleanup.
-	bgfx::destroyIndexBuffer(ibh);
-	bgfx::destroyVertexBuffer(vbh);
-	bgfx::destroyProgram(program);
-	bgfx::destroyTexture(textureColor);
-	bgfx::destroyTexture(textureNormal);
-	bgfx::destroyUniform(s_texColor);
-	bgfx::destroyUniform(s_texNormal);
-	bgfx::destroyUniform(u_lightPosRadius);
-	bgfx::destroyUniform(u_lightRgbInnerR);
-
-	// Shutdown bgfx.
-	bgfx::shutdown();
-
-	return 0;
-}
+	bgfx::VertexBufferHandle m_vbh;
+	bgfx::IndexBufferHandle  m_ibh;
+	bgfx::UniformHandle s_texColor;
+	bgfx::UniformHandle s_texNormal;
+	bgfx::UniformHandle u_lightPosRadius;
+	bgfx::UniformHandle u_lightRgbInnerR;
+	bgfx::ProgramHandle m_program;
+	bgfx::TextureHandle m_textureColor;
+	bgfx::TextureHandle m_textureNormal;
+	uint16_t m_numLights;
+	bool m_instancingSupported;
+
+	uint32_t m_width;
+	uint32_t m_height;
+	uint32_t m_debug;
+	uint32_t m_reset;
+	int64_t m_timeOffset;
+};
+
+ENTRY_IMPLEMENT_MAIN(Bump);