Implement rstl::list::push_back; CInputGenerator 98%

This commit is contained in:
Luke Street 2022-10-18 23:35:06 -04:00
parent 73c5e9eaf8
commit 3029184d1e
6 changed files with 86 additions and 56 deletions

View File

@ -46,7 +46,7 @@ private:
uint xa4_; uint xa4_;
uint xa8_; uint xa8_;
uint xac_; uint xac_;
rstl::list< void > xb0_; rstl::list< unkptr > xb0_;
}; };
CHECK_SIZEOF(CResFactory, 0xc8); CHECK_SIZEOF(CResFactory, 0xc8);

View File

@ -28,9 +28,9 @@ public:
CInputStream* LoadNewResourceSync(const SObjectTag& tag, char* extBuf); CInputStream* LoadNewResourceSync(const SObjectTag& tag, char* extBuf);
private: private:
rstl::list< void > x0_aramList; rstl::list< unkptr > x0_aramList;
rstl::list< void > x18_pakLoadedList; rstl::list< unkptr > x18_pakLoadedList;
rstl::list< void > x30_pakLoadingList; rstl::list< unkptr > x30_pakLoadingList;
unkptr x48_curPak; unkptr x48_curPak;
CAssetId x4c_cachedResId; CAssetId x4c_cachedResId;
SResInfo* x50_cachedResInfo; SResInfo* x50_cachedResInfo;

View File

@ -11,14 +11,14 @@ class CDolphinController : public IController {
public: public:
CDolphinController(); CDolphinController();
virtual ~CDolphinController(); ~CDolphinController() override;
void Poll(); void Poll() override;
uint GetDeviceCount() const; uint GetDeviceCount() const override;
CControllerGamepadData& GetGamepadData(int controller); CControllerGamepadData& GetGamepadData(int controller) override;
uint GetControllerType(int) const; uint GetControllerType(int) const override;
void SetMotorState(EIOPort port, EMotorState state); void SetMotorState(EIOPort port, EMotorState state) override;
bool Initialize();
bool Initialize();
float GetAnalogStickMaxValue(EJoyAxis axis) const; float GetAnalogStickMaxValue(EJoyAxis axis) const;
private: private:

View File

@ -10,7 +10,7 @@
class CArchitectureQueue { class CArchitectureQueue {
public: public:
bool Push(const CArchitectureMessage& msg) { bool Push(const CArchitectureMessage& msg) {
// x0_queue.push_back(msg); x0_queue.push_back(msg);
return false; // TODO return false; // TODO
} }
void Pop(); // TODO void Pop(); // TODO

View File

@ -3,6 +3,7 @@
#include "types.h" #include "types.h"
#include "rstl/construct.hpp"
#include "rstl/rmemory_allocator.hpp" #include "rstl/rmemory_allocator.hpp"
namespace rstl { namespace rstl {
@ -12,13 +13,17 @@ public:
class iterator; class iterator;
class const_iterator; class const_iterator;
iterator erase(const iterator& item); iterator erase(const iterator& item);
private: private:
class node; class node;
node* erase(const node* item); node* erase(const node* item);
public: public:
list() list()
: x4_start(&xc_empty), x8_end(&xc_empty), xc_empty(&xc_empty, &xc_empty) {} : x4_start(reinterpret_cast< node* >(&xc_empty_prev))
, x8_end(reinterpret_cast< node* >(&xc_empty_prev))
, xc_empty(reinterpret_cast< node* >(&xc_empty_prev), reinterpret_cast< node* >(&xc_empty_prev))
, x14_count(0) {}
~list() { ~list() {
node* cur = x4_start; node* cur = x4_start;
while (cur != x8_end) { while (cur != x8_end) {
@ -27,7 +32,7 @@ public:
cur = cur->get_next(); cur = cur->get_next();
} }
} }
void push_back(const T&); void push_back(const T& val) { do_insert_before(x8_end, val); }
void clear() { void clear() {
// iterator e = end(); // iterator e = end();
iterator cur = begin(); iterator cur = begin();
@ -50,24 +55,36 @@ private:
struct node { struct node {
node* x0_prev; node* x0_prev;
node* x4_next; node* x4_next;
union { uchar x8_item[sizeof(T)];
T* x8_item;
uint x8_count;
};
node(node* prev, node* next) : x0_prev(prev), x4_next(next), x8_count(0) {} node(node* prev, node* next) : x0_prev(prev), x4_next(next) {}
node* get_prev() const { return x0_prev; } node* get_prev() const { return x0_prev; }
node* get_next() const { return x4_next; } node* get_next() const { return x4_next; }
T* get_value() { return x8_item; } void set_prev(node* prev) { x0_prev = prev; }
const T* get_value_const() const { return x8_item; } void set_next(node* next) { x4_next = next; }
T* get_value() { return reinterpret_cast< T* >(&x8_item); }
// todo set_next / set_prev
}; };
node* create_node(node* prev, node* next, const T& val) {
node* n = new node(prev, next);
construct(n->get_value(), val);
return n;
}
void do_insert_before(node* n, const T& val) {
node* nn = create_node(n->get_prev(), n, val);
if (n == x4_start) {
x4_start = nn;
}
nn->get_prev()->set_next(nn);
nn->get_next()->set_prev(nn);
++x14_count;
}
public: public:
class const_iterator { class const_iterator {
public:; public:
typedef T* value_type; typedef T* value_type;
const_iterator() : current(nullptr) {} const_iterator() : current(nullptr) {}
@ -102,7 +119,8 @@ public:
this->current = this->current->x4_next; this->current = this->current->x4_next;
return *this; return *this;
} }
iterator operator++(int) { return const_iterator(this->current->x4_next; } iterator operator++(int) { return const_iterator(this->current->x4_next;
}
iterator& operator--() { iterator& operator--() {
this->current = this->current->x0_prev; this->current = this->current->x0_prev;
return *this; return *this;
@ -113,6 +131,7 @@ public:
T* operator->() const { return current->get_value(); } T* operator->() const { return current->get_value(); }
bool operator==(const iterator& other) const { return current == other.current; } bool operator==(const iterator& other) const { return current == other.current; }
bool operator!=(const iterator& other) const { return current != other.current; } bool operator!=(const iterator& other) const { return current != other.current; }
protected: protected:
node* current; node* current;
}; };
@ -121,7 +140,9 @@ private:
Alloc x0_allocator; Alloc x0_allocator;
node* x4_start; node* x4_start;
node* x8_end; node* x8_end;
node xc_empty; node* xc_empty_prev;
node* x10_empty_next;
uint x14_count;
}; };
} // namespace rstl } // namespace rstl

View File

@ -4,6 +4,7 @@
#include "MetroidPrime/Decode.hpp" #include "MetroidPrime/Decode.hpp"
#include "Kyoto/Basics/COsContext.hpp" #include "Kyoto/Basics/COsContext.hpp"
CInputGenerator::CInputGenerator(COsContext* ctx, float leftDiv, float rightDiv) CInputGenerator::CInputGenerator(COsContext* ctx, float leftDiv, float rightDiv)
: x0_context(ctx) : x0_context(ctx)
, x4_controller(IController::Create(*ctx)) , x4_controller(IController::Create(*ctx))
@ -13,40 +14,48 @@ CInputGenerator::CInputGenerator(COsContext* ctx, float leftDiv, float rightDiv)
x8_connectedControllers[i] = false; x8_connectedControllers[i] = false;
} }
} }
bool CInputGenerator::Update(float dt, CArchitectureQueue& queue) { bool CInputGenerator::Update(float dt, CArchitectureQueue& queue) {
bool ret;
if (!x0_context->Update()) {
ret = false;
} else {
int availSlot = 0; int availSlot = 0;
if (!x0_context->Update()) {
return false;
}
bool firstController = false; bool firstController = false;
if (!x4_controller.null()) { if (!x4_controller.null()) {
int count = x4_controller->GetDeviceCount();
x4_controller->Poll(); x4_controller->Poll();
for (int i = 0; i < x4_controller->GetDeviceCount(); ++i) { for (int i = 0; i < count; ++i) {
const CControllerGamepadData& cont = x4_controller->GetGamepadData(i);
if (cont.DeviceIsPresent()) {
if (i == 0) { if (i == 0) {
firstController = true; firstController = true;
} }
CControllerGamepadData cont = x4_controller->GetGamepadData(i); {
if (cont.DeviceIsPresent()) { CFinalInput input(i, dt, cont, xc_leftDiv, x10_rightDiv);
queue.Push(MakeMsg::CreateUserInput(kAMT_Game, CArchitectureMessage msg = MakeMsg::CreateUserInput(kAMT_Game, input);
CFinalInput(i, dt, cont, xc_leftDiv, x10_rightDiv))); queue.Push(msg);
}
++availSlot; ++availSlot;
} }
if (x8_connectedControllers[i] != cont.DeviceIsPresent()) { bool connected = cont.DeviceIsPresent();
queue.Push(MakeMsg::CreateControllerStatus(kAMT_Game, i, cont.DeviceIsPresent())); if (x8_connectedControllers[i] != connected) {
x8_connectedControllers[i] = cont.DeviceIsPresent(); CArchitectureMessage msg = MakeMsg::CreateControllerStatus(kAMT_Game, i, connected);
queue.Push(msg);
x8_connectedControllers[i] = connected;
} }
} }
} }
if (firstController) { if (!firstController) {
queue.Push(MakeMsg::CreateUserInput(kAMT_Game, CFinalInput(availSlot, dt, *x0_context))); CArchitectureMessage msg = MakeMsg::CreateUserInput(kAMT_Game, CFinalInput(0, dt, *x0_context));
queue.Push(msg);
} else { } else {
queue.Push(MakeMsg::CreateUserInput(kAMT_Game, CFinalInput(0, dt, *x0_context))); CArchitectureMessage msg =
MakeMsg::CreateUserInput(kAMT_Game, CFinalInput(availSlot, dt, *x0_context));
queue.Push(msg);
} }
ret = true; return true;
}
return ret;
} }