//----------------------------------------------------------------------------- // File: D3DApp.h // // Desc: Header file for a D3DIM app that uses MFC // // // Copyright (c) 1997-2001 Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- #ifndef D3D_MFC_APP_H #define D3D_MFC_APP_H #if _MSC_VER >= 1000 #pragma once #endif #ifndef __AFXWIN_H__ #error include 'stdafx.h' before including this file #endif //----------------------------------------------------------------------------- // Name: class CAppDoc // Desc: Overridden CDocument class needed for the CFormView //----------------------------------------------------------------------------- class CAppDoc : public CDocument { protected: DECLARE_DYNCREATE(CAppDoc) // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAppDoc) public: //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CAppDoc) // NOTE - the ClassWizard will add and remove member functions here. // DO NOT EDIT what you see in these blocks of generated code ! //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //----------------------------------------------------------------------------- // Name: class CAppFrameWnd // Desc: CFrameWnd-based class needed to override the CFormView's window style //----------------------------------------------------------------------------- class CAppFrameWnd : public CFrameWnd { protected: DECLARE_DYNCREATE(CAppFrameWnd) // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAppFrameWnd) public: virtual BOOL PreCreateWindow( CREATESTRUCT& cs ); //}}AFX_VIRTUAL protected: //{{AFX_MSG(CAppFrameWnd) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //----------------------------------------------------------------------------- // Name: class CApp // Desc: Main MFCapplication class derived from CWinApp. //----------------------------------------------------------------------------- class CApp : public CWinApp { public: // Overrides // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CApp) public: virtual BOOL InitInstance(); virtual BOOL OnIdle( LONG ); //}}AFX_VIRTUAL // Implementation //{{AFX_MSG(CApp) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //----------------------------------------------------------------------------- // Name: class CAppForm // Desc: CFormView-based class which allows the UI to be created with a form // (dialog) resource. This class manages all the controls on the form. //----------------------------------------------------------------------------- class CAppForm : public CFormView, public CD3DApplication { HWND m_hwndRenderWindow; HWND m_hwndRenderFullScreen; LPDIRECT3DTEXTURE8 m_pTexture0; LPDIRECT3DTEXTURE8 m_pTexture1; LPDIRECT3DVERTEXBUFFER8 m_pQuadVB; DWORD m_hPixelShader; LPD3DXBUFFER m_pD3DXBufShader; VOID UpdateUIForInstruction( INT iInstruction ); VOID UpdateUIForDeviceCapabilites(); VOID DisablePixelShaderEditingControls(); VOID GeneratePixelShaderOpcodes(); HRESULT SetPixelShader( TCHAR* strOpcodes ); HRESULT ConfirmDevice( D3DCAPS8*,DWORD,D3DFORMAT ); HRESULT OneTimeSceneInit(); HRESULT InitDeviceObjects(); HRESULT RestoreDeviceObjects(); HRESULT FrameMove(); HRESULT Render(); HRESULT InvalidateDeviceObjects(); HRESULT DeleteDeviceObjects(); HRESULT FinalCleanup(); virtual HRESULT AdjustWindowForChange(); protected: DECLARE_DYNCREATE(CAppForm) CAppForm(); virtual ~CAppForm(); public: BOOL IsReady() { return m_bReady; } TCHAR* PstrFrameStats() { return m_strFrameStats; } VOID RenderScene() { Render3DEnvironment(); } HRESULT CheckForLostFullscreen(); //{{AFX_DATA(CAppForm) enum { IDD = IDD_FORMVIEW }; //}}AFX_DATA //{{AFX_VIRTUAL(CAppForm) virtual void OnInitialUpdate(); //}}AFX_VIRTUAL //{{AFX_MSG(CAppForm) afx_msg void OnToggleFullScreen(); afx_msg void OnChangeDevice(); afx_msg void OnHScroll( UINT, UINT, CScrollBar* ); afx_msg void OnPresets(); afx_msg void OnOpenPixelShaderFile(); afx_msg void OnPixelShaderEdit(); afx_msg void OnChangeInstructions(); //}}AFX_MSG DECLARE_MESSAGE_MAP() }; //----------------------------------------------------------------------------- // Pixel shader instructions //----------------------------------------------------------------------------- struct PIXELSHADER_OPCODE { DWORD opcode; DWORD dwNumArgs; BOOL bInstructionSupportsScaling; BOOL bInstructionSupportsBias; BOOL bInputsSupportModifiers; BOOL bUsesTextureRegisters; TCHAR* optext; TCHAR* description; }; struct PIXELSHADER_PARAMETER { DWORD opcode; TCHAR* optext; TCHAR* description; }; #define D3DSIO_PS 0x00010000 // for specifying PixelShader version // The pixel shader instructions PIXELSHADER_OPCODE g_PixelShaderInstructions[] = { // opcode numArgs Scaling Bias InputMods Tex opText Description { D3DSIO_NOP, 0, FALSE, FALSE, FALSE, FALSE, "nop", "No operation" }, { D3DSIO_PS, 2, FALSE, FALSE, FALSE, FALSE, "ps", "Pixel Shader Version" }, { D3DSIO_DEF, 5, FALSE, FALSE, FALSE, FALSE, "def", "Define Constant" }, { D3DSIO_MOV, 2, TRUE, TRUE, TRUE, FALSE, "mov", "Move" }, { D3DSIO_ADD, 3, TRUE, TRUE, TRUE, FALSE, "add", "Add" }, { D3DSIO_SUB, 3, TRUE, TRUE, TRUE, FALSE, "sub", "Subtract" }, { D3DSIO_MAD, 4, TRUE, TRUE, TRUE, FALSE, "mad", "Multiply and add" }, { D3DSIO_MUL, 3, TRUE, TRUE, TRUE, FALSE, "mul", "Multiply" }, { D3DSIO_DP3, 3, TRUE, TRUE, TRUE, FALSE, "dp3", "DotProduct3" }, { D3DSIO_LRP, 4, TRUE, TRUE, TRUE, FALSE, "lrp", "Interpolate (blend)" }, { D3DSIO_CND, 4, TRUE, TRUE, TRUE, FALSE, "cnd", "Conditional" }, { D3DSIO_TEXCOORD, 1, FALSE, FALSE, FALSE, TRUE, "texcoord", "Texture coord ???" }, { D3DSIO_TEXKILL, 1, FALSE, FALSE, FALSE, TRUE, "texkill", "Texture kill ???" }, { D3DSIO_TEX, 1, FALSE, FALSE, FALSE, TRUE, "tex", "Texture" }, { D3DSIO_TEXBEM, 2, FALSE, FALSE, FALSE, TRUE, "texbem", "Bump env map" }, { D3DSIO_TEXBEML, 2, FALSE, FALSE, FALSE, TRUE, "texbeml", "Bump env map w/luminance" }, { D3DSIO_TEXREG2AR, 2, FALSE, FALSE, FALSE, TRUE, "texreg2ar", "???" }, { D3DSIO_TEXREG2GB, 2, FALSE, FALSE, FALSE, TRUE, "texreg2gb", "???" }, { D3DSIO_TEXM3x2PAD, 2, FALSE, FALSE, FALSE, TRUE, "texm3x2pad", "3x2 ???" }, { D3DSIO_TEXM3x2TEX, 2, FALSE, FALSE, FALSE, TRUE, "texm3x2tex", "3x2 ???" }, { D3DSIO_TEXM3x3PAD, 2, FALSE, FALSE, FALSE, TRUE, "texm3x3pad", "3x3 ???" }, { D3DSIO_TEXM3x3TEX, 2, FALSE, FALSE, FALSE, TRUE, "texm3x3tex", "3x3 ???" }, { D3DSIO_TEXM3x3DIFF, 2, FALSE, FALSE, FALSE, TRUE, "texm3x3diff", "3x3 ???" }, { D3DSIO_TEXM3x3SPEC, 3, FALSE, FALSE, FALSE, TRUE, "texm3x3spec", "3x3 ???" }, { D3DSIO_TEXM3x3VSPEC, 2, FALSE, FALSE, FALSE, TRUE, "texm3x3vspec","3x3 ???" }, { D3DSIO_END, 0, FALSE, FALSE, FALSE, FALSE, NULL, NULL }, }; // The source parameters for the pixel shader instructions PIXELSHADER_PARAMETER g_PixelShaderParameters[] = { { D3DS_SR0, "r0", "Register 0" }, { D3DS_SR1, "r1", "Register 1" }, { D3DS_SR2, "r2", "Register 2" }, { D3DS_SR3, "r3", "Register 3" }, { D3DS_SR4, "r4", "Register 4" }, { D3DS_SR5, "r5", "Register 5" }, { D3DS_SR6, "r6", "Register 6" }, { D3DS_SR7, "r7", "Register 7" }, { D3DS_T0, "t0", "Texture 0" }, { D3DS_T1, "t1", "Texture 1" }, { D3DS_T2, "t2", "Texture 2" }, { D3DS_T3, "t3", "Texture 3" }, { D3DS_T4, "t4", "Texture 4" }, { D3DS_T5, "t5", "Texture 5" }, { D3DS_T6, "t6", "Texture 6" }, { D3DS_T7, "t7", "Texture 7" }, { D3DS_C0, "c0", "Constant 0" }, { D3DS_C1, "c1", "Constant 1" }, { D3DS_C2, "c2", "Constant 2" }, { D3DS_C3, "c3", "Constant 3" }, { D3DS_C4, "c4", "Constant 4" }, { D3DS_C5, "c5", "Constant 5" }, { D3DS_C6, "c6", "Constant 6" }, { D3DS_C7, "c7", "Constant 7" }, { D3DS_V0, "v0", "Vertex color 0" }, { D3DS_V1, "v1", "Vertex color 1" }, { D3DS_V1, NULL, NULL }, }; // Define some preset pixel shaders TCHAR* g_strPixelShaderPresets[10] = { { "// Diffuse only\r\n" "ps.1.0\r\n" "mov r0, v0" }, { "// Decal\r\n" "ps.1.0\r\n" "tex t0\r\n" "mov r0, t0" }, { "// Modulate texture with diffuse (color0)\r\n" "ps.1.0\r\n" "tex t0\r\n" "mul r0, v0, t0" }, { "// Blend between tex0 and tex1\r\n" "ps.1.0\r\n" "tex t0\r\n" "tex t1\r\n" "mov r1, t1\r\n" "lrp r0, v0, t0, r1" }, { "// Scale tex0 by color0 and add to tex1\r\n" "ps.1.0\r\n" "tex t0\r\n" "tex t1\r\n" "mov r1, t1\r\n" "mad r0, v0, t0, r1" }, { "// Add tex0, tex1, color0, and color1\r\n" "ps.1.0\r\n" "tex t0\r\n" "tex t1\r\n" "add r0, t0, v1\r\n" "add r0, r0, t1\r\n" "add r0, r0, v0" }, }; #endif