diff options
author | Paul Gilbert | 2017-03-26 17:37:24 -0400 |
---|---|---|
committer | Paul Gilbert | 2017-03-26 17:37:24 -0400 |
commit | 2ba3ebb15bd5f08559f904b06b2ccf6052b174ca (patch) | |
tree | 0dd62497f6bcdcfcb03c06d8fbd1b72fbd52ffea /engines/titanic/star_control | |
parent | b88d898b374fd159ce8a37534e296eadd6ba656e (diff) | |
download | scummvm-rg350-2ba3ebb15bd5f08559f904b06b2ccf6052b174ca.tar.gz scummvm-rg350-2ba3ebb15bd5f08559f904b06b2ccf6052b174ca.tar.bz2 scummvm-rg350-2ba3ebb15bd5f08559f904b06b2ccf6052b174ca.zip |
BLADERUNNER: Another compilation fix
Diffstat (limited to 'engines/titanic/star_control')
-rw-r--r-- | engines/titanic/star_control/base_star.cpp | 84 |
1 files changed, 83 insertions, 1 deletions
diff --git a/engines/titanic/star_control/base_star.cpp b/engines/titanic/star_control/base_star.cpp index 18f21ff6af..11885b7fd2 100644 --- a/engines/titanic/star_control/base_star.cpp +++ b/engines/titanic/star_control/base_star.cpp @@ -245,7 +245,89 @@ void CBaseStar::draw1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStar } void CBaseStar::draw2(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarControlSub5 *sub5) { - // TODO + CStarControlSub6 sub6 = sub12->proc23(); + sub12->proc36(&_value1, &_value2, &_value3, &_value4); + + const double MAX_VAL = 1.0e9 * 1.0e9; + FPoint centroid = surfaceArea->_centroid - FPoint(0.5, 0.5); + double threshold = sub12->proc25(); + double minVal = threshold - 9216.0; + int width1 = surfaceArea->_width - 1; + int height1 = surfaceArea->_height - 1; + double *v1Ptr = &_value1, *v2Ptr = &_value2; + FVector vector; + double total; + + for (uint idx = 0; idx < _data.size(); ++idx) { + CBaseStarEntry &entry = _data[idx]; + vector = entry._position; + total = vector._x * sub6._row1._z + vector._y * sub6._row2._z + + vector._z * sub6._row3._z + sub6._vector._z; + if (total <= minVal) + continue; + + double temp1 = vector._x * sub6._row1._y + vector._y * sub6._row2._y + vector._z * sub6._row3._y + vector._y; + double temp2 = vector._x * sub6._row1._x + vector._y * sub6._row2._x + vector._z * sub6._row3._x + vector._x; + double total2 = temp1 * temp1 + temp2 * temp2 + total * total; + + if (total2 < 1.0e12) { + sub5->proc2(&sub6, &vector, centroid._x, centroid._y, total2, + surfaceArea, sub12); + continue; + } + + if (total <= threshold || total2 >= MAX_VAL) + continue; + + int xStart = (int)(*v1Ptr * temp2 / total + centroid._x); + int yStart = (int)(*v2Ptr * temp1 / total + centroid._y); + if (xStart < 0 || xStart >= width1 || yStart < 0 || yStart >= height1) + continue; + + double sVal = sqrt(total2); + sVal = (sVal < 100000.0) ? 1.0 : 1.0 - ((sVal - 100000.0) / 1.0e9); + double red = MIN((double)entry._red * sVal, (double)255.0); + double green = MIN((double)entry._green * sVal, (double)255.0); + double blue = MIN((double)entry._green * sVal, (double)255.0); + + int skipCtr = 0; + if (red < 0.0) { + red = 0.0; + ++skipCtr; + } + if (green < 0.0) { + green = 0.0; + ++skipCtr; + } + if (blue < 0.0) { + blue = 0.0; + ++skipCtr; + } + if (skipCtr == 3) + continue; + + int r = (int)(red - 0.5) & 0xfff8; + int g = (int)(green - 0.5) & 0xfff8; + int b = (int)(blue - 0.5) & 0xfff8; + int rgb = (g | (r << 5)) << 2 | ((b >> 3) & 0xfff8); + uint16 *pixelP = (uint16 *)(surfaceArea->_pixelsPtr + surfaceArea->_pitch * yStart + xStart * 2); + + switch (entry._thickness) { + case 0: + *pixelP = rgb; + break; + + case 1: + *pixelP = rgb; + *(pixelP + 1) = rgb; + *(pixelP + surfaceArea->_pitch / 2) = rgb; + *(pixelP + surfaceArea->_pitch / 2 + 1) = rgb; + break; + + default: + break; + } + } } void CBaseStar::draw3(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStarControlSub5 *sub5) { |