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

861 lines
19 KiB
C++

// LogicView.cpp : implementation file
//
#include "stdafx.h"
#include "LogicView.h"
#include "math.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CLogicView
IMPLEMENT_DYNCREATE(CLogicView, CView)
CLogicView::CLogicView()
{
displayMemory = new CDC;
windowActive = False;
currentOperation = Waiting;
currentTrace = -1;
peekingMessages = False;
startMove = -1;
subMode = Select;
bugEnabled = False;
zoomInCursor = AfxGetApp()->LoadCursor(IDC_ZOOM_IN);
zoomOutCursor = AfxGetApp()->LoadCursor(IDC_ZOOM_OUT);
zoomSelCursor = AfxGetApp()->LoadCursor(IDC_ZOOM_SEL);
openHandCursor = AfxGetApp()->LoadCursor(IDC_OPEN_HAND);
closeHandCursor = AfxGetApp()->LoadCursor(IDC_CLOSE_HAND);
arrowCursor = AfxGetApp()->LoadStandardCursor(IDC_ARROW);
}
CLogicView::~CLogicView()
{
delete displayMemory;
}
BEGIN_MESSAGE_MAP(CLogicView, CView)
//{{AFX_MSG_MAP(CLogicView)
ON_WM_SIZE()
ON_WM_HSCROLL()
ON_WM_VSCROLL()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_MOUSEMOVE()
ON_WM_SETCURSOR()
ON_WM_KEYDOWN()
ON_WM_KEYUP()
ON_WM_CONTEXTMENU()
//}}AFX_MSG_MAP
ON_MESSAGE(WM_DRAW_BACKGROUND, OnDrawBackground)
ON_COMMAND_RANGE(START_MESSAGE_ID, LAST_MESSAGE_ID, OnPlugIn)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CLogicView drawing
void CLogicView::OnDraw(CDC* pDC)
{
//CDocument* pDoc = GetDocument();
// TODO: add draw code here
CRect client_rect;
GetClientRect(client_rect);
CBitmap *old_bitmap;
old_bitmap = displayMemory->SelectObject(myParent->screenBitmap);
pDC->BitBlt(0,0,client_rect.right,client_rect.bottom, displayMemory,
myParent->logicSize.left, myParent->logicSize.top, SRCCOPY);
displayMemory->SelectObject(old_bitmap);
}
/////////////////////////////////////////////////////////////////////////////
// CLogicView diagnostics
#ifdef _DEBUG
void CLogicView::AssertValid() const
{
CView::AssertValid();
}
void CLogicView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CLogicView message handlers
void CLogicView::OnInitialUpdate()
{
//afxDump << "CLogicView::OnInitialUpdate" << endl;
CView::OnInitialUpdate();
windowActive = True;
CClientDC client_dc(this);
if(displayMemory->GetSafeHdc() == NULL)
{
displayMemory->CreateCompatibleDC(&client_dc);
}
int h_Min, h_Max;
h_Min = 0;
h_Max = (int)(myParent->document->lastTrace - myParent->document->firstTrace);
SetScrollRange(SB_HORZ, h_Min, h_Max);
SetScrollPos(SB_HORZ, 0);
// The -2 is one trace of messages and leave the last trace on screen
SetScrollRange(SB_VERT, 0, myParent->document->traceCount - 2);
SetScrollPos(SB_VERT, 0);
myParent->SaveSize();
myParent->Draw(this);
}
/////////////////////////////////////////////////////////////////////////////
//
BOOL CLogicView::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CWnd::Create(lpszClassName, lpszWindowName, dwStyle | WS_VSCROLL | WS_HSCROLL, rect, pParentWnd, nID, pContext);
}
void CLogicView::OnSize(UINT nType, int cx, int cy)
{
//afxDump << "CLogicView::OnSize" << endl;
CView::OnSize(nType, cx, cy);
if (windowActive)
{
myParent->SaveSize();
myParent->SetTime();
myParent->Draw(this);
}
}
void CLogicView::Render(CRect placement)
{
MY_RGB color;
color.red = 255;
color.blue = 255;
color.green = 255;
myParent->DrawCRect( placement,color);
currentOperation = MakingTrace;
currentTrace = 0;
CRect size;
myParent->logicView->GetClientRect(size);
myParent->logicView->InvalidateRect(size);
if (windowActive)
{
//drawingTimer = SetTimer(1, 10, NULL);
color.red = 255;
color.blue = 0;
color.green = 0;
myParent->DrawLine(
myParent->viewedTime.startTime + (myParent->viewedTime.pixelToTime * (myParent->timeSize.left + myParent->timeView->refrenceLinePixel)),
myParent->viewedTime.startTime + (myParent->viewedTime.pixelToTime * (myParent->timeSize.left + myParent->timeView->refrenceLinePixel)),
myParent->logicSize.top, myParent->logicSize.bottom, 0, color, 1);
SetScrollPos(SB_HORZ, (int)myParent->viewedTime.startTime);
if (!peekingMessages)
{
PostMessage(WM_DRAW_BACKGROUND);
}
}
}
void CLogicView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* /*pScrollBar*/)
{
// TODO: Add your message handler code here and/or call default
int
old_position,
current_position,
temp_position;
old_position = current_position = GetScrollPos(SB_VERT);
BOOL absolute = FALSE;
switch(nSBCode)
{
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
current_position = nPos;
absolute = TRUE;
break;
case SB_LINELEFT:
temp_position = 1;
current_position -= temp_position;
break;
case SB_LINERIGHT:
temp_position = 1;
current_position += temp_position;
break;
case SB_PAGELEFT:
temp_position = 3;
current_position -= temp_position;
break;
case SB_PAGERIGHT:
temp_position = 3;
current_position += temp_position;
break;
case SB_RIGHT:
temp_position = 5;
current_position += temp_position;
break;
case SB_LEFT:
temp_position = 5;
current_position -= temp_position;
break;
default:
break;
}
SetScrollPos(SB_VERT,current_position);
if (old_position != current_position)
{
myParent->Draw(myParent->nameView);
myParent->Draw(this);
}
}
void CLogicView::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* /*pScrollBar*/)
{
int
old_position,
current_position,
temp_position;
old_position = current_position = GetScrollPos(SB_HORZ);
BOOL absolute = FALSE;
switch(nSBCode)
{
case SB_THUMBPOSITION:
case SB_THUMBTRACK:
current_position = nPos;
absolute = TRUE;
break;
case SB_LINELEFT:
temp_position = 1;
current_position -= temp_position;
break;
case SB_LINERIGHT:
temp_position = 1;
current_position += temp_position;
break;
case SB_PAGELEFT:
temp_position = 10;
current_position -= temp_position;
break;
case SB_PAGERIGHT:
temp_position = 10;
current_position += temp_position;
break;
case SB_RIGHT:
temp_position = 20;
current_position += temp_position;
break;
case SB_LEFT:
temp_position = 20;
current_position -= temp_position;
break;
default:
break;
}
MoveTime(current_position, absolute);
myParent->Draw(myParent->timeView);
myParent->Draw(this);
}
void CLogicView::MoveTime(int current_position, BOOL absolute)
{
//CScrollBar *pScrollBar = GetScrollBarCtrl(SB_HORZ);
CLabRatDoc *document = (CLabRatDoc *)GetDocument();
int old_position = GetScrollPos(SB_HORZ);
old_position += (int)document->firstTrace;
current_position += (int)document->firstTrace;
Time diffrence = (Time)old_position - (Time)current_position;
if (absolute == TRUE)
{
myParent->viewedTime.startTime = current_position;
}
else
{
myParent->viewedTime.startTime -= (diffrence)*(SCALES[myParent->viewedTime.secondEnum] * myParent->viewedTime.step)*0.5f;
}
Max_Clamp(myParent->viewedTime.startTime, document->lastTrace);
Min_Clamp(myParent->viewedTime.startTime, document->firstTrace);
myParent->viewedTime.endTime = ((Time)myParent->viewedTime.startTime) + (myParent->viewedTime.pixelToTime * myParent->timeSize.Width());
Max_Clamp(myParent->viewedTime.endTime, document->lastTrace);
SetScrollPos(SB_HORZ,(int)myParent->viewedTime.startTime - ((int)document->firstTrace));
}
void CLogicView::ScaleTime(int scale_factor, CPoint point)
{
myParent->viewedTime.startTime =
myParent->viewedTime.startTime +
(point.x * myParent->viewedTime.pixelToTime);
int step_enum = 0;
for (int i = SCALE_STEP_COUNT-1; i >= 0; --i)
{
if (myParent->viewedTime.step <= SCALE_STEP[i])
{
step_enum = i;
}
}
int new_step = step_enum + scale_factor;
int new_second = myParent->viewedTime.secondEnum;
int seconds_to_add = 0;
if (new_step > 0.0f)
{
seconds_to_add = (int)new_step / SCALE_STEP_COUNT;
new_step = new_step - (seconds_to_add * SCALE_STEP_COUNT);
new_second += seconds_to_add;
}
else if (new_step < 0.0f)
{
int over = -new_step + SCALE_STEP_COUNT - 1;
seconds_to_add = ((int)over / SCALE_STEP_COUNT);
new_step = new_step + (seconds_to_add * SCALE_STEP_COUNT);
new_second -= seconds_to_add;
}
if (!(new_second >= SCALES_COUNT) && !(new_second < 0))
{
myParent->viewedTime.secondEnum = new_second;
step_enum = new_step;
myParent->viewedTime.step = SCALE_STEP[new_step];
}
else
{
return;
}
myParent->SetComboBox(step_enum, myParent->viewedTime.secondEnum);
myParent->SetTime();
}
LONG CLogicView::OnDrawBackground(UINT /*wParam*/, LONG /*lParam*/)
{
#if 0
peekingMessages = True;
MSG message;
while(::PeekMessage(&message, NULL,0,0, PM_REMOVE))
{
::TranslateMessage(&message);
::DispatchMessage(&message);
}
peekingMessages = False;
#else
if (bugEnabled)
{
peekingMessages = True;
MSG message;
while(::PeekMessage(&message, NULL,0,0, PM_NOREMOVE))
{
AfxGetApp()->PumpMessage();
}
peekingMessages = False;
}
#endif
if (currentTrace == myParent->traceCount)
{
return 0L;
}
if (currentOperation == MakingTrace)
{
//afxDump << "Making : " << currentTrace << endl;
TraceLine *trace_line;
trace_line = (TraceLine *)myParent->traceListArray->GetAt(currentTrace);
trace_line->MakeTrace(
myParent->viewedTime.startTime,
myParent->viewedTime.endTime, myParent->viewedTime.timeToPixel);
++currentTrace;
if (currentTrace == myParent->traceCount)
{
currentTrace = GetScrollPos(SB_VERT);
currentOperation = DrawingTrace;
}
PostMessage(WM_DRAW_BACKGROUND);
}
else if (currentOperation == DrawingTrace)
{
//afxDump << "Drawing : " << currentTrace << endl;
int place_to_draw = myParent->borderSize + myParent->logicSize.top;
int start = GetScrollPos(SB_VERT);
for (int i = start; i < myParent->traceCount; ++i)
{
if (place_to_draw >= myParent->logicSize.bottom && currentTrace != (myParent->traceCount - 1))
{
currentTrace = myParent->traceCount - 1; // if off of the screen just
// draw the markers
break;
}
TraceLine *trace_line;
trace_line = (TraceLine *)myParent->traceListArray->GetAt(i);
if (i == currentTrace)
{
trace_line->Draw(place_to_draw);
++currentTrace;
CRect size;
myParent->logicView->GetClientRect(size);
myParent->logicView->InvalidateRect(size);
break;
}
place_to_draw += trace_line->CalculateSize();
place_to_draw += myParent->borderSize;
}
if (currentTrace == myParent->traceCount)
{
currentTrace = 0;
currentOperation = Waiting;
myParent->Draw(myParent->valueView);
// let it end
}
else
{
PostMessage(WM_DRAW_BACKGROUND);
}
}
return 0L;
}
void CLogicView::OnLButtonDown(UINT /*nFlags*/, CPoint point)
{
if (subMode == Move)
{
startMove = point.x * myParent->viewedTime.pixelToTime;
}
else if (subMode == Select)
{
myParent->viewedTime.startTimeSel = myParent->viewedTime.startTime + (point.x * myParent->viewedTime.pixelToTime);
myParent->viewedTime.endTimeSel = myParent->viewedTime.startTime + (point.x * myParent->viewedTime.pixelToTime);
Min_Clamp(myParent->viewedTime.startTimeSel,myParent->document->firstTrace);
Max_Clamp(myParent->viewedTime.endTimeSel,myParent->document->lastTrace);
SetStatusBar();
myParent->Draw(myParent->timeView);
}
else if (subMode == SelectRegion)
{
myParent->viewedTime.endTimeSel = myParent->viewedTime.startTime + (point.x * myParent->viewedTime.pixelToTime);
Max_Clamp(myParent->viewedTime.endTimeSel,myParent->document->lastTrace);
SetStatusBar();
myParent->Draw(myParent->timeView);
}
}
void CLogicView::OnLButtonUp(UINT /*nFlags*/, CPoint point)
{
if (subMode == ZoomIn)
{
ScaleTime(-1, point);
myParent->Draw(myParent->timeView);
myParent->Draw(this);
}
else if (subMode == ZoomOut)
{
ScaleTime(1, point);
myParent->Draw(myParent->timeView);
myParent->Draw(this);
}
else if (subMode == Move)
{
DragTime(point);
myParent->Draw(myParent->timeView);
myParent->Draw(this);
startMove = -1;
}
if (subMode == Select)
{
myParent->viewedTime.endTimeSel = myParent->viewedTime.startTime + (point.x * myParent->viewedTime.pixelToTime);
Max_Clamp(myParent->viewedTime.endTimeSel,myParent->document->lastTrace);
SetStatusBar();
myParent->Draw(myParent->timeView);
}
if (subMode == SelectRegion)
{
myParent->viewedTime.endTimeSel = myParent->viewedTime.startTime + (point.x * myParent->viewedTime.pixelToTime);
Max_Clamp(myParent->viewedTime.endTimeSel,myParent->document->lastTrace);
SetStatusBar();
myParent->Draw(myParent->timeView);
}
}
void CLogicView::OnMouseMove(UINT nFlags, CPoint point)
{
if (subMode == Move)
{
if (startMove != -1)
{
DragTime(point);
myParent->Draw(myParent->timeView);
if(bugEnabled)
{
myParent->Draw(this);
}
}
}
if (subMode == Select || subMode == SelectRegion)
{
if (nFlags & MK_LBUTTON)
{
myParent->viewedTime.endTimeSel = myParent->viewedTime.startTime + (point.x * myParent->viewedTime.pixelToTime);
Max_Clamp(myParent->viewedTime.endTimeSel,myParent->document->lastTrace);
SetStatusBar();
myParent->Draw(myParent->timeView);
}
}
CView::OnMouseMove(nFlags, point);
}
void CLogicView::DragTime(CPoint points_to_move)
{
Time time_to_move = points_to_move.x * myParent->viewedTime.pixelToTime;
time_to_move = startMove - time_to_move;
startMove = points_to_move.x * myParent->viewedTime.pixelToTime;
//afxDump << time_to_move << endl;
myParent->viewedTime.startTime += time_to_move;
myParent->viewedTime.endTime =
myParent->viewedTime.startTime + (myParent->viewedTime.pixelToTime * myParent->timeSize.Width());
Max_Clamp(myParent->viewedTime.endTime, myParent->document->lastTrace);
SetScrollPos(SB_HORZ, (int)myParent->viewedTime.startTime);
}
BOOL CLogicView::OnSetCursor(CWnd* /* pWnd */, UINT /*nHitTest*/, UINT /* message */)
{
switch(subMode)
{
case ZoomIn:
::SetCursor(zoomInCursor);
break;
case ZoomOut:
::SetCursor(zoomOutCursor);
break;
case ZoomSelect:
::SetCursor(zoomSelCursor);
break;
case Select:
case SelectRegion:
::SetCursor(arrowCursor);
break;
case Move:
::SetCursor(openHandCursor);
break;
}
return True;
}
void CLogicView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CView::OnKeyDown(nChar, nRepCnt, nFlags);
switch(nChar)
{
case VK_SHIFT :
if (subMode == Select || subMode == SelectRegion)
{
subMode = SelectRegion;
}
else
{
subMode = Select;
}
::SetCursor(arrowCursor);
break;
case VK_CONTROL :
subMode = Move;
::SetCursor(openHandCursor);
break;
case 'Z':
subMode = ZoomIn;
::SetCursor(zoomInCursor);
break;
case 'X':
subMode = ZoomOut;
::SetCursor(zoomOutCursor);
break;
}
}
void CLogicView::OnKeyUp(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CView::OnKeyUp(nChar, nRepCnt, nFlags);
switch(nChar)
{
case VK_SHIFT:
case VK_CONTROL :
case 'Z':
case 'X':
if (myParent->currentMode == CChildFrame::ZoomMode)
{
subMode = ZoomIn;
::SetCursor(zoomInCursor);
}
else if (myParent->currentMode == CChildFrame::MoveMode)
{
subMode = Move;
::SetCursor(openHandCursor);
}
if (myParent->currentMode == CChildFrame::SelectMode)
{
subMode = Select;
::SetCursor(arrowCursor);
}
break;
}
}
void CLogicView::OnContextMenu(CWnd* /*pWnd*/, CPoint point)
{
int selection = FindSelectionScreen(point);
if (selection != -1)
{
CMenu menu;
menu.CreateMenu();
CMenu *sub_menu;
TraceLine *trace_line;
menuOnTraceIndex = selection;
trace_line = (TraceLine *)myParent->traceListArray->GetAt(selection);
sub_menu = myParent->analyzerRegistry.CreateMenu(trace_line->GetTraceType());
menu.AppendMenu( MF_POPUP, (int)sub_menu->GetSafeHmenu());
menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
point.x, point.y, this);
sub_menu->DestroyMenu();
menu.DestroyMenu();
delete sub_menu;
}
}
int CLogicView::FindSelectionScreen(CPoint point)
{
CRect c_rect;
GetClientRect(c_rect);
ClientToScreen(c_rect);
point.x -= c_rect.left;
point.y -= c_rect.top;
int trace_hit = -1;
int top = myParent->borderSize;
int start = GetScrollPos(SB_VERT);
for (int i = start; i < myParent->traceCount; ++i)
{
TraceLine *trace_line;
trace_line = (TraceLine *)myParent->traceListArray->GetAt(i);
int bottom = top + trace_line->CalculateSize();
if (point.y < bottom && point.y > top)
{
trace_hit = i;
}
top = bottom;
top += myParent->borderSize;
}
return trace_hit;
}
void CLogicView::OnPlugIn( UINT nID )
{
myParent->analyzerRegistry.Analyze(myParent, menuOnTraceIndex, nID);
}
void CLogicView::SetStatusBar(void)
{
char temp[60];
char time[60];
sprintf(time, "%8.4f", (myParent->viewedTime.startTimeSel) / SCALES[myParent->viewedTime.secondEnum]);
strcpy(temp, time);
strcat(temp, SCALES_TEXT[myParent->viewedTime.secondEnum]);
CString str;
str = "StartSel : ";
str += temp;
str += " ";
sprintf(time, "%8.4f", (myParent->viewedTime.endTimeSel) / SCALES[myParent->viewedTime.secondEnum]);
strcpy(temp, time);
strcat(temp, SCALES_TEXT[myParent->viewedTime.secondEnum]);
str += "EndSel : ";
str += temp;
str += " ";
sprintf(time, "%8.4f", (fabs(myParent->viewedTime.endTimeSel-myParent->viewedTime.startTimeSel)) / SCALES[myParent->viewedTime.secondEnum]);
strcpy(temp, time);
strcat(temp, SCALES_TEXT[myParent->viewedTime.secondEnum]);
str += "TotalTimeSelected : ";
str += temp;
#if 0
str.Format("StartSel: %fs EndSel: %fs TotalTimeSelected: %fs",
myParent->viewedTime.startTimeSel, myParent->viewedTime.endTimeSel,
fabs(myParent->viewedTime.endTimeSel-myParent->viewedTime.startTimeSel));
#endif
CMainFrame *mainfrm = (CMainFrame*) AfxGetApp()->m_pMainWnd;
CStatusBar *status = &mainfrm->m_wndStatusBar;
status->SetPaneText(1, str);
}