From cd74b32cad7cf66b4e11655b503bf95a7bcf0410 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Wed, 29 Jun 2022 19:24:53 +0200 Subject: [PATCH 01/32] separated character animations to upper/lower body. Instead of single animation channel, there are now 2. This commit should make it obvious how the data flow thru. The code which applies the animation to OGRE objects is now different - instead of looping through all anims and detecting which one we want to update, we kill all first and then re-enable what we want. Note that the upper/lower categories are informal, any anymation may control any part of the body, or whole. All existing anims are submitted as lowerbody, but upperbody would work just as well. --- source/main/gameplay/Character.cpp | 124 +++++++++++++--------- source/main/gameplay/Character.h | 34 ++++-- source/main/gameplay/CharacterFactory.cpp | 1 + 3 files changed, 100 insertions(+), 59 deletions(-) diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index 166599230d..b9b8a738a1 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -47,7 +47,8 @@ Character::Character(int source, unsigned int streamid, UTFString player_name, i , m_character_h_speed(2.0f) , m_character_v_speed(0.0f) , m_color_number(color_number) - , m_anim_time(0.f) + , m_anim_upper_time(0.f) + , m_anim_lower_time(0.f) , m_net_last_anim_time(0.f) , m_net_last_update_time(0.f) , m_net_username(player_name) @@ -56,7 +57,8 @@ Character::Character(int source, unsigned int streamid, UTFString player_name, i , m_stream_id(streamid) , m_gfx_character(nullptr) , m_driving_anim_length(0.f) - , m_anim_name("Idle_sway") + , m_anim_upper_name("") // unused + , m_anim_lower_name("Idle_sway") { static int id_counter = 0; m_instance_name = "Character" + TOSTRING(id_counter); @@ -100,17 +102,30 @@ void Character::setRotation(Radian rotation) m_character_rotation = rotation; } -void Character::SetAnimState(std::string mode, float time) +void Character::SetUpperAnimState(std::string mode, float time) { - if (m_anim_name != mode) + if (m_anim_upper_name != mode) { - m_anim_name = mode; - m_anim_time = time; + m_anim_upper_name = mode; + m_anim_upper_time = time; + } + else + { + m_anim_upper_time += time; + } +} + +void Character::SetLowerAnimState(std::string mode, float time) +{ + if (m_anim_lower_name != mode) + { + m_anim_lower_name = mode; + m_anim_lower_time = time; m_net_last_anim_time = 0.0f; } else { - m_anim_time += time; + m_anim_lower_time += time; } } @@ -260,7 +275,7 @@ void Character::update(float dt) setRotation(m_character_rotation + dt * 2.0f * scale * Radian(tmpJoy)); if (!isswimming && not_walking) { - this->SetAnimState("Turn", -dt); + this->SetLowerAnimState("TurnLeft", -dt); idleanim = false; } } @@ -272,7 +287,7 @@ void Character::update(float dt) setRotation(m_character_rotation - dt * scale * 2.0f * Radian(tmpJoy)); if (!isswimming && not_walking) { - this->SetAnimState("Turn", dt); + this->SetLowerAnimState("TurnRight", dt); idleanim = false; } } @@ -289,7 +304,7 @@ void Character::update(float dt) position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() - Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() - Math::HALF_PI)); if (!isswimming && not_walking) { - this->SetAnimState("Side_step", -dt); + this->SetLowerAnimState("Side_step", -dt); idleanim = false; } } @@ -303,7 +318,7 @@ void Character::update(float dt) position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() + Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() + Math::HALF_PI)); if (!isswimming && not_walking) { - this->SetAnimState("Side_step", dt); + this->SetLowerAnimState("Side_step", dt); idleanim = false; } } @@ -323,19 +338,19 @@ void Character::update(float dt) if (isswimming) { - this->SetAnimState("Swim_loop", time); + this->SetLowerAnimState("Swim_loop", time); idleanim = false; } else { if (tmpRun > 0.0f) { - this->SetAnimState("Run", time); + this->SetLowerAnimState("Run", time); idleanim = false; } else { - this->SetAnimState("Walk", time); + this->SetLowerAnimState("Walk", time); idleanim = false; } } @@ -346,12 +361,12 @@ void Character::update(float dt) float time = -dt * m_character_h_speed; if (isswimming) { - this->SetAnimState("Spot_swim", time); + this->SetLowerAnimState("Spot_swim", time); idleanim = false; } else { - this->SetAnimState("Walk", time); + this->SetLowerAnimState("Walk", time); idleanim = false; } position -= dt * m_character_h_speed * tmpBack * Vector3(cos(m_character_rotation.valueRadians()), 0.0f, sin(m_character_rotation.valueRadians())); @@ -361,11 +376,11 @@ void Character::update(float dt) { if (isswimming) { - this->SetAnimState("Spot_swim", dt * 2.0f); + this->SetLowerAnimState("Spot_swim", dt * 2.0f); } else { - this->SetAnimState("Idle_sway", dt * 1.0f); + this->SetLowerAnimState("Idle_sway", dt * 1.0f); } } @@ -385,8 +400,8 @@ void Character::update(float dt) { anim_time_pos = m_driving_anim_length - 0.01f; } - m_anim_name = "Driving"; - m_anim_time = anim_time_pos; + m_anim_lower_name = "Driving"; + m_anim_lower_time = anim_time_pos; m_net_last_anim_time = 0.0f; } @@ -461,10 +476,10 @@ void Character::SendStreamData() msg.pos_y = m_character_position.y; msg.pos_z = m_character_position.z; msg.rot_angle = m_character_rotation.valueRadians(); - strncpy(msg.anim_name, m_anim_name.c_str(), CHARACTER_ANIM_NAME_LEN); - msg.anim_time = m_anim_time - m_net_last_anim_time; + strncpy(msg.anim_name, m_anim_lower_name.c_str(), CHARACTER_ANIM_NAME_LEN); + msg.anim_time = m_anim_lower_time - m_net_last_anim_time; - m_net_last_anim_time = m_anim_time; + m_net_last_anim_time = m_anim_lower_time; App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA_DISCARDABLE, sizeof(NetCharacterMsgPos), (char*)&msg); #endif // USE_SOCKETW @@ -483,7 +498,7 @@ void Character::receiveStreamData(unsigned int& type, int& source, unsigned int& this->setRotation(Ogre::Radian(pos_msg->rot_angle)); if (strnlen(pos_msg->anim_name, CHARACTER_ANIM_NAME_LEN) < CHARACTER_ANIM_NAME_LEN) { - this->SetAnimState(pos_msg->anim_name, pos_msg->anim_time); + this->SetUpperAnimState(pos_msg->anim_name, pos_msg->anim_time); } } else if (msg->command == CHARACTER_CMD_DETACH) @@ -544,6 +559,8 @@ void Character::SetActorCoupling(bool enabled, ActorPtr actor) #endif // USE_SOCKETW } +ActorPtr Character::GetActorCoupling() { return m_actor_coupling; } + // -------------------------------- // GfxCharacter @@ -595,8 +612,10 @@ void RoR::GfxCharacter::BufferSimulationData() xc_simbuf.simbuf_net_username = xc_character->GetNetUsername(); xc_simbuf.simbuf_is_remote = xc_character->GetIsRemote(); xc_simbuf.simbuf_actor_coupling = xc_character->GetActorCoupling(); - xc_simbuf.simbuf_anim_name = xc_character->GetAnimName(); - xc_simbuf.simbuf_anim_time = xc_character->GetAnimTime(); + xc_simbuf.simbuf_anim_upper_name = xc_character->GetUpperAnimName(); + xc_simbuf.simbuf_anim_upper_time = xc_character->GetUpperAnimTime(); + xc_simbuf.simbuf_anim_lower_name = xc_character->GetLowerAnimName(); + xc_simbuf.simbuf_anim_lower_time = xc_character->GetLowerAnimTime(); } void RoR::GfxCharacter::UpdateCharacterInScene() @@ -657,33 +676,24 @@ void RoR::GfxCharacter::UpdateCharacterInScene() xc_scenenode->setVisible(true); } - // Animation - if (xc_simbuf.simbuf_anim_name != xc_simbuf_prev.simbuf_anim_name) + // Animation: kill all first, then enable what's desired. + this->DisableAnim(entity->getAnimationState("Idle_sway")); + this->DisableAnim(entity->getAnimationState("TurnRight")); + this->DisableAnim(entity->getAnimationState("TurnLeft")); + this->DisableAnim(entity->getAnimationState("Side_step")); + this->DisableAnim(entity->getAnimationState("Swim_loop")); + this->DisableAnim(entity->getAnimationState("Run")); + this->DisableAnim(entity->getAnimationState("Walk")); + this->DisableAnim(entity->getAnimationState("Spot_swim")); + + if (xc_simbuf.simbuf_anim_upper_name != "") { - // 'Classic' method - enable one anim, exterminate the others ~ only_a_ptr, 06/2018 - AnimationStateIterator it = entity->getAllAnimationStates()->getAnimationStateIterator(); - - while (it.hasMoreElements()) - { - AnimationState* as = it.getNext(); - - if (as->getAnimationName() == xc_simbuf.simbuf_anim_name) - { - as->setEnabled(true); - as->setWeight(1); - as->addTime(xc_simbuf.simbuf_anim_time); - } - else - { - as->setEnabled(false); - as->setWeight(0); - } - } + this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_upper_name), xc_simbuf.simbuf_anim_upper_time); } - else if (xc_simbuf.simbuf_anim_name != "") // Just do nothing if animation name is empty. May happen during networked play. + + if (xc_simbuf.simbuf_anim_lower_name != "") { - auto* as_cur = entity->getAnimationState(xc_simbuf.simbuf_anim_name); - as_cur->setTimePosition(xc_simbuf.simbuf_anim_time); + this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_lower_name), xc_simbuf.simbuf_anim_lower_time); } // Multiplayer label @@ -714,3 +724,17 @@ void RoR::GfxCharacter::UpdateCharacterInScene() } #endif // USE_SOCKETW } + +void GfxCharacter::DisableAnim(Ogre::AnimationState* as) +{ + as->setEnabled(false); + as->setWeight(0); +} + +void GfxCharacter::EnableAnim(Ogre::AnimationState* as, float time) +{ + as->setEnabled(true); + as->setWeight(1); + as->setTimePosition(time); // addTime() ? +} + diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 21c6071367..f384973ba2 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -21,8 +21,9 @@ #pragma once -#include "Actor.h" + #include "ForwardDeclarations.h" +#include "SimBuffers.h" #include #include @@ -49,10 +50,8 @@ class Character int GetColorNum() const { return m_color_number; } bool GetIsRemote() const { return m_is_remote; } Ogre::UTFString const& GetNetUsername() { return m_net_username; } - std::string const & GetAnimName() const { return m_anim_name; } - float GetAnimTime() const { return m_anim_time; } Ogre::Radian getRotation() const { return m_character_rotation; } - ActorPtr GetActorCoupling() { return m_actor_coupling; } + ActorPtr GetActorCoupling(); void setColour(int color) { this->m_color_number = color; } Ogre::Vector3 getPosition(); void setPosition(Ogre::Vector3 position); @@ -64,12 +63,19 @@ class Character void SetActorCoupling(bool enabled, ActorPtr actor); GfxCharacter* SetupGfx(); + // anims + std::string const & GetUpperAnimName() const { return m_anim_upper_name; } + float GetUpperAnimTime() const { return m_anim_upper_time; } + std::string const & GetLowerAnimName() const { return m_anim_lower_name; } + float GetLowerAnimTime() const { return m_anim_lower_time; } + private: void ReportError(const char* detail); void SendStreamData(); void SendStreamSetup(); - void SetAnimState(std::string mode, float time = 0); + void SetUpperAnimState(std::string mode, float time = 0); + void SetLowerAnimState(std::string mode, float time = 0); ActorPtr m_actor_coupling; //!< The vehicle or machine which the character occupies Ogre::Radian m_character_rotation; @@ -82,8 +88,6 @@ class Character int m_source_id; bool m_can_jump; bool m_is_remote; - std::string m_anim_name; - float m_anim_time; float m_net_last_anim_time; float m_driving_anim_length; std::string m_instance_name; @@ -91,6 +95,12 @@ class Character Ogre::Timer m_net_timer; unsigned long m_net_last_update_time; GfxCharacter* m_gfx_character; + + // anims + std::string m_anim_upper_name; + float m_anim_upper_time; + std::string m_anim_lower_name; + float m_anim_lower_time; }; /// @} // addtogroup Character @@ -106,14 +116,20 @@ struct GfxCharacter bool simbuf_is_remote; int simbuf_color_number; ActorPtr simbuf_actor_coupling; - std::string simbuf_anim_name; - float simbuf_anim_time; // Intentionally left empty = forces initial update. + + // anims + std::string simbuf_anim_upper_name; + float simbuf_anim_upper_time; + std::string simbuf_anim_lower_name; + float simbuf_anim_lower_time; }; ~GfxCharacter(); void BufferSimulationData(); void UpdateCharacterInScene(); + void DisableAnim(Ogre::AnimationState* anim_state); + void EnableAnim(Ogre::AnimationState* anim_state, float time); Ogre::SceneNode* xc_scenenode; SimBuffer xc_simbuf; diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 78a2e60665..05c980685d 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -21,6 +21,7 @@ #include "CharacterFactory.h" +#include "Actor.h" #include "Application.h" #include "Character.h" #include "GfxScene.h" From ebf89bc271644341f42c7593db202ffe374ebb32 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Wed, 29 Jun 2022 19:34:40 +0200 Subject: [PATCH 02/32] Moved character simbuffer to SimBuffers.h --- source/main/gameplay/Character.h | 22 +++------------------- source/main/gfx/SimBuffers.h | 17 +++++++++++++++++ 2 files changed, 20 insertions(+), 19 deletions(-) diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index f384973ba2..cacb6b586a 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -107,23 +107,7 @@ class Character /// @} // addtogroup Gameplay struct GfxCharacter -{ - struct SimBuffer //!< Buffered simulation state for async gfx scene update - { - Ogre::Vector3 simbuf_character_pos; - Ogre::Radian simbuf_character_rot; //!< When on foot - Ogre::UTFString simbuf_net_username; - bool simbuf_is_remote; - int simbuf_color_number; - ActorPtr simbuf_actor_coupling; - - // anims - std::string simbuf_anim_upper_name; - float simbuf_anim_upper_time; - std::string simbuf_anim_lower_name; - float simbuf_anim_lower_time; - }; - +{ ~GfxCharacter(); void BufferSimulationData(); @@ -132,8 +116,8 @@ struct GfxCharacter void EnableAnim(Ogre::AnimationState* anim_state, float time); Ogre::SceneNode* xc_scenenode; - SimBuffer xc_simbuf; - SimBuffer xc_simbuf_prev; + CharacterSB xc_simbuf; + CharacterSB xc_simbuf_prev; Character* xc_character; std::string xc_instance_name; // TODO: Store MaterialPtr-s directly ~only_a_ptr, 05/2018 }; diff --git a/source/main/gfx/SimBuffers.h b/source/main/gfx/SimBuffers.h index 2bd5fa46bb..ba2db5543a 100644 --- a/source/main/gfx/SimBuffers.h +++ b/source/main/gfx/SimBuffers.h @@ -50,6 +50,7 @@ on main thread, but the goal is to do all on sim. thread. GameContext (gamecontext.h) / GameContextSB / GfxScene (gfxscene.h) + Character (character.h) / CharacterSB / GfxCharacter (character.h) Actor (actor.h) / ActorSB / GfxActor (gfxactor.h) node_t (simdata.h) / NodeSB / NodeGfx (gfxdata.h) beam_t (simdata.h) / - / BeamGfx (gfxdata.h) @@ -64,6 +65,22 @@ namespace RoR { +struct CharacterSB +{ + Ogre::Vector3 simbuf_character_pos; + Ogre::Radian simbuf_character_rot; //!< When on foot + Ogre::UTFString simbuf_net_username; + bool simbuf_is_remote; + int simbuf_color_number; + ActorPtr simbuf_actor_coupling; + + // anims + std::string simbuf_anim_upper_name; + float simbuf_anim_upper_time; + std::string simbuf_anim_lower_name; + float simbuf_anim_lower_time; +}; + struct NodeSB { Ogre::Vector3 AbsPosition; // classic name From 82f90b4ae9bd7b7bd21df63829480a00c0d3e4e0 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Mon, 19 Sep 2022 14:42:06 +0200 Subject: [PATCH 03/32] Character: improved upper/lower body anims - first, a cleanup: class GfxCharacter was moved to it's own new file under gfx/ - second, code creating GfxCharacter was moved to it's own constructor, propagating exceptions, with a try{}catch{} wrapper in `GfxActor::RegisterGfxCharacter()` - third, restored the animation kill-loop instead of resetting all anims by name. - fourth, added try/catch wrappers around all anim updates. --- source/main/CMakeLists.txt | 1 + source/main/gameplay/Character.cpp | 203 +----------------- source/main/gameplay/Character.h | 54 +++-- source/main/gameplay/CharacterFactory.cpp | 4 +- source/main/gfx/GfxCharacter.cpp | 245 ++++++++++++++++++++++ source/main/gfx/GfxCharacter.h | 57 +++++ source/main/gfx/GfxScene.cpp | 17 +- source/main/gfx/GfxScene.h | 4 +- source/main/gui/panels/GUI_SurveyMap.cpp | 1 + 9 files changed, 354 insertions(+), 232 deletions(-) create mode 100644 source/main/gfx/GfxCharacter.cpp create mode 100644 source/main/gfx/GfxCharacter.h diff --git a/source/main/CMakeLists.txt b/source/main/CMakeLists.txt index b17419a783..1325b3773e 100644 --- a/source/main/CMakeLists.txt +++ b/source/main/CMakeLists.txt @@ -33,6 +33,7 @@ set(SOURCE_FILES gfx/DustPool.{h,cpp} gfx/EnvironmentMap.{h,cpp} gfx/GfxActor.{h,cpp} + gfx/GfxCharacter.{h,cpp} gfx/GfxData.h gfx/GfxScene.{h,cpp} gfx/HydraxWater.{h,cpp} diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index b9b8a738a1..091a0bfc6d 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -2,7 +2,7 @@ This source file is part of Rigs of Rods Copyright 2005-2012 Pierre-Michel Ricordel Copyright 2007-2012 Thomas Fischer - Copyright 2017-2018 Petr Ohlidal + Copyright 2017-2022 Petr Ohlidal For more information, see http://www.rigsofrods.org/ @@ -26,6 +26,7 @@ #include "ActorManager.h" #include "CameraManager.h" #include "Collisions.h" +#include "Console.h" #include "GameContext.h" #include "GfxScene.h" #include "InputEngine.h" @@ -38,8 +39,6 @@ using namespace Ogre; using namespace RoR; -#define LOGSTREAM Ogre::LogManager::getSingleton().stream() - Character::Character(int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) , m_can_jump(false) @@ -55,8 +54,7 @@ Character::Character(int source, unsigned int streamid, UTFString player_name, i , m_is_remote(is_remote) , m_source_id(source) , m_stream_id(streamid) - , m_gfx_character(nullptr) - , m_driving_anim_length(0.f) + , m_driving_anim_length(1.f) // placeholder, filled by `GfxCharacter::GfxCharacter(Character*)` via friend access which is hacky but whatever , m_anim_upper_name("") // unused , m_anim_lower_name("Idle_sway") { @@ -72,11 +70,7 @@ Character::Character(int source, unsigned int streamid, UTFString player_name, i Character::~Character() { - if (m_gfx_character != nullptr) - { - App::GetGfxScene()->RemoveGfxCharacter(m_gfx_character); - delete m_gfx_character; - } + } void Character::updateCharacterRotation() @@ -422,19 +416,16 @@ void Character::move(Vector3 offset) void Character::ReportError(const char* detail) { #ifdef USE_SOCKETW - Ogre::UTFString username; + std::string username; RoRnet::UserInfo info; if (!App::GetNetwork()->GetUserInfo(m_source_id, info)) - username = "~~ERROR getting username~~"; + username = "?"; else username = info.username; - char msg_buf[300]; - snprintf(msg_buf, 300, - "[RoR|Networking] ERROR on m_is_remote character (User: '%s', SourceID: %d, StreamID: %d): ", - username.asUTF8_c_str(), m_source_id, m_stream_id); - - LOGSTREAM << msg_buf << detail; + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Error on networked character (User: '{}', SourceID: {}, StreamID: {}): {}", + username, m_source_id, m_stream_id, detail)); #endif } @@ -561,180 +552,4 @@ void Character::SetActorCoupling(bool enabled, ActorPtr actor) ActorPtr Character::GetActorCoupling() { return m_actor_coupling; } -// -------------------------------- -// GfxCharacter - -GfxCharacter* Character::SetupGfx() -{ - Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity(m_instance_name + "_mesh", "character.mesh"); - m_driving_anim_length = entity->getAnimationState("Driving")->getLength(); - - // fix disappearing mesh - AxisAlignedBox aabb; - aabb.setInfinite(); - entity->getMesh()->_setBounds(aabb); - - // add entity to the scene node - Ogre::SceneNode* scenenode = App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->createChildSceneNode(); - scenenode->attachObject(entity); - scenenode->setScale(0.02f, 0.02f, 0.02f); - scenenode->setVisible(false); - - // setup colour - MaterialPtr mat1 = MaterialManager::getSingleton().getByName("tracks/character"); - MaterialPtr mat2 = mat1->clone("tracks/" + m_instance_name); - entity->setMaterialName("tracks/" + m_instance_name); - - m_gfx_character = new GfxCharacter(); - m_gfx_character->xc_scenenode = scenenode; - m_gfx_character->xc_character = this; - m_gfx_character->xc_instance_name = m_instance_name; - - return m_gfx_character; -} - -RoR::GfxCharacter::~GfxCharacter() -{ - Entity* ent = static_cast(xc_scenenode->getAttachedObject(0)); - xc_scenenode->detachAllObjects(); - App::GetGfxScene()->GetSceneManager()->destroySceneNode(xc_scenenode); - App::GetGfxScene()->GetSceneManager()->destroyEntity(ent); - MaterialManager::getSingleton().unload("tracks/" + xc_instance_name); -} - -void RoR::GfxCharacter::BufferSimulationData() -{ - xc_simbuf_prev = xc_simbuf; - - xc_simbuf.simbuf_character_pos = xc_character->getPosition(); - xc_simbuf.simbuf_character_rot = xc_character->getRotation(); - xc_simbuf.simbuf_color_number = xc_character->GetColorNum(); - xc_simbuf.simbuf_net_username = xc_character->GetNetUsername(); - xc_simbuf.simbuf_is_remote = xc_character->GetIsRemote(); - xc_simbuf.simbuf_actor_coupling = xc_character->GetActorCoupling(); - xc_simbuf.simbuf_anim_upper_name = xc_character->GetUpperAnimName(); - xc_simbuf.simbuf_anim_upper_time = xc_character->GetUpperAnimTime(); - xc_simbuf.simbuf_anim_lower_name = xc_character->GetLowerAnimName(); - xc_simbuf.simbuf_anim_lower_time = xc_character->GetLowerAnimTime(); -} - -void RoR::GfxCharacter::UpdateCharacterInScene() -{ - // Actor coupling - if (xc_simbuf.simbuf_actor_coupling != xc_simbuf_prev.simbuf_actor_coupling) - { - if (xc_simbuf.simbuf_actor_coupling != nullptr) - { - // Entering/switching vehicle - xc_scenenode->getAttachedObject(0)->setCastShadows(false); - xc_scenenode->setVisible(xc_simbuf.simbuf_actor_coupling->GetGfxActor()->HasDriverSeatProp()); - } - else if (xc_simbuf_prev.simbuf_actor_coupling != nullptr) - { - // Leaving vehicle - xc_scenenode->getAttachedObject(0)->setCastShadows(true); - xc_scenenode->resetOrientation(); - } - } - - // Position + Orientation - Ogre::Entity* entity = static_cast(xc_scenenode->getAttachedObject(0)); - if (xc_simbuf.simbuf_actor_coupling != nullptr) - { - // We're in vehicle - GfxActor* gfx_actor = xc_simbuf.simbuf_actor_coupling->GetGfxActor(); - - // Update character visibility first - switch (gfx_actor->GetSimDataBuffer().simbuf_actor_state) - { - case ActorState::NETWORKED_HIDDEN: - entity->setVisible(false); - break; - case ActorState::NETWORKED_OK: - entity->setVisible(gfx_actor->HasDriverSeatProp()); - break; - default: - break; // no change. - } - - // If visible, update position - if (entity->isVisible()) - { - Ogre::Vector3 pos; - Ogre::Quaternion rot; - xc_simbuf.simbuf_actor_coupling->GetGfxActor()->CalculateDriverPos(pos, rot); - xc_scenenode->setOrientation(rot); - // hack to position the character right perfect on the default seat (because the mesh has decentered origin) - xc_scenenode->setPosition(pos + (rot * Vector3(0.f, -0.6f, 0.f))); - } - } - else - { - xc_scenenode->resetOrientation(); - xc_scenenode->yaw(-xc_simbuf.simbuf_character_rot); - xc_scenenode->setPosition(xc_simbuf.simbuf_character_pos); - xc_scenenode->setVisible(true); - } - - // Animation: kill all first, then enable what's desired. - this->DisableAnim(entity->getAnimationState("Idle_sway")); - this->DisableAnim(entity->getAnimationState("TurnRight")); - this->DisableAnim(entity->getAnimationState("TurnLeft")); - this->DisableAnim(entity->getAnimationState("Side_step")); - this->DisableAnim(entity->getAnimationState("Swim_loop")); - this->DisableAnim(entity->getAnimationState("Run")); - this->DisableAnim(entity->getAnimationState("Walk")); - this->DisableAnim(entity->getAnimationState("Spot_swim")); - - if (xc_simbuf.simbuf_anim_upper_name != "") - { - this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_upper_name), xc_simbuf.simbuf_anim_upper_time); - } - - if (xc_simbuf.simbuf_anim_lower_name != "") - { - this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_lower_name), xc_simbuf.simbuf_anim_lower_time); - } - - // Multiplayer label -#ifdef USE_SOCKETW - if (App::mp_state->getEnum() == MpState::CONNECTED && !xc_simbuf.simbuf_actor_coupling) - { - // From 'updateCharacterNetworkColor()' - const String materialName = "tracks/" + xc_instance_name; - - MaterialPtr mat = MaterialManager::getSingleton().getByName(materialName); - if (!mat.isNull() && mat->getNumTechniques() > 0 && mat->getTechnique(0)->getNumPasses() > 1 && - mat->getTechnique(0)->getPass(1)->getNumTextureUnitStates() > 1) - { - const auto& state = mat->getTechnique(0)->getPass(1)->getTextureUnitState(1); - Ogre::ColourValue color = App::GetNetwork()->GetPlayerColor(xc_simbuf.simbuf_color_number); - state->setColourOperationEx(LBX_BLEND_CURRENT_ALPHA, LBS_MANUAL, LBS_CURRENT, color); - } - - if ((!xc_simbuf.simbuf_is_remote && !App::mp_hide_own_net_label->getBool()) || - (xc_simbuf.simbuf_is_remote && !App::mp_hide_net_labels->getBool())) - { - float camDist = (xc_scenenode->getPosition() - App::GetCameraManager()->GetCameraNode()->getPosition()).length(); - Ogre::Vector3 scene_pos = xc_scenenode->getPosition(); - scene_pos.y += (1.9f + camDist / 100.0f); - - App::GetGfxScene()->DrawNetLabel(scene_pos, camDist, xc_simbuf.simbuf_net_username, xc_simbuf.simbuf_color_number); - } - } -#endif // USE_SOCKETW -} - -void GfxCharacter::DisableAnim(Ogre::AnimationState* as) -{ - as->setEnabled(false); - as->setWeight(0); -} - -void GfxCharacter::EnableAnim(Ogre::AnimationState* as, float time) -{ - as->setEnabled(true); - as->setWeight(1); - as->setTimePosition(time); // addTime() ? -} diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index cacb6b586a..1f2d97c119 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -2,7 +2,7 @@ This source file is part of Rigs of Rods Copyright 2005-2012 Pierre-Michel Ricordel Copyright 2007-2012 Thomas Fischer - Copyright 2017-2018 Petr Ohlidal + Copyright 2017-2022 Petr Ohlidal For more information, see http://www.rigsofrods.org/ @@ -38,30 +38,37 @@ namespace RoR { /// @addtogroup Character /// @{ +/// Character uses simplified physics and occupies single point in space. +/// Note on animations: +/// This object decides what animations are played and how fast, but doesn't apply it to visual scene. +/// Visual 3D model and animations are loaded and updated by `RoR::GfxCharacter` using data from sim buffers (see file 'SimBuffers.h') class Character { + friend struct GfxCharacter; // visual counterpart. + public: Character(int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); - int getSourceID() const { return m_source_id; } - bool isRemote() const { return m_is_remote; } - int GetColorNum() const { return m_color_number; } - bool GetIsRemote() const { return m_is_remote; } Ogre::UTFString const& GetNetUsername() { return m_net_username; } Ogre::Radian getRotation() const { return m_character_rotation; } ActorPtr GetActorCoupling(); - void setColour(int color) { this->m_color_number = color; } + Ogre::Vector3 getPosition(); void setPosition(Ogre::Vector3 position); void setRotation(Ogre::Radian rotation); void move(Ogre::Vector3 offset); void update(float dt); void updateCharacterRotation(); - void receiveStreamData(unsigned int& type, int& source, unsigned int& streamid, char* buffer); void SetActorCoupling(bool enabled, ActorPtr actor); - GfxCharacter* SetupGfx(); + + // network + void receiveStreamData(unsigned int& type, int& source, unsigned int& streamid, char* buffer); + int getSourceID() const { return m_source_id; } + bool isRemote() const { return m_is_remote; } + int GetColorNum() const { return m_color_number; } + void setColour(int color) { this->m_color_number = color; } // anims std::string const & GetUpperAnimName() const { return m_anim_upper_name; } @@ -83,18 +90,21 @@ class Character float m_character_v_speed; Ogre::Vector3 m_character_position; Ogre::Vector3 m_prev_position; - int m_color_number; - int m_stream_id; - int m_source_id; bool m_can_jump; + std::string m_instance_name; + + // visuals + float m_driving_anim_length; + + // network bool m_is_remote; float m_net_last_anim_time; - float m_driving_anim_length; - std::string m_instance_name; + int m_color_number; Ogre::UTFString m_net_username; Ogre::Timer m_net_timer; unsigned long m_net_last_update_time; - GfxCharacter* m_gfx_character; + int m_stream_id; + int m_source_id; // anims std::string m_anim_upper_name; @@ -106,21 +116,5 @@ class Character /// @} // addtogroup Character /// @} // addtogroup Gameplay -struct GfxCharacter -{ - ~GfxCharacter(); - - void BufferSimulationData(); - void UpdateCharacterInScene(); - void DisableAnim(Ogre::AnimationState* anim_state); - void EnableAnim(Ogre::AnimationState* anim_state, float time); - - Ogre::SceneNode* xc_scenenode; - CharacterSB xc_simbuf; - CharacterSB xc_simbuf_prev; - Character* xc_character; - std::string xc_instance_name; // TODO: Store MaterialPtr-s directly ~only_a_ptr, 05/2018 -}; - } // namespace RoR diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 05c980685d..d7cca62cbf 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -44,7 +44,7 @@ Character* CharacterFactory::CreateLocalCharacter() #endif // USE_SOCKETW m_local_character = std::unique_ptr(new Character(-1, 0, playerName, colourNum, false)); - App::GetGfxScene()->RegisterGfxCharacter(m_local_character->SetupGfx()); + App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); return m_local_character.get(); } @@ -59,7 +59,7 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) LOG(" new character for " + TOSTRING(sourceid) + ":" + TOSTRING(streamid) + ", colour: " + TOSTRING(colour)); Character* ch = new Character(sourceid, streamid, name, colour, true); - App::GetGfxScene()->RegisterGfxCharacter(ch->SetupGfx()); + App::GetGfxScene()->RegisterGfxCharacter(ch); m_remote_characters.push_back(std::unique_ptr(ch)); #endif // USE_SOCKETW } diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp new file mode 100644 index 0000000000..33861b8b62 --- /dev/null +++ b/source/main/gfx/GfxCharacter.cpp @@ -0,0 +1,245 @@ +/* + This source file is part of Rigs of Rods + Copyright 2005-2012 Pierre-Michel Ricordel + Copyright 2007-2012 Thomas Fischer + Copyright 2017-2018 Petr Ohlidal + + For more information, see http://www.rigsofrods.org/ + + Rigs of Rods is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3, as + published by the Free Software Foundation. + + Rigs of Rods is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Rigs of Rods. If not, see . +*/ + +#include "GfxCharacter.h" + +#include "Application.h" +#include "Actor.h" +#include "ActorManager.h" +#include "CameraManager.h" +#include "Collisions.h" +#include "Console.h" +#include "GameContext.h" +#include "GfxScene.h" +#include "InputEngine.h" +#include "MovableText.h" +#include "Network.h" +#include "Terrain.h" +#include "Utils.h" +#include "Water.h" + +using namespace Ogre; +using namespace RoR; + +GfxCharacter::GfxCharacter(Character* character) + : xc_character(character) + , xc_instance_name(character->m_instance_name) +{ + Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity(xc_instance_name + "_mesh", "character.mesh"); + character->m_driving_anim_length = entity->getAnimationState("Driving")->getLength(); + + // fix disappearing mesh + AxisAlignedBox aabb; + aabb.setInfinite(); + entity->getMesh()->_setBounds(aabb); + + // add entity to the scene node + xc_scenenode = App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->createChildSceneNode(); + xc_scenenode->attachObject(entity); + xc_scenenode->setScale(0.02f, 0.02f, 0.02f); + xc_scenenode->setVisible(false); + + // setup colour + MaterialPtr mat1 = MaterialManager::getSingleton().getByName("tracks/character"); + MaterialPtr mat2 = mat1->clone("tracks/" + xc_instance_name); + entity->setMaterialName("tracks/" + xc_instance_name); +} + +RoR::GfxCharacter::~GfxCharacter() +{ + Entity* ent = static_cast(xc_scenenode->getAttachedObject(0)); + xc_scenenode->detachAllObjects(); + App::GetGfxScene()->GetSceneManager()->destroySceneNode(xc_scenenode); + App::GetGfxScene()->GetSceneManager()->destroyEntity(ent); + MaterialManager::getSingleton().unload("tracks/" + xc_instance_name); +} + +void RoR::GfxCharacter::BufferSimulationData() +{ + xc_simbuf_prev = xc_simbuf; + + xc_simbuf.simbuf_character_pos = xc_character->getPosition(); + xc_simbuf.simbuf_character_rot = xc_character->getRotation(); + xc_simbuf.simbuf_color_number = xc_character->GetColorNum(); + xc_simbuf.simbuf_net_username = xc_character->GetNetUsername(); + xc_simbuf.simbuf_is_remote = xc_character->isRemote(); + xc_simbuf.simbuf_actor_coupling = xc_character->GetActorCoupling(); + xc_simbuf.simbuf_anim_upper_name = xc_character->GetUpperAnimName(); + xc_simbuf.simbuf_anim_upper_time = xc_character->GetUpperAnimTime(); + xc_simbuf.simbuf_anim_lower_name = xc_character->GetLowerAnimName(); + xc_simbuf.simbuf_anim_lower_time = xc_character->GetLowerAnimTime(); +} + +void RoR::GfxCharacter::UpdateCharacterInScene() +{ + // Actor coupling + if (xc_simbuf.simbuf_actor_coupling != xc_simbuf_prev.simbuf_actor_coupling) + { + if (xc_simbuf.simbuf_actor_coupling != nullptr) + { + // Entering/switching vehicle + xc_scenenode->getAttachedObject(0)->setCastShadows(false); + xc_scenenode->setVisible(xc_simbuf.simbuf_actor_coupling->GetGfxActor()->HasDriverSeatProp()); + } + else if (xc_simbuf_prev.simbuf_actor_coupling != nullptr) + { + // Leaving vehicle + xc_scenenode->getAttachedObject(0)->setCastShadows(true); + xc_scenenode->resetOrientation(); + } + } + + // Position + Orientation + Ogre::Entity* entity = static_cast(xc_scenenode->getAttachedObject(0)); + if (xc_simbuf.simbuf_actor_coupling != nullptr) + { + // We're in vehicle + GfxActor* gfx_actor = xc_simbuf.simbuf_actor_coupling->GetGfxActor(); + + // Update character visibility first + switch (gfx_actor->GetSimDataBuffer().simbuf_actor_state) + { + case ActorState::NETWORKED_HIDDEN: + entity->setVisible(false); + break; + case ActorState::NETWORKED_OK: + entity->setVisible(gfx_actor->HasDriverSeatProp()); + break; + default: + break; // no change. + } + + // If visible, update position + if (entity->isVisible()) + { + Ogre::Vector3 pos; + Ogre::Quaternion rot; + xc_simbuf.simbuf_actor_coupling->GetGfxActor()->CalculateDriverPos(pos, rot); + xc_scenenode->setOrientation(rot); + // hack to position the character right perfect on the default seat (because the mesh has decentered origin) + xc_scenenode->setPosition(pos + (rot * Vector3(0.f, -0.6f, 0.f))); + } + } + else + { + xc_scenenode->resetOrientation(); + xc_scenenode->yaw(-xc_simbuf.simbuf_character_rot); + xc_scenenode->setPosition(xc_simbuf.simbuf_character_pos); + xc_scenenode->setVisible(true); + } + + // Reset all anims + + AnimationStateIterator it = entity->getAllAnimationStates()->getAnimationStateIterator(); + LOG(fmt::format("file:{}, line:{}, func:{}, resetting all animations before update", __FILE__, __LINE__, __FUNCTION__ )); + while (it.hasMoreElements()) + { + AnimationState* as = it.getNext(); + as->setEnabled(false); + as->setWeight(0); + LOG(fmt::format("\tanim '{}' was reset", as->getAnimationName())); + } + + // upper body anim + if (xc_simbuf.simbuf_anim_upper_name != "") + { + LOG(fmt::format("file:{}, line:{}, func:{}, enabling upper body anim (name '{}', time {})", + __FILE__, __LINE__, __FUNCTION__, + xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time)); + try + { + this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_upper_name), xc_simbuf.simbuf_anim_upper_time); + } + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error updating upper body anim (name '{}', time {}), message:{}", + xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time, eeh.getFullDescription())); + } + } + else + { + LOG(fmt::format("file:{}, line:{}, func:{}, no upper body anim requested", + __FILE__, __LINE__, __FUNCTION__)); + } + + // lower body anim + if (xc_simbuf.simbuf_anim_lower_name != "") + { + LOG(fmt::format("file:{}, line:{}, func:{}, enabling lower body anim (name '{}', time {})", + __FILE__, __LINE__, __FUNCTION__, + xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time)); + try + { + this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_lower_name), xc_simbuf.simbuf_anim_lower_time); + } + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error updating lower body anim (name '{}', time {}), message:{}", + xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time, eeh.getFullDescription())); + } + } + else + { + LOG(fmt::format("file:{}, line:{}, func:{}, no lower body anim requested", + __FILE__, __LINE__, __FUNCTION__)); + } + + // Multiplayer label +#ifdef USE_SOCKETW + if (App::mp_state->getEnum() == MpState::CONNECTED && !xc_simbuf.simbuf_actor_coupling) + { + // From 'updateCharacterNetworkColor()' + const String materialName = "tracks/" + xc_instance_name; + + MaterialPtr mat = MaterialManager::getSingleton().getByName(materialName); + if (!mat.isNull() && mat->getNumTechniques() > 0 && mat->getTechnique(0)->getNumPasses() > 1 && + mat->getTechnique(0)->getPass(1)->getNumTextureUnitStates() > 1) + { + const auto& state = mat->getTechnique(0)->getPass(1)->getTextureUnitState(1); + Ogre::ColourValue color = App::GetNetwork()->GetPlayerColor(xc_simbuf.simbuf_color_number); + state->setColourOperationEx(LBX_BLEND_CURRENT_ALPHA, LBS_MANUAL, LBS_CURRENT, color); + } + + if ((!xc_simbuf.simbuf_is_remote && !App::mp_hide_own_net_label->getBool()) || + (xc_simbuf.simbuf_is_remote && !App::mp_hide_net_labels->getBool())) + { + float camDist = (xc_scenenode->getPosition() - App::GetCameraManager()->GetCameraNode()->getPosition()).length(); + Ogre::Vector3 scene_pos = xc_scenenode->getPosition(); + scene_pos.y += (1.9f + camDist / 100.0f); + + App::GetGfxScene()->DrawNetLabel(scene_pos, camDist, xc_simbuf.simbuf_net_username, xc_simbuf.simbuf_color_number); + } + } +#endif // USE_SOCKETW +} + +void GfxCharacter::DisableAnim(Ogre::AnimationState* as) +{ + as->setEnabled(false); + as->setWeight(0); +} + +void GfxCharacter::EnableAnim(Ogre::AnimationState* as, float time) +{ + as->setEnabled(true); + as->setWeight(1); + as->setTimePosition(time); // addTime() ? +} diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h new file mode 100644 index 0000000000..230f0a769e --- /dev/null +++ b/source/main/gfx/GfxCharacter.h @@ -0,0 +1,57 @@ +/* + This source file is part of Rigs of Rods + Copyright 2005-2012 Pierre-Michel Ricordel + Copyright 2007-2012 Thomas Fischer + Copyright 2017-2018 Petr Ohlidal + + For more information, see http://www.rigsofrods.org/ + + Rigs of Rods is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3, as + published by the Free Software Foundation. + + Rigs of Rods is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Rigs of Rods. If not, see . +*/ + +#pragma once + +#include "ForwardDeclarations.h" +#include "SimBuffers.h" + +#include +#include + +namespace RoR { + +/// @addtogroup Gfx +/// @{ + +/// A visual counterpart to `RoR::Character`. +/// 3D objects are loaded and updated here, but positioning and animations are determined in simulation! +struct GfxCharacter +{ + GfxCharacter(Character* character); + ~GfxCharacter(); + + void BufferSimulationData(); + void UpdateCharacterInScene(); + void DisableAnim(Ogre::AnimationState* anim_state); + void EnableAnim(Ogre::AnimationState* anim_state, float time); + + Ogre::SceneNode* xc_scenenode; + CharacterSB xc_simbuf; + CharacterSB xc_simbuf_prev; + Character* xc_character; + std::string xc_instance_name; +}; + +/// @} // addtogroup Gfx + +} // namespace RoR + diff --git a/source/main/gfx/GfxScene.cpp b/source/main/gfx/GfxScene.cpp index 9f514cbbb7..690a4c7c1b 100644 --- a/source/main/gfx/GfxScene.cpp +++ b/source/main/gfx/GfxScene.cpp @@ -28,6 +28,7 @@ #include "DustPool.h" #include "HydraxWater.h" #include "GameContext.h" +#include "GfxCharacter.h" #include "GUIManager.h" #include "GUIUtils.h" #include "GUI_DirectionArrow.h" @@ -322,14 +323,22 @@ void GfxScene::RemoveGfxActor(RoR::GfxActor* remove_me) } } -void GfxScene::RegisterGfxCharacter(RoR::GfxCharacter* gfx_character) +void GfxScene::RegisterGfxCharacter(RoR::Character* character) { - m_all_gfx_characters.push_back(gfx_character); + try + { + m_all_gfx_characters.push_back(new GfxCharacter(character)); + } + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error creating GfxCharacter, message:{}", eeh.getFullDescription())); + } } -void GfxScene::RemoveGfxCharacter(RoR::GfxCharacter* remove_me) +void GfxScene::RemoveGfxCharacter(RoR::Character* remove_me) { - auto itor = std::remove(m_all_gfx_characters.begin(), m_all_gfx_characters.end(), remove_me); + auto itor = std::remove_if(m_all_gfx_characters.begin(), m_all_gfx_characters.end(), + [remove_me](GfxCharacter* xch) { return xch->xc_character == remove_me; }); if (itor != m_all_gfx_characters.end()) { m_all_gfx_characters.erase(itor, m_all_gfx_characters.end()); diff --git a/source/main/gfx/GfxScene.h b/source/main/gfx/GfxScene.h index fced6a3431..b633540e62 100644 --- a/source/main/gfx/GfxScene.h +++ b/source/main/gfx/GfxScene.h @@ -55,8 +55,8 @@ class GfxScene void ClearScene(); void RegisterGfxActor(RoR::GfxActor* gfx_actor); void RemoveGfxActor(RoR::GfxActor* gfx_actor); - void RegisterGfxCharacter(RoR::GfxCharacter* gfx_character); - void RemoveGfxCharacter(RoR::GfxCharacter* gfx_character); + void RegisterGfxCharacter(RoR::Character* gfx_character); + void RemoveGfxCharacter(RoR::Character* gfx_character); void BufferSimulationData(); //!< Run this when simulation is halted GameContextSB& GetSimDataBuffer() { return m_simbuf; } GfxEnvmap& GetEnvMap() { return m_envmap; } diff --git a/source/main/gui/panels/GUI_SurveyMap.cpp b/source/main/gui/panels/GUI_SurveyMap.cpp index bccfc40b7a..ac58124cb3 100644 --- a/source/main/gui/panels/GUI_SurveyMap.cpp +++ b/source/main/gui/panels/GUI_SurveyMap.cpp @@ -27,6 +27,7 @@ #include "ContentManager.h" #include "GameContext.h" #include "GfxActor.h" +#include "GfxCharacter.h" #include "GfxScene.h" #include "GUIManager.h" #include "GUI_MainSelector.h" From f07c5198dd0e7fbde0fa88424685424c4d96738a Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Mon, 19 Sep 2022 19:16:22 +0200 Subject: [PATCH 04/32] New UI: CharacterPoseUtil - displays anim states --- source/main/CMakeLists.txt | 1 + source/main/gfx/GfxCharacter.cpp | 11 +- source/main/gui/GUIManager.cpp | 6 ++ source/main/gui/GUIManager.h | 2 + .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 100 ++++++++++++++++++ .../main/gui/panels/GUI_CharacterPoseUtil.h | 44 ++++++++ source/main/gui/panels/GUI_TopMenubar.cpp | 6 ++ 7 files changed, 165 insertions(+), 5 deletions(-) create mode 100644 source/main/gui/panels/GUI_CharacterPoseUtil.cpp create mode 100644 source/main/gui/panels/GUI_CharacterPoseUtil.h diff --git a/source/main/CMakeLists.txt b/source/main/CMakeLists.txt index 1325b3773e..dc3a65c185 100644 --- a/source/main/CMakeLists.txt +++ b/source/main/CMakeLists.txt @@ -115,6 +115,7 @@ set(SOURCE_FILES gui/imgui/imstb_textedit.h gui/imgui/imstb_truetype.h gui/panels/GUI_AngelScriptExamples.{h,cpp} + gui/panels/GUI_CharacterPoseUtil.{h,cpp} gui/panels/GUI_CollisionsDebug.{h,cpp} gui/panels/GUI_ConsoleView.{h,cpp} gui/panels/GUI_ConsoleWindow.{h,cpp} diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index 33861b8b62..ddd3382b71 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -148,15 +148,16 @@ void RoR::GfxCharacter::UpdateCharacterInScene() // Reset all anims - AnimationStateIterator it = entity->getAllAnimationStates()->getAnimationStateIterator(); - LOG(fmt::format("file:{}, line:{}, func:{}, resetting all animations before update", __FILE__, __LINE__, __FUNCTION__ )); - while (it.hasMoreElements()) + + LOG(fmt::format("file:{}, line:{}, func:{}, resetting all animations before update", __FILE__, __LINE__, __FUNCTION__)); + AnimationStateSet* stateset = entity->getAllAnimationStates(); + for (auto& state_pair: stateset->getAnimationStates()) { - AnimationState* as = it.getNext(); + AnimationState* as = state_pair.second; as->setEnabled(false); as->setWeight(0); LOG(fmt::format("\tanim '{}' was reset", as->getAnimationName())); - } + } // upper body anim if (xc_simbuf.simbuf_anim_upper_name != "") diff --git a/source/main/gui/GUIManager.cpp b/source/main/gui/GUIManager.cpp index 0981f84e66..d95575c9b5 100644 --- a/source/main/gui/GUIManager.cpp +++ b/source/main/gui/GUIManager.cpp @@ -115,6 +115,7 @@ bool GUIManager::AreStaticMenusAllowed() //!< i.e. top menubar / vehicle UI butt return (App::GetCameraManager()->GetCurrentBehavior() != CameraManager::CAMERA_BEHAVIOR_FREE && !this->ConsoleWindow.IsHovered() && !this->GameControls.IsHovered() && + !this->CharacterPoseUtil.IsHovered() && !this->FrictionSettings.IsHovered() && !this->TextureToolWindow.IsHovered() && !this->NodeBeamUtils.IsHovered() && @@ -190,6 +191,11 @@ void GUIManager::DrawSimGuiBuffered(GfxActor* player_gfx_actor) this->FrictionSettings.Draw(); } + if (this->CharacterPoseUtil.IsVisible()) + { + this->CharacterPoseUtil.Draw(); + } + if (this->VehicleDescription.IsVisible()) { this->VehicleDescription.Draw(); diff --git a/source/main/gui/GUIManager.h b/source/main/gui/GUIManager.h index 90f82ae0a7..947c428806 100644 --- a/source/main/gui/GUIManager.h +++ b/source/main/gui/GUIManager.h @@ -32,6 +32,7 @@ #include "GUI_CollisionsDebug.h" #include "GUI_ConsoleWindow.h" #include "GUI_FlexbodyDebug.h" +#include "GUI_CharacterPoseUtil.h" #include "GUI_FrictionSettings.h" #include "GUI_RepositorySelector.h" #include "GUI_GameMainMenu.h" @@ -102,6 +103,7 @@ class GUIManager ~GUIManager(); + GUI::CharacterPoseUtil CharacterPoseUtil; GUI::CollisionsDebug CollisionsDebug; GUI::GameMainMenu GameMainMenu; GUI::GameAbout GameAbout; diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp new file mode 100644 index 0000000000..032e36e823 --- /dev/null +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -0,0 +1,100 @@ +/* + This source file is part of Rigs of Rods + Copyright 2016-2020 Petr Ohlidal + + For more information, see http://www.rigsofrods.org/ + + Rigs of Rods is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3, as + published by the Free Software Foundation. + + Rigs of Rods is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Rigs of Rods. If not, see . +*/ + + +#include "GUI_CharacterPoseUtil.h" + +#include "Application.h" +#include "Actor.h" +#include "GameContext.h" +#include "GfxCharacter.h" +#include "GfxScene.h" +#include "GUIManager.h" +#include "Language.h" + +#include + +using namespace RoR; +using namespace GUI; +using namespace Ogre; + +void CharacterPoseUtil::Draw() +{ + Character* character = App::GetGameContext()->GetPlayerCharacter(); + if (!character) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + "no player character, closing CharacterPoseUtil"); + this->SetVisible(false); + return; + } + + GfxCharacter* gfx_character = nullptr; + for (GfxCharacter* xchar : App::GetGfxScene()->GetGfxCharacters()) + { + if (xchar->xc_character == character) + gfx_character = xchar; + } + if (!gfx_character) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + "no player character visuals, closing CharacterPoseUtil"); + this->SetVisible(false); + return; + } + + Entity* ent = static_cast(gfx_character->xc_scenenode->getAttachedObject(0)); + + const int flags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize; + bool keep_open = true; + ImGui::Begin(_LC("CharacterPoseUtil", "Character pose utility"), &keep_open, flags); + + ImGui::Dummy(ImVec2(250, 1)); // force minimum width + + ImGui::Text("Character: '%s'", gfx_character->xc_instance_name.c_str()); + ImGui::TextDisabled("(gray text means 'disabled')"); + ImGui::Separator(); + + AnimationStateSet* stateset = ent->getAllAnimationStates(); + for (auto& state_pair : stateset->getAnimationStates()) + { + AnimationState* as = state_pair.second; + ImVec4 color = (as->getEnabled()) ? ImGui::GetStyle().Colors[ImGuiCol_Text] : ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]; + ImGui::TextColored(color, "'%s' (%.2f sec)", as->getAnimationName().c_str(), as->getLength()); + std::string caption = fmt::format("{:.2f} sec", as->getTimePosition()); + ImGui::ProgressBar(as->getTimePosition() / as->getLength(), ImVec2(-1, 0), caption.c_str()); + } + + // Common window epilogue: + + m_is_hovered = ImGui::IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); + App::GetGuiManager()->RequestGuiCaptureKeyboard(m_is_hovered); + + ImGui::End(); + if (!keep_open) + { + this->SetVisible(false); + } +} + +void CharacterPoseUtil::SetVisible(bool v) +{ + m_is_visible = v; + m_is_hovered = false; +} diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.h b/source/main/gui/panels/GUI_CharacterPoseUtil.h new file mode 100644 index 0000000000..b0d7cf15c9 --- /dev/null +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.h @@ -0,0 +1,44 @@ +/* + This source file is part of Rigs of Rods + Copyright 2016-2020 Petr Ohlidal + + For more information, see http://www.rigsofrods.org/ + + Rigs of Rods is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3, as + published by the Free Software Foundation. + + Rigs of Rods is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Rigs of Rods. If not, see . +*/ + +#pragma once + +#include "Application.h" +#include "OgreImGui.h" + +namespace RoR { +namespace GUI { + +class CharacterPoseUtil +{ +public: + void Draw(); + + void SetVisible(bool visible); + bool IsVisible() const { return m_is_visible; } + bool IsHovered() const { return IsVisible() && m_is_hovered; } + +private: + bool m_is_visible = false; + bool m_is_hovered = false; + +}; + +} // namespace GUI +} // namespace RoR diff --git a/source/main/gui/panels/GUI_TopMenubar.cpp b/source/main/gui/panels/GUI_TopMenubar.cpp index abceb1d4d0..abecb2991c 100644 --- a/source/main/gui/panels/GUI_TopMenubar.cpp +++ b/source/main/gui/panels/GUI_TopMenubar.cpp @@ -642,6 +642,12 @@ void TopMenubar::Update() m_open_menu = TopMenu::TOPMENU_NONE; } + if (ImGui::Button(_LC("TopMenubar", "Character pose util"))) + { + App::GetGuiManager()->CharacterPoseUtil.SetVisible(true); + m_open_menu = TopMenu::TOPMENU_NONE; + } + if (ImGui::Button(_LC("TopMenubar", "Collisions debug"))) { App::GetGuiManager()->CollisionsDebug.SetVisible(true); From 281c0d43a22ef923b6869241233d45fb6f2447bf Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Mon, 19 Sep 2022 21:18:11 +0200 Subject: [PATCH 05/32] CharacterPoseUtil UI: added manual posing mode --- source/main/gfx/GfxCharacter.cpp | 92 ++++++++++--------- .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 62 +++++++++++-- .../main/gui/panels/GUI_CharacterPoseUtil.h | 5 + 3 files changed, 109 insertions(+), 50 deletions(-) diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index ddd3382b71..b50b37a477 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -29,6 +29,7 @@ #include "Console.h" #include "GameContext.h" #include "GfxScene.h" +#include "GUIManager.h" #include "InputEngine.h" #include "MovableText.h" #include "Network.h" @@ -146,62 +147,65 @@ void RoR::GfxCharacter::UpdateCharacterInScene() xc_scenenode->setVisible(true); } - // Reset all anims + if (!App::GetGuiManager()->CharacterPoseUtil.IsManualPoseActive()) + { + // Reset all anims - LOG(fmt::format("file:{}, line:{}, func:{}, resetting all animations before update", __FILE__, __LINE__, __FUNCTION__)); - AnimationStateSet* stateset = entity->getAllAnimationStates(); - for (auto& state_pair: stateset->getAnimationStates()) - { - AnimationState* as = state_pair.second; - as->setEnabled(false); - as->setWeight(0); - LOG(fmt::format("\tanim '{}' was reset", as->getAnimationName())); + LOG(fmt::format("file:{}, line:{}, func:{}, resetting all animations before update", __FILE__, __LINE__, __FUNCTION__)); + AnimationStateSet* stateset = entity->getAllAnimationStates(); + for (auto& state_pair : stateset->getAnimationStates()) + { + AnimationState* as = state_pair.second; + as->setEnabled(false); + as->setWeight(0); + LOG(fmt::format("\tanim '{}' was reset", as->getAnimationName())); } - // upper body anim - if (xc_simbuf.simbuf_anim_upper_name != "") - { - LOG(fmt::format("file:{}, line:{}, func:{}, enabling upper body anim (name '{}', time {})", - __FILE__, __LINE__, __FUNCTION__, - xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time)); - try + // upper body anim + if (xc_simbuf.simbuf_anim_upper_name != "") { - this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_upper_name), xc_simbuf.simbuf_anim_upper_time); + LOG(fmt::format("file:{}, line:{}, func:{}, enabling upper body anim (name '{}', time {})", + __FILE__, __LINE__, __FUNCTION__, + xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time)); + try + { + this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_upper_name), xc_simbuf.simbuf_anim_upper_time); + } + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error updating upper body anim (name '{}', time {}), message:{}", + xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time, eeh.getFullDescription())); + } } - catch (Ogre::Exception& eeh) { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("error updating upper body anim (name '{}', time {}), message:{}", - xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time, eeh.getFullDescription())); + else + { + LOG(fmt::format("file:{}, line:{}, func:{}, no upper body anim requested", + __FILE__, __LINE__, __FUNCTION__)); } - } - else - { - LOG(fmt::format("file:{}, line:{}, func:{}, no upper body anim requested", - __FILE__, __LINE__, __FUNCTION__)); - } - // lower body anim - if (xc_simbuf.simbuf_anim_lower_name != "") - { - LOG(fmt::format("file:{}, line:{}, func:{}, enabling lower body anim (name '{}', time {})", - __FILE__, __LINE__, __FUNCTION__, - xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time)); - try + // lower body anim + if (xc_simbuf.simbuf_anim_lower_name != "") { - this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_lower_name), xc_simbuf.simbuf_anim_lower_time); + LOG(fmt::format("file:{}, line:{}, func:{}, enabling lower body anim (name '{}', time {})", + __FILE__, __LINE__, __FUNCTION__, + xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time)); + try + { + this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_lower_name), xc_simbuf.simbuf_anim_lower_time); + } + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error updating lower body anim (name '{}', time {}), message:{}", + xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time, eeh.getFullDescription())); + } } - catch (Ogre::Exception& eeh) { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("error updating lower body anim (name '{}', time {}), message:{}", - xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time, eeh.getFullDescription())); + else + { + LOG(fmt::format("file:{}, line:{}, func:{}, no lower body anim requested", + __FILE__, __LINE__, __FUNCTION__)); } } - else - { - LOG(fmt::format("file:{}, line:{}, func:{}, no lower body anim requested", - __FILE__, __LINE__, __FUNCTION__)); - } // Multiplayer label #ifdef USE_SOCKETW diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index 032e36e823..20e1573090 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -65,20 +65,23 @@ void CharacterPoseUtil::Draw() bool keep_open = true; ImGui::Begin(_LC("CharacterPoseUtil", "Character pose utility"), &keep_open, flags); - ImGui::Dummy(ImVec2(250, 1)); // force minimum width + ImGui::Text("Character: '%s'", gfx_character->xc_instance_name.c_str()); - ImGui::TextDisabled("(gray text means 'disabled')"); + ImGui::Checkbox("Manual pose", &m_manual_pose_active); + if (!m_manual_pose_active) + { + ImGui::TextDisabled("(gray text means 'disabled')"); + } + ImGui::Dummy(ImVec2(350, 1)); // force minimum width ImGui::Separator(); AnimationStateSet* stateset = ent->getAllAnimationStates(); for (auto& state_pair : stateset->getAnimationStates()) { AnimationState* as = state_pair.second; - ImVec4 color = (as->getEnabled()) ? ImGui::GetStyle().Colors[ImGuiCol_Text] : ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]; - ImGui::TextColored(color, "'%s' (%.2f sec)", as->getAnimationName().c_str(), as->getLength()); - std::string caption = fmt::format("{:.2f} sec", as->getTimePosition()); - ImGui::ProgressBar(as->getTimePosition() / as->getLength(), ImVec2(-1, 0), caption.c_str()); + this->DrawAnimControls(as); + } // Common window epilogue: @@ -93,8 +96,55 @@ void CharacterPoseUtil::Draw() } } +void CharacterPoseUtil::DrawAnimControls(Ogre::AnimationState* anim_state) +{ + ImGui::PushID(anim_state); + + // anim name line + ImVec4 color = (anim_state->getEnabled()) ? ImGui::GetStyle().Colors[ImGuiCol_Text] : ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]; + ImGui::TextColored(color, "'%s' (%.2f sec)", anim_state->getAnimationName().c_str(), anim_state->getLength()); + if (m_manual_pose_active) + { + ImGui::SameLine(); + bool enabled = anim_state->getEnabled(); + if (ImGui::Checkbox("Enabled", &enabled)) + { + anim_state->setEnabled(enabled); + anim_state->setWeight(enabled ? 1.f : 0.f); + } + ImGui::SameLine(); + float weight = anim_state->getWeight(); + ImGui::SetNextItemWidth(50.f); + if (ImGui::InputFloat("Weight", &weight)) + { + anim_state->setWeight(weight); + } + } + + // anim progress line + if (m_manual_pose_active) + { + float timepos = anim_state->getTimePosition(); + if (ImGui::SliderFloat("Time pos", &timepos, 0.f, anim_state->getLength())) + { + anim_state->setTimePosition(timepos); + } + } + else + { + std::string caption = fmt::format("{:.2f} sec", anim_state->getTimePosition()); + ImGui::ProgressBar(anim_state->getTimePosition() / anim_state->getLength(), ImVec2(-1, 0), caption.c_str()); + } + + ImGui::PopID(); // AnimationState* +} + void CharacterPoseUtil::SetVisible(bool v) { m_is_visible = v; m_is_hovered = false; + if (!v) + { + m_manual_pose_active = false; + } } diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.h b/source/main/gui/panels/GUI_CharacterPoseUtil.h index b0d7cf15c9..9905d3b34f 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.h +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.h @@ -34,10 +34,15 @@ class CharacterPoseUtil bool IsVisible() const { return m_is_visible; } bool IsHovered() const { return IsVisible() && m_is_hovered; } + bool IsManualPoseActive() const { return m_manual_pose_active; } + private: + void DrawAnimControls(Ogre::AnimationState* anim_state); + bool m_is_visible = false; bool m_is_hovered = false; + bool m_manual_pose_active = false; }; } // namespace GUI From 8cc8be404462aeaaaffccaae448cf84d1985f7c7 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Fri, 23 Sep 2022 22:59:27 +0200 Subject: [PATCH 06/32] Character: added state & situation flag system. This obsoletes the separate "upper/lower" body anim system. * Character.cpp: no longer determines animations, only sets state & situation flags. * SimBuffers.h, Network.h: now transferring flags instead of anim+time. * GfxCharacter.cpp: determine animation from flags and other state info. --- source/main/Application.h | 2 - source/main/gameplay/Character.cpp | 436 +++++++++------------- source/main/gameplay/Character.h | 61 +-- source/main/gameplay/CharacterFactory.cpp | 10 +- source/main/gfx/GfxCharacter.cpp | 182 ++++++--- source/main/gfx/GfxCharacter.h | 5 +- source/main/gfx/GfxScene.cpp | 2 +- source/main/gfx/SimBuffers.h | 16 +- source/main/network/Network.h | 4 +- 9 files changed, 363 insertions(+), 355 deletions(-) diff --git a/source/main/Application.h b/source/main/Application.h index 7f10af53fe..bdde5591be 100644 --- a/source/main/Application.h +++ b/source/main/Application.h @@ -39,8 +39,6 @@ #define ROR_ASSERT(_EXPR) assert(_EXPR) -#define CHARACTER_ANIM_NAME_LEN 10 // Restricted for networking - // Legacy macros #define TOSTRING(x) Ogre::StringConverter::toString(x) #define PARSEINT(x) Ogre::StringConverter::parseInt(x) diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index 091a0bfc6d..a8149625dd 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -41,22 +41,15 @@ using namespace RoR; Character::Character(int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) - , m_can_jump(false) , m_character_rotation(0.0f) , m_character_h_speed(2.0f) , m_character_v_speed(0.0f) , m_color_number(color_number) - , m_anim_upper_time(0.f) - , m_anim_lower_time(0.f) - , m_net_last_anim_time(0.f) , m_net_last_update_time(0.f) , m_net_username(player_name) , m_is_remote(is_remote) , m_source_id(source) , m_stream_id(streamid) - , m_driving_anim_length(1.f) // placeholder, filled by `GfxCharacter::GfxCharacter(Character*)` via friend access which is hacky but whatever - , m_anim_upper_name("") // unused - , m_anim_lower_name("Idle_sway") { static int id_counter = 0; m_instance_name = "Character" + TOSTRING(id_counter); @@ -96,33 +89,6 @@ void Character::setRotation(Radian rotation) m_character_rotation = rotation; } -void Character::SetUpperAnimState(std::string mode, float time) -{ - if (m_anim_upper_name != mode) - { - m_anim_upper_name = mode; - m_anim_upper_time = time; - } - else - { - m_anim_upper_time += time; - } -} - -void Character::SetLowerAnimState(std::string mode, float time) -{ - if (m_anim_lower_name != mode) - { - m_anim_lower_name = mode; - m_anim_lower_time = time; - m_net_last_anim_time = 0.0f; - } - else - { - m_anim_lower_time += time; - } -} - float calculate_collision_depth(Vector3 pos) { Vector3 query = pos + 0.3f * Vector3::UNIT_Y; @@ -135,276 +101,241 @@ float calculate_collision_depth(Vector3 pos) return query.y - pos.y; } -void Character::update(float dt) +void Character::updateLocal(float dt) { - if (!m_is_remote && (m_actor_coupling == nullptr) && (App::sim_state->getEnum() != SimState::PAUSED)) + ROR_ASSERT(!isRemote()); + + // Check if movement is enabled + if (BITMASK_IS_1(m_situation_flags, SITUATION_DRIVING) + || (App::sim_state->getEnum() == SimState::PAUSED) + || App::GetCameraManager()->GetCurrentBehavior() == CameraManager::CAMERA_BEHAVIOR_FREE) { - // disable character movement when using the free camera mode or when the menu is opened - // TODO: check for menu being opened - if (App::GetCameraManager()->GetCurrentBehavior() == CameraManager::CAMERA_BEHAVIOR_FREE) - { - return; - } + return; // do not update. + } - Vector3 position = m_character_position; //ASYNCSCENE OLD m_character_scenenode->getPosition(); + bool m_can_jump = false; + m_action_flags = 0; - // gravity force is always on - position.y += m_character_v_speed * dt; - m_character_v_speed += dt * -9.8f; + Vector3 position = m_character_position; - // Trigger script events and handle mesh (ground) collision - Vector3 query = position; - App::GetGameContext()->GetTerrain()->GetCollisions()->collisionCorrect(&query); + // gravity force is always on + position.y += m_character_v_speed * dt; + m_character_v_speed += dt * -9.8f; - // Auto compensate minor height differences - float depth = calculate_collision_depth(position); - if (depth > 0.0f) - { - m_can_jump = true; - m_character_v_speed = std::max(0.0f, m_character_v_speed); - position.y += std::min(depth, 2.0f * dt); - } + // Trigger script events and handle mesh (ground) collision + Vector3 query = position; + App::GetGameContext()->GetTerrain()->GetCollisions()->collisionCorrect(&query); + + // Auto compensate minor height differences + float depth = calculate_collision_depth(position); + if (depth > 0.0f) + { + m_can_jump = true; + m_character_v_speed = std::max(0.0f, m_character_v_speed); + position.y += std::min(depth, 2.0f * dt); + } - // Submesh "collision" + // Submesh "collision" + { + float depth = 0.0f; + for (const ActorPtr& actor : App::GetGameContext()->GetActorManager()->GetActors()) { - float depth = 0.0f; - for (ActorPtr& actor : App::GetGameContext()->GetActorManager()->GetActors()) + if (actor->ar_bounding_box.contains(position)) { - if (actor->ar_bounding_box.contains(position)) + for (int i = 0; i < actor->ar_num_collcabs; i++) { - for (int i = 0; i < actor->ar_num_collcabs; i++) + int tmpv = actor->ar_collcabs[i] * 3; + Vector3 a = actor->ar_nodes[actor->ar_cabs[tmpv + 0]].AbsPosition; + Vector3 b = actor->ar_nodes[actor->ar_cabs[tmpv + 1]].AbsPosition; + Vector3 c = actor->ar_nodes[actor->ar_cabs[tmpv + 2]].AbsPosition; + auto result = Math::intersects(Ray(position, Vector3::UNIT_Y), a, b, c); + if (result.first && result.second < 1.8f) { - int tmpv = actor->ar_collcabs[i] * 3; - Vector3 a = actor->ar_nodes[actor->ar_cabs[tmpv + 0]].AbsPosition; - Vector3 b = actor->ar_nodes[actor->ar_cabs[tmpv + 1]].AbsPosition; - Vector3 c = actor->ar_nodes[actor->ar_cabs[tmpv + 2]].AbsPosition; - auto result = Math::intersects(Ray(position, Vector3::UNIT_Y), a, b, c); - if (result.first && result.second < 1.8f) - { - depth = std::max(depth, result.second); - } + depth = std::max(depth, result.second); } } } - if (depth > 0.0f) - { - m_can_jump = true; - m_character_v_speed = std::max(0.0f, m_character_v_speed); - position.y += std::min(depth, 0.05f); - } } + if (depth > 0.0f) + { + m_can_jump = true; + m_character_v_speed = std::max(0.0f, m_character_v_speed); + position.y += std::min(depth, 0.05f); + } + } - // Obstacle detection - if (position != m_prev_position) + // Obstacle detection + if (position != m_prev_position) + { + const int numstep = 100; + Vector3 diff = position - m_prev_position; + Vector3 base = m_prev_position + Vector3::UNIT_Y * 0.25f; + for (int i = 1; i < numstep; i++) { - const int numstep = 100; - Vector3 diff = position - m_prev_position; - Vector3 base = m_prev_position + Vector3::UNIT_Y * 0.25f; - for (int i = 1; i < numstep; i++) + Vector3 query = base + diff * ((float)i / numstep); + if (App::GetGameContext()->GetTerrain()->GetCollisions()->collisionCorrect(&query, false)) { - Vector3 query = base + diff * ((float)i / numstep); - if (App::GetGameContext()->GetTerrain()->GetCollisions()->collisionCorrect(&query, false)) - { - m_character_v_speed = std::max(0.0f, m_character_v_speed); - position = m_prev_position + diff * ((float)(i - 1) / numstep); - position.y += 0.025f; - break; - } + m_character_v_speed = std::max(0.0f, m_character_v_speed); + position = m_prev_position + diff * ((float)(i - 1) / numstep); + position.y += 0.025f; + break; } } + } - m_prev_position = position; + m_prev_position = position; - // ground contact - float pheight = App::GetGameContext()->GetTerrain()->GetHeightAt(position.x, position.z); + // ground contact + float pheight = App::GetGameContext()->GetTerrain()->GetHeightAt(position.x, position.z); - if (position.y < pheight) - { - position.y = pheight; - m_character_v_speed = 0.0f; - m_can_jump = true; - } + if (position.y < pheight) + { + position.y = pheight; + m_character_v_speed = 0.0f; + m_can_jump = true; + } - // water stuff - bool isswimming = false; - float wheight = -99999; + // water stuff + bool isswimming = false; + float wheight = -99999; - if (App::GetGameContext()->GetTerrain()->getWater()) + if (App::GetGameContext()->GetTerrain()->getWater()) + { + wheight = App::GetGameContext()->GetTerrain()->getWater()->CalcWavesHeight(position); + if (position.y < wheight - 1.8f) { - wheight = App::GetGameContext()->GetTerrain()->getWater()->CalcWavesHeight(position); - if (position.y < wheight - 1.8f) - { - position.y = wheight - 1.8f; - m_character_v_speed = 0.0f; - } + position.y = wheight - 1.8f; + m_character_v_speed = 0.0f; } + } - // 0.1 due to 'jumping' from waves -> not nice looking - if (App::GetGameContext()->GetTerrain()->getWater() && (wheight - pheight > 1.8f) && (position.y + 0.1f <= wheight)) - { - isswimming = true; - } + // 0.1 due to 'jumping' from waves -> not nice looking + if (App::GetGameContext()->GetTerrain()->getWater() && (wheight - pheight > 1.8f) && (position.y + 0.1f <= wheight)) + { + isswimming = true; + } - float tmpJoy = 0.0f; - if (m_can_jump) + float tmpJoy = 0.0f; + if (m_can_jump) + { + if (RoR::App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_JUMP)) { - if (RoR::App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_JUMP)) - { - m_character_v_speed = 2.0f; - m_can_jump = false; - } + m_character_v_speed = 2.0f; + m_can_jump = false; } + } - bool idleanim = true; - float tmpGoForward = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_FORWARD) - + RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_ROT_UP); - float tmpGoBackward = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_BACKWARDS) - + RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_ROT_DOWN); - bool not_walking = (tmpGoForward == 0.f && tmpGoBackward == 0.f); + bool idleanim = true; + float tmpGoForward = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_FORWARD) + + RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_ROT_UP); + float tmpGoBackward = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_BACKWARDS) + + RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_ROT_DOWN); + bool not_walking = (tmpGoForward == 0.f && tmpGoBackward == 0.f); - tmpJoy = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_RIGHT); - if (tmpJoy > 0.0f) + tmpJoy = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_RIGHT); + if (tmpJoy > 0.0f) + { + bool alt_pressed = RoR::App::GetInputEngine()->isKeyDown(OIS::KC_LMENU); + float scale = alt_pressed ? 0.1f : 1.0f; + setRotation(m_character_rotation + dt * 2.0f * scale * Radian(tmpJoy)); + if (!isswimming && not_walking) { - float scale = RoR::App::GetInputEngine()->isKeyDown(OIS::KC_LMENU) ? 0.1f : 1.0f; - setRotation(m_character_rotation + dt * 2.0f * scale * Radian(tmpJoy)); - if (!isswimming && not_walking) - { - this->SetLowerAnimState("TurnLeft", -dt); - idleanim = false; - } + BITMASK_SET_1(m_action_flags, Character::ACTION_TURN_RIGHT); + idleanim = false; } + } - tmpJoy = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_LEFT); - if (tmpJoy > 0.0f) + tmpJoy = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_LEFT); + if (tmpJoy > 0.0f) + { + bool alt_pressed = RoR::App::GetInputEngine()->isKeyDown(OIS::KC_LMENU); + float scale = alt_pressed ? 0.1f : 1.0f; + setRotation(m_character_rotation - dt * scale * 2.0f * Radian(tmpJoy)); + if (!isswimming && not_walking) { - float scale = RoR::App::GetInputEngine()->isKeyDown(OIS::KC_LMENU) ? 0.1f : 1.0f; - setRotation(m_character_rotation - dt * scale * 2.0f * Radian(tmpJoy)); - if (!isswimming && not_walking) - { - this->SetLowerAnimState("TurnRight", dt); - idleanim = false; - } + BITMASK_SET_1(m_action_flags, Character::ACTION_TURN_LEFT); + idleanim = false; } + } - float tmpRun = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_RUN); - float accel = 1.0f; + float tmpRun = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_RUN); + float accel = 1.0f; - tmpJoy = accel = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_SIDESTEP_LEFT); - if (tmpJoy > 0.0f) + tmpJoy = accel = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_SIDESTEP_LEFT); + if (tmpJoy > 0.0f) + { + if (tmpRun > 0.0f) + accel = 3.0f * tmpRun; + // animation missing for that + position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() - Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() - Math::HALF_PI)); + if (!isswimming && not_walking) { - if (tmpRun > 0.0f) - accel = 3.0f * tmpRun; - // animation missing for that - position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() - Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() - Math::HALF_PI)); - if (!isswimming && not_walking) - { - this->SetLowerAnimState("Side_step", -dt); - idleanim = false; - } + BITMASK_SET_1(m_action_flags, Character::ACTION_SIDESTEP_LEFT); + idleanim = false; } + } - tmpJoy = accel = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_SIDESTEP_RIGHT); - if (tmpJoy > 0.0f) + tmpJoy = accel = RoR::App::GetInputEngine()->getEventValue(EV_CHARACTER_SIDESTEP_RIGHT); + if (tmpJoy > 0.0f) + { + if (tmpRun > 0.0f) + accel = 3.0f * tmpRun; + // animation missing for that + position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() + Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() + Math::HALF_PI)); + if (!isswimming && not_walking) { - if (tmpRun > 0.0f) - accel = 3.0f * tmpRun; - // animation missing for that - position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() + Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() + Math::HALF_PI)); - if (!isswimming && not_walking) - { - this->SetLowerAnimState("Side_step", dt); - idleanim = false; - } + BITMASK_SET_1(m_action_flags, Character::ACTION_SIDESTEP_LEFT); + idleanim = false; } + } - tmpJoy = accel = tmpGoForward; - float tmpBack = tmpGoBackward; + tmpJoy = accel = tmpGoForward; + float tmpBack = tmpGoBackward; - tmpJoy = std::min(tmpJoy, 1.0f); - tmpBack = std::min(tmpBack, 1.0f); + tmpJoy = std::min(tmpJoy, 1.0f); + tmpBack = std::min(tmpBack, 1.0f); - if (tmpJoy > 0.0f || tmpRun > 0.0f) - { - if (tmpRun > 0.0f) - accel = 3.0f * tmpRun; + if (tmpJoy > 0.0f || tmpRun > 0.0f) + { + if (tmpRun > 0.0f) + accel = 3.0f * tmpRun; - float time = dt * tmpJoy * m_character_h_speed; + float time = dt * tmpJoy * m_character_h_speed; - if (isswimming) - { - this->SetLowerAnimState("Swim_loop", time); - idleanim = false; - } - else - { - if (tmpRun > 0.0f) - { - this->SetLowerAnimState("Run", time); - idleanim = false; - } - else - { - this->SetLowerAnimState("Walk", time); - idleanim = false; - } - } - position += dt * m_character_h_speed * 1.5f * accel * Vector3(cos(m_character_rotation.valueRadians()), 0.0f, sin(m_character_rotation.valueRadians())); - } - else if (tmpBack > 0.0f) + if (isswimming) { - float time = -dt * m_character_h_speed; - if (isswimming) - { - this->SetLowerAnimState("Spot_swim", time); - idleanim = false; - } - else - { - this->SetLowerAnimState("Walk", time); - idleanim = false; - } - position -= dt * m_character_h_speed * tmpBack * Vector3(cos(m_character_rotation.valueRadians()), 0.0f, sin(m_character_rotation.valueRadians())); + idleanim = false; } - - if (idleanim) + else { - if (isswimming) - { - this->SetLowerAnimState("Spot_swim", dt * 2.0f); - } - else + if (tmpRun > 0.0f) { - this->SetLowerAnimState("Idle_sway", dt * 1.0f); + BITMASK_SET_1(m_action_flags, Character::ACTION_RUN); } - } - m_character_position = position; - } - else if (m_actor_coupling) // The character occupies a vehicle or machine - { - // Animation - float angle = m_actor_coupling->ar_hydro_dir_wheel_display * -1.0f; // not getSteeringAngle(), but this, as its smoothed - float anim_time_pos = ((angle + 1.0f) * 0.5f) * m_driving_anim_length; - // prevent animation flickering on the borders: - if (anim_time_pos < 0.01f) - { - anim_time_pos = 0.01f; + idleanim = false; } - if (anim_time_pos > m_driving_anim_length - 0.01f) - { - anim_time_pos = m_driving_anim_length - 0.01f; - } - m_anim_lower_name = "Driving"; - m_anim_lower_time = anim_time_pos; - m_net_last_anim_time = 0.0f; + position += dt * m_character_h_speed * 1.5f * accel * Vector3(cos(m_character_rotation.valueRadians()), 0.0f, sin(m_character_rotation.valueRadians())); } - -#ifdef USE_SOCKETW - if ((App::mp_state->getEnum() == MpState::CONNECTED) && !m_is_remote) + else if (tmpBack > 0.0f) { - this->SendStreamData(); + float time = -dt * m_character_h_speed; + idleanim = false; + position -= dt * m_character_h_speed * tmpBack * Vector3(cos(m_character_rotation.valueRadians()), 0.0f, sin(m_character_rotation.valueRadians())); } -#endif // USE_SOCKETW + + if (tmpGoForward != 0.f) + BITMASK_SET_1(m_action_flags, Character::ACTION_MOVE_FORWARD); + + if (tmpGoBackward != 0.f) + BITMASK_SET_1(m_action_flags, Character::ACTION_MOVE_BACKWARD); + + if (isswimming) + BITMASK_SET_1(m_situation_flags, Character::SITUATION_IN_DEEP_WATER); + else + BITMASK_SET_0(m_situation_flags, Character::SITUATION_IN_DEEP_WATER); + + m_character_position = position; } void Character::move(Vector3 offset) @@ -467,10 +398,8 @@ void Character::SendStreamData() msg.pos_y = m_character_position.y; msg.pos_z = m_character_position.z; msg.rot_angle = m_character_rotation.valueRadians(); - strncpy(msg.anim_name, m_anim_lower_name.c_str(), CHARACTER_ANIM_NAME_LEN); - msg.anim_time = m_anim_lower_time - m_net_last_anim_time; - - m_net_last_anim_time = m_anim_lower_time; + msg.action_flags = m_action_flags; + msg.situation_flags = m_situation_flags; App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA_DISCARDABLE, sizeof(NetCharacterMsgPos), (char*)&msg); #endif // USE_SOCKETW @@ -487,10 +416,8 @@ void Character::receiveStreamData(unsigned int& type, int& source, unsigned int& auto* pos_msg = reinterpret_cast(buffer); this->setPosition(Ogre::Vector3(pos_msg->pos_x, pos_msg->pos_y, pos_msg->pos_z)); this->setRotation(Ogre::Radian(pos_msg->rot_angle)); - if (strnlen(pos_msg->anim_name, CHARACTER_ANIM_NAME_LEN) < CHARACTER_ANIM_NAME_LEN) - { - this->SetUpperAnimState(pos_msg->anim_name, pos_msg->anim_time); - } + m_action_flags = pos_msg->action_flags; + m_situation_flags = pos_msg->situation_flags; } else if (msg->command == CHARACTER_CMD_DETACH) { @@ -529,6 +456,11 @@ void Character::receiveStreamData(unsigned int& type, int& source, unsigned int& void Character::SetActorCoupling(bool enabled, ActorPtr actor) { m_actor_coupling = actor; + if (actor) + BITMASK_SET_1(m_situation_flags, SITUATION_DRIVING); + else + BITMASK_SET_0(m_situation_flags, SITUATION_DRIVING); + #ifdef USE_SOCKETW if (App::mp_state->getEnum() == MpState::CONNECTED && !m_is_remote) { diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 1f2d97c119..72cf90fde0 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -48,69 +48,78 @@ class Character public: + // Action flags + static const BitMask_t ACTION_MOVE_FORWARD = BITMASK(1); + static const BitMask_t ACTION_MOVE_BACKWARD = BITMASK(2); + static const BitMask_t ACTION_TURN_RIGHT = BITMASK(3); + static const BitMask_t ACTION_TURN_LEFT = BITMASK(4); + static const BitMask_t ACTION_SIDESTEP_RIGHT = BITMASK(5); + static const BitMask_t ACTION_SIDESTEP_LEFT = BITMASK(6); + static const BitMask_t ACTION_RUN = BITMASK(7); + static const BitMask_t ACTION_JUMP = BITMASK(8); + static const BitMask_t ACTION_WAVE_HAND = BITMASK(9); + static const BitMask_t ACTION_SLOW_TURN = BITMASK(10); + + // Situation flags + static const BitMask_t SITUATION_ON_SOLID_GROUND = BITMASK(1); + static const BitMask_t SITUATION_IN_SHALLOW_WATER = BITMASK(2); + static const BitMask_t SITUATION_IN_DEEP_WATER = BITMASK(3); + static const BitMask_t SITUATION_IN_AIR = BITMASK(4); + static const BitMask_t SITUATION_DRIVING = BITMASK(5); + Character(int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); - Ogre::UTFString const& GetNetUsername() { return m_net_username; } + // get state + Ogre::Vector3 getPosition(); Ogre::Radian getRotation() const { return m_character_rotation; } ActorPtr GetActorCoupling(); - Ogre::Vector3 getPosition(); void setPosition(Ogre::Vector3 position); void setRotation(Ogre::Radian rotation); void move(Ogre::Vector3 offset); - void update(float dt); + void updateLocal(float dt); + void upateRemote(float dt); void updateCharacterRotation(); void SetActorCoupling(bool enabled, ActorPtr actor); // network void receiveStreamData(unsigned int& type, int& source, unsigned int& streamid, char* buffer); + void SendStreamData(); int getSourceID() const { return m_source_id; } bool isRemote() const { return m_is_remote; } int GetColorNum() const { return m_color_number; } void setColour(int color) { this->m_color_number = color; } - - // anims - std::string const & GetUpperAnimName() const { return m_anim_upper_name; } - float GetUpperAnimTime() const { return m_anim_upper_time; } - std::string const & GetLowerAnimName() const { return m_anim_lower_name; } - float GetLowerAnimTime() const { return m_anim_lower_time; } + Ogre::UTFString const& GetNetUsername() { return m_net_username; } private: void ReportError(const char* detail); - void SendStreamData(); void SendStreamSetup(); - void SetUpperAnimState(std::string mode, float time = 0); - void SetLowerAnimState(std::string mode, float time = 0); - ActorPtr m_actor_coupling; //!< The vehicle or machine which the character occupies + // attributes + std::string m_instance_name; + + // transforms + Ogre::Vector3 m_character_position; + Ogre::Vector3 m_prev_position; Ogre::Radian m_character_rotation; float m_character_h_speed; float m_character_v_speed; - Ogre::Vector3 m_character_position; - Ogre::Vector3 m_prev_position; - bool m_can_jump; - std::string m_instance_name; - // visuals - float m_driving_anim_length; + // state + BitMask_t m_action_flags = 0; + BitMask_t m_situation_flags = 0; + ActorPtr m_actor_coupling; //!< The vehicle or machine which the character occupies // network bool m_is_remote; - float m_net_last_anim_time; int m_color_number; Ogre::UTFString m_net_username; Ogre::Timer m_net_timer; unsigned long m_net_last_update_time; int m_stream_id; int m_source_id; - - // anims - std::string m_anim_upper_name; - float m_anim_upper_time; - std::string m_anim_lower_name; - float m_anim_lower_time; }; /// @} // addtogroup Character diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index d7cca62cbf..40a3a1fa3e 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -79,12 +79,16 @@ void CharacterFactory::removeStreamSource(int sourceid) void CharacterFactory::Update(float dt) { - m_local_character->update(dt); + m_local_character->updateLocal(dt); - for (auto& c : m_remote_characters) +#ifdef USE_SOCKETW + if ((App::mp_state->getEnum() == MpState::CONNECTED) && !m_local_character->isRemote()) { - c->update(dt); + m_local_character->SendStreamData(); } +#endif // USE_SOCKETW + + } void CharacterFactory::UndoRemoteActorCoupling(ActorPtr actor) diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index b50b37a477..f34a1e9a7f 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -2,7 +2,7 @@ This source file is part of Rigs of Rods Copyright 2005-2012 Pierre-Michel Ricordel Copyright 2007-2012 Thomas Fischer - Copyright 2017-2018 Petr Ohlidal + Copyright 2017-2022 Petr Ohlidal For more information, see http://www.rigsofrods.org/ @@ -45,7 +45,6 @@ GfxCharacter::GfxCharacter(Character* character) , xc_instance_name(character->m_instance_name) { Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity(xc_instance_name + "_mesh", "character.mesh"); - character->m_driving_anim_length = entity->getAnimationState("Driving")->getLength(); // fix disappearing mesh AxisAlignedBox aabb; @@ -83,13 +82,12 @@ void RoR::GfxCharacter::BufferSimulationData() xc_simbuf.simbuf_net_username = xc_character->GetNetUsername(); xc_simbuf.simbuf_is_remote = xc_character->isRemote(); xc_simbuf.simbuf_actor_coupling = xc_character->GetActorCoupling(); - xc_simbuf.simbuf_anim_upper_name = xc_character->GetUpperAnimName(); - xc_simbuf.simbuf_anim_upper_time = xc_character->GetUpperAnimTime(); - xc_simbuf.simbuf_anim_lower_name = xc_character->GetLowerAnimName(); - xc_simbuf.simbuf_anim_lower_time = xc_character->GetLowerAnimTime(); + xc_simbuf.simbuf_action_flags = xc_character->m_action_flags; + xc_simbuf.simbuf_situation_flags = xc_character->m_situation_flags; + xc_simbuf.simbuf_character_h_speed = xc_character->m_character_h_speed; } -void RoR::GfxCharacter::UpdateCharacterInScene() +void RoR::GfxCharacter::UpdateCharacterInScene(float dt) { // Actor coupling if (xc_simbuf.simbuf_actor_coupling != xc_simbuf_prev.simbuf_actor_coupling) @@ -149,61 +147,13 @@ void RoR::GfxCharacter::UpdateCharacterInScene() if (!App::GetGuiManager()->CharacterPoseUtil.IsManualPoseActive()) { - // Reset all anims - - - LOG(fmt::format("file:{}, line:{}, func:{}, resetting all animations before update", __FILE__, __LINE__, __FUNCTION__)); - AnimationStateSet* stateset = entity->getAllAnimationStates(); - for (auto& state_pair : stateset->getAnimationStates()) + try { - AnimationState* as = state_pair.second; - as->setEnabled(false); - as->setWeight(0); - LOG(fmt::format("\tanim '{}' was reset", as->getAnimationName())); + this->UpdateAnimations(dt); } - - // upper body anim - if (xc_simbuf.simbuf_anim_upper_name != "") - { - LOG(fmt::format("file:{}, line:{}, func:{}, enabling upper body anim (name '{}', time {})", - __FILE__, __LINE__, __FUNCTION__, - xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time)); - try - { - this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_upper_name), xc_simbuf.simbuf_anim_upper_time); - } - catch (Ogre::Exception& eeh) { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("error updating upper body anim (name '{}', time {}), message:{}", - xc_simbuf.simbuf_anim_upper_name, xc_simbuf.simbuf_anim_upper_time, eeh.getFullDescription())); - } - } - else - { - LOG(fmt::format("file:{}, line:{}, func:{}, no upper body anim requested", - __FILE__, __LINE__, __FUNCTION__)); - } - - // lower body anim - if (xc_simbuf.simbuf_anim_lower_name != "") - { - LOG(fmt::format("file:{}, line:{}, func:{}, enabling lower body anim (name '{}', time {})", - __FILE__, __LINE__, __FUNCTION__, - xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time)); - try - { - this->EnableAnim(entity->getAnimationState(xc_simbuf.simbuf_anim_lower_name), xc_simbuf.simbuf_anim_lower_time); - } - catch (Ogre::Exception& eeh) { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("error updating lower body anim (name '{}', time {}), message:{}", - xc_simbuf.simbuf_anim_lower_name, xc_simbuf.simbuf_anim_lower_time, eeh.getFullDescription())); - } - } - else - { - LOG(fmt::format("file:{}, line:{}, func:{}, no lower body anim requested", - __FILE__, __LINE__, __FUNCTION__)); + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error updating animations, message:{}", eeh.getFullDescription())); } } @@ -236,6 +186,118 @@ void RoR::GfxCharacter::UpdateCharacterInScene() #endif // USE_SOCKETW } +void GfxCharacter::UpdateAnimations(float dt) +{ + // Reset all anims + Ogre::Entity* entity = static_cast(xc_scenenode->getAttachedObject(0)); + AnimationStateSet* stateset = entity->getAllAnimationStates(); + for (auto& state_pair : stateset->getAnimationStates()) + { + AnimationState* as = state_pair.second; + as->setEnabled(false); + as->setWeight(0); + } + + if (BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, Character::SITUATION_DRIVING)) + { + AnimationState* as = entity->getAnimationState("Driving"); + float angle = xc_simbuf.simbuf_actor_coupling->ar_hydro_dir_wheel_display * -1.0f; // not getSteeringAngle(), but this, as its smoothed + float anim_time_pos = ((angle + 1.0f) * 0.5f) * as->getLength(); + // prevent animation flickering on the borders: + if (anim_time_pos < 0.01f) + { + anim_time_pos = 0.01f; + } + if (anim_time_pos > as->getLength() - 0.01f) + { + anim_time_pos = as->getLength() - 0.01f; + } + + as->setTimePosition(anim_time_pos); + as->setWeight(1.f); + as->setEnabled(true); + } + else if (BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, Character::SITUATION_IN_DEEP_WATER)) + { + if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_FORWARD) || + BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_BACKWARD)) + { + AnimationState* as = entity->getAnimationState("Swim_loop"); + as->setTimePosition(as->getTimePosition() + (dt * xc_simbuf.simbuf_character_h_speed)); + as->setWeight(1.f); + as->setEnabled(true); + } + else + { + AnimationState* as = entity->getAnimationState("Spot_swim"); + as->setTimePosition(as->getTimePosition() + dt); + as->setWeight(1.f); + as->setEnabled(true); + } + } + else // solid ground or jumping + { + if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_FORWARD) || + BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_BACKWARD)) + { + AnimationState* as = nullptr; + if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_RUN)) + as = entity->getAnimationState("Run"); + else + as = entity->getAnimationState("Walk"); + + float time = dt * xc_simbuf.simbuf_character_h_speed; + as->setTimePosition(as->getTimePosition() + time); +as->setWeight(1.f); + as->setEnabled(true); + } + else + { + if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_TURN_LEFT)) + { + AnimationState* as = entity->getAnimationState("Turn"); + float time = dt; + if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SLOW_TURN)) + time *= 1.2f; + as->setTimePosition(as->getTimePosition() + time); + as->setWeight(1.f); + as->setEnabled(true); + } + else if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_TURN_RIGHT)) + { + AnimationState* as = entity->getAnimationState("Turn"); + float time = -dt; + if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SLOW_TURN)) + time *= 1.2f; + as->setTimePosition(as->getTimePosition() + time); + as->setWeight(1.f); + as->setEnabled(true); + } + else if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SIDESTEP_RIGHT)) + { + AnimationState* as = entity->getAnimationState("Side_step"); + as->setTimePosition(as->getTimePosition() + dt); + as->setWeight(1.f); + as->setEnabled(true); + } + else if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SIDESTEP_LEFT)) + { + AnimationState* as = entity->getAnimationState("Side_step"); + as->setTimePosition(as->getTimePosition() + -dt); + as->setWeight(1.f); + as->setEnabled(true); + } + else + { + AnimationState* as = entity->getAnimationState("Idle_sway"); + as->setTimePosition(as->getTimePosition() + dt); + as->setWeight(1.f); + as->setEnabled(true); + } + } + } +} + void GfxCharacter::DisableAnim(Ogre::AnimationState* as) { as->setEnabled(false); diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index 230f0a769e..efb7a77380 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -2,7 +2,7 @@ This source file is part of Rigs of Rods Copyright 2005-2012 Pierre-Michel Ricordel Copyright 2007-2012 Thomas Fischer - Copyright 2017-2018 Petr Ohlidal + Copyright 2017-2022 Petr Ohlidal For more information, see http://www.rigsofrods.org/ @@ -40,9 +40,10 @@ struct GfxCharacter ~GfxCharacter(); void BufferSimulationData(); - void UpdateCharacterInScene(); + void UpdateCharacterInScene(float dt); void DisableAnim(Ogre::AnimationState* anim_state); void EnableAnim(Ogre::AnimationState* anim_state, float time); + void UpdateAnimations(float dt); Ogre::SceneNode* xc_scenenode; CharacterSB xc_simbuf; diff --git a/source/main/gfx/GfxScene.cpp b/source/main/gfx/GfxScene.cpp index 690a4c7c1b..4ccdaa36e5 100644 --- a/source/main/gfx/GfxScene.cpp +++ b/source/main/gfx/GfxScene.cpp @@ -204,7 +204,7 @@ void GfxScene::UpdateScene(float dt_sec) // Player avatars for (GfxCharacter* a: m_all_gfx_characters) { - a->UpdateCharacterInScene(); + a->UpdateCharacterInScene(dt_sec); } // Actors - update misc visuals diff --git a/source/main/gfx/SimBuffers.h b/source/main/gfx/SimBuffers.h index ba2db5543a..20a4eb612f 100644 --- a/source/main/gfx/SimBuffers.h +++ b/source/main/gfx/SimBuffers.h @@ -67,18 +67,20 @@ namespace RoR { struct CharacterSB { + // Transforms Ogre::Vector3 simbuf_character_pos; Ogre::Radian simbuf_character_rot; //!< When on foot + float simbuf_character_h_speed; //!< When on foot + + // State + BitMask_t simbuf_action_flags; + BitMask_t simbuf_situation_flags; + ActorPtr simbuf_actor_coupling; + + // Network Ogre::UTFString simbuf_net_username; bool simbuf_is_remote; int simbuf_color_number; - ActorPtr simbuf_actor_coupling; - - // anims - std::string simbuf_anim_upper_name; - float simbuf_anim_upper_time; - std::string simbuf_anim_lower_name; - float simbuf_anim_lower_time; }; struct NodeSB diff --git a/source/main/network/Network.h b/source/main/network/Network.h index 5b88c85260..aef9913e61 100644 --- a/source/main/network/Network.h +++ b/source/main/network/Network.h @@ -73,8 +73,8 @@ struct NetCharacterMsgPos int32_t command; float pos_x, pos_y, pos_z; float rot_angle; - float anim_time; - char anim_name[CHARACTER_ANIM_NAME_LEN]; + uint32_t action_flags; + uint32_t situation_flags; }; struct NetCharacterMsgAttach From 54ae8bf5bb7f34288ae3f21a03548f144c6e80c4 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sat, 24 Sep 2022 01:44:00 +0200 Subject: [PATCH 07/32] Proof of concept: character anim config system. --- source/main/CMakeLists.txt | 2 + source/main/gameplay/Character.cpp | 3 +- source/main/gameplay/Character.h | 6 +- source/main/gameplay/CharacterFactory.cpp | 173 +++++++++++++++++- source/main/gameplay/CharacterFactory.h | 5 +- source/main/gfx/GfxCharacter.cpp | 155 +++++++--------- source/main/gfx/GfxCharacter.h | 2 + .../CharacterDefFileFormat.h | 74 ++++++++ 8 files changed, 321 insertions(+), 99 deletions(-) create mode 100644 source/main/resources/character_def_fileformat/CharacterDefFileFormat.h diff --git a/source/main/CMakeLists.txt b/source/main/CMakeLists.txt index dc3a65c185..dcb39153ec 100644 --- a/source/main/CMakeLists.txt +++ b/source/main/CMakeLists.txt @@ -193,6 +193,7 @@ set(SOURCE_FILES resources/skin_fileformat/SkinFileFormat.{h,cpp} resources/terrn2_fileformat/Terrn2FileFormat.{h,cpp} resources/tobj_fileformat/TObjFileFormat.{h,cpp} + resources/character_def_fileformat/CharacterDefFileFormat.h system/AppCommandLine.cpp system/AppConfig.cpp system/Console.{h,cpp} @@ -343,6 +344,7 @@ target_include_directories(${BINNAME} PRIVATE physics/utils physics/water resources + resources/character_def_fileformat resources/odef_fileformat/ resources/otc_fileformat/ resources/rig_def_fileformat diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index a8149625dd..81023bb73d 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -39,7 +39,7 @@ using namespace Ogre; using namespace RoR; -Character::Character(int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : +Character::Character(CharacterDefPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) , m_character_rotation(0.0f) , m_character_h_speed(2.0f) @@ -50,6 +50,7 @@ Character::Character(int source, unsigned int streamid, UTFString player_name, i , m_is_remote(is_remote) , m_source_id(source) , m_stream_id(streamid) + , m_character_def(def) { static int id_counter = 0; m_instance_name = "Character" + TOSTRING(id_counter); diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 72cf90fde0..05960999f4 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -22,6 +22,7 @@ #pragma once +#include "CharacterDefFileFormat.h" #include "ForwardDeclarations.h" #include "SimBuffers.h" @@ -37,6 +38,7 @@ namespace RoR { /// @addtogroup Character /// @{ +/// /// Character uses simplified physics and occupies single point in space. /// Note on animations: @@ -67,7 +69,7 @@ class Character static const BitMask_t SITUATION_IN_AIR = BITMASK(4); static const BitMask_t SITUATION_DRIVING = BITMASK(5); - Character(int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); + Character(CharacterDefPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); // get state @@ -79,7 +81,6 @@ class Character void setRotation(Ogre::Radian rotation); void move(Ogre::Vector3 offset); void updateLocal(float dt); - void upateRemote(float dt); void updateCharacterRotation(); void SetActorCoupling(bool enabled, ActorPtr actor); @@ -98,6 +99,7 @@ class Character void SendStreamSetup(); // attributes + CharacterDefPtr m_character_def; std::string m_instance_name; // transforms diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 40a3a1fa3e..236d4a581d 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -29,6 +29,175 @@ using namespace RoR; +CharacterFactory::CharacterFactory() +{ + // set up definitions + // NOTE each anim is evaluated separately, there is no either-or relation, + // so you must set each anim's conditions to avoid conflicts. + + CharacterDefPtr rorbot = std::make_shared(); + rorbot->mesh_name = "character.mesh"; + rorbot->name = "Classic RORBot"; + + { // driving + CharacterAnimDef def; + BITMASK_SET_1(def.for_situations, Character::SITUATION_DRIVING); + def.anim_name = "Driving"; + def.playback_time_ratio = 0.f; + def.playback_steering_ratio = -1.f; + def.anim_continuous = false; + def.source_percentual = true; + def.anim_neutral_mid = true; + def.playback_trim = 0.01f; + rorbot->anims.push_back(def); + } + + { // swimming + CharacterAnimDef def; + BITMASK_SET_1(def.for_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); + def.anim_name = "Swim_loop"; + def.playback_h_speed_ratio = 1.f; + def.playback_time_ratio = 1.f; + rorbot->anims.push_back(def); + } + + { // floating in water + CharacterAnimDef def; + BITMASK_SET_1(def.for_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); + def.anim_name = "Spot_swim"; + def.playback_time_ratio = 1.f; + rorbot->anims.push_back(def); + } + + { // running + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.for_actions, Character::ACTION_RUN); + def.anim_name = "Run"; + def.playback_time_ratio = 1.f; + def.playback_h_speed_ratio = 1.f; + rorbot->anims.push_back(def); + } + + { // walking forward + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); + def.anim_name = "Walk"; + def.playback_time_ratio = 1.f; + def.playback_h_speed_ratio = 1.f; + rorbot->anims.push_back(def); + } + + { // walking backward + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_BACKWARD); + def.anim_name = "Walk"; + def.playback_time_ratio = -1.f; + def.playback_h_speed_ratio = 1.f; + rorbot->anims.push_back(def); + } + + { // side stepping left (-time) + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); + def.anim_name = "Side_step"; + def.playback_time_ratio = -1.f; + rorbot->anims.push_back(def); + } + + { // side stepping right (+time) + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_SIDESTEP_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); + def.anim_name = "Side_step"; + def.playback_time_ratio = 1.f; + rorbot->anims.push_back(def); + } + + { // side stepping left (-time) + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_SIDESTEP_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); + def.anim_name = "Side_step"; + def.playback_time_ratio = -1.f; + rorbot->anims.push_back(def); + } + + { // turning left (+time) + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); + def.anim_name = "Turn"; + def.playback_time_ratio = 1.f; + rorbot->anims.push_back(def); + } + + { // turning right (-time) + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); + def.anim_name = "Turn"; + def.playback_time_ratio = -1.f; + rorbot->anims.push_back(def); + } + + { // idle + CharacterAnimDef def; + BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); + BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_LEFT); + BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_RIGHT); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); + BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); + def.anim_name = "Idle_sway"; + def.playback_time_ratio = 1.f; + rorbot->anims.push_back(def); + } + + m_character_defs.push_back(rorbot); +} + Character* CharacterFactory::CreateLocalCharacter() { int colourNum = -1; @@ -43,7 +212,7 @@ Character* CharacterFactory::CreateLocalCharacter() } #endif // USE_SOCKETW - m_local_character = std::unique_ptr(new Character(-1, 0, playerName, colourNum, false)); + m_local_character = std::unique_ptr(new Character(m_character_defs[0], -1, 0, playerName, colourNum, false)); App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); return m_local_character.get(); } @@ -58,7 +227,7 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) LOG(" new character for " + TOSTRING(sourceid) + ":" + TOSTRING(streamid) + ", colour: " + TOSTRING(colour)); - Character* ch = new Character(sourceid, streamid, name, colour, true); + Character* ch = new Character(m_character_defs[0], sourceid, streamid, name, colour, true); App::GetGfxScene()->RegisterGfxCharacter(ch); m_remote_characters.push_back(std::unique_ptr(ch)); #endif // USE_SOCKETW diff --git a/source/main/gameplay/CharacterFactory.h b/source/main/gameplay/CharacterFactory.h index 2ddde2794d..17873e61fd 100644 --- a/source/main/gameplay/CharacterFactory.h +++ b/source/main/gameplay/CharacterFactory.h @@ -24,6 +24,7 @@ #include "Application.h" #include "Character.h" +#include "CharacterDefFileFormat.h" #include "Network.h" #include @@ -39,7 +40,7 @@ namespace RoR { class CharacterFactory { public: - CharacterFactory() {} + CharacterFactory(); Character* CreateLocalCharacter(); Character* GetLocalCharacter() { return m_local_character.get(); } void DeleteAllCharacters(); @@ -51,6 +52,8 @@ class CharacterFactory private: + std::vector m_character_defs; + std::unique_ptr m_local_character; std::vector> m_remote_characters; diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index f34a1e9a7f..eb7c47ddbc 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -186,115 +186,84 @@ void RoR::GfxCharacter::UpdateCharacterInScene(float dt) #endif // USE_SOCKETW } -void GfxCharacter::UpdateAnimations(float dt) +void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) { - // Reset all anims + // Test if applicable. + if (//(def.for_situations != 0 && BITMASK_IS_0(xc_simbuf.simbuf_situation_flags, def.for_situations)) || // some situations are specified, but none of the situations matches + (!BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, def.for_situations)) || // not all situation flags are satisified + (xc_simbuf.simbuf_situation_flags & def.except_situations) || // any of the forbidden situation matches + //(def.for_actions != 0 && BITMASK_IS_0(xc_simbuf.simbuf_action_flags, def.for_actions)) || // some actions are specified, but none of the actions matches + (!BITMASK_IS_1(xc_simbuf.simbuf_action_flags, def.for_actions)) || // not all action flags are satisfied + (xc_simbuf.simbuf_action_flags & def.except_actions)) // any of the forbidden situation matches + { + return; + } + Ogre::Entity* entity = static_cast(xc_scenenode->getAttachedObject(0)); - AnimationStateSet* stateset = entity->getAllAnimationStates(); - for (auto& state_pair : stateset->getAnimationStates()) + AnimationState* as = entity->getAnimationState(def.anim_name); + + // Query data sources. + float timepos = 1.f; + if (def.playback_time_ratio != 0.f) { - AnimationState* as = state_pair.second; - as->setEnabled(false); - as->setWeight(0); + timepos *= (def.playback_time_ratio * dt); + } + if (def.playback_h_speed_ratio != 0.f) + { + timepos *= (def.playback_h_speed_ratio * xc_simbuf.simbuf_character_h_speed); + } + if (def.playback_steering_ratio != 0.f && xc_simbuf.simbuf_actor_coupling) + { + timepos *= (def.playback_steering_ratio * xc_simbuf.simbuf_actor_coupling->ar_hydro_dir_wheel_display); } - if (BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, Character::SITUATION_DRIVING)) + // Transform the anim pos. + if (def.source_percentual) { - AnimationState* as = entity->getAnimationState("Driving"); - float angle = xc_simbuf.simbuf_actor_coupling->ar_hydro_dir_wheel_display * -1.0f; // not getSteeringAngle(), but this, as its smoothed - float anim_time_pos = ((angle + 1.0f) * 0.5f) * as->getLength(); - // prevent animation flickering on the borders: - if (anim_time_pos < 0.01f) + if (def.anim_neutral_mid) { - anim_time_pos = 0.01f; + timepos = (timepos + 1.0f) * 0.5f; } - if (anim_time_pos > as->getLength() - 0.01f) - { - anim_time_pos = as->getLength() - 0.01f; - } - - as->setTimePosition(anim_time_pos); - as->setWeight(1.f); - as->setEnabled(true); + timepos *= as->getLength(); } - else if (BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, Character::SITUATION_IN_DEEP_WATER)) + if (def.playback_trim > 0.f) { - if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_FORWARD) || - BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_BACKWARD)) + // prevent animation flickering on the borders: + if (timepos < def.playback_trim) { - AnimationState* as = entity->getAnimationState("Swim_loop"); - as->setTimePosition(as->getTimePosition() + (dt * xc_simbuf.simbuf_character_h_speed)); - as->setWeight(1.f); - as->setEnabled(true); + timepos = def.playback_trim; } - else + if (timepos > as->getLength() - def.playback_trim) { - AnimationState* as = entity->getAnimationState("Spot_swim"); - as->setTimePosition(as->getTimePosition() + dt); - as->setWeight(1.f); - as->setEnabled(true); + timepos = as->getLength() - def.playback_trim; } } - else // solid ground or jumping + if (def.anim_continuous) { - if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_FORWARD) || - BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_MOVE_BACKWARD)) - { - AnimationState* as = nullptr; - if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_RUN)) - as = entity->getAnimationState("Run"); - else - as = entity->getAnimationState("Walk"); - - float time = dt * xc_simbuf.simbuf_character_h_speed; - as->setTimePosition(as->getTimePosition() + time); -as->setWeight(1.f); - as->setEnabled(true); - } - else - { - if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_TURN_LEFT)) - { - AnimationState* as = entity->getAnimationState("Turn"); - float time = dt; - if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SLOW_TURN)) - time *= 1.2f; - as->setTimePosition(as->getTimePosition() + time); - as->setWeight(1.f); - as->setEnabled(true); - } - else if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_TURN_RIGHT)) - { - AnimationState* as = entity->getAnimationState("Turn"); - float time = -dt; - if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SLOW_TURN)) - time *= 1.2f; - as->setTimePosition(as->getTimePosition() + time); - as->setWeight(1.f); - as->setEnabled(true); - } - else if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SIDESTEP_RIGHT)) - { - AnimationState* as = entity->getAnimationState("Side_step"); - as->setTimePosition(as->getTimePosition() + dt); - as->setWeight(1.f); - as->setEnabled(true); - } - else if (BITMASK_IS_1(xc_simbuf.simbuf_action_flags, Character::ACTION_SIDESTEP_LEFT)) - { - AnimationState* as = entity->getAnimationState("Side_step"); - as->setTimePosition(as->getTimePosition() + -dt); - as->setWeight(1.f); - as->setEnabled(true); - } - else - { - AnimationState* as = entity->getAnimationState("Idle_sway"); - as->setTimePosition(as->getTimePosition() + dt); - as->setWeight(1.f); - as->setEnabled(true); - } - } + timepos += as->getTimePosition(); + } + + // Update the OGRE object + as->setTimePosition(timepos); + as->setWeight(def.weight); + as->setEnabled(true); +} + +void GfxCharacter::UpdateAnimations(float dt) +{ + // Reset all anims + Ogre::Entity* entity = static_cast(xc_scenenode->getAttachedObject(0)); + AnimationStateSet* stateset = entity->getAllAnimationStates(); + for (auto& state_pair : stateset->getAnimationStates()) + { + AnimationState* as = state_pair.second; + as->setEnabled(false); + as->setWeight(0); + } + + for (CharacterAnimDef const& def : xc_character->m_character_def->anims) + { + this->EvaluateAnimDef(def, dt); } } diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index efb7a77380..f1ca90c0e2 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -21,6 +21,7 @@ #pragma once +#include "CharacterDefFileFormat.h" #include "ForwardDeclarations.h" #include "SimBuffers.h" @@ -44,6 +45,7 @@ struct GfxCharacter void DisableAnim(Ogre::AnimationState* anim_state); void EnableAnim(Ogre::AnimationState* anim_state, float time); void UpdateAnimations(float dt); + void EvaluateAnimDef(CharacterAnimDef const& def, float dt); Ogre::SceneNode* xc_scenenode; CharacterSB xc_simbuf; diff --git a/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h b/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h new file mode 100644 index 0000000000..daa4881688 --- /dev/null +++ b/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h @@ -0,0 +1,74 @@ +/* + This source file is part of Rigs of Rods + Copyright 2005-2012 Pierre-Michel Ricordel + Copyright 2007-2012 Thomas Fischer + Copyright 2013-2022 Petr Ohlidal + + For more information, see http://www.rigsofrods.org/ + + Rigs of Rods is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3, as + published by the Free Software Foundation. + + Rigs of Rods is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Rigs of Rods. If not, see . +*/ + +#pragma once + +#include "BitFlags.h" + +#include +#include +#include + +namespace RoR { + +/// @addtogroup Gameplay +/// @{ + +/// @addtogroup Character +/// @{ + +struct CharacterAnimDef +{ + std::string anim_name; //!< Name of the skeletal animation from OGRE's *.skeleton file. + std::string description; //!< Internal game name. + + // Conditions + BitMask_t for_situations = 0; //!< Character::SITUATION_, all must be satisfied. + BitMask_t except_situations = 0; //!< Character::SITUATION_, none must be satisfied. + BitMask_t for_actions = 0; //!< Character::ACTION_, all must be satisfied. + BitMask_t except_actions = 0; //!< Character::ACTION_, none must be satisfied. + + // Anim position calculation + float playback_time_ratio = 0.f; //!< How much elapsed time affects animation position. + float playback_h_speed_ratio = 0.f; //!< How much horizontal movement speed affects animation position. + float playback_steering_ratio = 0.f; //!< How much vehicle steering angle affects animation position. + bool anim_continuous = true; //!< Should animation keep advancing and looping, or should it be set to exact position? + bool anim_neutral_mid = false; //!< Does the anim have the 'neutral' position in it's middle (such as steering left/right) instead of at start? Only effective together with "percentual". + bool source_percentual = false; //!< Is the position source value a percentage of animation length? + float playback_trim = 0.0f; //!< How much to trim the animation position. Useful for i.e. steering animation to avoid flickering. + + // Anim blending weight + float weight = 1.0f; +}; + +struct CharacterDef +{ + std::string name; + std::string mesh_name; + std::vector anims; +}; + +typedef std::shared_ptr CharacterDefPtr; + +/// @} // addtogroup Character +/// @} // addtogroup Gameplay + +} // namespace RoR \ No newline at end of file From 8a22acb1aa52b6c892101a58ff99a099560db92c Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sat, 24 Sep 2022 13:04:05 +0200 Subject: [PATCH 08/32] Character anims: added auto-restart option --- source/main/gameplay/CharacterFactory.cpp | 4 ++++ source/main/gfx/GfxCharacter.cpp | 8 ++++++++ .../character_def_fileformat/CharacterDefFileFormat.h | 1 + 3 files changed, 13 insertions(+) diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 236d4a581d..0452731806 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -131,6 +131,7 @@ CharacterFactory::CharacterFactory() BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); def.anim_name = "Side_step"; def.playback_time_ratio = 1.f; + def.anim_autorestart = true; rorbot->anims.push_back(def); } @@ -146,6 +147,7 @@ CharacterFactory::CharacterFactory() BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); def.anim_name = "Side_step"; def.playback_time_ratio = -1.f; + def.anim_autorestart = true; rorbot->anims.push_back(def); } @@ -161,6 +163,7 @@ CharacterFactory::CharacterFactory() BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); def.anim_name = "Turn"; def.playback_time_ratio = 1.f; + def.anim_autorestart = true; rorbot->anims.push_back(def); } @@ -176,6 +179,7 @@ CharacterFactory::CharacterFactory() BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); def.anim_name = "Turn"; def.playback_time_ratio = -1.f; + def.anim_autorestart = true; rorbot->anims.push_back(def); } diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index eb7c47ddbc..bcf1b39683 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -238,6 +238,14 @@ void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) timepos = as->getLength() - def.playback_trim; } } + if (def.anim_autorestart) + { + // If the animation was just activated, start from 0. + if (!BITMASK_IS_1(xc_simbuf_prev.simbuf_action_flags, def.for_actions)) + { + as->setTimePosition(0.f); + } + } if (def.anim_continuous) { timepos += as->getTimePosition(); diff --git a/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h b/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h index daa4881688..da711528ac 100644 --- a/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h +++ b/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h @@ -51,6 +51,7 @@ struct CharacterAnimDef float playback_h_speed_ratio = 0.f; //!< How much horizontal movement speed affects animation position. float playback_steering_ratio = 0.f; //!< How much vehicle steering angle affects animation position. bool anim_continuous = true; //!< Should animation keep advancing and looping, or should it be set to exact position? + bool anim_autorestart = false; //!< Should animation always restart from 0 when activated? bool anim_neutral_mid = false; //!< Does the anim have the 'neutral' position in it's middle (such as steering left/right) instead of at start? Only effective together with "percentual". bool source_percentual = false; //!< Is the position source value a percentage of animation length? float playback_trim = 0.0f; //!< How much to trim the animation position. Useful for i.e. steering animation to avoid flickering. From d72d08ebdd44d2fe80ec4fcf7d824adfe55f22b1 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sat, 24 Sep 2022 13:48:20 +0200 Subject: [PATCH 09/32] Fixed duplicate sidestep anim, conflicting with turn. --- source/main/gameplay/CharacterFactory.cpp | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 0452731806..fff297a2e1 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -106,19 +106,6 @@ CharacterFactory::CharacterFactory() rorbot->anims.push_back(def); } - { // side stepping left (-time) - CharacterAnimDef def; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); - def.anim_name = "Side_step"; - def.playback_time_ratio = -1.f; - rorbot->anims.push_back(def); - } - { // side stepping right (+time) CharacterAnimDef def; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); From 86e9b8ef5ade19e545c1490a814acda24c76316e Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sat, 24 Sep 2022 16:50:10 +0200 Subject: [PATCH 10/32] Added CharacterPoseUtil/"Game anims" debug UI. Top menubar => tools => Character pose util => tab "Game animations" It also wonderfully explains how the new animation definition system works. - Red flags block the animation. - Green flags let the animation run. - Yellow flags let the animation run, but some are missing or the animation is blocked. - Dark blue flags mean nothing blocks the animation. --- source/main/gameplay/Character.cpp | 53 ++++++ source/main/gameplay/Character.h | 35 ++-- source/main/gameplay/CharacterFactory.cpp | 46 +++-- source/main/gfx/GfxCharacter.cpp | 29 +++- .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 162 ++++++++++++++++-- .../main/gui/panels/GUI_CharacterPoseUtil.h | 36 +++- .../CharacterDefFileFormat.h | 13 +- 7 files changed, 331 insertions(+), 43 deletions(-) diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index 81023bb73d..06c727eb2c 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -486,3 +486,56 @@ void Character::SetActorCoupling(bool enabled, ActorPtr actor) ActorPtr Character::GetActorCoupling() { return m_actor_coupling; } +const char* Character::ActionFlagToString(BitMask_t action) +{ + if (BITMASK_IS_1(action, ACTION_MOVE_FORWARD )) { return "ACTION_MOVE_FORWARD"; } + if (BITMASK_IS_1(action, ACTION_MOVE_BACKWARD )) { return "ACTION_MOVE_BACKWARD"; } + if (BITMASK_IS_1(action, ACTION_TURN_RIGHT )) { return "ACTION_TURN_RIGHT"; } + if (BITMASK_IS_1(action, ACTION_TURN_LEFT )) { return "ACTION_TURN_LEFT"; } + if (BITMASK_IS_1(action, ACTION_SIDESTEP_RIGHT)) { return "ACTION_SIDESTEP_RIGHT"; } + if (BITMASK_IS_1(action, ACTION_SIDESTEP_LEFT )) { return "ACTION_SIDESTEP_LEFT"; } + if (BITMASK_IS_1(action, ACTION_RUN )) { return "ACTION_RUN"; } + if (BITMASK_IS_1(action, ACTION_JUMP )) { return "ACTION_JUMP"; } + if (BITMASK_IS_1(action, ACTION_WAVE_HAND )) { return "ACTION_WAVE_HAND"; } + if (BITMASK_IS_1(action, ACTION_SLOW_TURN )) { return "ACTION_SLOW_TURN"; } + + return "~"; +} + +BitMask_t Character::ActionFlagFromString(std::string const& str) +{ + if (str == "ACTION_MOVE_FORWARD" ) { return ACTION_MOVE_FORWARD ;} + if (str == "ACTION_MOVE_BACKWARD" ) { return ACTION_MOVE_BACKWARD ;} + if (str == "ACTION_TURN_RIGHT" ) { return ACTION_TURN_RIGHT ;} + if (str == "ACTION_TURN_LEFT" ) { return ACTION_TURN_LEFT ;} + if (str == "ACTION_SIDESTEP_RIGHT" ) { return ACTION_SIDESTEP_RIGHT;} + if (str == "ACTION_SIDESTEP_LEFT" ) { return ACTION_SIDESTEP_LEFT ;} + if (str == "ACTION_RUN" ) { return ACTION_RUN ;} + if (str == "ACTION_JUMP" ) { return ACTION_JUMP ;} + if (str == "ACTION_WAVE_HAND" ) { return ACTION_WAVE_HAND ;} + if (str == "ACTION_SLOW_TURN" ) { return ACTION_SLOW_TURN ;} + + return 0; +} + +const char* Character::SituationFlagToString(BitMask_t mask) +{ + if (BITMASK_IS_1(mask, SITUATION_ON_SOLID_GROUND )) { return "SITUATION_ON_SOLID_GROUND"; } + if (BITMASK_IS_1(mask, SITUATION_IN_SHALLOW_WATER)) { return "SITUATION_IN_SHALLOW_WATER"; } + if (BITMASK_IS_1(mask, SITUATION_IN_DEEP_WATER )) { return "SITUATION_IN_DEEP_WATER"; } + if (BITMASK_IS_1(mask, SITUATION_IN_AIR )) { return "SITUATION_IN_AIR"; } + if (BITMASK_IS_1(mask, SITUATION_DRIVING )) { return "SITUATION_DRIVING"; } + + return "~"; +} + +BitMask_t Character::SituationFlagFromString(std::string const& str) +{ + if (str == "SITUATION_ON_SOLID_GROUND") { return SITUATION_ON_SOLID_GROUND; } + if (str == "SITUATION_IN_SHALLOW_WATER") { return SITUATION_IN_SHALLOW_WATER; } + if (str == "SITUATION_IN_DEEP_WATER") { return SITUATION_IN_DEEP_WATER; } + if (str == "SITUATION_IN_AIR") { return SITUATION_IN_AIR; } + if (str == "SITUATION_DRIVING") { return SITUATION_DRIVING; } + + return 0; +} \ No newline at end of file diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 05960999f4..eaa5c49fd3 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -51,26 +51,35 @@ class Character public: // Action flags - static const BitMask_t ACTION_MOVE_FORWARD = BITMASK(1); - static const BitMask_t ACTION_MOVE_BACKWARD = BITMASK(2); - static const BitMask_t ACTION_TURN_RIGHT = BITMASK(3); - static const BitMask_t ACTION_TURN_LEFT = BITMASK(4); + static const BitMask_t ACTION_MOVE_FORWARD = BITMASK(1); + static const BitMask_t ACTION_MOVE_BACKWARD = BITMASK(2); + static const BitMask_t ACTION_TURN_RIGHT = BITMASK(3); + static const BitMask_t ACTION_TURN_LEFT = BITMASK(4); static const BitMask_t ACTION_SIDESTEP_RIGHT = BITMASK(5); - static const BitMask_t ACTION_SIDESTEP_LEFT = BITMASK(6); - static const BitMask_t ACTION_RUN = BITMASK(7); - static const BitMask_t ACTION_JUMP = BITMASK(8); - static const BitMask_t ACTION_WAVE_HAND = BITMASK(9); - static const BitMask_t ACTION_SLOW_TURN = BITMASK(10); + static const BitMask_t ACTION_SIDESTEP_LEFT = BITMASK(6); + static const BitMask_t ACTION_RUN = BITMASK(7); + static const BitMask_t ACTION_JUMP = BITMASK(8); + static const BitMask_t ACTION_WAVE_HAND = BITMASK(9); + static const BitMask_t ACTION_SLOW_TURN = BITMASK(10); + + static const char* ActionFlagToString(BitMask_t single_action_flag); + static BitMask_t ActionFlagFromString(std::string const& single_action_flag_str); // Situation flags - static const BitMask_t SITUATION_ON_SOLID_GROUND = BITMASK(1); + static const BitMask_t SITUATION_ON_SOLID_GROUND = BITMASK(1); static const BitMask_t SITUATION_IN_SHALLOW_WATER = BITMASK(2); - static const BitMask_t SITUATION_IN_DEEP_WATER = BITMASK(3); - static const BitMask_t SITUATION_IN_AIR = BITMASK(4); - static const BitMask_t SITUATION_DRIVING = BITMASK(5); + static const BitMask_t SITUATION_IN_DEEP_WATER = BITMASK(3); + static const BitMask_t SITUATION_IN_AIR = BITMASK(4); + static const BitMask_t SITUATION_DRIVING = BITMASK(5); + + static const char* SituationFlagToString(BitMask_t single_situation_flag); + static BitMask_t SituationFlagFromString(std::string const& single_situation_flag_str); Character(CharacterDefPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); + + // get info + CharacterDefPtr getCharacterDef() { return m_character_def; } // get state Ogre::Vector3 getPosition(); diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index fff297a2e1..27f6e1c26e 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -35,12 +35,15 @@ CharacterFactory::CharacterFactory() // NOTE each anim is evaluated separately, there is no either-or relation, // so you must set each anim's conditions to avoid conflicts. + static int id_counter = 0; + CharacterDefPtr rorbot = std::make_shared(); rorbot->mesh_name = "character.mesh"; rorbot->name = "Classic RORBot"; - { // driving + { CharacterAnimDef def; + def.game_description = "driving"; BITMASK_SET_1(def.for_situations, Character::SITUATION_DRIVING); def.anim_name = "Driving"; def.playback_time_ratio = 0.f; @@ -49,30 +52,36 @@ CharacterFactory::CharacterFactory() def.source_percentual = true; def.anim_neutral_mid = true; def.playback_trim = 0.01f; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // swimming + { CharacterAnimDef def; + def.game_description = "swimming"; BITMASK_SET_1(def.for_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); def.anim_name = "Swim_loop"; def.playback_h_speed_ratio = 1.f; def.playback_time_ratio = 1.f; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // floating in water + { CharacterAnimDef def; + def.game_description = "swimming on spot"; BITMASK_SET_1(def.for_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); def.anim_name = "Spot_swim"; def.playback_time_ratio = 1.f; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // running + { CharacterAnimDef def; + def.game_description = "running"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); @@ -80,11 +89,13 @@ CharacterFactory::CharacterFactory() def.anim_name = "Run"; def.playback_time_ratio = 1.f; def.playback_h_speed_ratio = 1.f; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // walking forward + { CharacterAnimDef def; + def.game_description = "walking forward"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); @@ -92,22 +103,26 @@ CharacterFactory::CharacterFactory() def.anim_name = "Walk"; def.playback_time_ratio = 1.f; def.playback_h_speed_ratio = 1.f; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // walking backward + { CharacterAnimDef def; + def.game_description = "walking backward"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_BACKWARD); def.anim_name = "Walk"; def.playback_time_ratio = -1.f; def.playback_h_speed_ratio = 1.f; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // side stepping right (+time) + { CharacterAnimDef def; + def.game_description = "side stepping right"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.for_actions, Character::ACTION_SIDESTEP_RIGHT); @@ -119,11 +134,13 @@ CharacterFactory::CharacterFactory() def.anim_name = "Side_step"; def.playback_time_ratio = 1.f; def.anim_autorestart = true; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // side stepping left (-time) + { CharacterAnimDef def; + def.game_description = "side stepping left"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.for_actions, Character::ACTION_SIDESTEP_LEFT); @@ -135,11 +152,13 @@ CharacterFactory::CharacterFactory() def.anim_name = "Side_step"; def.playback_time_ratio = -1.f; def.anim_autorestart = true; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // turning left (+time) + { CharacterAnimDef def; + def.game_description = "turning left"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_LEFT); @@ -151,11 +170,13 @@ CharacterFactory::CharacterFactory() def.anim_name = "Turn"; def.playback_time_ratio = 1.f; def.anim_autorestart = true; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // turning right (-time) + { CharacterAnimDef def; + def.game_description = "turning right"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_RIGHT); @@ -167,11 +188,13 @@ CharacterFactory::CharacterFactory() def.anim_name = "Turn"; def.playback_time_ratio = -1.f; def.anim_autorestart = true; + def.game_id = id_counter++; rorbot->anims.push_back(def); } - { // idle + { CharacterAnimDef def; + def.game_description = "idle standing"; BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_RIGHT); @@ -183,6 +206,7 @@ CharacterFactory::CharacterFactory() BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); def.anim_name = "Idle_sway"; def.playback_time_ratio = 1.f; + def.game_id = id_counter++; rorbot->anims.push_back(def); } diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index bcf1b39683..03f166ca7c 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -30,6 +30,7 @@ #include "GameContext.h" #include "GfxScene.h" #include "GUIManager.h" +#include "GUI_CharacterPoseUtil.h" #include "InputEngine.h" #include "MovableText.h" #include "Network.h" @@ -44,7 +45,7 @@ GfxCharacter::GfxCharacter(Character* character) : xc_character(character) , xc_instance_name(character->m_instance_name) { - Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity(xc_instance_name + "_mesh", "character.mesh"); + Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity(xc_instance_name + "_mesh", xc_character->m_character_def->mesh_name); // fix disappearing mesh AxisAlignedBox aabb; @@ -61,6 +62,12 @@ GfxCharacter::GfxCharacter(Character* character) MaterialPtr mat1 = MaterialManager::getSingleton().getByName("tracks/character"); MaterialPtr mat2 = mat1->clone("tracks/" + xc_instance_name); entity->setMaterialName("tracks/" + xc_instance_name); + + // setup diagnostic UI + for (CharacterAnimDef const& def : xc_character->m_character_def->anims) + { + App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.game_id] = CharacterAnimDbg(); + } } RoR::GfxCharacter::~GfxCharacter() @@ -188,14 +195,19 @@ void RoR::GfxCharacter::UpdateCharacterInScene(float dt) void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) { + CharacterAnimDbg dbg; + // Test if applicable. - if (//(def.for_situations != 0 && BITMASK_IS_0(xc_simbuf.simbuf_situation_flags, def.for_situations)) || // some situations are specified, but none of the situations matches - (!BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, def.for_situations)) || // not all situation flags are satisified + if ((!BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, def.for_situations)) || // not all situation flags are satisified (xc_simbuf.simbuf_situation_flags & def.except_situations) || // any of the forbidden situation matches - //(def.for_actions != 0 && BITMASK_IS_0(xc_simbuf.simbuf_action_flags, def.for_actions)) || // some actions are specified, but none of the actions matches (!BITMASK_IS_1(xc_simbuf.simbuf_action_flags, def.for_actions)) || // not all action flags are satisfied (xc_simbuf.simbuf_action_flags & def.except_actions)) // any of the forbidden situation matches { + dbg.blocking_situations = xc_simbuf.simbuf_situation_flags & def.except_situations; + dbg.blocking_actions = xc_simbuf.simbuf_action_flags & def.except_actions; + dbg.missing_situations = def.for_situations & ~xc_simbuf.simbuf_situation_flags; + dbg.missing_actions = def.for_actions & ~xc_simbuf.simbuf_action_flags; + App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.game_id] = dbg; return; } @@ -207,14 +219,20 @@ void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) if (def.playback_time_ratio != 0.f) { timepos *= (def.playback_time_ratio * dt); + dbg.source_dt = dt; + dbg.input_dt = (def.playback_time_ratio * dt); } if (def.playback_h_speed_ratio != 0.f) { timepos *= (def.playback_h_speed_ratio * xc_simbuf.simbuf_character_h_speed); + dbg.source_hspeed = xc_simbuf.simbuf_character_h_speed; + dbg.input_hspeed = (def.playback_h_speed_ratio * xc_simbuf.simbuf_character_h_speed); } if (def.playback_steering_ratio != 0.f && xc_simbuf.simbuf_actor_coupling) { timepos *= (def.playback_steering_ratio * xc_simbuf.simbuf_actor_coupling->ar_hydro_dir_wheel_display); + dbg.source_steering = xc_simbuf.simbuf_actor_coupling->ar_hydro_dir_wheel_display; + dbg.input_steering = (def.playback_steering_ratio * xc_simbuf.simbuf_actor_coupling->ar_hydro_dir_wheel_display); } // Transform the anim pos. @@ -255,6 +273,9 @@ void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) as->setTimePosition(timepos); as->setWeight(def.weight); as->setEnabled(true); + + dbg.active = true; + App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.game_id] = dbg; } void GfxCharacter::UpdateAnimations(float dt) diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index 20e1573090..dcaf4491dc 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -61,29 +61,30 @@ void CharacterPoseUtil::Draw() Entity* ent = static_cast(gfx_character->xc_scenenode->getAttachedObject(0)); - const int flags = ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_AlwaysAutoResize; + const int flags = ImGuiWindowFlags_NoCollapse; bool keep_open = true; ImGui::Begin(_LC("CharacterPoseUtil", "Character pose utility"), &keep_open, flags); - + ImGui::Text("Character: '%s' (mesh: '%s')", + gfx_character->xc_instance_name.c_str(), + gfx_character->xc_character->getCharacterDef()->mesh_name.c_str()); - ImGui::Text("Character: '%s'", gfx_character->xc_instance_name.c_str()); - ImGui::Checkbox("Manual pose", &m_manual_pose_active); - if (!m_manual_pose_active) + ImGui::BeginTabBar("CharacterPoseUtilTabs"); + + if (ImGui::BeginTabItem("Skeletal anims")) { - ImGui::TextDisabled("(gray text means 'disabled')"); + this->DrawSkeletalPanel(ent); + ImGui::EndTabItem(); } - ImGui::Dummy(ImVec2(350, 1)); // force minimum width - ImGui::Separator(); - AnimationStateSet* stateset = ent->getAllAnimationStates(); - for (auto& state_pair : stateset->getAnimationStates()) + if (ImGui::BeginTabItem("Game anims")) { - AnimationState* as = state_pair.second; - this->DrawAnimControls(as); - + this->DrawAnimDbgPanel(); + ImGui::EndTabItem(); } + ImGui::EndTabBar(); + // Common window epilogue: m_is_hovered = ImGui::IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); @@ -96,6 +97,25 @@ void CharacterPoseUtil::Draw() } } +void CharacterPoseUtil::DrawSkeletalPanel(Ogre::Entity* ent) +{ + ImGui::Checkbox("Manual pose mode", &m_manual_pose_active); + if (!m_manual_pose_active) + { + ImGui::TextDisabled("(gray text means 'disabled')"); + } + ImGui::Dummy(ImVec2(350, 1)); // force minimum width + ImGui::Separator(); + + AnimationStateSet* stateset = ent->getAllAnimationStates(); + for (auto& state_pair : stateset->getAnimationStates()) + { + AnimationState* as = state_pair.second; + this->DrawAnimControls(as); + + } +} + void CharacterPoseUtil::DrawAnimControls(Ogre::AnimationState* anim_state) { ImGui::PushID(anim_state); @@ -139,6 +159,122 @@ void CharacterPoseUtil::DrawAnimControls(Ogre::AnimationState* anim_state) ImGui::PopID(); // AnimationState* } +ImVec4 ForFlagColor(BitMask_t flags, BitMask_t mask, bool active) +{ + GUIManager::GuiTheme const& theme = App::GetGuiManager()->GetTheme(); + ImVec4 normal_text_color = ImGui::GetStyle().Colors[ImGuiCol_Text]; + return (active) + ? theme.success_text_color + : ((BITMASK_IS_1(flags, mask)) ? normal_text_color : theme.warning_text_color); +} + +ImVec4 ExceptFlagColor(BitMask_t flags, BitMask_t mask, bool active) +{ + GUIManager::GuiTheme const& theme = App::GetGuiManager()->GetTheme(); + ImVec4 normal_text_color = ImGui::GetStyle().Colors[ImGuiCol_Text]; + return (active) + ? theme.value_blue_text_color + : ((BITMASK_IS_1(flags, mask)) ? theme.error_text_color : normal_text_color); +} + +void CharacterPoseUtil::DrawAnimDbgItem(int id) +{ + CharacterAnimDbg const& dbg = anim_dbg_states[id]; + CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->getAnimById(id); + + + // Draw attributes + ImGui::Text("%s", fmt::format("anim: '{}', continuous: {}, autorestart: {}, neutral_mid: {}", + def->anim_name, def->anim_continuous, def->anim_autorestart, def->anim_neutral_mid).c_str()); + + // Draw the 'for_' flags, the satisfied get colored yellow. If all are satisfied, all get colored green. + ImGui::TextDisabled("For flags:"); + int num_flags = 0; + const int MAX_FLAGS_PER_LINE = 3; + for (int i = 1; i <= 32; i++) + { + BitMask_t testmask = BITMASK(i); + if (BITMASK_IS_1(def->for_situations, testmask)) + { + ImVec4 color = ForFlagColor(dbg.missing_situations, testmask, dbg.active); + if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) + { + ImGui::TextDisabled(" (more):"); + } + ImGui::SameLine(); + ImGui::TextColored(color, "%s", Character::SituationFlagToString(testmask)); + num_flags++; + } + if (BITMASK_IS_1(def->for_actions, testmask)) + { + ImVec4 color = ForFlagColor(dbg.missing_actions, testmask, dbg.active); + if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) + { + ImGui::TextDisabled(" (more):"); + } + ImGui::SameLine(); + ImGui::TextColored(color, "%s", Character::ActionFlagToString(testmask)); + num_flags++; + } + } + + // Draw the 'except_' flags, blocking get colored red. + ImGui::TextDisabled("Except flags:"); + num_flags = 0; + for (int i = 1; i <= 32; i++) + { + BitMask_t testmask = BITMASK(i); + if (BITMASK_IS_1(def->except_situations, testmask)) + { + ImVec4 color = ExceptFlagColor(dbg.blocking_situations, testmask, dbg.active); + if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) + { + ImGui::TextDisabled(" (more):"); + } + ImGui::SameLine(); + ImGui::TextColored(color, "%s", Character::SituationFlagToString(testmask)); + num_flags++; + } + if (BITMASK_IS_1(def->except_actions, testmask)) + { + ImVec4 color = ExceptFlagColor(dbg.blocking_actions, testmask, dbg.active); + if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) + { + ImGui::TextDisabled(" (more):"); + } + ImGui::SameLine(); + ImGui::TextColored(color, "%s", Character::ActionFlagToString(testmask)); + num_flags++; + } + } +} + +void CharacterPoseUtil::DrawAnimDbgPanel() +{ + const float child_height = ImGui::GetWindowHeight() + - ((2.f * ImGui::GetStyle().WindowPadding.y) + (3.f * ImGui::GetItemsLineHeightWithSpacing()) + + ImGui::GetStyle().ItemSpacing.y); + + ImGui::BeginChild("CharacterPoseUi-animDbg-scroll", ImVec2(0.f, child_height), false); + + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode("Game animations")) + { + for (CharacterAnimDef const& anim : App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->anims) + { + ImGui::SetNextItemOpen(true, ImGuiCond_Once); + if (ImGui::TreeNode(&anim, "%s", anim.game_description.c_str())) + { + this->DrawAnimDbgItem(anim.game_id); + ImGui::TreePop(); + } + } + ImGui::TreePop(); + } + + ImGui::EndChild(); +} + void CharacterPoseUtil::SetVisible(bool v) { m_is_visible = v; diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.h b/source/main/gui/panels/GUI_CharacterPoseUtil.h index 9905d3b34f..8880546262 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.h +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.h @@ -1,6 +1,6 @@ /* This source file is part of Rigs of Rods - Copyright 2016-2020 Petr Ohlidal + Copyright 2022 Petr Ohlidal For more information, see http://www.rigsofrods.org/ @@ -22,12 +22,40 @@ #include "Application.h" #include "OgreImGui.h" +#include + namespace RoR { + +struct CharacterAnimDbg +{ + bool active = false; + + // State diagnostic. + BitMask_t missing_situations = 0; // The flags from 'for_situations' mask which are not satisfied. + BitMask_t missing_actions = 0; // The flags from 'for_actions' mask which are not satisfied. + BitMask_t blocking_situations = 0; // The flags from 'except_situations' mask which block this anim. + BitMask_t blocking_actions = 0; // The flags from 'except_actions' mask which block this anim. + + // The raw source data of anim position. + float source_dt = 0.f; + float source_hspeed = 0.f; + float source_steering = 0.f; + + // The transformed inputs to anim position. + float input_dt = 0.f; + float input_hspeed = 0.f; + float input_steering = 0.f; +}; + namespace GUI { +typedef std::unordered_map CharacterAnimDbgMap; + class CharacterPoseUtil { public: + enum class Tab { SKELETAL, GAME }; + void Draw(); void SetVisible(bool visible); @@ -36,11 +64,17 @@ class CharacterPoseUtil bool IsManualPoseActive() const { return m_manual_pose_active; } + CharacterAnimDbgMap anim_dbg_states; + private: void DrawAnimControls(Ogre::AnimationState* anim_state); + void DrawAnimDbgItem(int id); + void DrawAnimDbgPanel(); + void DrawSkeletalPanel(Ogre::Entity* ent); bool m_is_visible = false; bool m_is_hovered = false; + Tab m_selected_tab = Tab::SKELETAL; bool m_manual_pose_active = false; }; diff --git a/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h b/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h index da711528ac..a8ed828ddc 100644 --- a/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h +++ b/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h @@ -38,7 +38,8 @@ namespace RoR { struct CharacterAnimDef { std::string anim_name; //!< Name of the skeletal animation from OGRE's *.skeleton file. - std::string description; //!< Internal game name. + std::string game_description; //!< Internal game name. + int game_id = -1; // Conditions BitMask_t for_situations = 0; //!< Character::SITUATION_, all must be satisfied. @@ -65,6 +66,16 @@ struct CharacterDef std::string name; std::string mesh_name; std::vector anims; + + CharacterAnimDef* getAnimById(int id) + { + for (CharacterAnimDef & anim : anims) + { + if (anim.game_id == id) + return &anim; + } + return nullptr; + } }; typedef std::shared_ptr CharacterDefPtr; From 66842b7c94e7c64e050840d66b44ab1225510785 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 25 Sep 2022 01:15:29 +0200 Subject: [PATCH 11/32] Added game anim inline display to CharacterPoseUtil UI. --- .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 90 ++++++++++++++++--- .../main/gui/panels/GUI_CharacterPoseUtil.h | 5 +- 2 files changed, 79 insertions(+), 16 deletions(-) diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index dcaf4491dc..36b83ab796 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -1,6 +1,6 @@ /* This source file is part of Rigs of Rods - Copyright 2016-2020 Petr Ohlidal + Copyright 2022 Petr Ohlidal For more information, see http://www.rigsofrods.org/ @@ -79,7 +79,7 @@ void CharacterPoseUtil::Draw() if (ImGui::BeginTabItem("Game anims")) { - this->DrawAnimDbgPanel(); + this->DrawAnimDbgPanel(ent); ImGui::EndTabItem(); } @@ -177,7 +177,7 @@ ImVec4 ExceptFlagColor(BitMask_t flags, BitMask_t mask, bool active) : ((BITMASK_IS_1(flags, mask)) ? theme.error_text_color : normal_text_color); } -void CharacterPoseUtil::DrawAnimDbgItem(int id) +void CharacterPoseUtil::DrawAnimDbgItemFull(int id) { CharacterAnimDbg const& dbg = anim_dbg_states[id]; CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->getAnimById(id); @@ -249,7 +249,70 @@ void CharacterPoseUtil::DrawAnimDbgItem(int id) } } -void CharacterPoseUtil::DrawAnimDbgPanel() +void CharacterPoseUtil::DrawAnimDbgItemInline(int id, Ogre::Entity* ent) +{ + CharacterAnimDbg const& dbg = anim_dbg_states[id]; + CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->getAnimById(id); + AnimationState* as = ent->getAnimationState(def->anim_name); + GUIManager::GuiTheme const& theme = App::GetGuiManager()->GetTheme(); + + if (dbg.active) + { + ImGui::Text("Playing '%s'", def->anim_name.c_str()); + ImGui::SameLine(); + ImGui::SetNextItemWidth(100); + ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0, 0)); + std::string caption = fmt::format("{:.2f}/{:.2f} sec", as->getTimePosition(), as->getLength()); + ImGui::ProgressBar(as->getTimePosition() / as->getLength(), ImVec2(-1, 0), caption.c_str()); + ImGui::PopStyleVar(); // ImGuiStyleVar_FramePadding + } + else + { + if (dbg.blocking_situations || dbg.blocking_actions) + { + // Draw the blocking 'except_' flags, colored red. + ImGui::SameLine(); + ImGui::TextDisabled("Blocked by:"); + for (int i = 1; i <= 32; i++) + { + BitMask_t testmask = BITMASK(i); + if (BITMASK_IS_1(dbg.blocking_situations, testmask)) + { + ImGui::SameLine(); + ImGui::TextColored(theme.error_text_color, "%s", Character::SituationFlagToString(testmask)); + } + if (BITMASK_IS_1(dbg.blocking_actions, testmask)) + { + ImGui::SameLine(); + ImGui::TextColored(theme.error_text_color, "%s", Character::ActionFlagToString(testmask)); + } + } + } + else + { + // Draw the 'for_' flags, the satisfied get colored yellow. + ImGui::TextDisabled("Activated by:"); + for (int i = 1; i <= 32; i++) + { + BitMask_t testmask = BITMASK(i); + if (BITMASK_IS_1(def->for_situations, testmask)) + { + ImVec4 color = ForFlagColor(dbg.missing_situations, testmask, false); + ImGui::SameLine(); + ImGui::TextColored(color, "%s", Character::SituationFlagToString(testmask)); + } + if (BITMASK_IS_1(def->for_actions, testmask)) + { + ImVec4 color = ForFlagColor(dbg.missing_actions, testmask, false); + ImGui::SameLine(); + ImGui::TextColored(color, "%s", Character::ActionFlagToString(testmask)); + } + } + } + } +} + +void CharacterPoseUtil::DrawAnimDbgPanel(Ogre::Entity* ent) { const float child_height = ImGui::GetWindowHeight() - ((2.f * ImGui::GetStyle().WindowPadding.y) + (3.f * ImGui::GetItemsLineHeightWithSpacing()) @@ -257,19 +320,18 @@ void CharacterPoseUtil::DrawAnimDbgPanel() ImGui::BeginChild("CharacterPoseUi-animDbg-scroll", ImVec2(0.f, child_height), false); - ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode("Game animations")) + for (CharacterAnimDef const& anim : App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->anims) { - for (CharacterAnimDef const& anim : App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->anims) + if (ImGui::TreeNode(&anim, "%s", anim.game_description.c_str())) { - ImGui::SetNextItemOpen(true, ImGuiCond_Once); - if (ImGui::TreeNode(&anim, "%s", anim.game_description.c_str())) - { - this->DrawAnimDbgItem(anim.game_id); - ImGui::TreePop(); - } + this->DrawAnimDbgItemFull(anim.game_id); + ImGui::TreePop(); + } + else + { + ImGui::SameLine(); + this->DrawAnimDbgItemInline(anim.game_id, ent); } - ImGui::TreePop(); } ImGui::EndChild(); diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.h b/source/main/gui/panels/GUI_CharacterPoseUtil.h index 8880546262..e94c1639b4 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.h +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.h @@ -68,8 +68,9 @@ class CharacterPoseUtil private: void DrawAnimControls(Ogre::AnimationState* anim_state); - void DrawAnimDbgItem(int id); - void DrawAnimDbgPanel(); + void DrawAnimDbgItemFull(int id); + void DrawAnimDbgItemInline(int id, Ogre::Entity* ent); + void DrawAnimDbgPanel(Ogre::Entity* ent); void DrawSkeletalPanel(Ogre::Entity* ent); bool m_is_visible = false; From f8cd9be869d04005710c6e07485a90ca33389a1b Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 25 Sep 2022 03:48:42 +0200 Subject: [PATCH 12/32] Created custom character file format. The default character is defined in file "resources/skeleton/config/classic.character" and loaded at startup. --- resources/skeleton/config/classic.character | 151 +++++++++++++ source/main/CMakeLists.txt | 4 +- source/main/gameplay/Character.cpp | 2 +- source/main/gameplay/Character.h | 9 +- source/main/gameplay/CharacterFactory.cpp | 180 ---------------- source/main/gameplay/CharacterFactory.h | 5 +- source/main/gfx/GfxCharacter.h | 2 +- .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 8 +- source/main/main.cpp | 14 ++ .../CharacterFileFormat.cpp | 202 ++++++++++++++++++ .../CharacterFileFormat.h} | 39 +++- 11 files changed, 414 insertions(+), 202 deletions(-) create mode 100644 resources/skeleton/config/classic.character create mode 100644 source/main/resources/character_fileformat/CharacterFileFormat.cpp rename source/main/resources/{character_def_fileformat/CharacterDefFileFormat.h => character_fileformat/CharacterFileFormat.h} (73%) diff --git a/resources/skeleton/config/classic.character b/resources/skeleton/config/classic.character new file mode 100644 index 0000000000..d52522bb68 --- /dev/null +++ b/resources/skeleton/config/classic.character @@ -0,0 +1,151 @@ +; The classic character (aka RORbot) +; NOTE each anim is evaluated separately, there is no either-or relation, +; so you must set each anim's conditions to avoid conflicts. + +; For explanation of individual parameters, +; see file source/main/resources/character_fileformat/CharacterFileFormat.h + +; For authoritative list of SITUATION_ and ACTION_ flags, +; see file source/main/gameplay/Character.h + +; Tip: in game, use 'Game animations' UI panel, +; open it from top menubar >> Tools >> Character pose util >> tab 'game anims' + +mesh_name "character.mesh" +character_name "Classic RORBot" + +begin_animation + game_description "driving" + for_situation SITUATION_DRIVING + anim_name "Driving" + playback_time_ratio 0.f + playback_steering_ratio -1.f + anim_continuous false + source_percentual true + anim_neutral_mid true + playback_trim 0.01f +end_animation + +begin_animation + game_description "swimming" + for_situation SITUATION_IN_DEEP_WATER + for_action ACTION_MOVE_FORWARD + anim_name "Swim_loop" + playback_h_speed_ratio 1.f + playback_time_ratio 1.f +end_animation + +begin_animation + game_description "swimming on spot" + for_situation SITUATION_IN_DEEP_WATER + except_action ACTION_MOVE_FORWARD + anim_name "Spot_swim" + playback_time_ratio 1.f +end_animation + +begin_animation + game_description "running" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_MOVE_FORWARD + for_action ACTION_RUN + anim_name "Run" + playback_time_ratio 1.f + playback_h_speed_ratio 1.f +end_animation + +begin_animation + game_description "walking forward" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_MOVE_FORWARD + except_action ACTION_RUN + anim_name "Walk" + playback_time_ratio 1.f + playback_h_speed_ratio 1.f +end_animation + +begin_animation + game_description "walking backward" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_MOVE_BACKWARD + anim_name "Walk" + playback_time_ratio -1.f + playback_h_speed_ratio 1.f +end_animation + +begin_animation + game_description "side stepping right" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_TURN_RIGHT + except_action ACTION_TURN_LEFT + except_action ACTION_RUN + anim_name "Side_step" + playback_time_ratio 1.f + anim_autorestart true +end_animation + +begin_animation + game_description "side stepping left" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_SIDESTEP_LEFT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_TURN_RIGHT + except_action ACTION_TURN_LEFT + except_action ACTION_RUN + anim_name "Side_step" + playback_time_ratio -1.f + anim_autorestart true +end_animation + +begin_animation + game_description "turning left" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_TURN_LEFT + except_action ACTION_SIDESTEP_LEFT + except_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_RUN + anim_name "Turn" + playback_time_ratio 1.f + anim_autorestart true +end_animation + +begin_animation + game_description "turning right" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_TURN_RIGHT + except_action ACTION_SIDESTEP_LEFT + except_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_RUN + anim_name "Turn" + playback_time_ratio -1.f + anim_autorestart true +end_animation + +begin_animation + game_description "idle standing" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + except_action ACTION_TURN_RIGHT + except_action ACTION_TURN_LEFT + except_action ACTION_SIDESTEP_LEFT + except_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_RUN + anim_name "Idle_sway" + playback_time_ratio 1.f +end_animation \ No newline at end of file diff --git a/source/main/CMakeLists.txt b/source/main/CMakeLists.txt index dcb39153ec..f9e83e31fe 100644 --- a/source/main/CMakeLists.txt +++ b/source/main/CMakeLists.txt @@ -193,7 +193,7 @@ set(SOURCE_FILES resources/skin_fileformat/SkinFileFormat.{h,cpp} resources/terrn2_fileformat/Terrn2FileFormat.{h,cpp} resources/tobj_fileformat/TObjFileFormat.{h,cpp} - resources/character_def_fileformat/CharacterDefFileFormat.h + resources/character_fileformat/CharacterFileFormat.{h,cpp} system/AppCommandLine.cpp system/AppConfig.cpp system/Console.{h,cpp} @@ -344,7 +344,7 @@ target_include_directories(${BINNAME} PRIVATE physics/utils physics/water resources - resources/character_def_fileformat + resources/character_fileformat resources/odef_fileformat/ resources/otc_fileformat/ resources/rig_def_fileformat diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index 06c727eb2c..d145895754 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -39,7 +39,7 @@ using namespace Ogre; using namespace RoR; -Character::Character(CharacterDefPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : +Character::Character(CharacterDocumentPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) , m_character_rotation(0.0f) , m_character_h_speed(2.0f) diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index eaa5c49fd3..0ddbba0c13 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -21,8 +21,7 @@ #pragma once - -#include "CharacterDefFileFormat.h" +#include "CharacterFileFormat.h" #include "ForwardDeclarations.h" #include "SimBuffers.h" @@ -75,11 +74,11 @@ class Character static const char* SituationFlagToString(BitMask_t single_situation_flag); static BitMask_t SituationFlagFromString(std::string const& single_situation_flag_str); - Character(CharacterDefPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); + Character(CharacterDocumentPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); // get info - CharacterDefPtr getCharacterDef() { return m_character_def; } + CharacterDocumentPtr getCharacterDocument() { return m_character_def; } // get state Ogre::Vector3 getPosition(); @@ -108,7 +107,7 @@ class Character void SendStreamSetup(); // attributes - CharacterDefPtr m_character_def; + CharacterDocumentPtr m_character_def; std::string m_instance_name; // transforms diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 27f6e1c26e..2c1ff75a1e 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -31,186 +31,6 @@ using namespace RoR; CharacterFactory::CharacterFactory() { - // set up definitions - // NOTE each anim is evaluated separately, there is no either-or relation, - // so you must set each anim's conditions to avoid conflicts. - - static int id_counter = 0; - - CharacterDefPtr rorbot = std::make_shared(); - rorbot->mesh_name = "character.mesh"; - rorbot->name = "Classic RORBot"; - - { - CharacterAnimDef def; - def.game_description = "driving"; - BITMASK_SET_1(def.for_situations, Character::SITUATION_DRIVING); - def.anim_name = "Driving"; - def.playback_time_ratio = 0.f; - def.playback_steering_ratio = -1.f; - def.anim_continuous = false; - def.source_percentual = true; - def.anim_neutral_mid = true; - def.playback_trim = 0.01f; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "swimming"; - BITMASK_SET_1(def.for_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); - def.anim_name = "Swim_loop"; - def.playback_h_speed_ratio = 1.f; - def.playback_time_ratio = 1.f; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "swimming on spot"; - BITMASK_SET_1(def.for_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); - def.anim_name = "Spot_swim"; - def.playback_time_ratio = 1.f; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "running"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.for_actions, Character::ACTION_RUN); - def.anim_name = "Run"; - def.playback_time_ratio = 1.f; - def.playback_h_speed_ratio = 1.f; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "walking forward"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); - def.anim_name = "Walk"; - def.playback_time_ratio = 1.f; - def.playback_h_speed_ratio = 1.f; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "walking backward"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_MOVE_BACKWARD); - def.anim_name = "Walk"; - def.playback_time_ratio = -1.f; - def.playback_h_speed_ratio = 1.f; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "side stepping right"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_SIDESTEP_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); - def.anim_name = "Side_step"; - def.playback_time_ratio = 1.f; - def.anim_autorestart = true; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "side stepping left"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_SIDESTEP_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); - def.anim_name = "Side_step"; - def.playback_time_ratio = -1.f; - def.anim_autorestart = true; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "turning left"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); - def.anim_name = "Turn"; - def.playback_time_ratio = 1.f; - def.anim_autorestart = true; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "turning right"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.for_actions, Character::ACTION_TURN_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); - def.anim_name = "Turn"; - def.playback_time_ratio = -1.f; - def.anim_autorestart = true; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - { - CharacterAnimDef def; - def.game_description = "idle standing"; - BITMASK_SET_1(def.except_situations, Character::SITUATION_IN_DEEP_WATER); - BITMASK_SET_1(def.except_situations, Character::SITUATION_DRIVING); - BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_TURN_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_LEFT); - BITMASK_SET_1(def.except_actions, Character::ACTION_SIDESTEP_RIGHT); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_FORWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_MOVE_BACKWARD); - BITMASK_SET_1(def.except_actions, Character::ACTION_RUN); - def.anim_name = "Idle_sway"; - def.playback_time_ratio = 1.f; - def.game_id = id_counter++; - rorbot->anims.push_back(def); - } - - m_character_defs.push_back(rorbot); } Character* CharacterFactory::CreateLocalCharacter() diff --git a/source/main/gameplay/CharacterFactory.h b/source/main/gameplay/CharacterFactory.h index 17873e61fd..43b1b7384a 100644 --- a/source/main/gameplay/CharacterFactory.h +++ b/source/main/gameplay/CharacterFactory.h @@ -24,7 +24,7 @@ #include "Application.h" #include "Character.h" -#include "CharacterDefFileFormat.h" +#include "CharacterFileFormat.h" #include "Network.h" #include @@ -46,13 +46,14 @@ class CharacterFactory void DeleteAllCharacters(); void UndoRemoteActorCoupling(ActorPtr actor); void Update(float dt); + void DefineCharacter(CharacterDocumentPtr doc) { m_character_defs.push_back(doc); } #ifdef USE_SOCKETW void handleStreamData(std::vector packet); #endif // USE_SOCKETW private: - std::vector m_character_defs; + std::vector m_character_defs; std::unique_ptr m_local_character; std::vector> m_remote_characters; diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index f1ca90c0e2..13f95b96f4 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -21,7 +21,7 @@ #pragma once -#include "CharacterDefFileFormat.h" +#include "CharacterFileFormat.h" #include "ForwardDeclarations.h" #include "SimBuffers.h" diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index 36b83ab796..2cf818250c 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -67,7 +67,7 @@ void CharacterPoseUtil::Draw() ImGui::Text("Character: '%s' (mesh: '%s')", gfx_character->xc_instance_name.c_str(), - gfx_character->xc_character->getCharacterDef()->mesh_name.c_str()); + gfx_character->xc_character->getCharacterDocument()->mesh_name.c_str()); ImGui::BeginTabBar("CharacterPoseUtilTabs"); @@ -180,7 +180,7 @@ ImVec4 ExceptFlagColor(BitMask_t flags, BitMask_t mask, bool active) void CharacterPoseUtil::DrawAnimDbgItemFull(int id) { CharacterAnimDbg const& dbg = anim_dbg_states[id]; - CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->getAnimById(id); + CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->getAnimById(id); // Draw attributes @@ -252,7 +252,7 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(int id) void CharacterPoseUtil::DrawAnimDbgItemInline(int id, Ogre::Entity* ent) { CharacterAnimDbg const& dbg = anim_dbg_states[id]; - CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->getAnimById(id); + CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->getAnimById(id); AnimationState* as = ent->getAnimationState(def->anim_name); GUIManager::GuiTheme const& theme = App::GetGuiManager()->GetTheme(); @@ -320,7 +320,7 @@ void CharacterPoseUtil::DrawAnimDbgPanel(Ogre::Entity* ent) ImGui::BeginChild("CharacterPoseUi-animDbg-scroll", ImVec2(0.f, child_height), false); - for (CharacterAnimDef const& anim : App::GetGameContext()->GetPlayerCharacter()->getCharacterDef()->anims) + for (CharacterAnimDef const& anim : App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->anims) { if (ImGui::TreeNode(&anim, "%s", anim.game_description.c_str())) { diff --git a/source/main/main.cpp b/source/main/main.cpp index 8af2c7de1a..839181ec6b 100644 --- a/source/main/main.cpp +++ b/source/main/main.cpp @@ -225,6 +225,20 @@ int main(int argc, char *argv[]) App::GetGameContext()->PushMessage(Message(MSG_APP_MODCACHE_LOAD_REQUESTED)); } + // Load classic character + try + { + Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource("classic.character"); + CharacterParser character_parser; + App::GetGameContext()->GetCharacterFactory()->DefineCharacter( + character_parser.ProcessOgreStream(stream)); + } + catch (Ogre::Exception& eeh) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error loading classic character, message:{}", eeh.getFullDescription())); + } + // Load startup scripts (console, then RoR.cfg) if (App::cli_custom_scripts->getStr() != "") { diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.cpp b/source/main/resources/character_fileformat/CharacterFileFormat.cpp new file mode 100644 index 0000000000..de98a8b01f --- /dev/null +++ b/source/main/resources/character_fileformat/CharacterFileFormat.cpp @@ -0,0 +1,202 @@ +/* + This source file is part of Rigs of Rods + Copyright 2022 Petr Ohlidal + + For more information, see http://www.rigsofrods.org/ + + Rigs of Rods is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License version 3, as + published by the Free Software Foundation. + + Rigs of Rods is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Rigs of Rods. If not, see . +*/ + +#include "CharacterFileFormat.h" + +#include "Character.h" +#include "Console.h" +#include "Utils.h" + +using namespace RoR; +using namespace Ogre; + +const int CHA_LINE_BUF_LEN = 4000; + +CharacterDocumentPtr CharacterParser::ProcessOgreStream(Ogre::DataStreamPtr stream) +{ + char raw_line_buf[CHA_LINE_BUF_LEN]; + m_filename = stream->getName(); + m_ctx.anim = CharacterAnimDef(); + m_def = std::make_shared(); + while (!stream->eof()) + { + stream->readLine(raw_line_buf, CHA_LINE_BUF_LEN); + this->ProcessLine(raw_line_buf); + } + return m_def; +} + +void CharacterParser::ProcessLine(const char* line) +{ + if ((line != nullptr) && (line[0] != 0)) + { + m_cur_line = line; + Ogre::StringUtil::trim(m_cur_line); + this->TokenizeCurrentLine(); + this->ProcessCurrentLine(); + } + m_line_number++; +} + +inline bool StartsWith(std::string const& line, const char* test) +{ + return line.compare(0, strlen(test), test) == 0; +} + +std::string CharacterParser::GetParam(int pos) +{ + if (pos < m_cur_args.size()) + return m_cur_args[pos]; + else + return ""; +} + +void CharacterParser::TokenizeCurrentLine() +{ + // Recognizes quoted strings! + // -------------------------- + m_cur_args.clear(); + m_cur_args.push_back(""); + + bool in_str = false; + for (char c : m_cur_line) + { + if (in_str) + { + if (c == '"') + { + in_str = false; + } + else + { + m_cur_args[m_cur_args.size() - 1] += c; + } + } + else + { + if (c == ' ' || c == '\t') // delimiters + { + if (m_cur_args[m_cur_args.size() - 1] != "") + { + m_cur_args.push_back(""); + } + } + else if (c == '"') + { + in_str = true; + } + else + { + m_cur_args[m_cur_args.size() - 1] += c; + } + } + } +} + +// retval true = continue processing (false = stop) +void CharacterParser::ProcessCurrentLine() +{ + if (!m_ctx.in_anim) + { + if (StartsWith(m_cur_line, "character_name")) + { + m_def->character_name = GetParam(1); + } + else if (StartsWith(m_cur_line, "mesh_name")) + { + m_def->mesh_name = GetParam(1); + } + else if (StartsWith(m_cur_line, "begin_animation")) + { + m_ctx.in_anim = true; + } + } + else + { + if (StartsWith(m_cur_line, "end_animation")) + { + m_ctx.anim.game_id = (int)m_def->anims.size(); + m_def->anims.push_back(m_ctx.anim); + m_ctx.anim = CharacterAnimDef(); + m_ctx.in_anim = false; + } + else if (StartsWith(m_cur_line, "anim_name")) + { + m_ctx.anim.anim_name = GetParam(1); + } + else if (StartsWith(m_cur_line, "game_description")) + { + m_ctx.anim.game_description = GetParam(1); + } + else if (StartsWith(m_cur_line, "for_situation")) + { + BITMASK_SET_1(m_ctx.anim.for_situations, Character::SituationFlagFromString(GetParam(1))); + } + else if (StartsWith(m_cur_line, "for_action")) + { + BITMASK_SET_1(m_ctx.anim.for_actions, Character::ActionFlagFromString(GetParam(1))); + } + else if (StartsWith(m_cur_line, "except_situation")) + { + BITMASK_SET_1(m_ctx.anim.except_situations, Character::SituationFlagFromString(GetParam(1))); + } + else if (StartsWith(m_cur_line, "except_action")) + { + BITMASK_SET_1(m_ctx.anim.except_actions, Character::ActionFlagFromString(GetParam(1))); + } + else if (StartsWith(m_cur_line, "playback_time_ratio")) + { + m_ctx.anim.playback_time_ratio = Ogre::StringConverter::parseReal(GetParam(1)); + } + else if (StartsWith(m_cur_line, "playback_h_speed_ratio")) + { + m_ctx.anim.playback_h_speed_ratio = Ogre::StringConverter::parseReal(GetParam(1)); + } + else if (StartsWith(m_cur_line, "playback_steering_ratio")) + { + m_ctx.anim.playback_steering_ratio = Ogre::StringConverter::parseReal(GetParam(1)); + } + else if (StartsWith(m_cur_line, "weight")) + { + m_ctx.anim.weight = Ogre::StringConverter::parseReal(GetParam(1)); + } + else if (StartsWith(m_cur_line, "playback_trim")) + { + m_ctx.anim.playback_trim = Ogre::StringConverter::parseReal(GetParam(1)); + } + else if (StartsWith(m_cur_line, "anim_continuous")) + { + m_ctx.anim.anim_continuous = Ogre::StringConverter::parseBool(GetParam(1)); + } + else if (StartsWith(m_cur_line, "anim_autorestart")) + { + m_ctx.anim.anim_autorestart = Ogre::StringConverter::parseBool(GetParam(1)); + } + else if (StartsWith(m_cur_line, "anim_neutral_mid")) + { + m_ctx.anim.anim_neutral_mid = Ogre::StringConverter::parseBool(GetParam(1)); + } + else if (StartsWith(m_cur_line, "source_percentual")) + { + m_ctx.anim.source_percentual = Ogre::StringConverter::parseBool(GetParam(1)); + } + } +} + + diff --git a/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h b/source/main/resources/character_fileformat/CharacterFileFormat.h similarity index 73% rename from source/main/resources/character_def_fileformat/CharacterDefFileFormat.h rename to source/main/resources/character_fileformat/CharacterFileFormat.h index a8ed828ddc..4ea91d9f24 100644 --- a/source/main/resources/character_def_fileformat/CharacterDefFileFormat.h +++ b/source/main/resources/character_fileformat/CharacterFileFormat.h @@ -1,8 +1,6 @@ /* This source file is part of Rigs of Rods - Copyright 2005-2012 Pierre-Michel Ricordel - Copyright 2007-2012 Thomas Fischer - Copyright 2013-2022 Petr Ohlidal + Copyright 2022 Petr Ohlidal For more information, see http://www.rigsofrods.org/ @@ -38,7 +36,7 @@ namespace RoR { struct CharacterAnimDef { std::string anim_name; //!< Name of the skeletal animation from OGRE's *.skeleton file. - std::string game_description; //!< Internal game name. + std::string game_description; //!< Gameplay name. int game_id = -1; // Conditions @@ -61,9 +59,9 @@ struct CharacterAnimDef float weight = 1.0f; }; -struct CharacterDef +struct CharacterDocument { - std::string name; + std::string character_name; std::string mesh_name; std::vector anims; @@ -78,7 +76,34 @@ struct CharacterDef } }; -typedef std::shared_ptr CharacterDefPtr; +typedef std::shared_ptr CharacterDocumentPtr; + +// ----------------------------------------------------------------------------- + +class CharacterParser +{ +public: + + CharacterDocumentPtr ProcessOgreStream(Ogre::DataStreamPtr stream); + +private: + void ProcessLine(const char* line); + void ProcessCurrentLine(); + void TokenizeCurrentLine(); + std::string GetParam(int pos); + + struct CharacterParserContext + { + CharacterAnimDef anim; + bool in_anim = false; + } m_ctx; //!< Parser context + + CharacterDocumentPtr m_def; + int m_line_number; + std::string m_cur_line; + std::string m_filename; + Ogre::StringVector m_cur_args; // see TokenizeCurrentLine() +}; /// @} // addtogroup Character /// @} // addtogroup Gameplay From 334393b952444337bbe61cbb5c412910bed6c5e3 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 25 Sep 2022 18:44:39 +0200 Subject: [PATCH 13/32] Character: fixed ACTION_SIDESTEP_RIGHT (typo) --- source/main/gameplay/Character.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index d145895754..c774e6e4f6 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -285,7 +285,7 @@ void Character::updateLocal(float dt) position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() + Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() + Math::HALF_PI)); if (!isswimming && not_walking) { - BITMASK_SET_1(m_action_flags, Character::ACTION_SIDESTEP_LEFT); + BITMASK_SET_1(m_action_flags, Character::ACTION_SIDESTEP_RIGHT); idleanim = false; } } From 540c0f60fba487614e141494dc06ec2c97eaaefd Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 25 Sep 2022 21:51:48 +0200 Subject: [PATCH 14/32] Character: added custom action and mode slots. New hotkeys: * EV_CHARACTER_CUSTOM_ACTION_01 - 10 (F1 - F10) * EV_CHARACTER_CUSTOM_MODE_01 - 10 (Ctrl+1 - Ctrl+0) --- resources/skeleton/config/classic.character | 23 ++++++- source/main/gameplay/Character.cpp | 75 ++++++++++++++++++++- source/main/gameplay/Character.h | 23 ++++++- source/main/utils/InputEngine.cpp | 20 ++++++ source/main/utils/InputEngine.h | 26 +++++++ 5 files changed, 161 insertions(+), 6 deletions(-) diff --git a/resources/skeleton/config/classic.character b/resources/skeleton/config/classic.character index d52522bb68..3ced034006 100644 --- a/resources/skeleton/config/classic.character +++ b/resources/skeleton/config/classic.character @@ -139,6 +139,7 @@ begin_animation game_description "idle standing" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING + except_situation SITUATION_CUSTOM_MODE_01 except_action ACTION_TURN_RIGHT except_action ACTION_TURN_LEFT except_action ACTION_SIDESTEP_LEFT @@ -146,6 +147,26 @@ begin_animation except_action ACTION_MOVE_FORWARD except_action ACTION_MOVE_BACKWARD except_action ACTION_RUN + except_action ACTION_CUSTOM_01 anim_name "Idle_sway" playback_time_ratio 1.f -end_animation \ No newline at end of file +end_animation + +begin_animation + game_description "custom action 01 test" + for_action ACTION_CUSTOM_01 + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + except_situation SITUATION_CUSTOM_MODE_01 + anim_name "Spot_swim" + playback_time_ratio 10.0 +end_animation + +begin_animation + game_description "custom mode 01 test" + for_situation SITUATION_CUSTOM_MODE_01 + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + anim_name "Driving" + playback_time_ratio 2.0 +end_animation diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index c774e6e4f6..aaa3e540c0 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -102,6 +102,14 @@ float calculate_collision_depth(Vector3 pos) return query.y - pos.y; } +void toggle_flag(BitMask_t& flags, BitMask_t mask) +{ + if (BITMASK_IS_1(flags, mask)) + BITMASK_SET_0(flags, mask); + else + BITMASK_SET_1(flags, mask); +} + void Character::updateLocal(float dt) { ROR_ASSERT(!isRemote()); @@ -337,6 +345,30 @@ void Character::updateLocal(float dt) BITMASK_SET_0(m_situation_flags, Character::SITUATION_IN_DEEP_WATER); m_character_position = position; + + // Custom actions + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_01)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_01); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_02)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_02); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_03)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_03); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_04)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_04); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_05)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_05); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_06)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_06); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_07)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_07); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_08)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_08); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_09)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_09); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_10)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_10); } + + // Custom modes (=situations) + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_01)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_01); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_02)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_02); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_03)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_03); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_04)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_04); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_05)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_05); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_06)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_06); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_07)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_07); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_08)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_08); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_09)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_09); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_10)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_10); } } void Character::move(Vector3 offset) @@ -496,8 +528,17 @@ const char* Character::ActionFlagToString(BitMask_t action) if (BITMASK_IS_1(action, ACTION_SIDESTEP_LEFT )) { return "ACTION_SIDESTEP_LEFT"; } if (BITMASK_IS_1(action, ACTION_RUN )) { return "ACTION_RUN"; } if (BITMASK_IS_1(action, ACTION_JUMP )) { return "ACTION_JUMP"; } - if (BITMASK_IS_1(action, ACTION_WAVE_HAND )) { return "ACTION_WAVE_HAND"; } if (BITMASK_IS_1(action, ACTION_SLOW_TURN )) { return "ACTION_SLOW_TURN"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_01 )) { return "ACTION_CUSTOM_01"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_02 )) { return "ACTION_CUSTOM_02"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_03 )) { return "ACTION_CUSTOM_03"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_04 )) { return "ACTION_CUSTOM_04"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_05 )) { return "ACTION_CUSTOM_05"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_06 )) { return "ACTION_CUSTOM_06"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_07 )) { return "ACTION_CUSTOM_07"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_08 )) { return "ACTION_CUSTOM_08"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_09 )) { return "ACTION_CUSTOM_09"; } + if (BITMASK_IS_1(action, ACTION_CUSTOM_10 )) { return "ACTION_CUSTOM_10"; } return "~"; } @@ -512,9 +553,17 @@ BitMask_t Character::ActionFlagFromString(std::string const& str) if (str == "ACTION_SIDESTEP_LEFT" ) { return ACTION_SIDESTEP_LEFT ;} if (str == "ACTION_RUN" ) { return ACTION_RUN ;} if (str == "ACTION_JUMP" ) { return ACTION_JUMP ;} - if (str == "ACTION_WAVE_HAND" ) { return ACTION_WAVE_HAND ;} if (str == "ACTION_SLOW_TURN" ) { return ACTION_SLOW_TURN ;} - + if (str == "ACTION_CUSTOM_01" ) { return ACTION_CUSTOM_01;} + if (str == "ACTION_CUSTOM_02" ) { return ACTION_CUSTOM_02;} + if (str == "ACTION_CUSTOM_03" ) { return ACTION_CUSTOM_03;} + if (str == "ACTION_CUSTOM_04" ) { return ACTION_CUSTOM_04;} + if (str == "ACTION_CUSTOM_05" ) { return ACTION_CUSTOM_05;} + if (str == "ACTION_CUSTOM_06" ) { return ACTION_CUSTOM_06;} + if (str == "ACTION_CUSTOM_07" ) { return ACTION_CUSTOM_07;} + if (str == "ACTION_CUSTOM_08" ) { return ACTION_CUSTOM_08;} + if (str == "ACTION_CUSTOM_09" ) { return ACTION_CUSTOM_09;} + if (str == "ACTION_CUSTOM_10" ) { return ACTION_CUSTOM_10;} return 0; } @@ -525,6 +574,16 @@ const char* Character::SituationFlagToString(BitMask_t mask) if (BITMASK_IS_1(mask, SITUATION_IN_DEEP_WATER )) { return "SITUATION_IN_DEEP_WATER"; } if (BITMASK_IS_1(mask, SITUATION_IN_AIR )) { return "SITUATION_IN_AIR"; } if (BITMASK_IS_1(mask, SITUATION_DRIVING )) { return "SITUATION_DRIVING"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_01 )) { return "SITUATION_CUSTOM_MODE_01"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_02 )) { return "SITUATION_CUSTOM_MODE_02"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_03 )) { return "SITUATION_CUSTOM_MODE_03"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_04 )) { return "SITUATION_CUSTOM_MODE_04"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_05 )) { return "SITUATION_CUSTOM_MODE_05"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_06 )) { return "SITUATION_CUSTOM_MODE_06"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_07 )) { return "SITUATION_CUSTOM_MODE_07"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_08 )) { return "SITUATION_CUSTOM_MODE_08"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_09 )) { return "SITUATION_CUSTOM_MODE_09"; } + if (BITMASK_IS_1(mask, SITUATION_CUSTOM_MODE_10 )) { return "SITUATION_CUSTOM_MODE_10"; } return "~"; } @@ -536,6 +595,16 @@ BitMask_t Character::SituationFlagFromString(std::string const& str) if (str == "SITUATION_IN_DEEP_WATER") { return SITUATION_IN_DEEP_WATER; } if (str == "SITUATION_IN_AIR") { return SITUATION_IN_AIR; } if (str == "SITUATION_DRIVING") { return SITUATION_DRIVING; } + if (str == "SITUATION_CUSTOM_MODE_01") { return SITUATION_CUSTOM_MODE_01; } + if (str == "SITUATION_CUSTOM_MODE_02") { return SITUATION_CUSTOM_MODE_02; } + if (str == "SITUATION_CUSTOM_MODE_03") { return SITUATION_CUSTOM_MODE_03; } + if (str == "SITUATION_CUSTOM_MODE_04") { return SITUATION_CUSTOM_MODE_04; } + if (str == "SITUATION_CUSTOM_MODE_05") { return SITUATION_CUSTOM_MODE_05; } + if (str == "SITUATION_CUSTOM_MODE_06") { return SITUATION_CUSTOM_MODE_06; } + if (str == "SITUATION_CUSTOM_MODE_07") { return SITUATION_CUSTOM_MODE_07; } + if (str == "SITUATION_CUSTOM_MODE_08") { return SITUATION_CUSTOM_MODE_08; } + if (str == "SITUATION_CUSTOM_MODE_09") { return SITUATION_CUSTOM_MODE_09; } + if (str == "SITUATION_CUSTOM_MODE_10") { return SITUATION_CUSTOM_MODE_10; } return 0; } \ No newline at end of file diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 0ddbba0c13..e9bbc72e7a 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -58,8 +58,17 @@ class Character static const BitMask_t ACTION_SIDESTEP_LEFT = BITMASK(6); static const BitMask_t ACTION_RUN = BITMASK(7); static const BitMask_t ACTION_JUMP = BITMASK(8); - static const BitMask_t ACTION_WAVE_HAND = BITMASK(9); - static const BitMask_t ACTION_SLOW_TURN = BITMASK(10); + static const BitMask_t ACTION_SLOW_TURN = BITMASK(9); + static const BitMask_t ACTION_CUSTOM_01 = BITMASK(10); + static const BitMask_t ACTION_CUSTOM_02 = BITMASK(11); + static const BitMask_t ACTION_CUSTOM_03 = BITMASK(12); + static const BitMask_t ACTION_CUSTOM_04 = BITMASK(13); + static const BitMask_t ACTION_CUSTOM_05 = BITMASK(14); + static const BitMask_t ACTION_CUSTOM_06 = BITMASK(15); + static const BitMask_t ACTION_CUSTOM_07 = BITMASK(16); + static const BitMask_t ACTION_CUSTOM_08 = BITMASK(17); + static const BitMask_t ACTION_CUSTOM_09 = BITMASK(18); + static const BitMask_t ACTION_CUSTOM_10 = BITMASK(19); static const char* ActionFlagToString(BitMask_t single_action_flag); static BitMask_t ActionFlagFromString(std::string const& single_action_flag_str); @@ -70,6 +79,16 @@ class Character static const BitMask_t SITUATION_IN_DEEP_WATER = BITMASK(3); static const BitMask_t SITUATION_IN_AIR = BITMASK(4); static const BitMask_t SITUATION_DRIVING = BITMASK(5); + static const BitMask_t SITUATION_CUSTOM_MODE_01 = BITMASK(10); + static const BitMask_t SITUATION_CUSTOM_MODE_02 = BITMASK(11); + static const BitMask_t SITUATION_CUSTOM_MODE_03 = BITMASK(12); + static const BitMask_t SITUATION_CUSTOM_MODE_04 = BITMASK(13); + static const BitMask_t SITUATION_CUSTOM_MODE_05 = BITMASK(14); + static const BitMask_t SITUATION_CUSTOM_MODE_06 = BITMASK(15); + static const BitMask_t SITUATION_CUSTOM_MODE_07 = BITMASK(16); + static const BitMask_t SITUATION_CUSTOM_MODE_08 = BITMASK(17); + static const BitMask_t SITUATION_CUSTOM_MODE_09 = BITMASK(18); + static const BitMask_t SITUATION_CUSTOM_MODE_10 = BITMASK(19); static const char* SituationFlagToString(BitMask_t single_situation_flag); static BitMask_t SituationFlagFromString(std::string const& single_situation_flag_str); diff --git a/source/main/utils/InputEngine.cpp b/source/main/utils/InputEngine.cpp index 4da618da5e..5fee86c767 100644 --- a/source/main/utils/InputEngine.cpp +++ b/source/main/utils/InputEngine.cpp @@ -333,6 +333,26 @@ InputEvent eventInfo[] = { {"CHARACTER_SIDESTEP_RIGHT", EV_CHARACTER_SIDESTEP_RIGHT, "Keyboard D", _LC("InputEvent", "sidestep to the right")}, {"CHARACTER_ROT_UP", EV_CHARACTER_ROT_UP, "Keyboard UP", _LC("InputEvent", "rotate view up")}, {"CHARACTER_ROT_DOWN", EV_CHARACTER_ROT_DOWN, "Keyboard DOWN", _LC("InputEvent", "rotate view down")}, + {"CHARACTER_CUSTOM_ACTION_01", EV_CHARACTER_CUSTOM_ACTION_01, "Keyboard EXPL+F1", _LC("InputEvent", "character-specific action slot 1")}, + {"CHARACTER_CUSTOM_ACTION_02", EV_CHARACTER_CUSTOM_ACTION_02, "Keyboard EXPL+F2", _LC("InputEvent", "character-specific action slot 2") }, + {"CHARACTER_CUSTOM_ACTION_03", EV_CHARACTER_CUSTOM_ACTION_03, "Keyboard EXPL+F3", _LC("InputEvent", "character-specific action slot 3") }, + {"CHARACTER_CUSTOM_ACTION_04", EV_CHARACTER_CUSTOM_ACTION_04, "Keyboard EXPL+F4", _LC("InputEvent", "character-specific action slot 4") }, + {"CHARACTER_CUSTOM_ACTION_05", EV_CHARACTER_CUSTOM_ACTION_05, "Keyboard EXPL+F5", _LC("InputEvent", "character-specific action slot 5") }, + {"CHARACTER_CUSTOM_ACTION_06", EV_CHARACTER_CUSTOM_ACTION_06, "Keyboard EXPL+F6", _LC("InputEvent", "character-specific action slot 6") }, + {"CHARACTER_CUSTOM_ACTION_07", EV_CHARACTER_CUSTOM_ACTION_07, "Keyboard EXPL+F7", _LC("InputEvent", "character-specific action slot 7") }, + {"CHARACTER_CUSTOM_ACTION_08", EV_CHARACTER_CUSTOM_ACTION_08, "Keyboard EXPL+F8", _LC("InputEvent", "character-specific action slot 8") }, + {"CHARACTER_CUSTOM_ACTION_09", EV_CHARACTER_CUSTOM_ACTION_09, "Keyboard EXPL+F9", _LC("InputEvent", "character-specific action slot 9") }, + {"CHARACTER_CUSTOM_ACTION_10", EV_CHARACTER_CUSTOM_ACTION_10, "Keyboard EXPL+F10", _LC("InputEvent", "character-specific action slot 10") }, + {"CHARACTER_CUSTOM_MODE_01", EV_CHARACTER_CUSTOM_MODE_01, "Keyboard EXPL+CTRL+1", _LC("InputEvent", "character-specific mode slot 1")}, + {"CHARACTER_CUSTOM_MODE_02", EV_CHARACTER_CUSTOM_MODE_02, "Keyboard EXPL+CTRL+2", _LC("InputEvent", "character-specific mode slot 2") }, + {"CHARACTER_CUSTOM_MODE_03", EV_CHARACTER_CUSTOM_MODE_03, "Keyboard EXPL+CTRL+3", _LC("InputEvent", "character-specific mode slot 3") }, + {"CHARACTER_CUSTOM_MODE_04", EV_CHARACTER_CUSTOM_MODE_04, "Keyboard EXPL+CTRL+4", _LC("InputEvent", "character-specific mode slot 4") }, + {"CHARACTER_CUSTOM_MODE_05", EV_CHARACTER_CUSTOM_MODE_05, "Keyboard EXPL+CTRL+5", _LC("InputEvent", "character-specific mode slot 5") }, + {"CHARACTER_CUSTOM_MODE_06", EV_CHARACTER_CUSTOM_MODE_06, "Keyboard EXPL+CTRL+6", _LC("InputEvent", "character-specific mode slot 6") }, + {"CHARACTER_CUSTOM_MODE_07", EV_CHARACTER_CUSTOM_MODE_07, "Keyboard EXPL+CTRL+7", _LC("InputEvent", "character-specific mode slot 7") }, + {"CHARACTER_CUSTOM_MODE_08", EV_CHARACTER_CUSTOM_MODE_08, "Keyboard EXPL+CTRL+8", _LC("InputEvent", "character-specific mode slot 8") }, + {"CHARACTER_CUSTOM_MODE_09", EV_CHARACTER_CUSTOM_MODE_09, "Keyboard EXPL+CTRL+9", _LC("InputEvent", "character-specific mode slot 9") }, + {"CHARACTER_CUSTOM_MODE_10", EV_CHARACTER_CUSTOM_MODE_10, "Keyboard EXPL+CTRL+0", _LC("InputEvent", "character-specific mode slot 10") }, // Camera {"CAMERA_CHANGE", EV_CAMERA_CHANGE, "Keyboard EXPL+C", _LC("InputEvent", "change camera mode")}, diff --git a/source/main/utils/InputEngine.h b/source/main/utils/InputEngine.h index 0edaf612e2..2ebb1afd8c 100644 --- a/source/main/utils/InputEngine.h +++ b/source/main/utils/InputEngine.h @@ -126,6 +126,8 @@ enum events EV_CAMERA_ZOOM_IN_FAST, //!< zoom camera in faster EV_CAMERA_ZOOM_OUT, //!< zoom camera out EV_CAMERA_ZOOM_OUT_FAST, //!< zoom camera out faster + + // Character EV_CHARACTER_BACKWARDS, //!< step backwards with the character EV_CHARACTER_FORWARD, //!< step forward with the character EV_CHARACTER_JUMP, //!< let the character jump @@ -136,6 +138,30 @@ enum events EV_CHARACTER_RUN, //!< let the character run EV_CHARACTER_SIDESTEP_LEFT, //!< sidestep to the left EV_CHARACTER_SIDESTEP_RIGHT, //!< sidestep to the right + + EV_CHARACTER_CUSTOM_ACTION_01, + EV_CHARACTER_CUSTOM_ACTION_02, + EV_CHARACTER_CUSTOM_ACTION_03, + EV_CHARACTER_CUSTOM_ACTION_04, + EV_CHARACTER_CUSTOM_ACTION_05, + EV_CHARACTER_CUSTOM_ACTION_06, + EV_CHARACTER_CUSTOM_ACTION_07, + EV_CHARACTER_CUSTOM_ACTION_08, + EV_CHARACTER_CUSTOM_ACTION_09, + EV_CHARACTER_CUSTOM_ACTION_10, + + EV_CHARACTER_CUSTOM_MODE_01, + EV_CHARACTER_CUSTOM_MODE_02, + EV_CHARACTER_CUSTOM_MODE_03, + EV_CHARACTER_CUSTOM_MODE_04, + EV_CHARACTER_CUSTOM_MODE_05, + EV_CHARACTER_CUSTOM_MODE_06, + EV_CHARACTER_CUSTOM_MODE_07, + EV_CHARACTER_CUSTOM_MODE_08, + EV_CHARACTER_CUSTOM_MODE_09, + EV_CHARACTER_CUSTOM_MODE_10, + + // Commands EV_COMMANDS_01, //!< Command 1 EV_COMMANDS_02, //!< Command 2 EV_COMMANDS_03, //!< Command 3 From 40b367fc9e756a6ce4a16c8413ae90c90beaab2a Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sat, 1 Oct 2022 02:55:04 +0200 Subject: [PATCH 15/32] CharacterPose UI: Tolerate missing anims --- source/main/gui/panels/GUI_CharacterPoseUtil.cpp | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index 2cf818250c..960996c1d0 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -253,7 +253,17 @@ void CharacterPoseUtil::DrawAnimDbgItemInline(int id, Ogre::Entity* ent) { CharacterAnimDbg const& dbg = anim_dbg_states[id]; CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->getAnimById(id); - AnimationState* as = ent->getAnimationState(def->anim_name); + + AnimationState* as = nullptr; + try + { + as = ent->getAnimationState(def->anim_name); + } + catch (Ogre::ItemIdentityException) + { + ImGui::TextDisabled("ERROR: Animation '%s' does not exist.", def->anim_name.c_str()); + return; + } GUIManager::GuiTheme const& theme = App::GetGuiManager()->GetTheme(); if (dbg.active) From 919017fed6176aeeee7b53a0238c817ac829abbc Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Fri, 30 Sep 2022 14:30:05 +0200 Subject: [PATCH 16/32] Character: added option `force_animblend` Switches skeleton to `Ogre::SkeletonAnimationBlendMode::ANIMBLEND_[AVERAGE/CUMULATIVE]` --- source/main/gfx/GfxCharacter.cpp | 6 ++++++ .../character_fileformat/CharacterFileFormat.cpp | 12 ++++++++++++ .../character_fileformat/CharacterFileFormat.h | 9 +++++++++ 3 files changed, 27 insertions(+) diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index 03f166ca7c..e529a234cf 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -63,6 +63,12 @@ GfxCharacter::GfxCharacter(Character* character) MaterialPtr mat2 = mat1->clone("tracks/" + xc_instance_name); entity->setMaterialName("tracks/" + xc_instance_name); + // setup animations + if (character->getCharacterDocument()->animblend_cumulative) + { + entity->getSkeleton()->setBlendMode(ANIMBLEND_CUMULATIVE); + } + // setup diagnostic UI for (CharacterAnimDef const& def : xc_character->m_character_def->anims) { diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.cpp b/source/main/resources/character_fileformat/CharacterFileFormat.cpp index de98a8b01f..b9c8de586c 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.cpp +++ b/source/main/resources/character_fileformat/CharacterFileFormat.cpp @@ -67,6 +67,14 @@ std::string CharacterParser::GetParam(int pos) return ""; } +static ForceAnimBlend ParseForceAnimBlend(std::string const& line) +{ + if (line == "none") return ForceAnimBlend::NONE; + if (line == "average") return ForceAnimBlend::AVERAGE; + if (line == "cumulative") return ForceAnimBlend::CUMULATIVE; + return ForceAnimBlend::NONE; +} + void CharacterParser::TokenizeCurrentLine() { // Recognizes quoted strings! @@ -122,6 +130,10 @@ void CharacterParser::ProcessCurrentLine() { m_def->mesh_name = GetParam(1); } + else if (StartsWith(m_cur_line, "force_animblend")) + { + m_def->force_animblend = ParseForceAnimBlend(GetParam(1)); + } else if (StartsWith(m_cur_line, "begin_animation")) { m_ctx.in_anim = true; diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.h b/source/main/resources/character_fileformat/CharacterFileFormat.h index 4ea91d9f24..27ecce37f6 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.h +++ b/source/main/resources/character_fileformat/CharacterFileFormat.h @@ -59,11 +59,20 @@ struct CharacterAnimDef float weight = 1.0f; }; +enum class ForceAnimBlend //!< Should a specific `Ogre::SkeletonAnimationBlendMode` be forced, or should we keep what the .skeleton file defines? +{ + NONE, //!< Use what's defined in the skeleton, see '' in the XML. + AVERAGE, + CUMULATIVE +}; + struct CharacterDocument { std::string character_name; std::string mesh_name; std::vector anims; + std::vector skeletal_anim_opts; + ForceAnimBlend force_animblend = ForceAnimBlend::NONE; //!< Should a specific `Ogre::SkeletonAnimationBlendMode` be forced, or should we keep what the .skeleton file defines? CharacterAnimDef* getAnimById(int id) { From e5cd710a2649a442b5527f71b5515d9669ddbbcb Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Wed, 12 Oct 2022 04:35:07 +0200 Subject: [PATCH 17/32] Character: added bone blend masks. Example for the stock character.mesh (disables all upper body animation when running): ``` begin_bone_blend_mask anim_name "Run" bone_weight "hand.R" 0 bone_weight "hand.L" 0 bone_weight "forearm.R" 0 bone_weight "forearm.L" 0 bone_weight "upper_arm.R" 0 bone_weight "upper_arm.L" 0 bone_weight "shoulder.R" 0 bone_weight "shoulder.L" 0 bone_weight "head" 0 bone_weight "neck" 0 bone_weight "chest" 0 bone_weight "spine" 0 end_bone_blend_mask ``` --- resources/skeleton/config/classic.character | 25 ++++++++++- source/main/gfx/GfxCharacter.cpp | 42 +++++++++++++++++-- source/main/gfx/GfxCharacter.h | 1 + .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 3 +- .../CharacterFileFormat.cpp | 34 ++++++++++++++- .../CharacterFileFormat.h | 16 ++++++- 6 files changed, 113 insertions(+), 8 deletions(-) diff --git a/resources/skeleton/config/classic.character b/resources/skeleton/config/classic.character index 3ced034006..9442395925 100644 --- a/resources/skeleton/config/classic.character +++ b/resources/skeleton/config/classic.character @@ -1,5 +1,8 @@ ; The classic character (aka RORbot) -; NOTE each anim is evaluated separately, there is no either-or relation, + +; This file format lets you compose game animations from one or more +; skeletal animations exported from a 3D modelling tool. +; NOTE each game-anim is evaluated separately, there is no either-or relation, ; so you must set each anim's conditions to avoid conflicts. ; For explanation of individual parameters, @@ -14,6 +17,24 @@ mesh_name "character.mesh" character_name "Classic RORBot" +begin_bone_blend_mask +; This is a dummy example of how bone blend masks can be done. +; bone_weight + anim_name "Run" + bone_weight "hand.R" 1 + bone_weight "hand.L" 1 + bone_weight "forearm.R" 1 + bone_weight "forearm.L" 1 + bone_weight "upper_arm.R" 1 + bone_weight "upper_arm.L" 1 + bone_weight "shoulder.R" 1 + bone_weight "shoulder.L" 1 + bone_weight "head" 1 + bone_weight "neck" 1 + bone_weight "chest" 1 + bone_weight "spine" 1 +end_bone_blend_mask + begin_animation game_description "driving" for_situation SITUATION_DRIVING @@ -160,6 +181,7 @@ begin_animation except_situation SITUATION_CUSTOM_MODE_01 anim_name "Spot_swim" playback_time_ratio 10.0 + anim_continuous false end_animation begin_animation @@ -169,4 +191,5 @@ begin_animation except_situation SITUATION_DRIVING anim_name "Driving" playback_time_ratio 2.0 + end_animation diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index e529a234cf..8a507864a3 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -63,10 +63,18 @@ GfxCharacter::GfxCharacter(Character* character) MaterialPtr mat2 = mat1->clone("tracks/" + xc_instance_name); entity->setMaterialName("tracks/" + xc_instance_name); - // setup animations - if (character->getCharacterDocument()->animblend_cumulative) + // setup animation blend + switch (character->getCharacterDocument()->force_animblend) { - entity->getSkeleton()->setBlendMode(ANIMBLEND_CUMULATIVE); + case ForceAnimBlend::CUMULATIVE: entity->getSkeleton()->setBlendMode(ANIMBLEND_CUMULATIVE); break; + case ForceAnimBlend::AVERAGE: entity->getSkeleton()->setBlendMode(ANIMBLEND_AVERAGE); break; + default:; // Keep the preset defined in .skeleton file + } + + // setup bone blend masks + for (BoneBlendMaskDef& mask_def : character->getCharacterDocument()->bone_blend_masks) + { + this->SetupBoneBlendMask(mask_def); } // setup diagnostic UI @@ -76,6 +84,34 @@ GfxCharacter::GfxCharacter(Character* character) } } +void GfxCharacter::SetupBoneBlendMask(BoneBlendMaskDef const& mask_def) +{ + Entity* entity = static_cast(xc_scenenode->getAttachedObject(0)); + + AnimationState* mask_created = nullptr; + try + { + AnimationState* anim = entity->getAnimationState(mask_def.anim_name); + if (mask_def.bone_weights.size() > 0) + { + anim->createBlendMask(entity->getSkeleton()->getNumBones()); + mask_created = anim; + for (BoneBlendMaskWeightDef const& def : mask_def.bone_weights) + { + Bone* bone = entity->getSkeleton()->getBone(def.bone_name); + anim->setBlendMaskEntry(bone->getHandle(), def.bone_weight); + } + } + } + catch (Exception& eeh) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error setting up bone blend mask for animation '{}', message:{}", mask_def.anim_name, eeh.getFullDescription())); + if (mask_created) + mask_created->destroyBlendMask(); + } +} + RoR::GfxCharacter::~GfxCharacter() { Entity* ent = static_cast(xc_scenenode->getAttachedObject(0)); diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index 13f95b96f4..34201807d8 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -46,6 +46,7 @@ struct GfxCharacter void EnableAnim(Ogre::AnimationState* anim_state, float time); void UpdateAnimations(float dt); void EvaluateAnimDef(CharacterAnimDef const& def, float dt); + void SetupBoneBlendMask(BoneBlendMaskDef const& mask_def); Ogre::SceneNode* xc_scenenode; CharacterSB xc_simbuf; diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index 960996c1d0..e298f1c8f2 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -122,7 +122,8 @@ void CharacterPoseUtil::DrawAnimControls(Ogre::AnimationState* anim_state) // anim name line ImVec4 color = (anim_state->getEnabled()) ? ImGui::GetStyle().Colors[ImGuiCol_Text] : ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]; - ImGui::TextColored(color, "'%s' (%.2f sec)", anim_state->getAnimationName().c_str(), anim_state->getLength()); + const char* uses_boneblendmask_text = anim_state->getBlendMask() ? ", uses bone blend mask!" : ""; + ImGui::TextColored(color, "'%s' (%.2f sec%s)", anim_state->getAnimationName().c_str(), anim_state->getLength(), uses_boneblendmask_text); if (m_manual_pose_active) { ImGui::SameLine(); diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.cpp b/source/main/resources/character_fileformat/CharacterFileFormat.cpp index b9c8de586c..ec8fe9201b 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.cpp +++ b/source/main/resources/character_fileformat/CharacterFileFormat.cpp @@ -120,8 +120,10 @@ void CharacterParser::TokenizeCurrentLine() // retval true = continue processing (false = stop) void CharacterParser::ProcessCurrentLine() { - if (!m_ctx.in_anim) + if (!m_ctx.in_anim && !m_ctx.in_bone_blend_mask) { + // Root level + if (StartsWith(m_cur_line, "character_name")) { m_def->character_name = GetParam(1); @@ -138,9 +140,15 @@ void CharacterParser::ProcessCurrentLine() { m_ctx.in_anim = true; } + else if (StartsWith(m_cur_line, "begin_bone_blend_mask")) + { + m_ctx.in_bone_blend_mask = true; + } } - else + else if (m_ctx.in_anim) { + // In '[begin/end]_animation' block. + if (StartsWith(m_cur_line, "end_animation")) { m_ctx.anim.game_id = (int)m_def->anims.size(); @@ -209,6 +217,28 @@ void CharacterParser::ProcessCurrentLine() m_ctx.anim.source_percentual = Ogre::StringConverter::parseBool(GetParam(1)); } } + else if (m_ctx.in_bone_blend_mask) + { + // In '[begin/end]_bone_blend_mask' block. + + if (StartsWith(m_cur_line, "end_bone_blend_mask")) + { + m_def->bone_blend_masks.push_back(m_ctx.bone_blend_mask); + m_ctx.bone_blend_mask = BoneBlendMaskDef(); + m_ctx.in_bone_blend_mask = false; + } + else if (StartsWith(m_cur_line, "anim_name")) + { + m_ctx.bone_blend_mask.anim_name = GetParam(1); + } + else if (StartsWith(m_cur_line, "bone_weight")) + { + BoneBlendMaskWeightDef def; + def.bone_name = GetParam(1); + def.bone_weight = Ogre::StringConverter::parseReal(GetParam(2)); + m_ctx.bone_blend_mask.bone_weights.push_back(def); + } + } } diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.h b/source/main/resources/character_fileformat/CharacterFileFormat.h index 27ecce37f6..5a0f452b79 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.h +++ b/source/main/resources/character_fileformat/CharacterFileFormat.h @@ -33,6 +33,18 @@ namespace RoR { /// @addtogroup Character /// @{ +struct BoneBlendMaskWeightDef //!< See `Ogre::AnimationState::setBlendMaskEntry()` +{ + std::string bone_name; + float bone_weight = 0.f; +}; + +struct BoneBlendMaskDef //!< Additional settings for a skeletal animation track exported from 3D modelling tool. +{ + std::string anim_name; //!< Name of the skeletal animation from OGRE's *.skeleton file. + std::vector bone_weights; +}; + struct CharacterAnimDef { std::string anim_name; //!< Name of the skeletal animation from OGRE's *.skeleton file. @@ -71,7 +83,7 @@ struct CharacterDocument std::string character_name; std::string mesh_name; std::vector anims; - std::vector skeletal_anim_opts; + std::vector bone_blend_masks; ForceAnimBlend force_animblend = ForceAnimBlend::NONE; //!< Should a specific `Ogre::SkeletonAnimationBlendMode` be forced, or should we keep what the .skeleton file defines? CharacterAnimDef* getAnimById(int id) @@ -104,7 +116,9 @@ class CharacterParser struct CharacterParserContext { CharacterAnimDef anim; + BoneBlendMaskDef bone_blend_mask; bool in_anim = false; + bool in_bone_blend_mask = false; } m_ctx; //!< Parser context CharacterDocumentPtr m_def; From 1060d63679b95b0e828fac55d4c852878aa30fa1 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Thu, 3 Nov 2022 11:23:03 +0100 Subject: [PATCH 18/32] Character (RoRbot) is now a mod type (select in Settings UI). The usage is equivalent to other mods: a ZIP/directory under 'ROR_HOMEDIR/mods' containing a '*.character' file. To select character, open Settings UI, go to Gameplay tab, scroll to "Player character:" at the bottom and press "Select" button - the standard Selector UI will appear. Character is always loaded with terrain. If the character fails to load, a "Cannot load terrain" messagebox appears and user remains in main menu. The classic character resources were deleted from /resources and will be added to /content (a Git submodule). --- resources/materials/character.material | 30 ---------- resources/meshes/character.material | 23 -------- resources/meshes/character.mesh | Bin 473483 -> 0 bytes resources/meshes/character.skeleton | Bin 352660 -> 0 bytes source/main/Application.cpp | 1 + source/main/Application.h | 2 + source/main/GameContext.cpp | 11 +++- source/main/GameContext.h | 2 +- source/main/gameplay/CharacterFactory.cpp | 62 +++++++++++++++++++- source/main/gameplay/CharacterFactory.h | 4 +- source/main/gui/panels/GUI_GameSettings.cpp | 11 ++++ source/main/gui/panels/GUI_MainSelector.cpp | 41 +++++++++---- source/main/main.cpp | 24 ++------ source/main/resources/CacheSystem.cpp | 36 +++++++++--- source/main/resources/CacheSystem.h | 3 + source/main/system/CVar.cpp | 1 + 16 files changed, 153 insertions(+), 98 deletions(-) delete mode 100644 resources/materials/character.material delete mode 100644 resources/meshes/character.material delete mode 100755 resources/meshes/character.mesh delete mode 100755 resources/meshes/character.skeleton diff --git a/resources/materials/character.material b/resources/materials/character.material deleted file mode 100644 index 8baeae2139..0000000000 --- a/resources/materials/character.material +++ /dev/null @@ -1,30 +0,0 @@ -import * from "managed_mats.material" - -material tracks/character: RoR/Managed_Mats/Base -{ - technique BaseTechnique - { - pass BaseRender - { - depth_bias -20 - texture_unit Diffuse_Map 1 - { - texture character.dds - } - } - pass ColorChange - { - scene_blend alpha_blend - texture_unit - { - texture character-alpha.png - } - texture_unit - { - colour_op_ex blend_current_alpha src_manual src_current 0 0 0 - } - } - } -} - - diff --git a/resources/meshes/character.material b/resources/meshes/character.material deleted file mode 100644 index 49d24af29f..0000000000 --- a/resources/meshes/character.material +++ /dev/null @@ -1,23 +0,0 @@ - -material 1-Default -{ - technique - { - pass - { - ambient 0.588235 0.588235 0.588235 1 - diffuse 0.588235 0.588235 0.588235 1 - specular 0 0 0 1 10 - emissive 0.5 0.5 0.5 1 - - texture_unit - { - texture male_char01_tex.jpg - } - } - - } - -} - - diff --git a/resources/meshes/character.mesh b/resources/meshes/character.mesh deleted file mode 100755 index 014009e801f2275ae3f3c5b30f337809bb8518f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 473483 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

aa@5Kpl?dx>164@S9iHToOBeP zCe>F#Bq-4(OL;TdBGub-g)8pN;swkW(<(%QCSBhugZf#ej2{1TFB>xyi3F-Ig?xNO z=0j!mVykqkaw>OvDC0cC50PNMUrXi8e~HqAIe&5W|6wRn zw^20#k)T@D!*Yo^3DV8*Os?C#6^k~4;A4%q?VVzekC?*rqyWbX`p7KS70DFuXl5c=&{hmZ&~Fezt}&4 zL>jf~hdJf$2*e2=I;4v8_ub(do%=5y8p%cU0sNyQScJF<@P{w}BYgq?mV<#Lj5X8 z4O#`-xhxqu7jG_3&8WdYIoVK7Y(qLGY@W3%AVM*X`l3BEUklM~8uPL7t>j8g=$bd$ zWkt;AoOT85Asnwo39rU9=c^@mlR5mYQ#^8fj)wM~Kq~tyU_Y__+j8OEQG7+2-{b?o zk@af^9x#^NS3pFWKjn~6p_s^Dc+o)~ex3TO|GkDGx;UPGDYTv4nBV-el{^Nq?3&hd zbMt^bN2zN0#W^c|_#y|J$=lPY--mk-fd%H)E<~Mw1{4!Z&-Ui8Pi!iG38i}mW0%8z zK7huYPQ}FbVcz_k=}qP68I*^*CWxP~*A+ygApbm~wSzBTI<&d`o(Dvx zsL+bymOb@(WrQG4Ev@CDcnma8vgZN&mHNr8#3L`N^FNdZ@>}N_#KQ47Nc7CDD~MRW zoyLgHODpm&%WKN>9PIXuzmzHl&6~JDw4oBb_d*xB$E_)3eW)WR-TN9b(HS-?*LG1>`Exk5xiDjksmJP z<${NsT30=yE0)b3L&XWx*W^>Y+W5=kvu;`6rL(wftPf*`;>kvZm7*UT$eTMimP%+< zgd|?^ATavu3Pp#f^vjvRfh==_6+URQWlR3pnZ-%4%^-oAvT_Yd*Qsf~(R_T49CQN~}j4qj>UuU%6_7Z0XI| z2hz?@8ZA4HsiH$Rk`uhXNZWoskP2l{l)YAA4|K6+J2_^_SE;hc18LD`JCvHyk?wTt zX1R;yn-t&SzEoP3i&-2SqY1?c-F|rD}IJC0z=O2aSpw#nH zpVRtCVC6C0d7@F-k#fx$CFJgvk4S3ohQuz2))WPMm#QNL-ke@u4oygq&QqPRe<5*>#8OZT8{V78cCi&5>qf5_#~G`%e<^_IHH556ssswYyL0A1l1=14Qq zSd`XGQ06prmlIkHm;95MR>{7=3_1YM1)nTK*^a9Fcqw6b>dKyHIq9To!)$HYUjfz$ zUVh%f3d*1d-dNkkq#5VztW%v6@a$_$j>@K!{&Jo5C#)xFpO0CAW-E#4(U4oRTPP=Z zSKHP!Vit?^L1N9_uTv&YbFi+NMKTf0 zkiOXJSuK{>T~jRTdnaXg#ZuOPV(q?pq)HF_k7BEx#19r*N?4T&*5cb~9;A}O_D4Ne zs+gItfY>zBlF}+q8S9ZFEF&Xzb(TRBg8qmp&+^f0+bJl`7O4Va8#dv3YbtZD#)=w1{<0 z>9}*cv#w;iRGo8U^VY3UdDfOZG^y!-}PB z`14*$1r0@JNVA-QXhPrfQuEBoDbwXZ%K<7qnH^nv$nop_{#ZIREiq-@#^shlDhf*v zFV!X>ulJhqL7H&uP0E(bHcJCt6J{L+BbVoAOFeIuv)=}V{&t%LM0`E??bXZ^2T5Kk>9OK$1-QAX_gw>xHTb#DKTjeymqq3(3Ie5SR zPU3z4^_GnD9@dXL?ADMf7rBp4SbZ^SYMf<#{W{i0esn#uakANtLo?jEibrFUEq9yM zvHlywYIJ0b+Il>I;`WRdXJj0GetPlayerCharacter()) + { + App::GetGuiManager()->ShowMessageBox(_L("Terrain loading error"), + "Failed to create player character, see console or 'RoR.log' for more info."); + return false; + } + // Adjust character position Ogre::Vector3 spawn_pos = m_terrain->getSpawnPos(); float spawn_rot = 0.0f; @@ -821,6 +828,8 @@ void GameContext::CreatePlayerCharacter() { App::GetCameraManager()->UpdateInputEvents(0.02f); } + + return true; } Character* GameContext::GetPlayerCharacter() // Convenience ~ counterpart of `GetPlayerActor()` diff --git a/source/main/GameContext.h b/source/main/GameContext.h index a801be95e8..c2fb275d8c 100644 --- a/source/main/GameContext.h +++ b/source/main/GameContext.h @@ -142,7 +142,7 @@ class GameContext /// @name Characters /// @{ - void CreatePlayerCharacter(); //!< Terrain must be loaded + bool CreatePlayerCharacter(); //!< Terrain must be loaded Character* GetPlayerCharacter(); CharacterFactory* GetCharacterFactory() { return &m_character_factory; } diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 2c1ff75a1e..726efa093a 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -23,7 +23,9 @@ #include "Actor.h" #include "Application.h" +#include "CacheSystem.h" #include "Character.h" +#include "Console.h" #include "GfxScene.h" #include "Utils.h" @@ -33,6 +35,26 @@ CharacterFactory::CharacterFactory() { } +CharacterDocumentPtr CharacterFactory::FetchCharacterDef(CacheEntry* cache_entry) +{ + if (!cache_entry->character_def) + { + try + { + Ogre::DataStreamPtr datastream = Ogre::ResourceGroupManager::getSingleton().openResource(cache_entry->fname, cache_entry->resource_group); + CharacterParser character_parser; + cache_entry->character_def = character_parser.ProcessOgreStream(datastream); + } + catch (Ogre::Exception& eeh) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("Could not load character, message: {}", eeh.getFullDescription())); + } + } + + return cache_entry->character_def; +} + Character* CharacterFactory::CreateLocalCharacter() { int colourNum = -1; @@ -47,7 +69,21 @@ Character* CharacterFactory::CreateLocalCharacter() } #endif // USE_SOCKETW - m_local_character = std::unique_ptr(new Character(m_character_defs[0], -1, 0, playerName, colourNum, false)); + CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, App::sim_player_character->getStr()); + if (!cache_entry) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("Could not find character '{}' in mod cache.", App::sim_player_character->getStr())); + return nullptr; + } + + CharacterDocumentPtr document = this->FetchCharacterDef(cache_entry); + if (!document) + { + return nullptr; // Error already reported + } + + m_local_character = std::unique_ptr(new Character(document, -1, 0, playerName, colourNum, false)); App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); return m_local_character.get(); } @@ -60,9 +96,29 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) int colour = info.colournum; Ogre::UTFString name = tryConvertUTF(info.username); - LOG(" new character for " + TOSTRING(sourceid) + ":" + TOSTRING(streamid) + ", colour: " + TOSTRING(colour)); + std::string info_str = fmt::format("player '{}' ({}:{}), colour: {}", info.clientname, sourceid, streamid, colour); + + LOG(" new character for " + info_str); + + std::string filename = App::sim_player_character->getStr(); // TBD: transmit and use the actual character used by the player + + CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, filename); + if (!cache_entry) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("Could not create character for {} - character '{}' not found in mod cache.", info_str, filename)); + return; + } + + CharacterDocumentPtr document = this->FetchCharacterDef(cache_entry); + if (!document) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("Could not create character for {} - cannot load file '{}'.", info_str, cache_entry->fname)); + return; + } - Character* ch = new Character(m_character_defs[0], sourceid, streamid, name, colour, true); + Character* ch = new Character(document, sourceid, streamid, name, colour, true); App::GetGfxScene()->RegisterGfxCharacter(ch); m_remote_characters.push_back(std::unique_ptr(ch)); #endif // USE_SOCKETW diff --git a/source/main/gameplay/CharacterFactory.h b/source/main/gameplay/CharacterFactory.h index 43b1b7384a..70e60e400d 100644 --- a/source/main/gameplay/CharacterFactory.h +++ b/source/main/gameplay/CharacterFactory.h @@ -46,15 +46,13 @@ class CharacterFactory void DeleteAllCharacters(); void UndoRemoteActorCoupling(ActorPtr actor); void Update(float dt); - void DefineCharacter(CharacterDocumentPtr doc) { m_character_defs.push_back(doc); } + CharacterDocumentPtr FetchCharacterDef(CacheEntry* cache_entry); #ifdef USE_SOCKETW void handleStreamData(std::vector packet); #endif // USE_SOCKETW private: - std::vector m_character_defs; - std::unique_ptr m_local_character; std::vector> m_remote_characters; diff --git a/source/main/gui/panels/GUI_GameSettings.cpp b/source/main/gui/panels/GUI_GameSettings.cpp index af92a68d1c..92b32d90cd 100644 --- a/source/main/gui/panels/GUI_GameSettings.cpp +++ b/source/main/gui/panels/GUI_GameSettings.cpp @@ -266,6 +266,17 @@ void GameSettings::DrawGameplaySettings() DrawGCheckbox(App::io_discord_rpc, _LC("GameSettings", "Discord Rich Presence")); DrawGCheckbox(App::sim_quickload_dialog, _LC("GameSettings", "Show confirm. UI dialog for quickload")); + + // Character + ImGui::TextDisabled("%s:", _LC("GameSettings", "Player character")); + ImGui::SameLine(); + ImGui::Text("%s", App::sim_player_character->getStr().c_str()); + ImGui::SameLine(); + if (ImGui::Button(_LC("GameSettings", "Select"))) + { + LoaderType* payload = new LoaderType(LoaderType::LT_Character); + App::GetGameContext()->PushMessage(Message(MSG_GUI_OPEN_SELECTOR_REQUESTED, (void*)payload)); + } } void GameSettings::DrawAudioSettings() diff --git a/source/main/gui/panels/GUI_MainSelector.cpp b/source/main/gui/panels/GUI_MainSelector.cpp index d1c421c3d0..5fc082392c 100644 --- a/source/main/gui/panels/GUI_MainSelector.cpp +++ b/source/main/gui/panels/GUI_MainSelector.cpp @@ -612,23 +612,40 @@ void MainSelector::Apply() ROR_ASSERT(m_selected_entry > -1); // Programmer error DisplayEntry& sd_entry = m_display_entries[m_selected_entry]; - if (m_loader_type == LT_Terrain && - App::app_state->getEnum() == AppState::MAIN_MENU) + switch (m_loader_type) { - App::GetGameContext()->PushMessage(Message(MSG_SIM_LOAD_TERRN_REQUESTED, sd_entry.sde_entry->fname)); + case LT_Character: // Invoked by Settings UI button + App::sim_player_character->setStr(sd_entry.sde_entry->fname); this->Close(); - } - else if (App::app_state->getEnum() == AppState::SIMULATION) - { - LoaderType type = m_loader_type; - std::string sectionconfig; - if (sd_entry.sde_entry->sectionconfigs.size() > 0) + break; + + case LT_Terrain: // Invoked by Main menu button + if (App::app_state->getEnum() == AppState::MAIN_MENU) { - sectionconfig = sd_entry.sde_entry->sectionconfigs[m_selected_sectionconfig]; + App::GetGameContext()->PushMessage(Message(MSG_SIM_LOAD_TERRN_REQUESTED, sd_entry.sde_entry->fname)); + this->Close(); } - this->Close(); + break; - App::GetGameContext()->OnLoaderGuiApply(type, sd_entry.sde_entry, sectionconfig); + default: // Vehicle in simulation (Invoked by: top menubar, hotkey, or spawner) + if (App::app_state->getEnum() == AppState::SIMULATION) + { + // Make a copy because `Close()` will reset it. + LoaderType orig_loader_type = m_loader_type; + + // If no config was selected, use the first one. + std::string sectionconfig; + if (sd_entry.sde_entry->sectionconfigs.size() > 0) + { + sectionconfig = sd_entry.sde_entry->sectionconfigs[m_selected_sectionconfig]; + } + + // Close the UI so that GameContext can reopen it if needed (used for skins) + this->Close(); + + App::GetGameContext()->OnLoaderGuiApply(orig_loader_type, sd_entry.sde_entry, sectionconfig); + } + break; } } diff --git a/source/main/main.cpp b/source/main/main.cpp index 839181ec6b..25a6ed9712 100644 --- a/source/main/main.cpp +++ b/source/main/main.cpp @@ -225,20 +225,6 @@ int main(int argc, char *argv[]) App::GetGameContext()->PushMessage(Message(MSG_APP_MODCACHE_LOAD_REQUESTED)); } - // Load classic character - try - { - Ogre::DataStreamPtr stream = Ogre::ResourceGroupManager::getSingleton().openResource("classic.character"); - CharacterParser character_parser; - App::GetGameContext()->GetCharacterFactory()->DefineCharacter( - character_parser.ProcessOgreStream(stream)); - } - catch (Ogre::Exception& eeh) - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("error loading classic character, message:{}", eeh.getFullDescription())); - } - // Load startup scripts (console, then RoR.cfg) if (App::cli_custom_scripts->getStr() != "") { @@ -582,9 +568,9 @@ int main(int argc, char *argv[]) App::GetGuiManager()->LoadingWindow.SetProgress(5, _L("Loading resources")); App::GetContentManager()->LoadGameplayResources(); - if (App::GetGameContext()->LoadTerrain(m.description)) + if (App::GetGameContext()->LoadTerrain(m.description) + && App::GetGameContext()->CreatePlayerCharacter()) { - App::GetGameContext()->CreatePlayerCharacter(); // Spawn preselected vehicle; commandline has precedence if (App::cli_preset_vehicle->getStr() != "") App::GetGameContext()->SpawnPreselectedActor(App::cli_preset_vehicle->getStr(), App::cli_preset_veh_config->getStr()); // Needs character for position @@ -611,8 +597,8 @@ int main(int argc, char *argv[]) if (App::mp_state->getEnum() == MpState::CONNECTED) { App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_NOTICE, - fmt::format(_LC("ChatBox", "Press {} to start chatting"), - App::GetInputEngine()->getEventCommandTrimmed(EV_COMMON_ENTER_CHATMODE)), "lightbulb.png"); + fmt::format(_LC("ChatBox", "Press {} to start chatting"), + App::GetInputEngine()->getEventCommandTrimmed(EV_COMMON_ENTER_CHATMODE)), "lightbulb.png"); } #endif // USE_SOCKETW if (App::io_outgauge_mode->getInt() > 0) @@ -622,6 +608,8 @@ int main(int argc, char *argv[]) } else { + // Failed to load terrain or character - messagebox is already displayed + if (App::mp_state->getEnum() == MpState::CONNECTED) { App::GetGameContext()->PushMessage(Message(MSG_NET_DISCONNECT_REQUESTED)); diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index f11db72cef..1251cfc426 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -25,26 +25,25 @@ #include "CacheSystem.h" -#include #include "Application.h" -#include "SimData.h" +#include "CharacterFileFormat.h" #include "ContentManager.h" #include "ErrorUtils.h" +#include "GfxActor.h" +#include "GfxScene.h" #include "GUI_LoadingWindow.h" #include "GUI_GameMainMenu.h" #include "GUIManager.h" -#include "GfxActor.h" -#include "GfxScene.h" #include "Language.h" #include "PlatformUtils.h" #include "RigDef_Parser.h" - +#include "SimData.h" #include "SkinFileFormat.h" #include "Terrain.h" #include "Terrn2FileFormat.h" #include "Utils.h" -#include +#include #include #include #include @@ -111,6 +110,7 @@ CacheSystem::CacheSystem() m_known_extensions.push_back("load"); m_known_extensions.push_back("train"); m_known_extensions.push_back("skin"); + m_known_extensions.push_back("character"); } void CacheSystem::LoadModCache(CacheValidity validity) @@ -645,6 +645,11 @@ void CacheSystem::AddFile(String group, Ogre::FileInfo f, String ext) new_entries.resize(1); FillTerrainDetailInfo(new_entries.back(), ds, f.filename); } + else if (ext == "character") + { + new_entries.resize(1); + FillCharacterDetailInfo(new_entries.back(), ds); + } else if (ext == "skin") { auto new_skins = RoR::SkinParser::ParseSkins(ds); @@ -1068,6 +1073,14 @@ void CacheSystem::FillTerrainDetailInfo(CacheEntry& entry, Ogre::DataStreamPtr d entry.version = def.version; } +void CacheSystem::FillCharacterDetailInfo(CacheEntry& entry, Ogre::DataStreamPtr datastream) +{ + CharacterParser parser; + CharacterDocumentPtr doc = parser.ProcessOgreStream(datastream); + + entry.dname = doc->character_name; +} + bool CacheSystem::CheckResourceLoaded(Ogre::String & filename) { Ogre::String group = ""; @@ -1127,6 +1140,13 @@ void CacheSystem::LoadResource(CacheEntry& t) ResourceGroupManager::getSingleton().createResourceGroup(group, /*inGlobalPool=*/true); ResourceGroupManager::getSingleton().addResourceLocation(t.resource_bundle_path, t.resource_bundle_type, group); } + else if (t.fext == "character") + { + // This is a character mod bundle - use `inGlobalPool=false` to prevent resource name conflicts. + // See bottom 'note' at https://ogrecave.github.io/ogre/api/latest/_resource-_management.html#Resource-Groups + ResourceGroupManager::getSingleton().createResourceGroup(group, /*inGlobalPool=*/false); + ResourceGroupManager::getSingleton().addResourceLocation(t.resource_bundle_path, t.resource_bundle_type, group); + } else if (t.fext == "skin") { // This is a SkinZip bundle - use `inGlobalPool=false` to prevent resource name conflicts. @@ -1279,8 +1299,10 @@ size_t CacheSystem::Query(CacheQuery& query) bool add = false; if (entry.fext == "terrn2") add = (query.cqy_filter_type == LT_Terrain); - if (entry.fext == "skin") + else if (entry.fext == "skin") add = (query.cqy_filter_type == LT_Skin); + else if (entry.fext == "character") + add = (query.cqy_filter_type == LT_Character); else if (entry.fext == "truck") add = (query.cqy_filter_type == LT_AllBeam || query.cqy_filter_type == LT_Vehicle || query.cqy_filter_type == LT_Truck); else if (entry.fext == "car") diff --git a/source/main/resources/CacheSystem.h b/source/main/resources/CacheSystem.h index 3d8098d440..97164ef050 100644 --- a/source/main/resources/CacheSystem.h +++ b/source/main/resources/CacheSystem.h @@ -27,6 +27,7 @@ #pragma once #include "Application.h" +#include "CharacterFileFormat.h" #include "Language.h" #include "RigDef_File.h" #include "SimData.h" @@ -84,6 +85,7 @@ class CacheEntry RigDef::DocumentPtr actor_def; //!< Cached actor definition (aka truckfile) after first spawn std::shared_ptr skin_def; //!< Cached skin info, added on first use or during cache rebuild + CharacterDocumentPtr character_def; //!< Cached character definition // following all TRUCK detail information: Ogre::String description; @@ -239,6 +241,7 @@ class CacheSystem void FillTerrainDetailInfo(CacheEntry &entry, Ogre::DataStreamPtr ds, Ogre::String fname); void FillTruckDetailInfo(CacheEntry &entry, Ogre::DataStreamPtr ds, Ogre::String fname, Ogre::String group); + void FillCharacterDetailInfo(CacheEntry& entry, Ogre::DataStreamPtr ds); void GenerateHashFromFilenames(); //!< For quick detection of added/removed content diff --git a/source/main/system/CVar.cpp b/source/main/system/CVar.cpp index 2500aebad0..da9100e035 100644 --- a/source/main/system/CVar.cpp +++ b/source/main/system/CVar.cpp @@ -58,6 +58,7 @@ void Console::cVarSetupBuiltins() App::sim_gearbox_mode = this->cVarCreate("sim_gearbox_mode", "GearboxMode", CVAR_ARCHIVE | CVAR_TYPE_INT); App::sim_soft_reset_mode = this->cVarCreate("sim_soft_reset_mode", "", CVAR_TYPE_BOOL, "false"); App::sim_quickload_dialog = this->cVarCreate("sim_quickload_dialog", "", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "true"); + App::sim_player_character = this->cVarCreate("sim_player_character", "", CVAR_ARCHIVE, "classic.character"); App::mp_state = this->cVarCreate("mp_state", "", CVAR_TYPE_INT, "0"/*(int)MpState::DISABLED*/); App::mp_join_on_startup = this->cVarCreate("mp_join_on_startup", "Auto connect", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "false"); From 1e0d812231e1c059f8e9eff324cfd5669d1d8b5f Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 13 Nov 2022 23:50:02 +0100 Subject: [PATCH 19/32] Character modding: bugfixes, new param `mesh_scale` --- source/main/gameplay/CharacterFactory.cpp | 2 ++ source/main/gfx/GfxCharacter.cpp | 2 +- source/main/gui/panels/GUI_DirectionArrow.cpp | 27 ++++++++++--------- .../CharacterFileFormat.cpp | 6 +++++ .../CharacterFileFormat.h | 1 + 5 files changed, 25 insertions(+), 13 deletions(-) diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 726efa093a..3864423bc9 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -77,6 +77,8 @@ Character* CharacterFactory::CreateLocalCharacter() return nullptr; } + App::GetCacheSystem()->LoadResource(*cache_entry); + CharacterDocumentPtr document = this->FetchCharacterDef(cache_entry); if (!document) { diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index 8a507864a3..4784e100cd 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -55,7 +55,7 @@ GfxCharacter::GfxCharacter(Character* character) // add entity to the scene node xc_scenenode = App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->createChildSceneNode(); xc_scenenode->attachObject(entity); - xc_scenenode->setScale(0.02f, 0.02f, 0.02f); + xc_scenenode->setScale(xc_character->m_character_def->mesh_scale); xc_scenenode->setVisible(false); // setup colour diff --git a/source/main/gui/panels/GUI_DirectionArrow.cpp b/source/main/gui/panels/GUI_DirectionArrow.cpp index e66c0f0d89..07de1ed101 100644 --- a/source/main/gui/panels/GUI_DirectionArrow.cpp +++ b/source/main/gui/panels/GUI_DirectionArrow.cpp @@ -49,18 +49,21 @@ void GUI::DirectionArrow::LoadOverlay() void GUI::DirectionArrow::CreateArrow() { - // setup direction arrow - Ogre::Entity* arrow_entity = App::GetGfxScene()->GetSceneManager()->createEntity("arrow2.mesh"); - arrow_entity->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); - - // Add entity to the scene node - m_node = new Ogre::SceneNode(App::GetGfxScene()->GetSceneManager()); - m_node->attachObject(arrow_entity); - m_node->setVisible(false); - m_node->setScale(0.1, 0.1, 0.1); - m_node->setPosition(Ogre::Vector3(-0.6, +0.4, -1)); - m_node->setFixedYawAxis(true, Ogre::Vector3::UNIT_Y); - m_overlay->add3D(m_node); + if (m_overlay) + { + // setup direction arrow + Ogre::Entity* arrow_entity = App::GetGfxScene()->GetSceneManager()->createEntity("arrow2.mesh"); + arrow_entity->setRenderQueueGroup(Ogre::RENDER_QUEUE_OVERLAY); + + // Add entity to the scene node + m_node = new Ogre::SceneNode(App::GetGfxScene()->GetSceneManager()); + m_node->attachObject(arrow_entity); + m_node->setVisible(false); + m_node->setScale(0.1, 0.1, 0.1); + m_node->setPosition(Ogre::Vector3(-0.6, +0.4, -1)); + m_node->setFixedYawAxis(true, Ogre::Vector3::UNIT_Y); + m_overlay->add3D(m_node); + } } void GUI::DirectionArrow::Update(RoR::GfxActor* player_vehicle) diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.cpp b/source/main/resources/character_fileformat/CharacterFileFormat.cpp index ec8fe9201b..63e171db06 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.cpp +++ b/source/main/resources/character_fileformat/CharacterFileFormat.cpp @@ -132,6 +132,12 @@ void CharacterParser::ProcessCurrentLine() { m_def->mesh_name = GetParam(1); } + else if (StartsWith(m_cur_line, "mesh_scale")) + { + if (m_cur_args.size() > 1) m_def->mesh_scale.x = Ogre::StringConverter::parseReal(GetParam(1)); + if (m_cur_args.size() > 2) m_def->mesh_scale.y = Ogre::StringConverter::parseReal(GetParam(2)); + if (m_cur_args.size() > 3) m_def->mesh_scale.z = Ogre::StringConverter::parseReal(GetParam(3)); + } else if (StartsWith(m_cur_line, "force_animblend")) { m_def->force_animblend = ParseForceAnimBlend(GetParam(1)); diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.h b/source/main/resources/character_fileformat/CharacterFileFormat.h index 5a0f452b79..fb34025ec2 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.h +++ b/source/main/resources/character_fileformat/CharacterFileFormat.h @@ -82,6 +82,7 @@ struct CharacterDocument { std::string character_name; std::string mesh_name; + Ogre::Vector3 mesh_scale = Ogre::Vector3(1, 1, 1); std::vector anims; std::vector bone_blend_masks; ForceAnimBlend force_animblend = ForceAnimBlend::NONE; //!< Should a specific `Ogre::SkeletonAnimationBlendMode` be forced, or should we keep what the .skeleton file defines? From 7c1c53c5fdd01a3a68d34bb7b50943b6b7d1d4c9 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Mon, 14 Nov 2022 10:06:27 +0100 Subject: [PATCH 20/32] Deleted now defunct 'config/classic.character' You need a rorbot mod to use this branch. Without one, you won't be able to load a terrain. Here is the classic rorbot remade as a mod (it will be uploaded to content repo later) and one test rorbot mod from a beginner tutorial: https://github.com/RigsOfRods/rigs-of-rods/pull/294 --- resources/skeleton/config/classic.character | 195 -------------------- 1 file changed, 195 deletions(-) delete mode 100644 resources/skeleton/config/classic.character diff --git a/resources/skeleton/config/classic.character b/resources/skeleton/config/classic.character deleted file mode 100644 index 9442395925..0000000000 --- a/resources/skeleton/config/classic.character +++ /dev/null @@ -1,195 +0,0 @@ -; The classic character (aka RORbot) - -; This file format lets you compose game animations from one or more -; skeletal animations exported from a 3D modelling tool. -; NOTE each game-anim is evaluated separately, there is no either-or relation, -; so you must set each anim's conditions to avoid conflicts. - -; For explanation of individual parameters, -; see file source/main/resources/character_fileformat/CharacterFileFormat.h - -; For authoritative list of SITUATION_ and ACTION_ flags, -; see file source/main/gameplay/Character.h - -; Tip: in game, use 'Game animations' UI panel, -; open it from top menubar >> Tools >> Character pose util >> tab 'game anims' - -mesh_name "character.mesh" -character_name "Classic RORBot" - -begin_bone_blend_mask -; This is a dummy example of how bone blend masks can be done. -; bone_weight - anim_name "Run" - bone_weight "hand.R" 1 - bone_weight "hand.L" 1 - bone_weight "forearm.R" 1 - bone_weight "forearm.L" 1 - bone_weight "upper_arm.R" 1 - bone_weight "upper_arm.L" 1 - bone_weight "shoulder.R" 1 - bone_weight "shoulder.L" 1 - bone_weight "head" 1 - bone_weight "neck" 1 - bone_weight "chest" 1 - bone_weight "spine" 1 -end_bone_blend_mask - -begin_animation - game_description "driving" - for_situation SITUATION_DRIVING - anim_name "Driving" - playback_time_ratio 0.f - playback_steering_ratio -1.f - anim_continuous false - source_percentual true - anim_neutral_mid true - playback_trim 0.01f -end_animation - -begin_animation - game_description "swimming" - for_situation SITUATION_IN_DEEP_WATER - for_action ACTION_MOVE_FORWARD - anim_name "Swim_loop" - playback_h_speed_ratio 1.f - playback_time_ratio 1.f -end_animation - -begin_animation - game_description "swimming on spot" - for_situation SITUATION_IN_DEEP_WATER - except_action ACTION_MOVE_FORWARD - anim_name "Spot_swim" - playback_time_ratio 1.f -end_animation - -begin_animation - game_description "running" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - for_action ACTION_MOVE_FORWARD - for_action ACTION_RUN - anim_name "Run" - playback_time_ratio 1.f - playback_h_speed_ratio 1.f -end_animation - -begin_animation - game_description "walking forward" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - for_action ACTION_MOVE_FORWARD - except_action ACTION_RUN - anim_name "Walk" - playback_time_ratio 1.f - playback_h_speed_ratio 1.f -end_animation - -begin_animation - game_description "walking backward" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - for_action ACTION_MOVE_BACKWARD - anim_name "Walk" - playback_time_ratio -1.f - playback_h_speed_ratio 1.f -end_animation - -begin_animation - game_description "side stepping right" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - for_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_TURN_RIGHT - except_action ACTION_TURN_LEFT - except_action ACTION_RUN - anim_name "Side_step" - playback_time_ratio 1.f - anim_autorestart true -end_animation - -begin_animation - game_description "side stepping left" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - for_action ACTION_SIDESTEP_LEFT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_TURN_RIGHT - except_action ACTION_TURN_LEFT - except_action ACTION_RUN - anim_name "Side_step" - playback_time_ratio -1.f - anim_autorestart true -end_animation - -begin_animation - game_description "turning left" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - for_action ACTION_TURN_LEFT - except_action ACTION_SIDESTEP_LEFT - except_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_RUN - anim_name "Turn" - playback_time_ratio 1.f - anim_autorestart true -end_animation - -begin_animation - game_description "turning right" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - for_action ACTION_TURN_RIGHT - except_action ACTION_SIDESTEP_LEFT - except_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_RUN - anim_name "Turn" - playback_time_ratio -1.f - anim_autorestart true -end_animation - -begin_animation - game_description "idle standing" - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - except_situation SITUATION_CUSTOM_MODE_01 - except_action ACTION_TURN_RIGHT - except_action ACTION_TURN_LEFT - except_action ACTION_SIDESTEP_LEFT - except_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_RUN - except_action ACTION_CUSTOM_01 - anim_name "Idle_sway" - playback_time_ratio 1.f -end_animation - -begin_animation - game_description "custom action 01 test" - for_action ACTION_CUSTOM_01 - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - except_situation SITUATION_CUSTOM_MODE_01 - anim_name "Spot_swim" - playback_time_ratio 10.0 - anim_continuous false -end_animation - -begin_animation - game_description "custom mode 01 test" - for_situation SITUATION_CUSTOM_MODE_01 - except_situation SITUATION_IN_DEEP_WATER - except_situation SITUATION_DRIVING - anim_name "Driving" - playback_time_ratio 2.0 - -end_animation From b3a9b9f2164bb3846ff7c14c1255faf3ab97bf84 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Tue, 15 Nov 2022 15:03:05 +0100 Subject: [PATCH 21/32] Moddable character: final touches Improved looks of the Settings/Gameplay/Select button. Added fallback code to use default chracter if the configured custom mod isn't found. All default character media moved under new directory /resources/classic_character - the deleted mesh/skeleton/material files were reintroduced, missing textures were migrated, a .character definition file was added. --- .../character-alpha.png | Bin .../character.dds | Bin .../classic_character/character.material | 28 +++ resources/classic_character/character.mesh | Bin 0 -> 473483 bytes .../classic_character/character.skeleton | Bin 0 -> 352660 bytes resources/classic_character/classic.character | 189 ++++++++++++++++++ source/main/Application.h | 2 + source/main/gameplay/CharacterFactory.cpp | 19 +- source/main/gui/panels/GUI_GameSettings.cpp | 3 +- source/main/resources/CacheSystem.cpp | 4 +- source/main/resources/ContentManager.cpp | 2 + source/main/system/CVar.cpp | 2 +- 12 files changed, 243 insertions(+), 6 deletions(-) rename resources/{textures => classic_character}/character-alpha.png (100%) rename resources/{textures => classic_character}/character.dds (100%) create mode 100644 resources/classic_character/character.material create mode 100644 resources/classic_character/character.mesh create mode 100644 resources/classic_character/character.skeleton create mode 100644 resources/classic_character/classic.character diff --git a/resources/textures/character-alpha.png b/resources/classic_character/character-alpha.png similarity index 100% rename from resources/textures/character-alpha.png rename to resources/classic_character/character-alpha.png diff --git a/resources/textures/character.dds b/resources/classic_character/character.dds similarity index 100% rename from resources/textures/character.dds rename to resources/classic_character/character.dds diff --git a/resources/classic_character/character.material b/resources/classic_character/character.material new file mode 100644 index 0000000000..0c30934b4b --- /dev/null +++ b/resources/classic_character/character.material @@ -0,0 +1,28 @@ +import * from "managed_mats.material" + +material tracks/character: RoR/Managed_Mats/Base +{ + technique BaseTechnique + { + pass BaseRender + { + depth_bias -20 + texture_unit Diffuse_Map 1 + { + texture character.dds + } + } + pass ColorChange + { + scene_blend alpha_blend + texture_unit + { + texture character-alpha.png + } + texture_unit + { + colour_op_ex blend_current_alpha src_manual src_current 0 0 0 + } + } + } +} \ No newline at end of file diff --git a/resources/classic_character/character.mesh b/resources/classic_character/character.mesh new file mode 100644 index 0000000000000000000000000000000000000000..014009e801f2275ae3f3c5b30f337809bb8518f1 GIT binary patch literal 473483 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

|vsEa;U^OubiuLaYJR|JU?sxP!lk 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�Yz17S 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 #77s0qBzgkmU< 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 Y^zQO*_lL6;>u^%CJUe6Q&EL%b0n}8fpa1{> literal 0 HcmV?d00001 diff --git a/resources/classic_character/character.skeleton b/resources/classic_character/character.skeleton new file mode 100644 index 0000000000000000000000000000000000000000..ed707925432297c56743bf5f5b0c900cc94e2d91 GIT binary patch literal 352660 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�(OcLq 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

aa@5Kpl?dx>164@S9iHToOBeP zCe>F#Bq-4(OL;TdBGub-g)8pN;swkW(<(%QCSBhugZf#ej2{1TFB>xyi3F-Ig?xNO z=0j!mVykqkaw>OvDC0cC50PNMUrXi8e~HqAIe&5W|6wRn zw^20#k)T@D!*Yo^3DV8*Os?C#6^k~4;A4%q?VVzekC?*rqyWbX`p7KS70DFuXl5c=&{hmZ&~Fezt}&4 zL>jf~hdJf$2*e2=I;4v8_ub(do%=5y8p%cU0sNyQScJF<@P{w}BYgq?mV<#Lj5X8 z4O#`-xhxqu7jG_3&8WdYIoVK7Y(qLGY@W3%AVM*X`l3BEUklM~8uPL7t>j8g=$bd$ zWkt;AoOT85Asnwo39rU9=c^@mlR5mYQ#^8fj)wM~Kq~tyU_Y__+j8OEQG7+2-{b?o zk@af^9x#^NS3pFWKjn~6p_s^Dc+o)~ex3TO|GkDGx;UPGDYTv4nBV-el{^Nq?3&hd zbMt^bN2zN0#W^c|_#y|J$=lPY--mk-fd%H)E<~Mw1{4!Z&-Ui8Pi!iG38i}mW0%8z zK7huYPQ}FbVcz_k=}qP68I*^*CWxP~*A+ygApbm~wSzBTI<&d`o(Dvx zsL+bymOb@(WrQG4Ev@CDcnma8vgZN&mHNr8#3L`N^FNdZ@>}N_#KQ47Nc7CDD~MRW zoyLgHODpm&%WKN>9PIXuzmzHl&6~JDw4oBb_d*xB$E_)3eW)WR-TN9b(HS-?*LG1>`Exk5xiDjksmJP z<${NsT30=yE0)b3L&XWx*W^>Y+W5=kvu;`6rL(wftPf*`;>kvZm7*UT$eTMimP%+< zgd|?^ATavu3Pp#f^vjvRfh==_6+URQWlR3pnZ-%4%^-oAvT_Yd*Qsf~(R_T49CQN~}j4qj>UuU%6_7Z0XI| z2hz?@8ZA4HsiH$Rk`uhXNZWoskP2l{l)YAA4|K6+J2_^_SE;hc18LD`JCvHyk?wTt zX1R;yn-t&SzEoP3i&-2SqY1?c-F|rD}IJC0z=O2aSpw#nH zpVRtCVC6C0d7@F-k#fx$CFJgvk4S3ohQuz2))WPMm#QNL-ke@u4oygq&QqPRe<5*>#8OZT8{V78cCi&5>qf5_#~G`%e<^_IHH556ssswYyL0A1l1=14Qq zSd`XGQ06prmlIkHm;95MR>{7=3_1YM1)nTK*^a9Fcqw6b>dKyHIq9To!)$HYUjfz$ zUVh%f3d*1d-dNkkq#5VztW%v6@a$_$j>@K!{&Jo5C#)xFpO0CAW-E#4(U4oRTPP=Z zSKHP!Vit?^L1N9_uTv&YbFi+NMKTf0 zkiOXJSuK{>T~jRTdnaXg#ZuOPV(q?pq)HF_k7BEx#19r*N?4T&*5cb~9;A}O_D4Ne zs+gItfY>zBlF}+q8S9ZFEF&Xzb(TRBg8qmp&+^f0+bJl`7O4Va8#dv3YbtZD#)=w1{<0 z>9}*cv#w;iRGo8U^VY3UdDfOZG^y!-}PB z`14*$1r0@JNVA-QXhPrfQuEBoDbwXZ%K<7qnH^nv$nop_{#ZIREiq-@#^shlDhf*v zFV!X>ulJhqL7H&uP0E(bHcJCt6J{L+BbVoAOFeIuv)=}V{&t%LM0`E??bXZ^2T5Kk>9OK$1-QAX_gw>xHTb#DKTjeymqq3(3Ie5SR zPU3z4^_GnD9@dXL?ADMf7rBp4SbZ^SYMf<#{W{i0esn#uakANtLo?jEibrFUEq9yM zvHlywYIJ0b+Il>I;`WRdXJj0> Tools >> Character pose util >> tab 'game anims' +; +; ----------------------------------------------------------------------------- + +; Name displayed in the Selector UI - required +character_name "Classic RORBot" + +; Name of the mesh file - required. +mesh_name "character.mesh" + +; Scaling factor of the mesh - optional, default is 1.0 on all axes. +; NOTE: the 0.02 factor used to be hardcoded because the default character mesh is oversized like that. +mesh_scale 0.02 0.02 0.02 + +begin_animation + game_description "driving" + for_situation SITUATION_DRIVING + anim_name "Driving" + playback_time_ratio 0.f + playback_steering_ratio -1.f + anim_continuous false + source_percentual true + anim_neutral_mid true + playback_trim 0.01f +end_animation + +begin_animation + game_description "swimming" + for_situation SITUATION_IN_DEEP_WATER + for_action ACTION_MOVE_FORWARD + anim_name "Swim_loop" + playback_h_speed_ratio 1.f + playback_time_ratio 1.f +end_animation + +begin_animation + game_description "swimming on spot" + for_situation SITUATION_IN_DEEP_WATER + except_action ACTION_MOVE_FORWARD + anim_name "Spot_swim" + playback_time_ratio 1.f +end_animation + +begin_animation + game_description "running" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_MOVE_FORWARD + for_action ACTION_RUN + anim_name "Run" + playback_time_ratio 1.f + playback_h_speed_ratio 1.f +end_animation + +begin_animation + game_description "walking forward" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_MOVE_FORWARD + except_action ACTION_RUN + anim_name "Walk" + playback_time_ratio 1.f + playback_h_speed_ratio 1.f +end_animation + +begin_animation + game_description "walking backward" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_MOVE_BACKWARD + anim_name "Walk" + playback_time_ratio -1.f + playback_h_speed_ratio 1.f +end_animation + +begin_animation + game_description "side stepping right" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_TURN_RIGHT + except_action ACTION_TURN_LEFT + except_action ACTION_RUN + anim_name "Side_step" + playback_time_ratio 1.f + anim_autorestart true +end_animation + +begin_animation + game_description "side stepping left" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_SIDESTEP_LEFT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_TURN_RIGHT + except_action ACTION_TURN_LEFT + except_action ACTION_RUN + anim_name "Side_step" + playback_time_ratio -1.f + anim_autorestart true +end_animation + +begin_animation + game_description "turning left" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_TURN_LEFT + except_action ACTION_SIDESTEP_LEFT + except_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_RUN + anim_name "Turn" + playback_time_ratio 1.f + anim_autorestart true +end_animation + +begin_animation + game_description "turning right" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + for_action ACTION_TURN_RIGHT + except_action ACTION_SIDESTEP_LEFT + except_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_RUN + anim_name "Turn" + playback_time_ratio -1.f + anim_autorestart true +end_animation + +begin_animation + game_description "idle standing" + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + except_situation SITUATION_CUSTOM_MODE_01 + except_action ACTION_TURN_RIGHT + except_action ACTION_TURN_LEFT + except_action ACTION_SIDESTEP_LEFT + except_action ACTION_SIDESTEP_RIGHT + except_action ACTION_MOVE_FORWARD + except_action ACTION_MOVE_BACKWARD + except_action ACTION_RUN + except_action ACTION_CUSTOM_01 + anim_name "Idle_sway" + playback_time_ratio 1.f +end_animation + +begin_animation + game_description "custom action 01 test" + for_action ACTION_CUSTOM_01 + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + except_situation SITUATION_CUSTOM_MODE_01 + anim_name "Spot_swim" + playback_time_ratio 10.0 + anim_continuous false +end_animation + +begin_animation + game_description "custom mode 01 test" + for_situation SITUATION_CUSTOM_MODE_01 + except_situation SITUATION_IN_DEEP_WATER + except_situation SITUATION_DRIVING + anim_name "Driving" + playback_time_ratio 2.0 + +end_animation + + diff --git a/source/main/Application.h b/source/main/Application.h index 5ae72db8a0..8a9287b11b 100644 --- a/source/main/Application.h +++ b/source/main/Application.h @@ -39,6 +39,8 @@ #define ROR_ASSERT(_EXPR) assert(_EXPR) +#define CLASSIC_CHARACTER_FILE "classic.character" + // Legacy macros #define TOSTRING(x) Ogre::StringConverter::toString(x) #define PARSEINT(x) Ogre::StringConverter::parseInt(x) diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 3864423bc9..b823bc9e32 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -72,9 +72,22 @@ Character* CharacterFactory::CreateLocalCharacter() CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, App::sim_player_character->getStr()); if (!cache_entry) { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("Could not find character '{}' in mod cache.", App::sim_player_character->getStr())); - return nullptr; + // If this was a custom mod, retry with the builtin + if (App::sim_player_character->getStr() != CLASSIC_CHARACTER_FILE) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Could not find configured character '{}' in mod cache, falling back to '{}'", App::sim_player_character->getStr(), CLASSIC_CHARACTER_FILE)); + App::sim_player_character->setStr(CLASSIC_CHARACTER_FILE); + + cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, App::sim_player_character->getStr()); + } + + if (!cache_entry) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("Could not find character '{}' in mod cache.", App::sim_player_character->getStr())); + return nullptr; + } } App::GetCacheSystem()->LoadResource(*cache_entry); diff --git a/source/main/gui/panels/GUI_GameSettings.cpp b/source/main/gui/panels/GUI_GameSettings.cpp index 92b32d90cd..fac6630990 100644 --- a/source/main/gui/panels/GUI_GameSettings.cpp +++ b/source/main/gui/panels/GUI_GameSettings.cpp @@ -268,11 +268,12 @@ void GameSettings::DrawGameplaySettings() DrawGCheckbox(App::sim_quickload_dialog, _LC("GameSettings", "Show confirm. UI dialog for quickload")); // Character + ImGui::Separator(); ImGui::TextDisabled("%s:", _LC("GameSettings", "Player character")); ImGui::SameLine(); ImGui::Text("%s", App::sim_player_character->getStr().c_str()); ImGui::SameLine(); - if (ImGui::Button(_LC("GameSettings", "Select"))) + if (ImGui::SmallButton(_LC("GameSettings", "Select"))) { LoaderType* payload = new LoaderType(LoaderType::LT_Character); App::GetGameContext()->PushMessage(Message(MSG_GUI_OPEN_SELECTOR_REQUESTED, (void*)payload)); diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index 1251cfc426..e8ea011fe9 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -1139,6 +1139,7 @@ void CacheSystem::LoadResource(CacheEntry& t) // PagedGeometry is hardcoded to use `Ogre::ResourceGroupManager::DEFAULT_RESOURCE_GROUP_NAME` ResourceGroupManager::getSingleton().createResourceGroup(group, /*inGlobalPool=*/true); ResourceGroupManager::getSingleton().addResourceLocation(t.resource_bundle_path, t.resource_bundle_type, group); + App::GetContentManager()->InitManagedMaterials(group); } else if (t.fext == "character") { @@ -1146,6 +1147,7 @@ void CacheSystem::LoadResource(CacheEntry& t) // See bottom 'note' at https://ogrecave.github.io/ogre/api/latest/_resource-_management.html#Resource-Groups ResourceGroupManager::getSingleton().createResourceGroup(group, /*inGlobalPool=*/false); ResourceGroupManager::getSingleton().addResourceLocation(t.resource_bundle_path, t.resource_bundle_type, group); + App::GetContentManager()->InitManagedMaterials(group); } else if (t.fext == "skin") { @@ -1161,8 +1163,8 @@ void CacheSystem::LoadResource(CacheEntry& t) // See bottom 'note' at https://ogrecave.github.io/ogre/api/latest/_resource-_management.html#Resource-Groups ResourceGroupManager::getSingleton().createResourceGroup(group, /*inGlobalPool=*/false); ResourceGroupManager::getSingleton().addResourceLocation(t.resource_bundle_path, t.resource_bundle_type, group); - App::GetContentManager()->InitManagedMaterials(group); + App::GetContentManager()->AddResourcePack(ContentManager::ResourcePack::TEXTURES, group); App::GetContentManager()->AddResourcePack(ContentManager::ResourcePack::MATERIALS, group); App::GetContentManager()->AddResourcePack(ContentManager::ResourcePack::MESHES, group); diff --git a/source/main/resources/ContentManager.cpp b/source/main/resources/ContentManager.cpp index 81bccd5a91..9150473d74 100644 --- a/source/main/resources/ContentManager.cpp +++ b/source/main/resources/ContentManager.cpp @@ -253,6 +253,7 @@ void ContentManager::InitModCache(CacheValidity validity) std::string user = App::sys_user_dir->getStr(); std::string base = App::sys_process_dir->getStr(); std::string objects = PathCombine("resources", "beamobjects.zip"); + std::string character = PathCombine("resources", "classic_character.zip"); if (!App::app_extra_mod_path->getStr().empty()) { @@ -265,6 +266,7 @@ void ContentManager::InitModCache(CacheValidity validity) ResourceGroupManager::getSingleton().addResourceLocation(PathCombine(user, "vehicles"), "FileSystem", RGN_CONTENT); ResourceGroupManager::getSingleton().addResourceLocation(PathCombine(base, "content") , "FileSystem", RGN_CONTENT); ResourceGroupManager::getSingleton().addResourceLocation(PathCombine(base, objects) , "Zip" , RGN_CONTENT); + ResourceGroupManager::getSingleton().addResourceLocation(PathCombine(base, character) , "Zip" , RGN_CONTENT); ResourceGroupManager::getSingleton().createResourceGroup(RGN_TEMP, false); if (!App::app_extra_mod_path->getStr().empty()) diff --git a/source/main/system/CVar.cpp b/source/main/system/CVar.cpp index da9100e035..7924583bbc 100644 --- a/source/main/system/CVar.cpp +++ b/source/main/system/CVar.cpp @@ -58,7 +58,7 @@ void Console::cVarSetupBuiltins() App::sim_gearbox_mode = this->cVarCreate("sim_gearbox_mode", "GearboxMode", CVAR_ARCHIVE | CVAR_TYPE_INT); App::sim_soft_reset_mode = this->cVarCreate("sim_soft_reset_mode", "", CVAR_TYPE_BOOL, "false"); App::sim_quickload_dialog = this->cVarCreate("sim_quickload_dialog", "", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "true"); - App::sim_player_character = this->cVarCreate("sim_player_character", "", CVAR_ARCHIVE, "classic.character"); + App::sim_player_character = this->cVarCreate("sim_player_character", "", CVAR_ARCHIVE, CLASSIC_CHARACTER_FILE); App::mp_state = this->cVarCreate("mp_state", "", CVAR_TYPE_INT, "0"/*(int)MpState::DISABLED*/); App::mp_join_on_startup = this->cVarCreate("mp_join_on_startup", "Auto connect", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "false"); From c7c8c523a4793941e6f2c0013acb92e076371d05 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Fri, 2 Jun 2023 14:33:16 +0200 Subject: [PATCH 22/32] Codechange: clarified character modding terminology. Goal: * to resolve ambiguity between "anim/animation" meaning either skeletal animation or game-defined animation. Ambiguity is bad. Changes: * game animations (defined in the .character file) ale now called Actions. the `begin/end_animation` is now `begin/end_action`. * ACTION_ flags were renamed to CONTROL_ flags. Recap of how the system works: * A skeletal animation is a named animation track in OGRE '*.skeleton' file, like "Walk", "Swim", "Side_step"... * User defines 'actions' via .character file, by specifying a skeletal anim name to play and game state flags which trigger/block it. * SITUATION_ flags tell you what circumstances the character is in (on ground, in deep water, driving...) * CONTROL_ flags tell you what controller input is the player giving (go forward, turn, sidestep...) --- resources/classic_character/classic.character | 178 +++++++++--------- source/main/ForwardDeclarations.h | 3 + source/main/gameplay/Character.cpp | 145 +++++++------- source/main/gameplay/Character.h | 49 +---- source/main/gfx/GfxCharacter.cpp | 27 +-- source/main/gfx/GfxCharacter.h | 2 +- source/main/gfx/SimBuffers.h | 4 +- .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 30 +-- .../main/gui/panels/GUI_CharacterPoseUtil.h | 6 +- source/main/network/RoRnet.h | 74 ++++++++ .../CharacterFileFormat.cpp | 59 +++--- .../CharacterFileFormat.h | 31 ++- 12 files changed, 322 insertions(+), 286 deletions(-) diff --git a/resources/classic_character/classic.character b/resources/classic_character/classic.character index 75e4b93347..801091fff8 100644 --- a/resources/classic_character/classic.character +++ b/resources/classic_character/classic.character @@ -1,19 +1,20 @@ ; The classic character (aka RoRbot) ; ----------------------------------------------------------------------------- ; -; This file format lets you compose game animations from one or more -; skeletal animations exported from a 3D modelling tool. -; NOTE each game-anim is evaluated separately, there is no either-or relation, -; so you must set each anim's conditions to avoid conflicts. +; This file format lets you compose 'actions' from one or more +; skeletal animations exported from a 3D modelling tool, +; by responding to SITUATION_ and CONTROL_ flags sent by the game. +; NOTE each 'action' is evaluated separately, there is no either-or relation, +; so you must always blacklist all non-conforming flags to avoid conflicts. ; ; For explanation of individual parameters, ; see file source/main/resources/character_fileformat/CharacterFileFormat.h +; NOTE ON TERMINOLOGY: 'anim' always means skeletal animation, not the 'action'. ; -; For authoritative list of SITUATION_ and ACTION_ flags, -; see file source/main/gameplay/Character.h +; For authoritative list of SITUATION_ and CONTROL_ flags, see file RoRnet.h ; -; Tip: in game, use 'Game animations' UI panel, -; open it from top menubar >> Tools >> Character pose util >> tab 'game anims' +; Tip: in game, use 'Pose Util' UI panel, +; open it from top menubar >> Tools >> Character pose util. ; ; ----------------------------------------------------------------------------- @@ -27,8 +28,8 @@ mesh_name "character.mesh" ; NOTE: the 0.02 factor used to be hardcoded because the default character mesh is oversized like that. mesh_scale 0.02 0.02 0.02 -begin_animation - game_description "driving" +begin_action + action_description "driving" for_situation SITUATION_DRIVING anim_name "Driving" playback_time_ratio 0.f @@ -37,153 +38,152 @@ begin_animation source_percentual true anim_neutral_mid true playback_trim 0.01f -end_animation +end_action -begin_animation - game_description "swimming" +begin_action + action_description "swimming" for_situation SITUATION_IN_DEEP_WATER - for_action ACTION_MOVE_FORWARD + for_control CONTROL_MOVE_FORWARD anim_name "Swim_loop" playback_h_speed_ratio 1.f playback_time_ratio 1.f -end_animation +end_action -begin_animation - game_description "swimming on spot" +begin_action + action_description "swimming on spot" for_situation SITUATION_IN_DEEP_WATER - except_action ACTION_MOVE_FORWARD + except_control CONTROL_MOVE_FORWARD anim_name "Spot_swim" playback_time_ratio 1.f -end_animation +end_action -begin_animation - game_description "running" +begin_action + action_description "running" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING - for_action ACTION_MOVE_FORWARD - for_action ACTION_RUN + for_control CONTROL_MOVE_FORWARD + for_control CONTROL_RUN anim_name "Run" playback_time_ratio 1.f playback_h_speed_ratio 1.f -end_animation +end_action -begin_animation - game_description "walking forward" +begin_action + action_description "walking forward" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING - for_action ACTION_MOVE_FORWARD - except_action ACTION_RUN + for_control CONTROL_MOVE_FORWARD + except_control CONTROL_RUN anim_name "Walk" playback_time_ratio 1.f playback_h_speed_ratio 1.f -end_animation +end_action -begin_animation - game_description "walking backward" +begin_action + action_description "walking backward" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING - for_action ACTION_MOVE_BACKWARD + for_control CONTROL_MOVE_BACKWARD anim_name "Walk" playback_time_ratio -1.f playback_h_speed_ratio 1.f -end_animation +end_action -begin_animation - game_description "side stepping right" +begin_action + action_description "side stepping right" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING - for_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_TURN_RIGHT - except_action ACTION_TURN_LEFT - except_action ACTION_RUN + for_control CONTROL_SIDESTEP_RIGHT + except_control CONTROL_MOVE_FORWARD + except_control CONTROL_MOVE_BACKWARD + except_control CONTROL_TURN_RIGHT + except_control CONTROL_TURN_LEFT + except_control CONTROL_RUN anim_name "Side_step" playback_time_ratio 1.f anim_autorestart true -end_animation +end_action -begin_animation - game_description "side stepping left" +begin_action + action_description "side stepping left" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING - for_action ACTION_SIDESTEP_LEFT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_TURN_RIGHT - except_action ACTION_TURN_LEFT - except_action ACTION_RUN + for_control CONTROL_SIDESTEP_LEFT + except_control CONTROL_MOVE_FORWARD + except_control CONTROL_MOVE_BACKWARD + except_control CONTROL_TURN_RIGHT + except_control CONTROL_TURN_LEFT + except_control CONTROL_RUN anim_name "Side_step" playback_time_ratio -1.f anim_autorestart true -end_animation +end_action -begin_animation - game_description "turning left" +begin_action + action_description "turning left" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING - for_action ACTION_TURN_LEFT - except_action ACTION_SIDESTEP_LEFT - except_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_RUN + for_control CONTROL_TURN_LEFT + except_control CONTROL_SIDESTEP_LEFT + except_control CONTROL_SIDESTEP_RIGHT + except_control CONTROL_MOVE_FORWARD + except_control CONTROL_MOVE_BACKWARD + except_control CONTROL_RUN anim_name "Turn" playback_time_ratio 1.f anim_autorestart true -end_animation +end_action -begin_animation - game_description "turning right" +begin_action + action_description "turning right" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING - for_action ACTION_TURN_RIGHT - except_action ACTION_SIDESTEP_LEFT - except_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_RUN + for_control CONTROL_TURN_RIGHT + except_control CONTROL_SIDESTEP_LEFT + except_control CONTROL_SIDESTEP_RIGHT + except_control CONTROL_MOVE_FORWARD + except_control CONTROL_MOVE_BACKWARD + except_control CONTROL_RUN anim_name "Turn" playback_time_ratio -1.f anim_autorestart true -end_animation +end_action -begin_animation - game_description "idle standing" +begin_action + action_description "idle standing" except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING except_situation SITUATION_CUSTOM_MODE_01 - except_action ACTION_TURN_RIGHT - except_action ACTION_TURN_LEFT - except_action ACTION_SIDESTEP_LEFT - except_action ACTION_SIDESTEP_RIGHT - except_action ACTION_MOVE_FORWARD - except_action ACTION_MOVE_BACKWARD - except_action ACTION_RUN - except_action ACTION_CUSTOM_01 + except_control CONTROL_TURN_RIGHT + except_control CONTROL_TURN_LEFT + except_control CONTROL_SIDESTEP_LEFT + except_control CONTROL_SIDESTEP_RIGHT + except_control CONTROL_MOVE_FORWARD + except_control CONTROL_MOVE_BACKWARD + except_control CONTROL_RUN + except_control CONTROL_CUSTOM_01 anim_name "Idle_sway" playback_time_ratio 1.f -end_animation +end_action -begin_animation - game_description "custom action 01 test" - for_action ACTION_CUSTOM_01 +begin_action + action_description "custom action 01 test" + for_control CONTROL_CUSTOM_ACTION_01 except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING except_situation SITUATION_CUSTOM_MODE_01 anim_name "Spot_swim" playback_time_ratio 10.0 anim_continuous false -end_animation +end_action -begin_animation - game_description "custom mode 01 test" +begin_action + action_description "custom mode 01 test" for_situation SITUATION_CUSTOM_MODE_01 except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING anim_name "Driving" - playback_time_ratio 2.0 - -end_animation + playback_time_ratio 2.0 +end_action diff --git a/source/main/ForwardDeclarations.h b/source/main/ForwardDeclarations.h index 64cb8fbd6a..c64e462cc6 100644 --- a/source/main/ForwardDeclarations.h +++ b/source/main/ForwardDeclarations.h @@ -37,6 +37,9 @@ namespace RoR typedef int ScriptUnitId_t; //!< Unique sequentially generated ID of a loaded and running scriptin session. Use `ScriptEngine::getScriptUnit()` static const ScriptUnitId_t SCRIPTUNITID_INVALID = -1; + typedef int CharacterActionID_t; //!< Index to `CharacterDocument::actions`, use `CHARACTERACTIONID_INVALID` as empty value. + static const CharacterActionID_t CHARACTERACTIONID_INVALID = -1; + typedef int PointidID_t; //!< index to `PointColDetector::hit_pointid_list`, use `RoR::POINTIDID_INVALID` as empty value. static const PointidID_t POINTIDID_INVALID = -1; diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index aaa3e540c0..dc24f386ba 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -38,6 +38,7 @@ using namespace Ogre; using namespace RoR; +using namespace RoRnet; Character::Character(CharacterDocumentPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) @@ -123,7 +124,7 @@ void Character::updateLocal(float dt) } bool m_can_jump = false; - m_action_flags = 0; + m_control_flags = 0; Vector3 position = m_character_position; @@ -249,7 +250,7 @@ void Character::updateLocal(float dt) setRotation(m_character_rotation + dt * 2.0f * scale * Radian(tmpJoy)); if (!isswimming && not_walking) { - BITMASK_SET_1(m_action_flags, Character::ACTION_TURN_RIGHT); + BITMASK_SET_1(m_control_flags, CONTROL_TURN_RIGHT); idleanim = false; } } @@ -262,7 +263,7 @@ void Character::updateLocal(float dt) setRotation(m_character_rotation - dt * scale * 2.0f * Radian(tmpJoy)); if (!isswimming && not_walking) { - BITMASK_SET_1(m_action_flags, Character::ACTION_TURN_LEFT); + BITMASK_SET_1(m_control_flags, CONTROL_TURN_LEFT); idleanim = false; } } @@ -279,7 +280,7 @@ void Character::updateLocal(float dt) position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() - Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() - Math::HALF_PI)); if (!isswimming && not_walking) { - BITMASK_SET_1(m_action_flags, Character::ACTION_SIDESTEP_LEFT); + BITMASK_SET_1(m_control_flags, CONTROL_SIDESTEP_LEFT); idleanim = false; } } @@ -293,7 +294,7 @@ void Character::updateLocal(float dt) position += dt * m_character_h_speed * 0.5f * accel * Vector3(cos(m_character_rotation.valueRadians() + Math::HALF_PI), 0.0f, sin(m_character_rotation.valueRadians() + Math::HALF_PI)); if (!isswimming && not_walking) { - BITMASK_SET_1(m_action_flags, Character::ACTION_SIDESTEP_RIGHT); + BITMASK_SET_1(m_control_flags, CONTROL_SIDESTEP_RIGHT); idleanim = false; } } @@ -319,7 +320,7 @@ void Character::updateLocal(float dt) { if (tmpRun > 0.0f) { - BITMASK_SET_1(m_action_flags, Character::ACTION_RUN); + BITMASK_SET_1(m_control_flags, CONTROL_RUN); } idleanim = false; @@ -334,41 +335,41 @@ void Character::updateLocal(float dt) } if (tmpGoForward != 0.f) - BITMASK_SET_1(m_action_flags, Character::ACTION_MOVE_FORWARD); + BITMASK_SET_1(m_control_flags, CONTROL_MOVE_FORWARD); if (tmpGoBackward != 0.f) - BITMASK_SET_1(m_action_flags, Character::ACTION_MOVE_BACKWARD); + BITMASK_SET_1(m_control_flags, CONTROL_MOVE_BACKWARD); if (isswimming) - BITMASK_SET_1(m_situation_flags, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_1(m_situation_flags, RoRnet::SITUATION_IN_DEEP_WATER); else - BITMASK_SET_0(m_situation_flags, Character::SITUATION_IN_DEEP_WATER); + BITMASK_SET_0(m_situation_flags, RoRnet::SITUATION_IN_DEEP_WATER); m_character_position = position; // Custom actions - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_01)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_01); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_02)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_02); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_03)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_03); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_04)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_04); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_05)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_05); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_06)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_06); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_07)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_07); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_08)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_08); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_09)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_09); } - if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_10)) { BITMASK_SET_1(m_action_flags, Character::ACTION_CUSTOM_10); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_01)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_01); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_02)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_02); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_03)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_03); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_04)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_04); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_05)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_05); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_06)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_06); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_07)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_07); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_08)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_08); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_09)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_09); } + if (App::GetInputEngine()->getEventBoolValue(EV_CHARACTER_CUSTOM_ACTION_10)) { BITMASK_SET_1(m_control_flags, CONTROL_CUSTOM_ACTION_10); } // Custom modes (=situations) - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_01)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_01); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_02)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_02); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_03)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_03); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_04)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_04); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_05)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_05); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_06)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_06); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_07)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_07); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_08)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_08); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_09)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_09); } - if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_10)) { toggle_flag(m_situation_flags, Character::SITUATION_CUSTOM_MODE_10); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_01)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_01); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_02)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_02); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_03)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_03); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_04)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_04); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_05)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_05); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_06)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_06); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_07)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_07); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_08)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_08); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_09)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_09); } + if (App::GetInputEngine()->getEventBoolValueBounce(EV_CHARACTER_CUSTOM_MODE_10)) { toggle_flag(m_situation_flags, RoRnet::SITUATION_CUSTOM_MODE_10); } } void Character::move(Vector3 offset) @@ -431,7 +432,7 @@ void Character::SendStreamData() msg.pos_y = m_character_position.y; msg.pos_z = m_character_position.z; msg.rot_angle = m_character_rotation.valueRadians(); - msg.action_flags = m_action_flags; + msg.action_flags = m_control_flags; msg.situation_flags = m_situation_flags; App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA_DISCARDABLE, sizeof(NetCharacterMsgPos), (char*)&msg); @@ -449,7 +450,7 @@ void Character::receiveStreamData(unsigned int& type, int& source, unsigned int& auto* pos_msg = reinterpret_cast(buffer); this->setPosition(Ogre::Vector3(pos_msg->pos_x, pos_msg->pos_y, pos_msg->pos_z)); this->setRotation(Ogre::Radian(pos_msg->rot_angle)); - m_action_flags = pos_msg->action_flags; + m_control_flags = pos_msg->action_flags; m_situation_flags = pos_msg->situation_flags; } else if (msg->command == CHARACTER_CMD_DETACH) @@ -518,52 +519,52 @@ void Character::SetActorCoupling(bool enabled, ActorPtr actor) ActorPtr Character::GetActorCoupling() { return m_actor_coupling; } -const char* Character::ActionFlagToString(BitMask_t action) +const char* Character::ControlFlagToString(BitMask_t action) { - if (BITMASK_IS_1(action, ACTION_MOVE_FORWARD )) { return "ACTION_MOVE_FORWARD"; } - if (BITMASK_IS_1(action, ACTION_MOVE_BACKWARD )) { return "ACTION_MOVE_BACKWARD"; } - if (BITMASK_IS_1(action, ACTION_TURN_RIGHT )) { return "ACTION_TURN_RIGHT"; } - if (BITMASK_IS_1(action, ACTION_TURN_LEFT )) { return "ACTION_TURN_LEFT"; } - if (BITMASK_IS_1(action, ACTION_SIDESTEP_RIGHT)) { return "ACTION_SIDESTEP_RIGHT"; } - if (BITMASK_IS_1(action, ACTION_SIDESTEP_LEFT )) { return "ACTION_SIDESTEP_LEFT"; } - if (BITMASK_IS_1(action, ACTION_RUN )) { return "ACTION_RUN"; } - if (BITMASK_IS_1(action, ACTION_JUMP )) { return "ACTION_JUMP"; } - if (BITMASK_IS_1(action, ACTION_SLOW_TURN )) { return "ACTION_SLOW_TURN"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_01 )) { return "ACTION_CUSTOM_01"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_02 )) { return "ACTION_CUSTOM_02"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_03 )) { return "ACTION_CUSTOM_03"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_04 )) { return "ACTION_CUSTOM_04"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_05 )) { return "ACTION_CUSTOM_05"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_06 )) { return "ACTION_CUSTOM_06"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_07 )) { return "ACTION_CUSTOM_07"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_08 )) { return "ACTION_CUSTOM_08"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_09 )) { return "ACTION_CUSTOM_09"; } - if (BITMASK_IS_1(action, ACTION_CUSTOM_10 )) { return "ACTION_CUSTOM_10"; } + if (BITMASK_IS_1(action, CONTROL_MOVE_FORWARD )) { return "CONTROL_MOVE_FORWARD"; } + if (BITMASK_IS_1(action, CONTROL_MOVE_BACKWARD )) { return "CONTROL_MOVE_BACKWARD"; } + if (BITMASK_IS_1(action, CONTROL_TURN_RIGHT )) { return "CONTROL_TURN_RIGHT"; } + if (BITMASK_IS_1(action, CONTROL_TURN_LEFT )) { return "CONTROL_TURN_LEFT"; } + if (BITMASK_IS_1(action, CONTROL_SIDESTEP_RIGHT)) { return "CONTROL_SIDESTEP_RIGHT"; } + if (BITMASK_IS_1(action, CONTROL_SIDESTEP_LEFT )) { return "CONTROL_SIDESTEP_LEFT"; } + if (BITMASK_IS_1(action, CONTROL_RUN )) { return "CONTROL_RUN"; } + if (BITMASK_IS_1(action, CONTROL_JUMP )) { return "CONTROL_JUMP"; } + if (BITMASK_IS_1(action, CONTROL_SLOW_TURN )) { return "CONTROL_SLOW_TURN"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_01 )) { return "CONTROL_CUSTOM_ACTION_01"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_02 )) { return "CONTROL_CUSTOM_ACTION_02"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_03 )) { return "CONTROL_CUSTOM_ACTION_03"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_04 )) { return "CONTROL_CUSTOM_ACTION_04"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_05 )) { return "CONTROL_CUSTOM_ACTION_05"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_06 )) { return "CONTROL_CUSTOM_ACTION_06"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_07 )) { return "CONTROL_CUSTOM_ACTION_07"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_08 )) { return "CONTROL_CUSTOM_ACTION_08"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_09 )) { return "CONTROL_CUSTOM_ACTION_09"; } + if (BITMASK_IS_1(action, CONTROL_CUSTOM_ACTION_10 )) { return "CONTROL_CUSTOM_ACTION_10"; } return "~"; } -BitMask_t Character::ActionFlagFromString(std::string const& str) +BitMask_t Character::ControlFlagFromString(std::string const& str) { - if (str == "ACTION_MOVE_FORWARD" ) { return ACTION_MOVE_FORWARD ;} - if (str == "ACTION_MOVE_BACKWARD" ) { return ACTION_MOVE_BACKWARD ;} - if (str == "ACTION_TURN_RIGHT" ) { return ACTION_TURN_RIGHT ;} - if (str == "ACTION_TURN_LEFT" ) { return ACTION_TURN_LEFT ;} - if (str == "ACTION_SIDESTEP_RIGHT" ) { return ACTION_SIDESTEP_RIGHT;} - if (str == "ACTION_SIDESTEP_LEFT" ) { return ACTION_SIDESTEP_LEFT ;} - if (str == "ACTION_RUN" ) { return ACTION_RUN ;} - if (str == "ACTION_JUMP" ) { return ACTION_JUMP ;} - if (str == "ACTION_SLOW_TURN" ) { return ACTION_SLOW_TURN ;} - if (str == "ACTION_CUSTOM_01" ) { return ACTION_CUSTOM_01;} - if (str == "ACTION_CUSTOM_02" ) { return ACTION_CUSTOM_02;} - if (str == "ACTION_CUSTOM_03" ) { return ACTION_CUSTOM_03;} - if (str == "ACTION_CUSTOM_04" ) { return ACTION_CUSTOM_04;} - if (str == "ACTION_CUSTOM_05" ) { return ACTION_CUSTOM_05;} - if (str == "ACTION_CUSTOM_06" ) { return ACTION_CUSTOM_06;} - if (str == "ACTION_CUSTOM_07" ) { return ACTION_CUSTOM_07;} - if (str == "ACTION_CUSTOM_08" ) { return ACTION_CUSTOM_08;} - if (str == "ACTION_CUSTOM_09" ) { return ACTION_CUSTOM_09;} - if (str == "ACTION_CUSTOM_10" ) { return ACTION_CUSTOM_10;} + if (str == "CONTROL_MOVE_FORWARD" ) { return CONTROL_MOVE_FORWARD ;} + if (str == "CONTROL_MOVE_BACKWARD" ) { return CONTROL_MOVE_BACKWARD ;} + if (str == "CONTROL_TURN_RIGHT" ) { return CONTROL_TURN_RIGHT ;} + if (str == "CONTROL_TURN_LEFT" ) { return CONTROL_TURN_LEFT ;} + if (str == "CONTROL_SIDESTEP_RIGHT" ) { return CONTROL_SIDESTEP_RIGHT;} + if (str == "CONTROL_SIDESTEP_LEFT" ) { return CONTROL_SIDESTEP_LEFT ;} + if (str == "CONTROL_RUN" ) { return CONTROL_RUN ;} + if (str == "CONTROL_JUMP" ) { return CONTROL_JUMP ;} + if (str == "CONTROL_SLOW_TURN" ) { return CONTROL_SLOW_TURN ;} + if (str == "CONTROL_CUSTOM_ACTION_01" ) { return CONTROL_CUSTOM_ACTION_01;} + if (str == "CONTROL_CUSTOM_ACTION_02" ) { return CONTROL_CUSTOM_ACTION_02;} + if (str == "CONTROL_CUSTOM_ACTION_03" ) { return CONTROL_CUSTOM_ACTION_03;} + if (str == "CONTROL_CUSTOM_ACTION_04" ) { return CONTROL_CUSTOM_ACTION_04;} + if (str == "CONTROL_CUSTOM_ACTION_05" ) { return CONTROL_CUSTOM_ACTION_05;} + if (str == "CONTROL_CUSTOM_ACTION_06" ) { return CONTROL_CUSTOM_ACTION_06;} + if (str == "CONTROL_CUSTOM_ACTION_07" ) { return CONTROL_CUSTOM_ACTION_07;} + if (str == "CONTROL_CUSTOM_ACTION_08" ) { return CONTROL_CUSTOM_ACTION_08;} + if (str == "CONTROL_CUSTOM_ACTION_09" ) { return CONTROL_CUSTOM_ACTION_09;} + if (str == "CONTROL_CUSTOM_ACTION_10" ) { return CONTROL_CUSTOM_ACTION_10;} return 0; } diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index e9bbc72e7a..21094d79ce 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -23,6 +23,7 @@ #include "CharacterFileFormat.h" #include "ForwardDeclarations.h" +#include "RoRnet.h" #include "SimBuffers.h" #include @@ -49,46 +50,10 @@ class Character public: - // Action flags - static const BitMask_t ACTION_MOVE_FORWARD = BITMASK(1); - static const BitMask_t ACTION_MOVE_BACKWARD = BITMASK(2); - static const BitMask_t ACTION_TURN_RIGHT = BITMASK(3); - static const BitMask_t ACTION_TURN_LEFT = BITMASK(4); - static const BitMask_t ACTION_SIDESTEP_RIGHT = BITMASK(5); - static const BitMask_t ACTION_SIDESTEP_LEFT = BITMASK(6); - static const BitMask_t ACTION_RUN = BITMASK(7); - static const BitMask_t ACTION_JUMP = BITMASK(8); - static const BitMask_t ACTION_SLOW_TURN = BITMASK(9); - static const BitMask_t ACTION_CUSTOM_01 = BITMASK(10); - static const BitMask_t ACTION_CUSTOM_02 = BITMASK(11); - static const BitMask_t ACTION_CUSTOM_03 = BITMASK(12); - static const BitMask_t ACTION_CUSTOM_04 = BITMASK(13); - static const BitMask_t ACTION_CUSTOM_05 = BITMASK(14); - static const BitMask_t ACTION_CUSTOM_06 = BITMASK(15); - static const BitMask_t ACTION_CUSTOM_07 = BITMASK(16); - static const BitMask_t ACTION_CUSTOM_08 = BITMASK(17); - static const BitMask_t ACTION_CUSTOM_09 = BITMASK(18); - static const BitMask_t ACTION_CUSTOM_10 = BITMASK(19); - - static const char* ActionFlagToString(BitMask_t single_action_flag); - static BitMask_t ActionFlagFromString(std::string const& single_action_flag_str); - - // Situation flags - static const BitMask_t SITUATION_ON_SOLID_GROUND = BITMASK(1); - static const BitMask_t SITUATION_IN_SHALLOW_WATER = BITMASK(2); - static const BitMask_t SITUATION_IN_DEEP_WATER = BITMASK(3); - static const BitMask_t SITUATION_IN_AIR = BITMASK(4); - static const BitMask_t SITUATION_DRIVING = BITMASK(5); - static const BitMask_t SITUATION_CUSTOM_MODE_01 = BITMASK(10); - static const BitMask_t SITUATION_CUSTOM_MODE_02 = BITMASK(11); - static const BitMask_t SITUATION_CUSTOM_MODE_03 = BITMASK(12); - static const BitMask_t SITUATION_CUSTOM_MODE_04 = BITMASK(13); - static const BitMask_t SITUATION_CUSTOM_MODE_05 = BITMASK(14); - static const BitMask_t SITUATION_CUSTOM_MODE_06 = BITMASK(15); - static const BitMask_t SITUATION_CUSTOM_MODE_07 = BITMASK(16); - static const BitMask_t SITUATION_CUSTOM_MODE_08 = BITMASK(17); - static const BitMask_t SITUATION_CUSTOM_MODE_09 = BITMASK(18); - static const BitMask_t SITUATION_CUSTOM_MODE_10 = BITMASK(19); + + + static const char* ControlFlagToString(BitMask_t single_flag); + static BitMask_t ControlFlagFromString(std::string const& single_flag_str); static const char* SituationFlagToString(BitMask_t single_situation_flag); static BitMask_t SituationFlagFromString(std::string const& single_situation_flag_str); @@ -137,8 +102,8 @@ class Character float m_character_v_speed; // state - BitMask_t m_action_flags = 0; - BitMask_t m_situation_flags = 0; + BitMask_t m_control_flags = 0; //!< `RoRnet::ControlFlags` + BitMask_t m_situation_flags = 0; //!< `RoRnet::SituationFlags` ActorPtr m_actor_coupling; //!< The vehicle or machine which the character occupies // network diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index 4784e100cd..0c3fa12baa 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -78,9 +78,10 @@ GfxCharacter::GfxCharacter(Character* character) } // setup diagnostic UI - for (CharacterAnimDef const& def : xc_character->m_character_def->anims) + App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states.resize(xc_character->m_character_def->actions.size()); + for (CharacterActionDef const& def : xc_character->m_character_def->actions) { - App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.game_id] = CharacterAnimDbg(); + App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.action_id] = CharacterAnimDbg(); } } @@ -131,7 +132,7 @@ void RoR::GfxCharacter::BufferSimulationData() xc_simbuf.simbuf_net_username = xc_character->GetNetUsername(); xc_simbuf.simbuf_is_remote = xc_character->isRemote(); xc_simbuf.simbuf_actor_coupling = xc_character->GetActorCoupling(); - xc_simbuf.simbuf_action_flags = xc_character->m_action_flags; + xc_simbuf.simbuf_control_flags = xc_character->m_control_flags; xc_simbuf.simbuf_situation_flags = xc_character->m_situation_flags; xc_simbuf.simbuf_character_h_speed = xc_character->m_character_h_speed; } @@ -235,21 +236,21 @@ void RoR::GfxCharacter::UpdateCharacterInScene(float dt) #endif // USE_SOCKETW } -void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) +void GfxCharacter::EvaluateActionDef(CharacterActionDef const& def, float dt) { CharacterAnimDbg dbg; // Test if applicable. if ((!BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, def.for_situations)) || // not all situation flags are satisified (xc_simbuf.simbuf_situation_flags & def.except_situations) || // any of the forbidden situation matches - (!BITMASK_IS_1(xc_simbuf.simbuf_action_flags, def.for_actions)) || // not all action flags are satisfied - (xc_simbuf.simbuf_action_flags & def.except_actions)) // any of the forbidden situation matches + (!BITMASK_IS_1(xc_simbuf.simbuf_control_flags, def.for_controls)) || // not all action flags are satisfied + (xc_simbuf.simbuf_control_flags & def.except_controls)) // any of the forbidden situation matches { dbg.blocking_situations = xc_simbuf.simbuf_situation_flags & def.except_situations; - dbg.blocking_actions = xc_simbuf.simbuf_action_flags & def.except_actions; + dbg.blocking_actions = xc_simbuf.simbuf_control_flags & def.except_controls; dbg.missing_situations = def.for_situations & ~xc_simbuf.simbuf_situation_flags; - dbg.missing_actions = def.for_actions & ~xc_simbuf.simbuf_action_flags; - App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.game_id] = dbg; + dbg.missing_actions = def.for_controls & ~xc_simbuf.simbuf_control_flags; + App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.action_id] = dbg; return; } @@ -301,7 +302,7 @@ void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) if (def.anim_autorestart) { // If the animation was just activated, start from 0. - if (!BITMASK_IS_1(xc_simbuf_prev.simbuf_action_flags, def.for_actions)) + if (!BITMASK_IS_1(xc_simbuf_prev.simbuf_control_flags, def.for_controls)) { as->setTimePosition(0.f); } @@ -317,7 +318,7 @@ void GfxCharacter::EvaluateAnimDef(CharacterAnimDef const& def, float dt) as->setEnabled(true); dbg.active = true; - App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.game_id] = dbg; + App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.action_id] = dbg; } void GfxCharacter::UpdateAnimations(float dt) @@ -332,9 +333,9 @@ void GfxCharacter::UpdateAnimations(float dt) as->setWeight(0); } - for (CharacterAnimDef const& def : xc_character->m_character_def->anims) + for (CharacterActionDef const& def : xc_character->m_character_def->actions) { - this->EvaluateAnimDef(def, dt); + this->EvaluateActionDef(def, dt); } } diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index 34201807d8..db0e1059d1 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -45,7 +45,7 @@ struct GfxCharacter void DisableAnim(Ogre::AnimationState* anim_state); void EnableAnim(Ogre::AnimationState* anim_state, float time); void UpdateAnimations(float dt); - void EvaluateAnimDef(CharacterAnimDef const& def, float dt); + void EvaluateActionDef(CharacterActionDef const& def, float dt); void SetupBoneBlendMask(BoneBlendMaskDef const& mask_def); Ogre::SceneNode* xc_scenenode; diff --git a/source/main/gfx/SimBuffers.h b/source/main/gfx/SimBuffers.h index 20a4eb612f..8f49f6eba0 100644 --- a/source/main/gfx/SimBuffers.h +++ b/source/main/gfx/SimBuffers.h @@ -73,8 +73,8 @@ struct CharacterSB float simbuf_character_h_speed; //!< When on foot // State - BitMask_t simbuf_action_flags; - BitMask_t simbuf_situation_flags; + BitMask_t simbuf_control_flags; //!< `RoRnet::ControlFlags` + BitMask_t simbuf_situation_flags; //!< `RoRnet::SituationFlags` ActorPtr simbuf_actor_coupling; // Network diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index e298f1c8f2..635f6aa027 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -178,10 +178,10 @@ ImVec4 ExceptFlagColor(BitMask_t flags, BitMask_t mask, bool active) : ((BITMASK_IS_1(flags, mask)) ? theme.error_text_color : normal_text_color); } -void CharacterPoseUtil::DrawAnimDbgItemFull(int id) +void CharacterPoseUtil::DrawAnimDbgItemFull(CharacterActionID_t id) { CharacterAnimDbg const& dbg = anim_dbg_states[id]; - CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->getAnimById(id); + CharacterActionDef* def = &App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->actions[id]; // Draw attributes @@ -206,7 +206,7 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(int id) ImGui::TextColored(color, "%s", Character::SituationFlagToString(testmask)); num_flags++; } - if (BITMASK_IS_1(def->for_actions, testmask)) + if (BITMASK_IS_1(def->for_controls, testmask)) { ImVec4 color = ForFlagColor(dbg.missing_actions, testmask, dbg.active); if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) @@ -214,7 +214,7 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(int id) ImGui::TextDisabled(" (more):"); } ImGui::SameLine(); - ImGui::TextColored(color, "%s", Character::ActionFlagToString(testmask)); + ImGui::TextColored(color, "%s", Character::ControlFlagToString(testmask)); num_flags++; } } @@ -236,7 +236,7 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(int id) ImGui::TextColored(color, "%s", Character::SituationFlagToString(testmask)); num_flags++; } - if (BITMASK_IS_1(def->except_actions, testmask)) + if (BITMASK_IS_1(def->except_controls, testmask)) { ImVec4 color = ExceptFlagColor(dbg.blocking_actions, testmask, dbg.active); if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) @@ -244,16 +244,16 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(int id) ImGui::TextDisabled(" (more):"); } ImGui::SameLine(); - ImGui::TextColored(color, "%s", Character::ActionFlagToString(testmask)); + ImGui::TextColored(color, "%s", Character::ControlFlagToString(testmask)); num_flags++; } } } -void CharacterPoseUtil::DrawAnimDbgItemInline(int id, Ogre::Entity* ent) +void CharacterPoseUtil::DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Entity* ent) { CharacterAnimDbg const& dbg = anim_dbg_states[id]; - CharacterAnimDef* def = App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->getAnimById(id); + CharacterActionDef* def = &App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->actions[id]; AnimationState* as = nullptr; try @@ -295,7 +295,7 @@ void CharacterPoseUtil::DrawAnimDbgItemInline(int id, Ogre::Entity* ent) if (BITMASK_IS_1(dbg.blocking_actions, testmask)) { ImGui::SameLine(); - ImGui::TextColored(theme.error_text_color, "%s", Character::ActionFlagToString(testmask)); + ImGui::TextColored(theme.error_text_color, "%s", Character::ControlFlagToString(testmask)); } } } @@ -312,11 +312,11 @@ void CharacterPoseUtil::DrawAnimDbgItemInline(int id, Ogre::Entity* ent) ImGui::SameLine(); ImGui::TextColored(color, "%s", Character::SituationFlagToString(testmask)); } - if (BITMASK_IS_1(def->for_actions, testmask)) + if (BITMASK_IS_1(def->for_controls, testmask)) { ImVec4 color = ForFlagColor(dbg.missing_actions, testmask, false); ImGui::SameLine(); - ImGui::TextColored(color, "%s", Character::ActionFlagToString(testmask)); + ImGui::TextColored(color, "%s", Character::ControlFlagToString(testmask)); } } } @@ -331,17 +331,17 @@ void CharacterPoseUtil::DrawAnimDbgPanel(Ogre::Entity* ent) ImGui::BeginChild("CharacterPoseUi-animDbg-scroll", ImVec2(0.f, child_height), false); - for (CharacterAnimDef const& anim : App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->anims) + for (CharacterActionDef const& anim : App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->actions) { - if (ImGui::TreeNode(&anim, "%s", anim.game_description.c_str())) + if (ImGui::TreeNode(&anim, "%s", anim.action_description.c_str())) { - this->DrawAnimDbgItemFull(anim.game_id); + this->DrawAnimDbgItemFull(anim.action_id); ImGui::TreePop(); } else { ImGui::SameLine(); - this->DrawAnimDbgItemInline(anim.game_id, ent); + this->DrawAnimDbgItemInline(anim.action_id, ent); } } diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.h b/source/main/gui/panels/GUI_CharacterPoseUtil.h index e94c1639b4..4a80e22e21 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.h +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.h @@ -49,7 +49,7 @@ struct CharacterAnimDbg namespace GUI { -typedef std::unordered_map CharacterAnimDbgMap; +typedef std::vector CharacterAnimDbgMap; class CharacterPoseUtil { @@ -68,8 +68,8 @@ class CharacterPoseUtil private: void DrawAnimControls(Ogre::AnimationState* anim_state); - void DrawAnimDbgItemFull(int id); - void DrawAnimDbgItemInline(int id, Ogre::Entity* ent); + void DrawAnimDbgItemFull(CharacterActionID_t id); + void DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Entity* ent); void DrawAnimDbgPanel(Ogre::Entity* ent); void DrawSkeletalPanel(Ogre::Entity* ent); diff --git a/source/main/network/RoRnet.h b/source/main/network/RoRnet.h index 96e584592d..96f521cee9 100644 --- a/source/main/network/RoRnet.h +++ b/source/main/network/RoRnet.h @@ -122,6 +122,80 @@ enum Lightmask LIGHTMASK_BLINK_RIGHT = BITMASK(19), //!< right blinker on LIGHTMASK_BLINK_WARN = BITMASK(20), //!< warn blinker on }; + +enum ControlFlags +{ + CONTROL_CUSTOM_ACTION_01 = BITMASK(1), + CONTROL_CUSTOM_ACTION_02 = BITMASK(2), + CONTROL_CUSTOM_ACTION_03 = BITMASK(3), + CONTROL_CUSTOM_ACTION_04 = BITMASK(4), + CONTROL_CUSTOM_ACTION_05 = BITMASK(5), + CONTROL_CUSTOM_ACTION_06 = BITMASK(6), + CONTROL_CUSTOM_ACTION_07 = BITMASK(7), + CONTROL_CUSTOM_ACTION_08 = BITMASK(8), + CONTROL_CUSTOM_ACTION_09 = BITMASK(9), + CONTROL_CUSTOM_ACTION_10 = BITMASK(10), + CONTROL_MOVE_FORWARD = BITMASK(11), + CONTROL_MOVE_BACKWARD = BITMASK(12), + CONTROL_TURN_RIGHT = BITMASK(13), + CONTROL_TURN_LEFT = BITMASK(14), + CONTROL_SIDESTEP_RIGHT = BITMASK(15), + CONTROL_SIDESTEP_LEFT = BITMASK(16), + CONTROL_RUN = BITMASK(17), + CONTROL_JUMP = BITMASK(18), + CONTROL_SLOW_TURN = BITMASK(19), +}; + +enum SituationFlags +{ + SITUATION_CUSTOM_MODE_01 = BITMASK(1), + SITUATION_CUSTOM_MODE_02 = BITMASK(2), + SITUATION_CUSTOM_MODE_03 = BITMASK(3), + SITUATION_CUSTOM_MODE_04 = BITMASK(4), + SITUATION_CUSTOM_MODE_05 = BITMASK(5), + SITUATION_CUSTOM_MODE_06 = BITMASK(6), + SITUATION_CUSTOM_MODE_07 = BITMASK(7), + SITUATION_CUSTOM_MODE_08 = BITMASK(8), + SITUATION_CUSTOM_MODE_09 = BITMASK(9), + SITUATION_CUSTOM_MODE_10 = BITMASK(10), + SITUATION_ON_SOLID_GROUND = BITMASK(11), + SITUATION_IN_SHALLOW_WATER = BITMASK(12), + SITUATION_IN_DEEP_WATER = BITMASK(13), + SITUATION_IN_AIR = BITMASK(14), + SITUATION_DRIVING = BITMASK(15), +}; + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + // -------------------------------- structs ----------------------------------- // Only use datatypes with defined binary sizes (avoid bool, int, wchar_t...) diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.cpp b/source/main/resources/character_fileformat/CharacterFileFormat.cpp index 63e171db06..056a6e206f 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.cpp +++ b/source/main/resources/character_fileformat/CharacterFileFormat.cpp @@ -19,6 +19,7 @@ #include "CharacterFileFormat.h" +#include "Actor.h" #include "Character.h" #include "Console.h" #include "Utils.h" @@ -32,7 +33,7 @@ CharacterDocumentPtr CharacterParser::ProcessOgreStream(Ogre::DataStreamPtr stre { char raw_line_buf[CHA_LINE_BUF_LEN]; m_filename = stream->getName(); - m_ctx.anim = CharacterAnimDef(); + m_ctx.action = CharacterActionDef(); m_def = std::make_shared(); while (!stream->eof()) { @@ -120,7 +121,7 @@ void CharacterParser::TokenizeCurrentLine() // retval true = continue processing (false = stop) void CharacterParser::ProcessCurrentLine() { - if (!m_ctx.in_anim && !m_ctx.in_bone_blend_mask) + if (!m_ctx.in_action && !m_ctx.in_bone_blend_mask) { // Root level @@ -142,85 +143,85 @@ void CharacterParser::ProcessCurrentLine() { m_def->force_animblend = ParseForceAnimBlend(GetParam(1)); } - else if (StartsWith(m_cur_line, "begin_animation")) + else if (StartsWith(m_cur_line, "begin_action")) { - m_ctx.in_anim = true; + m_ctx.in_action = true; } else if (StartsWith(m_cur_line, "begin_bone_blend_mask")) { m_ctx.in_bone_blend_mask = true; } } - else if (m_ctx.in_anim) + else if (m_ctx.in_action) { - // In '[begin/end]_animation' block. + // In '[begin/end]_action' block. - if (StartsWith(m_cur_line, "end_animation")) + if (StartsWith(m_cur_line, "end_action")) { - m_ctx.anim.game_id = (int)m_def->anims.size(); - m_def->anims.push_back(m_ctx.anim); - m_ctx.anim = CharacterAnimDef(); - m_ctx.in_anim = false; + m_ctx.action.action_id = static_cast(m_def->actions.size()); + m_def->actions.push_back(m_ctx.action); + m_ctx.action = CharacterActionDef(); + m_ctx.in_action = false; } else if (StartsWith(m_cur_line, "anim_name")) { - m_ctx.anim.anim_name = GetParam(1); + m_ctx.action.anim_name = GetParam(1); } - else if (StartsWith(m_cur_line, "game_description")) + else if (StartsWith(m_cur_line, "action_description")) { - m_ctx.anim.game_description = GetParam(1); + m_ctx.action.action_description = GetParam(1); } else if (StartsWith(m_cur_line, "for_situation")) { - BITMASK_SET_1(m_ctx.anim.for_situations, Character::SituationFlagFromString(GetParam(1))); + BITMASK_SET_1(m_ctx.action.for_situations, Character::SituationFlagFromString(GetParam(1))); } - else if (StartsWith(m_cur_line, "for_action")) + else if (StartsWith(m_cur_line, "for_control")) { - BITMASK_SET_1(m_ctx.anim.for_actions, Character::ActionFlagFromString(GetParam(1))); + BITMASK_SET_1(m_ctx.action.for_controls, Character::ControlFlagFromString(GetParam(1))); } else if (StartsWith(m_cur_line, "except_situation")) { - BITMASK_SET_1(m_ctx.anim.except_situations, Character::SituationFlagFromString(GetParam(1))); + BITMASK_SET_1(m_ctx.action.except_situations, Character::SituationFlagFromString(GetParam(1))); } - else if (StartsWith(m_cur_line, "except_action")) + else if (StartsWith(m_cur_line, "except_control")) { - BITMASK_SET_1(m_ctx.anim.except_actions, Character::ActionFlagFromString(GetParam(1))); + BITMASK_SET_1(m_ctx.action.except_controls, Character::ControlFlagFromString(GetParam(1))); } else if (StartsWith(m_cur_line, "playback_time_ratio")) { - m_ctx.anim.playback_time_ratio = Ogre::StringConverter::parseReal(GetParam(1)); + m_ctx.action.playback_time_ratio = Ogre::StringConverter::parseReal(GetParam(1)); } else if (StartsWith(m_cur_line, "playback_h_speed_ratio")) { - m_ctx.anim.playback_h_speed_ratio = Ogre::StringConverter::parseReal(GetParam(1)); + m_ctx.action.playback_h_speed_ratio = Ogre::StringConverter::parseReal(GetParam(1)); } else if (StartsWith(m_cur_line, "playback_steering_ratio")) { - m_ctx.anim.playback_steering_ratio = Ogre::StringConverter::parseReal(GetParam(1)); + m_ctx.action.playback_steering_ratio = Ogre::StringConverter::parseReal(GetParam(1)); } else if (StartsWith(m_cur_line, "weight")) { - m_ctx.anim.weight = Ogre::StringConverter::parseReal(GetParam(1)); + m_ctx.action.weight = Ogre::StringConverter::parseReal(GetParam(1)); } else if (StartsWith(m_cur_line, "playback_trim")) { - m_ctx.anim.playback_trim = Ogre::StringConverter::parseReal(GetParam(1)); + m_ctx.action.playback_trim = Ogre::StringConverter::parseReal(GetParam(1)); } else if (StartsWith(m_cur_line, "anim_continuous")) { - m_ctx.anim.anim_continuous = Ogre::StringConverter::parseBool(GetParam(1)); + m_ctx.action.anim_continuous = Ogre::StringConverter::parseBool(GetParam(1)); } else if (StartsWith(m_cur_line, "anim_autorestart")) { - m_ctx.anim.anim_autorestart = Ogre::StringConverter::parseBool(GetParam(1)); + m_ctx.action.anim_autorestart = Ogre::StringConverter::parseBool(GetParam(1)); } else if (StartsWith(m_cur_line, "anim_neutral_mid")) { - m_ctx.anim.anim_neutral_mid = Ogre::StringConverter::parseBool(GetParam(1)); + m_ctx.action.anim_neutral_mid = Ogre::StringConverter::parseBool(GetParam(1)); } else if (StartsWith(m_cur_line, "source_percentual")) { - m_ctx.anim.source_percentual = Ogre::StringConverter::parseBool(GetParam(1)); + m_ctx.action.source_percentual = Ogre::StringConverter::parseBool(GetParam(1)); } } else if (m_ctx.in_bone_blend_mask) diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.h b/source/main/resources/character_fileformat/CharacterFileFormat.h index fb34025ec2..8ec55ee4e4 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.h +++ b/source/main/resources/character_fileformat/CharacterFileFormat.h @@ -45,17 +45,18 @@ struct BoneBlendMaskDef //!< Additional settings for a skeletal animation track std::vector bone_weights; }; -struct CharacterAnimDef +/// Action = one or more skeletal animations playing/blended/masked together to create impression activity. +struct CharacterActionDef { std::string anim_name; //!< Name of the skeletal animation from OGRE's *.skeleton file. - std::string game_description; //!< Gameplay name. - int game_id = -1; + std::string action_description; //!< Gameplay name. + CharacterActionID_t action_id = CHARACTERACTIONID_INVALID; // Conditions - BitMask_t for_situations = 0; //!< Character::SITUATION_, all must be satisfied. - BitMask_t except_situations = 0; //!< Character::SITUATION_, none must be satisfied. - BitMask_t for_actions = 0; //!< Character::ACTION_, all must be satisfied. - BitMask_t except_actions = 0; //!< Character::ACTION_, none must be satisfied. + BitMask_t for_situations = 0; //!< `RoRnet::SituationFlags`, all must be satisfied. + BitMask_t except_situations = 0; //!< `RoRnet::SituationFlags`, none must be satisfied. + BitMask_t for_controls = 0; //!< `RoRnet::ControlFlags`, all must be satisfied. + BitMask_t except_controls = 0; //!< `RoRnet::ControlFlags`, none must be satisfied. // Anim position calculation float playback_time_ratio = 0.f; //!< How much elapsed time affects animation position. @@ -83,19 +84,9 @@ struct CharacterDocument std::string character_name; std::string mesh_name; Ogre::Vector3 mesh_scale = Ogre::Vector3(1, 1, 1); - std::vector anims; + std::vector actions; std::vector bone_blend_masks; ForceAnimBlend force_animblend = ForceAnimBlend::NONE; //!< Should a specific `Ogre::SkeletonAnimationBlendMode` be forced, or should we keep what the .skeleton file defines? - - CharacterAnimDef* getAnimById(int id) - { - for (CharacterAnimDef & anim : anims) - { - if (anim.game_id == id) - return &anim; - } - return nullptr; - } }; typedef std::shared_ptr CharacterDocumentPtr; @@ -116,9 +107,9 @@ class CharacterParser struct CharacterParserContext { - CharacterAnimDef anim; + CharacterActionDef action; BoneBlendMaskDef bone_blend_mask; - bool in_anim = false; + bool in_action = false; bool in_bone_blend_mask = false; } m_ctx; //!< Parser context From a8a96caf212717d9204c070ff43df76131f3aac8 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Fri, 2 Jun 2023 15:05:02 +0200 Subject: [PATCH 23/32] Polished the character-modding system. Fixed glitches in the classic character if player presses contradicting keys together. More internal renaming to the new "anim=skeletal, action=game" terminology, see comments in previous commit. Character net packets moved from Network.h to RoRnet.h, alongside the actor packet. --- resources/classic_character/classic.character | 24 ++++--- source/main/gameplay/Character.cpp | 23 +++---- source/main/gfx/GfxCharacter.cpp | 14 ++--- .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 30 ++++----- .../main/gui/panels/GUI_CharacterPoseUtil.h | 20 +++--- source/main/network/Network.h | 30 --------- source/main/network/RoRnet.h | 62 +++++++++---------- 7 files changed, 90 insertions(+), 113 deletions(-) diff --git a/resources/classic_character/classic.character b/resources/classic_character/classic.character index 801091fff8..c42412c401 100644 --- a/resources/classic_character/classic.character +++ b/resources/classic_character/classic.character @@ -74,6 +74,8 @@ begin_action except_situation SITUATION_DRIVING for_control CONTROL_MOVE_FORWARD except_control CONTROL_RUN + ; when pressing both FORWARD+BACKWARD keys, FORWARD wins in game movement so let it win here also. + except_control CONTROL_MOVE_BACKWARD anim_name "Walk" playback_time_ratio 1.f playback_h_speed_ratio 1.f @@ -84,6 +86,8 @@ begin_action except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING for_control CONTROL_MOVE_BACKWARD + ; Do not mix the walk animation into the run animation if user presses both RUN+MOVE_BACKWARDS. + except_control CONTROL_RUN anim_name "Walk" playback_time_ratio -1.f playback_h_speed_ratio 1.f @@ -96,8 +100,9 @@ begin_action for_control CONTROL_SIDESTEP_RIGHT except_control CONTROL_MOVE_FORWARD except_control CONTROL_MOVE_BACKWARD - except_control CONTROL_TURN_RIGHT - except_control CONTROL_TURN_LEFT + ; Pressing both SIDESTEP+TURN controls makes game combine the movements, so also combine the animations. + ;except_control CONTROL_TURN_RIGHT + ;except_control CONTROL_TURN_LEFT except_control CONTROL_RUN anim_name "Side_step" playback_time_ratio 1.f @@ -111,8 +116,9 @@ begin_action for_control CONTROL_SIDESTEP_LEFT except_control CONTROL_MOVE_FORWARD except_control CONTROL_MOVE_BACKWARD - except_control CONTROL_TURN_RIGHT - except_control CONTROL_TURN_LEFT + ; Pressing both SIDESTEP+TURN controls makes game combine the movements, so also combine the animations. + ;except_control CONTROL_TURN_RIGHT + ;except_control CONTROL_TURN_LEFT except_control CONTROL_RUN anim_name "Side_step" playback_time_ratio -1.f @@ -124,8 +130,9 @@ begin_action except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING for_control CONTROL_TURN_LEFT - except_control CONTROL_SIDESTEP_LEFT - except_control CONTROL_SIDESTEP_RIGHT + ; Pressing both SIDESTEP+TURN controls makes game combine the movements, so also combine the animations. + ;except_control CONTROL_SIDESTEP_LEFT + ;except_control CONTROL_SIDESTEP_RIGHT except_control CONTROL_MOVE_FORWARD except_control CONTROL_MOVE_BACKWARD except_control CONTROL_RUN @@ -139,8 +146,9 @@ begin_action except_situation SITUATION_IN_DEEP_WATER except_situation SITUATION_DRIVING for_control CONTROL_TURN_RIGHT - except_control CONTROL_SIDESTEP_LEFT - except_control CONTROL_SIDESTEP_RIGHT + ; Pressing both SIDESTEP+TURN controls makes game combine the movements, so also combine the animations. + ;except_control CONTROL_SIDESTEP_LEFT + ;except_control CONTROL_SIDESTEP_RIGHT except_control CONTROL_MOVE_FORWARD except_control CONTROL_MOVE_BACKWARD except_control CONTROL_RUN diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index dc24f386ba..23669655b6 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -32,6 +32,7 @@ #include "InputEngine.h" #include "MovableText.h" #include "Network.h" +#include "RoRnet.h" #include "Terrain.h" #include "Utils.h" #include "Water.h" @@ -426,16 +427,16 @@ void Character::SendStreamData() m_net_last_update_time = m_net_timer.getMilliseconds(); - NetCharacterMsgPos msg; + CharacterMsgPos msg; msg.command = CHARACTER_CMD_POSITION; msg.pos_x = m_character_position.x; msg.pos_y = m_character_position.y; msg.pos_z = m_character_position.z; msg.rot_angle = m_character_rotation.valueRadians(); - msg.action_flags = m_control_flags; + msg.control_flags = m_control_flags; msg.situation_flags = m_situation_flags; - App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA_DISCARDABLE, sizeof(NetCharacterMsgPos), (char*)&msg); + App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA_DISCARDABLE, sizeof(CharacterMsgPos), (char*)&msg); #endif // USE_SOCKETW } @@ -444,13 +445,13 @@ void Character::receiveStreamData(unsigned int& type, int& source, unsigned int& #ifdef USE_SOCKETW if (type == RoRnet::MSG2_STREAM_DATA && m_source_id == source && m_stream_id == streamid) { - auto* msg = reinterpret_cast(buffer); + auto* msg = reinterpret_cast(buffer); if (msg->command == CHARACTER_CMD_POSITION) { - auto* pos_msg = reinterpret_cast(buffer); + auto* pos_msg = reinterpret_cast(buffer); this->setPosition(Ogre::Vector3(pos_msg->pos_x, pos_msg->pos_y, pos_msg->pos_z)); this->setRotation(Ogre::Radian(pos_msg->rot_angle)); - m_control_flags = pos_msg->action_flags; + m_control_flags = pos_msg->control_flags; m_situation_flags = pos_msg->situation_flags; } else if (msg->command == CHARACTER_CMD_DETACH) @@ -462,7 +463,7 @@ void Character::receiveStreamData(unsigned int& type, int& source, unsigned int& } else if (msg->command == CHARACTER_CMD_ATTACH) { - auto* attach_msg = reinterpret_cast(buffer); + auto* attach_msg = reinterpret_cast(buffer); ActorPtr beam = App::GetGameContext()->GetActorManager()->GetActorByNetworkLinks(attach_msg->source_id, attach_msg->stream_id); if (beam != nullptr) { @@ -500,17 +501,17 @@ void Character::SetActorCoupling(bool enabled, ActorPtr actor) { if (enabled) { - NetCharacterMsgAttach msg; + CharacterMsgAttach msg; msg.command = CHARACTER_CMD_ATTACH; msg.source_id = m_actor_coupling->ar_net_source_id; msg.stream_id = m_actor_coupling->ar_net_stream_id; - App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA, sizeof(NetCharacterMsgAttach), (char*)&msg); + App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA, sizeof(CharacterMsgAttach), (char*)&msg); } else { - NetCharacterMsgGeneric msg; + CharacterMsgGeneric msg; msg.command = CHARACTER_CMD_DETACH; - App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA, sizeof(NetCharacterMsgGeneric), (char*)&msg); + App::GetNetwork()->AddPacket(m_stream_id, RoRnet::MSG2_STREAM_DATA, sizeof(CharacterMsgGeneric), (char*)&msg); } } #endif // USE_SOCKETW diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index 0c3fa12baa..c1c390e4af 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -78,10 +78,10 @@ GfxCharacter::GfxCharacter(Character* character) } // setup diagnostic UI - App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states.resize(xc_character->m_character_def->actions.size()); + App::GetGuiManager()->CharacterPoseUtil.action_dbg_states.resize(xc_character->m_character_def->actions.size()); for (CharacterActionDef const& def : xc_character->m_character_def->actions) { - App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.action_id] = CharacterAnimDbg(); + App::GetGuiManager()->CharacterPoseUtil.action_dbg_states[def.action_id] = CharacterActionDbg(); } } @@ -238,7 +238,7 @@ void RoR::GfxCharacter::UpdateCharacterInScene(float dt) void GfxCharacter::EvaluateActionDef(CharacterActionDef const& def, float dt) { - CharacterAnimDbg dbg; + CharacterActionDbg dbg; // Test if applicable. if ((!BITMASK_IS_1(xc_simbuf.simbuf_situation_flags, def.for_situations)) || // not all situation flags are satisified @@ -247,10 +247,10 @@ void GfxCharacter::EvaluateActionDef(CharacterActionDef const& def, float dt) (xc_simbuf.simbuf_control_flags & def.except_controls)) // any of the forbidden situation matches { dbg.blocking_situations = xc_simbuf.simbuf_situation_flags & def.except_situations; - dbg.blocking_actions = xc_simbuf.simbuf_control_flags & def.except_controls; + dbg.blocking_controls = xc_simbuf.simbuf_control_flags & def.except_controls; dbg.missing_situations = def.for_situations & ~xc_simbuf.simbuf_situation_flags; - dbg.missing_actions = def.for_controls & ~xc_simbuf.simbuf_control_flags; - App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.action_id] = dbg; + dbg.missing_controls = def.for_controls & ~xc_simbuf.simbuf_control_flags; + App::GetGuiManager()->CharacterPoseUtil.action_dbg_states[def.action_id] = dbg; return; } @@ -318,7 +318,7 @@ void GfxCharacter::EvaluateActionDef(CharacterActionDef const& def, float dt) as->setEnabled(true); dbg.active = true; - App::GetGuiManager()->CharacterPoseUtil.anim_dbg_states[def.action_id] = dbg; + App::GetGuiManager()->CharacterPoseUtil.action_dbg_states[def.action_id] = dbg; } void GfxCharacter::UpdateAnimations(float dt) diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index 635f6aa027..e71696f4e0 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -71,15 +71,15 @@ void CharacterPoseUtil::Draw() ImGui::BeginTabBar("CharacterPoseUtilTabs"); - if (ImGui::BeginTabItem("Skeletal anims")) + if (ImGui::BeginTabItem("Anims")) { this->DrawSkeletalPanel(ent); ImGui::EndTabItem(); } - if (ImGui::BeginTabItem("Game anims")) + if (ImGui::BeginTabItem("Actions")) { - this->DrawAnimDbgPanel(ent); + this->DrawActionDbgPanel(ent); ImGui::EndTabItem(); } @@ -178,9 +178,9 @@ ImVec4 ExceptFlagColor(BitMask_t flags, BitMask_t mask, bool active) : ((BITMASK_IS_1(flags, mask)) ? theme.error_text_color : normal_text_color); } -void CharacterPoseUtil::DrawAnimDbgItemFull(CharacterActionID_t id) +void CharacterPoseUtil::DrawActionDbgItemFull(CharacterActionID_t id) { - CharacterAnimDbg const& dbg = anim_dbg_states[id]; + CharacterActionDbg const& dbg = action_dbg_states[id]; CharacterActionDef* def = &App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->actions[id]; @@ -208,7 +208,7 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(CharacterActionID_t id) } if (BITMASK_IS_1(def->for_controls, testmask)) { - ImVec4 color = ForFlagColor(dbg.missing_actions, testmask, dbg.active); + ImVec4 color = ForFlagColor(dbg.missing_controls, testmask, dbg.active); if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) { ImGui::TextDisabled(" (more):"); @@ -238,7 +238,7 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(CharacterActionID_t id) } if (BITMASK_IS_1(def->except_controls, testmask)) { - ImVec4 color = ExceptFlagColor(dbg.blocking_actions, testmask, dbg.active); + ImVec4 color = ExceptFlagColor(dbg.blocking_controls, testmask, dbg.active); if (num_flags > 0 && num_flags % MAX_FLAGS_PER_LINE == 0) { ImGui::TextDisabled(" (more):"); @@ -250,9 +250,9 @@ void CharacterPoseUtil::DrawAnimDbgItemFull(CharacterActionID_t id) } } -void CharacterPoseUtil::DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Entity* ent) +void CharacterPoseUtil::DrawActionDbgItemInline(CharacterActionID_t id, Ogre::Entity* ent) { - CharacterAnimDbg const& dbg = anim_dbg_states[id]; + CharacterActionDbg const& dbg = action_dbg_states[id]; CharacterActionDef* def = &App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->actions[id]; AnimationState* as = nullptr; @@ -279,7 +279,7 @@ void CharacterPoseUtil::DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Enti } else { - if (dbg.blocking_situations || dbg.blocking_actions) + if (dbg.blocking_situations || dbg.blocking_controls) { // Draw the blocking 'except_' flags, colored red. ImGui::SameLine(); @@ -292,7 +292,7 @@ void CharacterPoseUtil::DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Enti ImGui::SameLine(); ImGui::TextColored(theme.error_text_color, "%s", Character::SituationFlagToString(testmask)); } - if (BITMASK_IS_1(dbg.blocking_actions, testmask)) + if (BITMASK_IS_1(dbg.blocking_controls, testmask)) { ImGui::SameLine(); ImGui::TextColored(theme.error_text_color, "%s", Character::ControlFlagToString(testmask)); @@ -314,7 +314,7 @@ void CharacterPoseUtil::DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Enti } if (BITMASK_IS_1(def->for_controls, testmask)) { - ImVec4 color = ForFlagColor(dbg.missing_actions, testmask, false); + ImVec4 color = ForFlagColor(dbg.missing_controls, testmask, false); ImGui::SameLine(); ImGui::TextColored(color, "%s", Character::ControlFlagToString(testmask)); } @@ -323,7 +323,7 @@ void CharacterPoseUtil::DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Enti } } -void CharacterPoseUtil::DrawAnimDbgPanel(Ogre::Entity* ent) +void CharacterPoseUtil::DrawActionDbgPanel(Ogre::Entity* ent) { const float child_height = ImGui::GetWindowHeight() - ((2.f * ImGui::GetStyle().WindowPadding.y) + (3.f * ImGui::GetItemsLineHeightWithSpacing()) @@ -335,13 +335,13 @@ void CharacterPoseUtil::DrawAnimDbgPanel(Ogre::Entity* ent) { if (ImGui::TreeNode(&anim, "%s", anim.action_description.c_str())) { - this->DrawAnimDbgItemFull(anim.action_id); + this->DrawActionDbgItemFull(anim.action_id); ImGui::TreePop(); } else { ImGui::SameLine(); - this->DrawAnimDbgItemInline(anim.action_id, ent); + this->DrawActionDbgItemInline(anim.action_id, ent); } } diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.h b/source/main/gui/panels/GUI_CharacterPoseUtil.h index 4a80e22e21..13b3324c4c 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.h +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.h @@ -26,15 +26,15 @@ namespace RoR { -struct CharacterAnimDbg +struct CharacterActionDbg { bool active = false; // State diagnostic. - BitMask_t missing_situations = 0; // The flags from 'for_situations' mask which are not satisfied. - BitMask_t missing_actions = 0; // The flags from 'for_actions' mask which are not satisfied. - BitMask_t blocking_situations = 0; // The flags from 'except_situations' mask which block this anim. - BitMask_t blocking_actions = 0; // The flags from 'except_actions' mask which block this anim. + BitMask_t missing_situations = 0; //!< `RoRnet::SituationFlags`; The flags from 'for_situations' mask which are not satisfied. + BitMask_t missing_controls = 0; //!< `RoRnet::ControlFlags`; The flags from 'for_controls' mask which are not satisfied. + BitMask_t blocking_situations = 0; //!< `RoRnet::SituationFlags`; The flags from 'except_situations' mask which block this anim. + BitMask_t blocking_controls = 0; //!< `RoRnet::ControlFlags`; The flags from 'except_controls' mask which block this anim. // The raw source data of anim position. float source_dt = 0.f; @@ -49,8 +49,6 @@ struct CharacterAnimDbg namespace GUI { -typedef std::vector CharacterAnimDbgMap; - class CharacterPoseUtil { public: @@ -64,13 +62,13 @@ class CharacterPoseUtil bool IsManualPoseActive() const { return m_manual_pose_active; } - CharacterAnimDbgMap anim_dbg_states; + std::vector action_dbg_states; private: void DrawAnimControls(Ogre::AnimationState* anim_state); - void DrawAnimDbgItemFull(CharacterActionID_t id); - void DrawAnimDbgItemInline(CharacterActionID_t id, Ogre::Entity* ent); - void DrawAnimDbgPanel(Ogre::Entity* ent); + void DrawActionDbgItemFull(CharacterActionID_t id); + void DrawActionDbgItemInline(CharacterActionID_t id, Ogre::Entity* ent); + void DrawActionDbgPanel(Ogre::Entity* ent); void DrawSkeletalPanel(Ogre::Entity* ent); bool m_is_visible = false; diff --git a/source/main/network/Network.h b/source/main/network/Network.h index aef9913e61..a41ac02968 100644 --- a/source/main/network/Network.h +++ b/source/main/network/Network.h @@ -55,36 +55,6 @@ struct CurlFailInfo #pragma pack(push, 1) -enum NetCharacterCmd -{ - CHARACTER_CMD_INVALID, - CHARACTER_CMD_POSITION, - CHARACTER_CMD_ATTACH, - CHARACTER_CMD_DETACH -}; - -struct NetCharacterMsgGeneric -{ - int32_t command; -}; - -struct NetCharacterMsgPos -{ - int32_t command; - float pos_x, pos_y, pos_z; - float rot_angle; - uint32_t action_flags; - uint32_t situation_flags; -}; - -struct NetCharacterMsgAttach -{ - int32_t command; - int32_t source_id; - int32_t stream_id; - int32_t position; -}; - struct NetSendPacket { char buffer[RORNET_MAX_MESSAGE_LENGTH]; diff --git a/source/main/network/RoRnet.h b/source/main/network/RoRnet.h index 96f521cee9..ae3581b79e 100644 --- a/source/main/network/RoRnet.h +++ b/source/main/network/RoRnet.h @@ -135,6 +135,7 @@ enum ControlFlags CONTROL_CUSTOM_ACTION_08 = BITMASK(8), CONTROL_CUSTOM_ACTION_09 = BITMASK(9), CONTROL_CUSTOM_ACTION_10 = BITMASK(10), + CONTROL_MOVE_FORWARD = BITMASK(11), CONTROL_MOVE_BACKWARD = BITMASK(12), CONTROL_TURN_RIGHT = BITMASK(13), @@ -158,6 +159,7 @@ enum SituationFlags SITUATION_CUSTOM_MODE_08 = BITMASK(8), SITUATION_CUSTOM_MODE_09 = BITMASK(9), SITUATION_CUSTOM_MODE_10 = BITMASK(10), + SITUATION_ON_SOLID_GROUND = BITMASK(11), SITUATION_IN_SHALLOW_WATER = BITMASK(12), SITUATION_IN_DEEP_WATER = BITMASK(13), @@ -165,37 +167,13 @@ enum SituationFlags SITUATION_DRIVING = BITMASK(15), }; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +enum CharacterCmd +{ + CHARACTER_CMD_INVALID, + CHARACTER_CMD_POSITION, + CHARACTER_CMD_ATTACH, + CHARACTER_CMD_DETACH +}; // -------------------------------- structs ----------------------------------- // Only use datatypes with defined binary sizes (avoid bool, int, wchar_t...) @@ -271,6 +249,28 @@ struct VehicleState //!< Formerly `oob_t` BitMask_t lightmask; //!< flagmask: LIGHTMASK_* }; +struct CharacterMsgGeneric +{ + int32_t command; +}; + +struct CharacterMsgPos +{ + int32_t command; + float pos_x, pos_y, pos_z; + float rot_angle; + BitMask_t control_flags; + BitMask_t situation_flags; +}; + +struct CharacterMsgAttach +{ + int32_t command; + int32_t source_id; + int32_t stream_id; + int32_t position; +}; + struct ServerInfo { char protocolversion[20]; //!< protocol version being used From 577a7b86c945c6828a3b8b23d681757584724224 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 4 Jun 2023 12:49:48 +0200 Subject: [PATCH 24/32] Custom characters now work over multiplayer summary of changes: - the built-in character was renamed from "classic" to "default" - a new cvar 'mp_override_character' was added - configurable from MultiplayerSelector UI with buttons [select] [clear]. --- .../character-alpha.png | Bin .../character.dds | Bin .../character.material | 0 .../character.mesh | Bin .../character.skeleton | Bin .../default.character} | 4 ++-- source/main/Application.cpp | 1 + source/main/Application.h | 4 +++- source/main/gameplay/Character.cpp | 3 ++- source/main/gameplay/Character.h | 3 ++- source/main/gameplay/CharacterFactory.cpp | 20 ++++++++--------- source/main/gfx/GfxCharacter.cpp | 15 ++++++++----- source/main/gui/panels/GUI_MainSelector.cpp | 5 +++++ .../gui/panels/GUI_MultiplayerSelector.cpp | 21 ++++++++++++++++++ .../main/gui/panels/GUI_MultiplayerSelector.h | 1 + source/main/network/Network.cpp | 10 +++++++++ source/main/network/RoRnet.h | 5 +++-- source/main/resources/CacheSystem.cpp | 2 +- source/main/resources/ContentManager.cpp | 2 +- source/main/system/CVar.cpp | 3 ++- 20 files changed, 74 insertions(+), 25 deletions(-) rename resources/{classic_character => default_character}/character-alpha.png (100%) rename resources/{classic_character => default_character}/character.dds (100%) rename resources/{classic_character => default_character}/character.material (100%) rename resources/{classic_character => default_character}/character.mesh (100%) rename resources/{classic_character => default_character}/character.skeleton (100%) rename resources/{classic_character/classic.character => default_character/default.character} (98%) diff --git a/resources/classic_character/character-alpha.png b/resources/default_character/character-alpha.png similarity index 100% rename from resources/classic_character/character-alpha.png rename to resources/default_character/character-alpha.png diff --git a/resources/classic_character/character.dds b/resources/default_character/character.dds similarity index 100% rename from resources/classic_character/character.dds rename to resources/default_character/character.dds diff --git a/resources/classic_character/character.material b/resources/default_character/character.material similarity index 100% rename from resources/classic_character/character.material rename to resources/default_character/character.material diff --git a/resources/classic_character/character.mesh b/resources/default_character/character.mesh similarity index 100% rename from resources/classic_character/character.mesh rename to resources/default_character/character.mesh diff --git a/resources/classic_character/character.skeleton b/resources/default_character/character.skeleton similarity index 100% rename from resources/classic_character/character.skeleton rename to resources/default_character/character.skeleton diff --git a/resources/classic_character/classic.character b/resources/default_character/default.character similarity index 98% rename from resources/classic_character/classic.character rename to resources/default_character/default.character index c42412c401..92c74d96af 100644 --- a/resources/classic_character/classic.character +++ b/resources/default_character/default.character @@ -1,4 +1,4 @@ -; The classic character (aka RoRbot) +; The default character (aka RoRbot) ; ----------------------------------------------------------------------------- ; ; This file format lets you compose 'actions' from one or more @@ -19,7 +19,7 @@ ; ----------------------------------------------------------------------------- ; Name displayed in the Selector UI - required -character_name "Classic RORBot" +character_name "Default character" ; Name of the mesh file - required. mesh_name "character.mesh" diff --git a/source/main/Application.cpp b/source/main/Application.cpp index 134abed36f..9c8938932c 100644 --- a/source/main/Application.cpp +++ b/source/main/Application.cpp @@ -123,6 +123,7 @@ CVar* mp_server_password; CVar* mp_player_name; CVar* mp_player_token; CVar* mp_api_url; +CVar* mp_override_character; // New remote API CVar* remote_query_url; diff --git a/source/main/Application.h b/source/main/Application.h index 8a9287b11b..307a7a4967 100644 --- a/source/main/Application.h +++ b/source/main/Application.h @@ -39,7 +39,7 @@ #define ROR_ASSERT(_EXPR) assert(_EXPR) -#define CLASSIC_CHARACTER_FILE "classic.character" +#define DEFAULT_CHARACTER_FILE "default.character" // Located in file 'resources/default_character.zip' // Legacy macros #define TOSTRING(x) Ogre::StringConverter::toString(x) @@ -252,6 +252,7 @@ enum LoaderType //!< Operation mode for GUI::MainSelector { LT_None, LT_Character, // No script alias, invoked from Settings UI. + LT_CharacterMP,// No script alias, invoked from Multiplayer Lobby UI. LT_Terrain, // Invocable from GUI; No script alias, used in main menu LT_Vehicle, // Script "vehicle", ext: truck car LT_Truck, // Script "truck", ext: truck car @@ -319,6 +320,7 @@ extern CVar* mp_server_password; extern CVar* mp_player_name; extern CVar* mp_player_token; extern CVar* mp_api_url; +extern CVar* mp_override_character; // If empty, use `sim_default_character` // New remote API extern CVar* remote_query_url; diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index 23669655b6..710307b39e 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -41,7 +41,7 @@ using namespace Ogre; using namespace RoR; using namespace RoRnet; -Character::Character(CharacterDocumentPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : +Character::Character(CacheEntry* cacheEntry, CharacterDocumentPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) , m_character_rotation(0.0f) , m_character_h_speed(2.0f) @@ -53,6 +53,7 @@ Character::Character(CharacterDocumentPtr def, int source, unsigned int streamid , m_source_id(source) , m_stream_id(streamid) , m_character_def(def) + , m_cache_entry(cacheEntry) { static int id_counter = 0; m_instance_name = "Character" + TOSTRING(id_counter); diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 21094d79ce..73f5d2d313 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -58,7 +58,7 @@ class Character static const char* SituationFlagToString(BitMask_t single_situation_flag); static BitMask_t SituationFlagFromString(std::string const& single_situation_flag_str); - Character(CharacterDocumentPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); + Character(CacheEntry* cacheEntry, CharacterDocumentPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); // get info @@ -92,6 +92,7 @@ class Character // attributes CharacterDocumentPtr m_character_def; + CacheEntry* m_cache_entry = nullptr; std::string m_instance_name; // transforms diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index b823bc9e32..db43e579cb 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -59,6 +59,7 @@ Character* CharacterFactory::CreateLocalCharacter() { int colourNum = -1; Ogre::UTFString playerName = ""; + std::string characterFile = App::sim_player_character->getStr(); #ifdef USE_SOCKETW if (App::mp_state->getEnum() == MpState::CONNECTED) @@ -66,18 +67,19 @@ Character* CharacterFactory::CreateLocalCharacter() RoRnet::UserInfo info = App::GetNetwork()->GetLocalUserData(); colourNum = info.colournum; playerName = tryConvertUTF(info.username); + characterFile = info.characterfile; } #endif // USE_SOCKETW - CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, App::sim_player_character->getStr()); + CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, characterFile); if (!cache_entry) { // If this was a custom mod, retry with the builtin - if (App::sim_player_character->getStr() != CLASSIC_CHARACTER_FILE) + if (characterFile != DEFAULT_CHARACTER_FILE) { App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, - fmt::format("Could not find configured character '{}' in mod cache, falling back to '{}'", App::sim_player_character->getStr(), CLASSIC_CHARACTER_FILE)); - App::sim_player_character->setStr(CLASSIC_CHARACTER_FILE); + fmt::format("Could not find configured character '{}' in mod cache, falling back to '{}'", characterFile, DEFAULT_CHARACTER_FILE)); + App::sim_player_character->setStr(DEFAULT_CHARACTER_FILE); cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, App::sim_player_character->getStr()); } @@ -98,7 +100,7 @@ Character* CharacterFactory::CreateLocalCharacter() return nullptr; // Error already reported } - m_local_character = std::unique_ptr(new Character(document, -1, 0, playerName, colourNum, false)); + m_local_character = std::unique_ptr(new Character(cache_entry, document, -1, 0, playerName, colourNum, false)); App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); return m_local_character.get(); } @@ -115,13 +117,11 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) LOG(" new character for " + info_str); - std::string filename = App::sim_player_character->getStr(); // TBD: transmit and use the actual character used by the player - - CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, filename); + CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, info.characterfile); if (!cache_entry) { App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("Could not create character for {} - character '{}' not found in mod cache.", info_str, filename)); + fmt::format("Could not create character for {} - character '{}' not found in mod cache.", info_str, info.characterfile)); return; } @@ -133,7 +133,7 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) return; } - Character* ch = new Character(document, sourceid, streamid, name, colour, true); + Character* ch = new Character(cache_entry, document, sourceid, streamid, name, colour, true); App::GetGfxScene()->RegisterGfxCharacter(ch); m_remote_characters.push_back(std::unique_ptr(ch)); #endif // USE_SOCKETW diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index c1c390e4af..ce1d1b662d 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -45,7 +45,10 @@ GfxCharacter::GfxCharacter(Character* character) : xc_character(character) , xc_instance_name(character->m_instance_name) { - Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity(xc_instance_name + "_mesh", xc_character->m_character_def->mesh_name); + Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity( + /*entityName:*/ xc_instance_name + "_mesh", + /*meshName:*/ xc_character->m_character_def->mesh_name, + /*groupName:*/ character->m_cache_entry->resource_group); // fix disappearing mesh AxisAlignedBox aabb; @@ -59,16 +62,18 @@ GfxCharacter::GfxCharacter(Character* character) xc_scenenode->setVisible(false); // setup colour - MaterialPtr mat1 = MaterialManager::getSingleton().getByName("tracks/character"); - MaterialPtr mat2 = mat1->clone("tracks/" + xc_instance_name); - entity->setMaterialName("tracks/" + xc_instance_name); + MaterialPtr sharedMat = MaterialManager::getSingleton().getByName( + /*name:*/ "tracks/character", + /*groupName:*/ character->m_cache_entry->resource_group); + MaterialPtr ownMat = sharedMat->clone("tracks/" + xc_instance_name); + entity->setMaterial(ownMat); // setup animation blend switch (character->getCharacterDocument()->force_animblend) { case ForceAnimBlend::CUMULATIVE: entity->getSkeleton()->setBlendMode(ANIMBLEND_CUMULATIVE); break; case ForceAnimBlend::AVERAGE: entity->getSkeleton()->setBlendMode(ANIMBLEND_AVERAGE); break; - default:; // Keep the preset defined in .skeleton file + default:; // Keep the preset we loaded from .skeleton file } // setup bone blend masks diff --git a/source/main/gui/panels/GUI_MainSelector.cpp b/source/main/gui/panels/GUI_MainSelector.cpp index 5fc082392c..2261311b05 100644 --- a/source/main/gui/panels/GUI_MainSelector.cpp +++ b/source/main/gui/panels/GUI_MainSelector.cpp @@ -619,6 +619,11 @@ void MainSelector::Apply() this->Close(); break; + case LT_CharacterMP: // Invoked by MultiplayerSelector UI button + App::mp_override_character->setStr(sd_entry.sde_entry->fname); + this->Close(); + break; + case LT_Terrain: // Invoked by Main menu button if (App::app_state->getEnum() == AppState::MAIN_MENU) { diff --git a/source/main/gui/panels/GUI_MultiplayerSelector.cpp b/source/main/gui/panels/GUI_MultiplayerSelector.cpp index 77fa3f4878..ee1034685b 100644 --- a/source/main/gui/panels/GUI_MultiplayerSelector.cpp +++ b/source/main/gui/panels/GUI_MultiplayerSelector.cpp @@ -193,6 +193,7 @@ void MultiplayerSelector::DrawSetupTab() DrawGCheckbox(App::mp_hide_net_labels, _LC("MultiplayerSelector", "Hide net labels")); DrawGCheckbox(App::mp_hide_own_net_label, _LC("MultiplayerSelector", "Hide own net label")); DrawGCheckbox(App::mp_pseudo_collisions, _LC("MultiplayerSelector", "Multiplayer collisions")); + this->DrawCharacterOverrideCfg(); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + BUTTONS_EXTRA_SPACE); ImGui::Separator(); @@ -430,3 +431,23 @@ void MultiplayerSelector::UpdateServerlist(MpServerInfoVec* data) } } +void MultiplayerSelector::DrawCharacterOverrideCfg() +{ + // Character + ImGui::Separator(); + ImGui::TextDisabled("%s:", _LC("MultiplayerSelector", "Override character")); + ImGui::SameLine(); + ImGui::Text("%s", App::mp_override_character->getStr().c_str()); + ImGui::SameLine(); + if (ImGui::SmallButton(_LC("MultiplayerSelector", "Select"))) + { + LoaderType* payload = new LoaderType(LoaderType::LT_CharacterMP); + App::GetGameContext()->PushMessage(Message(MSG_GUI_OPEN_SELECTOR_REQUESTED, (void*)payload)); + } + ImGui::SameLine(); + if (ImGui::SmallButton(_LC("MultiplayerSelector", "Clear"))) + { + App::mp_override_character->setStr(""); + } +} + diff --git a/source/main/gui/panels/GUI_MultiplayerSelector.h b/source/main/gui/panels/GUI_MultiplayerSelector.h index 86a7ce188b..540cad8419 100644 --- a/source/main/gui/panels/GUI_MultiplayerSelector.h +++ b/source/main/gui/panels/GUI_MultiplayerSelector.h @@ -70,6 +70,7 @@ class MultiplayerSelector void DrawSetupTab(); void DrawDirectTab(); void DrawServerlistTab(); + void DrawCharacterOverrideCfg(); MpServerInfoVec m_serverlist_data; int m_selected_item = -1; diff --git a/source/main/network/Network.cpp b/source/main/network/Network.cpp index 25d603bfa8..8fdee66ba0 100644 --- a/source/main/network/Network.cpp +++ b/source/main/network/Network.cpp @@ -501,6 +501,16 @@ bool Network::ConnectThread() std::string country = App::app_country->getStr().substr(0, 2); strncpy(c.language, (language + std::string("_") + country).c_str(), 5); strcpy(c.sessiontype, "normal"); + // determine character to use + if (App::mp_override_character->getStr() != "") + { + strncpy(c.characterfile, App::mp_override_character->getStr().c_str(), RORNET_MAX_CHARACTERFILE_LEN - 1); + } + else + { + strncpy(c.characterfile, App::sim_player_character->getStr().c_str(), RORNET_MAX_CHARACTERFILE_LEN - 1); + } + if (!SendNetMessage(MSG2_USER_INFO, 0, sizeof(RoRnet::UserInfo), (char*)&c)) { CouldNotConnect(_L("Establishing network session: error sending user info")); diff --git a/source/main/network/RoRnet.h b/source/main/network/RoRnet.h index ae3581b79e..77d7caa528 100644 --- a/source/main/network/RoRnet.h +++ b/source/main/network/RoRnet.h @@ -30,7 +30,8 @@ namespace RoRnet { #define RORNET_MAX_PEERS 64 //!< maximum clients connected at the same time #define RORNET_MAX_MESSAGE_LENGTH 8192 //!< maximum size of a RoR message. 8192 bytes = 8 kibibytes #define RORNET_LAN_BROADCAST_PORT 13000 //!< port used to send the broadcast announcement in LAN mode -#define RORNET_MAX_USERNAME_LEN 40 //!< port used to send the broadcast announcement in LAN mode +#define RORNET_MAX_USERNAME_LEN 40 +#define RORNET_MAX_CHARACTERFILE_LEN 40 #define RORNET_VERSION "RoRnet_2.44" @@ -232,7 +233,7 @@ struct UserInfo char clientversion[25]; //!< a version number of the client. For example 1 for RoR 0.35 char clientGUID[40]; //!< the clients GUID char sessiontype[10]; //!< the requested session type. For example "normal", "bot", "rcon" - char sessionoptions[128]; //!< reserved for future options + char characterfile[RORNET_MAX_CHARACTERFILE_LEN]; //!< Filename of the chosen character }; struct VehicleState //!< Formerly `oob_t` diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index e8ea011fe9..6c2615e146 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -1304,7 +1304,7 @@ size_t CacheSystem::Query(CacheQuery& query) else if (entry.fext == "skin") add = (query.cqy_filter_type == LT_Skin); else if (entry.fext == "character") - add = (query.cqy_filter_type == LT_Character); + add = (query.cqy_filter_type == LT_Character || LT_CharacterMP); else if (entry.fext == "truck") add = (query.cqy_filter_type == LT_AllBeam || query.cqy_filter_type == LT_Vehicle || query.cqy_filter_type == LT_Truck); else if (entry.fext == "car") diff --git a/source/main/resources/ContentManager.cpp b/source/main/resources/ContentManager.cpp index 9150473d74..a377d9c101 100644 --- a/source/main/resources/ContentManager.cpp +++ b/source/main/resources/ContentManager.cpp @@ -253,7 +253,7 @@ void ContentManager::InitModCache(CacheValidity validity) std::string user = App::sys_user_dir->getStr(); std::string base = App::sys_process_dir->getStr(); std::string objects = PathCombine("resources", "beamobjects.zip"); - std::string character = PathCombine("resources", "classic_character.zip"); + std::string character = PathCombine("resources", "default_character.zip"); if (!App::app_extra_mod_path->getStr().empty()) { diff --git a/source/main/system/CVar.cpp b/source/main/system/CVar.cpp index 7924583bbc..53d83b13e5 100644 --- a/source/main/system/CVar.cpp +++ b/source/main/system/CVar.cpp @@ -58,7 +58,7 @@ void Console::cVarSetupBuiltins() App::sim_gearbox_mode = this->cVarCreate("sim_gearbox_mode", "GearboxMode", CVAR_ARCHIVE | CVAR_TYPE_INT); App::sim_soft_reset_mode = this->cVarCreate("sim_soft_reset_mode", "", CVAR_TYPE_BOOL, "false"); App::sim_quickload_dialog = this->cVarCreate("sim_quickload_dialog", "", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "true"); - App::sim_player_character = this->cVarCreate("sim_player_character", "", CVAR_ARCHIVE, CLASSIC_CHARACTER_FILE); + App::sim_player_character = this->cVarCreate("sim_player_character", "", CVAR_ARCHIVE, DEFAULT_CHARACTER_FILE); App::mp_state = this->cVarCreate("mp_state", "", CVAR_TYPE_INT, "0"/*(int)MpState::DISABLED*/); App::mp_join_on_startup = this->cVarCreate("mp_join_on_startup", "Auto connect", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "false"); @@ -72,6 +72,7 @@ void Console::cVarSetupBuiltins() App::mp_player_name = this->cVarCreate("mp_player_name", "Nickname", CVAR_ARCHIVE, "Player"); App::mp_player_token = this->cVarCreate("mp_player_token", "User Token", CVAR_ARCHIVE | CVAR_NO_LOG); App::mp_api_url = this->cVarCreate("mp_api_url", "Online API URL", CVAR_ARCHIVE, "http://api.rigsofrods.org"); + App::mp_override_character = this->cVarCreate("mp_override_character", "", CVAR_ARCHIVE, ""); App::remote_query_url = this->cVarCreate("remote_query_url", "", CVAR_ARCHIVE, "https://v2.api.rigsofrods.org"); App::diag_auto_spawner_report= this->cVarCreate("diag_auto_spawner_report","AutoActorSpawnerReport", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "false"); From 42a2228b6c485b096f32b4f248777922cc0a7964 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Mon, 5 Jun 2023 00:17:18 +0200 Subject: [PATCH 25/32] FIXUP - fixed character always appearing in SelectorUI --- source/main/resources/CacheSystem.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index 6c2615e146..9abacfa78d 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -1304,7 +1304,7 @@ size_t CacheSystem::Query(CacheQuery& query) else if (entry.fext == "skin") add = (query.cqy_filter_type == LT_Skin); else if (entry.fext == "character") - add = (query.cqy_filter_type == LT_Character || LT_CharacterMP); + add = (query.cqy_filter_type == LT_Character || query.cqy_filter_type == LT_CharacterMP); else if (entry.fext == "truck") add = (query.cqy_filter_type == LT_AllBeam || query.cqy_filter_type == LT_Vehicle || query.cqy_filter_type == LT_Truck); else if (entry.fext == "car") From 2fe96af6daa8d0a2c516d81bb500a7322687e7ba Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Mon, 5 Jun 2023 00:19:46 +0200 Subject: [PATCH 26/32] .character: `author`, `material_override`, `character_description` --- resources/default_character/character.material | 2 +- source/main/gfx/GfxCharacter.cpp | 13 +++++++++++-- source/main/resources/CacheSystem.cpp | 13 ++++++++++++- .../CharacterFileFormat.cpp | 17 +++++++++++++++++ .../character_fileformat/CharacterFileFormat.h | 11 +++++++++++ 5 files changed, 52 insertions(+), 4 deletions(-) diff --git a/resources/default_character/character.material b/resources/default_character/character.material index 0c30934b4b..f1a65e8464 100644 --- a/resources/default_character/character.material +++ b/resources/default_character/character.material @@ -1,6 +1,6 @@ import * from "managed_mats.material" -material tracks/character: RoR/Managed_Mats/Base +material character: RoR/Managed_Mats/Base { technique BaseTechnique { diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index ce1d1b662d..f5df86f6c5 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -62,10 +62,19 @@ GfxCharacter::GfxCharacter(Character* character) xc_scenenode->setVisible(false); // setup colour + std::string sharedMatName; + if (xc_character->m_character_def->material_override != "") + { + sharedMatName = xc_character->m_character_def->material_override; + } + else + { + sharedMatName = entity->getMesh()->getSubMesh(0)->getMaterialName(); + } MaterialPtr sharedMat = MaterialManager::getSingleton().getByName( - /*name:*/ "tracks/character", + /*name:*/ sharedMatName, /*groupName:*/ character->m_cache_entry->resource_group); - MaterialPtr ownMat = sharedMat->clone("tracks/" + xc_instance_name); + MaterialPtr ownMat = sharedMat->clone(sharedMatName + "@" + xc_instance_name); entity->setMaterial(ownMat); // setup animation blend diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index 9abacfa78d..5ef3a554ce 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -1077,8 +1077,19 @@ void CacheSystem::FillCharacterDetailInfo(CacheEntry& entry, Ogre::DataStreamPtr { CharacterParser parser; CharacterDocumentPtr doc = parser.ProcessOgreStream(datastream); - + + for (CharacterAuthorInfo& author: doc->authors) + { + AuthorInfo a; + a.id = author.id; + a.type = author.type; + a.name = author.name; + a.email = author.email; + entry.authors.push_back(a); + } + entry.dname = doc->character_name; + entry.description = doc->character_description; } bool CacheSystem::CheckResourceLoaded(Ogre::String & filename) diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.cpp b/source/main/resources/character_fileformat/CharacterFileFormat.cpp index 056a6e206f..a04168a90f 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.cpp +++ b/source/main/resources/character_fileformat/CharacterFileFormat.cpp @@ -129,10 +129,18 @@ void CharacterParser::ProcessCurrentLine() { m_def->character_name = GetParam(1); } + if (StartsWith(m_cur_line, "character_description")) + { + m_def->character_description = GetParam(1); + } else if (StartsWith(m_cur_line, "mesh_name")) { m_def->mesh_name = GetParam(1); } + else if (StartsWith(m_cur_line, "material_override")) + { + m_def->material_override = GetParam(1); + } else if (StartsWith(m_cur_line, "mesh_scale")) { if (m_cur_args.size() > 1) m_def->mesh_scale.x = Ogre::StringConverter::parseReal(GetParam(1)); @@ -151,6 +159,15 @@ void CharacterParser::ProcessCurrentLine() { m_ctx.in_bone_blend_mask = true; } + else if (StartsWith(m_cur_line, "author")) + { + CharacterAuthorInfo author; + author.type = GetParam(1); + author.id = Ogre::StringConverter::parseInt(GetParam(2)); + author.name = GetParam(3); + author.email = GetParam(4); + m_def->authors.push_back(author); + } } else if (m_ctx.in_action) { diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.h b/source/main/resources/character_fileformat/CharacterFileFormat.h index 8ec55ee4e4..9851b2cc3d 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.h +++ b/source/main/resources/character_fileformat/CharacterFileFormat.h @@ -79,13 +79,24 @@ enum class ForceAnimBlend //!< Should a specific `Ogre::SkeletonAnimationBlendMo CUMULATIVE }; +struct CharacterAuthorInfo +{ + int id = -1; + std::string name; + std::string type; + std::string email; +}; + struct CharacterDocument { std::string character_name; + std::string character_description; std::string mesh_name; + std::string material_override; //!< Optional; overrides the material name in the mesh file. Ogre::Vector3 mesh_scale = Ogre::Vector3(1, 1, 1); std::vector actions; std::vector bone_blend_masks; + std::vector authors; ForceAnimBlend force_animblend = ForceAnimBlend::NONE; //!< Should a specific `Ogre::SkeletonAnimationBlendMode` be forced, or should we keep what the .skeleton file defines? }; From 27bd05ca21677ca47c301b074e974b05074d727f Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Mon, 5 Jun 2023 13:44:56 +0200 Subject: [PATCH 27/32] Added skinzip support to characters. cvars: added sim_player_character_skin, mp_override_character_skin character format: removed 'material_override', added 'character_guid' -- deal with it rornet: added 'character_skinfile' (max 40 characters) to UserInfo GameSettingsUI: added skin info next to sim_player_character info. MultiplayerSelectorUI: added skin info next to mp_override_character info. MainSelectorUI: all spawning and skin-choosing logic moved from `MainSelector::Apply()` to `GameContext::OnLoaderGuiApply()` - all in one place. added guid to default.character in resources. character now supports multiple materials (= submeshes + subentities, because each can use only one material) --- resources/default_character/default.character | 3 + source/main/Application.cpp | 2 + source/main/Application.h | 2 + source/main/GameContext.cpp | 59 +++++++-- source/main/GameContext.h | 2 +- source/main/gameplay/Character.cpp | 3 +- source/main/gameplay/Character.h | 3 +- source/main/gameplay/CharacterFactory.cpp | 46 ++++++- source/main/gfx/GfxCharacter.cpp | 116 ++++++++++++++++-- source/main/gfx/GfxCharacter.h | 5 + source/main/gui/panels/GUI_GameSettings.cpp | 35 ++++-- source/main/gui/panels/GUI_GameSettings.h | 3 + source/main/gui/panels/GUI_MainSelector.cpp | 48 ++------ .../gui/panels/GUI_MultiplayerSelector.cpp | 13 +- source/main/network/Network.cpp | 6 +- source/main/network/RoRnet.h | 6 +- source/main/resources/CacheSystem.cpp | 1 + .../CharacterFileFormat.cpp | 4 +- .../CharacterFileFormat.h | 2 +- source/main/system/CVar.cpp | 2 + 20 files changed, 276 insertions(+), 85 deletions(-) diff --git a/resources/default_character/default.character b/resources/default_character/default.character index 92c74d96af..65a5ec9e40 100644 --- a/resources/default_character/default.character +++ b/resources/default_character/default.character @@ -21,6 +21,9 @@ ; Name displayed in the Selector UI - required character_name "Default character" +; required for skinning - use https://guidgenerator.com for your mods. +character_guid "baef1af5-2854-48c3-af05-5087da2d773b" + ; Name of the mesh file - required. mesh_name "character.mesh" diff --git a/source/main/Application.cpp b/source/main/Application.cpp index 9c8938932c..c4053da3c8 100644 --- a/source/main/Application.cpp +++ b/source/main/Application.cpp @@ -109,6 +109,7 @@ CVar* sim_gearbox_mode; CVar* sim_soft_reset_mode; CVar* sim_quickload_dialog; CVar* sim_player_character; +CVar* sim_player_character_skin; // Multiplayer CVar* mp_state; @@ -124,6 +125,7 @@ CVar* mp_player_name; CVar* mp_player_token; CVar* mp_api_url; CVar* mp_override_character; +CVar* mp_override_character_skin; // New remote API CVar* remote_query_url; diff --git a/source/main/Application.h b/source/main/Application.h index 307a7a4967..a3a163a45b 100644 --- a/source/main/Application.h +++ b/source/main/Application.h @@ -306,6 +306,7 @@ extern CVar* sim_gearbox_mode; extern CVar* sim_soft_reset_mode; extern CVar* sim_quickload_dialog; extern CVar* sim_player_character; +extern CVar* sim_player_character_skin; // Multiplayer extern CVar* mp_state; @@ -321,6 +322,7 @@ extern CVar* mp_player_name; extern CVar* mp_player_token; extern CVar* mp_api_url; extern CVar* mp_override_character; // If empty, use `sim_default_character` +extern CVar* mp_override_character_skin; // New remote API extern CVar* remote_query_url; diff --git a/source/main/GameContext.cpp b/source/main/GameContext.cpp index 090492365b..c80bac8513 100644 --- a/source/main/GameContext.cpp +++ b/source/main/GameContext.cpp @@ -649,9 +649,14 @@ void GameContext::OnLoaderGuiCancel() void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::string sectionconfig) { - bool spawn_now = false; + bool selection_finished = false; switch (type) { + case LT_Terrain: + m_current_selection.asr_cache_entry = entry; + selection_finished = true; + break; + case LT_Skin: if (entry != &m_dummy_cache_selection) { @@ -665,7 +670,7 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri App::GetGuiManager()->TopMenubar.ai_skin2 = entry->dname; } } - spawn_now = true; + selection_finished = true; break; case LT_Vehicle: @@ -678,6 +683,8 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri case LT_Load: case LT_Extension: case LT_AllBeam: + case LT_Character: + case LT_CharacterMP: m_current_selection.asr_cache_entry = entry; m_current_selection.asr_config = sectionconfig; if (App::GetGuiManager()->TopMenubar.ai_select) @@ -690,7 +697,7 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri } m_current_selection.asr_origin = ActorSpawnRequest::Origin::USER; // Look for extra skins - if (!entry->guid.empty()) + if (entry->guid != "") { CacheQuery skin_query; skin_query.cqy_filter_guid = entry->guid; @@ -708,7 +715,7 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri if (!default_skin_entry) { App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_ACTOR, Console::CONSOLE_SYSTEM_WARNING, - fmt::format(_L("Default skin '{}' for actor '{}' not found!"), entry->default_skin, entry->dname)); + fmt::format(_L("Default skin '{}' for cache entry '{}' not found!"), entry->default_skin, entry->dname)); } if (default_skin_entry && num_skins == 1) { @@ -728,19 +735,57 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri } else { - spawn_now = true; + selection_finished = true; } } else { - spawn_now = true; + selection_finished = true; } break; default:; } - if (spawn_now) + if (selection_finished && m_current_selection.asr_cache_entry->fext == "terrn2") + { + if (App::app_state->getEnum() == AppState::MAIN_MENU) + { + App::GetGameContext()->PushMessage(Message(MSG_SIM_LOAD_TERRN_REQUESTED, m_current_selection.asr_cache_entry->fname)); + } + } + else if (selection_finished && m_current_selection.asr_cache_entry->fext == "character") + { + switch (type) + { + case LT_Character: // Invoked by Settings UI button + App::sim_player_character->setStr(m_current_selection.asr_cache_entry->fname); + if (m_current_selection.asr_skin_entry) + { + App::sim_player_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + } + else + { + App::sim_player_character_skin->setStr(""); + } + break; + + case LT_CharacterMP: // Invoked by MultiplayerSelector UI button + App::mp_override_character->setStr(m_current_selection.asr_cache_entry->fname); + if (m_current_selection.asr_skin_entry) + { + App::mp_override_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + } + else + { + App::mp_override_character_skin->setStr(""); + } + break; + + default:; // uhh, what? + } + } + else if (selection_finished) { if (App::GetGuiManager()->TopMenubar.ai_select) { diff --git a/source/main/GameContext.h b/source/main/GameContext.h index c2fb275d8c..8e6521eee2 100644 --- a/source/main/GameContext.h +++ b/source/main/GameContext.h @@ -194,7 +194,7 @@ class GameContext CacheEntry* m_last_cache_selection = nullptr; //!< Vehicle/load CacheEntry* m_last_skin_selection = nullptr; Ogre::String m_last_section_config; - ActorSpawnRequest m_current_selection; //!< Context of the loader UI + ActorSpawnRequest m_current_selection; //!< Context of the loader UI (may also be Character!) CacheEntry m_dummy_cache_selection; // Characters (simplified physics and netcode) diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index 710307b39e..0e8a1b5bd7 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -41,7 +41,7 @@ using namespace Ogre; using namespace RoR; using namespace RoRnet; -Character::Character(CacheEntry* cacheEntry, CharacterDocumentPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : +Character::Character(CacheEntry* cacheEntry, CacheEntry* skinEntry, CharacterDocumentPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) , m_character_rotation(0.0f) , m_character_h_speed(2.0f) @@ -54,6 +54,7 @@ Character::Character(CacheEntry* cacheEntry, CharacterDocumentPtr def, int sourc , m_stream_id(streamid) , m_character_def(def) , m_cache_entry(cacheEntry) + , m_used_skin_entry(skinEntry) { static int id_counter = 0; m_instance_name = "Character" + TOSTRING(id_counter); diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 73f5d2d313..d93c8b7200 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -58,7 +58,7 @@ class Character static const char* SituationFlagToString(BitMask_t single_situation_flag); static BitMask_t SituationFlagFromString(std::string const& single_situation_flag_str); - Character(CacheEntry* cacheEntry, CharacterDocumentPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); + Character(CacheEntry* cacheEntry, CacheEntry* skinEntry, CharacterDocumentPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); // get info @@ -93,6 +93,7 @@ class Character // attributes CharacterDocumentPtr m_character_def; CacheEntry* m_cache_entry = nullptr; + CacheEntry* m_used_skin_entry = nullptr; std::string m_instance_name; // transforms diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index db43e579cb..80b1dffe90 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -60,6 +60,7 @@ Character* CharacterFactory::CreateLocalCharacter() int colourNum = -1; Ogre::UTFString playerName = ""; std::string characterFile = App::sim_player_character->getStr(); + std::string characterSkinfile = App::sim_player_character_skin->getStr(); #ifdef USE_SOCKETW if (App::mp_state->getEnum() == MpState::CONNECTED) @@ -67,7 +68,8 @@ Character* CharacterFactory::CreateLocalCharacter() RoRnet::UserInfo info = App::GetNetwork()->GetLocalUserData(); colourNum = info.colournum; playerName = tryConvertUTF(info.username); - characterFile = info.characterfile; + characterFile = info.character_file; + characterSkinfile = info.character_skinfile; } #endif // USE_SOCKETW @@ -92,6 +94,23 @@ Character* CharacterFactory::CreateLocalCharacter() } } + CacheEntry* skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, characterSkinfile); + + if (skin_entry) + { + std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists + if (skin_def == nullptr) + { + skin_entry = nullptr; // Error already logged + } + // Note the skin def is cached in the CacheEntry so the GfxCharacter can just rely on it. + } + else + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Could not find character skin '{}' in mod cache, continuing without it.", characterSkinfile)); + } + App::GetCacheSystem()->LoadResource(*cache_entry); CharacterDocumentPtr document = this->FetchCharacterDef(cache_entry); @@ -100,7 +119,7 @@ Character* CharacterFactory::CreateLocalCharacter() return nullptr; // Error already reported } - m_local_character = std::unique_ptr(new Character(cache_entry, document, -1, 0, playerName, colourNum, false)); + m_local_character = std::unique_ptr(new Character(cache_entry, skin_entry, document, -1, 0, playerName, colourNum, false)); App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); return m_local_character.get(); } @@ -117,11 +136,28 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) LOG(" new character for " + info_str); - CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, info.characterfile); + CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, info.character_file); if (!cache_entry) { App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("Could not create character for {} - character '{}' not found in mod cache.", info_str, info.characterfile)); + fmt::format("Could not create character for {} - character '{}' not found in mod cache.", info_str, info.character_file)); + return; + } + + CacheEntry* skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, info.character_skinfile); + if (skin_entry) + { + std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists + if (skin_def == nullptr) + { + skin_entry = nullptr; // Error already logged + } + // Note the skin def is cached in the CacheEntry so the GfxCharacter can just rely on it. + } + else + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Could not skin character for {} - skin '{}' not found in mod cache.", info_str, info.character_skinfile)); return; } @@ -133,7 +169,7 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) return; } - Character* ch = new Character(cache_entry, document, sourceid, streamid, name, colour, true); + Character* ch = new Character(cache_entry, skin_entry, document, sourceid, streamid, name, colour, true); App::GetGfxScene()->RegisterGfxCharacter(ch); m_remote_characters.push_back(std::unique_ptr(ch)); #endif // USE_SOCKETW diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index f5df86f6c5..3c5481f964 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -34,6 +34,7 @@ #include "InputEngine.h" #include "MovableText.h" #include "Network.h" +#include "SkinFileFormat.h" #include "Terrain.h" #include "Utils.h" #include "Water.h" @@ -45,6 +46,10 @@ GfxCharacter::GfxCharacter(Character* character) : xc_character(character) , xc_instance_name(character->m_instance_name) { + // Use the modcache bundle (ZIP) resource group. + // This is equivalent to what `Actor`s do. + xc_custom_resource_group = character->m_cache_entry->resource_group; + Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity( /*entityName:*/ xc_instance_name + "_mesh", /*meshName:*/ xc_character->m_character_def->mesh_name, @@ -61,21 +66,16 @@ GfxCharacter::GfxCharacter(Character* character) xc_scenenode->setScale(xc_character->m_character_def->mesh_scale); xc_scenenode->setVisible(false); - // setup colour - std::string sharedMatName; - if (xc_character->m_character_def->material_override != "") - { - sharedMatName = xc_character->m_character_def->material_override; - } - else + // setup colour and resolve skins (SkinZips) + // The mesh (for example Sinbad the Ogre) may use multiple materials + // which means having multiple submeshes in Mesh and subentities in Entity + // (each submesh/subentity can have only 1 material) + for (Ogre::SubEntity* subent: entity->getSubEntities()) { - sharedMatName = entity->getMesh()->getSubMesh(0)->getMaterialName(); + const std::string sharedMatName = subent->getSubMesh()->getMaterialName(); + Ogre::MaterialPtr ownMat = this->FindOrCreateCustomizedMaterial(sharedMatName); + subent->setMaterial(ownMat); } - MaterialPtr sharedMat = MaterialManager::getSingleton().getByName( - /*name:*/ sharedMatName, - /*groupName:*/ character->m_cache_entry->resource_group); - MaterialPtr ownMat = sharedMat->clone(sharedMatName + "@" + xc_instance_name); - entity->setMaterial(ownMat); // setup animation blend switch (character->getCharacterDocument()->force_animblend) @@ -365,3 +365,93 @@ void GfxCharacter::EnableAnim(Ogre::AnimationState* as, float time) as->setWeight(1); as->setTimePosition(time); // addTime() ? } + + +Ogre::MaterialPtr GfxCharacter::FindOrCreateCustomizedMaterial(const std::string& mat_lookup_name) +{ + // Spawn helper which resolves skins (SkinZips) and returns unique material + // Derived from `ActorSpawner::FindOrCreateCustomizedMaterial()` + // ------------------------------------------------------------------------ + + // Query .skin material replacements + if (xc_character->m_used_skin_entry != nullptr) + { + std::shared_ptr& skin_def = xc_character->m_used_skin_entry->skin_def; + + auto skin_res = skin_def->replace_materials.find(mat_lookup_name); + if (skin_res != skin_def->replace_materials.end()) + { + // Material substitution found - check if the material exists. + Ogre::MaterialPtr skin_mat = Ogre::MaterialManager::getSingleton().getByName( + skin_res->second, xc_character->m_used_skin_entry->resource_group); + if (!skin_mat.isNull()) + { + // Material exists - clone and return right away - texture substitutions aren't done in this case. + std::string name_buf = fmt::format("{}@{}", skin_mat->getName(), xc_character->m_instance_name); + return skin_mat->clone(name_buf, /*changeGroup=*/true, xc_custom_resource_group); + } + else + { + // Material doesn't exist - log warning and continue. + std::stringstream buf; + buf << "Character: Material '" << skin_res->second << "' from skin '" << xc_character->m_used_skin_entry->dname + << "' not found (filename: '" << xc_character->m_used_skin_entry->fname + << "', resource group: '"<< xc_character->m_used_skin_entry->resource_group + <<"')! Ignoring it..."; + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, buf.str()); + } + } + } + + // Skinzip material replacement not found - clone the input material + MaterialPtr sharedMat = MaterialManager::getSingleton().getByName( + /*name:*/ mat_lookup_name, + /*groupName:*/ xc_character->m_cache_entry->resource_group); + std::string name_buf = fmt::format("{}@{}", mat_lookup_name, xc_character->m_instance_name); + MaterialPtr ownMat = sharedMat->clone(name_buf, /*changeGroup=*/true, xc_custom_resource_group); + + // Finally, query .skin texture replacements + if (xc_character->m_used_skin_entry != nullptr) + { + for (auto& technique: ownMat->getTechniques()) + { + for (auto& pass: technique->getPasses()) + { + for (auto& tex_unit: pass->getTextureUnitStates()) + { + const size_t num_frames = tex_unit->getNumFrames(); + for (size_t i = 0; i < num_frames; ++i) + { + const auto end = xc_character->m_used_skin_entry->skin_def->replace_textures.end(); + const auto query = xc_character->m_used_skin_entry->skin_def->replace_textures.find(tex_unit->getFrameTextureName((unsigned int)i)); + if (query != end) + { + // Skin has replacement for this texture + if (xc_character->m_used_skin_entry->resource_group != xc_custom_resource_group) // The skin comes from a SkinZip bundle (different resource group) + { + Ogre::TexturePtr tex = Ogre::TextureManager::getSingleton().getByName( + query->second, xc_character->m_used_skin_entry->resource_group); + if (tex.isNull()) + { + // `Ogre::TextureManager` doesn't automatically register all images in resource groups, + // it waits for `Ogre::Resource`s to be created explicitly. + // Normally this is done by `Ogre::MaterialManager` when loading a material. + // In this case we must do it manually + tex = Ogre::TextureManager::getSingleton().create( + query->second, xc_character->m_used_skin_entry->resource_group); + } + tex_unit->_setTexturePtr(tex, i); + } + else // The skin lives in the character bundle (same resource group) + { + tex_unit->setFrameTextureName(query->second, (unsigned int)i); + } + } + } // texture unit frames + } // texture unit states + } // passes + } // techniques + } + + return ownMat; +} diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index db0e1059d1..2136f9bb39 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -48,11 +48,16 @@ struct GfxCharacter void EvaluateActionDef(CharacterActionDef const& def, float dt); void SetupBoneBlendMask(BoneBlendMaskDef const& mask_def); + // Spawn helper which resolves skins (SkinZips) + // Derived from `ActorSpawner::FindOrCreateCustomizedMaterial()` + Ogre::MaterialPtr FindOrCreateCustomizedMaterial(const std::string& mat_lookup_name); + Ogre::SceneNode* xc_scenenode; CharacterSB xc_simbuf; CharacterSB xc_simbuf_prev; Character* xc_character; std::string xc_instance_name; + std::string xc_custom_resource_group; }; /// @} // addtogroup Gfx diff --git a/source/main/gui/panels/GUI_GameSettings.cpp b/source/main/gui/panels/GUI_GameSettings.cpp index fac6630990..a3e0d8691e 100644 --- a/source/main/gui/panels/GUI_GameSettings.cpp +++ b/source/main/gui/panels/GUI_GameSettings.cpp @@ -266,18 +266,9 @@ void GameSettings::DrawGameplaySettings() DrawGCheckbox(App::io_discord_rpc, _LC("GameSettings", "Discord Rich Presence")); DrawGCheckbox(App::sim_quickload_dialog, _LC("GameSettings", "Show confirm. UI dialog for quickload")); - - // Character + ImGui::Separator(); - ImGui::TextDisabled("%s:", _LC("GameSettings", "Player character")); - ImGui::SameLine(); - ImGui::Text("%s", App::sim_player_character->getStr().c_str()); - ImGui::SameLine(); - if (ImGui::SmallButton(_LC("GameSettings", "Select"))) - { - LoaderType* payload = new LoaderType(LoaderType::LT_Character); - App::GetGameContext()->PushMessage(Message(MSG_GUI_OPEN_SELECTOR_REQUESTED, (void*)payload)); - } + this->DrawPlayerCharacterCfg(); } void GameSettings::DrawAudioSettings() @@ -544,3 +535,25 @@ void GameSettings::SetVisible(bool v) ImTerminateComboboxString(m_combo_items_input_grab); } } + +void GameSettings::DrawPlayerCharacterCfg() +{ + ImGui::TextDisabled("%s:", _LC("GameSettings", "Player character")); + ImGui::SameLine(); + ImGui::Text("%s", App::sim_player_character->getStr().c_str()); + ImGui::SameLine(); + if (App::sim_player_character_skin->getStr() == "") + { + ImGui::TextDisabled("(default skin)"); + } + else + { + ImGui::Text("(Skin: '%s')", App::sim_player_character_skin->getStr().c_str()); + } + ImGui::SameLine(); + if (ImGui::SmallButton(_LC("GameSettings", "Select"))) + { + LoaderType* payload = new LoaderType(LoaderType::LT_Character); + App::GetGameContext()->PushMessage(Message(MSG_GUI_OPEN_SELECTOR_REQUESTED, (void*)payload)); + } +} diff --git a/source/main/gui/panels/GUI_GameSettings.h b/source/main/gui/panels/GUI_GameSettings.h index 94bf4aa5c0..c15ae1488c 100644 --- a/source/main/gui/panels/GUI_GameSettings.h +++ b/source/main/gui/panels/GUI_GameSettings.h @@ -42,6 +42,9 @@ class GameSettings void DrawControlSettings(); void DrawDiagSettings(); + // helper + void DrawPlayerCharacterCfg(); + // GUI state bool m_is_visible = false; diff --git a/source/main/gui/panels/GUI_MainSelector.cpp b/source/main/gui/panels/GUI_MainSelector.cpp index 2261311b05..00c0475935 100644 --- a/source/main/gui/panels/GUI_MainSelector.cpp +++ b/source/main/gui/panels/GUI_MainSelector.cpp @@ -612,46 +612,20 @@ void MainSelector::Apply() ROR_ASSERT(m_selected_entry > -1); // Programmer error DisplayEntry& sd_entry = m_display_entries[m_selected_entry]; - switch (m_loader_type) - { - case LT_Character: // Invoked by Settings UI button - App::sim_player_character->setStr(sd_entry.sde_entry->fname); - this->Close(); - break; - - case LT_CharacterMP: // Invoked by MultiplayerSelector UI button - App::mp_override_character->setStr(sd_entry.sde_entry->fname); - this->Close(); - break; - - case LT_Terrain: // Invoked by Main menu button - if (App::app_state->getEnum() == AppState::MAIN_MENU) - { - App::GetGameContext()->PushMessage(Message(MSG_SIM_LOAD_TERRN_REQUESTED, sd_entry.sde_entry->fname)); - this->Close(); - } - break; + // Make a copy because `Close()` will reset it. + LoaderType orig_loader_type = m_loader_type; - default: // Vehicle in simulation (Invoked by: top menubar, hotkey, or spawner) - if (App::app_state->getEnum() == AppState::SIMULATION) - { - // Make a copy because `Close()` will reset it. - LoaderType orig_loader_type = m_loader_type; - - // If no config was selected, use the first one. - std::string sectionconfig; - if (sd_entry.sde_entry->sectionconfigs.size() > 0) - { - sectionconfig = sd_entry.sde_entry->sectionconfigs[m_selected_sectionconfig]; - } + // If no config was selected, use the first one. + std::string sectionconfig; + if (sd_entry.sde_entry->sectionconfigs.size() > 0) + { + sectionconfig = sd_entry.sde_entry->sectionconfigs[m_selected_sectionconfig]; + } - // Close the UI so that GameContext can reopen it if needed (used for skins) - this->Close(); + // Close the UI so that GameContext can reopen it if needed (used for skins) + this->Close(); - App::GetGameContext()->OnLoaderGuiApply(orig_loader_type, sd_entry.sde_entry, sectionconfig); - } - break; - } + App::GetGameContext()->OnLoaderGuiApply(orig_loader_type, sd_entry.sde_entry, sectionconfig); } // Static helper diff --git a/source/main/gui/panels/GUI_MultiplayerSelector.cpp b/source/main/gui/panels/GUI_MultiplayerSelector.cpp index ee1034685b..de45600be5 100644 --- a/source/main/gui/panels/GUI_MultiplayerSelector.cpp +++ b/source/main/gui/panels/GUI_MultiplayerSelector.cpp @@ -193,6 +193,8 @@ void MultiplayerSelector::DrawSetupTab() DrawGCheckbox(App::mp_hide_net_labels, _LC("MultiplayerSelector", "Hide net labels")); DrawGCheckbox(App::mp_hide_own_net_label, _LC("MultiplayerSelector", "Hide own net label")); DrawGCheckbox(App::mp_pseudo_collisions, _LC("MultiplayerSelector", "Multiplayer collisions")); + + ImGui::Separator(); this->DrawCharacterOverrideCfg(); ImGui::SetCursorPosY(ImGui::GetCursorPosY() + BUTTONS_EXTRA_SPACE); @@ -433,12 +435,19 @@ void MultiplayerSelector::UpdateServerlist(MpServerInfoVec* data) void MultiplayerSelector::DrawCharacterOverrideCfg() { - // Character - ImGui::Separator(); ImGui::TextDisabled("%s:", _LC("MultiplayerSelector", "Override character")); ImGui::SameLine(); ImGui::Text("%s", App::mp_override_character->getStr().c_str()); ImGui::SameLine(); + if (App::mp_override_character_skin->getStr() == "") + { + ImGui::TextDisabled("(default skin)"); + } + else + { + ImGui::Text("(Skin: '%s')", App::mp_override_character_skin->getStr().c_str()); + } + ImGui::SameLine(); if (ImGui::SmallButton(_LC("MultiplayerSelector", "Select"))) { LoaderType* payload = new LoaderType(LoaderType::LT_CharacterMP); diff --git a/source/main/network/Network.cpp b/source/main/network/Network.cpp index 8fdee66ba0..22dd948bc3 100644 --- a/source/main/network/Network.cpp +++ b/source/main/network/Network.cpp @@ -504,11 +504,13 @@ bool Network::ConnectThread() // determine character to use if (App::mp_override_character->getStr() != "") { - strncpy(c.characterfile, App::mp_override_character->getStr().c_str(), RORNET_MAX_CHARACTERFILE_LEN - 1); + strncpy(c.character_file, App::mp_override_character->getStr().c_str(), RORNET_MAX_CHARACTER_FILE_LEN - 1); + strncpy(c.character_skinfile, App::mp_override_character_skin->getStr().c_str(), RORNET_MAX_CHARACTER_SKINFILE_LEN - 1); } else { - strncpy(c.characterfile, App::sim_player_character->getStr().c_str(), RORNET_MAX_CHARACTERFILE_LEN - 1); + strncpy(c.character_file, App::sim_player_character->getStr().c_str(), RORNET_MAX_CHARACTER_FILE_LEN - 1); + strncpy(c.character_skinfile, App::sim_player_character_skin->getStr().c_str(), RORNET_MAX_CHARACTER_SKINFILE_LEN - 1); } if (!SendNetMessage(MSG2_USER_INFO, 0, sizeof(RoRnet::UserInfo), (char*)&c)) diff --git a/source/main/network/RoRnet.h b/source/main/network/RoRnet.h index 77d7caa528..a404aee7ab 100644 --- a/source/main/network/RoRnet.h +++ b/source/main/network/RoRnet.h @@ -31,7 +31,8 @@ namespace RoRnet { #define RORNET_MAX_MESSAGE_LENGTH 8192 //!< maximum size of a RoR message. 8192 bytes = 8 kibibytes #define RORNET_LAN_BROADCAST_PORT 13000 //!< port used to send the broadcast announcement in LAN mode #define RORNET_MAX_USERNAME_LEN 40 -#define RORNET_MAX_CHARACTERFILE_LEN 40 +#define RORNET_MAX_CHARACTER_FILE_LEN 40 +#define RORNET_MAX_CHARACTER_SKINFILE_LEN 40 #define RORNET_VERSION "RoRnet_2.44" @@ -233,7 +234,8 @@ struct UserInfo char clientversion[25]; //!< a version number of the client. For example 1 for RoR 0.35 char clientGUID[40]; //!< the clients GUID char sessiontype[10]; //!< the requested session type. For example "normal", "bot", "rcon" - char characterfile[RORNET_MAX_CHARACTERFILE_LEN]; //!< Filename of the chosen character + char character_file[RORNET_MAX_CHARACTER_FILE_LEN]; //!< Filename of the chosen character + char character_skinfile[RORNET_MAX_CHARACTER_SKINFILE_LEN]; //!< Skin filename of the chosen character }; struct VehicleState //!< Formerly `oob_t` diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index 5ef3a554ce..c5dd6ceae1 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -1090,6 +1090,7 @@ void CacheSystem::FillCharacterDetailInfo(CacheEntry& entry, Ogre::DataStreamPtr entry.dname = doc->character_name; entry.description = doc->character_description; + entry.guid = doc->character_guid; } bool CacheSystem::CheckResourceLoaded(Ogre::String & filename) diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.cpp b/source/main/resources/character_fileformat/CharacterFileFormat.cpp index a04168a90f..ea70d67bb6 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.cpp +++ b/source/main/resources/character_fileformat/CharacterFileFormat.cpp @@ -137,9 +137,9 @@ void CharacterParser::ProcessCurrentLine() { m_def->mesh_name = GetParam(1); } - else if (StartsWith(m_cur_line, "material_override")) + else if (StartsWith(m_cur_line, "character_guid")) { - m_def->material_override = GetParam(1); + m_def->character_guid = GetParam(1); } else if (StartsWith(m_cur_line, "mesh_scale")) { diff --git a/source/main/resources/character_fileformat/CharacterFileFormat.h b/source/main/resources/character_fileformat/CharacterFileFormat.h index 9851b2cc3d..0d6ff2f288 100644 --- a/source/main/resources/character_fileformat/CharacterFileFormat.h +++ b/source/main/resources/character_fileformat/CharacterFileFormat.h @@ -92,7 +92,7 @@ struct CharacterDocument std::string character_name; std::string character_description; std::string mesh_name; - std::string material_override; //!< Optional; overrides the material name in the mesh file. + std::string character_guid; // deal with it Ogre::Vector3 mesh_scale = Ogre::Vector3(1, 1, 1); std::vector actions; std::vector bone_blend_masks; diff --git a/source/main/system/CVar.cpp b/source/main/system/CVar.cpp index 53d83b13e5..4939d659cd 100644 --- a/source/main/system/CVar.cpp +++ b/source/main/system/CVar.cpp @@ -59,6 +59,7 @@ void Console::cVarSetupBuiltins() App::sim_soft_reset_mode = this->cVarCreate("sim_soft_reset_mode", "", CVAR_TYPE_BOOL, "false"); App::sim_quickload_dialog = this->cVarCreate("sim_quickload_dialog", "", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "true"); App::sim_player_character = this->cVarCreate("sim_player_character", "", CVAR_ARCHIVE, DEFAULT_CHARACTER_FILE); + App::sim_player_character_skin=this->cVarCreate("sim_player_character_skin","", CVAR_ARCHIVE, ""); App::mp_state = this->cVarCreate("mp_state", "", CVAR_TYPE_INT, "0"/*(int)MpState::DISABLED*/); App::mp_join_on_startup = this->cVarCreate("mp_join_on_startup", "Auto connect", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "false"); @@ -73,6 +74,7 @@ void Console::cVarSetupBuiltins() App::mp_player_token = this->cVarCreate("mp_player_token", "User Token", CVAR_ARCHIVE | CVAR_NO_LOG); App::mp_api_url = this->cVarCreate("mp_api_url", "Online API URL", CVAR_ARCHIVE, "http://api.rigsofrods.org"); App::mp_override_character = this->cVarCreate("mp_override_character", "", CVAR_ARCHIVE, ""); + App::mp_override_character_skin=this->cVarCreate("mp_override_character_skin","", CVAR_ARCHIVE, ""); App::remote_query_url = this->cVarCreate("remote_query_url", "", CVAR_ARCHIVE, "https://v2.api.rigsofrods.org"); App::diag_auto_spawner_report= this->cVarCreate("diag_auto_spawner_report","AutoActorSpawnerReport", CVAR_ARCHIVE | CVAR_TYPE_BOOL, "false"); From 74f536a899961f732e1cfbf010d4fbf829ae9a2e Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Wed, 7 Jun 2023 03:22:45 +0200 Subject: [PATCH 28/32] Fixed SelectorUI glitches with character/terrain. The `m_current_selection` selection wasn't properly cleared. Also LT_Character/LT_CharacterMP were detected wrong (`type` would be LT_Skin if skins were available). --- source/main/GameContext.cpp | 97 +++++++++++++++++++------------------ source/main/GameContext.h | 1 + 2 files changed, 52 insertions(+), 46 deletions(-) diff --git a/source/main/GameContext.cpp b/source/main/GameContext.cpp index c80bac8513..943da86e7c 100644 --- a/source/main/GameContext.cpp +++ b/source/main/GameContext.cpp @@ -685,6 +685,7 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri case LT_AllBeam: case LT_Character: case LT_CharacterMP: + m_current_selector_type = type; m_current_selection.asr_cache_entry = entry; m_current_selection.asr_config = sectionconfig; if (App::GetGuiManager()->TopMenubar.ai_select) @@ -747,68 +748,72 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri default:; } - if (selection_finished && m_current_selection.asr_cache_entry->fext == "terrn2") + if (selection_finished) { - if (App::app_state->getEnum() == AppState::MAIN_MENU) + if (m_current_selection.asr_cache_entry->fext == "terrn2") { - App::GetGameContext()->PushMessage(Message(MSG_SIM_LOAD_TERRN_REQUESTED, m_current_selection.asr_cache_entry->fname)); + if (App::app_state->getEnum() == AppState::MAIN_MENU) + { + App::GetGameContext()->PushMessage(Message(MSG_SIM_LOAD_TERRN_REQUESTED, m_current_selection.asr_cache_entry->fname)); + } } - } - else if (selection_finished && m_current_selection.asr_cache_entry->fext == "character") - { - switch (type) + else if (m_current_selection.asr_cache_entry->fext == "character") { - case LT_Character: // Invoked by Settings UI button - App::sim_player_character->setStr(m_current_selection.asr_cache_entry->fname); - if (m_current_selection.asr_skin_entry) + switch (m_current_selector_type) { - App::sim_player_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + case LT_Character: // Invoked by Settings UI button + App::sim_player_character->setStr(m_current_selection.asr_cache_entry->fname); + if (m_current_selection.asr_skin_entry) + { + App::sim_player_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + } + else + { + App::sim_player_character_skin->setStr(""); + } + break; + + case LT_CharacterMP: // Invoked by MultiplayerSelector UI button + App::mp_override_character->setStr(m_current_selection.asr_cache_entry->fname); + if (m_current_selection.asr_skin_entry) + { + App::mp_override_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + } + else + { + App::mp_override_character_skin->setStr(""); + } + break; + + default:; // uhh, what? } - else + } + else + { + if (App::GetGuiManager()->TopMenubar.ai_select) { - App::sim_player_character_skin->setStr(""); + App::GetGuiManager()->TopMenubar.ai_fname = m_current_selection.asr_cache_entry->fname; + App::GetGuiManager()->TopMenubar.ai_dname = m_current_selection.asr_cache_entry->dname; + App::GetGuiManager()->TopMenubar.ai_select = false; + App::GetGuiManager()->TopMenubar.ai_menu = true; } - break; - - case LT_CharacterMP: // Invoked by MultiplayerSelector UI button - App::mp_override_character->setStr(m_current_selection.asr_cache_entry->fname); - if (m_current_selection.asr_skin_entry) + else if (App::GetGuiManager()->TopMenubar.ai_select2) { - App::mp_override_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + App::GetGuiManager()->TopMenubar.ai_fname2 = m_current_selection.asr_cache_entry->fname; + App::GetGuiManager()->TopMenubar.ai_dname2 = m_current_selection.asr_cache_entry->dname; + App::GetGuiManager()->TopMenubar.ai_select2 = false; + App::GetGuiManager()->TopMenubar.ai_menu = true; } else { - App::mp_override_character_skin->setStr(""); + ActorSpawnRequest* rq = new ActorSpawnRequest; + *rq = m_current_selection; + this->PushMessage(Message(MSG_SIM_SPAWN_ACTOR_REQUESTED, (void*)rq)); } - break; - - default:; // uhh, what? - } - } - else if (selection_finished) - { - if (App::GetGuiManager()->TopMenubar.ai_select) - { - App::GetGuiManager()->TopMenubar.ai_fname = m_current_selection.asr_cache_entry->fname; - App::GetGuiManager()->TopMenubar.ai_dname = m_current_selection.asr_cache_entry->dname; - App::GetGuiManager()->TopMenubar.ai_select = false; - App::GetGuiManager()->TopMenubar.ai_menu = true; - } - else if (App::GetGuiManager()->TopMenubar.ai_select2) - { - App::GetGuiManager()->TopMenubar.ai_fname2 = m_current_selection.asr_cache_entry->fname; - App::GetGuiManager()->TopMenubar.ai_dname2 = m_current_selection.asr_cache_entry->dname; - App::GetGuiManager()->TopMenubar.ai_select2 = false; - App::GetGuiManager()->TopMenubar.ai_menu = true; - } - else - { - ActorSpawnRequest* rq = new ActorSpawnRequest; - *rq = m_current_selection; - this->PushMessage(Message(MSG_SIM_SPAWN_ACTOR_REQUESTED, (void*)rq)); } m_current_selection = ActorSpawnRequest(); // Reset + m_current_selector_type = LT_None; } } diff --git a/source/main/GameContext.h b/source/main/GameContext.h index 8e6521eee2..3c29efa588 100644 --- a/source/main/GameContext.h +++ b/source/main/GameContext.h @@ -195,6 +195,7 @@ class GameContext CacheEntry* m_last_skin_selection = nullptr; Ogre::String m_last_section_config; ActorSpawnRequest m_current_selection; //!< Context of the loader UI (may also be Character!) + LoaderType m_current_selector_type = LT_None; CacheEntry m_dummy_cache_selection; // Characters (simplified physics and netcode) From f3d249346115e4dfe0b5e7b4ba9b02a3a5dec647 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Wed, 7 Jun 2023 12:46:06 +0200 Subject: [PATCH 29/32] Fixed player colors and mod/skin lookup bugs. I changed how player colors are applied - instead of relying on order of elements in .material file, there are names (aliases): ``` // The multiplayer colorization pass - must be named "ColorChange" pass ColorChange { scene_blend alpha_blend // The alpha mask texture unit - name doesn't matter. texture_unit { texture character-alpha.png } // The color texture unit - must be named "PlayerColor" texture_unit "PlayerColor" { colour_op_ex blend_current_alpha src_manual src_current 0 0 0 } } ``` --- .../default_character/character.material | 6 +- source/main/gameplay/Character.cpp | 10 +- source/main/gameplay/Character.h | 9 +- source/main/gameplay/CharacterFactory.cpp | 114 +++++++++--------- source/main/gameplay/CharacterFactory.h | 1 - source/main/gfx/GfxCharacter.cpp | 70 +++++++---- source/main/gfx/GfxCharacter.h | 3 + source/main/resources/CacheSystem.cpp | 22 ++++ source/main/resources/CacheSystem.h | 3 +- 9 files changed, 147 insertions(+), 91 deletions(-) diff --git a/resources/default_character/character.material b/resources/default_character/character.material index f1a65e8464..7599e64e9c 100644 --- a/resources/default_character/character.material +++ b/resources/default_character/character.material @@ -12,14 +12,18 @@ material character: RoR/Managed_Mats/Base texture character.dds } } + + // The multiplayer colorization pass - must be named "ColorChange" pass ColorChange { scene_blend alpha_blend + // The alpha mask texture unit - name doesn't matter. texture_unit { texture character-alpha.png } - texture_unit + // The color texture unit - must be named "PlayerColor" + texture_unit "PlayerColor" { colour_op_ex blend_current_alpha src_manual src_current 0 0 0 } diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index 0e8a1b5bd7..ffe9655f03 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -41,7 +41,7 @@ using namespace Ogre; using namespace RoR; using namespace RoRnet; -Character::Character(CacheEntry* cacheEntry, CacheEntry* skinEntry, CharacterDocumentPtr def, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : +Character::Character(CacheEntry* cacheEntry, CacheEntry* skinEntry, int source, unsigned int streamid, UTFString player_name, int color_number, bool is_remote) : m_actor_coupling(nullptr) , m_character_rotation(0.0f) , m_character_h_speed(2.0f) @@ -52,10 +52,12 @@ Character::Character(CacheEntry* cacheEntry, CacheEntry* skinEntry, CharacterDoc , m_is_remote(is_remote) , m_source_id(source) , m_stream_id(streamid) - , m_character_def(def) , m_cache_entry(cacheEntry) , m_used_skin_entry(skinEntry) { + ROR_ASSERT(cacheEntry && cacheEntry->character_def); + ROR_ASSERT(!skinEntry || skinEntry->skin_def); + static int id_counter = 0; m_instance_name = "Character" + TOSTRING(id_counter); ++id_counter; @@ -611,4 +613,6 @@ BitMask_t Character::SituationFlagFromString(std::string const& str) if (str == "SITUATION_CUSTOM_MODE_10") { return SITUATION_CUSTOM_MODE_10; } return 0; -} \ No newline at end of file +} + +CharacterDocumentPtr Character::getCharacterDocument() { return m_cache_entry->character_def; } \ No newline at end of file diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index d93c8b7200..3c425c2098 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -58,11 +58,11 @@ class Character static const char* SituationFlagToString(BitMask_t single_situation_flag); static BitMask_t SituationFlagFromString(std::string const& single_situation_flag_str); - Character(CacheEntry* cacheEntry, CacheEntry* skinEntry, CharacterDocumentPtr def, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); + Character(CacheEntry* cacheEntry, CacheEntry* skinEntry, int source = -1, unsigned int streamid = 0, Ogre::UTFString playerName = "", int color_number = 0, bool is_remote = true); ~Character(); // get info - CharacterDocumentPtr getCharacterDocument() { return m_character_def; } + CharacterDocumentPtr getCharacterDocument(); // get state Ogre::Vector3 getPosition(); @@ -91,7 +91,6 @@ class Character void SendStreamSetup(); // attributes - CharacterDocumentPtr m_character_def; CacheEntry* m_cache_entry = nullptr; CacheEntry* m_used_skin_entry = nullptr; std::string m_instance_name; @@ -114,8 +113,8 @@ class Character Ogre::UTFString m_net_username; Ogre::Timer m_net_timer; unsigned long m_net_last_update_time; - int m_stream_id; - int m_source_id; + int m_stream_id = 0; + int m_source_id = 0; // 0=local }; /// @} // addtogroup Character diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 80b1dffe90..34bd0b3156 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -35,30 +35,11 @@ CharacterFactory::CharacterFactory() { } -CharacterDocumentPtr CharacterFactory::FetchCharacterDef(CacheEntry* cache_entry) -{ - if (!cache_entry->character_def) - { - try - { - Ogre::DataStreamPtr datastream = Ogre::ResourceGroupManager::getSingleton().openResource(cache_entry->fname, cache_entry->resource_group); - CharacterParser character_parser; - cache_entry->character_def = character_parser.ProcessOgreStream(datastream); - } - catch (Ogre::Exception& eeh) - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("Could not load character, message: {}", eeh.getFullDescription())); - } - } - - return cache_entry->character_def; -} - Character* CharacterFactory::CreateLocalCharacter() { int colourNum = -1; Ogre::UTFString playerName = ""; + // Singleplayer character presets std::string characterFile = App::sim_player_character->getStr(); std::string characterSkinfile = App::sim_player_character_skin->getStr(); @@ -68,6 +49,7 @@ Character* CharacterFactory::CreateLocalCharacter() RoRnet::UserInfo info = App::GetNetwork()->GetLocalUserData(); colourNum = info.colournum; playerName = tryConvertUTF(info.username); + // Multiplayer character presets characterFile = info.character_file; characterSkinfile = info.character_skinfile; } @@ -85,41 +67,47 @@ Character* CharacterFactory::CreateLocalCharacter() cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, App::sim_player_character->getStr()); } - - if (!cache_entry) - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("Could not find character '{}' in mod cache.", App::sim_player_character->getStr())); - return nullptr; - } } - - CacheEntry* skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, characterSkinfile); - - if (skin_entry) + if (cache_entry) { - std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists - if (skin_def == nullptr) + CharacterDocumentPtr document = App::GetCacheSystem()->FetchCharacterDef(cache_entry); // Make sure it exists + if (!document) { - skin_entry = nullptr; // Error already logged + return nullptr; // Error already reported } - // Note the skin def is cached in the CacheEntry so the GfxCharacter can just rely on it. + // The loaded document is now pinned to the CacheEntry } else { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, - fmt::format("Could not find character skin '{}' in mod cache, continuing without it.", characterSkinfile)); + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("Could not find character '{}' in mod cache.", App::sim_player_character->getStr())); + return nullptr; } - App::GetCacheSystem()->LoadResource(*cache_entry); - - CharacterDocumentPtr document = this->FetchCharacterDef(cache_entry); - if (!document) + CacheEntry* skin_entry = nullptr; + if (characterSkinfile != "") { - return nullptr; // Error already reported + skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, characterSkinfile); + + if (skin_entry) + { + std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists + if (skin_def == nullptr) + { + skin_entry = nullptr; // Error already logged + } + // The loaded document is now pinned to the CacheEntry + } + else + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Could not find character skin '{}' in mod cache, continuing without it.", characterSkinfile)); + } } - m_local_character = std::unique_ptr(new Character(cache_entry, skin_entry, document, -1, 0, playerName, colourNum, false)); + + + m_local_character = std::unique_ptr(new Character(cache_entry, skin_entry, -1, 0, playerName, colourNum, false)); App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); return m_local_character.get(); } @@ -139,29 +127,41 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) CacheEntry* cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, info.character_file); if (!cache_entry) { + // If this was a custom mod, retry with the builtin + if (std::string(info.character_file) != DEFAULT_CHARACTER_FILE) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Could not create custom character character for {} - character '{}' not found in mod cache, falling back to '{}'", info_str, info.character_file, DEFAULT_CHARACTER_FILE)); + + cache_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Character, /*partial:*/false, DEFAULT_CHARACTER_FILE); + } + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, fmt::format("Could not create character for {} - character '{}' not found in mod cache.", info_str, info.character_file)); return; } - CacheEntry* skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, info.character_skinfile); - if (skin_entry) + CacheEntry* skin_entry = nullptr; + if (std::string(info.character_skinfile) != "") { - std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists - if (skin_def == nullptr) + skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, info.character_skinfile); + if (skin_entry) { - skin_entry = nullptr; // Error already logged + std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists + if (skin_def == nullptr) + { + skin_entry = nullptr; // Error already logged + } + // Note the skin def is cached in the CacheEntry so the GfxCharacter can just rely on it. + } + else + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Could not skin character for {} - skin '{}' not found in mod cache.", info_str, info.character_skinfile)); } - // Note the skin def is cached in the CacheEntry so the GfxCharacter can just rely on it. - } - else - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, - fmt::format("Could not skin character for {} - skin '{}' not found in mod cache.", info_str, info.character_skinfile)); - return; } - CharacterDocumentPtr document = this->FetchCharacterDef(cache_entry); + CharacterDocumentPtr document = App::GetCacheSystem()->FetchCharacterDef(cache_entry); if (!document) { App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, @@ -169,7 +169,7 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) return; } - Character* ch = new Character(cache_entry, skin_entry, document, sourceid, streamid, name, colour, true); + Character* ch = new Character(cache_entry, skin_entry, sourceid, streamid, name, colour, true); App::GetGfxScene()->RegisterGfxCharacter(ch); m_remote_characters.push_back(std::unique_ptr(ch)); #endif // USE_SOCKETW diff --git a/source/main/gameplay/CharacterFactory.h b/source/main/gameplay/CharacterFactory.h index 70e60e400d..d21af2a6f4 100644 --- a/source/main/gameplay/CharacterFactory.h +++ b/source/main/gameplay/CharacterFactory.h @@ -46,7 +46,6 @@ class CharacterFactory void DeleteAllCharacters(); void UndoRemoteActorCoupling(ActorPtr actor); void Update(float dt); - CharacterDocumentPtr FetchCharacterDef(CacheEntry* cache_entry); #ifdef USE_SOCKETW void handleStreamData(std::vector packet); #endif // USE_SOCKETW diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index 3c5481f964..6ad6fbfd81 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -46,13 +46,17 @@ GfxCharacter::GfxCharacter(Character* character) : xc_character(character) , xc_instance_name(character->m_instance_name) { + ROR_ASSERT(character); + ROR_ASSERT(character->m_cache_entry); + ROR_ASSERT(character->m_cache_entry->character_def); + // Use the modcache bundle (ZIP) resource group. // This is equivalent to what `Actor`s do. xc_custom_resource_group = character->m_cache_entry->resource_group; Entity* entity = App::GetGfxScene()->GetSceneManager()->createEntity( /*entityName:*/ xc_instance_name + "_mesh", - /*meshName:*/ xc_character->m_character_def->mesh_name, + /*meshName:*/ xc_character->m_cache_entry->character_def->mesh_name, /*groupName:*/ character->m_cache_entry->resource_group); // fix disappearing mesh @@ -63,18 +67,17 @@ GfxCharacter::GfxCharacter(Character* character) // add entity to the scene node xc_scenenode = App::GetGfxScene()->GetSceneManager()->getRootSceneNode()->createChildSceneNode(); xc_scenenode->attachObject(entity); - xc_scenenode->setScale(xc_character->m_character_def->mesh_scale); + xc_scenenode->setScale(xc_character->m_cache_entry->character_def->mesh_scale); xc_scenenode->setVisible(false); - // setup colour and resolve skins (SkinZips) - // The mesh (for example Sinbad the Ogre) may use multiple materials - // which means having multiple submeshes in Mesh and subentities in Entity - // (each submesh/subentity can have only 1 material) + // setup material - resolve skins (SkinZips) and apply multiplayer color + // NOTE: The mesh (for example Sinbad the Ogre) may use multiple materials + // which means having multiple submeshes in Mesh and subentities in Entity + // (each submesh/subentity can have only 1 material) for (Ogre::SubEntity* subent: entity->getSubEntities()) { const std::string sharedMatName = subent->getSubMesh()->getMaterialName(); - Ogre::MaterialPtr ownMat = this->FindOrCreateCustomizedMaterial(sharedMatName); - subent->setMaterial(ownMat); + subent->setMaterial(this->FindOrCreateCustomizedMaterial(sharedMatName)); } // setup animation blend @@ -92,8 +95,8 @@ GfxCharacter::GfxCharacter(Character* character) } // setup diagnostic UI - App::GetGuiManager()->CharacterPoseUtil.action_dbg_states.resize(xc_character->m_character_def->actions.size()); - for (CharacterActionDef const& def : xc_character->m_character_def->actions) + App::GetGuiManager()->CharacterPoseUtil.action_dbg_states.resize(xc_character->m_cache_entry->character_def->actions.size()); + for (CharacterActionDef const& def : xc_character->m_cache_entry->character_def->actions) { App::GetGuiManager()->CharacterPoseUtil.action_dbg_states[def.action_id] = CharacterActionDbg(); } @@ -225,18 +228,6 @@ void RoR::GfxCharacter::UpdateCharacterInScene(float dt) #ifdef USE_SOCKETW if (App::mp_state->getEnum() == MpState::CONNECTED && !xc_simbuf.simbuf_actor_coupling) { - // From 'updateCharacterNetworkColor()' - const String materialName = "tracks/" + xc_instance_name; - - MaterialPtr mat = MaterialManager::getSingleton().getByName(materialName); - if (!mat.isNull() && mat->getNumTechniques() > 0 && mat->getTechnique(0)->getNumPasses() > 1 && - mat->getTechnique(0)->getPass(1)->getNumTextureUnitStates() > 1) - { - const auto& state = mat->getTechnique(0)->getPass(1)->getTextureUnitState(1); - Ogre::ColourValue color = App::GetNetwork()->GetPlayerColor(xc_simbuf.simbuf_color_number); - state->setColourOperationEx(LBX_BLEND_CURRENT_ALPHA, LBS_MANUAL, LBS_CURRENT, color); - } - if ((!xc_simbuf.simbuf_is_remote && !App::mp_hide_own_net_label->getBool()) || (xc_simbuf.simbuf_is_remote && !App::mp_hide_net_labels->getBool())) { @@ -347,7 +338,7 @@ void GfxCharacter::UpdateAnimations(float dt) as->setWeight(0); } - for (CharacterActionDef const& def : xc_character->m_character_def->actions) + for (CharacterActionDef const& def : xc_character->m_cache_entry->character_def->actions) { this->EvaluateActionDef(def, dt); } @@ -453,5 +444,38 @@ Ogre::MaterialPtr GfxCharacter::FindOrCreateCustomizedMaterial(const std::string } // techniques } + // Apply player color + if (App::mp_state->getEnum() == MpState::CONNECTED) + { + this->ApplyMultiplayerColoring(ownMat, mat_lookup_name); + } + return ownMat; } + +void GfxCharacter::ApplyMultiplayerColoring(Ogre::MaterialPtr mat, std::string sharedMatName) +{ + if (!mat.isNull() && mat->getNumTechniques() > 0) // sanity check + { + Ogre::Pass* colorChangePass = mat->getTechnique(0)->getPass("ColorChange"); + if (colorChangePass) + { + Ogre::TextureUnitState* playerColorTexUnit = colorChangePass->getTextureUnitState("PlayerColor"); + if (playerColorTexUnit) + { + playerColorTexUnit->setColourOperationEx(LBX_BLEND_CURRENT_ALPHA, LBS_MANUAL, LBS_CURRENT, + App::GetNetwork()->GetPlayerColor(xc_character->m_color_number)); + } + else + { + std::string msg = fmt::format("Character '{}' material '{}', pass 'ColorChange' doesn't have texture unit named 'PlayerColor', cannot apply player color", xc_character->m_instance_name, sharedMatName); + LOG(msg); + } + } + else + { + std::string msg = fmt::format("Character '{}' material '{}' doesn't have pass named 'ColorChange', cannot apply player color", xc_character->m_instance_name, sharedMatName); + LOG(msg); + } + } +} diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index 2136f9bb39..60b6ee7412 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -52,6 +52,9 @@ struct GfxCharacter // Derived from `ActorSpawner::FindOrCreateCustomizedMaterial()` Ogre::MaterialPtr FindOrCreateCustomizedMaterial(const std::string& mat_lookup_name); + // Spawn helper + void ApplyMultiplayerColoring(Ogre::MaterialPtr mat, std::string sharedMatName); + Ogre::SceneNode* xc_scenenode; CharacterSB xc_simbuf; CharacterSB xc_simbuf_prev; diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index c5dd6ceae1..6cd9ed2240 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -1297,6 +1297,28 @@ std::shared_ptr CacheSystem::FetchSkinDef(CacheEntry* cache_entry) } } +CharacterDocumentPtr CacheSystem::FetchCharacterDef(CacheEntry* cache_entry) +{ + if (!cache_entry->character_def) + { + try + { + App::GetCacheSystem()->LoadResource(*cache_entry); // Load if not already + + Ogre::DataStreamPtr datastream = Ogre::ResourceGroupManager::getSingleton().openResource(cache_entry->fname, cache_entry->resource_group); + CharacterParser character_parser; + cache_entry->character_def = character_parser.ProcessOgreStream(datastream); + } + catch (Ogre::Exception& eeh) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("Could not load character, message: {}", eeh.getFullDescription())); + } + } + + return cache_entry->character_def; +} + size_t CacheSystem::Query(CacheQuery& query) { Ogre::StringUtil::toLowerCase(query.cqy_search_string); diff --git a/source/main/resources/CacheSystem.h b/source/main/resources/CacheSystem.h index 97164ef050..2c9b70b575 100644 --- a/source/main/resources/CacheSystem.h +++ b/source/main/resources/CacheSystem.h @@ -185,7 +185,7 @@ enum class CacheValidity /// MOTIVATION: /// RoR users usually have A LOT of content installed. Traversing it all on every game startup would be a pain. /// HOW IT WORKS: -/// For each recognized resource type (vehicle, terrain, skin...) an instance of 'CacheEntry' is created. +/// For each recognized resource type (vehicle, terrain, character, skin...) an instance of 'CacheEntry' is created. /// These entries are persisted in file CACHE_FILE (see above) /// Associated media live in a "resource bundle" (ZIP archive or subdirectory) in content directory (ROR_HOME/mods) and subdirectories. /// If multiple CacheEntries share a bundle, the bundle is loaded only once. Each bundle has dedicated OGRE resource group. @@ -212,6 +212,7 @@ class CacheSystem const CategoryIdNameMap &GetCategories() const { return m_categories; } std::shared_ptr FetchSkinDef(CacheEntry* cache_entry); //!< Loads+parses the .skin file once + CharacterDocumentPtr FetchCharacterDef(CacheEntry* cache_entry); //!< Loads+parses the .character file once CacheEntry *GetEntry(int modid); Ogre::String GetPrettyName(Ogre::String fname); From 791c28842d11c0776a0e28504cfa5ee3a97e1e6a Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Tue, 20 Jun 2023 20:27:28 +0200 Subject: [PATCH 30/32] Fixed mixup in character skin names vs. filenames. One .skin file can define multiple skins, so skins must be described by full name, not filename. The fix applies to both cvars (local configuration) and RoRnet. Codechanges: - CacheSystem.h: added search method NAME_FULL and helper func `MatchExact()` - CacheSystem.cpp: more comments in `Query()` - RORnet: renamed skin field + constant to clarify filename vs. name. - Network.cpp - just reflect the renaming in rornet - CharacterFactory: added helper `fetchCharacterSkin()` using the correct lookup for both local+remote characters. - GameContext.cpp - `OnLoaderGuiApply()` - fixed configuration cvars to contain skin names instead of filenames --- source/main/GameContext.cpp | 4 +- source/main/gameplay/CharacterFactory.cpp | 78 ++++++++++------------- source/main/gameplay/CharacterFactory.h | 2 + source/main/network/Network.cpp | 4 +- source/main/network/RoRnet.h | 7 +- source/main/resources/CacheSystem.cpp | 19 +++++- source/main/resources/CacheSystem.h | 12 ++-- 7 files changed, 68 insertions(+), 58 deletions(-) diff --git a/source/main/GameContext.cpp b/source/main/GameContext.cpp index 943da86e7c..3cc45fbab7 100644 --- a/source/main/GameContext.cpp +++ b/source/main/GameContext.cpp @@ -765,7 +765,7 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri App::sim_player_character->setStr(m_current_selection.asr_cache_entry->fname); if (m_current_selection.asr_skin_entry) { - App::sim_player_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + App::sim_player_character_skin->setStr(m_current_selection.asr_skin_entry->dname); } else { @@ -777,7 +777,7 @@ void GameContext::OnLoaderGuiApply(LoaderType type, CacheEntry* entry, std::stri App::mp_override_character->setStr(m_current_selection.asr_cache_entry->fname); if (m_current_selection.asr_skin_entry) { - App::mp_override_character_skin->setStr(m_current_selection.asr_skin_entry->fname); + App::mp_override_character_skin->setStr(m_current_selection.asr_skin_entry->dname); } else { diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 34bd0b3156..0c6560d2d6 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -41,7 +41,7 @@ Character* CharacterFactory::CreateLocalCharacter() Ogre::UTFString playerName = ""; // Singleplayer character presets std::string characterFile = App::sim_player_character->getStr(); - std::string characterSkinfile = App::sim_player_character_skin->getStr(); + std::string characterSkin = App::sim_player_character_skin->getStr(); #ifdef USE_SOCKETW if (App::mp_state->getEnum() == MpState::CONNECTED) @@ -51,7 +51,7 @@ Character* CharacterFactory::CreateLocalCharacter() playerName = tryConvertUTF(info.username); // Multiplayer character presets characterFile = info.character_file; - characterSkinfile = info.character_skinfile; + characterSkin = info.character_skin; } #endif // USE_SOCKETW @@ -84,29 +84,7 @@ Character* CharacterFactory::CreateLocalCharacter() return nullptr; } - CacheEntry* skin_entry = nullptr; - if (characterSkinfile != "") - { - skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, characterSkinfile); - - if (skin_entry) - { - std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists - if (skin_def == nullptr) - { - skin_entry = nullptr; // Error already logged - } - // The loaded document is now pinned to the CacheEntry - } - else - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, - fmt::format("Could not find character skin '{}' in mod cache, continuing without it.", characterSkinfile)); - } - } - - - + CacheEntry* skin_entry = this->fetchCharacterSkin(characterSkin, _L("local player")); m_local_character = std::unique_ptr(new Character(cache_entry, skin_entry, -1, 0, playerName, colourNum, false)); App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); return m_local_character.get(); @@ -141,26 +119,6 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) return; } - CacheEntry* skin_entry = nullptr; - if (std::string(info.character_skinfile) != "") - { - skin_entry = App::GetCacheSystem()->FindEntryByFilename(LT_Skin, /*partial:*/false, info.character_skinfile); - if (skin_entry) - { - std::shared_ptr skin_def = App::GetCacheSystem()->FetchSkinDef(skin_entry); // Make sure it exists - if (skin_def == nullptr) - { - skin_entry = nullptr; // Error already logged - } - // Note the skin def is cached in the CacheEntry so the GfxCharacter can just rely on it. - } - else - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, - fmt::format("Could not skin character for {} - skin '{}' not found in mod cache.", info_str, info.character_skinfile)); - } - } - CharacterDocumentPtr document = App::GetCacheSystem()->FetchCharacterDef(cache_entry); if (!document) { @@ -169,6 +127,7 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) return; } + CacheEntry* skin_entry = this->fetchCharacterSkin(info.character_skin, info_str); Character* ch = new Character(cache_entry, skin_entry, sourceid, streamid, name, colour, true); App::GetGfxScene()->RegisterGfxCharacter(ch); m_remote_characters.push_back(std::unique_ptr(ch)); @@ -246,3 +205,32 @@ void CharacterFactory::handleStreamData(std::vector packet_b } } #endif // USE_SOCKETW + +CacheEntry* CharacterFactory::fetchCharacterSkin(const std::string& skinName, const std::string& errLogPlayer) +{ + if (skinName == "") + return nullptr; + + CacheQuery skinQuery; + skinQuery.cqy_filter_type = LT_Skin; + skinQuery.cqy_search_method = CacheSearchMethod::NAME_FULL; + skinQuery.cqy_search_string = skinName; + if (App::GetCacheSystem()->Query(skinQuery) == 0) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Skin '{}' requested by player player '{}' is not installed, continuing without it.", + skinName, errLogPlayer)); + return nullptr; + } + + if (!App::GetCacheSystem()->FetchSkinDef(skinQuery.cqy_results[0].cqr_entry)) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_WARNING, + fmt::format("Could not load character skin '{}' for player '{}', continuing without it.", + skinName, errLogPlayer)); + return nullptr; + } + + // The loaded skin is pinned to the CacheEntry now. + return skinQuery.cqy_results[0].cqr_entry; +} diff --git a/source/main/gameplay/CharacterFactory.h b/source/main/gameplay/CharacterFactory.h index d21af2a6f4..88004fb872 100644 --- a/source/main/gameplay/CharacterFactory.h +++ b/source/main/gameplay/CharacterFactory.h @@ -57,6 +57,8 @@ class CharacterFactory void createRemoteInstance(int sourceid, int streamid); void removeStreamSource(int sourceid); + + CacheEntry* fetchCharacterSkin(const std::string& skinName, const std::string& errLogPlayer); }; /// @} // addtogroup Character diff --git a/source/main/network/Network.cpp b/source/main/network/Network.cpp index 22dd948bc3..9f7dde7fb2 100644 --- a/source/main/network/Network.cpp +++ b/source/main/network/Network.cpp @@ -505,12 +505,12 @@ bool Network::ConnectThread() if (App::mp_override_character->getStr() != "") { strncpy(c.character_file, App::mp_override_character->getStr().c_str(), RORNET_MAX_CHARACTER_FILE_LEN - 1); - strncpy(c.character_skinfile, App::mp_override_character_skin->getStr().c_str(), RORNET_MAX_CHARACTER_SKINFILE_LEN - 1); + strncpy(c.character_skin, App::mp_override_character_skin->getStr().c_str(), RORNET_MAX_CHARACTER_SKIN_LEN - 1); } else { strncpy(c.character_file, App::sim_player_character->getStr().c_str(), RORNET_MAX_CHARACTER_FILE_LEN - 1); - strncpy(c.character_skinfile, App::sim_player_character_skin->getStr().c_str(), RORNET_MAX_CHARACTER_SKINFILE_LEN - 1); + strncpy(c.character_skin, App::sim_player_character_skin->getStr().c_str(), RORNET_MAX_CHARACTER_SKIN_LEN - 1); } if (!SendNetMessage(MSG2_USER_INFO, 0, sizeof(RoRnet::UserInfo), (char*)&c)) diff --git a/source/main/network/RoRnet.h b/source/main/network/RoRnet.h index a404aee7ab..b4cbcebded 100644 --- a/source/main/network/RoRnet.h +++ b/source/main/network/RoRnet.h @@ -31,8 +31,9 @@ namespace RoRnet { #define RORNET_MAX_MESSAGE_LENGTH 8192 //!< maximum size of a RoR message. 8192 bytes = 8 kibibytes #define RORNET_LAN_BROADCAST_PORT 13000 //!< port used to send the broadcast announcement in LAN mode #define RORNET_MAX_USERNAME_LEN 40 -#define RORNET_MAX_CHARACTER_FILE_LEN 40 -#define RORNET_MAX_CHARACTER_SKINFILE_LEN 40 +#define RORNET_MAX_CHARACTER_FILE_LEN 60 +#define RORNET_MAX_CHARACTER_SKIN_LEN 60 + #define RORNET_VERSION "RoRnet_2.44" @@ -235,7 +236,7 @@ struct UserInfo char clientGUID[40]; //!< the clients GUID char sessiontype[10]; //!< the requested session type. For example "normal", "bot", "rcon" char character_file[RORNET_MAX_CHARACTER_FILE_LEN]; //!< Filename of the chosen character - char character_skinfile[RORNET_MAX_CHARACTER_SKINFILE_LEN]; //!< Skin filename of the chosen character + char character_skin[RORNET_MAX_CHARACTER_SKIN_LEN]; //!< Skin name for the chosen character }; struct VehicleState //!< Formerly `oob_t` diff --git a/source/main/resources/CacheSystem.cpp b/source/main/resources/CacheSystem.cpp index 6cd9ed2240..1e626906b8 100644 --- a/source/main/resources/CacheSystem.cpp +++ b/source/main/resources/CacheSystem.cpp @@ -1381,6 +1381,7 @@ size_t CacheSystem::Query(CacheQuery& query) Str<100> wheels_str; switch (query.cqy_search_method) { + // Partial case-insensitive match in: name, filename, description, author name/email case CacheSearchMethod::FULLTEXT: if (match = this->Match(score, entry.dname, query.cqy_search_string, 0)) { break; } if (match = this->Match(score, entry.fname, query.cqy_search_string, 100)) { break; } @@ -1392,10 +1393,12 @@ size_t CacheSystem::Query(CacheQuery& query) } break; + // Partial case-insensitive match of GUID (intentionally - for search box) case CacheSearchMethod::GUID: match = this->Match(score, entry.guid, query.cqy_search_string, 0); break; + // Partial case-insensitive match of author name/email case CacheSearchMethod::AUTHORS: for (AuthorInfo const& author: entry.authors) { @@ -1404,16 +1407,24 @@ size_t CacheSystem::Query(CacheQuery& query) } break; + // Search by wheel configuration, for example '4x4' case CacheSearchMethod::WHEELS: wheels_str << entry.wheelcount << "x" << entry.propwheelcount; match = this->Match(score, wheels_str.ToCStr(), query.cqy_search_string, 0); break; + // Partial, case-insensitive match in file name case CacheSearchMethod::FILENAME: match = this->Match(score, entry.fname, query.cqy_search_string, 100); break; - default: // CacheSearchMethod::NONE + // Full case-insensitive match in mod name (useful for skins - one .skin file can define multiple skins) + case CacheSearchMethod::NAME_FULL: + match = this->MatchExact(entry.dname, query.cqy_search_string); + break; + + // CacheSearchMethod::NONE -> Show everything + default: match = true; break; }; @@ -1444,6 +1455,12 @@ bool CacheSystem::Match(size_t& out_score, std::string data, std::string const& } } +bool CacheSystem::MatchExact(std::string data, std::string const& query) +{ + Ogre::StringUtil::toLowerCase(data); + return data == query; +} + bool CacheQueryResult::operator<(CacheQueryResult const& other) const { if (cqr_score == other.cqr_score) diff --git a/source/main/resources/CacheSystem.h b/source/main/resources/CacheSystem.h index 2c9b70b575..19e398012e 100644 --- a/source/main/resources/CacheSystem.h +++ b/source/main/resources/CacheSystem.h @@ -152,19 +152,20 @@ struct CacheQueryResult enum class CacheSearchMethod // Always case-insensitive { - NONE, //!< No searching + NONE, //!< Show everything FULLTEXT, //!< Partial match in: name, filename, description, author name/mail - GUID, //!< Partial match in: guid + GUID, //!< Partial match in: guid (intentionally - for search box) AUTHORS, //!< Partial match in: author name/email WHEELS, //!< Wheel configuration, i.e. 4x4 - FILENAME //!< Partial match in file name + FILENAME, //!< Partial match in file name + NAME_FULL //!< Full match of name (case-insensitive) }; struct CacheQuery { RoR::LoaderType cqy_filter_type = RoR::LoaderType::LT_None; int cqy_filter_category_id = CacheCategoryId::CID_All; - std::string cqy_filter_guid; //!< Exact match; leave empty to disable + std::string cqy_filter_guid; //!< Exact match; leave empty to disable; not the same as CacheSearchMethod::GUID CacheSearchMethod cqy_search_method = CacheSearchMethod::NONE; std::string cqy_search_string; @@ -249,7 +250,8 @@ class CacheSystem void GenerateFileCache(CacheEntry &entry, Ogre::String group); void RemoveFileCache(CacheEntry &entry); - bool Match(size_t& out_score, std::string data, std::string const& query, size_t ); + bool Match(size_t& out_score, std::string data, std::string const& query, size_t); + bool MatchExact(std::string data, const std::string& query); std::time_t m_update_time; //!< Ensures that all inserted files share the same timestamp std::string m_filenames_hash_loaded; //!< hash from cachefile, for quick update detection From b36a4a34d45b7e7512b671f33877036b40eb5ba2 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 25 Jun 2023 16:30:30 +0200 Subject: [PATCH 31/32] Fixed MP crashes related to new character system Problem 1: the arrays in GfxScene weren't updated correctly: std::vector m_all_gfx_actors; std::vector m_live_gfx_actors; std::vector m_all_gfx_characters; I was the person who introduced the arrays a long time ago (before message queue was estabilished) and they didn't exactly help, so now I dropped them again and I use the global arrays directly: App::GetGameContext()->GetActorManager()->GetActors() App::GetGameContext()->GetCharacterFactory()->getAllCharacters() Problem2: The debug states array in GUI_CharacterPoseUtil was interfering between actors. I fixed it by moving the array into GfxCharacter itself, and I updated the GUI to only manipulate player character. Minor change: dropped the 'initialized' state tracking from GfxActor: bool m_initialized = false; bool IsActorInitialized() const { return m_initialized; } //!< Temporary TODO: Remove once the spawn routine is fixed void InitializeActor() { m_initialized = true; } //!< Temporary TODO: Remove once the spawn routine is fixed If there any visual glitches caused by this, they can be fixed later, especially since I noticed some existing singleplayer glitches to fix. --- source/main/GameContext.cpp | 4 +- source/main/gameplay/Character.cpp | 1 + source/main/gameplay/Character.h | 9 +- source/main/gameplay/CharacterFactory.cpp | 56 +++++++---- source/main/gameplay/CharacterFactory.h | 14 ++- source/main/gfx/GfxActor.cpp | 10 +- source/main/gfx/GfxActor.h | 3 - source/main/gfx/GfxCharacter.cpp | 10 +- source/main/gfx/GfxCharacter.h | 27 ++++++ source/main/gfx/GfxScene.cpp | 94 +++++++------------ source/main/gfx/GfxScene.h | 9 -- .../main/gui/panels/GUI_CharacterPoseUtil.cpp | 87 +++++++++++------ .../main/gui/panels/GUI_CharacterPoseUtil.h | 29 +----- source/main/gui/panels/GUI_SurveyMap.cpp | 11 ++- source/main/main.cpp | 2 - source/main/physics/ActorManager.cpp | 2 - 16 files changed, 198 insertions(+), 170 deletions(-) diff --git a/source/main/GameContext.cpp b/source/main/GameContext.cpp index 3cc45fbab7..ad2263975c 100644 --- a/source/main/GameContext.cpp +++ b/source/main/GameContext.cpp @@ -404,8 +404,6 @@ void GameContext::DeleteActor(ActorPtr actor) } } - App::GetGfxScene()->RemoveGfxActor(actor->GetGfxActor()); - #ifdef USE_SOCKETW if (App::mp_state->getEnum() == MpState::CONNECTED) { @@ -884,7 +882,7 @@ bool GameContext::CreatePlayerCharacter() Character* GameContext::GetPlayerCharacter() // Convenience ~ counterpart of `GetPlayerActor()` { - return m_character_factory.GetLocalCharacter(); + return m_character_factory.getLocalCharacter(); } // -------------------------------- diff --git a/source/main/gameplay/Character.cpp b/source/main/gameplay/Character.cpp index ffe9655f03..fa761ca7ea 100644 --- a/source/main/gameplay/Character.cpp +++ b/source/main/gameplay/Character.cpp @@ -28,6 +28,7 @@ #include "Collisions.h" #include "Console.h" #include "GameContext.h" +#include "GfxCharacter.h" #include "GfxScene.h" #include "InputEngine.h" #include "MovableText.h" diff --git a/source/main/gameplay/Character.h b/source/main/gameplay/Character.h index 3c425c2098..c0c78c7b27 100644 --- a/source/main/gameplay/Character.h +++ b/source/main/gameplay/Character.h @@ -47,11 +47,10 @@ namespace RoR { class Character { friend struct GfxCharacter; // visual counterpart. + friend class CharacterFactory; public: - - static const char* ControlFlagToString(BitMask_t single_flag); static BitMask_t ControlFlagFromString(std::string const& single_flag_str); @@ -85,6 +84,9 @@ class Character void setColour(int color) { this->m_color_number = color; } Ogre::UTFString const& GetNetUsername() { return m_net_username; } + // get visuals + GfxCharacter* getGfxCharacter() { return m_gfx_character.get(); } + private: void ReportError(const char* detail); @@ -115,6 +117,9 @@ class Character unsigned long m_net_last_update_time; int m_stream_id = 0; int m_source_id = 0; // 0=local + + // visuals + std::unique_ptr m_gfx_character; }; /// @} // addtogroup Character diff --git a/source/main/gameplay/CharacterFactory.cpp b/source/main/gameplay/CharacterFactory.cpp index 0c6560d2d6..f97f8a0b9e 100644 --- a/source/main/gameplay/CharacterFactory.cpp +++ b/source/main/gameplay/CharacterFactory.cpp @@ -26,6 +26,7 @@ #include "CacheSystem.h" #include "Character.h" #include "Console.h" +#include "GfxCharacter.h" #include "GfxScene.h" #include "Utils.h" @@ -85,9 +86,22 @@ Character* CharacterFactory::CreateLocalCharacter() } CacheEntry* skin_entry = this->fetchCharacterSkin(characterSkin, _L("local player")); - m_local_character = std::unique_ptr(new Character(cache_entry, skin_entry, -1, 0, playerName, colourNum, false)); - App::GetGfxScene()->RegisterGfxCharacter(m_local_character.get()); - return m_local_character.get(); + Character* ch = new Character(cache_entry, skin_entry, -1, 0, playerName, colourNum, false); + ROR_ASSERT(m_characters.size() == 0); + m_characters.push_back(std::unique_ptr(ch)); + + // GFX setup + try + { + ch->m_gfx_character = std::unique_ptr(new GfxCharacter(ch)); + } + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error creating GfxCharacter, message:{}", eeh.getFullDescription())); + } + + // Done + return ch; } void CharacterFactory::createRemoteInstance(int sourceid, int streamid) @@ -129,19 +143,28 @@ void CharacterFactory::createRemoteInstance(int sourceid, int streamid) CacheEntry* skin_entry = this->fetchCharacterSkin(info.character_skin, info_str); Character* ch = new Character(cache_entry, skin_entry, sourceid, streamid, name, colour, true); - App::GetGfxScene()->RegisterGfxCharacter(ch); - m_remote_characters.push_back(std::unique_ptr(ch)); + m_characters.push_back(std::unique_ptr(ch)); + + // GFX setup + try + { + ch->m_gfx_character = std::unique_ptr(new GfxCharacter(ch)); + } + catch (Ogre::Exception& eeh) { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + fmt::format("error creating GfxCharacter, message:{}", eeh.getFullDescription())); + } #endif // USE_SOCKETW } void CharacterFactory::removeStreamSource(int sourceid) { - for (auto it = m_remote_characters.begin(); it != m_remote_characters.end(); it++) + for (auto it = m_characters.begin(); it != m_characters.end(); it++) { if ((*it)->getSourceID() == sourceid) { (*it).reset(); - m_remote_characters.erase(it); + m_characters.erase(it); return; } } @@ -149,12 +172,13 @@ void CharacterFactory::removeStreamSource(int sourceid) void CharacterFactory::Update(float dt) { - m_local_character->updateLocal(dt); + // character at [0] is local + m_characters[0]->updateLocal(dt); #ifdef USE_SOCKETW - if ((App::mp_state->getEnum() == MpState::CONNECTED) && !m_local_character->isRemote()) + if ((App::mp_state->getEnum() == MpState::CONNECTED)) { - m_local_character->SendStreamData(); + m_characters[0]->SendStreamData(); } #endif // USE_SOCKETW @@ -163,9 +187,9 @@ void CharacterFactory::Update(float dt) void CharacterFactory::UndoRemoteActorCoupling(ActorPtr actor) { - for (auto& c : m_remote_characters) + for (auto& c : m_characters) { - if (c->GetActorCoupling() == actor) + if (c->isRemote() && c->GetActorCoupling() == actor) { c->SetActorCoupling(false, nullptr); } @@ -174,8 +198,7 @@ void CharacterFactory::UndoRemoteActorCoupling(ActorPtr actor) void CharacterFactory::DeleteAllCharacters() { - m_remote_characters.clear(); // std::unique_ptr<> will do the cleanup... - m_local_character.reset(); // ditto + m_characters.clear(); // std::unique_ptr<> will do the cleanup... } #ifdef USE_SOCKETW @@ -197,9 +220,10 @@ void CharacterFactory::handleStreamData(std::vector packet_b } else { - for (auto& c : m_remote_characters) + for (auto& c : m_characters) { - c->receiveStreamData(packet.header.command, packet.header.source, packet.header.streamid, packet.buffer); + if (c->isRemote()) + c->receiveStreamData(packet.header.command, packet.header.source, packet.header.streamid, packet.buffer); } } } diff --git a/source/main/gameplay/CharacterFactory.h b/source/main/gameplay/CharacterFactory.h index 88004fb872..82c922baa1 100644 --- a/source/main/gameplay/CharacterFactory.h +++ b/source/main/gameplay/CharacterFactory.h @@ -42,18 +42,24 @@ class CharacterFactory public: CharacterFactory(); Character* CreateLocalCharacter(); - Character* GetLocalCharacter() { return m_local_character.get(); } + void DeleteAllCharacters(); - void UndoRemoteActorCoupling(ActorPtr actor); + void Update(float dt); + + // get + std::vector>& getAllCharacters() { return m_characters; } + Character* getLocalCharacter() { return (m_characters.size() > 0) ? m_characters[0].get() : nullptr; } + + // net #ifdef USE_SOCKETW void handleStreamData(std::vector packet); #endif // USE_SOCKETW + void UndoRemoteActorCoupling(ActorPtr actor); private: - std::unique_ptr m_local_character; - std::vector> m_remote_characters; + std::vector> m_characters; // local character is at [0] void createRemoteInstance(int sourceid, int streamid); void removeStreamSource(int sourceid); diff --git a/source/main/gfx/GfxActor.cpp b/source/main/gfx/GfxActor.cpp index ffd272ae71..100ef26529 100644 --- a/source/main/gfx/GfxActor.cpp +++ b/source/main/gfx/GfxActor.cpp @@ -1804,7 +1804,15 @@ void RoR::GfxActor::UpdateSimDataBuffer() bool RoR::GfxActor::IsActorLive() const { - return (m_actor->ar_state < ActorState::LOCAL_SLEEPING); + switch (m_actor->ar_state) + { + case ActorState::LOCAL_SIMULATED: //!< simulated (local) actor + case ActorState::NETWORKED_OK: //!< not simulated (remote) actor + case ActorState::LOCAL_REPLAY: + return true; + default: + return false; + } } void RoR::GfxActor::UpdateCabMesh() diff --git a/source/main/gfx/GfxActor.h b/source/main/gfx/GfxActor.h index 2083a9240e..7431ebd97f 100644 --- a/source/main/gfx/GfxActor.h +++ b/source/main/gfx/GfxActor.h @@ -127,8 +127,6 @@ class GfxActor // Helpers bool IsActorLive() const; //!< Should the visuals be updated for this actor? - bool IsActorInitialized() const { return m_initialized; } //!< Temporary TODO: Remove once the spawn routine is fixed - void InitializeActor() { m_initialized = true; } //!< Temporary TODO: Remove once the spawn routine is fixed void CalculateDriverPos(Ogre::Vector3& out_pos, Ogre::Quaternion& out_rot); int GetActorId() const; int GetActorState() const; @@ -163,7 +161,6 @@ class GfxActor // Game state std::set m_linked_gfx_actors; - bool m_initialized = false; VideoCamState m_vidcam_state = VideoCamState::VCSTATE_ENABLED_ONLINE; DebugViewType m_debug_view = DebugViewType::DEBUGVIEW_NONE; DebugViewType m_last_debug_view = DebugViewType::DEBUGVIEW_SKELETON; // intentional diff --git a/source/main/gfx/GfxCharacter.cpp b/source/main/gfx/GfxCharacter.cpp index 6ad6fbfd81..8ff4ef449f 100644 --- a/source/main/gfx/GfxCharacter.cpp +++ b/source/main/gfx/GfxCharacter.cpp @@ -95,10 +95,10 @@ GfxCharacter::GfxCharacter(Character* character) } // setup diagnostic UI - App::GetGuiManager()->CharacterPoseUtil.action_dbg_states.resize(xc_character->m_cache_entry->character_def->actions.size()); + xc_action_dbg_states.resize(xc_character->m_cache_entry->character_def->actions.size()); for (CharacterActionDef const& def : xc_character->m_cache_entry->character_def->actions) { - App::GetGuiManager()->CharacterPoseUtil.action_dbg_states[def.action_id] = CharacterActionDbg(); + xc_action_dbg_states[def.action_id] = CharacterActionDbg(); } } @@ -212,7 +212,7 @@ void RoR::GfxCharacter::UpdateCharacterInScene(float dt) xc_scenenode->setVisible(true); } - if (!App::GetGuiManager()->CharacterPoseUtil.IsManualPoseActive()) + if (!xc_manual_pose_active) { try { @@ -255,7 +255,7 @@ void GfxCharacter::EvaluateActionDef(CharacterActionDef const& def, float dt) dbg.blocking_controls = xc_simbuf.simbuf_control_flags & def.except_controls; dbg.missing_situations = def.for_situations & ~xc_simbuf.simbuf_situation_flags; dbg.missing_controls = def.for_controls & ~xc_simbuf.simbuf_control_flags; - App::GetGuiManager()->CharacterPoseUtil.action_dbg_states[def.action_id] = dbg; + xc_action_dbg_states[def.action_id] = dbg; return; } @@ -323,7 +323,7 @@ void GfxCharacter::EvaluateActionDef(CharacterActionDef const& def, float dt) as->setEnabled(true); dbg.active = true; - App::GetGuiManager()->CharacterPoseUtil.action_dbg_states[def.action_id] = dbg; + xc_action_dbg_states[def.action_id] = dbg; } void GfxCharacter::UpdateAnimations(float dt) diff --git a/source/main/gfx/GfxCharacter.h b/source/main/gfx/GfxCharacter.h index 60b6ee7412..eef09d4a73 100644 --- a/source/main/gfx/GfxCharacter.h +++ b/source/main/gfx/GfxCharacter.h @@ -33,6 +33,28 @@ namespace RoR { /// @addtogroup Gfx /// @{ +/// See `GUI::CharacterPoseUtil` +struct CharacterActionDbg +{ + bool active = false; + + // State diagnostic. + BitMask_t missing_situations = 0; //!< `RoRnet::SituationFlags`; The flags from 'for_situations' mask which are not satisfied. + BitMask_t missing_controls = 0; //!< `RoRnet::ControlFlags`; The flags from 'for_controls' mask which are not satisfied. + BitMask_t blocking_situations = 0; //!< `RoRnet::SituationFlags`; The flags from 'except_situations' mask which block this anim. + BitMask_t blocking_controls = 0; //!< `RoRnet::ControlFlags`; The flags from 'except_controls' mask which block this anim. + + // The raw source data of anim position. + float source_dt = 0.f; + float source_hspeed = 0.f; + float source_steering = 0.f; + + // The transformed inputs to anim position. + float input_dt = 0.f; + float input_hspeed = 0.f; + float input_steering = 0.f; +}; + /// A visual counterpart to `RoR::Character`. /// 3D objects are loaded and updated here, but positioning and animations are determined in simulation! struct GfxCharacter @@ -61,6 +83,11 @@ struct GfxCharacter Character* xc_character; std::string xc_instance_name; std::string xc_custom_resource_group; + + // `GUI::CharacterPoseUtil` context + std::vector xc_action_dbg_states; + bool xc_manual_pose_active = false; + }; /// @} // addtogroup Gfx diff --git a/source/main/gfx/GfxScene.cpp b/source/main/gfx/GfxScene.cpp index 4ccdaa36e5..7f19af6ce4 100644 --- a/source/main/gfx/GfxScene.cpp +++ b/source/main/gfx/GfxScene.cpp @@ -68,10 +68,6 @@ void GfxScene::ClearScene() } m_dustpools.clear(); - // Delete game elements - m_all_gfx_actors.clear(); - m_all_gfx_characters.clear(); - // Wipe scene manager m_scene_manager->clearScene(); @@ -91,10 +87,13 @@ void GfxScene::Init() void GfxScene::UpdateScene(float dt_sec) { // Actors - start threaded tasks - for (GfxActor* gfx_actor: m_live_gfx_actors) + for (const ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors()) { - gfx_actor->UpdateFlexbodies(); // Push flexbody tasks to threadpool - gfx_actor->UpdateWheelVisuals(); // Push flexwheel tasks to threadpool + if (actor->GetGfxActor()->IsActorLive()) + { + actor->GetGfxActor()->UpdateFlexbodies(); // Push flexbody tasks to threadpool + actor->GetGfxActor()->UpdateWheelVisuals(); // Push flexwheel tasks to threadpool + } } // Var @@ -115,11 +114,11 @@ void GfxScene::UpdateScene(float dt_sec) // Particles if (App::gfx_particles_mode->getInt() == 1) { - for (GfxActor* gfx_actor: m_all_gfx_actors) + for (const ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors()) { - if (!m_simbuf.simbuf_sim_paused && !gfx_actor->GetSimDataBuffer().simbuf_physics_paused) + if (!m_simbuf.simbuf_sim_paused && !actor->GetGfxActor()->GetSimDataBuffer().simbuf_physics_paused) { - gfx_actor->UpdateParticles(m_simbuf.simbuf_sim_speed * dt_sec); + actor->GetGfxActor()->UpdateParticles(m_simbuf.simbuf_sim_speed * dt_sec); } } for (auto itor : m_dustpools) @@ -196,20 +195,21 @@ void GfxScene::UpdateScene(float dt_sec) } // HUD - network labels (always update) - for (GfxActor* gfx_actor: m_all_gfx_actors) + for (const ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors()) { - gfx_actor->UpdateNetLabels(m_simbuf.simbuf_sim_speed * dt_sec); + actor->GetGfxActor()->UpdateNetLabels(m_simbuf.simbuf_sim_speed * dt_sec); } // Player avatars - for (GfxCharacter* a: m_all_gfx_characters) + for (const std::unique_ptr& character: App::GetGameContext()->GetCharacterFactory()->getAllCharacters()) { - a->UpdateCharacterInScene(dt_sec); + character->getGfxCharacter()->UpdateCharacterInScene(dt_sec); } // Actors - update misc visuals - for (GfxActor* gfx_actor: m_all_gfx_actors) + for (const ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors()) { + GfxActor* gfx_actor = actor->GetGfxActor(); if (gfx_actor->IsActorLive()) { gfx_actor->UpdateRods(); @@ -246,10 +246,13 @@ void GfxScene::UpdateScene(float dt_sec) App::GetGameContext()->GetSceneMouse().UpdateVisuals(); // Actors - finalize threaded tasks - for (GfxActor* gfx_actor: m_live_gfx_actors) + for (const ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors()) { - gfx_actor->FinishWheelUpdates(); - gfx_actor->FinishFlexbodyTasks(); + if (actor->GetGfxActor()->IsActorLive()) + { + actor->GetGfxActor()->FinishFlexbodyTasks(); // Wait for threaded tasks to finish + actor->GetGfxActor()->FinishWheelUpdates(); // Wait for threaded tasks to finish + } } } @@ -274,13 +277,12 @@ DustPool* GfxScene::GetDustPool(const char* name) } } -void GfxScene::RegisterGfxActor(RoR::GfxActor* gfx_actor) -{ - m_all_gfx_actors.push_back(gfx_actor); -} - void GfxScene::BufferSimulationData() { + // Sim data are buffered so that scene+GUI updates could happen in parallel with next physics step. + // See comments on top of 'SimBuffers.h' + // ------------------------------------------------------------------------------------------------ + m_simbuf.simbuf_player_actor = App::GetGameContext()->GetPlayerActor(); m_simbuf.simbuf_character_pos = App::GetGameContext()->GetPlayerCharacter()->getPosition(); m_simbuf.simbuf_sim_paused = App::GetGameContext()->GetActorManager()->IsSimulationPaused(); @@ -297,53 +299,21 @@ void GfxScene::BufferSimulationData() m_simbuf.simbuf_dir_arrow_text = App::GetGameContext()->GetRaceSystem().GetDirArrowText(); m_simbuf.simbuf_dir_arrow_visible = App::GetGameContext()->GetRaceSystem().IsDirArrowVisible(); - m_live_gfx_actors.clear(); - for (GfxActor* a: m_all_gfx_actors) + // Actors + for (const ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors()) { - if (a->IsActorLive() || !a->IsActorInitialized()) - { - a->UpdateSimDataBuffer(); - m_live_gfx_actors.push_back(a); - a->InitializeActor(); - } + if (actor->GetGfxActor()->IsActorLive()) + actor->GetGfxActor()->UpdateSimDataBuffer(); } - for (GfxCharacter* a: m_all_gfx_characters) + // Characters + for (const std::unique_ptr& character: App::GetGameContext()->GetCharacterFactory()->getAllCharacters()) { - a->BufferSimulationData(); + character->getGfxCharacter()->BufferSimulationData(); } } -void GfxScene::RemoveGfxActor(RoR::GfxActor* remove_me) -{ - auto itor = std::remove(m_all_gfx_actors.begin(), m_all_gfx_actors.end(), remove_me); - if (itor != m_all_gfx_actors.end()) - { - m_all_gfx_actors.erase(itor, m_all_gfx_actors.end()); - } -} - -void GfxScene::RegisterGfxCharacter(RoR::Character* character) -{ - try - { - m_all_gfx_characters.push_back(new GfxCharacter(character)); - } - catch (Ogre::Exception& eeh) { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - fmt::format("error creating GfxCharacter, message:{}", eeh.getFullDescription())); - } -} -void GfxScene::RemoveGfxCharacter(RoR::Character* remove_me) -{ - auto itor = std::remove_if(m_all_gfx_characters.begin(), m_all_gfx_characters.end(), - [remove_me](GfxCharacter* xch) { return xch->xc_character == remove_me; }); - if (itor != m_all_gfx_characters.end()) - { - m_all_gfx_characters.erase(itor, m_all_gfx_characters.end()); - } -} void GfxScene::DrawNetLabel(Ogre::Vector3 scene_pos, float cam_dist, std::string const& nick, int colornum) { diff --git a/source/main/gfx/GfxScene.h b/source/main/gfx/GfxScene.h index b633540e62..cf94fa625c 100644 --- a/source/main/gfx/GfxScene.h +++ b/source/main/gfx/GfxScene.h @@ -53,25 +53,16 @@ class GfxScene void DrawNetLabel(Ogre::Vector3 pos, float cam_dist, std::string const& nick, int colornum); void UpdateScene(float dt_sec); void ClearScene(); - void RegisterGfxActor(RoR::GfxActor* gfx_actor); - void RemoveGfxActor(RoR::GfxActor* gfx_actor); - void RegisterGfxCharacter(RoR::Character* gfx_character); - void RemoveGfxCharacter(RoR::Character* gfx_character); void BufferSimulationData(); //!< Run this when simulation is halted GameContextSB& GetSimDataBuffer() { return m_simbuf; } GfxEnvmap& GetEnvMap() { return m_envmap; } RoR::SkidmarkConfig* GetSkidmarkConf () { return &m_skidmark_conf; } Ogre::SceneManager* GetSceneManager() { return m_scene_manager; } - std::vector& GetGfxActors() { return m_all_gfx_actors; } - std::vector& GetGfxCharacters() { return m_all_gfx_characters; } private: std::map m_dustpools; Ogre::SceneManager* m_scene_manager = nullptr; - std::vector m_all_gfx_actors; - std::vector m_live_gfx_actors; - std::vector m_all_gfx_characters; RoR::GfxEnvmap m_envmap; GameContextSB m_simbuf; SkidmarkConfig m_skidmark_conf; diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp index e71696f4e0..32ca501717 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.cpp +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.cpp @@ -36,28 +36,9 @@ using namespace Ogre; void CharacterPoseUtil::Draw() { - Character* character = App::GetGameContext()->GetPlayerCharacter(); - if (!character) - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - "no player character, closing CharacterPoseUtil"); - this->SetVisible(false); - return; - } - - GfxCharacter* gfx_character = nullptr; - for (GfxCharacter* xchar : App::GetGfxScene()->GetGfxCharacters()) - { - if (xchar->xc_character == character) - gfx_character = xchar; - } + GfxCharacter* gfx_character = this->FetchCharacter(); if (!gfx_character) - { - App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, - "no player character visuals, closing CharacterPoseUtil"); - this->SetVisible(false); - return; - } + return; // warning already logged Entity* ent = static_cast(gfx_character->xc_scenenode->getAttachedObject(0)); @@ -99,8 +80,12 @@ void CharacterPoseUtil::Draw() void CharacterPoseUtil::DrawSkeletalPanel(Ogre::Entity* ent) { - ImGui::Checkbox("Manual pose mode", &m_manual_pose_active); - if (!m_manual_pose_active) + GfxCharacter* gfx_character = this->FetchCharacter(); + if (!gfx_character) + return; + + ImGui::Checkbox("Manual pose mode", &gfx_character->xc_manual_pose_active); + if (!gfx_character->xc_manual_pose_active) { ImGui::TextDisabled("(gray text means 'disabled')"); } @@ -118,13 +103,17 @@ void CharacterPoseUtil::DrawSkeletalPanel(Ogre::Entity* ent) void CharacterPoseUtil::DrawAnimControls(Ogre::AnimationState* anim_state) { + GfxCharacter* gfx_character = this->FetchCharacter(); + if (!gfx_character) + return; + ImGui::PushID(anim_state); // anim name line ImVec4 color = (anim_state->getEnabled()) ? ImGui::GetStyle().Colors[ImGuiCol_Text] : ImGui::GetStyle().Colors[ImGuiCol_TextDisabled]; const char* uses_boneblendmask_text = anim_state->getBlendMask() ? ", uses bone blend mask!" : ""; ImGui::TextColored(color, "'%s' (%.2f sec%s)", anim_state->getAnimationName().c_str(), anim_state->getLength(), uses_boneblendmask_text); - if (m_manual_pose_active) + if (gfx_character->xc_manual_pose_active) { ImGui::SameLine(); bool enabled = anim_state->getEnabled(); @@ -143,7 +132,7 @@ void CharacterPoseUtil::DrawAnimControls(Ogre::AnimationState* anim_state) } // anim progress line - if (m_manual_pose_active) + if (gfx_character->xc_manual_pose_active) { float timepos = anim_state->getTimePosition(); if (ImGui::SliderFloat("Time pos", &timepos, 0.f, anim_state->getLength())) @@ -180,7 +169,11 @@ ImVec4 ExceptFlagColor(BitMask_t flags, BitMask_t mask, bool active) void CharacterPoseUtil::DrawActionDbgItemFull(CharacterActionID_t id) { - CharacterActionDbg const& dbg = action_dbg_states[id]; + GfxCharacter* gfx_character = this->FetchCharacter(); + if (!gfx_character) + return; + + CharacterActionDbg const& dbg = gfx_character->xc_action_dbg_states[id]; CharacterActionDef* def = &App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->actions[id]; @@ -252,7 +245,11 @@ void CharacterPoseUtil::DrawActionDbgItemFull(CharacterActionID_t id) void CharacterPoseUtil::DrawActionDbgItemInline(CharacterActionID_t id, Ogre::Entity* ent) { - CharacterActionDbg const& dbg = action_dbg_states[id]; + GfxCharacter* gfx_character = this->FetchCharacter(); + if (!gfx_character) + return; + + CharacterActionDbg const& dbg = gfx_character->xc_action_dbg_states[id]; CharacterActionDef* def = &App::GetGameContext()->GetPlayerCharacter()->getCharacterDocument()->actions[id]; AnimationState* as = nullptr; @@ -350,10 +347,38 @@ void CharacterPoseUtil::DrawActionDbgPanel(Ogre::Entity* ent) void CharacterPoseUtil::SetVisible(bool v) { - m_is_visible = v; - m_is_hovered = false; - if (!v) + GfxCharacter* gfx_character = this->FetchCharacter(); + if (gfx_character) { - m_manual_pose_active = false; + m_is_visible = v; + m_is_hovered = false; + if (!v) + { + gfx_character->xc_manual_pose_active = false; + } } } + +GfxCharacter* CharacterPoseUtil::FetchCharacter() +{ + Character* character = App::GetGameContext()->GetPlayerCharacter(); + if (!character) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + "no player character, closing CharacterPoseUtil"); + this->SetVisible(false); + return nullptr; + } + + GfxCharacter* gfx_character = character->getGfxCharacter(); + + if (!gfx_character) + { + App::GetConsole()->putMessage(Console::CONSOLE_MSGTYPE_INFO, Console::CONSOLE_SYSTEM_ERROR, + "no player character visuals, closing CharacterPoseUtil"); + this->SetVisible(false); + return nullptr; + } + + return gfx_character; +} diff --git a/source/main/gui/panels/GUI_CharacterPoseUtil.h b/source/main/gui/panels/GUI_CharacterPoseUtil.h index 13b3324c4c..512192fdbd 100644 --- a/source/main/gui/panels/GUI_CharacterPoseUtil.h +++ b/source/main/gui/panels/GUI_CharacterPoseUtil.h @@ -26,27 +26,6 @@ namespace RoR { -struct CharacterActionDbg -{ - bool active = false; - - // State diagnostic. - BitMask_t missing_situations = 0; //!< `RoRnet::SituationFlags`; The flags from 'for_situations' mask which are not satisfied. - BitMask_t missing_controls = 0; //!< `RoRnet::ControlFlags`; The flags from 'for_controls' mask which are not satisfied. - BitMask_t blocking_situations = 0; //!< `RoRnet::SituationFlags`; The flags from 'except_situations' mask which block this anim. - BitMask_t blocking_controls = 0; //!< `RoRnet::ControlFlags`; The flags from 'except_controls' mask which block this anim. - - // The raw source data of anim position. - float source_dt = 0.f; - float source_hspeed = 0.f; - float source_steering = 0.f; - - // The transformed inputs to anim position. - float input_dt = 0.f; - float input_hspeed = 0.f; - float input_steering = 0.f; -}; - namespace GUI { class CharacterPoseUtil @@ -60,10 +39,6 @@ class CharacterPoseUtil bool IsVisible() const { return m_is_visible; } bool IsHovered() const { return IsVisible() && m_is_hovered; } - bool IsManualPoseActive() const { return m_manual_pose_active; } - - std::vector action_dbg_states; - private: void DrawAnimControls(Ogre::AnimationState* anim_state); void DrawActionDbgItemFull(CharacterActionID_t id); @@ -71,11 +46,11 @@ class CharacterPoseUtil void DrawActionDbgPanel(Ogre::Entity* ent); void DrawSkeletalPanel(Ogre::Entity* ent); + GfxCharacter* FetchCharacter(); + bool m_is_visible = false; bool m_is_hovered = false; Tab m_selected_tab = Tab::SKELETAL; - - bool m_manual_pose_active = false; }; } // namespace GUI diff --git a/source/main/gui/panels/GUI_SurveyMap.cpp b/source/main/gui/panels/GUI_SurveyMap.cpp index ac58124cb3..ba93c2b3f9 100644 --- a/source/main/gui/panels/GUI_SurveyMap.cpp +++ b/source/main/gui/panels/GUI_SurveyMap.cpp @@ -282,8 +282,13 @@ void SurveyMap::Draw() } // Draw actor icons - for (GfxActor* gfx_actor: App::GetGfxScene()->GetGfxActors()) + for (const ActorPtr& actor: App::GetGameContext()->GetActorManager()->GetActors()) { + if (actor->ar_state == ActorState::DISPOSED) + continue; + + GfxActor* gfx_actor = actor->GetGfxActor(); + ROR_ASSERT(gfx_actor); const char* type_str = this->getTypeByDriveable(gfx_actor->GetActorDriveable(), gfx_actor->GetActor()); int truckstate = gfx_actor->GetActorState(); Str<100> fileName; @@ -302,9 +307,9 @@ void SurveyMap::Draw() } // Draw character icons - for (GfxCharacter* gfx_character: App::GetGfxScene()->GetGfxCharacters()) + for (const std::unique_ptr& character: App::GetGameContext()->GetCharacterFactory()->getAllCharacters()) { - auto& simbuf = gfx_character->xc_simbuf; + auto& simbuf = character->getGfxCharacter()->xc_simbuf; if (!simbuf.simbuf_actor_coupling) { std::string caption = (App::mp_state->getEnum() == MpState::CONNECTED) ? simbuf.simbuf_net_username : ""; diff --git a/source/main/main.cpp b/source/main/main.cpp index 25a6ed9712..e88aaad361 100644 --- a/source/main/main.cpp +++ b/source/main/main.cpp @@ -752,7 +752,6 @@ int main(int argc, char *argv[]) { ActorPtr actor = *actor_ptr; actor->ar_state = ActorState::NETWORKED_HIDDEN; // Stop net. updates - App::GetGfxScene()->RemoveGfxActor(actor->GetGfxActor()); // Remove visuals (also stops updating SimBuffer) actor->GetGfxActor()->GetSimDataBuffer().simbuf_actor_state = ActorState::NETWORKED_HIDDEN; // Hack - manually propagate the new state to SimBuffer so Character can reflect it. actor->GetGfxActor()->SetAllMeshesVisible(false); actor->GetGfxActor()->SetCastShadows(false); @@ -773,7 +772,6 @@ int main(int argc, char *argv[]) { ActorPtr actor = *actor_ptr; actor->ar_state = ActorState::NETWORKED_OK; // Resume net. updates - App::GetGfxScene()->RegisterGfxActor(actor->GetGfxActor()); // Restore visuals (also resumes updating SimBuffer) actor->GetGfxActor()->SetAllMeshesVisible(true); actor->GetGfxActor()->SetCastShadows(true); actor->unmuteAllSounds(); // Unmute sounds diff --git a/source/main/physics/ActorManager.cpp b/source/main/physics/ActorManager.cpp index 2c8c7e7f02..d057341073 100644 --- a/source/main/physics/ActorManager.cpp +++ b/source/main/physics/ActorManager.cpp @@ -266,8 +266,6 @@ ActorPtr ActorManager::CreateNewActor(ActorSpawnRequest rq, RigDef::DocumentPtr actor->GetGfxActor()->FinishFlexbodyTasks(); // Sync tasks from threadpool } - App::GetGfxScene()->RegisterGfxActor(actor->GetGfxActor()); - if (actor->ar_engine) { if (!actor->m_preloaded_with_terrain && App::sim_spawn_running->getBool()) From e9adc5e82ba6a46af8ae7590c30a3a183a0145f0 Mon Sep 17 00:00:00 2001 From: Petr Ohlidal Date: Sun, 25 Jun 2023 16:31:00 +0200 Subject: [PATCH 32/32] Bumped RoRnet because of new character system --- source/main/network/RoRnet.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/source/main/network/RoRnet.h b/source/main/network/RoRnet.h index b4cbcebded..24d5d4400e 100644 --- a/source/main/network/RoRnet.h +++ b/source/main/network/RoRnet.h @@ -35,7 +35,7 @@ namespace RoRnet { #define RORNET_MAX_CHARACTER_SKIN_LEN 60 -#define RORNET_VERSION "RoRnet_2.44" +#define RORNET_VERSION "RoRnet_2.45" enum MessageType {

|vsEa;U^OubiuLaYJR|JU?sxP!lk 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�Yz17S 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 #77s0qBzgkmU< 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 Y^zQO*_lL6;>u^%CJUe6Q&EL%b0n}8fpa1{> diff --git a/resources/meshes/character.skeleton b/resources/meshes/character.skeleton deleted file mode 100755 index ed707925432297c56743bf5f5b0c900cc94e2d91..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 352660 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�(OcLq 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