mirror of
https://github.com/DerKoun/bsnes-hd.git
synced 2025-04-02 10:52:49 -04:00
204 lines
12 KiB
C++
204 lines
12 KiB
C++
extern uint16_t SnowData[800];
|
|
extern uint8_t SnowVelDist[800];
|
|
|
|
auto Program::viewportSize(uint& width, uint& height, uint scale) -> void {
|
|
uint videoWidth = (width / scale) * (settings.video.aspectCorrection ? 8.0 / 7.0 : 1.0);
|
|
uint videoHeight = (height / scale);
|
|
|
|
auto [viewportWidth, viewportHeight] = video.size();
|
|
|
|
uint multiplierX = viewportWidth / videoWidth;
|
|
uint multiplierY = viewportHeight / videoHeight;
|
|
uint multiplier = min(multiplierX, multiplierY);
|
|
|
|
uint outputWidth = videoWidth * multiplier;
|
|
uint outputHeight = videoHeight * multiplier;
|
|
|
|
if(multiplier == 0 || settings.video.output == "Scale") {
|
|
float multiplierX = (float)viewportWidth / (float)videoWidth;
|
|
float multiplierY = (float)viewportHeight / (float)videoHeight;
|
|
float multiplier = min(multiplierX, multiplierY);
|
|
|
|
outputWidth = videoWidth * multiplier;
|
|
outputHeight = videoHeight * multiplier;
|
|
}
|
|
|
|
if(settings.video.output == "Stretch") {
|
|
outputWidth = viewportWidth;
|
|
outputHeight = viewportHeight;
|
|
}
|
|
|
|
width = outputWidth;
|
|
height = outputHeight;
|
|
}
|
|
|
|
auto Program::viewportRefresh() -> void {
|
|
if(!emulator->loaded() && !settings.video.snow) return;
|
|
|
|
static uint32_t SnowMover = 0;
|
|
static uint32_t SnowTimer = 18;
|
|
static uint32_t NumSnow = 0;
|
|
if(settings.video.snow) SnowMover++;
|
|
|
|
static const uint32 nullData[256 * 240] = {};
|
|
auto data = nullData;
|
|
uint pitch = 512;
|
|
uint width = 256;
|
|
uint height = 240;
|
|
uint scale = 1;
|
|
|
|
if(emulator->loaded() && screenshot.data) {
|
|
data = screenshot.data;
|
|
pitch = screenshot.pitch;
|
|
width = screenshot.width;
|
|
height = screenshot.height;
|
|
scale = screenshot.scale;
|
|
}
|
|
|
|
uint offset = settings.video.overscan ? 8 : 12;
|
|
uint multiplier = height / 215;
|
|
data += offset * multiplier * (pitch >> 2);
|
|
height -= offset * multiplier * 2;
|
|
|
|
uint outputWidth = width, outputHeight = height;
|
|
viewportSize(outputWidth, outputHeight, scale);
|
|
|
|
uint filterWidth = width, filterHeight = height;
|
|
|
|
if(auto [output, length] = video.acquire(filterWidth, filterHeight); output) {
|
|
//HD-TODO: add back 'dimmed' (rgb each >>=1)
|
|
if (length == pitch) {
|
|
memory::copy<uint32>(output, data, width * height);
|
|
} else {
|
|
for(uint y = 0; y < height; y++) {
|
|
memory::copy<uint32>(output + y * (length >> 2), data + y * (pitch >> 2), width);
|
|
}
|
|
}
|
|
|
|
length >>= 2;
|
|
|
|
if(settings.video.snow) {
|
|
uint32_t i = 0;
|
|
float snowX = filterWidth / 256.0;
|
|
float snowY = filterHeight / 256.0;
|
|
do {
|
|
uint x = uint8_t(SnowData[i * 2 + 0] >> 8) * snowX;
|
|
uint y = uint8_t(SnowData[i * 2 + 1] >> 8) * snowY;
|
|
if((SnowVelDist[i * 2] & 8) != 0 && y) {
|
|
uint32_t pixel = output[y * length + x];
|
|
float a = SnowVelDist[i * 2] / 255.0;
|
|
uint8_t r = (pixel >> 16 & 0xff) * a + 255 * (1.0 - a);
|
|
uint8_t g = (pixel >> 8 & 0xff) * a + 255 * (1.0 - a);
|
|
uint8_t b = (pixel >> 0 & 0xff) * a + 255 * (1.0 - a);
|
|
output[y * length + x] = 255u << 24 | r << 16 | g << 8 | b << 0;
|
|
}
|
|
} while(++i != 200);
|
|
|
|
for(; SnowMover != 0; --SnowMover) {
|
|
if(--SnowTimer == 0) {
|
|
if(NumSnow < 400) ++NumSnow;
|
|
SnowTimer = 18;
|
|
}
|
|
uint32_t i = 0;
|
|
uint32_t n = NumSnow;
|
|
while(n-- != 0) {
|
|
SnowData[i * 2 + 0] += SnowVelDist[i * 2 + 0] + 4 * (uint8_t)(100 - 50);
|
|
SnowData[i * 2 + 1] += SnowVelDist[i * 2 + 1] + 256;
|
|
if(SnowData[i * 2 + 1] <= 0x200) {
|
|
SnowVelDist[i * 2] |= 8;
|
|
}
|
|
++i;
|
|
}
|
|
}
|
|
}
|
|
|
|
video.release();
|
|
video.output(outputWidth, outputHeight);
|
|
}
|
|
}
|
|
|
|
uint16_t SnowData[800] = {
|
|
161, 251, 115, 211, 249, 87, 128, 101, 232, 176, 51, 180, 108, 193, 224, 112, 254, 159, 102, 238,
|
|
223, 123, 218, 42, 173, 160, 143, 170, 64, 1, 174, 29, 34, 187, 194, 199, 40, 89, 232, 32,
|
|
7, 195, 141, 67, 216, 48, 234, 1, 243, 116, 164, 182, 146, 136, 66, 70, 36, 43, 98, 208,
|
|
63, 240, 216, 253, 147, 36, 33, 253, 98, 80, 228, 156, 73, 82, 85, 1, 97, 72, 187, 239,
|
|
18, 196, 127, 182, 22, 22, 101, 25, 124, 145, 240, 213, 186, 22, 7, 161, 30, 98, 90, 197,
|
|
22, 205, 32, 150, 59, 133, 49, 140, 10, 128, 142, 185, 176, 142, 220, 195, 100, 102, 105, 194,
|
|
43, 139, 184, 153, 1, 95, 176, 169, 192, 201, 233, 243, 73, 65, 188, 14, 194, 39, 251, 140,
|
|
239, 181, 142, 160, 242, 248, 82, 49, 9, 157, 233, 162, 254, 121, 112, 6, 118, 24, 56, 121,
|
|
74, 209, 1, 223, 145, 6, 75, 73, 18, 168, 194, 168, 58, 39, 222, 170, 214, 75, 45, 218,
|
|
39, 197, 242, 98, 22, 90, 255, 5, 144, 244, 252, 55, 98, 18, 135, 101, 27, 85, 215, 207,
|
|
183, 28, 201, 142, 45, 122, 145, 159, 41, 243, 109, 29, 117, 203, 7, 234, 231, 214, 131, 133,
|
|
217, 8, 74, 207, 130, 77, 21, 229, 167, 78, 218, 109, 142, 58, 134, 238, 29, 182, 178, 14,
|
|
144, 129, 196, 219, 60, 128, 30, 105, 57, 53, 76, 122, 242, 208, 101, 241, 246, 99, 248, 67,
|
|
137, 244, 70, 51, 202, 94, 164, 125, 115, 72, 61, 72, 129, 169, 155, 122, 91, 154, 160, 83,
|
|
41, 102, 223, 218, 140, 40, 132, 16, 223, 92, 50, 230, 168, 47, 126, 117, 242, 136, 1, 245,
|
|
171, 0, 36, 98, 73, 69, 14, 229, 66, 177, 108, 92, 39, 250, 243, 161, 111, 85, 211, 99,
|
|
52, 98, 121, 188, 128, 201, 90, 205, 223, 92, 177, 19, 87, 18, 75, 54, 6, 81, 235, 137,
|
|
247, 66, 211, 129, 247, 39, 119, 206, 116, 250, 113, 231, 190, 196, 53, 51, 34, 114, 39, 22,
|
|
192, 33, 249, 151, 26, 22, 139, 97, 171, 238, 182, 88, 22, 176, 157, 255, 178, 199, 138, 98,
|
|
140, 36, 112, 90, 25, 245, 134, 64, 48, 190, 165, 113, 24, 195, 84, 70, 175, 9, 179, 69,
|
|
13, 26, 167, 237, 163, 159, 185, 128, 109, 114, 86, 74, 188, 103, 141, 48, 188, 203, 205, 191,
|
|
215, 193, 224, 4, 153, 36, 108, 3, 172, 235, 56, 251, 211, 115, 173, 216, 240, 33, 78, 150,
|
|
133, 64, 51, 103, 56, 26, 165, 222, 70, 148, 115, 119, 246, 229, 181, 63, 109, 49, 228, 108,
|
|
126, 10, 170, 48, 87, 42, 193, 24, 28, 255, 176, 176, 209, 181, 97, 93, 61, 241, 201, 137,
|
|
129, 97, 24, 159, 168, 215, 61, 113, 104, 143, 168, 7, 196, 216, 149, 239, 110, 65, 75, 143,
|
|
238, 0, 37, 19, 8, 56, 65, 234, 228, 72, 42, 5, 226, 95, 243, 51, 55, 231, 114, 90,
|
|
160, 141, 171, 108, 218, 252, 154, 64, 175, 142, 214, 211, 180, 129, 217, 118, 33, 130, 213, 2,
|
|
73, 145, 93, 21, 162, 141, 97, 225, 112, 253, 49, 43, 113, 208, 131, 104, 31, 51, 192, 37,
|
|
117, 186, 16, 45, 61, 114, 220, 6, 89, 163, 197, 203, 142, 80, 89, 115, 190, 190, 228, 15,
|
|
166, 145, 59, 139, 120, 79, 104, 252, 246, 73, 113, 144, 224, 65, 204, 155, 221, 85, 31, 99,
|
|
48, 253, 94, 159, 215, 31, 123, 204, 248, 153, 31, 210, 174, 178, 54, 146, 152, 88, 56, 92,
|
|
197, 35, 124, 104, 211, 118, 1, 207, 108, 68, 123, 161, 107, 69, 143, 13, 79, 170, 130, 193,
|
|
214, 153, 219, 247, 227, 2, 170, 208, 248, 139, 118, 241, 247, 183, 18, 135, 246, 126, 201, 46,
|
|
70, 234, 171, 72, 18, 135, 236, 216, 32, 178, 148, 231, 161, 15, 6, 254, 34, 181, 5, 71,
|
|
2, 219, 71, 87, 252, 16, 202, 190, 180, 83, 99, 209, 75, 134, 78, 84, 114, 32, 171, 246,
|
|
125, 11, 57, 200, 102, 29, 176, 26, 205, 151, 152, 108, 100, 146, 117, 95, 71, 77, 158, 207,
|
|
60, 192, 50, 135, 223, 237, 231, 53, 27, 195, 170, 146, 155, 160, 92, 224, 247, 187, 14, 50,
|
|
203, 5, 153, 42, 17, 75, 109, 14, 78, 160, 236, 114, 131, 105, 189, 209, 233, 135, 221, 207,
|
|
226, 119, 104, 10, 178, 107, 77, 160, 233, 179, 120, 227, 133, 241, 32, 223, 63, 247, 66, 157,
|
|
140, 81, 118, 81, 63, 193, 173, 228, 214, 78, 124, 123, 222, 149, 9, 242, 0, 128, 194, 110
|
|
};
|
|
|
|
uint8_t SnowVelDist[800] = {
|
|
57, 92, 100, 19, 100, 184, 238, 225, 55, 240, 255, 221, 215, 105, 226, 153, 164, 41, 22, 93,
|
|
176, 203, 155, 199, 244, 52, 233, 219, 110, 227, 229, 227, 152, 240, 83, 248, 226, 31, 163, 22,
|
|
28, 156, 18, 10, 248, 67, 123, 167, 25, 138, 90, 10, 79, 107, 208, 229, 248, 233, 185, 10,
|
|
167, 21, 19, 178, 132, 154, 81, 70, 20, 71, 95, 147, 72, 27, 91, 189, 13, 189, 102, 84,
|
|
195, 123, 251, 93, 68, 36, 178, 59, 107, 99, 104, 191, 76, 110, 44, 206, 123, 46, 98, 112,
|
|
26, 50, 1, 35, 150, 17, 242, 208, 69, 23, 202, 197, 59, 80, 136, 124, 40, 89, 11, 40,
|
|
1, 136, 90, 72, 198, 83, 2, 174, 174, 4, 28, 205, 135, 35, 194, 54, 22, 40, 4, 132,
|
|
191, 88, 163, 66, 204, 230, 35, 111, 9, 177, 254, 174, 163, 68, 5, 88, 111, 235, 58, 236,
|
|
4, 248, 172, 154, 101, 164, 43, 223, 10, 13, 210, 125, 146, 73, 192, 57, 117, 152, 128, 36,
|
|
106, 21, 253, 113, 110, 133, 244, 4, 150, 32, 76, 71, 22, 106, 210, 244, 46, 128, 27, 215,
|
|
231, 112, 177, 196, 198, 120, 196, 57, 234, 74, 235, 108, 64, 181, 209, 188, 177, 63, 197, 200,
|
|
126, 164, 136, 163, 48, 62, 225, 223, 212, 201, 195, 121, 90, 7, 10, 196, 88, 53, 39, 249,
|
|
147, 98, 65, 253, 246, 3, 152, 125, 242, 105, 44, 129, 94, 232, 13, 4, 86, 220, 194, 67,
|
|
186, 210, 171, 197, 64, 138, 89, 78, 58, 150, 52, 79, 138, 201, 244, 111, 106, 181, 192, 69,
|
|
234, 253, 239, 113, 98, 37, 209, 151, 60, 47, 241, 235, 185, 52, 173, 94, 172, 182, 47, 150,
|
|
80, 118, 10, 58, 161, 237, 10, 64, 238, 198, 14, 74, 132, 250, 234, 63, 169, 86, 158, 170,
|
|
76, 168, 124, 133, 28, 203, 246, 140, 228, 77, 50, 53, 115, 113, 157, 218, 90, 192, 28, 209,
|
|
72, 117, 156, 101, 226, 99, 11, 245, 69, 59, 17, 175, 164, 59, 8, 166, 163, 185, 10, 60,
|
|
100, 19, 26, 38, 114, 232, 180, 115, 238, 184, 88, 103, 178, 67, 212, 21, 87, 64, 85, 1,
|
|
62, 87, 155, 62, 21, 96, 205, 195, 131, 97, 191, 252, 218, 209, 179, 201, 12, 2, 234, 110,
|
|
162, 14, 145, 170, 156, 105, 85, 132, 132, 60, 239, 14, 80, 129, 225, 144, 149, 244, 188, 8,
|
|
13, 168, 181, 168, 30, 142, 24, 110, 26, 172, 231, 182, 50, 214, 66, 193, 100, 45, 132, 144,
|
|
205, 190, 16, 133, 45, 250, 83, 183, 140, 229, 117, 226, 68, 59, 163, 96, 235, 227, 25, 155,
|
|
209, 105, 41, 214, 30, 107, 2, 85, 180, 23, 241, 39, 113, 63, 75, 44, 107, 142, 93, 29,
|
|
62, 240, 235, 152, 147, 52, 54, 146, 109, 112, 139, 162, 238, 198, 201, 8, 141, 115, 112, 106,
|
|
4, 99, 25, 155, 111, 161, 114, 253, 75, 100, 28, 59, 101, 150, 2, 122, 228, 6, 12, 59,
|
|
249, 181, 67, 136, 227, 227, 199, 46, 75, 203, 50, 25, 50, 61, 62, 22, 238, 124, 218, 134,
|
|
243, 21, 243, 222, 94, 138, 161, 234, 133, 23, 138, 45, 4, 226, 154, 227, 8, 84, 105, 126,
|
|
200, 127, 240, 144, 124, 197, 102, 144, 53, 29, 94, 231, 108, 175, 136, 37, 44, 183, 178, 95,
|
|
41, 196, 214, 12, 42, 221, 106, 225, 151, 32, 53, 130, 24, 211, 88, 14, 135, 18, 90, 219,
|
|
177, 129, 90, 217, 162, 181, 199, 133, 116, 56, 36, 100, 230, 91, 220, 83, 41, 65, 20, 64,
|
|
177, 197, 249, 24, 242, 62, 26, 234, 92, 44, 167, 153, 243, 94, 179, 163, 103, 29, 220, 199,
|
|
128, 94, 236, 152, 53, 32, 77, 78, 228, 89, 124, 85, 87, 50, 197, 116, 179, 105, 236, 139,
|
|
102, 17, 159, 66, 176, 27, 205, 36, 113, 80, 60, 6, 61, 174, 254, 174, 246, 72, 154, 31,
|
|
97, 40, 10, 8, 114, 203, 238, 26, 89, 51, 134, 110, 118, 176, 87, 32, 192, 210, 146, 207,
|
|
88, 45, 156, 179, 61, 224, 87, 107, 107, 1, 252, 187, 203, 100, 169, 211, 205, 105, 12, 231,
|
|
137, 176, 166, 37, 192, 241, 169, 84, 32, 85, 112, 168, 154, 7, 247, 146, 183, 225, 246, 173,
|
|
57, 103, 110, 236, 113, 118, 203, 200, 22, 87, 251, 7, 138, 37, 12, 84, 221, 171, 51, 209,
|
|
242, 37, 89, 73, 151, 162, 139, 189, 131, 209, 221, 96, 107, 144, 175, 79, 199, 123, 98, 138,
|
|
226, 86, 221, 254, 72, 14, 126, 180, 200, 171, 85, 94, 120, 124, 196, 225, 150, 57, 219, 158
|
|
};
|