From 79bb0adab8f96fb49e828fcc848cb7bef5d1ef13 Mon Sep 17 00:00:00 2001 From: oz Date: Sat, 14 Nov 2020 18:13:00 +0300 Subject: [PATCH] zdrv v1, ready. --- Doc/FuncStats.xlsx | Bin 31437 -> 31496 bytes SpaceCadetPinball/loader.cpp | 4 +- SpaceCadetPinball/memory.h | 9 +++ SpaceCadetPinball/render.h | 5 +- SpaceCadetPinball/zdrv.cpp | 120 +++++++++++++++++++++++++++++++++++ SpaceCadetPinball/zdrv.h | 22 +++++-- 6 files changed, 150 insertions(+), 10 deletions(-) diff --git a/Doc/FuncStats.xlsx b/Doc/FuncStats.xlsx index b5acbe9b58aa9f8f9b17a00317313f1ba98bd377..ea9f0bddaffbc65a351780da72ea5c7ea22f1e59 100644 GIT binary patch delta 22635 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 delta 22544 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 diff --git a/SpaceCadetPinball/loader.cpp b/SpaceCadetPinball/loader.cpp index fb7ba3b..0daf74f 100644 --- a/SpaceCadetPinball/loader.cpp +++ b/SpaceCadetPinball/loader.cpp @@ -451,8 +451,8 @@ int loader::query_visual(int groupIndex, int groupIndexOffset, visualStruct* vi visual->ZMap = bitmap16; if (bitmap16) { - bitmap16->BmpBufPtr1 = bitmap16->BmpBuffer; - visual->ZMap->bmpBufPtr2 = visual->ZMap->BmpBufPtr1; + bitmap16->ZPtr1 = bitmap16->ZBuffer; + visual->ZMap->ZPtr2 = visual->ZMap->ZPtr1; } shortArr = (__int16*)partman::field(loader_table, groupIndexSum2, datFieldTypes::ShortArray); if (shortArr) diff --git a/SpaceCadetPinball/memory.h b/SpaceCadetPinball/memory.h index d7e4a50..e42d53c 100644 --- a/SpaceCadetPinball/memory.h +++ b/SpaceCadetPinball/memory.h @@ -11,3 +11,12 @@ public: static int critical_allocation; static void (*critical_callback)(); }; + + +// Fill memory block with an integer value +inline void memset32(void* ptr, unsigned int value, int count) +{ + auto p = (unsigned int*)ptr; + for (int i = 0; i < count; i++) + *p++ = value; +} \ No newline at end of file diff --git a/SpaceCadetPinball/render.h b/SpaceCadetPinball/render.h index 78c85ed..f56fcc1 100644 --- a/SpaceCadetPinball/render.h +++ b/SpaceCadetPinball/render.h @@ -20,8 +20,7 @@ struct __declspec(align(4)) render_sprite_type_struct zmap_header_type* ZMap; char Unknown6_0; VisualType VisualType; - char Unknown6_2; - char Unknown6_3; + short Depth; int XPosition2; int YPosition2; int Bmp8Width2; @@ -37,6 +36,8 @@ struct __declspec(align(4)) render_sprite_type_struct visual_rect Rect; }; +static_assert(sizeof(render_sprite_type_struct) == 0x5c, "Wrong size render_sprite_type_struct"); + class render { public: diff --git a/SpaceCadetPinball/zdrv.cpp b/SpaceCadetPinball/zdrv.cpp index 01f2c4d..8abcb7c 100644 --- a/SpaceCadetPinball/zdrv.cpp +++ b/SpaceCadetPinball/zdrv.cpp @@ -1,2 +1,122 @@ #include "pch.h" #include "zdrv.h" +#include "memory.h" + + +int zdrv::create_zmap(zmap_header_type* zmap, int width, int height) +{ + int stride = pad(width); + zmap->Stride = stride; + auto bmpBuf = (unsigned short*)memory::allocate(2 * height * stride); + zmap->ZPtr1 = bmpBuf; + if (!bmpBuf) + return -1; + zmap->ZPtr2 = bmpBuf; + zmap->Width = width; + zmap->Height = height; + return 0; +} + +int zdrv::pad(int width) +{ + int result = width; + if (width & 3) + result = width - (width & 3) + 4; + return result; +} + +int zdrv::destroy_zmap(zmap_header_type* zmap) +{ + if (!zmap) + return -1; + if (zmap->ZPtr1) + memory::free(zmap->ZPtr1); + zmap->Width = 0; + zmap->Height = 0; + zmap->Stride = 0; + zmap->ZPtr1 = nullptr; + zmap->ZPtr2 = nullptr; + return 0; +} + +void zdrv::fill(zmap_header_type* zmap, int width, int height, int xOff, int yOff, __int16 fillChar) +{ + int fillCharInt = fillChar | (fillChar << 16); + auto zmapPtr = &zmap->ZPtr1[2 * (xOff + zmap->Stride * (zmap->Height - height - yOff))]; + + for (int y = height; width > 0 && y > 0; y--) + { + char widthMod2 = width & 1; + unsigned int widthDiv2 = static_cast(width) >> 1; + memset32(zmapPtr, fillCharInt, widthDiv2); + + __int16* lastShort = (__int16*)&zmapPtr[2 * widthDiv2]; + for (int i = widthMod2; i; --i) + *lastShort++ = fillChar; + + zmapPtr += zmap->Stride; + } +} + + +void zdrv::paint(int width, int height, gdrv_bitmap8* dstBmp, int dstBmpXOff, int dstBmpYOff, zmap_header_type* dstZMap, + int dstZMapXOff, int dstZMapYOff, gdrv_bitmap8* srcBmp, int srcBmpXOff, int srcBmpYOff, + zmap_header_type* srcZMap, int srcZMapXOff, int srcZMapYOff) +{ + int dstHeightAbs = abs(dstBmp->Height); + int srcHeightAbs = abs(srcBmp->Height); + auto srcPtr = &srcBmp->BmpBufPtr1[srcBmp->Stride * (srcHeightAbs - height - srcBmpYOff) + srcBmpXOff]; + auto dstPtr = &dstBmp->BmpBufPtr1[dstBmp->Stride * (dstHeightAbs - height - dstBmpYOff) + dstBmpXOff]; + auto srcPtrZ = &srcZMap->ZPtr1[srcZMap->Stride * (srcZMap->Height - height - srcZMapYOff) + srcZMapXOff]; + auto dstPtrZ = &dstZMap->ZPtr1[dstZMap->Stride * (dstZMap->Height - height - dstZMapYOff) + dstZMapXOff]; + + for (int y = height; y > 0; y--) + { + for (int x = width; x > 0; --x) + { + if (*dstPtrZ >= *srcPtrZ) + { + *dstPtr = *srcPtr; + *dstPtrZ = *srcPtrZ; + } + ++srcPtr; + ++dstPtr; + ++srcPtrZ; + ++dstPtrZ; + } + + srcPtr += srcBmp->Stride - width; + dstPtr += dstBmp->Stride - width; + srcPtrZ += srcZMap->Stride - width; + dstPtrZ += dstZMap->Stride - width; + } +} + +void zdrv::paint_flat(int width, int height, gdrv_bitmap8* dstBmp, int dstBmpXOff, int dstBmpYOff, + zmap_header_type* zMap, int dstZMapXOff, int dstZMapYOff, gdrv_bitmap8* srcBmp, int srcBmpXOff, + int srcBmpYOff, unsigned __int16 depth) +{ + int dstHeightAbs = abs(dstBmp->Height); + int srcHeightAbs = abs(srcBmp->Height); + auto dstPtr = &dstBmp->BmpBufPtr1[dstBmp->Stride * (dstHeightAbs - height - dstBmpYOff) + dstBmpXOff]; + auto srcPtr = &srcBmp->BmpBufPtr1[srcBmp->Stride * (srcHeightAbs - height - srcBmpYOff) + srcBmpXOff]; + auto zPtr = &zMap->ZPtr1[zMap->Stride * (zMap->Height - height - dstZMapYOff) + dstZMapXOff]; + + for (int y = height; y > 0; y--) + { + for (int x = width; x > 0; --x) + { + if (*srcPtr && *zPtr > depth) + { + *dstPtr = *srcPtr; + } + ++srcPtr; + ++dstPtr; + ++zPtr; + } + + srcPtr += srcBmp->Stride - width; + dstPtr += dstBmp->Stride - width; + zPtr += zMap->Stride - width; + } +} diff --git a/SpaceCadetPinball/zdrv.h b/SpaceCadetPinball/zdrv.h index cd26bdf..92d23ce 100644 --- a/SpaceCadetPinball/zdrv.h +++ b/SpaceCadetPinball/zdrv.h @@ -1,4 +1,5 @@ #pragma once +#include "gdrv.h" #pragma pack(push, 1) struct __declspec(align(1)) zmap_header_type @@ -6,17 +7,26 @@ struct __declspec(align(1)) zmap_header_type __int16 Width; __int16 Height; __int16 Stride; - char* BmpBufPtr1; - char* bmpBufPtr2; - char BmpBuffer[1]; + unsigned __int16* ZPtr1; + unsigned __int16* ZPtr2; + unsigned __int16 ZBuffer[1]; }; + #pragma pack(pop) -static_assert(sizeof(zmap_header_type) == 15, "Wrong size of zmap_header_type"); +static_assert(sizeof(zmap_header_type) == 16, "Wrong size of zmap_header_type"); class zdrv { public: - + static int pad(int width); + static int create_zmap(zmap_header_type* zmap, int width, int height); + static int destroy_zmap(zmap_header_type* zmap); + static void fill(zmap_header_type* zmap, int width, int height, int xOff, int yOff, __int16 fillChar); + static void paint(int width, int height, gdrv_bitmap8* dstBmp, int dstBmpXOff, int dstBmpYOff, + zmap_header_type* dstZMap, int dstZMapXOff, int dstZMapYOff, gdrv_bitmap8* srcBmp, int srcBmpXOff, + int srcBmpYOff, zmap_header_type* srcZMap, int srcZMapXOff, int srcZMapYOff); + static void paint_flat(int width, int height, gdrv_bitmap8* dstBmp, int dstBmpXOff, int dstBmpYOff, + zmap_header_type* zMap, int dstZMapXOff, int dstZMapYOff, gdrv_bitmap8* srcBmp, + int srcBmpXOff, int srcBmpYOff, unsigned __int16 depth); }; -