//! Loads the model from a file.[TODO] void SkinnedModel::Load(string filename) { ifstream fin(filename, ios::binary | ios::in); string ignore; int numMeshes; fin >> ignore >> numMeshes; for(int i = 0; i < numMeshes; i++) { SkinnedMesh* mesh = new SkinnedMesh(); mesh->Load(fin); AddMesh(mesh); } // The space after the last index. fin >> ignore; // Make sure to start loading animation data from the right place. // [NOTE] After some investigation it seems like it should be at the first '\f' character. char x = fin.peek(); while(x != '\f') { fin >> ignore; x = fin.peek(); } mAnimator = new SceneAnimator(); mAnimator->Load(fin); fin.close(); }
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow) { hInst = hInstance; // 将实例句柄存储在全局变量中 //创建并将主窗口句柄存储在全局变量中 hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL); if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); UpdateWindow(hWnd); /* timer */ //创建WaitableTimer HTimer = CreateWaitableTimer(NULL,FALSE,NULL); DebugAssert(NULL!=HTimer, "CreateWaitableTimer 失败: %d", GetLastError()); //初始化WaitableTimer LARGE_INTEGER liDueTime; liDueTime.QuadPart = -1i64; //1秒后开始计时 SetWaitableTimer(HTimer, &liDueTime, 100, NULL, NULL, 0); //周期200ms = 0.2s FrameCount = 0; /* GraphicsDevice */ pGDevice = GraphicsDevice::getInstance(hWnd); pGDevice->BuildViewports(); /* Camera */ InitCamera(); cube.SetVertexData(0); cube.Create(pGDevice->m_pD3DDevice); /* Axis */ axis.SetVertexData(0); //参数实际上不起作用 TODO: 改进设计 axis.Create(pGDevice->m_pD3DDevice); //axis.CreateXYZ(pGDevice->m_pD3DDevice); //axis.UpdateXYZ(fixedEyePoint); /* 读取fbx,加载Skinned mesh */ // 获取输出文件路径 测试用 char fileSrc[MAX_PATH]; GetTestFileName(fileSrc); skinMesh.Load(fileSrc, pGDevice->m_pD3DDevice); /* Matrix */ D3DXMatrixIdentity(&identity); D3DXMatrixPerspectiveFovLH(&proj, D3DX_PI / 4.0f, (float)pGDevice->mDefaultViewport.Width / (float)pGDevice->mDefaultViewport.Height, 1.0f, 1000.0f); return TRUE; }
HRESULT Application::Init(HINSTANCE hInstance, bool windowed) { g_debug << "Application Started \n"; //Create Window Class WNDCLASS wc; memset(&wc, 0, sizeof(WNDCLASS)); wc.style = CS_HREDRAW | CS_VREDRAW; wc.lpfnWndProc = (WNDPROC)WndProc; wc.hInstance = hInstance; wc.lpszClassName = "D3DWND"; RECT rc = {0, 0, WINDOW_WIDTH, WINDOW_HEIGHT}; AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, false); //Register Class and Create new Window RegisterClass(&wc); m_mainWindow = ::CreateWindow("D3DWND", "Character Animation with Direct3D: Example 3.3", WS_OVERLAPPEDWINDOW, 0, 0, rc.right - rc.left, rc.bottom - rc.top, 0, 0, hInstance, 0); SetCursor(NULL); ::ShowWindow(m_mainWindow, SW_SHOW); ::UpdateWindow(m_mainWindow); //Create IDirect3D9 Interface IDirect3D9* d3d9 = Direct3DCreate9(D3D_SDK_VERSION); if (d3d9 == NULL) { g_debug << "Direct3DCreate9() - FAILED \n"; return E_FAIL; } //Check that the Device supports what we need from it D3DCAPS9 caps; d3d9->GetDeviceCaps(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, &caps); //Check vertex & pixelshader versions if (caps.VertexShaderVersion < D3DVS_VERSION(2, 0) || caps.PixelShaderVersion < D3DPS_VERSION(2, 0)) { g_debug << "Warning - Your graphic card does not support vertex and pixelshaders version 2.0 \n"; } //Set D3DPRESENT_PARAMETERS m_present.BackBufferWidth = WINDOW_WIDTH; m_present.BackBufferHeight = WINDOW_HEIGHT; m_present.BackBufferFormat = D3DFMT_A8R8G8B8; m_present.BackBufferCount = 2; m_present.MultiSampleType = D3DMULTISAMPLE_NONE; m_present.MultiSampleQuality = 0; m_present.SwapEffect = D3DSWAPEFFECT_DISCARD; m_present.hDeviceWindow = m_mainWindow; m_present.Windowed = windowed; m_present.EnableAutoDepthStencil = true; m_present.AutoDepthStencilFormat = D3DFMT_D24S8; m_present.Flags = 0; m_present.FullScreen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT; m_present.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE; //Hardware Vertex Processing int vp = 0; if (caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT) vp = D3DCREATE_HARDWARE_VERTEXPROCESSING; else vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING; //Create the IDirect3DDevice9 if (FAILED(d3d9->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, m_mainWindow, vp, &m_present, &g_pDevice))) { g_debug << "Failed to create IDirect3DDevice9 \n"; return E_FAIL; } //Release IDirect3D9 interface d3d9->Release(); //Load Application Specific resources here... D3DXCreateFont(g_pDevice, 20, 0, FW_BOLD, 1, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, DEFAULT_QUALITY, DEFAULT_PITCH | FF_DONTCARE, "Arial", &g_pFont); //Create Sprite D3DXCreateSprite(g_pDevice, &g_pSprite); //Load Effect ID3DXBuffer *pErrorMsgs = NULL; HRESULT hRes = D3DXCreateEffectFromFile(g_pDevice, "resources/fx/lighting.fx", NULL, NULL, D3DXSHADER_DEBUG, NULL, &g_pEffect, &pErrorMsgs); if (FAILED(hRes) && (pErrorMsgs != NULL)) { //Failed to create Effect g_debug << (char*)pErrorMsgs->GetBufferPointer() << "\n"; return E_FAIL; } m_deviceLost = false; m_drone.Load("resources/meshes/soldier.x"); return S_OK; }