| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121 |
- //-------------------------------------------------------------------------------
- /**
- * This program is distributed under the terms of the GNU Lesser General
- * Public License (LGPL).
- *
- * ASSIMP Viewer Utility
- *
- */
- //-------------------------------------------------------------------------------
- #include "stdafx.h"
- #include "assimp_view.h"
- namespace AssimpView {
- // Static array to keep custom color values
- COLORREF g_aclCustomColors[16] =
- {0};
- //-------------------------------------------------------------------------------
- // Setup file associations for all formats supported by the library
- //
- // File associations are registered in HKCU\Software\Classes. They might
- // be overwritten by global file associations.
- //-------------------------------------------------------------------------------
- void MakeFileAssociations()
- {
- /*
- ; .wscript
- root: HKCR; Flags: deletekey; Subkey: ".uscript"; ValueType: string; ValueData: "UE_WSCRIPT_CLASS"; Components: rt
- root: HKCR; Flags: deletekey; Subkey: "UE_WSCRIPT_CLASS"; ValueName:; ValueType: string; ValueData: "UtopicEngine Console Script"; Components: rt
- root: HKCR; Flags: deletekey; Subkey: "UE_WSCRIPT_CLASS\shell\open\command"; ValueName:; ValueType: string; ValueData: "notepad.exe %1"; Components: rt
- */
- char szTemp2[MAX_PATH];
- char szTemp[MAX_PATH + 10];
- GetModuleFileName(NULL,szTemp2,MAX_PATH);
- sprintf(szTemp,"%s %%1",szTemp2);
- HKEY hTemp;
- // -------------------------------------------------
- // .3ds
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.3ds",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AV3DSCLASS",(DWORD)strlen("AV3DSCLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AV3DSCLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AV3DSCLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .x
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.x",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVXCLASS",(DWORD)strlen("AVXCLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVXCLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVXCLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .obj
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.obj",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVOBJCLASS",(DWORD)strlen("AVOBJCLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVOBJCLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVOBJCLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .ms3d
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.ms3d",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVMS3DCLASS",(DWORD)strlen("AVMS3DCLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMS3DCLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMS3DCLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .md3
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.md3",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVMD3CLASS",(DWORD)strlen("AVMD3CLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD3CLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD3CLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .md2
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.md2",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVMD2CLASS",(DWORD)strlen("AVMD2CLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD3CLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD2CLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .md4
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.md4",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVMD4CLASS",(DWORD)strlen("AVMD4CLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD4CLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD4CLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .md5
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.md5",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVMD5CLASS",(DWORD)strlen("AVMD5CLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD5CLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVMD5CLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- // -------------------------------------------------
- // .ply
- // -------------------------------------------------
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\.ply",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)"AVPLYCLASS",(DWORD)strlen("AVPLYCLASS")+1);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVPLYCLASS",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegCloseKey(hTemp);
- RegCreateKeyEx(HKEY_CURRENT_USER,"Software\\Classes\\AVPLYCLASS\\shell\\open\\command",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueEx(hTemp,"",0,REG_SZ,(const BYTE*)szTemp,(DWORD)strlen(szTemp)+1);
- RegCloseKey(hTemp);
- CLogDisplay::Instance().AddEntry("[OK] File assocations have been registered",
- D3DCOLOR_ARGB(0xFF,0,0xFF,0));
- }
- //-------------------------------------------------------------------------------
- // Recreate all specular materials depending on the current specularity settings
- //
- // Diffuse-only materials are ignored.
- // Must be called after specular highlights have been toggled
- //-------------------------------------------------------------------------------
- void UpdateSpecularMaterials()
- {
- if (g_pcAsset && g_pcAsset->pcScene)
- {
- for (unsigned int i = 0; i < g_pcAsset->pcScene->mNumMeshes;++i)
- {
- if (aiShadingMode_Phong == g_pcAsset->apcMeshes[i]->eShadingMode)
- {
- DeleteMaterial(g_pcAsset->apcMeshes[i]);
- CreateMaterial(g_pcAsset->apcMeshes[i],g_pcAsset->pcScene->mMeshes[i]);
- }
- }
- }
- }
- //-------------------------------------------------------------------------------
- // Handle command line parameters
- //
- // The function loads an asset specified on the command line as first argument
- // Other command line parameters are not handled
- //-------------------------------------------------------------------------------
- void HandleCommandLine(char* p_szCommand)
- {
- char* sz = p_szCommand;
- //bool bQuak = false;
- if (strlen(sz) < 2)return;
- if (*sz == '\"')
- {
- char* sz2 = strrchr(sz,'\"');
- if (sz2)*sz2 = 0;
- }
- strcpy( g_szFileName, sz );
- LoadAsset();
- }
- //-------------------------------------------------------------------------------
- // Main message procedure of the application
- //
- // The function handles all incoming messages for the main window.
- // However, if does not directly process input commands.
- // NOTE: Due to the impossibility to process WM_CHAR messages in dialogs
- // properly the code for all hotkeys has been moved to the WndMain
- //-------------------------------------------------------------------------------
- INT_PTR CALLBACK MessageProc(HWND hwndDlg,UINT uMsg,
- WPARAM wParam,LPARAM lParam)
- {
- UNREFERENCED_PARAMETER(lParam);
- UNREFERENCED_PARAMETER(wParam);
- int xPos,yPos;
- int xPos2,yPos2;
- int fHalfX;
- int fHalfY;
- TRACKMOUSEEVENT sEvent;
- switch (uMsg)
- {
- case WM_INITDIALOG:
- CheckDlgButton(hwndDlg,IDC_TOGGLEMS,BST_CHECKED);
- CheckDlgButton(hwndDlg,IDC_ZOOM,BST_CHECKED);
- CheckDlgButton(hwndDlg,IDC_AUTOROTATE,BST_CHECKED);
- SetDlgItemText(hwndDlg,IDC_EVERT,"0");
- SetDlgItemText(hwndDlg,IDC_EFACE,"0");
- SetDlgItemText(hwndDlg,IDC_EMAT,"0");
- SetDlgItemText(hwndDlg,IDC_ESHADER,"0");
- return TRUE;
- case WM_MOUSEWHEEL:
- if (!g_bFPSView)
- {
- g_sCamera.vPos.z += GET_WHEEL_DELTA_WPARAM(wParam) / 50.0f;
- }
- else
- {
- g_sCamera.vPos += (GET_WHEEL_DELTA_WPARAM(wParam) / 50.0f) *
- g_sCamera.vLookAt.Normalize();
- }
- return TRUE;
- case WM_MOUSELEAVE:
- g_bMousePressed = false;
- g_bMousePressedR = false;
- g_bMousePressedM = false;
- g_bMousePressedBoth = false;
- return TRUE;
- case WM_LBUTTONDBLCLK:
- CheckDlgButton(hwndDlg,IDC_AUTOROTATE,
- IsDlgButtonChecked(hwndDlg,IDC_AUTOROTATE) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bRotate = !g_sOptions.bRotate;
- return TRUE;
- case WM_CLOSE:
- PostQuitMessage(0);
- DestroyWindow(hwndDlg);
- return TRUE;
- case WM_LBUTTONDOWN:
- g_bMousePressed = true;
- // register a mouse track handler to be sure we'll know
- // when the mouse leaves the display view again
- sEvent.cbSize = sizeof(TRACKMOUSEEVENT);
- sEvent.dwFlags = TME_LEAVE;
- sEvent.hwndTrack = g_hDlg;
- sEvent.dwHoverTime = HOVER_DEFAULT;
- TrackMouseEvent(&sEvent);
- if (g_bMousePressedR)
- {
- g_bMousePressed = false;
- g_bMousePressedR = false;
- g_bMousePressedBoth = true;
- return TRUE;
- }
- // need to determine the position of the mouse and the
- // distance from the center
- xPos = (int)(short)LOWORD(lParam);
- yPos = (int)(short)HIWORD(lParam);
- xPos -= 10;
- yPos -= 10;
- xPos2 = xPos-3;
- yPos2 = yPos-5;
- RECT sRect;
- GetWindowRect(GetDlgItem(g_hDlg,IDC_RT),&sRect);
- sRect.right -= sRect.left;
- sRect.bottom -= sRect.top;
- // if the mouse klick was inside the viewer panel
- // give the focus to it
- if (xPos > 0 && xPos < sRect.right && yPos > 0 && yPos < sRect.bottom)
- {
- SetFocus(GetDlgItem(g_hDlg,IDC_RT));
- }
- // g_bInvert stores whether the mouse has started on the negative
- // x or on the positive x axis of the imaginary coordinate system
- // with origin p at the center of the HUD texture
- xPos -= sRect.right/2;
- yPos -= sRect.bottom/2;
- if (xPos > 0)g_bInvert = true;
- else g_bInvert = false;
- D3DSURFACE_DESC sDesc;
- g_pcTexture->GetLevelDesc(0,&sDesc);
-
- fHalfX = (int)(((float)sRect.right-(float)sDesc.Width) / 2.0f);
- fHalfY = (int)(((float)sRect.bottom-(float)sDesc.Height) / 2.0f);
- // Determine the input operation to perform for this position
- g_eClick = EClickPos_Outside;
- if (xPos2 >= fHalfX && xPos2 < fHalfX + (int)sDesc.Width &&
- yPos2 >= fHalfY && yPos2 < fHalfY + (int)sDesc.Height &&
- NULL != g_szImageMask)
- {
- // inside the texture. Lookup the grayscale value from it
- xPos2 -= fHalfX;
- yPos2 -= fHalfY;
- unsigned char chValue = g_szImageMask[xPos2 + yPos2 * sDesc.Width];
- if (chValue > 0xFF-20)
- {
- g_eClick = EClickPos_Circle;
- }
- else if (chValue < 0xFF-20 && chValue > 185)
- {
- g_eClick = EClickPos_CircleHor;
- }
- else if (chValue > 0x10 && chValue < 185)
- {
- g_eClick = EClickPos_CircleVert;
- }
- }
- // OLD version of this code. Not using a texture lookup to
- // determine the exact position, but using maths and the fact
- // that we have a circle f(x) = m +rx ;-)
- #if 0
- g_eClick = EClickPos_Circle;
- if (yPos < 10 && yPos > -10)
- {
- if ((xPos2 > fHalfX-5 && xPos2 < fHalfX+15) ||
- (xPos2 > fHalfX+(int)sDesc.Width-10 && xPos2 < fHalfX+(int)sDesc.Width+10))
- {
- g_eClick = EClickPos_CircleHor;
- }
- }
- else if (xPos < 10 && xPos > -10)
- {
- if ((yPos2 > fHalfY-5 && yPos2 < fHalfY+15) ||
- (yPos2 > fHalfY+(int)sDesc.Height-10 && yPos2 < fHalfY+(int)sDesc.Height+10))
- {
- g_eClick = EClickPos_CircleVert;
- }
- }
- else if (sqrtf((float)(xPos * xPos + yPos * yPos)) > (float)(sDesc.Width/2))
- {
- g_eClick = EClickPos_Outside;
- }
- #endif
- return TRUE;
- case WM_RBUTTONDOWN:
- g_bMousePressedR = true;
- sEvent.cbSize = sizeof(TRACKMOUSEEVENT);
- sEvent.dwFlags = TME_LEAVE;
- sEvent.hwndTrack = g_hDlg;
- sEvent.dwHoverTime = HOVER_DEFAULT;
- TrackMouseEvent(&sEvent);
- if (g_bMousePressed)
- {
- g_bMousePressedR = false;
- g_bMousePressed = false;
- g_bMousePressedBoth = true;
- }
- return TRUE;
- case WM_MBUTTONDOWN:
- g_bMousePressedM = true;
- sEvent.cbSize = sizeof(TRACKMOUSEEVENT);
- sEvent.dwFlags = TME_LEAVE;
- sEvent.hwndTrack = g_hDlg;
- sEvent.dwHoverTime = HOVER_DEFAULT;
- TrackMouseEvent(&sEvent);
- return TRUE;
- case WM_LBUTTONUP:
- g_bMousePressed = false;
- g_bMousePressedBoth = false;
- return TRUE;
- case WM_RBUTTONUP:
- g_bMousePressedR = false;
- g_bMousePressedBoth = false;
- return TRUE;
- case WM_MBUTTONUP:
- g_bMousePressedM = false;
- return TRUE;
- case WM_COMMAND:
- if (ID_VIEWER_QUIT == LOWORD(wParam))
- {
- PostQuitMessage(0);
- DestroyWindow(hwndDlg);
- }
- else if (ID_VIEWER_RESETVIEW == LOWORD(wParam))
- {
- g_sCamera.vPos = aiVector3D(0.0f,0.0f,-10.0f);
- g_sCamera.vLookAt = aiVector3D(0.0f,0.0f,1.0f);
- g_sCamera.vUp = aiVector3D(0.0f,1.0f,0.0f);
- g_sCamera.vRight = aiVector3D(0.0f,1.0f,0.0f);
- g_mWorldRotate = aiMatrix4x4();
- g_mWorld = aiMatrix4x4();
- // don't forget to reset the st
- CBackgroundPainter::Instance().ResetSB();
- }
- else if (ID__HELP == LOWORD(wParam))
- {
- DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_AVHELP),
- hwndDlg,&HelpDialogProc);
- }
- else if (ID__ABOUT == LOWORD(wParam))
- {
- DialogBox(g_hInstance,MAKEINTRESOURCE(IDD_ABOUTBOX),
- hwndDlg,&AboutMessageProc);
- }
- else if (ID_VIEWER_H == LOWORD(wParam))
- {
- MakeFileAssociations();
- }
- else if (ID_BACKGROUND_CLEAR == LOWORD(wParam))
- {
- D3DCOLOR clrColor = D3DCOLOR_ARGB(0xFF,100,100,100);
- CBackgroundPainter::Instance().SetColor(clrColor);
- HKEY hTemp;
- RegCreateKeyEx(HKEY_CURRENT_USER,
- "Software\\ASSIMP\\Viewer",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueExA(hTemp,"LastSkyBoxSrc",0,REG_SZ,(const BYTE*)"",MAX_PATH);
- RegSetValueExA(hTemp,"LastTextureSrc",0,REG_SZ,(const BYTE*)"",MAX_PATH);
- RegSetValueExA(hTemp,"Color",0,REG_DWORD,(const BYTE*)&clrColor,4);
- RegCloseKey(hTemp);
- }
- else if (ID_BACKGROUND_SETCOLOR == LOWORD(wParam))
- {
- HKEY hTemp;
- RegCreateKeyEx(HKEY_CURRENT_USER,
- "Software\\ASSIMP\\Viewer",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- RegSetValueExA(hTemp,"LastSkyBoxSrc",0,REG_SZ,(const BYTE*)"",MAX_PATH);
- RegSetValueExA(hTemp,"LastTextureSrc",0,REG_SZ,(const BYTE*)"",MAX_PATH);
- CHOOSECOLOR clr;
- clr.lStructSize = sizeof(CHOOSECOLOR);
- clr.hwndOwner = hwndDlg;
- clr.Flags = CC_RGBINIT | CC_FULLOPEN;
- clr.rgbResult = RGB(100,100,100);
- clr.lpCustColors = g_aclCustomColors;
- clr.lpfnHook = NULL;
- clr.lpTemplateName = NULL;
- clr.lCustData = NULL;
- ChooseColor(&clr);
- D3DCOLOR clrColor = D3DCOLOR_ARGB(0xFF,
- GetRValue(clr.rgbResult),
- GetGValue(clr.rgbResult),
- GetBValue(clr.rgbResult));
- CBackgroundPainter::Instance().SetColor(clrColor);
- RegSetValueExA(hTemp,"Color",0,REG_DWORD,(const BYTE*)&clrColor,4);
- RegCloseKey(hTemp);
- }
- else if (ID_BACKGROUND_LOADTEXTURE == LOWORD(wParam))
- {
- char szFileName[MAX_PATH];
- DWORD dwTemp = MAX_PATH;
- HKEY hTemp;
- RegCreateKeyEx(HKEY_CURRENT_USER,
- "Software\\ASSIMP\\Viewer",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- if(ERROR_SUCCESS != RegQueryValueEx(hTemp,"TextureSrc",NULL,NULL,
- (BYTE*)szFileName,&dwTemp))
- {
- // Key was not found. Use C:
- strcpy(szFileName,"");
- }
- else
- {
- // need to remove the file name
- char* sz = strrchr(szFileName,'\\');
- if (!sz)sz = strrchr(szFileName,'/');
- if (!sz)*sz = 0;
- }
- OPENFILENAME sFilename1 = {
- sizeof(OPENFILENAME),
- g_hDlg,GetModuleHandle(NULL),
- "Textures\0*.png;*.dds;*.tga;*.bmp;*.tif;*.ppm;*.ppx;*.jpg;*.jpeg;*.exr\0*.*\0", NULL, 0, 1,
- szFileName, MAX_PATH, NULL, 0, NULL,
- "Open texture as background",
- OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR,
- 0, 1, ".jpg", 0, NULL, NULL
- };
- if(GetOpenFileName(&sFilename1) == 0) return TRUE;
- // Now store the file in the registry
- RegSetValueExA(hTemp,"TextureSrc",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH);
- RegSetValueExA(hTemp,"LastTextureSrc",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH);
- RegSetValueExA(hTemp,"LastSkyBoxSrc",0,REG_SZ,(const BYTE*)"",MAX_PATH);
- RegCloseKey(hTemp);
- CBackgroundPainter::Instance().SetTextureBG(szFileName);
- }
- else if (ID_BACKGROUND_LOADSKYBOX == LOWORD(wParam))
- {
- char szFileName[MAX_PATH];
- DWORD dwTemp = MAX_PATH;
- HKEY hTemp;
- RegCreateKeyEx(HKEY_CURRENT_USER,
- "Software\\ASSIMP\\Viewer",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- if(ERROR_SUCCESS != RegQueryValueEx(hTemp,"SkyBoxSrc",NULL,NULL,
- (BYTE*)szFileName,&dwTemp))
- {
- // Key was not found. Use C:
- strcpy(szFileName,"");
- }
- else
- {
- // need to remove the file name
- char* sz = strrchr(szFileName,'\\');
- if (!sz)sz = strrchr(szFileName,'/');
- if (!sz)*sz = 0;
- }
- OPENFILENAME sFilename1 = {
- sizeof(OPENFILENAME),
- g_hDlg,GetModuleHandle(NULL),
- "Skyboxes\0*.dds\0*.*\0", NULL, 0, 1,
- szFileName, MAX_PATH, NULL, 0, NULL,
- "Open skybox as background",
- OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR,
- 0, 1, ".dds", 0, NULL, NULL
- };
- if(GetOpenFileName(&sFilename1) == 0) return TRUE;
- // Now store the file in the registry
- RegSetValueExA(hTemp,"SkyBoxSrc",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH);
- RegSetValueExA(hTemp,"LastSkyBoxSrc",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH);
- RegSetValueExA(hTemp,"LastTextureSrc",0,REG_SZ,(const BYTE*)"",MAX_PATH);
- RegCloseKey(hTemp);
- CBackgroundPainter::Instance().SetCubeMapBG(szFileName);
- }
- else if (ID_VIEWER_SAVESCREENSHOTTOFILE == LOWORD(wParam))
- {
- char szFileName[MAX_PATH];
- DWORD dwTemp = MAX_PATH;
- HKEY hTemp;
- RegCreateKeyEx(HKEY_CURRENT_USER,
- "Software\\ASSIMP\\Viewer",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- if(ERROR_SUCCESS != RegQueryValueEx(hTemp,"ScreenShot",NULL,NULL,
- (BYTE*)szFileName,&dwTemp))
- {
- // Key was not found. Use C:
- strcpy(szFileName,"");
- }
- else
- {
- // need to remove the file name
- char* sz = strrchr(szFileName,'\\');
- if (!sz)sz = strrchr(szFileName,'/');
- if (!sz)*sz = 0;
- }
- OPENFILENAME sFilename1 = {
- sizeof(OPENFILENAME),
- g_hDlg,GetModuleHandle(NULL),
- "PNG Images\0*.png", NULL, 0, 1,
- szFileName, MAX_PATH, NULL, 0, NULL,
- "Save Screenshot to file",
- OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR,
- 0, 1, ".png", 0, NULL, NULL
- };
- if(GetSaveFileName(&sFilename1) == 0) return TRUE;
- // Now store the file in the registry
- RegSetValueExA(hTemp,"ScreenShot",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH);
- RegCloseKey(hTemp);
- IDirect3DSurface9* pi;
- g_piDevice->GetRenderTarget(0,&pi);
- D3DXSaveSurfaceToFile(szFileName,D3DXIFF_PNG,
- pi,NULL,NULL);
- pi->Release();
- }
- else if (ID_VIEWER_OPEN == LOWORD(wParam))
- {
- char szFileName[MAX_PATH];
- DWORD dwTemp = MAX_PATH;
- HKEY hTemp;
- RegCreateKeyEx(HKEY_CURRENT_USER,
- "Software\\ASSIMP\\Viewer",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- if(ERROR_SUCCESS != RegQueryValueEx(hTemp,"CurrentApp",NULL,NULL,
- (BYTE*)szFileName,&dwTemp))
- {
- // Key was not found. Use C:
- strcpy(szFileName,"");
- }
- else
- {
- // need to remove the file name
- char* sz = strrchr(szFileName,'\\');
- if (!sz)sz = strrchr(szFileName,'/');
- if (!sz)*sz = 0;
- }
- OPENFILENAME sFilename1 = {
- sizeof(OPENFILENAME),
- g_hDlg,GetModuleHandle(NULL),
- "ASSIMP assets\0*.x;*.obj;*.ms3d;*.3ds;*.md3;*.md1;*.md2;*.md4;*.md5;*.ply\0All files\0*.*", NULL, 0, 1,
- szFileName, MAX_PATH, NULL, 0, NULL,
- "Import Asset into ASSIMP",
- OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOCHANGEDIR,
- 0, 1, ".x", 0, NULL, NULL
- };
- if(GetOpenFileName(&sFilename1) == 0) return TRUE;
- // Now store the file in the registry
- RegSetValueExA(hTemp,"CurrentApp",0,REG_SZ,(const BYTE*)szFileName,MAX_PATH);
- RegCloseKey(hTemp);
- if (0 != strcmp(g_szFileName,szFileName))
- {
- strcpy(g_szFileName, szFileName);
- DeleteAssetData();
- DeleteAsset();
- LoadAsset();
- }
- }
- else if (ID_VIEWER_CLOSEASSET == LOWORD(wParam))
- {
- DeleteAssetData();
- DeleteAsset();
- }
- else if (BN_CLICKED == HIWORD(wParam))
- {
- if (IDC_TOGGLEMS == LOWORD(wParam))
- {
- g_sOptions.bMultiSample = !g_sOptions.bMultiSample;
- DeleteAssetData();
- ShutdownDevice();
- if (0 == CreateDevice())
- {
- CLogDisplay::Instance().AddEntry(
- "[ERROR] Failed to toggle MultiSampling mode");
- g_sOptions.bMultiSample = !g_sOptions.bMultiSample;
- CreateDevice();
- }
- CreateAssetData();
- if (g_sOptions.bMultiSample)
- {
- CLogDisplay::Instance().AddEntry(
- "[OK] Changed MultiSampling mode to the maximum value for this device");
- }
- else
- {
- CLogDisplay::Instance().AddEntry(
- "[OK] MultiSampling has been disabled");
- }
- }
- else if (IDC_TOGGLEMAT == LOWORD(wParam))
- {
- g_sOptions.bRenderMats = !g_sOptions.bRenderMats;
- }
- else if (IDC_NOSPECULAR == LOWORD(wParam))
- {
- g_sOptions.bNoSpecular = !g_sOptions.bNoSpecular;
- UpdateSpecularMaterials();
- }
- else if (IDC_ZOOM == LOWORD(wParam))
- {
- g_bFPSView = !g_bFPSView;
- SetupFPSView();
- }
- else if (IDC_TOGGLENORMALS == LOWORD(wParam))
- {
- g_sOptions.bRenderNormals = !g_sOptions.bRenderNormals;
- }
- else if (IDC_LOWQUALITY == LOWORD(wParam))
- {
- g_sOptions.bLowQuality = !g_sOptions.bLowQuality;
- }
- else if (IDC_3LIGHTS == LOWORD(wParam))
- {
- g_sOptions.b3Lights = !g_sOptions.b3Lights;
- }
- else if (IDC_LIGHTROTATE == LOWORD(wParam))
- {
- g_sOptions.bLightRotate = !g_sOptions.bLightRotate;
- }
- else if (IDC_AUTOROTATE == LOWORD(wParam))
- {
- g_sOptions.bRotate = !g_sOptions.bRotate;
- }
- else if (IDC_TOGGLEWIRE == LOWORD(wParam))
- {
- if (g_sOptions.eDrawMode == RenderOptions::WIREFRAME)
- g_sOptions.eDrawMode = RenderOptions::NORMAL;
- else g_sOptions.eDrawMode = RenderOptions::WIREFRAME;
- }
- }
- return TRUE;
- };
- return FALSE;
- }
- //-------------------------------------------------------------------------------
- // Message prcoedure for the progress dialog
- //-------------------------------------------------------------------------------
- INT_PTR CALLBACK ProgressMessageProc(HWND hwndDlg,UINT uMsg,
- WPARAM wParam,LPARAM lParam)
- {
- UNREFERENCED_PARAMETER(lParam);
- switch (uMsg)
- {
- case WM_INITDIALOG:
- SendDlgItemMessage(hwndDlg,IDC_PROGRESS,PBM_SETRANGE,0,
- MAKELPARAM(0,500));
- SetTimer(hwndDlg,0,40,NULL);
- return TRUE;
- case WM_CLOSE:
- EndDialog(hwndDlg,0);
- return TRUE;
- case WM_COMMAND:
- if (IDOK == LOWORD(wParam))
- {
- #if 0
- g_bLoadingCanceled = true;
- TerminateThread(g_hThreadHandle,5);
- g_pcAsset = NULL;
- EndDialog(hwndDlg,0);
- #endif
- // PROBLEM: If we terminate the loader thread, ASSIMP's state
- // is undefined. Any further attempts to load assets will
- // fail.
- exit(5);
- // return TRUE;
- }
- case WM_TIMER:
- UINT iPos = (UINT)SendDlgItemMessage(hwndDlg,IDC_PROGRESS,PBM_GETPOS,0,0);
- iPos += 10;
- if (iPos > 490)iPos = 0;
- SendDlgItemMessage(hwndDlg,IDC_PROGRESS,PBM_SETPOS,iPos,0);
- if (g_bLoadingFinished)
- {
- EndDialog(hwndDlg,0);
- return TRUE;
- }
- return TRUE;
- }
- return FALSE;
- }
- //-------------------------------------------------------------------------------
- // Message procedure for the about dialog
- //-------------------------------------------------------------------------------
- INT_PTR CALLBACK AboutMessageProc(HWND hwndDlg,UINT uMsg,
- WPARAM wParam,LPARAM lParam)
- {
- UNREFERENCED_PARAMETER(lParam);
- switch (uMsg)
- {
- case WM_CLOSE:
- EndDialog(hwndDlg,0);
- return TRUE;
- case WM_COMMAND:
- if (IDOK == LOWORD(wParam))
- {
- EndDialog(hwndDlg,0);
- return TRUE;
- }
- }
- return FALSE;
- }
- };
- using namespace AssimpView;
- //-------------------------------------------------------------------------------
- // Entry point to the application
- //-------------------------------------------------------------------------------
- int APIENTRY _tWinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPTSTR lpCmdLine,
- int nCmdShow)
- {
- UNREFERENCED_PARAMETER(hPrevInstance);
- UNREFERENCED_PARAMETER(lpCmdLine);
- // needed for the RichEdit control in the about/help dialog
- LoadLibrary( "riched20.dll" );
- InitCommonControls();
- g_hInstance = hInstance;
- if (0 == InitD3D())
- {
- MessageBox(NULL,"Failed to initialize Direct3D 9",
- "ASSIMP ModelViewer",MB_OK);
- return -6;
- }
- HWND hDlg = CreateDialog(hInstance,MAKEINTRESOURCE(IDD_DIALOGMAIN),
- NULL,&MessageProc);
- if (NULL == hDlg)
- {
- MessageBox(NULL,"Failed to create dialog from resource",
- "ASSIMP ModelViewer",MB_OK);
- return -5;
- }
- g_hDlg = hDlg;
- MSG uMsg;
- memset(&uMsg,0,sizeof( MSG));
- ShowWindow( hDlg, nCmdShow );
- UpdateWindow( hDlg );
- if (0 == CreateDevice(true,false,true))
- {
- MessageBox(NULL,"Failed to initialize Direct3D 9 (2)",
- "ASSIMP ModelViewer",MB_OK);
- return -4;
- }
- CLogDisplay::Instance().AddEntry("[OK] The viewer has been initialized successfully");
- // recover background skyboxes/textures from the last session
- HKEY hTemp;
- union
- {
- char szFileName[MAX_PATH];
- D3DCOLOR clrColor;
- };
- DWORD dwTemp = MAX_PATH;
- RegCreateKeyEx(HKEY_CURRENT_USER,
- "Software\\ASSIMP\\Viewer",NULL,NULL,0,KEY_ALL_ACCESS, NULL, &hTemp,NULL);
- if(ERROR_SUCCESS == RegQueryValueEx(hTemp,"LastSkyBoxSrc",NULL,NULL,
- (BYTE*)szFileName,&dwTemp) && '\0' != szFileName[0])
- {
- CBackgroundPainter::Instance().SetCubeMapBG(szFileName);
- }
- else if(ERROR_SUCCESS == RegQueryValueEx(hTemp,"LastTextureSrc",NULL,NULL,
- (BYTE*)szFileName,&dwTemp) && '\0' != szFileName[0])
- {
- CBackgroundPainter::Instance().SetTextureBG(szFileName);
- }
- else if(ERROR_SUCCESS == RegQueryValueEx(hTemp,"Color",NULL,NULL,
- (BYTE*)&clrColor,&dwTemp))
- {
- CBackgroundPainter::Instance().SetColor(clrColor);
- }
- RegCloseKey(hTemp);
- // now handle command line arguments
- HandleCommandLine(lpCmdLine);
- double adLast[30];
- for (int i = 0; i < 30;++i)adLast[i] = 0.0f;
- int iCurrent = 0;
- double g_dCurTime = 0;
- double g_dLastTime = 0;
- while( uMsg.message != WM_QUIT )
- {
- if( PeekMessage( &uMsg, NULL, 0, 0, PM_REMOVE ) )
- {
- TranslateMessage( &uMsg );
- DispatchMessage( &uMsg );
- if (WM_CHAR == uMsg.message)
- {
- switch ((char)uMsg.wParam)
- {
- case 'M':
- case 'm':
- CheckDlgButton(g_hDlg,IDC_TOGGLEMS,
- IsDlgButtonChecked(g_hDlg,IDC_TOGGLEMS) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bMultiSample = !g_sOptions.bMultiSample;
- DeleteAssetData();
- ShutdownDevice();
- if (0 == CreateDevice())
- {
- CLogDisplay::Instance().AddEntry(
- "[ERROR] Failed to toggle MultiSampling mode");
- g_sOptions.bMultiSample = !g_sOptions.bMultiSample;
- CreateDevice();
- }
- CreateAssetData();
- if (g_sOptions.bMultiSample)
- {
- CLogDisplay::Instance().AddEntry(
- "[OK] Changed MultiSampling mode to the maximum value for this device");
- }
- else
- {
- CLogDisplay::Instance().AddEntry(
- "[OK] MultiSampling has been disabled");
- }
- break;
- case 'L':
- case 'l':
- CheckDlgButton(g_hDlg,IDC_3LIGHTS,
- IsDlgButtonChecked(g_hDlg,IDC_3LIGHTS) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.b3Lights = !g_sOptions.b3Lights;
- break;
- case 'P':
- case 'p':
- CheckDlgButton(g_hDlg,IDC_LOWQUALITY,
- IsDlgButtonChecked(g_hDlg,IDC_LOWQUALITY) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bLowQuality = !g_sOptions.bLowQuality;
- break;
- case 'D':
- case 'd':
- CheckDlgButton(g_hDlg,IDC_TOGGLEMAT,
- IsDlgButtonChecked(g_hDlg,IDC_TOGGLEMAT) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bRenderMats = !g_sOptions.bRenderMats;
- break;
- case 'N':
- case 'n':
- CheckDlgButton(g_hDlg,IDC_TOGGLENORMALS,
- IsDlgButtonChecked(g_hDlg,IDC_TOGGLENORMALS) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bRenderNormals = !g_sOptions.bRenderNormals;
- break;
- case 'S':
- case 's':
- CheckDlgButton(g_hDlg,IDC_NOSPECULAR,
- IsDlgButtonChecked(g_hDlg,IDC_NOSPECULAR) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bNoSpecular = !g_sOptions.bNoSpecular;
- UpdateSpecularMaterials();
- break;
- case 'A':
- case 'a':
- CheckDlgButton(g_hDlg,IDC_AUTOROTATE,
- IsDlgButtonChecked(g_hDlg,IDC_AUTOROTATE) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bRotate = !g_sOptions.bRotate;
- break;
- case 'R':
- case 'r':
- CheckDlgButton(g_hDlg,IDC_LIGHTROTATE,
- IsDlgButtonChecked(g_hDlg,IDC_LIGHTROTATE) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_sOptions.bLightRotate = !g_sOptions.bLightRotate;
- break;
- case 'Z':
- case 'z':
- CheckDlgButton(g_hDlg,IDC_ZOOM,
- IsDlgButtonChecked(g_hDlg,IDC_ZOOM) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- g_bFPSView = !g_bFPSView;
- SetupFPSView();
- break;
- case 'W':
- case 'w':
- CheckDlgButton(g_hDlg,IDC_TOGGLEWIRE,
- IsDlgButtonChecked(g_hDlg,IDC_TOGGLEWIRE) == BST_CHECKED
- ? BST_UNCHECKED : BST_CHECKED);
- if (g_sOptions.eDrawMode == RenderOptions::NORMAL)
- g_sOptions.eDrawMode = RenderOptions::WIREFRAME;
- else g_sOptions.eDrawMode = RenderOptions::NORMAL;
- break;
- }
- }
- }
- // render the scene
- Render();
- g_dCurTime = timeGetTime();
- g_fElpasedTime = (float)((g_dCurTime - g_dLastTime) * 0.001);
- g_dLastTime = g_dCurTime;
- adLast[iCurrent++] = 1.0f / g_fElpasedTime;
- double dFPS = 0.0;
- for (int i = 0;i < 30;++i)
- dFPS += adLast[i];
- dFPS /= 30.0;
- if (30 == iCurrent)
- {
- iCurrent = 0;
- if (dFPS != g_fFPS)
- {
- g_fFPS = dFPS;
- char szOut[256];
- sprintf(szOut,"%i",(int)floorf((float)dFPS+0.5f));
- SetDlgItemText(g_hDlg,IDC_EFPS,szOut);
- }
- }
- }
- DeleteAsset();
- ShutdownDevice();
- ShutdownD3D();
- return 0;
- }
|