windows-nt/Source/XPSP1/NT/multimedia/opengl/test/profiler/primtest.cpp
2020-09-26 16:20:57 +08:00

298 lines
9 KiB
C++

#include <stdlib.h>
#include <stdio.h>
#include <windows.h>
#include <memory.h>
#include "hugetest.h"
#include "pntlist.h"
#include "primtest.h"
#include "UI_huge.h"
#include "resource.h"
#include "macros.h"
typedef BOOL CALLBACK DlgProc(HWND, UINT, WPARAM, LPARAM);
DlgProc PrimativeDlgProc;
extern HINSTANCE hInstance;
PrimativeTest::PrimativeTest()
{
PROPSHEETPAGE pspage;
SetThisType("Primative");
SetThisVersion("1.0");
sprintf(td.acName,"Primatives");
afDrawColor[0] = 1.0;
afDrawColor[1] = 1.0;
afDrawColor[2] = 0.0;
fClr4 = 0.0f,
fClr5 = 1.0f,
fClr6 = 0.0f;
bRotCol = TRUE;
// Zero out property PAGE data
bzero (&pspage, sizeof(pspage)) ;
pspage.dwSize = sizeof(PROPSHEETPAGE);
pspage.dwFlags = PSP_USECALLBACK;
pspage.hInstance = hInstance;
pspage.pszTemplate = MAKEINTRESOURCE (IDD_PRIMATIVES);
pspage.pfnDlgProc = (DLGPROC) PrimativeDlgProc;
pspage.lParam = (LPARAM) aPntLst;
AddPropertyPages(1, &pspage);
}
static PointList prim_pl[NUMBEROFPRIMATIVES];
// optimize this
void PrimativeTest::SaveData()
{
for (int i = 0 ; i < NUMBEROFPRIMATIVES ; i++)
prim_pl[i].Duplicate(&(aPntLst[i]));
parent::SaveData();
}
// optimize this
void PrimativeTest::RestoreSaved()
{
for (int i = 0 ; i < NUMBEROFPRIMATIVES ; i++) {
aPntLst[i].Duplicate(&(prim_pl[i]));
prim_pl[i].ResetPoints();
}
parent::RestoreSaved();
}
// optimize this
void PrimativeTest::ForgetSaved()
{
for (int i = 0 ; i < NUMBEROFPRIMATIVES ; i++)
prim_pl[i].ResetPoints();
parent::ForgetSaved();
}
int PrimativeTest::Save(HANDLE hFile)
{
ulong ul,p;
int i,j;
p = parent::Save(hFile);
if (p < 0) return p;
ul = 0;
for (i = 0 ; i < NUMBEROFPRIMATIVES ; i++) {
ul += j = aPntLst[i].Save(hFile);
if (j == -1) return -1;
}
j = ul;
FlushFileBuffers(hFile);
return j + p;
}
int PrimativeTest::Load(HANDLE hFile)
{
ulong ul,p;
int i,j;
p = parent::Load(hFile);
if (p < 0) return p;
ul = 0;
for (i = 0 ; i < NUMBEROFPRIMATIVES ; i++) {
ul += j = aPntLst[i].Load(hFile);
if (j == -2) return -2;
}
j = ul;
return j + p;
}
void PrimativeTest::IDLEFUNCTION()
{
GLfloat fClr;
if (bRotCol) {
fClr = afDrawColor[0];
afDrawColor[0] = afDrawColor[1];
afDrawColor[1] = afDrawColor[2];
afDrawColor[2] = fClr4;
fClr4 = fClr5;
fClr5 = fClr6;
fClr6 = fClr;
}
}
void PrimativeTest::RENDFUNCTION()
{
static int iType[NUMBEROFPRIMATIVES] = {
GL_POINTS, GL_LINES, GL_POLYGON, GL_TRIANGLES, GL_QUADS, GL_LINE_STRIP,
GL_LINE_LOOP, GL_TRIANGLE_STRIP, GL_TRIANGLE_FAN, GL_QUAD_STRIP
};
int i, j;
glClearColor(bd.fClearColor[0],bd.fClearColor[1],
bd.fClearColor[2],bd.fClearColor[3]);
glClear(bd.uiClear);
for (j = 0; j < NUMBEROFPRIMATIVES; j++) {
glBegin(iType[j]); {
glColor3f(afDrawColor[0],afDrawColor[1],afDrawColor[2]);
for (i = 0 ; i < aPntLst[j].iNum ; i++) {
glVertex3f(aPntLst[j].aPoints[i][0],aPntLst[j].aPoints[i][1],
aPntLst[j].aPoints[i][2]);
}
}
glEnd();
}
glFlush();
} // PrimativeTest::RENDFUNCTION()
#ifndef NO_UI_IN_CNFG
BOOL CALLBACK PrimativeDlgProc(HWND hDlg,UINT msg,WPARAM wParam,LPARAM lParam)
{
static PointList *aPntLst;
static PointList *pPntLst;
char szBuffer[100];
char szBuf1[20],szBuf2[20],szBuf3[20];
int i;
switch (msg)
{
case WM_INITDIALOG:
SetDlgItemInt(hDlg, P_IDC_POINT1, 0, TRUE);
SetDlgItemInt(hDlg, P_IDC_POINT2, 0, TRUE);
SetDlgItemInt(hDlg, P_IDC_POINT3, 0, TRUE);
SendDlgItemMessage(hDlg, IDC_POINTS, BM_SETCHECK, 1, 0);
aPntLst = (PointList*) (((PROPSHEETPAGE*)lParam)->lParam);
pPntLst = aPntLst;
pPntLst->DisplayPointList(hDlg, P_IDC_POINTLIST);
sprintf(szBuffer,"Polygons (%d Points)", pPntLst->QueryNumber());
SetDlgItemText(hDlg, P_IDC_POLY, szBuffer);
return TRUE;
case WM_COMMAND:
{
int iControl, iNote;
GLfloat f1, f2, f3;
iControl = LOWORD(wParam);
iNote = HIWORD(wParam); // notification code for edit boxes
switch (iControl)
{
case P_IDC_POINT1:
case P_IDC_POINT2:
case P_IDC_POINT3:
if (EN_KILLFOCUS == iNote) {
VerifyEditboxFloat(hDlg,iControl);
}
break;
case P_IDC_ADD: // ADD
i =SendDlgItemMessage(hDlg,P_IDC_POINTLIST,LB_GETCURSEL,0,0);
if (i == LB_ERR) i = -1;
GetDlgItemText(hDlg, P_IDC_POINT1, szBuf1, sizeof(szBuf1));
GetDlgItemText(hDlg, P_IDC_POINT2, szBuf2, sizeof(szBuf2));
GetDlgItemText(hDlg, P_IDC_POINT3, szBuf3, sizeof(szBuf3));
f1 = (GLfloat) atof(szBuf1);
f2 = (GLfloat) atof(szBuf2);
f3 = (GLfloat) atof(szBuf3);
sprintf(szBuffer,"(%g, %g, %g)", f1, f2, f3);
SendDlgItemMessage(hDlg,P_IDC_POINTLIST, LB_INSERTSTRING,
i, (LPARAM) szBuffer);
pPntLst->AddPoint(f1,f2,f3);
pPntLst->SwapPoints(-1,i);
sprintf(szBuffer,"Polygons (%d Points)",
pPntLst->QueryNumber());
SetDlgItemText(hDlg, P_IDC_POLY, szBuffer);
PropSheet_Changed(GetParent(hDlg),hDlg);
break; // P_IDC_ADD
case P_IDC_REMOVE:
i =SendDlgItemMessage(hDlg,P_IDC_POINTLIST,LB_GETCURSEL,0,0);
if (i != LB_ERR) {
SendDlgItemMessage(hDlg,P_IDC_POINTLIST,
LB_DELETESTRING,i,0);
pPntLst->RemovePoint(i);
}
sprintf(szBuffer,"Polygons (%d Points)",
pPntLst->QueryNumber());
SetDlgItemText(hDlg, P_IDC_POLY, szBuffer);
PropSheet_Changed(GetParent(hDlg),hDlg);
break; // P_IDC_REMOVE
case P_IDC_MOVEUP:
i =SendDlgItemMessage(hDlg,P_IDC_POINTLIST,LB_GETCURSEL,0,0);
if ((i == LB_ERR) || (i == 0))
break;
SendDlgItemMessage(hDlg, P_IDC_POINTLIST, LB_GETTEXT,
i, (LPARAM)szBuffer);
SendDlgItemMessage(hDlg,P_IDC_POINTLIST,LB_DELETESTRING,i,0);
i--;
SendDlgItemMessage(hDlg, P_IDC_POINTLIST, LB_INSERTSTRING,
i, (LPARAM) szBuffer);
SendDlgItemMessage(hDlg, P_IDC_POINTLIST, LB_SETCURSEL, i,0);
pPntLst->SwapPoints(i,i+1);
PropSheet_Changed(GetParent(hDlg),hDlg);
break; // P_IDC_MOVEUP
case P_IDC_MOVEDOWN:
i =SendDlgItemMessage(hDlg,P_IDC_POINTLIST,LB_GETCURSEL,0,0);
if ((i == LB_ERR) ||
(i==SendDlgItemMessage(hDlg,P_IDC_POINTLIST,
LB_GETCOUNT,0,0)-1))
break;
SendDlgItemMessage(hDlg, P_IDC_POINTLIST, LB_GETTEXT,
i, (LPARAM)szBuffer);
SendDlgItemMessage(hDlg,P_IDC_POINTLIST,LB_DELETESTRING,i,0);
i++;
SendDlgItemMessage(hDlg, P_IDC_POINTLIST, LB_INSERTSTRING,
i, (LPARAM) szBuffer);
SendDlgItemMessage(hDlg, P_IDC_POINTLIST, LB_SETCURSEL, i,0);
pPntLst->SwapPoints(i,i-1);
PropSheet_Changed(GetParent(hDlg),hDlg);
break; // P_IDC_MOVEDOWN
default:
if ((IDC_POINTS <= iControl) &&
(iControl < IDC_POINTS + NUMBEROFPRIMATIVES)) {
i = iControl - IDC_POINTS;
pPntLst = &(aPntLst[i]);
pPntLst->DisplayPointList(hDlg, P_IDC_POINTLIST);
sprintf(szBuffer,"Polygons (%d Points)",
pPntLst->QueryNumber());
SetDlgItemText(hDlg, P_IDC_POLY, szBuffer);
}
break;
}
}
break;
case WM_NOTIFY:
{
LPNMHDR pnmh = (LPNMHDR) lParam;
switch (pnmh->code)
{
case PSN_APPLY: // user clicked on OK or Apply
break;
case PSN_RESET: // user clicked on Cancel
break;
case PSN_HELP: // user clicked help
break;
}
}
break;
default:
return FALSE;
}
return TRUE;
}
#else
#endif // NO_UI_IN_CNFG