diff options
| -rw-r--r-- | engines/bladerunner/vqa_player.cpp | 4 | ||||
| -rw-r--r-- | engines/titanic/star_control/base_star.cpp | 84 | 
2 files changed, 85 insertions, 3 deletions
| diff --git a/engines/bladerunner/vqa_player.cpp b/engines/bladerunner/vqa_player.cpp index ba7001bfd5..c15ebc6d7a 100644 --- a/engines/bladerunner/vqa_player.cpp +++ b/engines/bladerunner/vqa_player.cpp @@ -130,7 +130,7 @@ void VQAPlayer::updateLights(Lights *lights) {  }  bool VQAPlayer::setLoop(int loop, int repeatsCount, int loopMode, void (*callback)(void *, int, int), void *callbackData) { -	debug("VQAPlayer::setBeginAndEndFrameFromLoop(%i, %i, %i, %x, %p), streamLoaded = %i", loop, repeatsCount, loopMode, (uint)callback, callbackData, _s != nullptr); +//	debug("VQAPlayer::setBeginAndEndFrameFromLoop(%i, %i, %i, %x, %p), streamLoaded = %i", loop, repeatsCount, loopMode, (uint)callback, callbackData, _s != nullptr);  	if (_s == nullptr) {  		_loopInitial = loop;  		_repeatsCountInitial = repeatsCount; @@ -149,7 +149,7 @@ bool VQAPlayer::setLoop(int loop, int repeatsCount, int loopMode, void (*callbac  }  bool VQAPlayer::setBeginAndEndFrame(int begin, int end, int repeatsCount, int loopMode, void (*callback)(void *, int, int), void *callbackData) { -	debug("VQAPlayer::setBeginAndEndFrame(%i, %i, %i, %i, %x, %p), streamLoaded = %i", begin, end, repeatsCount, loopMode, (uint)callback, callbackData, _s != nullptr); +//	debug("VQAPlayer::setBeginAndEndFrame(%i, %i, %i, %i, %x, %p), streamLoaded = %i", begin, end, repeatsCount, loopMode, (uint)callback, callbackData, _s != nullptr);  	if (repeatsCount < 0) {  		repeatsCount = -1; 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) { | 
