Ejemplo n.º 1
0
INT_PTR CALLBACK about_proc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
{
	int temp;
	int x, y, w, h;
	context *cx;
	PAINTSTRUCT ps;
	HDC hdc;

	switch(msg)
	{
	case WM_INITDIALOG:

		SetWindowLongPtr(hwnd, DWL_USER, 0);

		//set window pos
		w = GetSystemMetrics(SM_CXDLGFRAME) * 2 +
			WIDTH;

		h = GetSystemMetrics(SM_CYDLGFRAME) * 2 +
			GetSystemMetrics(SM_CYCAPTION) +
			HEIGHT;

		x = (GetSystemMetrics(SM_CXSCREEN) - w) / 2;
		y = (GetSystemMetrics(SM_CYSCREEN) - h) / 2;

		SetWindowPos(hwnd, NULL, x, y, w, h, SWP_NOZORDER);

		//init cx
		temp = bmpsize(WIDTH, HEIGHT);

		if( (!(cx = malloc(sizeof(context)))) ||
			(!(cx->buffer = malloc(temp))) ||
			(!(cx->frame = malloc(temp))) )
		{
			DestroyWindow(hwnd);
			return 1;
		}

		cx->framelength = temp;

		cx->hdc = GetDC(hwnd);

		SetWindowLongPtr(hwnd, DWL_USER, (LONG_PTR)cx);

		//generate first frame
		frame_init(cx);

		//set frame move timer
		SetTimer(hwnd, TIMER, INTERVAL, 0);

		return 1;

	case WM_PAINT:
		if((cx = (void*)GetWindowLong(hwnd, DWL_USER)))
		{
			if((hdc = BeginPaint(hwnd, &ps)))
			{
				imageput(hdc, 0, 0, WIDTH, HEIGHT, cx->frame);
				EndPaint(hwnd, &ps);
			}
		}
		return 1;

	case WM_TIMER:
		switch(wp)
		{
		case TIMER:
			if((cx = (void*)GetWindowLong(hwnd, DWL_USER)))
			{
				framemove(cx);
				imageput(cx->hdc, 0, 0, WIDTH, HEIGHT, cx->frame);
			}
			return 1;
		}
		break;

	case WM_DESTROY:
		if((cx = (void*)GetWindowLong(hwnd, DWL_USER)))
		{
			KillTimer(hwnd, TIMER);
			ReleaseDC(hwnd, cx->hdc);
			free(cx->buffer);
			free(cx->frame);
			free(cx);
		}
		return 1;

	case WM_CLOSE:
		EndDialog(hwnd, 0);
		return 1;
	}
	return 0;
}
Ejemplo n.º 2
0
void main(void)
{
	// 內定使用DirectX 9來繪圖
	char *device = "dx9";
	void (*render)(void) = RenderFrameDX9;
	bool (*init_resource)(void) = InitResourceDX9;
	bool (*release_resource)(void) = ReleaseResourceDX9;
	void (*resize_func)(int width, int height) = ResizeWindowDX9;

#ifdef _ENABLE_DX10_
	printf("Press\n(1) for Direct3D9\n(2) for OpenGL\n(3) for Direct3D10\n");
#else
	printf("Press\n(1) for Direct3D9\n(2) for OpenGL\n");
#endif

	int c = getche();

	switch(c)
	{
	default:
	case '1':
		render = RenderFrameDX9;
		init_resource = InitResourceDX9;
		release_resource = ReleaseResourceDX9;
		resize_func = ResizeWindowDX9;
		break;
	case '2':
		device = "opengl";
		init_resource = InitResourceOpenGL;
		release_resource = ReleaseResourceOpenGL;
		render = RenderFrameOpenGL;
		resize_func = ResizeWindowOpenGL;
		break;
#ifdef _ENABLE_DX10_
	case '3':
		device = "dx10";
		init_resource = InitResourceDX10;
		release_resource = ReleaseResourceDX10;
		render = RenderFrameDX10;
		resize_func = ResizeWindowDX10;
		break;
#endif
	}

	printf("\nSelected %s device for rendering.\n", device);

	GutResizeFunc( resize_func );
	// 在(100,100)的位置開啟一個大小為(512x512)的視窗
	GutCreateWindow(100, 100, 512, 512, device);
	// 做OpenGL或DirectX初始化
	if ( !GutInitGraphicsDevice(device) )
	{
		printf("Failed to initialize %s device\n", device);
		exit(0);
	}
	//
	GutInputInit();

	GutRegisterKeyDown(GUTKEY_1, KeyDown_1);
	GutRegisterKeyDown(GUTKEY_2, KeyDown_2);
	GutRegisterKeyDown(GUTKEY_3, KeyDown_3);
	GutRegisterKeyDown(GUTKEY_4, KeyDown_4);
	GutRegisterKeyDown(GUTKEY_5, KeyDown_5);
	GutRegisterKeyDown(GUTKEY_6, KeyDown_6);

	GutRegisterKeyPressed(GUTKEY_EQUALS, KeyPressed_ADD);
	GutRegisterKeyPressed(GUTKEY_MINUS, KeyPressed_MINUS);
	GutRegisterKeyPressed(GUTKEY_ADD, KeyPressed_ADD);
	GutRegisterKeyPressed(GUTKEY_SUBTRACT, KeyPressed_MINUS);

	g_Control.SetCamera(Vector4(0.0f, 3.0f, 1.0f), Vector4(0.0f, 0.0f, 1.0f), Vector4(0.0f, 0.0f, 1.0f) );
	g_Control.SetMoveSpeed(5.0f);

	//
	g_emitter.m_fEmitRate = 300;
	g_emitter.m_fEmitTheta = FastMath::DegToRad(15.0f);
	g_emitter.m_fParticleInitSpeed[0] = 1.0f;
	g_emitter.m_fParticleInitSpeed[1] = 2.0f;
	g_emitter.m_fParticleLife[0] = 1.5f;
	g_emitter.m_fParticleLife[1] = 2.0f;
	g_emitter.m_fParticleSize[0] = 0.05f;
	g_emitter.m_fParticleSize[1] = 0.10f;

	g_Particle.SetEmitter(g_emitter);
	g_Particle.SetForce(Vector4(0.0f, 0.0f, -1.0f));

	// 載入shader
	if ( !init_resource() )
	{
		release_resource();
		printf("Failed to load resources\n");
		exit(0);
	}

	g_Timer.Restart();
	// 主回圈
	while( GutProcessMessage() )
	{
		GetUserInput();
		//
		framemove();
		// 畫出矩形
		render();
	}
	// 卸載shader
	release_resource();
	// 關閉OpenGL/DirectX繪圖裝置
	GutReleaseGraphicsDevice();
}