[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