Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

807 lines
20 KiB
C++

/**********************************************************************
*<
FILE: SiteObject.cpp
DESCRIPTION: Appwizard generated plugin
CREATED BY:
HISTORY:
*> Copyright (c) 1997, All Rights Reserved.
**********************************************************************/
#include "stdafx.h"
#include "SiteObject.h"
#pragma pack(push,8)
static void DrawAxis(ViewExp *vpt, const Matrix3 &tm, float length, BOOL sel=FALSE, BOOL frozen=FALSE);
static Box3 GetAxisBox(ViewExp *vpt, const Matrix3 &tm,float length,int resetTM);
#define MIN_ZOOM 0.0001f
#define RU_UPDATE WM_USER + 666
#define NUMVERTS 7
static Point3 arrow_side[7]=
{
Point3( 0.000000, -1.000000 , 0.00000),
Point3( 0.000000, -0.500000 , 0.40000),
Point3( 0.000000, -0.500000, 0.20000),
Point3( 0.000000, -0.000000, 0.20000),
Point3( 0.000000, -0.000000, 0.00000),
Point3( 0.000000, -0.500000, 0.00000),
Point3( 0.000000, -0.500000, 0.00000)
};
static Point3 arrow_flat[7]=
{
Point3( -0.00000, -1.000000, 0.0),
Point3( 0.400000, -0.50000, 0.0),
Point3( 0.200000, -0.50000, 0.0),
Point3( 0.200000, -0.0, 0.0),
Point3( -0.200000, -0.0, 0.0),
Point3( -0.200000, -0.50000, 0.0),
Point3( -0.400000, -0.50000, 0.0)
};
//TODO: Add Parameter block indices for various parameters
#define PB_TRIGGER_COUNT 0
#define PB_SITE_SCALE 1
#define PB_TRIGGER_0 2
#define PB_TRIGGER_1 3
#define PB_TRIGGER_2 4
#define PB_TRIGGER_3 5
#define PB_TRIGGER_4 6
#define PB_TRIGGER_5 7
#define PB_TRIGGER_6 8
#define PB_TRIGGER_7 9
#define PB_TRIGGER_8 10
#define PB_TRIGGER_9 11
#define PB_TRIGGER_10 12
#define PB_TRIGGER_11 13
#define PB_TRIGGER_12 14
#define PB_TRIGGER_13 15
#define PB_TRIGGER_14 16
#define PB_TRIGGER_15 17
#define PB_TRIGGER_DEF(x) \
ParamUIDesc( \
PB_TRIGGER_##x, \
TYPE_SINGLECHEKBOX,IDC_SPIN_TRIGGER_##x)
//TODO: Add ParamUIDesc's for the various parameters
static ParamUIDesc descParam[] =
{
// Spinner
ParamUIDesc(
PB_TRIGGER_COUNT,
EDITTYPE_INT,
IDC_EDIT_NUM_TRIGGER,IDC_SPIN_NUM_TRIGGER,
0,32,
32),
ParamUIDesc(
PB_SITE_SCALE,
EDITTYPE_FLOAT,
IDC_EDIT_SIZE,IDC_SPIN_SIZE,
0.0f,1000.0f,
10.0f),
PB_TRIGGER_DEF(0),
PB_TRIGGER_DEF(1),
PB_TRIGGER_DEF(2),
PB_TRIGGER_DEF(3),
PB_TRIGGER_DEF(4),
PB_TRIGGER_DEF(5),
PB_TRIGGER_DEF(6),
PB_TRIGGER_DEF(7),
PB_TRIGGER_DEF(8),
PB_TRIGGER_DEF(9),
PB_TRIGGER_DEF(10),
PB_TRIGGER_DEF(11),
PB_TRIGGER_DEF(12),
PB_TRIGGER_DEF(13),
PB_TRIGGER_DEF(14),
PB_TRIGGER_DEF(15)
};
#define PARAMDESC_LENGTH 18
#define PBLOCK_LENGTH 18
//TODO: Add ParamBlockDescID's for the various parameters
static ParamBlockDescID descVer1[] = {
{ TYPE_INT, NULL, FALSE, 0 },
{ TYPE_FLOAT, NULL, FALSE, 1 },
{ TYPE_BOOL, NULL, TRUE, 2 },
{ TYPE_BOOL, NULL, TRUE, 3 },
{ TYPE_BOOL, NULL, TRUE, 4 },
{ TYPE_BOOL, NULL, TRUE, 5 },
{ TYPE_BOOL, NULL, TRUE, 6 },
{ TYPE_BOOL, NULL, TRUE, 7 },
{ TYPE_BOOL, NULL, TRUE, 8 },
{ TYPE_BOOL, NULL, TRUE, 9 },
{ TYPE_BOOL, NULL, TRUE, 10 },
{ TYPE_BOOL, NULL, TRUE, 11 },
{ TYPE_BOOL, NULL, TRUE, 12 },
{ TYPE_BOOL, NULL, TRUE, 13 },
{ TYPE_BOOL, NULL, TRUE, 14 },
{ TYPE_BOOL, NULL, TRUE, 15 },
{ TYPE_BOOL, NULL, TRUE, 16 },
{ TYPE_BOOL, NULL, TRUE, 17 }
};
#define CURRENT_DESCRIPTOR descVer1
#define CURRENT_VERSION 1
// class variable for point class.
HWND SiteObject::m_hParams = NULL;
IObjParam *SiteObject::m_iObjParams;
IParamMap *SiteObject::m_pmapParam = NULL;
BOOL CALLBACK PointParamProc(HWND hWnd,UINT msg,WPARAM wParam,LPARAM lParam)
{
SiteObject *po = (SiteObject*)GetWindowLong(hWnd,GWL_USERDATA);
if (!po && msg!=WM_INITDIALOG) return FALSE;
return TRUE;
}
ParamDimension *SiteObject::GetParameterDim(int pbIndex)
{
switch (pbIndex) {
case PB_TRIGGER_COUNT:
return defaultDim;
case PB_SITE_SCALE:
return defaultDim;
default:
return stdNormalizedDim;
}
}
Animatable* SiteObject::SubAnim(int i)
{
switch (i) {
case 0: return m_pblock; // Parameter block
default: return NULL;
}
}
TSTR SiteObject::SubAnimName(int i)
{
switch (i) {
case 0: return TSTR(_T("Parameters"));
default: return TSTR(_T(""));
}
}
void SiteObject::BeginEditParams(
IObjParam *ip, ULONG flags,Animatable *prev)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
HINSTANCE loc_hInstance = AfxGetResourceHandle ();
m_iObjParams = ip;
if (m_pmapParam)
{
// Left over
m_pmapParam->SetParamBlock(m_pblock);
} else
{
// Gotta make a new one.
m_pmapParam = CreateCPParamMap(
descParam,PARAMDESC_LENGTH,
m_pblock,
ip,
loc_hInstance,
MAKEINTRESOURCE(IDD_SITE_PANEL),
GetString(IDS_PARAMS),
0);
}
}
void SiteObject::EndEditParams(IObjParam *ip, ULONG flags,Animatable *next)
{
if (flags&END_EDIT_REMOVEUI )
{
DestroyCPParamMap(m_pmapParam);
m_pmapParam = NULL;
}
m_iObjParams = NULL;
}
ObjectState SiteObject::Eval(TimeValue time)
{
return ObjectState(this);
}
#define BOOL_CONTROL_CLASS_ID Class_ID(0x984b8d27,0x938f3e43)
SiteObject::SiteObject()
{
m_suspendSnap = FALSE;
m_triggerCount = 0;
m_siteScale = 0.0f;
MakeRefByID( FOREVER, 0, CreateParameterBlock( descVer1, PARAMDESC_LENGTH, CURRENT_VERSION ) );
#if 0
Control *c;
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_0, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_1, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_2, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_3, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_4, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_5, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_6, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_7, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_8, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_9, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_10, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_11, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_12, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_13, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_14, c, TRUE);
c = (Control *) CreateInstance(CTRL_FLOAT_CLASS_ID,BOOL_CONTROL_CLASS_ID);
m_pblock->SetController(PB_TRIGGER_15, c, TRUE);
#endif
m_pblock->SetValue(PB_TRIGGER_0, 0, 0);
m_pblock->SetValue(PB_TRIGGER_1, 0, 0);
m_pblock->SetValue(PB_TRIGGER_2, 0, 0);
m_pblock->SetValue(PB_TRIGGER_3, 0, 0);
m_pblock->SetValue(PB_TRIGGER_4, 0, 0);
m_pblock->SetValue(PB_TRIGGER_5, 0, 0);
m_pblock->SetValue(PB_TRIGGER_6, 0, 0);
m_pblock->SetValue(PB_TRIGGER_7, 0, 0);
m_pblock->SetValue(PB_TRIGGER_8, 0, 0);
m_pblock->SetValue(PB_TRIGGER_9, 0, 0);
m_pblock->SetValue(PB_TRIGGER_10, 0, 0);
m_pblock->SetValue(PB_TRIGGER_11, 0, 0);
m_pblock->SetValue(PB_TRIGGER_12, 0, 0);
m_pblock->SetValue(PB_TRIGGER_13, 0, 0);
m_pblock->SetValue(PB_TRIGGER_14, 0, 0);
m_pblock->SetValue(PB_TRIGGER_15, 0, 0);
m_pblock->SetValue(PB_TRIGGER_COUNT,0,m_triggerCount);
m_pblock->SetValue(PB_SITE_SCALE,0,m_siteScale);
}
RefTargetHandle SiteObject::GetReference(int i)
{
if (i==0) return m_pblock;
return NULL;
}
// This methods sets the ith reference - there are two.
void SiteObject::SetReference(int i, RefTargetHandle rtarg)
{
if (i==0)
{
m_pblock = (IParamBlock *)rtarg;
}
}
int SiteObjectCreateCallBack::proc(ViewExp *vpt,int msg, int point, int flags, IPoint2 m, Matrix3& mat )
{
if (msg==MOUSE_POINT||msg==MOUSE_MOVE)
{
switch(point)
{
case 0:
m_ob->m_suspendSnap = TRUE;
m_p0 = vpt->SnapPoint(m,m,NULL,SNAP_IN_PLANE);
mat.SetTrans(m_p0);
break;
case 1:
// mat.SetTrans(vpt->SnapPoint(m,m,NULL,SNAP_IN_PLANE));
m_p1 = vpt->SnapPoint(m,m,NULL,SNAP_IN_PLANE);
m_ob->m_pblock->SetValue(PB_SITE_SCALE,0,Length(m_p1-m_p0));
if (msg==MOUSE_POINT)
{
m_ob->m_suspendSnap = FALSE;
return 0;
}
break;
}
}
else
{
if (msg == MOUSE_ABORT)
{
return CREATE_ABORT;
}
}
return 1;
}
static SiteObjectCreateCallBack siteObjectCreateCB;
CreateMouseCallBack* SiteObject::GetCreateMouseCallBack()
{
siteObjectCreateCB.SetObj(this);
return(&siteObjectCreateCB);
}
RefTargetHandle SiteObject::Clone(RemapDir& remap)
{
SiteObject* newob = new SiteObject();
newob->m_triggerCount = m_triggerCount;
newob->m_siteScale = m_siteScale;
newob->ReplaceReference(0, m_pblock->Clone(remap));
return(newob);
}
RefResult SiteObject::NotifyRefChanged(
Interval changeInt,
RefTargetHandle hTarget,
PartID& partID,
RefMessage message)
{
switch (message)
{
case REFMSG_CHANGE:
{
if (m_pblock)
{
if (m_iObjParams)
{
m_pblock->GetValue(PB_SITE_SCALE,m_iObjParams->GetTime(),m_siteScale, FOREVER);
}
else
{
m_pblock->GetValue(PB_SITE_SCALE, 0,m_siteScale, FOREVER);
}
}
if (m_pmapParam) m_pmapParam->Invalidate();
NotifyDependents(FOREVER,PART_OBJ,REFMSG_CHANGE);
if (m_iObjParams) m_iObjParams->RedrawViews(m_iObjParams->GetTime());
break;
}
case REFMSG_GET_PARAM_DIM:
{
GetParamDim *gpd = (GetParamDim*)partID;
switch (gpd->index)
{
case 0:
default: gpd->dim = defaultDim; break;
}
return REF_STOP;
}
case REFMSG_GET_PARAM_NAME:
{
GetParamName *gpn = (GetParamName*)partID;
switch (gpn->index)
{
case PB_TRIGGER_COUNT: gpn->name = TSTR(_T("Trigger Count")); break;
case PB_SITE_SCALE: gpn->name = TSTR(_T("Site Scale")); break;
case PB_TRIGGER_0: gpn->name = TSTR(_T("Trigger 0")); break;
case PB_TRIGGER_1: gpn->name = TSTR(_T("Trigger 1")); break;
case PB_TRIGGER_2: gpn->name = TSTR(_T("Trigger 2")); break;
case PB_TRIGGER_3: gpn->name = TSTR(_T("Trigger 3")); break;
case PB_TRIGGER_4: gpn->name = TSTR(_T("Trigger 4")); break;
case PB_TRIGGER_5: gpn->name = TSTR(_T("Trigger 5")); break;
case PB_TRIGGER_6: gpn->name = TSTR(_T("Trigger 6")); break;
case PB_TRIGGER_7: gpn->name = TSTR(_T("Trigger 7")); break;
case PB_TRIGGER_8: gpn->name = TSTR(_T("Trigger 8")); break;
case PB_TRIGGER_9: gpn->name = TSTR(_T("Trigger 9")); break;
case PB_TRIGGER_10: gpn->name = TSTR(_T("Trigger 10")); break;
case PB_TRIGGER_11: gpn->name = TSTR(_T("Trigger 11")); break;
case PB_TRIGGER_12: gpn->name = TSTR(_T("Trigger 12")); break;
case PB_TRIGGER_13: gpn->name = TSTR(_T("Trigger 13")); break;
case PB_TRIGGER_14: gpn->name = TSTR(_T("Trigger 14")); break;
case PB_TRIGGER_15: gpn->name = TSTR(_T("Trigger 15")); break;
default: gpn->name = TSTR(_T("")); break;
}
return REF_STOP;
}
}
return REF_SUCCEED;
}
#define TRIGGER_COUNT_CHUNK 0x0100
#define SITE_SCALE_CHUNK 0x0110
#define TRIGGER_CHUNK 0x0120
IOResult SiteObject::Load(ILoad *iload)
{
ULONG nb;
IOResult res = IO_OK;
while (IO_OK==(res=iload->OpenChunk()))
{
switch (iload->CurChunkID())
{
case TRIGGER_COUNT_CHUNK:
res = iload->Read(&m_triggerCount,sizeof(m_triggerCount),&nb);
break;
case SITE_SCALE_CHUNK:
res = iload->Read(&m_siteScale,sizeof(m_siteScale),&nb);
break;
//case TRIGGER_CHUNK:
// res = iload->Read(&trigger,sizeof(int)*16,&nb);
// break;
}
res = iload->CloseChunk();
if (res!=IO_OK)
{
return res;
}
}
return IO_OK;
}
IOResult SiteObject::Save(ISave *isave)
{
ULONG nb;
isave->BeginChunk(TRIGGER_COUNT_CHUNK);
isave->Write(&m_triggerCount,sizeof(m_triggerCount),&nb);
isave->EndChunk();
isave->BeginChunk(SITE_SCALE_CHUNK);
isave->Write(&m_siteScale,sizeof(m_siteScale),&nb);
isave->EndChunk();
//isave->BeginChunk(TRIGGER_CHUNK);
//isave->Write(&trigger,sizeof(int)*16,&nb);
//isave->EndChunk();
return IO_OK;
}
void SiteObject::SetExtendedDisplay(int flags)
{
m_extDispFlags = flags;
}
void SiteObject::GetLocalBoundBox(TimeValue t, INode* inode, ViewExp* vpt, Box3& box )
{
Matrix3 tm(1);
tm.SetTrans(inode->GetObjectTM(t).GetTrans());
box = GetAxisBox(vpt,tm,m_siteScale, TRUE);
}
void SiteObject::GetWorldBoundBox(TimeValue t, INode* inode, ViewExp* vpt, Box3& box )
{
Matrix3 tm;
tm = inode->GetObjectTM(t);
if(!(m_extDispFlags & EXT_DISP_ZOOM_EXT))
{
box = GetAxisBox(vpt,tm,m_siteScale, FALSE);
}
else
{
box = Box3(tm.GetTrans(), tm.GetTrans());
}
}
// From BaseObject
int SiteObject::HitTest(TimeValue t, INode *inode, int type, int crossing, int flags, IPoint2 *p, ViewExp *vpt)
{
Matrix3 tm(1);
HitRegion hitRegion;
DWORD savedLimits;
Point3 pt(0,0,0);
GraphicsWindow *gw = vpt->getGW();
tm = inode->GetObjectTM(t);
MakeHitRegion(hitRegion, type, crossing, 4, p);
gw->setRndLimits(((savedLimits = gw->getRndLimits())|GW_PICK)&~GW_ILLUM);
gw->setHitRegion(&hitRegion);
gw->clearHitCode();
DrawAxis(vpt,tm,m_siteScale);
vpt->getGW()->setTransform(tm);
vpt->getGW()->marker(&pt,X_MRKR);
gw->setRndLimits(savedLimits);
if((hitRegion.type != POINT_RGN) && !hitRegion.crossing)
{
return TRUE;
}
return gw->checkHitCode();
}
void SiteObject::Snap(TimeValue t, INode* inode, SnapInfo *snap, IPoint2 *p, ViewExp *vpt)
{
// if(m_suspendSnap)
// {
// return;
// }
Matrix3 tm = inode->GetObjectTM(t);
GraphicsWindow *gw = vpt->getGW();
gw->setTransform(tm);
Matrix3 invPlane = Inverse(snap->plane);
// Check for upside-down coordinate system in viewport
float ybias = (float)gw->getWinSizeY() - 1.0f;
// Make sure the vertex priority is active and at least as important as the best snap so far
if(snap->vertPriority > 0 && snap->vertPriority <= snap->priority)
{
Point2 fp = Point2((float)p->x, (float)p->y);
Point3 screen3;
Point2 screen2;
Point3 thePoint(0,0,0);
// If constrained to the plane, make sure this point is in it!
if(snap->snapType == SNAP_2D || snap->flags & SNAP_IN_PLANE)
{
Point3 test = thePoint * tm * invPlane;
if(fabs(test.z) > 0.0001) // Is it in the plane (within reason)?
{
return;
}
}
//gw->transPointFWin(&thePoint,&screen3); //this is for MAX 1.2
gw->transPoint(&thePoint, &screen3);
screen3.y = ybias - screen3.y;
screen2.x = screen3.x;
screen2.y = screen3.y;
// Are we within the snap radius?
int len = (int)Length(screen2 - fp);
if(len <= snap->strength)
{
// Is this priority better than the best so far?
if(snap->vertPriority < snap->priority)
{
snap->priority = snap->vertPriority;
snap->bestWorld = thePoint * tm;
snap->bestScreen = screen2;
snap->bestDist = len;
}
else
if(len < snap->bestDist)
{
snap->priority = snap->vertPriority;
snap->bestWorld = thePoint * tm;
snap->bestScreen = screen2;
snap->bestDist = len;
}
}
}
}
int SiteObject::Display(TimeValue t, INode* inode, ViewExp *vpt, int flags)
{
Matrix3 tm = inode->GetObjectTM(t);
Point3 pt(0,0,0);
vpt->getGW()->setTransform(tm);
DrawAxis(vpt,tm,m_siteScale,inode->Selected(),inode->IsFrozen());
if(!inode->IsFrozen())
{
vpt->getGW()->setColor(LINE_COLOR,1.0f,0.9f,0.0f);
}
vpt->getGW()->marker(&pt,X_MRKR);
return(0);
}
/*--------------------------------------------------------------------*/
//
// Stole this from scene.cpp
// Probably couldn't hurt to make an API...
//
//
static void Text( ViewExp *vpt, TCHAR *str, Point3 &pt )
{
vpt->getGW()->text( &pt, str );
}
static void DrawAStar( ViewExp *vpt, float len )
{
Point3 v[NUMVERTS+1];
//we'll scale the points to fill out the dlg size, almost
float mult = len;
/*
for(int i= 0; i < NUMVERTS-1;i++){
v[0] = mult * roseverts[i];
v[1] = mult * roseverts[i+1];
vpt->getGW()->polyline( 2, v, NULL, NULL, FALSE, NULL );
}
//close up the polyline
v[0] = mult * roseverts[0];
v[1] = mult * roseverts[NUMVERTS-1];
vpt->getGW()->polyline( 2, v, NULL, NULL, FALSE, NULL );
*/
for (int k= 0; k<NUMVERTS;k++)
{
v[k]=arrow_side[k]*mult;
}
vpt->getGW()->polyline( NUMVERTS, v, NULL, NULL, TRUE, NULL );
for (k= 0; k<NUMVERTS;k++)
{
v[k]=arrow_flat[k]*mult;
}
vpt->getGW()->polyline( NUMVERTS, v, NULL, NULL, TRUE, NULL );
//draw an extra line in the north driection
// v[0] = Point3(0.0f,0.0f,0.0f);
// v[1] = mult * roseverts[3];
// vpt->getGW()->polyline( 2, v, NULL, NULL, FALSE, NULL );
}
#define ZFACT (float).005;
#define AXIS_COLOR 0.4f,0.4f,0.4f
#define SELAXIS_COLOR 1.0f,1.0f,1.0f
static void DrawAxis( ViewExp *vpt, const Matrix3 &tm, float length, BOOL sel, BOOL frozen )
{
Matrix3 tmn = tm;
//float zoom;
int limits;
// Get width of viewport in world units: --DS
//zoom = vpt->GetScreenScaleFactor(tmn.GetTrans())*ZFACT;
//tmn.Scale( Point3(zoom,zoom,zoom) );
vpt->getGW()->setTransform( tmn );
limits = vpt->getGW()->getRndLimits();
// vpt->getGW()->setRndLimits( limits & ~GW_Z_BUFFER ); JH
if (sel)
{
vpt->getGW()->setColor( TEXT_COLOR, SELAXIS_COLOR );
vpt->getGW()->setColor( LINE_COLOR, SELAXIS_COLOR );
}
else if (!frozen)
{
vpt->getGW()->setColor( TEXT_COLOR, AXIS_COLOR );
vpt->getGW()->setColor( LINE_COLOR, AXIS_COLOR );
}
#if 0
float corners = .9f * length;
Text( vpt, GetString(IDS_EAST_MARK), Point3(corners,0.0f,0.0f) );
Text( vpt, GetString(IDS_WEST_MARK), Point3(-corners,0.0f,0.0f) );
Text( vpt, GetString(IDS_NORTH_MARK), Point3(0.0f,corners,0.0f) );
Text( vpt, GetString(IDS_SOUTH_MARK), Point3(0.0f,-corners,0.0f) );
#endif
DrawAStar( vpt, length);
vpt->getGW()->setRndLimits( limits );
}
static Box3 GetAxisBox(ViewExp *vpt, const Matrix3 &tm,float length,int resetTM)
{
Matrix3 tmn = tm;
float zoom;
// Get width of viewport in world units: --DS
zoom = vpt->GetScreenScaleFactor(tmn.GetTrans())*ZFACT;
if (zoom < MIN_ZOOM) zoom = 1.0f;
// tmn.Scale(Point3(zoom,zoom,zoom));
length *= zoom;
if(resetTM)
{
tmn.IdentityMatrix();
}
Box3 box;
box += Point3(0.0f, 0.0f, 0.0f) * tmn;
box += Point3(4.0f*length, 0.0f, 0.0f) * tmn;
box += Point3(0.0f, -9.0f*length, 0.0f) * tmn;
box += Point3(0.0f, 0.0f, 4.0f*length) * tmn;
box += Point3(-4.0f*length, 0.0f, 0.0f) * tmn;
box += Point3(0.0f, 0.0f, -4.0f*length) * tmn;
box.EnlargeBy(10.0f/zoom);
return box;
}
#pragma pack(pop)