diff options
| -rw-r--r-- | include/pso/TObject.h | 42 | ||||
| -rw-r--r-- | src/pso/TObject.cpp | 28 | ||||
| -rw-r--r-- | src/pso/TObject2.cpp | 16 | 
3 files changed, 59 insertions, 27 deletions
| diff --git a/include/pso/TObject.h b/include/pso/TObject.h index 4db9ae9..0ea2ec4 100644 --- a/include/pso/TObject.h +++ b/include/pso/TObject.h @@ -13,10 +13,41 @@ extern TMainTask main_task;  extern TObject global_obj1;  extern TObject global_obj2; + +enum object_flags { +	NONE = 0, +	QUEUE_DESTRUCTION = 1, +	CHILD_QUEUE_DESTRUCTION = 2, +	BIT_2 = 4, +	BIT_3 = 8, +	DISALLOW_UPDATE = 0x0F, +	DISALLOW_RENDER = 0x10, +	DISALLOW_DESTRUCTION = 0x20, +	BIT_8 = 0x100, +	BIT_9 = 0x200, +	BIT_10 = 0x400, +	BIT_11 = 0x800, +	BIT_12 = 0x1000, +	BIT_13 = 0x2000, +	BIT_14 = 0x4000, +	BIT_15 = 0x8000, +	ALL_BITS = 0xFFFF +}; +static inline object_flags operator^(object_flags a, object_flags b) { return static_cast<object_flags>(static_cast<u16>(a) ^ static_cast<u16>(b)); }; +static inline object_flags operator&(object_flags a, object_flags b) { return static_cast<object_flags>(static_cast<u16>(a) & static_cast<u16>(b)); }; +static inline object_flags operator|(object_flags a, object_flags b) { return static_cast<object_flags>(static_cast<u16>(a) | static_cast<u16>(b)); }; +static inline object_flags operator~(object_flags a) { return static_cast<object_flags>(~static_cast<u16>(a)); } +static inline void operator^=(object_flags &a, object_flags b) { a = a ^ b; }; +static inline void operator&=(object_flags &a, object_flags b) { a = a & b; }; +static inline void operator|=(object_flags &a, object_flags b) { a = a | b; }; +  class TObject {  public:  	const char *name; -	u16 flags; +	union { +		object_flags flags; +		u16 flags_u16; +	};  	u16 id;  	TObject *prev;  	TObject *next; @@ -108,16 +139,17 @@ private:  		}  	}; -	void set_flags(u16 flags) { +	void set_flags(object_flags flags) {  		this->flags |= flags;  	} -	void clear_flags(u16 flags) { -		this->flags &= ~flags; +	void clear_flags(object_flags flags) { +		flags_u16 &= ~static_cast<u16>(flags);  	} -	u32 get_flags(u16 flags) { +	u32 get_flags(object_flags flags) {  		return this->flags & flags;  	};  }; +  #endif diff --git a/src/pso/TObject.cpp b/src/pso/TObject.cpp index 753b952..f8a643d 100644 --- a/src/pso/TObject.cpp +++ b/src/pso/TObject.cpp @@ -19,7 +19,7 @@ void debug_print(const char *fmt) {  }  bool TObject::toggle_flag_9_if_flag_10_is_clear() { -	if (get_flags(0x400)) { +	if (get_flags(BIT_10)) {  		return false;  	}  	if (!get_flag_9()) { @@ -42,7 +42,7 @@ void *TObject::alloc(unsigned long size) {  bool TObject::is_flag_0_clear_for_all_parents() {  	for (TObject *parent = this; parent != NULL; parent = parent->up) { -		if (parent->get_flags(1)) { +		if (parent->get_flags(QUEUE_DESTRUCTION)) {  			return false;  		}  	} @@ -90,7 +90,7 @@ void TObject::empty_func() {  void TObject::render_nodes2() {  	FOREACH_NODE(TObject, this->down, child) { -		if (child->get_flags(0x200)) { +		if (child->get_flags(BIT_9)) {  			child->render();  			child->clear_flag_9();  		} @@ -100,7 +100,7 @@ void TObject::render_nodes2() {  void TObject::render_shadows_for_each_node() {  	FOREACH_NODE(TObject, this->down, child) { -		if (!child->get_flags(0x100)) { +		if (!child->get_flags(BIT_8)) {  			child->render_shadows();  			child->render_shadows_for_each_node();  		} @@ -109,7 +109,7 @@ void TObject::render_shadows_for_each_node() {  void TObject::render_nodes() {  	FOREACH_NODE(TObject, this->down, child) { -		if (!child->get_flags(0x10)) { +		if (!child->get_flags(DISALLOW_RENDER)) {  			child->render();  			child->render_nodes();  		} @@ -122,22 +122,22 @@ void TObject::run_tasks() {  	while (this->down != NULL && child != NULL) {  		TObject *node = child;  		child = child->next; -		if (node->get_flags(0x0f)) { +		if (node->get_flags(DISALLOW_UPDATE)) {  			// Clearing flag 0 in the if statement is required to match. -			if (node->get_flags(1) && (node->clear_flags(1), !node->get_flags(0x20))) { +			if (node->get_flags(QUEUE_DESTRUCTION) && (node->clear_flags(QUEUE_DESTRUCTION), !node->get_flags(DISALLOW_DESTRUCTION))) {  				delete node;  			} else { -				if (node->get_flags(2)) { +				if (node->get_flags(CHILD_QUEUE_DESTRUCTION)) {  					node->delete_children();  					node->run_task(); -					node->clear_flags(2); +					node->clear_flags(CHILD_QUEUE_DESTRUCTION);  				} -				if (!node->get_flags(4)) { +				if (!node->get_flags(BIT_2)) {  					// Adding this here somehow causes the  					// dead code to be compiled.  					// `volatile` typecast is required to match. -					(vu16)node->get_flags(1); +					(vu16)node->get_flags(QUEUE_DESTRUCTION);  				}  			}  		} else { @@ -159,15 +159,15 @@ void TObject::delete_children() {  }  TObject::~TObject() { -	if (!get_flags(0x20)) { -		set_flags(0x20); +	if (!get_flags(DISALLOW_DESTRUCTION)) { +		set_flags(DISALLOW_DESTRUCTION);  		_delete_children();  		remove_parent();  	}  }  TObject::TObject(TObject *parent) { -	flags = 0; +	flags = NONE;  	up = parent;  	down = NULL;  	name = TObject_name; diff --git a/src/pso/TObject2.cpp b/src/pso/TObject2.cpp index 60eec0b..ede8c53 100644 --- a/src/pso/TObject2.cpp +++ b/src/pso/TObject2.cpp @@ -1,33 +1,33 @@  #include "pso/TObject.h"  void TObject::clear_flag_9() { -	clear_flags(0x200); +	clear_flags(BIT_9);  }  void TObject::set_flag_9() { -	set_flags(0x200); +	set_flags(BIT_9);  }  u32 TObject::get_flag_9() { -	return get_flags(0x200); +	return get_flags(BIT_9);  }  void TObject::set_flag_0() { -	set_flags(1); +	set_flags(QUEUE_DESTRUCTION);  }  void TObject::clear_flag_3() { -	clear_flags(8); +	clear_flags(BIT_3);  }  void TObject::set_flag_3() { -	set_flags(8); +	set_flags(BIT_3);  }  void TObject::clear_flag_4() { -	clear_flags(0x10); +	clear_flags(DISALLOW_RENDER);  }  void TObject::set_flag_4() { -	set_flags(0x10); +	set_flags(DISALLOW_RENDER);  } | 
