[Scummvm-git-logs] scummvm master -> dbec7774b2ee99dad7567696ffff6461c66db8f3

dreammaster paulfgilbert at gmail.com
Sat Feb 29 19:47:33 UTC 2020


This automated email contains information about 2 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
af7f8787f8 ULTIMA8: Fix rendering content of minimaps
dbec7774b2 ULTIMA8: Cleanup of minimap gump code


Commit: af7f8787f86687cc42dd5ebff8a294bcfbdd19c2
    https://github.com/scummvm/scummvm/commit/af7f8787f86687cc42dd5ebff8a294bcfbdd19c2
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-29T11:43:38-08:00

Commit Message:
ULTIMA8: Fix rendering content of minimaps

Changed paths:
    engines/ultima/ultima8/gumps/minimap_gump.cpp
    engines/ultima/ultima8/gumps/minimap_gump.h


diff --git a/engines/ultima/ultima8/gumps/minimap_gump.cpp b/engines/ultima/ultima8/gumps/minimap_gump.cpp
index 4f27a8265d..6e8e6db24f 100644
--- a/engines/ultima/ultima8/gumps/minimap_gump.cpp
+++ b/engines/ultima/ultima8/gumps/minimap_gump.cpp
@@ -43,7 +43,7 @@ MiniMapGump::MiniMapGump(int x_, int y_) :
 	     FLAG_DRAGGABLE, LAYER_NORMAL), _minimap(), _lastMapNum(0) {
 	_minimap._format = TEX_FMT_NATIVE;
 	_minimap._width = _minimap._height = MAP_NUM_CHUNKS * MINMAPGUMP_SCALE;
-	_minimap._buffer = _texBuffer[0];
+	_minimap._buffer = (uint32 *)_texBuffer;
 }
 
 MiniMapGump::MiniMapGump() : Gump() {
@@ -52,6 +52,26 @@ MiniMapGump::MiniMapGump() : Gump() {
 MiniMapGump::~MiniMapGump(void) {
 }
 
+void MiniMapGump::setPixelAt(int x, int y, uint32 pixel) {
+	if (RenderSurface::_format.s_bytes_per_pixel == 2) {
+		uint16 *buf = (uint16 *)_texBuffer + (y * _minimap._width) + x;
+		*buf = pixel;
+	} else {
+		uint32 *buf = (uint32 *)_texBuffer + (y * _minimap._width) + x;
+		*buf = pixel;
+	}
+}
+
+uint32 MiniMapGump::getPixelAt(int x, int y) {
+	if (RenderSurface::_format.s_bytes_per_pixel == 2) {
+		uint16 *buf = (uint16 *)_texBuffer + (y * _minimap._width) + x;
+		return *buf;
+	} else {
+		uint32 *buf = (uint32 *)_texBuffer + (y * _minimap._width) + x;
+		return *buf;
+	}
+}
+
 void MiniMapGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scaled) {
 	World *world = World::get_instance();
 	CurrentMap *currentmap = world->getCurrentMap();
@@ -71,11 +91,14 @@ void MiniMapGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scaled)
 		for (int xv = 0; xv < MAP_NUM_CHUNKS; xv++) {
 			if (currentmap->isChunkFast(xv, yv)) {
 				for (int j = 0; j < MINMAPGUMP_SCALE; j++) for (int i = 0; i < MINMAPGUMP_SCALE; i++) {
-					if (_texBuffer[yv * MINMAPGUMP_SCALE + j][xv * MINMAPGUMP_SCALE + i] == 0)
-						_texBuffer[yv * MINMAPGUMP_SCALE + j][xv * MINMAPGUMP_SCALE + i] = sampleAtPoint(
+					uint32 val = getPixelAt(xv * MINMAPGUMP_SCALE + i, yv * MINMAPGUMP_SCALE + j);
+					if (val == 0) {
+						val = sampleAtPoint(
 							xv * mapChunkSize + mapChunkSize / (MINMAPGUMP_SCALE * 2) + (mapChunkSize * i) / MINMAPGUMP_SCALE,
 							yv * mapChunkSize + mapChunkSize / (MINMAPGUMP_SCALE * 2) + (mapChunkSize * j) / MINMAPGUMP_SCALE,
 							currentmap);
+						setPixelAt(xv * MINMAPGUMP_SCALE + i, yv * MINMAPGUMP_SCALE + j, val);
+					}
 				}
 			}
 		}
@@ -147,7 +170,8 @@ uint32 MiniMapGump::sampleAtPoint(int x_, int y_, CurrentMap *currentmap) {
 
 		uint16 r = 0, g = 0, b = 0, c = 0;
 
-		for (int j = 0; j < 2; j++) for (int i = 0; i < 2; i++) {
+		for (int j = 0; j < 2; j++) {
+			for (int i = 0; i < 2; i++) {
 				if (!frame->hasPoint(i - sx, j - sy)) continue;
 
 				uint16 r2, g2, b2;
@@ -157,10 +181,16 @@ uint32 MiniMapGump::sampleAtPoint(int x_, int y_, CurrentMap *currentmap) {
 				b += RenderSurface::_gamma22toGamma10[b2];
 				c++;
 			}
-		if (!c) return 0;
+		}
 
-		return PACK_RGB8(RenderSurface::_gamma10toGamma22[r / c], RenderSurface::_gamma10toGamma22[g / c], RenderSurface::_gamma10toGamma22[b / c]);
-	} else return 0;
+		if (!c)
+			return 0;
+
+		uint32 v = PACK_RGB8(RenderSurface::_gamma10toGamma22[r / c], RenderSurface::_gamma10toGamma22[g / c], RenderSurface::_gamma10toGamma22[b / c]);
+		return v;
+	} else {
+		return 0;
+	}
 }
 
 void MiniMapGump::saveData(ODataSource *ods) {
@@ -173,7 +203,7 @@ bool MiniMapGump::loadData(IDataSource *ids, uint32 version) {
 	_lastMapNum = 0;
 	_minimap._format = TEX_FMT_NATIVE;
 	_minimap._width = _minimap._height = MAP_NUM_CHUNKS * MINMAPGUMP_SCALE;
-	_minimap._buffer = _texBuffer[0];
+	_minimap._buffer = (uint32 *)_texBuffer[0];
 
 	return true;
 }
diff --git a/engines/ultima/ultima8/gumps/minimap_gump.h b/engines/ultima/ultima8/gumps/minimap_gump.h
index 5f30717e8a..08a3e1826f 100644
--- a/engines/ultima/ultima8/gumps/minimap_gump.h
+++ b/engines/ultima/ultima8/gumps/minimap_gump.h
@@ -34,12 +34,14 @@ namespace Ultima8 {
 #define MINMAPGUMP_SCALE 8
 
 class MiniMapGump : public Gump {
+private:
 	Texture             _minimap;
 	unsigned int        _lastMapNum;
-	uint32              _texBuffer[MAP_NUM_CHUNKS * MINMAPGUMP_SCALE][MAP_NUM_CHUNKS * MINMAPGUMP_SCALE];
-
-	uint32              sampleAtPoint(int x, int y, CurrentMap *map);
+	byte _texBuffer[(MAP_NUM_CHUNKS * MINMAPGUMP_SCALE) * (MAP_NUM_CHUNKS * MINMAPGUMP_SCALE) * 4];
 
+	uint32 getPixelAt(int x, int y);
+	void setPixelAt(int x, int y, uint32 pixel);
+	uint32 sampleAtPoint(int x, int y, CurrentMap *map);
 public:
 	ENABLE_RUNTIME_CLASSTYPE()
 


Commit: dbec7774b2ee99dad7567696ffff6461c66db8f3
    https://github.com/scummvm/scummvm/commit/dbec7774b2ee99dad7567696ffff6461c66db8f3
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2020-02-29T11:47:05-08:00

Commit Message:
ULTIMA8: Cleanup of minimap gump code

Changed paths:
    engines/ultima/ultima8/gumps/minimap_gump.cpp


diff --git a/engines/ultima/ultima8/gumps/minimap_gump.cpp b/engines/ultima/ultima8/gumps/minimap_gump.cpp
index 6e8e6db24f..4d269af383 100644
--- a/engines/ultima/ultima8/gumps/minimap_gump.cpp
+++ b/engines/ultima/ultima8/gumps/minimap_gump.cpp
@@ -38,8 +38,8 @@ namespace Ultima8 {
 
 DEFINE_RUNTIME_CLASSTYPE_CODE(MiniMapGump, Gump)
 
-MiniMapGump::MiniMapGump(int x_, int y_) :
-	Gump(x_, y_, MAP_NUM_CHUNKS * 2 + 2, MAP_NUM_CHUNKS * 2 + 2, 0,
+MiniMapGump::MiniMapGump(int x, int y) :
+	Gump(x, y, MAP_NUM_CHUNKS * 2 + 2, MAP_NUM_CHUNKS * 2 + 2, 0,
 	     FLAG_DRAGGABLE, LAYER_NORMAL), _minimap(), _lastMapNum(0) {
 	_minimap._format = TEX_FMT_NATIVE;
 	_minimap._width = _minimap._height = MAP_NUM_CHUNKS * MINMAPGUMP_SCALE;
@@ -143,25 +143,28 @@ void MiniMapGump::PaintThis(RenderSurface *surf, int32 lerp_factor, bool scaled)
 	surf->Fill32(0xFFFFFF00, 1 + ax + 0, 1 + ay + 1, 1, 2);
 }
 
-uint32 MiniMapGump::sampleAtPoint(int x_, int y_, CurrentMap *currentmap) {
-	Item *item = currentmap->traceTopItem(x_, y_, 1 << 15, -1, 0, ShapeInfo::SI_ROOF | ShapeInfo::SI_OCCL | ShapeInfo::SI_LAND | ShapeInfo::SI_SEA);
+uint32 MiniMapGump::sampleAtPoint(int x, int y, CurrentMap *currentmap) {
+	Item *item = currentmap->traceTopItem(x, y, 1 << 15, -1, 0, ShapeInfo::SI_ROOF | ShapeInfo::SI_OCCL | ShapeInfo::SI_LAND | ShapeInfo::SI_SEA);
 
 	if (item) {
 		int32 ix, iy, iz, idx, idy, idz;
 		item->getLocation(ix, iy, iz);
 		item->getFootpadWorld(idx, idy, idz);
 
-		ix -= x_;
-		iy -= y_;
+		ix -= x;
+		iy -= y;
 
 		Shape *sh = item->getShapeObject();
-		if (!sh) return 0;
+		if (!sh)
+			return 0;
 
 		ShapeFrame *frame = sh->getFrame(item->getFrame());
-		if (!frame) return 0;
+		if (!frame)
+			return 0;
 
 		const Palette *pal = sh->getPalette();
-		if (!pal) return 0;
+		if (!pal)
+			return 0;
 
 		// Screenspace bounding box bottom x_ coord (RNB x_ coord)
 		int sx = (ix - iy) / 4;
@@ -174,7 +177,7 @@ uint32 MiniMapGump::sampleAtPoint(int x_, int y_, CurrentMap *currentmap) {
 			for (int i = 0; i < 2; i++) {
 				if (!frame->hasPoint(i - sx, j - sy)) continue;
 
-				uint16 r2, g2, b2;
+				byte r2, g2, b2;
 				UNPACK_RGB8(pal->_native_untransformed[frame->getPixelAtPoint(i - sx, j - sy)], r2, g2, b2);
 				r += RenderSurface::_gamma22toGamma10[r2];
 				g += RenderSurface::_gamma22toGamma10[g2];
@@ -186,8 +189,7 @@ uint32 MiniMapGump::sampleAtPoint(int x_, int y_, CurrentMap *currentmap) {
 		if (!c)
 			return 0;
 
-		uint32 v = PACK_RGB8(RenderSurface::_gamma10toGamma22[r / c], RenderSurface::_gamma10toGamma22[g / c], RenderSurface::_gamma10toGamma22[b / c]);
-		return v;
+		return PACK_RGB8(RenderSurface::_gamma10toGamma22[r / c], RenderSurface::_gamma10toGamma22[g / c], RenderSurface::_gamma10toGamma22[b / c]);
 	} else {
 		return 0;
 	}
@@ -198,7 +200,8 @@ void MiniMapGump::saveData(ODataSource *ods) {
 }
 
 bool MiniMapGump::loadData(IDataSource *ids, uint32 version) {
-	if (!Gump::loadData(ids, version)) return false;
+	if (!Gump::loadData(ids, version))
+		return false;
 
 	_lastMapNum = 0;
 	_minimap._format = TEX_FMT_NATIVE;




More information about the Scummvm-git-logs mailing list