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

neuromancer noreply at scummvm.org
Thu May 18 09:26:58 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:
ec0d13ca5c FREESCAPE: improved rendering and scaling of group objects
d9239c34b8 FREESCAPE: adjust aabb tolerance for castle
a93f02e33a FREESCAPE: improved rendering of group animations


Commit: ec0d13ca5c5171d174e42250181455a12321b206
    https://github.com/scummvm/scummvm/commit/ec0d13ca5c5171d174e42250181455a12321b206
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-05-18T11:28:43+02:00

Commit Message:
FREESCAPE: improved rendering and scaling of group objects

Changed paths:
    engines/freescape/area.cpp
    engines/freescape/area.h
    engines/freescape/freescape.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp
    engines/freescape/movement.cpp
    engines/freescape/objects/group.cpp
    engines/freescape/objects/group.h
    engines/freescape/objects/object.h


diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index e1c20299fb1..13476d5e599 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -222,21 +222,24 @@ void Area::resetArea() {
 }
 
 
-void Area::draw(Freescape::Renderer *gfx) {
+void Area::draw(Freescape::Renderer *gfx, uint32 ticks) {
 	assert(_drawableObjects.size() > 0);
 	for (auto &obj : _drawableObjects) {
 		if (!obj->isDestroyed() && !obj->isInvisible()) {
 			if (obj->getType() != ObjectType::kGroupType)
 				obj->draw(gfx);
 			else
-				drawGroup(gfx, (Group *)obj);
+				drawGroup(gfx, (Group *)obj, ticks);
 		}
 	}
 }
 
-void Area::drawGroup(Freescape::Renderer *gfx, Group* group) {
-	for (auto &obj : group->_objects) {
-		obj->draw(gfx);
+void Area::drawGroup(Freescape::Renderer *gfx, Group* group, uint32 ticks) {
+	uint32 groupSize = group->_objects.size();
+	for (uint32 i = 0; i < groupSize ; i++) {
+		if ((ticks / 10) % (groupSize + 1) == i) {
+			group->_objects[i]->draw(gfx);
+		}
 	}
 }
 
diff --git a/engines/freescape/area.h b/engines/freescape/area.h
index 7b149696e2e..d887065f651 100644
--- a/engines/freescape/area.h
+++ b/engines/freescape/area.h
@@ -51,8 +51,8 @@ public:
 	uint8 getScale();
 	void remapColor(int index, int color);
 	void unremapColor(int index);
-	void draw(Renderer *gfx);
-	void drawGroup(Renderer *gfx, Group *group);
+	void draw(Renderer *gfx, uint32 ticks);
+	void drawGroup(Renderer *gfx, Group *group, uint32 ticks);
 	void show();
 
 	Object *shootRay(const Math::Ray &ray);
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index 587c9d6e500..f985adefcf8 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -288,7 +288,7 @@ void FreescapeEngine::drawFrame() {
 	}
 
 	drawBackground();
-	_currentArea->draw(_gfx);
+	_currentArea->draw(_gfx, _ticks);
 
 	if (_underFireFrames > 0) {
 		for (auto &it : _sensors) {
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index e5c15fc76ca..c99ff34eafd 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -498,14 +498,14 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
 		debugC(1, kFreescapeDebugParser, "Reading object: %d", object);
 		Object *newObject = load8bitObject(file);
 
-		if (newObject->getType() == ObjectType::kGroupType) {
-			Group *group = (Group *)newObject;
-			for (ObjectMap::iterator it = objectsByID->begin(); it != objectsByID->end(); ++it)
-				group->assemble(it->_value);
-		}
-
 		if (newObject) {
 			newObject->scale(scale);
+			if (newObject->getType() == ObjectType::kGroupType) {
+				Group *group = (Group *)newObject;
+				for (ObjectMap::iterator it = objectsByID->begin(); it != objectsByID->end(); ++it)
+					group->assemble(it->_value);
+			}
+
 			if (newObject->getType() == kEntranceType) {
 				if (entrancesByID->contains(newObject->getObjectID() & 0x7fff))
 					error("WARNING: replacing object id %d (%d)", newObject->getObjectID(), newObject->getObjectID() & 0x7fff);
diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index c297bdb8d46..40086e378a2 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -326,6 +326,11 @@ void FreescapeEngine::move(CameraMovement direction, uint8 scale, float deltaTim
 }
 
 void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
+	if (_noClipMode) {
+		_position = position;
+		return;
+	}
+
 	Math::Vector3d newPosition = position;
 	Math::Vector3d lastPosition = _lastPosition;
 
@@ -373,9 +378,6 @@ void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
 }
 
 void FreescapeEngine::runCollisionConditions(Math::Vector3d const lastPosition, Math::Vector3d const newPosition) {
-	if (_noClipMode)
-		return;
-
 	// We need to make sure the bounding box touches the floor so we will expand it and run the collision checking
 	uint tolerance = 3;
 	Math::Vector3d v(newPosition.x() - 1, newPosition.y() - _playerHeight - tolerance, newPosition.z() - 1);
diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index b080641418a..434a648b0d9 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -27,14 +27,13 @@ namespace Freescape {
 Group::Group(uint16 objectID_, uint16 flags_, const Common::Array<byte> data_) {
 	_objectID = objectID_;
 	_flags = flags_;
+	_scale = 0;
 
 	int i;
 	for (i = 0; i < 9; i++) {
 		debugC(1, kFreescapeDebugParser, "group data[%d] = %d", i, data_[i]);
 		if (data_[i] > 0)
 			_objectIds.push_back(data_[i]);
-		/*else
-			break;*/
 	}
 	i = 9;
 	while (i < int(data_.size())) {
@@ -47,9 +46,9 @@ Group::Group(uint16 objectID_, uint16 flags_, const Common::Array<byte> data_) {
 		//assert(data_[i] < _objectIds.size());
 		_objectIndices.push_back(data_[i]);
 
-		debug("data[%d] = %d", i + 1, data_[i + 1]);
-		debug("data[%d] = %d", i + 2, data_[i + 2]);
-		debug("data[%d] = %d", i + 3, data_[i + 3]);
+		debugC(1, kFreescapeDebugParser, "group data[%d] = %d", i + 1, data_[i + 1]);
+		debugC(1, kFreescapeDebugParser, "group data[%d] = %d", i + 2, data_[i + 2]);
+		debugC(1, kFreescapeDebugParser, "group data[%d] = %d", i + 3, data_[i + 3]);
 		Math::Vector3d position(data_[i + 1], data_[i + 2], data_[i + 3]);
 		_objectPositions.push_back(position);
 
@@ -59,8 +58,7 @@ Group::Group(uint16 objectID_, uint16 flags_, const Common::Array<byte> data_) {
 	if (isDestroyed()) // If the object is destroyed, restore it
 		restore();
 
-	_flags = _flags & ~0x80;
-	assert(!isInitiallyInvisible());
+	makeInitiallyVisible();
 	makeVisible();
 }
 
@@ -80,11 +78,18 @@ void Group::assemble(Object *obj) {
 		int index = _objectIndices[i];
 		if (index == objectIndex) {
 			Object *duplicate = obj->duplicate();
+			assert(_scale > 0);
 			Math::Vector3d position = _objectPositions[i];
+
+			if (!GeometricObject::isPolygon(obj->getType()))
+				position = 32 * position / _scale;
+
 			duplicate->setOrigin(position);
+			assert(!duplicate->isDestroyed());
 			_objects[i] = duplicate;
 		}
 	}
+	obj->makeInitiallyInvisible();
 }
 
 } // End of namespace Freescape
\ No newline at end of file
diff --git a/engines/freescape/objects/group.h b/engines/freescape/objects/group.h
index 270485e276b..41ca55d527f 100644
--- a/engines/freescape/objects/group.h
+++ b/engines/freescape/objects/group.h
@@ -35,11 +35,12 @@ public:
 	Common::Array<Math::Vector3d> _objectPositions;
 	Common::Array<int16> _objectIndices;
 	Common::Array<int16> _objectIds;
+	int _scale;
 
 	ObjectType getType() override { return ObjectType::kGroupType; };
 	bool isDrawable() override { return true; }
 	void draw(Freescape::Renderer *gfx) override { error("cannot render Group"); };
-	void scale(int factor) override { warning("cannot scale Group"); };
+	void scale(int scale_) override { _scale = scale_; };
 	Object *duplicate() override { error("cannot duplicate Group"); };
 };
 
diff --git a/engines/freescape/objects/object.h b/engines/freescape/objects/object.h
index a21b844b28a..b03de78a649 100644
--- a/engines/freescape/objects/object.h
+++ b/engines/freescape/objects/object.h
@@ -71,6 +71,8 @@ public:
 	void makeInvisible() { _flags = _flags | 0x40; }
 	void makeVisible() { _flags = _flags & ~0x40; }
 	bool isInitiallyInvisible() { return _flags & 0x80; }
+	void makeInitiallyInvisible() { _flags = _flags | 0x80; }
+	void makeInitiallyVisible() { _flags = _flags & ~0x80; }
 	bool isDestroyed() { return _flags & 0x20; }
 	void destroy() { _flags = _flags | 0x20; }
 	void restore() { _flags = _flags & ~0x20; }


Commit: d9239c34b80221d4a02cad8af7e5afa91d06e0d7
    https://github.com/scummvm/scummvm/commit/d9239c34b80221d4a02cad8af7e5afa91d06e0d7
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-05-18T11:28:43+02:00

Commit Message:
FREESCAPE: adjust aabb tolerance for castle

Changed paths:
    engines/freescape/movement.cpp


diff --git a/engines/freescape/movement.cpp b/engines/freescape/movement.cpp
index 40086e378a2..ed0564cb815 100644
--- a/engines/freescape/movement.cpp
+++ b/engines/freescape/movement.cpp
@@ -379,7 +379,7 @@ void FreescapeEngine::resolveCollisions(Math::Vector3d const position) {
 
 void FreescapeEngine::runCollisionConditions(Math::Vector3d const lastPosition, Math::Vector3d const newPosition) {
 	// We need to make sure the bounding box touches the floor so we will expand it and run the collision checking
-	uint tolerance = 3;
+	uint tolerance = isCastle() ? 1 : 3;
 	Math::Vector3d v(newPosition.x() - 1, newPosition.y() - _playerHeight - tolerance, newPosition.z() - 1);
 	Math::AABB boundingBox(lastPosition, lastPosition);
 	boundingBox.expand(v);


Commit: a93f02e33a30d69c04bb40eb78c419b558486127
    https://github.com/scummvm/scummvm/commit/a93f02e33a30d69c04bb40eb78c419b558486127
Author: neuromancer (gustavo.grieco at gmail.com)
Date: 2023-05-18T11:28:43+02:00

Commit Message:
FREESCAPE: improved rendering of group animations

Changed paths:
    engines/freescape/area.cpp
    engines/freescape/loaders/8bitBinaryLoader.cpp
    engines/freescape/objects/group.cpp
    engines/freescape/objects/group.h


diff --git a/engines/freescape/area.cpp b/engines/freescape/area.cpp
index 13476d5e599..4bfacfbb996 100644
--- a/engines/freescape/area.cpp
+++ b/engines/freescape/area.cpp
@@ -236,10 +236,10 @@ void Area::draw(Freescape::Renderer *gfx, uint32 ticks) {
 
 void Area::drawGroup(Freescape::Renderer *gfx, Group* group, uint32 ticks) {
 	uint32 groupSize = group->_objects.size();
+	uint32 frameSize = group->_objectPositions.size();
 	for (uint32 i = 0; i < groupSize ; i++) {
-		if ((ticks / 10) % (groupSize + 1) == i) {
-			group->_objects[i]->draw(gfx);
-		}
+		group->assemble((ticks / 10) % frameSize, i);
+		group->_objects[i]->draw(gfx);
 	}
 }
 
diff --git a/engines/freescape/loaders/8bitBinaryLoader.cpp b/engines/freescape/loaders/8bitBinaryLoader.cpp
index c99ff34eafd..a6289e30f35 100644
--- a/engines/freescape/loaders/8bitBinaryLoader.cpp
+++ b/engines/freescape/loaders/8bitBinaryLoader.cpp
@@ -503,7 +503,7 @@ Area *FreescapeEngine::load8bitArea(Common::SeekableReadStream *file, uint16 nco
 			if (newObject->getType() == ObjectType::kGroupType) {
 				Group *group = (Group *)newObject;
 				for (ObjectMap::iterator it = objectsByID->begin(); it != objectsByID->end(); ++it)
-					group->assemble(it->_value);
+					group->linkObject(it->_value);
 			}
 
 			if (newObject->getType() == kEntranceType) {
diff --git a/engines/freescape/objects/group.cpp b/engines/freescape/objects/group.cpp
index 434a648b0d9..a097259e301 100644
--- a/engines/freescape/objects/group.cpp
+++ b/engines/freescape/objects/group.cpp
@@ -36,14 +36,8 @@ Group::Group(uint16 objectID_, uint16 flags_, const Common::Array<byte> data_) {
 			_objectIds.push_back(data_[i]);
 	}
 	i = 9;
-	while (i < int(data_.size())) {
-		debugC(1, kFreescapeDebugParser, "group data[%d] = %d", i, data_[i]);
-
-		if (data_[i] >= _objectIds.size())
-			break;
-
-		_objects.push_back(nullptr);
-		//assert(data_[i] < _objectIds.size());
+	while (i < int(data_.size() - 4)) {
+		debugC(1, kFreescapeDebugParser, "group data[%d] = %d (index)	", i, data_[i]);
 		_objectIndices.push_back(data_[i]);
 
 		debugC(1, kFreescapeDebugParser, "group data[%d] = %d", i + 1, data_[i + 1]);
@@ -62,7 +56,7 @@ Group::Group(uint16 objectID_, uint16 flags_, const Common::Array<byte> data_) {
 	makeVisible();
 }
 
-void Group::assemble(Object *obj) {
+void Group::linkObject(Object *obj) {
 	int objectIndex = -1;
 	for (int i = 0; i < int(_objectIds.size()) ; i++) {
 		if (_objectIds[i] == obj->getObjectID()) {
@@ -74,22 +68,20 @@ void Group::assemble(Object *obj) {
 	if (objectIndex == -1)
 		return;
 
-	for (int i = 0; i < int(_objectIndices.size()) ; i++) {
-		int index = _objectIndices[i];
-		if (index == objectIndex) {
-			Object *duplicate = obj->duplicate();
-			assert(_scale > 0);
-			Math::Vector3d position = _objectPositions[i];
+	obj->makeInitiallyVisible();
+	obj->makeVisible();
+	_objects.push_back(obj);
+}
 
-			if (!GeometricObject::isPolygon(obj->getType()))
-				position = 32 * position / _scale;
+void Group::assemble(int frame, int index) {
+	Object *obj = _objects[index];
+	Math::Vector3d position = _objectPositions[frame];
 
-			duplicate->setOrigin(position);
-			assert(!duplicate->isDestroyed());
-			_objects[i] = duplicate;
-		}
-	}
-	obj->makeInitiallyInvisible();
-}
+	if (!GeometricObject::isPolygon(obj->getType()))
+		position = 32 * position / _scale;
+	else
+		position = position / _scale;
 
+	obj->setOrigin(position);
+}
 } // End of namespace Freescape
\ No newline at end of file
diff --git a/engines/freescape/objects/group.h b/engines/freescape/objects/group.h
index 41ca55d527f..09aad72adbd 100644
--- a/engines/freescape/objects/group.h
+++ b/engines/freescape/objects/group.h
@@ -29,7 +29,8 @@ namespace Freescape {
 class Group : public Object {
 public:
 	Group(uint16 objectID_, uint16 flags_, const Common::Array<byte> data_);
-	void assemble(Object *obj);
+	void linkObject(Object *obj);
+	void assemble(int frame, int index);
 
 	Common::Array<Object *> _objects;
 	Common::Array<Math::Vector3d> _objectPositions;




More information about the Scummvm-git-logs mailing list