void AHEMImporter<PFP>::LoadMesh() { // Load mesh topological structure LoadTopology(); // Load vertices position for(unsigned int i = 0 ; i < hdr.attributesChunkNumber ; i++) if(IsEqualGUID(attrDesc[i].semantic, AHEMATTRIBUTE_POSITION)) { LoadPosition(attrDesc + i); break; } }
INT_PTR CALLBACK ExitDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { switch(msg) { case WM_INITDIALOG: { TranslateDialogDefault(hdlg); LoadPosition(hdlg, "ExitDlg"); ShowWindow(hdlg,SW_SHOW); }break; case WM_COMMAND: switch(LOWORD(wparam)) { case IDOK: { SavePosition(hdlg, "ExitDlg"); SaveSessionDate(); SaveSessionHandles(0,0); db_set_b(NULL, MODNAME, "lastempty", 0); DestroyWindow(hdlg); }break; case IDCANCEL: { SavePosition(hdlg, "ExitDlg"); db_set_b(NULL, MODNAME, "lastempty", 1); DestroyWindow(hdlg); }break; } case WM_CLOSE: DestroyWindow(hdlg); break; case WM_DESTROY: PostQuitMessage(0); break; default: return FALSE; } return TRUE; }
INT_PTR CALLBACK LoadSessionDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { g_hDlg=hdlg; switch(msg) { case WM_INITDIALOG: { int iDelay=db_get_w(NULL, MODNAME, "StartupModeDelay", 1500); if (g_hghostw == TRUE) SetTimer(hdlg, TIMERID_LOAD, iDelay, NULL); else { ses_count=0; TranslateDialogDefault(hdlg); if ((ses_count=LoadSessionToCombobox(hdlg,0,ses_limit,"SessionDate",0)) == ses_limit) EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE); if (LoadSessionToCombobox(hdlg,0,255,"UserSessionDsc",ses_limit) == 0 && ses_count!=0) ses_count=0; if (session_list_recovered[0]) ses_count=256; SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, 0, 0); LoadPosition(hdlg, "LoadDlg"); if (StartUp) SetTimer(hdlg, TIMERID_SHOW, iDelay, NULL); else ShowWindow(g_hDlg,SW_SHOW); } }break; case WM_TIMER: if (wparam == TIMERID_SHOW) { KillTimer(hdlg, TIMERID_SHOW); ShowWindow(hdlg,SW_SHOW); StartUp=FALSE; } else { KillTimer(hdlg, TIMERID_LOAD); LoadSession(0,0); g_hghostw=StartUp=FALSE; DestroyWindow(hdlg); g_hDlg=0; } break; case WM_CLOSE: SavePosition(hdlg, "LoadDlg"); DestroyWindow(hdlg); g_hDlg=0; break; case WM_COMMAND: switch(LOWORD(wparam)) { case IDC_LIST: { switch(HIWORD(wparam)) { case CBN_SELCHANGE: { HWND hCombo = GetDlgItem(hdlg, IDC_LIST); int index = SendMessage(hCombo, CB_GETCURSEL, 0, 0); if (index != CB_ERR) ses_count = SendMessage(hCombo, CB_GETITEMDATA, (WPARAM)index, 0); }break; }break; }break; case IDC_SESSDEL: { if (session_list_recovered[0]&&ses_count == 256) { int i=0; while(session_list_recovered[i]) { db_set_b(session_list_recovered[i], MODNAME, "wasInLastSession", 0); i++; } ZeroMemory(session_list_recovered,SIZEOF(session_list_recovered)); g_bIncompletedSave=0; EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE); SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT, 0, 0); if ((ses_count=LoadSessionToCombobox(hdlg,1,ses_limit,"SessionDate",0)) == ses_limit) EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE); if (LoadSessionToCombobox(hdlg,1,255,"UserSessionDsc",ses_limit) == 0 && ses_count!=0) ses_count=0; SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, 0, 0); } else if (ses_count>=ses_limit) { ses_count-=ses_limit; DelUserDefSession(ses_count); EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE); SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT, 0, 0); if ((ses_count=LoadSessionToCombobox(hdlg,0,ses_limit,"SessionDate",0)) == ses_limit) EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE); if (LoadSessionToCombobox(hdlg,0,255,"UserSessionDsc",ses_limit) == 0 && ses_count!=0) ses_count=0; if (session_list_recovered[0]) ses_count=256; SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, 0, 0); } else { DeleteAutoSession(ses_count); EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE); SendDlgItemMessage(hdlg, IDC_LIST, CB_RESETCONTENT, 0, 0); if ((ses_count=LoadSessionToCombobox(hdlg,0,ses_limit,"SessionDate",0)) == ses_limit) EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE); if (LoadSessionToCombobox(hdlg,0,255,"UserSessionDsc",ses_limit) == 0 && ses_count!=0) ses_count=0; if (session_list_recovered[0]) ses_count=256; SendDlgItemMessage(hdlg, IDC_LIST, CB_SETCURSEL, 0, 0); } if (SendDlgItemMessage(hdlg, IDC_LIST, CB_GETCOUNT, 0, 0)) EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),TRUE); else EnableWindow(GetDlgItem(hdlg,IDC_SESSDEL),FALSE); }break; case IDOK: { if (!LoadSession(0,ses_count)) { SavePosition(hdlg, "LoadDlg"); DestroyWindow(hdlg); g_hDlg=0; } }break; case IDCANCEL: { SavePosition(hdlg, "LoadDlg"); DestroyWindow(hdlg); g_hDlg=0; }break; } break; default: return FALSE; } return TRUE; }
INT_PTR CALLBACK SaveSessionDlgProc(HWND hdlg,UINT msg,WPARAM wparam,LPARAM lparam) { g_hSDlg = hdlg; switch(msg) { case WM_INITDIALOG: { HWND hList; hList = GetDlgItem(hdlg, IDC_LIST); TranslateDialogDefault(hdlg); LoadSessionToCombobox(hdlg, 1, 5, "UserSessionDsc", 0); LoadPosition(hdlg, "SaveDlg"); ShowWindow(hdlg, SW_SHOW); }break; case WM_CLOSE: DestroyWindow(hdlg); g_hSDlg = 0; break; case WM_NOTIFY: { switch (((LPNMHDR) lparam)->idFrom) { case IDC_CLIST: switch (((LPNMHDR)lparam)->code) { case CLN_CHECKCHANGED: { bSC = TRUE; memcpy(user_session_list, session_list, SIZEOF(user_session_list)); }break; } }break; }break; case WM_COMMAND: switch(LOWORD(wparam)) { case IDC_SELCONTACTS: { HANDLE hItem; RECT rWnd; int i=0, x=0,y=0,dy=0,dx=0,dd=0; GetWindowRect(hdlg, &rWnd); x=rWnd.right-rWnd.left; y=rWnd.bottom-rWnd.top; if (IsDlgButtonChecked(hdlg,IDC_SELCONTACTS)) { EnableWindow(GetDlgItem(hdlg,IDC_SANDCCHECK),FALSE); dy=20; dx=150; dd=5; hClistControl = CreateWindowEx(WS_EX_CLIENTEDGE, _T(CLISTCONTROL_CLASS), _T(""), WS_TABSTOP |WS_VISIBLE | WS_CHILD , x, y, dx, dy, hdlg, (HMENU)IDC_CLIST, hinstance, 0); SetWindowLongPtr(hClistControl, GWL_STYLE, GetWindowLongPtr(hClistControl, GWL_STYLE)|CLS_CHECKBOXES|CLS_HIDEEMPTYGROUPS|CLS_USEGROUPS|CLS_GREYALTERNATE|CLS_GROUPCHECKBOXES); SendMessage(hClistControl, CLM_SETEXSTYLE, CLS_EX_DISABLEDRAGDROP|CLS_EX_TRACKSELECT, 0); } else { EnableWindow(GetDlgItem(hdlg,IDC_SANDCCHECK),TRUE); dy=-20; dx=-150; dd=5; DestroyWindow(hClistControl); } SetWindowPos(hdlg, NULL, rWnd.left,rWnd.top, x+dx, y+(dx/3), SWP_NOZORDER | SWP_NOOWNERZORDER|SWP_NOMOVE); SetWindowPos(hClistControl,0,x-dd,dd,dx-dd,y+(dx/12),SWP_NOZORDER/*|SWP_NOSIZE|SWP_SHOWWINDOW*/); SendMessage(hClistControl,WM_TIMER,TIMERID_REBUILDAFTER,0); for ( i = 0; session_list[i] > 0; i++) { hItem=(HANDLE)SendMessage(hClistControl,CLM_FINDCONTACT, (WPARAM)session_list[i], 0); SendMessage(hClistControl, CLM_SETCHECKMARK, (WPARAM)hItem,1); } OffsetWindow(hdlg, GetDlgItem(hdlg,IDC_LIST), 0, dy); OffsetWindow(hdlg, GetDlgItem(hdlg,IDC_STATIC), 0, dy); OffsetWindow(hdlg, GetDlgItem(hdlg,IDC_SANDCCHECK), 0, dy); OffsetWindow(hdlg, GetDlgItem(hdlg,IDOK), 0, dy); OffsetWindow(hdlg, GetDlgItem(hdlg,IDCANCEL), 0, dy); }break; case IDOK: { DWORD session_list_temp[255]={0}; int lenght,i = 0; TCHAR szUserSessionName[MAX_PATH]; lenght = GetWindowTextLength(GetDlgItem(hdlg, IDC_LIST)); SavePosition(hdlg, "SaveDlg"); if (lenght>0) { GetWindowText(GetDlgItem(hdlg, IDC_LIST), szUserSessionName, SIZEOF(szUserSessionName)); szUserSessionName[lenght+1]='\0'; if (IsDlgButtonChecked(hdlg,IDC_SELCONTACTS)&&bSC) { for (HANDLE hContact = db_find_first(); hContact; hContact = db_find_next(hContact)) { BYTE res =(BYTE)SendMessage(hClistControl, CLM_GETCHECKMARK, SendMessage(hClistControl, CLM_FINDCONTACT, (WPARAM)hContact, 0), 0); if (res) { user_session_list[i] = hContact; i++; } } memcpy(session_list_temp,session_list,SIZEOF(session_list_temp)); memcpy(session_list,user_session_list,SIZEOF(session_list)); SaveSessionHandles(0,1); SaveUserSessionName(szUserSessionName); memcpy(session_list,session_list_temp,SIZEOF(session_list)); DestroyWindow(hdlg); g_hSDlg=0; } else if (!SaveUserSessionName(szUserSessionName)) { SaveSessionHandles(0,1); if (IsDlgButtonChecked(hdlg,IDC_SANDCCHECK)) CloseCurrentSession(0,0); DestroyWindow(hdlg); g_hSDlg=0; } else MessageBox(NULL,TranslateT("Current session is empty!"),TranslateT("Sessions Manager"),MB_OK|MB_ICONWARNING); } else MessageBox(NULL,TranslateT("Session name is empty, enter the name and try again"),TranslateT("Sessions Manager"),MB_OK|MB_ICONWARNING); }break; case IDCANCEL: { SavePosition(hdlg, "SaveDlg"); DestroyWindow(hdlg); g_hSDlg=0; }break; } break; default: return FALSE; } return TRUE; }
MDLViewer::MDLViewer () : mxWindow (0, 0, 0, 0, 0, g_appTitle, mxWindow::Normal) { int i; g_MDLViewer = this; FacePoser_MakeToolWindow( this, false ); workspace = new CMDLViewerWorkspace( this, 0, 0, 500, 500, "" ); windowtab = new CMDLViewerWindowTab( this, 0, 500, 500, 20, IDC_WINDOW_TAB ); modeltab = new CMDLViewerModelTab( this, 500, 500, 100, 20, IDC_MODEL_TAB ); gridsettings = new CMDLViewerGridSettings( this, 0, 500, 500, 20 ); modeltab->SetRightJustify( true ); g_pStatusWindow = new mxStatusWindow( workspace, 0, 0, 1024, 150, "" ); g_pStatusWindow->setVisible( true ); InitViewerSettings( "faceposer" ); g_viewerSettings.speechapiindex = SPEECH_API_LIPSINC; g_viewerSettings.flHeadTurn = 0.0f; g_viewerSettings.m_iEditAttachment = -1; LoadPosition(); // ShowWindow( (HWND)getHandle(), SW_SHOWMAXIMIZED ); g_pStatusWindow->setBounds( 0, h2() - 150, w2(), 150 ); Con_Printf( "MDLViewer started\n" ); Con_Printf( "CSoundEmitterSystemBase::Init()\n" ); soundemitter->BaseInit(); Con_Printf( "Creating menu bar\n" ); // create menu stuff mb = new mxMenuBar (this); menuFile = new mxMenu (); menuOptions = new mxMenu (); menuWindow = new mxMenu (); menuHelp = new mxMenu (); menuEdit = new mxMenu (); menuExpressions = new mxMenu(); menuChoreography = new mxMenu(); mb->addMenu ("File", menuFile); mb->addMenu( "Edit", menuEdit ); mb->addMenu ("Options", menuOptions); mb->addMenu ( "Expression", menuExpressions ); mb->addMenu ( "Choreography", menuChoreography ); mb->addMenu ("Window", menuWindow); mb->addMenu ("Help", menuHelp); mxMenu *menuRecentModels = new mxMenu (); menuRecentModels->add ("(empty)", IDC_FILE_RECENTMODELS1); menuRecentModels->add ("(empty)", IDC_FILE_RECENTMODELS2); menuRecentModels->add ("(empty)", IDC_FILE_RECENTMODELS3); menuRecentModels->add ("(empty)", IDC_FILE_RECENTMODELS4); menuFile->add ("Load Model...", IDC_FILE_LOADMODEL); menuFile->add( "Refresh\tF5", IDC_FILE_REFRESH ); menuFile->addSeparator(); menuFile->add ("Load Background Texture...", IDC_FILE_LOADBACKGROUNDTEX); menuFile->add ("Load Ground Texture...", IDC_FILE_LOADGROUNDTEX); menuFile->addSeparator (); menuFile->add ("Unload Ground Texture", IDC_FILE_UNLOADGROUNDTEX); menuFile->addSeparator (); menuFile->addMenu ("Recent Models", menuRecentModels); menuFile->addSeparator (); menuFile->add ("Exit", IDC_FILE_EXIT); menuFile->setEnabled(IDC_FILE_LOADBACKGROUNDTEX, false); menuFile->setEnabled(IDC_FILE_LOADGROUNDTEX, false); menuFile->setEnabled(IDC_FILE_UNLOADGROUNDTEX, false); menuEdit->add( "&Undo\tCtrl+Z", IDC_EDIT_UNDO ); //menuFile->setEnabled( IDC_EDIT_UNDO, false ); menuEdit->add( "&Redo\tCtrl+Y", IDC_EDIT_REDO ); //menuFile->setEnabled( IDC_EDIT_REDO, false ); menuEdit->addSeparator(); menuEdit->add( "&Copy\tCtrl+C", IDC_EDIT_COPY ); menuEdit->add( "&Paste\tCtrl+V", IDC_EDIT_PASTE ); menuOptions->add ("Background Color...", IDC_OPTIONS_COLORBACKGROUND); menuOptions->add ("Ground Color...", IDC_OPTIONS_COLORGROUND); menuOptions->add ("Light Color...", IDC_OPTIONS_COLORLIGHT); menuOptions->addSeparator (); menuOptions->add ("Center View", IDC_OPTIONS_CENTERVIEW); menuOptions->add ("Center on Face", IDC_OPTIONS_CENTERONFACE ); #ifdef WIN32 menuOptions->addSeparator (); menuOptions->add ("Make Screenshot...", IDC_OPTIONS_MAKESCREENSHOT); //menuOptions->add ("Dump Model Info", IDC_OPTIONS_DUMP); #endif menuExpressions->add( "New...", IDC_EXPRESSIONS_NEW ); menuExpressions->addSeparator (); menuExpressions->add( "Load...", IDC_EXPRESSIONS_LOAD ); menuExpressions->add( "Save", IDC_EXPRESSIONS_SAVE ); menuExpressions->addSeparator (); menuExpressions->add( "Export to VFE", IDC_EXPRESSIONS_EXPORT ); menuExpressions->addSeparator (); menuExpressions->add( "Close class", IDC_EXPRESSIONS_CLOSE ); menuExpressions->add( "Close all classes", IDC_EXPRESSIONS_CLOSEALL ); menuExpressions->addSeparator(); menuExpressions->add( "Recreate all bitmaps", IDC_EXPRESSIONS_REDOBITMAPS ); menuChoreography->add( "New...", IDC_CHOREOSCENE_NEW ); menuChoreography->addSeparator(); menuChoreography->add( "Load...", IDC_CHOREOSCENE_LOAD ); menuChoreography->add( "Save", IDC_CHOREOSCENE_SAVE ); menuChoreography->add( "Save As...", IDC_CHOREOSCENE_SAVEAS ); menuChoreography->addSeparator(); menuChoreography->add( "Close", IDC_CHOREOSCENE_CLOSE ); menuChoreography->addSeparator(); menuChoreography->add( "Add Actor...", IDC_CHOREOSCENE_ADDACTOR ); #ifdef WIN32 menuHelp->add ("Goto Homepage...", IDC_HELP_GOTOHOMEPAGE); menuHelp->addSeparator (); #endif menuHelp->add ("About...", IDC_HELP_ABOUT); // create the Material System window Con_Printf( "Creating 3D View\n" ); g_pMatSysWindow = new MatSysWindow (workspace, 0, 0, 0, 0, "", mxWindow::Normal); Con_Printf( "Creating control panel\n" ); g_pControlPanel = new ControlPanel (workspace); Con_Printf( "Creating phoneme editor\n" ); g_pPhonemeEditor = new PhonemeEditor( workspace ); Con_Printf( "Creating expression tool\n" ); g_pExpressionTool = new ExpressionTool( workspace ); Con_Printf( "Creating gesture tool\n" ); g_pGestureTool = new GestureTool( workspace ); Con_Printf( "Creating ramp tool\n" ); g_pRampTool = new RampTool( workspace ); Con_Printf( "Creating scene ramp tool\n" ); g_pSceneRampTool = new SceneRampTool( workspace ); Con_Printf( "Creating expression tray\n" ); g_pExpressionTrayTool = new mxExpressionTray( workspace, IDC_EXPRESSIONTRAY ); Con_Printf( "Creating flex slider window\n" ); g_pFlexPanel = new FlexPanel( workspace ); Con_Printf( "Creating choreography view\n" ); g_pChoreoView = new CChoreoView( workspace, 200, 200, 400, 300, 0 ); // Choreo scene file drives main window title name g_pChoreoView->SetUseForMainWindowTitle( true ); Con_Printf( "IFacePoserToolWindow::Init\n" ); IFacePoserToolWindow::Init(); Con_Printf( "windowtab->Init\n" ); windowtab->Init(); Con_Printf( "loadRecentFiles\n" ); loadRecentFiles (); initRecentFiles (); Con_Printf( "LoadWindowPositions\n" ); LoadWindowPositions(); Con_Printf( "RestoreThumbnailSize\n" ); g_pExpressionTrayTool->RestoreThumbnailSize(); Con_Printf( "Add Tool Windows\n" ); int c = IFacePoserToolWindow::GetToolCount(); for ( i = 0; i < c ; i++ ) { IFacePoserToolWindow *tool = IFacePoserToolWindow::GetTool( i ); menuWindow->add( tool->GetToolName(), IDC_WINDOW_FIRSTTOOL + i ); } menuWindow->addSeparator(); menuWindow->add( "Cascade", IDC_WINDOW_CASCADE ); menuWindow->addSeparator(); menuWindow->add( "Tile", IDC_WINDOW_TILE ); menuWindow->add( "Tile Horizontally", IDC_WINDOW_TILE_HORIZ ); menuWindow->add( "Tile Vertically", IDC_WINDOW_TILE_VERT ); menuWindow->addSeparator(); menuWindow->add( "Hide All", IDC_WINDOW_HIDEALL ); menuWindow->add( "Show All", IDC_WINDOW_SHOWALL ); Con_Printf( "UpdateWindowMenu\n" ); UpdateWindowMenu(); m_nCurrentFrame = 0; Con_Printf( "gridsettings->Init()\n" ); gridsettings->Init(); Con_Printf( "Model viewer created\n" ); }
void SkeletalTracker::Nui_DrawSkeleton( NUI_SKELETON_DATA * pSkel, HWND hWnd, int WhichSkeletonColor ) { ArmPosition currentArmPosition; LoadPosition(pSkel, ¤tArmPosition); { if( currentArmPosition.awayFromBody(AWAY_FROM_BODY)) { XYZPoint* pPointer = NULL; float xBias = 0; float yBias = Y_BIAS; if (abs(currentArmPosition.m_body.m_z - currentArmPosition.m_leftHand.m_z) < CLOSE_TO_BODY ) { pPointer = ¤tArmPosition.m_rightHand; xBias = - X_BIAS; } else if (abs(currentArmPosition.m_body.m_z - currentArmPosition.m_rightHand.m_z) < CLOSE_TO_BODY ) { pPointer = ¤tArmPosition.m_leftHand; xBias = + X_BIAS; } else { // wprintf(L"body sep: %d, left: %d, right: %d \n", currentArmPosition.m_body.m_z, currentArmPosition.m_leftHand.m_z, currentArmPosition.m_rightHand.m_z); } if (pPointer != NULL) { // wprintf(L"Pointing \n"); float x = (float)(pPointer->m_x + xBias - currentArmPosition.m_body.m_x) / X_ARM_RANGE + 0.5f; float y = (float)(pPointer->m_y - yBias - currentArmPosition.m_body.m_y) / Y_ARM_RANGE + 0.5f; // wprintf(L"Pointing body sep: %d, left: %d, right: %d, pointing at (%f, %f) \n", currentArmPosition.m_body.m_x, currentArmPosition.m_leftHand.m_x, currentArmPosition.m_rightHand.m_x, x, y); point(x, 1-y); } else { boolean zooming = false; boolean panning = false; boolean rotating = false; boolean rotatingY = false; ArmPosition deltaArmPosition; deltaArmPosition.minus(currentArmPosition, m_lastArmPosition); int sumXdx = deltaArmPosition.m_leftHand.m_x + deltaArmPosition.m_rightHand.m_x; int sumYdx = deltaArmPosition.m_leftHand.m_y + deltaArmPosition.m_rightHand.m_y; SHORT sumZdx = deltaArmPosition.m_leftHand.m_z + deltaArmPosition.m_rightHand.m_z; int diffXdx = deltaArmPosition.m_leftHand.m_x - deltaArmPosition.m_rightHand.m_x; int diffYdx = deltaArmPosition.m_leftHand.m_y - deltaArmPosition.m_rightHand.m_y; SHORT diffZdx = deltaArmPosition.m_leftHand.m_z - deltaArmPosition.m_rightHand.m_z; int panningVal = (int)( (abs(sumYdx) + abs(sumXdx))); int rotationVal = abs(diffYdx); int rotationValY = abs(diffZdx) / 10; int zoomVal = abs(diffXdx); int inertia = INERTIA; // printf("Pan: %d, rot: %d, rotY: %d (%d - %d), zoom: %d\n", panningVal, rotationVal, rotationValY, deltaArmPosition.m_leftHand.m_z, deltaArmPosition.m_rightHand.m_z, zoomVal); if (m_gestureType == GESTURE_PAN) { panningVal = (int) ((float)panningVal * 2); } else if (m_gestureType == GESTURE_ZOOM) { zoomVal = (int) ((float)zoomVal * 2); } else if (m_gestureType == GESTURE_ROTATE) { rotationVal = (int) ((float)rotationVal * 2.0f); } else if (m_gestureType == GESTURE_ROTATE_Y) { rotationValY = (int) ((float)rotationValY); } else { inertia = 0; } if (panningVal >= rotationVal && panningVal >= zoomVal && panningVal >= rotationValY && panningVal > inertia) { panning = true; } else if (zoomVal > panningVal && zoomVal > rotationVal && zoomVal >= rotationValY && zoomVal > inertia) { zooming = true; } else if (rotationVal > panningVal && rotationVal > zoomVal && rotationVal >= rotationValY && rotationVal > inertia + 3) { rotating = true; } else if (rotationValY > panningVal && rotationValY > zoomVal && rotationValY >= rotationVal && rotationValY > inertia + 3) { rotatingY = true; } // wsprintf(output, L" panning %i, zooming %i, rotating %i\n\r", panningVal, zoomVal, rotationVal) ; // OutputDebugString(output); if (zooming) { // printf("starting zoom"); // wprintf(L"WPRINT zoom"); // wsprintf(output, L" body = %i, l = %i r = %i ", newBody.x, newLeftHand.x, newRightHand.x) ; // OutputDebugString(output); if (m_gestureType == GESTURE_NONE) { } else { int zoom = diffXdx; // wsprintf(output, L" zooom %i \r\n", zoom) ; // OutputDebugString(output); zoomNow(zoom); } m_gestureType = GESTURE_ZOOM; //printf("ending zoom"); //wprintf(L"WPRINT ending zoom"); } else if (rotating) { if (m_gestureType == GESTURE_NONE) { } else { int rotation = diffYdx; // wsprintf(output, L" zooom %i \r\n", zoom) ; // OutputDebugString(output); rotateNow(0,0,rotation); } m_gestureType = GESTURE_ROTATE; //printf("ending zoom"); //wprintf(L"WPRINT ending zoom"); } else if (rotatingY) { if (m_gestureType == GESTURE_NONE) { } else { int rotationX = 0; int rotationY = 0; if (abs(currentArmPosition.m_leftHand.m_x - currentArmPosition.m_rightHand.m_x) > abs(currentArmPosition.m_leftHand.m_y - currentArmPosition.m_rightHand.m_y) ) { rotationY = diffZdx; } else { if (currentArmPosition.m_leftHand.m_y > currentArmPosition.m_rightHand.m_y) { diffZdx = -diffZdx; } rotationX = diffZdx; } // wsprintf(output, L" zooom %i \r\n", zoom) ; // OutputDebugString(output); rotateNow(rotationX, rotationY, 0); } m_gestureType = GESTURE_ROTATE_Y; //printf("ending zoom"); //wprintf(L"WPRINT ending zoom"); } else if (panning) { // wsprintf(output, L" body = %i, l = %i r = %i ", newBody.x, newLeftHand.x, newRightHand.x) ; // OutputDebugString(output); if (m_gestureType == GESTURE_NONE) { } else { int panX = sumXdx; int panY = sumYdx; // wsprintf(output, L" pan %i,%i \r\n", panX, panY) ; // OutputDebugString(output); panNow(panX, panY); } m_gestureType = GESTURE_PAN; } else { m_gestureType = GESTURE_NONE; } } } else { m_trackState = UNTRACKED; // printf("resetting Tracking\n"); m_gestureType = GESTURE_NONE; } } m_lastArmPosition.copyFrom(currentArmPosition); }
std::shared_ptr<Mesh> FBXConverter::LoadMesh(FbxMesh* fbxMesh) { assert(fbxMesh->GetLayerCount() > 0); auto node = fbxMesh->GetNode(); auto layer = fbxMesh->GetLayer(0); if (layer->GetNormals() == nullptr) { fbxMesh->GenerateNormals(true); } auto uvs = layer->GetUVs(); auto vcolors = layer->GetVertexColors(); auto normals = layer->GetNormals(); auto binormals = layer->GetBinormals(); auto materials = layer->GetMaterials(); auto controlPoints = fbxMesh->GetControlPoints(); auto controlPointsCount = fbxMesh->GetControlPointsCount(); auto polygonCount = fbxMesh->GetPolygonCount(); std::vector<FbxFace> faces; // Load weights std::vector<BoneConnector> bcs_temp; std::vector<Vertex> vs_temp; LoadSkin(fbxMesh, bcs_temp, vs_temp); // generate face vertex int32_t vertexID = 0; for (int32_t polygonIndex = 0; polygonIndex < polygonCount; polygonIndex++) { int polygonPointCount = fbxMesh->GetPolygonSize(polygonIndex); FbxFace face; for (int32_t polygonPointIndex = 0; polygonPointIndex < polygonPointCount; polygonPointIndex++) { auto ctrlPointIndex = fbxMesh->GetPolygonVertex(polygonIndex, polygonPointIndex); Vertex v; v.Position = LoadPosition(fbxMesh, ctrlPointIndex); v.Weights = vs_temp[ctrlPointIndex].Weights; if (normals != nullptr) { v.Normal = LoadNormal(normals, vertexID, ctrlPointIndex); } if (uvs != nullptr) { v.UV = LoadUV(fbxMesh, uvs, vertexID, ctrlPointIndex, polygonIndex, polygonPointIndex); } else { // Auto generated v.UV[0] = v.Position[0] + v.Position[2]; v.UV[1] = v.Position[1]; } if (vcolors != nullptr) { v.VertexColor = LoadVertexColor(fbxMesh, vcolors, vertexID, ctrlPointIndex, polygonIndex, polygonPointIndex); } face.Vertecies.push_back(v); vertexID++; } faces.push_back(face); } // 面の表裏入れ替え for (auto& face : faces) { std::reverse(face.Vertecies.begin(), face.Vertecies.end()); } // メッシュで使用可能な形式に変換 // 頂点変換テーブル作成 int32_t vInd = 0; std::map<Vertex, int32_t> v2ind; std::map<int32_t, Vertex> ind2v; for (auto& face : faces) { for (int32_t vi = 0; vi < (int32_t)face.Vertecies.size(); vi++) { auto vertex = face.Vertecies[vi]; auto it = v2ind.find(vertex); if (it == v2ind.end()) { v2ind[vertex] = vInd; ind2v[vInd] = vertex; vInd++; } } } // 設定 auto mesh = std::make_shared<Mesh>(); mesh->Name = node->GetName(); mesh->BoneConnectors = bcs_temp; mesh->Vertexes.resize(vInd); for (auto& iv : ind2v) { mesh->Vertexes[iv.first] = iv.second; } for (auto& face : faces) { if (face.Vertecies.size() < 3) continue; if (face.Vertecies.size() == 3) { Face f; f.Index[0] = v2ind[face.Vertecies[0]]; f.Index[1] = v2ind[face.Vertecies[1]]; f.Index[2] = v2ind[face.Vertecies[2]]; mesh->Faces.push_back(f); } if (face.Vertecies.size() == 4) { Face f0; f0.Index[0] = v2ind[face.Vertecies[0]]; f0.Index[1] = v2ind[face.Vertecies[1]]; f0.Index[2] = v2ind[face.Vertecies[2]]; mesh->Faces.push_back(f0); Face f1; f1.Index[0] = v2ind[face.Vertecies[0]]; f1.Index[1] = v2ind[face.Vertecies[2]]; f1.Index[2] = v2ind[face.Vertecies[3]]; mesh->Faces.push_back(f1); } } // Binormal,Tangent計算 std::map<int32_t, VertexNormals> vInd2Normals; for (const auto& face : mesh->Faces) { FbxVector4 binormal, tangent; CalcTangentSpace( mesh->Vertexes[face.Index[0]], mesh->Vertexes[face.Index[1]], mesh->Vertexes[face.Index[2]], binormal, tangent); for (auto i = 0; i < 3; i++) { vInd2Normals[face.Index[i]].Binormal += binormal; vInd2Normals[face.Index[i]].Tangent += tangent; vInd2Normals[face.Index[i]].Count += 1; } } for (auto& vn : vInd2Normals) { vn.second.Binormal /= vn.second.Count; vn.second.Tangent /= vn.second.Count; } for (auto& vn : vInd2Normals) { mesh->Vertexes[vn.first].Binormal = vn.second.Binormal; mesh->Vertexes[vn.first].Tangent = vn.second.Tangent; // 適当な値を代入する if (mesh->Vertexes[vn.first].Binormal.Length() == 0.0f) { if (mesh->Vertexes[vn.first].Normal != FbxVector4(1, 0, 0)) { mesh->Vertexes[vn.first].Binormal = FbxVector4(1, 0, 0); mesh->Vertexes[vn.first].Tangent = FbxVector4(0, 1, 0); } else { mesh->Vertexes[vn.first].Binormal = FbxVector4(0, 1, 0); mesh->Vertexes[vn.first].Tangent = FbxVector4(1, 0, 0); } } } return mesh; }
/** * Save size (& optionally position) in registry */ void CMoveConstraint::LoadPosition(LPCTSTR szKeyName, LPCTSTR szValueName, bool position) { m_sRegistrySubkey = szKeyName; LoadPosition(szValueName, position); }