mirror of
https://github.com/open-goal/jak-project.git
synced 2024-11-23 06:09:57 +00:00
better detection of divisors
This commit is contained in:
parent
98afdbd247
commit
ef4a564479
@ -2636,11 +2636,19 @@ void SetVarElement::push_to_stack(const Env& env, FormPool& pool, FormStack& sta
|
|||||||
{Matcher::any_single(0), Matcher::any(1)}),
|
{Matcher::any_single(0), Matcher::any(1)}),
|
||||||
m_src);
|
m_src);
|
||||||
if (mr.matched && std::abs(mr.maps.floats.at(0)) < 1 && mr.maps.floats.at(0) != 0) {
|
if (mr.matched && std::abs(mr.maps.floats.at(0)) < 1 && mr.maps.floats.at(0) != 0) {
|
||||||
float divisor_num = 1.0f / mr.maps.floats.at(0);
|
auto inverse_mult = mr.maps.floats.at(0);
|
||||||
|
float divisor_num = 1.0f / inverse_mult;
|
||||||
|
|
||||||
|
// note: float inaccuracies lead to convergent values, so we can do this safely
|
||||||
|
if ((int)divisor_num != divisor_num && 1.0f / std::roundf(divisor_num) == inverse_mult) {
|
||||||
|
lg::debug("managed to round divisor - cool !! {} -> {} ({})", divisor_num,
|
||||||
|
std::roundf(divisor_num), inverse_mult);
|
||||||
|
divisor_num = std::roundf(divisor_num);
|
||||||
|
}
|
||||||
|
|
||||||
int divisor_int = (int)divisor_num;
|
int divisor_int = (int)divisor_num;
|
||||||
// note: for some reason 0.016666668 shows up constantly where 1/60 should be. we won't
|
bool integer = divisor_int == divisor_num;
|
||||||
// force it to 60, but we will transform it anyway
|
if (integer) {
|
||||||
if (divisor_int == divisor_num || mr.maps.floats.at(0) == 0.016666668f) {
|
|
||||||
auto elt = mr.maps.forms.at(1)->try_as_single_element();
|
auto elt = mr.maps.forms.at(1)->try_as_single_element();
|
||||||
auto b_as_simple = dynamic_cast<SimpleExpressionElement*>(elt);
|
auto b_as_simple = dynamic_cast<SimpleExpressionElement*>(elt);
|
||||||
// WARNING : there is an assumption here that derefs DO NOT have implicit casts!
|
// WARNING : there is an assumption here that derefs DO NOT have implicit casts!
|
||||||
@ -2651,13 +2659,15 @@ void SetVarElement::push_to_stack(const Env& env, FormPool& pool, FormStack& sta
|
|||||||
Form* divisor = nullptr;
|
Form* divisor = nullptr;
|
||||||
if (divisor_num == 4096.0f) {
|
if (divisor_num == 4096.0f) {
|
||||||
divisor = pool.form<ConstantTokenElement>("METER_LENGTH");
|
divisor = pool.form<ConstantTokenElement>("METER_LENGTH");
|
||||||
} else if (divisor_num == (float)divisor_int && divisor_int % 2048 == 0) {
|
} else if (integer && divisor_int % 4096 == 0) {
|
||||||
divisor = pool.form<GenericElement>(
|
divisor = pool.form<GenericElement>(
|
||||||
GenericOperator::make_function(pool.form<ConstantTokenElement>("meters")),
|
GenericOperator::make_function(pool.form<ConstantTokenElement>("meters")),
|
||||||
divisor_int % (int)METER_LENGTH
|
pool.form<SimpleAtomElement>(divisor_int / 4096, true));
|
||||||
? pool.form<ConstantFloatElement>(divisor_num / (float)METER_LENGTH)
|
} else if (integer && divisor_int % 2048 == 0) {
|
||||||
: pool.form<SimpleAtomElement>(divisor_int / 4096, true));
|
divisor = pool.form<GenericElement>(
|
||||||
} else if (divisor_num == divisor_int) {
|
GenericOperator::make_function(pool.form<ConstantTokenElement>("meters")),
|
||||||
|
pool.form<ConstantFloatElement>(divisor_num / (float)METER_LENGTH));
|
||||||
|
} else if (integer) {
|
||||||
divisor = pool.form<SimpleAtomElement>(divisor_int, true);
|
divisor = pool.form<SimpleAtomElement>(divisor_int, true);
|
||||||
} else {
|
} else {
|
||||||
// this shouldn't run because of the checks before.
|
// this shouldn't run because of the checks before.
|
||||||
|
Loading…
Reference in New Issue
Block a user