The main game window becomes the cockpit shell (enlarged, clipping children); every display folds in as a chrome-less child pane in the pod interior arrangement: [ MFD UL ] [ MFD UC ] [ MFD UR ] [ plasma (reduced) ][ viewscreen (centered) ] [ MFD LL ] [ Map ] [ MFD LR ] The 3D scene presents into a black STATIC viewscreen child via Present's hDestWindowOverride (new gMainPresentWindow global) - no swap-chain changes, and STATIC's transparent hit-testing keeps mouse input over the 3D view flowing to the game window. MFDSplitView gains a parent/child mode; PlasmaScreen::Position reparents the glass into the shell. Main window class background goes black for the cockpit gaps. Verified by screenshot: live green gauges (LIFT CUT / BOOST / CHUTE / trigger-program screens) with their red button strips, the 3D canyon in the centered viewscreen, plasma score glass at its left, map with lit amber preset lamps - one window, 976x1132 client at 50% scale. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
126 lines
3.0 KiB
C++
126 lines
3.0 KiB
C++
#pragma once
|
|
|
|
#include "..\munga\style.h"
|
|
|
|
//########################################################################
|
|
//############################ MFDSplitView ##############################
|
|
//########################################################################
|
|
//
|
|
// One desktop window showing a single cockpit display, used by SVGA16's
|
|
// split mode (L4MFDSPLIT=1). The pod hardware packed the five monochrome
|
|
// MFDs into the color channels of two video outputs and mounted the map
|
|
// display rotated; on a desktop each display gets its own window instead.
|
|
//
|
|
// Each window also carries its display's physical button bank, exactly
|
|
// as mounted in the pod (geometry per vRIO's CockpitLayout):
|
|
// - MFDs: a 4x2 cluster - 4 red buttons above the glass, 4 below,
|
|
// RIO addresses descending from the cluster anchor (top-left = hi).
|
|
// - The map ("secondary screen"): 6 amber buttons down each side -
|
|
// Secondary 0x10-0x15 on the left, Screen 0x18-0x1D on the right
|
|
// (the remaining column addresses are Tesla relays, not buttons).
|
|
// Buttons light from the lamp state the game commands (via PadRIO) and
|
|
// press/release RIO units with the mouse.
|
|
//
|
|
// SVGA16 fills Pixels() (32bpp top-down, sourceWidth x sourceHeight as
|
|
// passed - already swapped by the caller for the rotated map) and calls
|
|
// Repaint(). Closing a view window just hides it.
|
|
//
|
|
class MFDSplitView
|
|
{
|
|
public:
|
|
enum ButtonStyle
|
|
{
|
|
NoButtons = 0,
|
|
MFDStrips, // 4 above + 4 below, addresses descend from anchorA
|
|
SideColumns // 6 per side; anchorA = left base, anchorB = right base
|
|
};
|
|
|
|
// With a parent, the view is created as a chrome-less child window
|
|
// inside the single cockpit window (x/y in parent client coords);
|
|
// without one it is its own draggable desktop window.
|
|
MFDSplitView(
|
|
const char *title,
|
|
int source_width,
|
|
int source_height,
|
|
int display_width,
|
|
int display_height,
|
|
int x,
|
|
int y,
|
|
ButtonStyle button_style = NoButtons,
|
|
int anchorA = 0,
|
|
int anchorB = 0,
|
|
void *parent = 0
|
|
);
|
|
|
|
int
|
|
ClientWidth() const
|
|
{ return clientWidth; }
|
|
int
|
|
ClientHeight() const
|
|
{ return clientHeight; }
|
|
|
|
~MFDSplitView();
|
|
|
|
Logical
|
|
TestInstance() const;
|
|
|
|
unsigned long *
|
|
Pixels()
|
|
{ return pixels; }
|
|
|
|
void
|
|
Repaint();
|
|
|
|
// Window-procedure callbacks (public for the registered WndProc)
|
|
void
|
|
Paint();
|
|
void
|
|
MouseDown(int x, int y);
|
|
void
|
|
MouseUp();
|
|
|
|
protected:
|
|
void
|
|
LayoutButtons(
|
|
ButtonStyle button_style,
|
|
int anchorA,
|
|
int anchorB,
|
|
int display_width,
|
|
int display_height,
|
|
int *client_width,
|
|
int *client_height
|
|
);
|
|
|
|
struct ScreenButton
|
|
{
|
|
int unit;
|
|
int x, y, w, h;
|
|
int amber; // 0 = red family, 1 = amber family
|
|
};
|
|
|
|
enum { maxButtons = 20 };
|
|
|
|
void
|
|
*window; // HWND
|
|
void
|
|
*blitHeader; // BITMAPINFOHEADER for StretchDIBits
|
|
unsigned long
|
|
*pixels;
|
|
int
|
|
sourceWidth,
|
|
sourceHeight;
|
|
|
|
int
|
|
displayX, displayY,
|
|
displayW, displayH;
|
|
int
|
|
clientWidth, clientHeight;
|
|
|
|
ScreenButton
|
|
buttons[maxButtons];
|
|
int
|
|
buttonCount;
|
|
int
|
|
pressedIndex;
|
|
};
|