298 lines
9 KiB
C++
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
|