From ecb49409e7a25ee045ba2e72a59bec989ca7566b Mon Sep 17 00:00:00 2001 From: Scott Duensing Date: Sun, 14 Jul 2024 18:49:05 -0500 Subject: [PATCH] F256 3D scene and view updated to match PC. --- src/a23d2.c | 40 ++++++++++++++------ src/main.c | 6 +-- tools/scene.c | 100 +++++++++++++++++++++++++++++++++++++++----------- 3 files changed, 110 insertions(+), 36 deletions(-) diff --git a/src/a23d2.c b/src/a23d2.c index 4c64cb0..e447e05 100644 --- a/src/a23d2.c +++ b/src/a23d2.c @@ -26,6 +26,17 @@ #include // For memcopy +#define SCALE 1.25 // Scale factor for 256->320 +#define SCREEN3DX 255 // Resolution of A2-3D2 renderer. +#define SCREEN3DY 233 // These get scaled up to full-screen. +#define SCREEN3DXH 128 // Half of SCREEN3DX. +#define SCREEN3DYH 117 // Half of SCREEN3DY. + + +byte _scaleX[SCREEN3DX + 1]; +byte _scaleY[SCREEN3DY + 1]; + + volatile cameraT *_camera = (cameraT *)CAMERA_SHARED_START; // Simulation copy of camera. volatile cameraT *_cameraInDatabase; volatile byte *_pointer; @@ -44,6 +55,7 @@ byte _ram; //float _trig; + #define SEGMENT_A23D2 @@ -86,18 +98,18 @@ void a23d2Draw(void) { // Line. case (byte)LIN2D: - _x1 = (uint8_t)((int8_t)(*_pointer++) + 128); - _y1 = 255 - (uint8_t)((int8_t)(*_pointer++) + 128); - _x2 = (uint8_t)((int8_t)(*_pointer++) + 128); - _y2 = 255 - (uint8_t)((int8_t)(*_pointer++) + 128); - bitmapLine(_x1, _y1, _x2, _y2); + _x1 = (uint8_t)((int8_t)(*_pointer++) + SCREEN3DXH); + _y1 = SCREEN3DYH - (int8_t)(*_pointer++); + _x2 = (uint8_t)((int8_t)(*_pointer++) + SCREEN3DXH); + _y2 = SCREEN3DYH - (int8_t)(*_pointer++); + bitmapLine(_x1 + _scaleX[_x1], _scaleY[_y1], _x2 + _scaleX[_x2], _scaleY[_y2]); continue; // Point. case (byte)PNT2D: - _x1 = (uint8_t)((int8_t)(*_pointer++) + 128); - _y1 = 255 - (uint8_t)((int8_t)(*_pointer++) + 128); - bitmapPutPixel(_x1, _y1); + _x1 = (uint8_t)((int8_t)(*_pointer++) + SCREEN3DXH); + _y1 = SCREEN3DYH - (int8_t)(*_pointer++); + bitmapPutPixel(_x1 + _scaleX[_x1], _scaleY[_y1]); continue; // Set Color. @@ -138,9 +150,9 @@ void a23d2Init(void) { // Initialize A2-3D2 so we can use the "fast entry point" (NXTPT) when rendering. _bytes = 0; _pointer = (byte *)A23D2_TEST_DATABASE; // Standard location for test database in A2-3D2. - _pointer[_bytes++] = SCRSZ; // Screen size. 256x240. Center is 0,0. - _pointer[_bytes++] = 255; - _pointer[_bytes++] = 239; + _pointer[_bytes++] = SCRSZ; // Screen size. 255x233. Center is 0,0. We're going to scale this up. + _pointer[_bytes++] = SCREEN3DX; // Scales up to 320. + _pointer[_bytes++] = SCREEN3DY; // Scales up to 193 (leaves 46 pixels for a control panel). _pointer[_bytes++] = 0; _pointer[_bytes++] = 0; _pointer[_bytes++] = END; // Setup complete! @@ -180,6 +192,12 @@ void a23d2Init(void) { // Restore memory map. POKE(MMU_MEM_BANK_4, 4); POKE(MMU_MEM_BANK_3, 3); + + // Build scaling tables for stretching 3D scene to fill display. + // X table is the difference needed. Allows us to store it in one byte. + // Y table is the actual coordinate since it fits in a byte anyway. + for (_bytes=0; _bytes<=SCREEN3DX; _bytes++) _scaleX[_bytes] = (_bytes * SCALE) - _bytes; + for (_bytes=0; _bytes<=SCREEN3DY; _bytes++) _scaleY[_bytes] = (_bytes / SCALE); } diff --git a/src/main.c b/src/main.c index cc5221c..30419c1 100644 --- a/src/main.c +++ b/src/main.c @@ -689,9 +689,9 @@ int main(int argc, char *argv[]) { bitmapSetActive(c); bitmapSetColor(0); bitmapClear(); - // 3D Viewport edge. - bitmapSetColor(14); - bitmapLine(256, 0, 256, 239); + // Control Panel. + bitmapSetColor(8); + bitmapLine(0, 194, 319, 194); // Leaves 45 pixels at the bottom below this line. } bitmapSetVisible(0, true); bitmapSetVisible(1, false); diff --git a/tools/scene.c b/tools/scene.c index f673960..31cad4a 100644 --- a/tools/scene.c +++ b/tools/scene.c @@ -63,16 +63,22 @@ void cube(void) { void landscape(void) { - int16_t i; - int16_t x; - int16_t y; - int16_t min = 0; - int16_t max = 10000; + int32_t i; + int32_t x; + int32_t z; + int32_t w; + int32_t l; + int32_t min = 0; + int32_t max = 20000; // A mile is 5280. + int32_t lines = 10; + int32_t skip = (abs(min) + abs(max)) / lines; + + // Landscape db[bytes++] = STCOL; db[bytes++] = 2; // Green - for (i=min; i<=max; i+=1000) { + for (i=min; i<=max; i+=skip) { db[bytes++] = SPNT; db[bytes++] = LOW_BYTE(i); // X db[bytes++] = HIGH_BYTE(i); @@ -106,29 +112,79 @@ void landscape(void) { db[bytes++] = HIGH_BYTE(i); } - // Runway - 3000' x 100' - min = 3500; - max = min + 300; - x = 3500; + // Runway - 3000' x 200' + w = 200; + l = 3000; + x = skip * 3.5; + z = skip * 3.5; + //printf("%dx%d\n", x, z); + db[bytes++] = STCOL; - db[bytes++] = 8; // Dark Grey - for (i=0; i<=10; i+=2) { + db[bytes++] = 7; // Light Grey + + db[bytes++] = SPNT; + db[bytes++] = LOW_BYTE(x); // X + db[bytes++] = HIGH_BYTE(x); + db[bytes++] = 0; // Y + db[bytes++] = 0; + db[bytes++] = LOW_BYTE(z); // Z + db[bytes++] = HIGH_BYTE(z); + + db[bytes++] = CPNT; + db[bytes++] = LOW_BYTE(x+w); // X + db[bytes++] = HIGH_BYTE(x+w); + db[bytes++] = 0; // Y + db[bytes++] = 0; + db[bytes++] = LOW_BYTE(z); // Z + db[bytes++] = HIGH_BYTE(z); + + db[bytes++] = CPNT; + db[bytes++] = LOW_BYTE(x+w); // X + db[bytes++] = HIGH_BYTE(x+w); + db[bytes++] = 0; // Y + db[bytes++] = 0; + db[bytes++] = LOW_BYTE(z+l); // Z + db[bytes++] = HIGH_BYTE(z+l); + + db[bytes++] = CPNT; + db[bytes++] = LOW_BYTE(x); // X + db[bytes++] = HIGH_BYTE(x); + db[bytes++] = 0; // Y + db[bytes++] = 0; + db[bytes++] = LOW_BYTE(z+l); // Z + db[bytes++] = HIGH_BYTE(z+l); + + db[bytes++] = CPNT; + db[bytes++] = LOW_BYTE(x); // X + db[bytes++] = HIGH_BYTE(x); + db[bytes++] = 0; // Y + db[bytes++] = 0; + db[bytes++] = LOW_BYTE(z); // Z + db[bytes++] = HIGH_BYTE(z); + + db[bytes++] = STCOL; + db[bytes++] = 15; // White + + skip = l / (lines * 2); + x += (w / 2); + for (i=z + skip; i