diff options
author | Paul Gilbert | 2017-03-26 18:27:22 -0400 |
---|---|---|
committer | Paul Gilbert | 2017-03-26 18:27:22 -0400 |
commit | 857bf17e2c1adaa35764def6531b5fe1f1ea4ea8 (patch) | |
tree | 1b8fe64934e882d0b183f0870ac13d0a4c5980a6 | |
parent | f311aa38c1a264625209ba3a9c53d8477906b3fd (diff) | |
download | scummvm-rg350-857bf17e2c1adaa35764def6531b5fe1f1ea4ea8.tar.gz scummvm-rg350-857bf17e2c1adaa35764def6531b5fe1f1ea4ea8.tar.bz2 scummvm-rg350-857bf17e2c1adaa35764def6531b5fe1f1ea4ea8.zip |
TITANIC: Added CBaseStar draw4 method
-rw-r--r-- | engines/titanic/star_control/base_star.cpp | 69 |
1 files changed, 68 insertions, 1 deletions
diff --git a/engines/titanic/star_control/base_star.cpp b/engines/titanic/star_control/base_star.cpp index 8a7803712c..28cd7969ce 100644 --- a/engines/titanic/star_control/base_star.cpp +++ b/engines/titanic/star_control/base_star.cpp @@ -403,7 +403,74 @@ void CBaseStar::draw3(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, CStar } void CBaseStar::draw4(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, *v3Ptr = &_value3; + 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)((temp2 + *v3Ptr) * *v1Ptr / total + centroid._x); + int yStart = (int)(temp1 * *v2Ptr / 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); + sVal *= 255.0; + + if (sVal > 255.0) + sVal = 255.0; + + if (sVal > 2.0) { + uint16 *pixelP = (uint16 *)(surfaceArea->_pixelsPtr + surfaceArea->_pitch * yStart + xStart * 2); + int rgb = ((int)(sVal - 0.5) & 0xf8) << 8; + + 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; + } + } + } } int CBaseStar::baseFn1(CSurfaceArea *surfaceArea, CStarControlSub12 *sub12, |