[Scummvm-git-logs] scummvm master -> 70b4b442e00ad28a4ab8557d31fdf9eec6a8b7d1
scemino
noreply at scummvm.org
Thu Mar 21 19:46:20 UTC 2024
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:
c40c59845f TWP: Don't allow to point object when over HUD
70b4b442e0 TWP: Add stats and fix performance issues
Commit: c40c59845f549581b33bf52a7b0cec1ac890fb58
https://github.com/scummvm/scummvm/commit/c40c59845f549581b33bf52a7b0cec1ac890fb58
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-21T20:46:10+01:00
Commit Message:
TWP: Don't allow to point object when over HUD
Changed paths:
engines/twp/hud.h
engines/twp/scenegraph.cpp
engines/twp/scenegraph.h
engines/twp/twp.cpp
diff --git a/engines/twp/hud.h b/engines/twp/hud.h
index 78508c0d327..4fd372bd8db 100644
--- a/engines/twp/hud.h
+++ b/engines/twp/hud.h
@@ -108,7 +108,7 @@ public:
void init();
ActorSlot *actorSlot(Common::SharedPtr<Object> actor);
- bool isOver() const { return _over; }
+ bool isOverVerbs() const { return _over; }
void update(float elapsed, Math::Vector2d pos, Common::SharedPtr<Object> hotspot, bool mouseClick);
void setVisible(bool visible) override;
diff --git a/engines/twp/scenegraph.cpp b/engines/twp/scenegraph.cpp
index dc8d517038d..559fbb9d668 100644
--- a/engines/twp/scenegraph.cpp
+++ b/engines/twp/scenegraph.cpp
@@ -698,6 +698,7 @@ void Inventory::update(float elapsed, Common::SharedPtr<Object> actor, Color bac
_obj = nullptr;
if (_actor) {
Math::Vector2d scrPos = g_twp->winToScreen(g_twp->_cursor.pos);
+ _over = scrPos.getY() < 180.f && scrPos.getX() > 704.f;
// update mouse click
bool down = g_twp->_cursor.leftDown;
diff --git a/engines/twp/scenegraph.h b/engines/twp/scenegraph.h
index 02e5fad842b..e43f5ebacb6 100644
--- a/engines/twp/scenegraph.h
+++ b/engines/twp/scenegraph.h
@@ -296,6 +296,7 @@ public:
Inventory();
void update(float elapsed, Common::SharedPtr<Object> actor = nullptr, Color backColor = Color(0, 0, 0), Color verbNormal = Color(0, 0, 0));
+ bool isOver() const { return _over; }
Common::SharedPtr<Object> getObject() const { return _obj; }
Math::Vector2d getPos(Common::SharedPtr<Object> inv) const;
@@ -322,6 +323,7 @@ private:
float _jiggleTime = 0.f;
float _fadeTime = 0.f;
bool _fadeIn = false;
+ bool _over = false;
};
class SentenceNode : public Node {
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index e2e14223dd1..45eec7f36bc 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -241,23 +241,21 @@ void TwpEngine::clickedAt(Math::Vector2d scrPos) {
if (_cursor.isLeftDown()) {
// button left: execute selected verb
bool handled = clickedAtHandled(roomPos);
- if (!handled && obj) {
+ if (!handled && obj && (!_hud->_active || _uiInv.isOver())) {
Verb vb = verb();
sqcall("onVerbClick");
handled = execSentence(nullptr, vb.id, _noun1, _noun2);
}
- if (!handled && !_hud->_active) {
- if (_actor && (scrPos.getY() > 172)) {
- // Just clicking on the ground
- cancelSentence(_actor);
- if (_actor->_room == _room)
- Object::walk(_actor, roomPos);
- _hud->_verb = _hud->actorSlot(_actor)->verbs[0];
- _holdToMove = true;
- }
+ if (!handled && !_hud->_active && _actor && (!_hud->_active || _uiInv.isOver())) {
+ // Just clicking on the ground
+ cancelSentence(_actor);
+ if (_actor->_room == _room)
+ Object::walk(_actor, roomPos);
+ _hud->_verb = _hud->actorSlot(_actor)->verbs[0];
+ _holdToMove = true;
}
- } else if (_cursor.isRightDown()) {
+ } else if (_cursor.isRightDown() && (!_hud->_active || _uiInv.isOver())) {
// button right: execute default verb
if (obj) {
VerbId verb;
@@ -280,30 +278,31 @@ Verb TwpEngine::verb() {
Common::String TwpEngine::cursorText() {
Common::String result;
- if (_dialog->getState() == DialogState::None && _inputState.getInputActive()) {
- if (_hud->isVisible() && _hud->_over) {
- return _hud->_verb.id.id > 1 ? _textDb->getText(verb().text) : "";
- }
-
- // give can be used only on inventory and talkto to talkable objects (actors)
- result = !_noun1 || (_hud->_verb.id.id == VERB_GIVE && !_noun1->inInventory()) || (_hud->_verb.id.id == VERB_TALKTO && !(_noun1->getFlags() & TALKABLE)) ? "" : _textDb->getText(_noun1->getName());
-
- // add verb if not walk to or if noun1 is present
- if ((_hud->_verb.id.id > 1) || (result.size() > 0)) {
- // if inventory, use default verb instead of walkto
- Common::String verbText = verb().text;
- result = result.size() > 0 ? Common::String::format("%s %s", _textDb->getText(verbText).c_str(), result.c_str()) : _textDb->getText(verbText);
- if (_useFlag == UseFlag::ufUseWith)
- result += " " + _textDb->getText(10000);
- else if (_useFlag == UseFlag::ufUseOn)
- result += " " + _textDb->getText(10001);
- else if (_useFlag == UseFlag::ufUseIn)
- result += " " + _textDb->getText(10002);
- else if (_useFlag == UseFlag::ufGiveTo)
- result += " " + _textDb->getText(10003);
- if (_noun2)
- result += " " + _textDb->getText(_noun2->getName());
- }
+ if (_dialog->getState() != DialogState::None || !_inputState.getInputActive())
+ return result;
+
+ if (_hud->_active && !_uiInv.isOver()) {
+ return _hud->_verb.id.id > 1 ? _textDb->getText(verb().text) : "";
+ }
+
+ // give can be used only on inventory and talkto to talkable objects (actors)
+ result = !_noun1 || (_hud->_verb.id.id == VERB_GIVE && !_noun1->inInventory()) || (_hud->_verb.id.id == VERB_TALKTO && !(_noun1->getFlags() & TALKABLE)) ? "" : _textDb->getText(_noun1->getName());
+
+ // add verb if not walk to or if noun1 is present
+ if ((_hud->_verb.id.id > 1) || (result.size() > 0)) {
+ // if inventory, use default verb instead of walkto
+ Common::String verbText = verb().text;
+ result = result.size() > 0 ? Common::String::format("%s %s", _textDb->getText(verbText).c_str(), result.c_str()) : _textDb->getText(verbText);
+ if (_useFlag == UseFlag::ufUseWith)
+ result += " " + _textDb->getText(10000);
+ else if (_useFlag == UseFlag::ufUseOn)
+ result += " " + _textDb->getText(10001);
+ else if (_useFlag == UseFlag::ufUseIn)
+ result += " " + _textDb->getText(10002);
+ else if (_useFlag == UseFlag::ufGiveTo)
+ result += " " + _textDb->getText(10003);
+ if (_noun2)
+ result += " " + _textDb->getText(_noun2->getName());
}
return result;
}
@@ -617,7 +616,7 @@ void TwpEngine::update(float elapsed) {
}
// update inventory
- const bool hudActive = (_room->_fullscreen == FULLSCREENROOM && (scrPos.getY() < 204.f));
+ const bool hudActive = (_room->_fullscreen == FULLSCREENROOM && (scrPos.getY() < 180.f));
_hud->_active = hudActive;
_uiInv._active = hudActive;
if (!_actor) {
Commit: 70b4b442e00ad28a4ab8557d31fdf9eec6a8b7d1
https://github.com/scummvm/scummvm/commit/70b4b442e00ad28a4ab8557d31fdf9eec6a8b7d1
Author: scemino (scemino74 at gmail.com)
Date: 2024-03-21T20:46:10+01:00
Commit Message:
TWP: Add stats and fix performance issues
Changed paths:
engines/twp/actorlib.cpp
engines/twp/debugtools.cpp
engines/twp/resmanager.h
engines/twp/room.cpp
engines/twp/squtil.cpp
engines/twp/thread.cpp
engines/twp/thread.h
engines/twp/twp.cpp
engines/twp/twp.h
diff --git a/engines/twp/actorlib.cpp b/engines/twp/actorlib.cpp
index 78ccc05250a..ca80ea3387b 100644
--- a/engines/twp/actorlib.cpp
+++ b/engines/twp/actorlib.cpp
@@ -795,7 +795,9 @@ static SQInteger createActor(HSQUIRRELVM v) {
sq_resetobject(&actor->_table);
sq_getstackobj(v, 2, &actor->_table);
sq_addref(vm, &actor->_table);
- setId(actor->_table, g_twp->_resManager->newActorId());
+ const int id = g_twp->_resManager->newActorId();
+ setId(actor->_table, id);
+ g_twp->_resManager->_allObjects[id] = actor;
Common::String key;
sqgetf(actor->_table, "_key", key);
diff --git a/engines/twp/debugtools.cpp b/engines/twp/debugtools.cpp
index 639750a4f41..b43e848362d 100644
--- a/engines/twp/debugtools.cpp
+++ b/engines/twp/debugtools.cpp
@@ -72,13 +72,14 @@ static void drawThreads() {
ImGui::Text("# threads: %u", threads.size());
ImGui::Separator();
- if (ImGui::BeginTable("Threads", 6, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg)) {
+ if (ImGui::BeginTable("Threads", 7, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit | ImGuiTableFlags_Resizable | ImGuiTableFlags_RowBg)) {
ImGui::TableSetupColumn("Id");
ImGui::TableSetupColumn("Name");
ImGui::TableSetupColumn("Type");
ImGui::TableSetupColumn("Func");
ImGui::TableSetupColumn("Src");
ImGui::TableSetupColumn("Line");
+ ImGui::TableSetupColumn("Upd. Time");
ImGui::TableHeadersRow();
if (g_twp->_cutscene) {
@@ -102,6 +103,8 @@ static void drawThreads() {
ImGui::TableNextColumn();
ImGui::TableNextColumn();
}
+ ImGui::TableNextColumn();
+ ImGui::Text("?");
}
for (const auto &thread : threads) {
@@ -124,6 +127,8 @@ static void drawThreads() {
ImGui::TableNextColumn();
ImGui::TableNextColumn();
}
+ ImGui::TableNextColumn();
+ ImGui::Text("%u", thread->_lastUpdateTime);
}
ImGui::EndTable();
}
@@ -557,6 +562,14 @@ static void drawGeneral() {
ImGui::Separator();
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
+ ImGui::Text("Draw time: %u ms", g_twp->_stats.drawTime);
+ ImGui::Text("Update time: %u ms", g_twp->_stats.totalUpdateTime);
+ ImGui::Text(" Update room time: %u ms", g_twp->_stats.updateRoomTime);
+ ImGui::Text(" Update tasks time: %u ms", g_twp->_stats.updateTasksTime);
+ ImGui::Text(" Update misc time: %u ms", g_twp->_stats.updateMiscTime);
+ ImGui::Text(" Update cutscene time: %u ms", g_twp->_stats.updateCutsceneTime);
+ ImGui::Text(" Update threads time: %u ms", g_twp->_stats.updateThreadsTime);
+ ImGui::Text(" Update callbacks time: %u ms", g_twp->_stats.updateCallbacksTime);
ImGui::End();
}
diff --git a/engines/twp/resmanager.h b/engines/twp/resmanager.h
index f26a8a1845f..3e4e2057f8f 100644
--- a/engines/twp/resmanager.h
+++ b/engines/twp/resmanager.h
@@ -29,6 +29,8 @@
namespace Twp {
+class Font;
+
class ResManager {
private:
enum {
@@ -86,6 +88,7 @@ public:
Common::HashMap<Common::String, Texture> _textures;
Common::HashMap<Common::String, SpriteSheet> _spriteSheets;
Common::HashMap<Common::String, Common::SharedPtr<Font> > _fonts;
+ Common::SharedPtr<Object> _allObjects[100000];
private:
int _roomId = START_ROOMID;
diff --git a/engines/twp/room.cpp b/engines/twp/room.cpp
index 14f8dadff45..b92a8f574e9 100644
--- a/engines/twp/room.cpp
+++ b/engines/twp/room.cpp
@@ -161,7 +161,9 @@ Common::SharedPtr<Object> Room::createObject(const Common::String &sheet, const
sq_pop(v, 1);
// assign an id
- setId(obj->_table, g_twp->_resManager->newObjId());
+ const int id = g_twp->_resManager->newObjId();
+ setId(obj->_table, id);
+ g_twp->_resManager->_allObjects[id] = obj;
Common::String name = frames.size() > 0 ? frames[0] : "noname";
sqsetf(obj->_table, "name", name);
obj->_key = name;
@@ -200,7 +202,9 @@ Common::SharedPtr<Object> Room::createTextObject(const Common::String &fontName,
sq_pop(v, 1);
// assign an id
- setId(obj->_table, g_twp->_resManager->newObjId());
+ const int id = g_twp->_resManager->newObjId();
+ setId(obj->_table, id);
+ g_twp->_resManager->_allObjects[id] = obj;
debugC(kDebugGame, "Create object with new table: %s #%d", obj->_name.c_str(), obj->getId());
obj->_name = Common::String::format("text#%d: %s", obj->getId(), text.c_str());
@@ -311,7 +315,9 @@ void Room::load(Common::SharedPtr<Room> room, Common::SeekableReadStream &s) {
for (auto it = jobjects.begin(); it != jobjects.end(); it++) {
const Common::JSONObject &jObject = (*it)->asObject();
Common::SharedPtr<Object> obj(new Object());
- Twp::setId(obj->_table, g_twp->_resManager->newObjId());
+ const int id = g_twp->_resManager->newObjId();
+ Twp::setId(obj->_table, id);
+ g_twp->_resManager->_allObjects[id] = obj;
obj->_key = jObject["name"]->asString();
obj->_node->setName(obj->_key.c_str());
obj->_node->setPos(Math::Vector2d(parseVec2(jObject["pos"]->asString())));
diff --git a/engines/twp/squtil.cpp b/engines/twp/squtil.cpp
index 77f0a17651e..e959028d57a 100644
--- a/engines/twp/squtil.cpp
+++ b/engines/twp/squtil.cpp
@@ -22,9 +22,9 @@
#include "twp/detection.h"
#include "twp/lighting.h"
#include "twp/object.h"
+#include "twp/resmanager.h"
#include "twp/room.h"
#include "twp/squtil.h"
-#include "twp/thread.h"
#include "twp/squirrel/squirrel.h"
#include "twp/squirrel/sqvm.h"
#include "twp/squirrel/sqstring.h"
@@ -33,6 +33,7 @@
#include "twp/squirrel/sqstdaux.h"
#include "twp/squirrel/sqfuncproto.h"
#include "twp/squirrel/sqclosure.h"
+#include "twp/thread.h"
namespace Twp {
@@ -275,24 +276,7 @@ Common::SharedPtr<Room> sqroom(HSQUIRRELVM v, int i) {
}
Common::SharedPtr<Object> sqobj(int id) {
- for (size_t i = 0; i < g_twp->_actors.size(); i++) {
- Common::SharedPtr<Object> actor = g_twp->_actors[i];
- if (getId(actor->_table) == id)
- return actor;
- }
-
- for (size_t i = 0; i < g_twp->_rooms.size(); i++) {
- Common::SharedPtr<Room> room = g_twp->_rooms[i];
- for (size_t j = 0; j < room->_layers.size(); j++) {
- Common::SharedPtr<Layer> layer = room->_layers[j];
- for (size_t k = 0; k < layer->_objects.size(); k++) {
- Common::SharedPtr<Object> obj = layer->_objects[k];
- if (getId(obj->_table) == id)
- return obj;
- }
- }
- }
- return nullptr;
+ return g_twp->_resManager->_allObjects[id];
}
Common::SharedPtr<Object> sqobj(HSQOBJECT table) {
diff --git a/engines/twp/thread.cpp b/engines/twp/thread.cpp
index 7b2bc9ce965..8636a9b0b15 100644
--- a/engines/twp/thread.cpp
+++ b/engines/twp/thread.cpp
@@ -97,6 +97,7 @@ bool Thread::call() {
}
bool Thread::update(float elapsed) {
+ uint32 startTime = g_system->getMillis();
if (_paused) {
} else if (_waitTime > 0) {
_waitTime -= elapsed;
@@ -111,6 +112,7 @@ bool Thread::update(float elapsed) {
resume();
}
}
+ _lastUpdateTime = g_system->getMillis() - startTime;
return isDead();
}
diff --git a/engines/twp/thread.h b/engines/twp/thread.h
index b305afb6ccc..c050529c69c 100644
--- a/engines/twp/thread.h
+++ b/engines/twp/thread.h
@@ -66,6 +66,7 @@ public:
int _numFrames = 0;
bool _paused = false;
bool _pauseable = false;
+ uint32 _lastUpdateTime = 0;
protected:
int _id = 0;
diff --git a/engines/twp/twp.cpp b/engines/twp/twp.cpp
index 45eec7f36bc..d208e10fcca 100644
--- a/engines/twp/twp.cpp
+++ b/engines/twp/twp.cpp
@@ -443,6 +443,7 @@ public:
};
void TwpEngine::update(float elapsed) {
+ const uint32 startUpdateTime = _system->getMillis();
_time += elapsed;
_frameCounter++;
@@ -551,6 +552,7 @@ void TwpEngine::update(float elapsed) {
// update actorswitcher
_actorSwitcher.update(actorSwitcherSlots(), elapsed);
+ const uint32 endMiscTime = _system->getMillis();
// update cutscene
if (_cutscene) {
@@ -558,6 +560,7 @@ void TwpEngine::update(float elapsed) {
_cutscene.reset();
}
}
+ const uint32 endUpdateCutsceneTime = _system->getMillis();
// update threads: make a copy of the threads because during threads update, new threads can be added
Common::Array<Common::SharedPtr<ThreadBase> > threads(_threads);
@@ -570,7 +573,6 @@ void TwpEngine::update(float elapsed) {
threadsToRemove.push_back(thread);
}
}
-
// remove threads that are terminated
for (auto it = threadsToRemove.begin(); it != threadsToRemove.end(); it++) {
Common::SharedPtr<ThreadBase> thread(*it);
@@ -579,6 +581,7 @@ void TwpEngine::update(float elapsed) {
_threads.remove_at(i);
}
}
+ const uint32 endUpdateThreadTime = _system->getMillis();
// update callbacks
for (auto it = _callbacks.begin(); it != _callbacks.end();) {
@@ -590,6 +593,7 @@ void TwpEngine::update(float elapsed) {
it++;
}
+ const uint32 endUpdateCallbacksTime = _system->getMillis();
// update tasks
Common::Array<Common::SharedPtr<Task> > tasks(_tasks);
Common::Array<Common::SharedPtr<Task> > tasksToRemove;
@@ -609,11 +613,13 @@ void TwpEngine::update(float elapsed) {
_tasks.remove_at(i);
}
}
+ const uint32 endUpdateTasksTimes = _system->getMillis();
// update objects
if (_room) {
_room->update(elapsed);
}
+ const uint32 endUpdateTimeRoom = _system->getMillis();
// update inventory
const bool hudActive = (_room->_fullscreen == FULLSCREENROOM && (scrPos.getY() < 180.f));
@@ -628,6 +634,14 @@ void TwpEngine::update(float elapsed) {
}
updateTriggers();
+ const uint32 endUpdateTime = _system->getMillis();
+ _stats.totalUpdateTime = endUpdateTime - startUpdateTime;
+ _stats.updateRoomTime = endUpdateTimeRoom - endUpdateTasksTimes;
+ _stats.updateTasksTime = endUpdateTasksTimes - endUpdateCallbacksTime;
+ _stats.updateMiscTime = endMiscTime - startUpdateTime;
+ _stats.updateCutsceneTime = endUpdateCutsceneTime - endMiscTime;
+ _stats.updateThreadsTime = endUpdateThreadTime - endUpdateCutsceneTime;
+ _stats.updateCallbacksTime = endUpdateCallbacksTime - endUpdateThreadTime;
}
void TwpEngine::setShaderEffect(RoomEffect effect) {
@@ -1011,7 +1025,9 @@ Common::Error TwpEngine::run() {
time = newTime;
update(_speed * delta / 1000.f);
+ const uint32 startDrawTime = _system->getMillis();
draw();
+ _stats.drawTime = _system->getMillis() - startDrawTime;
_cursor.update();
// Delay for a bit. All events loops should have a delay
@@ -1090,7 +1106,9 @@ static void onGetPairs(const Common::String &k, HSQOBJECT &oTable, void *data) {
if (!sqrawexists(oTable, "flags"))
sqsetf(oTable, "flags", 0);
Common::SharedPtr<Object> obj(new Object(oTable, k));
- setId(obj->_table, g_twp->_resManager->newObjId());
+ const int id = g_twp->_resManager->newObjId();
+ setId(obj->_table, id);
+ g_twp->_resManager->_allObjects[id] = obj;
obj->_node = Common::SharedPtr<Node>(new Node(k));
obj->_nodeAnim = Common::SharedPtr<Anim>(new Anim(obj.get()));
obj->_node->addChild(obj->_nodeAnim.get());
@@ -1112,7 +1130,9 @@ static void onGetPairs(const Common::String &k, HSQOBJECT &oTable, void *data) {
}
sqgetf(params->room->_table, k, obj->_table);
- setId(obj->_table, g_twp->_resManager->newObjId());
+ const int id = g_twp->_resManager->newObjId();
+ setId(obj->_table, id);
+ g_twp->_resManager->_allObjects[id] = obj;
debugC(kDebugGame, "Create object: %s #%d", k.c_str(), obj->getId());
// add it to the root table if not a pseudo room
@@ -1179,7 +1199,9 @@ Common::SharedPtr<Room> TwpEngine::defineRoom(const Common::String &name, HSQOBJ
sq_pop(v, 1);
// assign an id
- setId(obj->_table, g_twp->_resManager->newObjId());
+ const int id = _resManager->newObjId();
+ setId(obj->_table, id);
+ _resManager->_allObjects[id] = obj;
// info fmt"Create object with new table: {obj.name} #{obj.id}"
// adds the object to the room table
diff --git a/engines/twp/twp.h b/engines/twp/twp.h
index 0e2381e5b94..58426b5174b 100644
--- a/engines/twp/twp.h
+++ b/engines/twp/twp.h
@@ -232,6 +232,17 @@ public:
bool isLeftDown() { return !oldLeftDown && leftDown; }
bool isRightDown() { return !oldRightDown && rightDown; }
} _cursor;
+
+ struct Stats {
+ uint32 totalUpdateTime = 0;
+ uint32 updateRoomTime = 0;
+ uint32 updateTasksTime = 0;
+ uint32 updateMiscTime = 0;
+ uint32 updateCutsceneTime = 0;
+ uint32 updateThreadsTime = 0;
+ uint32 updateCallbacksTime = 0;
+ uint32 drawTime = 0;
+ } _stats;
unique_ptr<Hud> _hud;
Inventory _uiInv;
ActorSwitcher _actorSwitcher;
More information about the Scummvm-git-logs
mailing list