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

OMGPizzaGuy noreply at scummvm.org
Wed Feb 15 00:26:06 UTC 2023


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

Summary:
5e78e16da6 ULTIMA8: Fix overlap comparison of items during paint debugging
1c159c0c59 ULTIMA8: Change sort item constructor to not include next pointer
d5b7ac031d ULTIMA8: Fix sort item shape screenspace calculation for flipped items.


Commit: 5e78e16da63b518ab5cd4bf5db7f7a066507ef84
    https://github.com/scummvm/scummvm/commit/5e78e16da63b518ab5cd4bf5db7f7a066507ef84
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2023-02-14T18:25:45-06:00

Commit Message:
ULTIMA8: Fix overlap comparison of items during paint debugging

Changed paths:
    engines/ultima/ultima8/world/item_sorter.cpp


diff --git a/engines/ultima/ultima8/world/item_sorter.cpp b/engines/ultima/ultima8/world/item_sorter.cpp
index fc17b05a2ce..44736ff8ced 100644
--- a/engines/ultima/ultima8/world/item_sorter.cpp
+++ b/engines/ultima/ultima8/world/item_sorter.cpp
@@ -347,7 +347,7 @@ bool ItemSorter::PaintSortItem(RenderSurface *surf, SortItem *si) {
 			_sortLimitChanged = false;
 
 			debugC(kDebugObject, "SortItem: %s", si->dumpInfo().c_str());
-			if (_painted && si->overlap(_painted)) {
+			if (_painted && si->overlap(*_painted)) {
 				debugC(kDebugObject, "Overlaps: %s", _painted->dumpInfo().c_str());
 			}
 		}


Commit: 1c159c0c5956d4a49e23e7b9be3e65dc8c2614a6
    https://github.com/scummvm/scummvm/commit/1c159c0c5956d4a49e23e7b9be3e65dc8c2614a6
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2023-02-14T18:25:45-06:00

Commit Message:
ULTIMA8: Change sort item constructor to not include next pointer

Changed paths:
    engines/ultima/ultima8/world/item_sorter.cpp
    engines/ultima/ultima8/world/sort_item.h
    test/engines/ultima/ultima8/world/sort_item.h


diff --git a/engines/ultima/ultima8/world/item_sorter.cpp b/engines/ultima/ultima8/world/item_sorter.cpp
index 44736ff8ced..03e5c8d3fd8 100644
--- a/engines/ultima/ultima8/world/item_sorter.cpp
+++ b/engines/ultima/ultima8/world/item_sorter.cpp
@@ -46,7 +46,11 @@ ItemSorter::ItemSorter(int capacity) :
 	_itemsUnused(nullptr), _painted(nullptr), _camSx(0), _camSy(0),
 	_sortLimit(0), _sortLimitChanged(false) {
 	int i = capacity;
-	while (i--) _itemsUnused = new SortItem(_itemsUnused);
+	while (i--) {
+		SortItem *next = _itemsUnused;
+		_itemsUnused = new SortItem();
+		_itemsUnused->_next = next;
+	}
 }
 
 ItemSorter::~ItemSorter() {
@@ -59,9 +63,9 @@ ItemSorter::~ItemSorter() {
 	_itemsTail = nullptr;
 
 	while (_itemsUnused) {
-		SortItem *_next = _itemsUnused->_next;
+		SortItem *next = _itemsUnused->_next;
 		delete _itemsUnused;
-		_itemsUnused = _next;
+		_itemsUnused = next;
 	}
 
 	delete [] _items;
@@ -101,7 +105,7 @@ void ItemSorter::AddItem(int32 x, int32 y, int32 z, uint32 shapeNum, uint32 fram
 
 	// First thing, get a SortItem to use (first of unused)
 	if (!_itemsUnused)
-		_itemsUnused = new SortItem(nullptr);
+		_itemsUnused = new SortItem();
 	SortItem *si = _itemsUnused;
 
 	si->_itemNum = itemNum;
diff --git a/engines/ultima/ultima8/world/sort_item.h b/engines/ultima/ultima8/world/sort_item.h
index 10c4b5023b1..5c21733e0ce 100644
--- a/engines/ultima/ultima8/world/sort_item.h
+++ b/engines/ultima/ultima8/world/sort_item.h
@@ -39,7 +39,7 @@ class Shape;
  * Other code should have no reason to include it.
  */
 struct SortItem {
-	SortItem(SortItem *n) : _next(n), _prev(nullptr), _itemNum(0),
+	SortItem() : _next(nullptr), _prev(nullptr), _itemNum(0),
 			_shape(nullptr), _order(-1), _depends(), _shapeNum(0),
 			_frame(0), _flags(0), _extFlags(0), _sr(),
 			_x(0), _y(0), _z(0), _xLeft(0),
diff --git a/test/engines/ultima/ultima8/world/sort_item.h b/test/engines/ultima/ultima8/world/sort_item.h
index b7361a520d4..891e681577d 100644
--- a/test/engines/ultima/ultima8/world/sort_item.h
+++ b/test/engines/ultima/ultima8/world/sort_item.h
@@ -14,8 +14,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 
 	/* Non-overlapping with lower Y position should always be below */
 	void test_basic_y_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(0, 10, 0, 10, 10, 0);
 		Ultima::Ultima8::Box b2(0, 30, 0, 10, 10, 0);
@@ -28,8 +28,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 
 	/* Non-overlapping with lower X position should always be below */
 	void test_basic_x_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(10, 0, 0, 10, 10, 0);
 		Ultima::Ultima8::Box b2(30, 0, 0, 10, 10, 0);
@@ -42,8 +42,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 
 	/* Non-overlapping with lower Z position should always be below */
 	void test_basic_z_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(10, 10, 0, 10, 10, 10);
 		Ultima::Ultima8::Box b2(10, 10, 20, 10, 10, 10);
@@ -56,8 +56,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 
 	/* Sprites should always be at the top regardless of x/y/z */
 	void test_sprite_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(59454, 49246, 80, 32, 160, 16);
 		Ultima::Ultima8::Box b2(59440, 49144, 63, 32, 32, 63);
@@ -80,8 +80,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * Test case for keycard rendering issue at MainActor::teleport 9 34174 41502 0
 	 */
 	void test_inv_item_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(34142, 41150, 0, 256, 64, 8);
 		si1.setBoxBounds(b1, 0, 0);
@@ -102,8 +102,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 
 	/* Overlapping flat items (generally the floor) follow a set of rules */
 	void test_flat_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(0, 0, 0, 10, 10, 0);
 		Ultima::Ultima8::Box b2(0, 0, 0, 10, 10, 0);
@@ -158,8 +158,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 
 	/* Overlapping non-flat items also follow a set of rules */
 	void test_non_flat_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		// Land always gets drawn below
 		// MainActor::teleport 6 7642 19776 48
@@ -183,8 +183,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * Wall with window should render after non-window wall
 	 */
 	void test_nonflat_tranparent_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(17407, 16127, 48, 32, 96, 40);
 		si1.setBoxBounds(b1, 0, 0);
@@ -205,8 +205,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * Test case for rendering issue at MainActor::teleport 41 20063 13887 48
 	 */
 	void test_y_flat_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(64, 0, 16, 64, 0, 16);
 		si1.setBoxBounds(b1, 0, 0);
@@ -225,8 +225,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * Test case for rendering issue at MainActor::teleport 41 20583 10083 48
 	 */
 	void test_y_flat_intersect_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(20479, 9887, 48, 64, 128, 40);
 		si1.setBoxBounds(b1, 0, 0);
@@ -249,8 +249,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * Test case for rendering issue at MainActor::teleport 6 7774 19876 48
 	 */
 	void test_nonflat_z_clear_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(129, 32, 0, 64, 64, 24);
 		si1.setBoxBounds(b1, 0, 0);
@@ -271,8 +271,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * This looks like a possible rendering test easter egg in the original game
 	 */
 	void test_anim_easter_egg() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(20735, 1919, 0, 64, 64, 16);
 		si1.setBoxBounds(b1, 0, 0);
@@ -292,8 +292,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * Test case for rendering armor of flames spell
 	 */
 	void test_armor_of_flames_sort() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(13655, 5111, 8, 64, 64, 16);
 		si1.setBoxBounds(b1, 0, 0);
@@ -310,8 +310,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 
 	/* Overlapping non-flat occludes flat */
 	void test_basic_occludes() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(0, 0, 0, 128, 128, 16);
 		Ultima::Ultima8::Box b2(0, 0, 0, 128, 128, 0);
@@ -327,8 +327,8 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	 * Test case for rendering issue at MainActor::teleport 49 19167 17582 48
 	 */
 	void test_frame_offset_occludes() {
-		Ultima::Ultima8::SortItem si1(nullptr);
-		Ultima::Ultima8::SortItem si2(nullptr);
+		Ultima::Ultima8::SortItem si1;
+		Ultima::Ultima8::SortItem si2;
 
 		Ultima::Ultima8::Box b1(0, 0, 0, 128, 128, 16);
 		Ultima::Ultima8::Box b2(0, 0, 0, 128, 128, 0);
@@ -352,7 +352,7 @@ class U8SortItemTestSuite : public CxxTest::TestSuite {
 	}
 
 	void test_basic_contains() {
-		Ultima::Ultima8::SortItem si1(nullptr);
+		Ultima::Ultima8::SortItem si1;
 
 		Ultima::Ultima8::Box b1(0, 0, 0, 128, 128, 16);
 		si1.setBoxBounds(b1, 0, 0);


Commit: d5b7ac031dde79f860bb13c829ccac6fdeabb3b6
    https://github.com/scummvm/scummvm/commit/d5b7ac031dde79f860bb13c829ccac6fdeabb3b6
Author: Matthew Jimenez (matthew.jimenez at outlook.com)
Date: 2023-02-14T18:25:45-06:00

Commit Message:
ULTIMA8: Fix sort item shape screenspace calculation for flipped items.

Changed paths:
    engines/ultima/ultima8/world/item_sorter.cpp


diff --git a/engines/ultima/ultima8/world/item_sorter.cpp b/engines/ultima/ultima8/world/item_sorter.cpp
index 03e5c8d3fd8..dae41148484 100644
--- a/engines/ultima/ultima8/world/item_sorter.cpp
+++ b/engines/ultima/ultima8/world/item_sorter.cpp
@@ -138,10 +138,17 @@ void ItemSorter::AddItem(int32 x, int32 y, int32 z, uint32 shapeNum, uint32 fram
 	si->setBoxBounds(box, _camSx, _camSy);
 
 	// Real Screenspace from shape frame
-	si->_sr.left = si->_sxBot - frame->_xoff;
-	si->_sr.top = si->_syBot - frame->_yoff;
-	si->_sr.right = si->_sr.left + frame->_width;
-	si->_sr.bottom = si->_sr.top + frame->_height;
+	if (si->_flags & Item::FLG_FLIPPED) {
+		si->_sr.left = si->_sxBot + frame->_xoff - frame->_width;
+		si->_sr.top = si->_syBot - frame->_yoff;
+		si->_sr.right = si->_sr.left + frame->_width;
+		si->_sr.bottom = si->_sr.top + frame->_height;
+	} else {
+		si->_sr.left = si->_sxBot - frame->_xoff;
+		si->_sr.top = si->_syBot - frame->_yoff;
+		si->_sr.right = si->_sr.left + frame->_width;
+		si->_sr.bottom = si->_sr.top + frame->_height;
+	}
 
 	// Do Clipping here
 	if (!_clipWindow.intersects(si->_sr)) {




More information about the Scummvm-git-logs mailing list