From b19a2c82f0e0ecf19abeebe25f4168fcec09165e Mon Sep 17 00:00:00 2001 From: water111 <48171810+water111@users.noreply.github.com> Date: Sat, 26 Jun 2021 22:52:52 -0400 Subject: [PATCH] [decomp] detect vector-! inlined. (#633) * fix flipped order * format * parser hack * actually flip * detect --- decompiler/IR2/AtomicOpForm.cpp | 12 +- decompiler/IR2/Form.cpp | 5 +- decompiler/IR2/Form.h | 7 +- decompiler/IR2/FormExpressionAnalysis.cpp | 344 ++++++++- decompiler/IR2/FormStack.h | 25 + decompiler/config/all-types.gc | 4 +- goal_src/engine/camera/cam-interface.gc | 2 +- goal_src/engine/camera/camera-h.gc | 38 +- goal_src/engine/collide/collide-shape-h.gc | 2 +- goal_src/engine/gfx/ripple.gc | 221 ++++++ goal_src/engine/math/transformq-h.gc | 27 +- goal_src/engine/physics/trajectory.gc | 46 +- goal_src/engine/target/joint-mod-h.gc | 666 ++++++++---------- goal_src/engine/util/sync-info.gc | 204 +++--- .../engine/camera/cam-interface_REF.gc | 4 +- .../reference/engine/camera/camera-h_REF.gc | 24 +- .../engine/collide/collide-shape-h_REF.gc | 10 +- .../reference/engine/gfx/ripple_REF.gc | 9 +- .../reference/engine/math/transformq-h_REF.gc | 55 +- .../engine/physics/trajectory_REF.gc | 43 +- .../engine/target/joint-mod-h_REF.gc | 618 +++++++--------- .../reference/engine/util/sync-info_REF.gc | 24 +- test/decompiler/test_FormExpressionBuild2.cpp | 26 + 23 files changed, 1353 insertions(+), 1063 deletions(-) diff --git a/decompiler/IR2/AtomicOpForm.cpp b/decompiler/IR2/AtomicOpForm.cpp index a1dd5616e8..2a80fccd4d 100644 --- a/decompiler/IR2/AtomicOpForm.cpp +++ b/decompiler/IR2/AtomicOpForm.cpp @@ -242,7 +242,8 @@ FormElement* StoreOp::get_vf_store_as_form(FormPool& pool, const Env& env) const } assert(!rd.addr_of); // we'll change this to true because .svf uses an address. auto addr = pool.alloc_single_element_form(nullptr, source, true, tokens); - return pool.alloc_element(m_value.var().reg(), addr, false); + return pool.alloc_element(m_value.var().reg(), addr, false, + m_my_idx); } else { // try again with no deref. rd_in.deref = {}; @@ -260,7 +261,8 @@ FormElement* StoreOp::get_vf_store_as_form(FormPool& pool, const Env& env) const // some sketchy type stuff going on. addr = pool.alloc_single_element_form( nullptr, TypeSpec("pointer", {TypeSpec("uint128")}), addr); - return pool.alloc_element(m_value.var().reg(), addr, false); + return pool.alloc_element(m_value.var().reg(), addr, false, + m_my_idx); } } } @@ -704,13 +706,13 @@ FormElement* LoadVarOp::get_as_form(FormPool& pool, const Env& env) const { if (src_as_deref) { assert(!src_as_deref->is_addr_of()); src_as_deref->set_addr_of(true); - return pool.alloc_element(m_dst.reg(), src, true); + return pool.alloc_element(m_dst.reg(), src, true, m_my_idx); } auto src_as_unrecognized = dynamic_cast(src->try_as_single_element()); if (src_as_unrecognized) { - return pool.alloc_element(m_dst.reg(), - src_as_unrecognized->location(), true); + return pool.alloc_element( + m_dst.reg(), src_as_unrecognized->location(), true, m_my_idx); } throw std::runtime_error("VF unknown load"); diff --git a/decompiler/IR2/Form.cpp b/decompiler/IR2/Form.cpp index 835bdf096e..64989798a9 100644 --- a/decompiler/IR2/Form.cpp +++ b/decompiler/IR2/Form.cpp @@ -2325,8 +2325,9 @@ void StackStructureDefElement::get_modified_regs(RegSet&) const {} VectorFloatLoadStoreElement::VectorFloatLoadStoreElement(Register vf_reg, Form* location, - bool is_load) - : m_vf_reg(vf_reg), m_location(location), m_is_load(is_load) { + bool is_load, + int my_idx) + : m_vf_reg(vf_reg), m_location(location), m_is_load(is_load), m_my_idx(my_idx) { location->parent_element = this; } diff --git a/decompiler/IR2/Form.h b/decompiler/IR2/Form.h index f6ac6f9326..eefefd3c64 100644 --- a/decompiler/IR2/Form.h +++ b/decompiler/IR2/Form.h @@ -1349,7 +1349,7 @@ class StackStructureDefElement : public FormElement { class VectorFloatLoadStoreElement : public FormElement { public: - VectorFloatLoadStoreElement(Register vf_reg, Form* location, bool is_load); + VectorFloatLoadStoreElement(Register vf_reg, Form* location, bool is_load, int my_idx); goos::Object to_form_internal(const Env& env) const override; void apply(const std::function& f) override; void apply_form(const std::function& f) override; @@ -1359,11 +1359,16 @@ class VectorFloatLoadStoreElement : public FormElement { void collect_vf_regs(RegSet& regs) const; bool is_load() const { return m_is_load; } Register vf_reg() const { return m_vf_reg; } + const std::optional& addr_type() const { return m_addr_type; } + Form* location() const { return m_location; } + int my_idx() const { return m_my_idx; } private: Register m_vf_reg; Form* m_location = nullptr; bool m_is_load = false; + std::optional m_addr_type; + int m_my_idx = -1; }; class StackSpillStoreElement : public FormElement { diff --git a/decompiler/IR2/FormExpressionAnalysis.cpp b/decompiler/IR2/FormExpressionAnalysis.cpp index 8e6a13fba6..598de0bfdd 100644 --- a/decompiler/IR2/FormExpressionAnalysis.cpp +++ b/decompiler/IR2/FormExpressionAnalysis.cpp @@ -181,15 +181,14 @@ void pop_helper(const std::vector& vars, submit_reg_to_var.push_back(var_idx); submit_regs.push_back(var.reg()); } else { - /* - auto var_id = env.get_program_var_id(var); - fmt::print( - "Unsafe to pop {}: used {} times, def {} times, expected use {} ({} {} rd: {}) ({} " - "{})\n", - var.to_string(env), use_def.use_count(), use_def.def_count(), times, - var.reg().to_string(), var.idx(), var.mode() == AccessMode::READ, - var_id.reg.to_string(), var_id.id); - */ + // auto var_id = env.get_program_var_id(var); + // fmt::print( + // "Unsafe to pop {}: used {} times, def {} times, expected use {} ({} {} rd: + // {}) ({} " + // "{})\n", + // var.to_string(env), use_def.use_count(), use_def.def_count(), times, + // var.reg().to_string(), var.idx(), var.mode() == AccessMode::READ, + // var_id.reg.to_string(), var_id.id); // if (var.to_string(env) == "a3-0") { // for (auto& use : use_def.uses) { @@ -2955,6 +2954,15 @@ FormElement* ConditionElement::make_generic(const Env& env, casted); } + case IR2_Condition::Kind::LESS_THAN_ZERO_UNSIGNED: { + auto casted = make_casts_if_needed(source_forms, types, TypeSpec("uint"), pool, env); + auto zero = pool.alloc_single_element_form( + nullptr, SimpleAtom::make_int_constant(0)); + casted.push_back(zero); + return pool.alloc_element(GenericOperator::make_fixed(FixedOperatorKind::LT), + casted); + } + case IR2_Condition::Kind::GEQ_ZERO_SIGNED: { return make_geq_zero_signed_check_generic(env, pool, source_forms, types); } @@ -3732,6 +3740,317 @@ void StackSpillStoreElement::push_to_stack(const Env& env, FormPool& pool, FormS stack.push_form_element(pool.alloc_element(dst, src), true); } +namespace { + +/*! + * Is the given form an assembly form to load data from a vector to the given vf register? + */ +Form* is_load_store_vector_to_reg(const Register& reg, + FormElement* form, + bool is_load, + int* idx_out) { + auto as_vf_op = dynamic_cast(form); + if (!as_vf_op) { + return nullptr; + } + + if (as_vf_op->is_load() != is_load) { + return nullptr; + } + + if (as_vf_op->vf_reg() != reg) { + return nullptr; + } + + // check that we actually got a real vector type, not some other thing that happens to have a + // quad. + auto& addr_type = as_vf_op->addr_type(); + if (!addr_type || addr_type != TypeSpec("vector")) { + return nullptr; + } + + // make sure we load from the right spot, and extract the base. + auto loc = as_vf_op->location(); + auto matcher = Matcher::deref(Matcher::any(0), true, {DerefTokenMatcher::string("quad")}); + auto mr = match(matcher, loc); + if (!mr.matched) { + return nullptr; + } + + // output the index of the actual store op, for reguse purposes. + if (idx_out) { + *idx_out = as_vf_op->my_idx(); + } + + // got it! + return mr.maps.forms.at(0); +} + +/*! + * try to convert to an assembly op, return nullptr if we can't. + */ +const AsmOp* get_asm_op(FormElement* form) { + auto as_asm = dynamic_cast(form); + if (as_asm) { + return as_asm->op(); + } + + auto two = dynamic_cast(form); + if (two) { + return two->op(); + } + return nullptr; +} + +/*! + * Is this vmove.w vfX, vf0? This is a common trick to set the w field. + */ +bool is_set_w_1(const Register& reg, FormElement* form, const Env&) { + auto as_asm = get_asm_op(form); + if (!as_asm) { + return false; + } + auto instr = as_asm->instruction(); + + if (instr.kind != InstructionKind::VMOVE) { + return false; + } + + if (instr.cop2_dest != 1) { + return false; + } + + if (!instr.get_src(0).is_reg(Register(Reg::VF, 0))) { + return false; + } + + if (!instr.get_dst(0).is_reg(reg)) { + return false; + } + + return true; +} + +/*! + * Is this a COP2 op in the form vblah.mask vfX, vfY, vfZ? + */ +bool is_vf_3op_dst(InstructionKind kind, + u8 dest_mask, + const Register& dst, + const Register& src0, + const Register& src1, + + FormElement* form) { + auto as_asm = get_asm_op(form); + if (!as_asm) { + return false; + } + auto instr = as_asm->instruction(); + + if (instr.kind != kind) { + return false; + } + + if (instr.cop2_dest != dest_mask) { + return false; + } + + if (!instr.get_src(0).is_reg(src0)) { + return false; + } + + if (!instr.get_src(1).is_reg(src1)) { + return false; + } + + if (!instr.get_dst(0).is_reg(dst)) { + return false; + } + + return true; +} + +/*! + * Make a vf register. + */ +Register vfr(int idx) { + return Register(Reg::VF, idx); +} + +/*! + * Try to pop a variable from the stack again. If we are detecting a macro that flips argument + * evaluation order, we can use this to fix it up and remove temporaries. + * If the previous pop succeeded, this does nothing. + */ +Form* repop_arg(Form* in, FormStack& stack, const Env& env, FormPool& pool) { + auto as_atom = form_as_atom(in); + if (as_atom && as_atom->is_var()) { + return pop_to_forms({as_atom->var()}, env, pool, stack, true).at(0); + } + return in; +} + +/*! + * Imagine: + * x = foo + * { // some macro/inlined thing + * read from x + * return x; + * } + * + * and you want to transform it to + * x = some_macro(foo, blah, ...) + * + * this will get you foo (and pop it from the stack), assuming the stack is sitting right after the + * point where the inline thing evaluated foo. + * + * For later book-keeping of reg use, if it gets you something new, it will set found_orig_out, + * and also give you the regaccess for the x of the x = foo. + * + * If you use this, you are responsible for adding code that sets x again. + */ +Form* repop_passthrough_arg(Form* in, + FormStack& stack, + RegisterAccess* orig_out, + bool* found_orig_out) { + *found_orig_out = false; + + auto as_atom = form_as_atom(in); + if (as_atom && as_atom->is_var()) { + // get the last active thing on the stack and see if its what we want. + auto last_in_stack = stack.active_back(); + if (!last_in_stack) { + return in; + } + + if (!last_in_stack->destination) { + return in; + } + + if (last_in_stack->destination->reg() != as_atom->var().reg()) { + return in; + } + + // the x regaccess + *orig_out = *last_in_stack->destination; + auto val = last_in_stack->source; + *found_orig_out = true; + stack.pop_active_back(); + return val; + } + return in; +} + +/*! + * Try to convert a form to a regaccess. + */ +std::optional form_as_ra(Form* form) { + auto as_atom = form_as_atom(form); + if (as_atom && as_atom->is_var()) { + return as_atom->var(); + } + return {}; +} + +/*! + * Handle an inlined call to vector-! + */ +bool try_vector_sub_inline(const Env& env, FormPool& pool, FormStack& stack) { + // we are looking for 5 ops, none are sets + auto elts = stack.try_getting_active_stack_entries({false, false, false, false, false}); + if (!elts) { + return false; + } + + // check first: (.lvf vf4 (&-> arg1 quad)) + auto first = is_load_store_vector_to_reg(Register(Reg::VF, 4), elts->at(0).elt, true, nullptr); + if (!first) { + return false; + } + + // second (.lvf vf5 (&-> a0-1 quad)) + auto second = is_load_store_vector_to_reg(Register(Reg::VF, 5), elts->at(1).elt, true, nullptr); + if (!second) { + return false; + } + + // third (.vmove.w vf6 vf0) + if (!is_set_w_1(Register(Reg::VF, 6), elts->at(2).elt, env)) { + return false; + } + + // 4th (.vsub.xyz vf6 vf4 vf5) + if (!is_vf_3op_dst(InstructionKind::VSUB, 14, vfr(6), vfr(4), vfr(5), elts->at(3).elt)) { + return false; + } + + // 5th (and remember the index) + int store_idx = -1; + auto store = + is_load_store_vector_to_reg(Register(Reg::VF, 6), elts->at(4).elt, false, &store_idx); + if (!store) { + return false; + } + + // the store here _should_ have failed propagation and just given us a variable. + // if this is causing issues, we can run this check before propagating, as well call this from + // the function that attempts the pop. + auto store_var = form_as_ra(store); + if (!store_var) { + env.func->warnings.general_warning("Almost found vector sub, but couldn't get store var."); + return false; + } + + // remove these from the stack. + stack.pop(5); + + // ignore the store as a use. This will allow the entire vector-! expression to be expression + // propagated, if it is appropriate. + if (store_var) { + auto menv = const_cast(&env); + menv->disable_use(*store_var); + } + + // repop the arguments in the opposite order. this can eliminate temporaries as this will + // use the opposite order of the original attempt. + second = repop_arg(second, stack, env, pool); + first = repop_arg(first, stack, env, pool); + + // now try to see if we can pop the first arg (destination vector). + bool got_orig = false; + RegisterAccess orig; + store = repop_passthrough_arg(store, stack, &orig, &got_orig); + + // create the actual vector-! form + Form* new_thing = pool.alloc_single_element_form( + nullptr, + GenericOperator::make_function( + pool.alloc_single_element_form(nullptr, "vector-!")), + std::vector{store, first, second}); + + if (got_orig) { + // we got a value for the destination. because we used the special repop passthrough, + // we're responsible for inserting a set to set the var that we "stole" from. + // We do this through push_value_to_reg, so it can be propagated if needed, but only if + // somebody will actually read the output. + // to tell, we look at the live out of the store op and the end - the earlier one would of + // course be live out always because the store will read it again. + auto& op_info = env.reg_use().op.at(store_idx); + if (op_info.live.find(orig.reg()) == op_info.live.end()) { + // nobody reads it, don't bother. + stack.push_form_element(new_thing->elts().at(0), true); + } else { + stack.push_value_to_reg(orig, new_thing, true, TypeSpec("vector")); + } + + } else { + stack.push_form_element(new_thing->elts().at(0), true); + } + + return false; +} +} // namespace + void VectorFloatLoadStoreElement::push_to_stack(const Env& env, FormPool& pool, FormStack& stack) { mark_popped(); @@ -3740,11 +4059,16 @@ void VectorFloatLoadStoreElement::push_to_stack(const Env& env, FormPool& pool, auto root = loc_as_deref->base(); auto atom = form_as_atom(root); if (atom && atom->get_kind() == SimpleAtom::Kind::VARIABLE) { + m_addr_type = env.get_variable_type(atom->var(), true); loc_as_deref->set_base(pop_to_forms({atom->var()}, env, pool, stack, true).at(0)); } } - stack.push_form_element(this, true); + + // don't find vector-! inside of vector-!. + if (!m_is_load && env.func->guessed_name.to_string() != "vector-!") { + try_vector_sub_inline(env, pool, stack); + } } void MethodOfTypeElement::update_from_stack(const Env& env, diff --git a/decompiler/IR2/FormStack.h b/decompiler/IR2/FormStack.h index dcfdafcfb7..f20d1e517c 100644 --- a/decompiler/IR2/FormStack.h +++ b/decompiler/IR2/FormStack.h @@ -64,6 +64,8 @@ class FormStack { std::string print(const Env& env) const; }; + // requires consecutive active entries to succeed (can't skip over inactives). + // it's safe to use pop with the same size or smaller to remove the entries you expect. std::optional> try_getting_active_stack_entries( const std::vector& is_set) const { if (is_set.size() > m_stack.size()) { @@ -101,6 +103,29 @@ class FormStack { } } + // get the back, skipping inactives + const StackEntry* active_back() const { + for (size_t i = m_stack.size(); i-- > 0;) { + auto& e = m_stack.at(i); + if (e.active) { + return &e; + } + } + return nullptr; + } + + // pop the back, skipping inactives + void pop_active_back() { + for (size_t i = m_stack.size(); i-- > 0;) { + auto& e = m_stack.at(i); + if (e.active) { + m_stack.erase(m_stack.begin() + i); + return; + } + } + assert(false); + } + private: std::vector m_stack; bool m_is_root_stack = false; diff --git a/decompiler/config/all-types.gc b/decompiler/config/all-types.gc index b64941c037..cffbbb020e 100644 --- a/decompiler/config/all-types.gc +++ b/decompiler/config/all-types.gc @@ -1818,7 +1818,7 @@ ;; - Types (deftype transformq (transform) - ((quat quaternion :inline :offset 16) + ((quat quaternion :inline :offset 16 :score 100) ) :method-count-assert 9 :size-assert #x30 @@ -1826,7 +1826,7 @@ ) (deftype trsq (trs) - ((quat quaternion :inline :offset 32) + ((quat quaternion :inline :offset 32 :score 100) ) :method-count-assert 9 :size-assert #x40 diff --git a/goal_src/engine/camera/cam-interface.gc b/goal_src/engine/camera/cam-interface.gc index bb94eedd21..8dc3930984 100644 --- a/goal_src/engine/camera/cam-interface.gc +++ b/goal_src/engine/camera/cam-interface.gc @@ -113,7 +113,7 @@ (let ((v1-1 (-> gp-0 trans))) (set! (-> v1-1 quad) (-> (the-as transform (-> arg0 extra)) scale quad)) ) - (quaternion-copy! (the-as quaternion (-> gp-0 rot)) (-> arg0 quat)) + (quaternion-copy! (-> gp-0 quat) (-> arg0 quat)) (vector-identity! (-> gp-0 scale)) (let ((a1-2 (new 'stack-no-clear 'event-message-block))) (set! (-> a1-2 from) pp) diff --git a/goal_src/engine/camera/camera-h.gc b/goal_src/engine/camera/camera-h.gc index b2343707e8..2acfea2859 100644 --- a/goal_src/engine/camera/camera-h.gc +++ b/goal_src/engine/camera/camera-h.gc @@ -220,12 +220,8 @@ (init-vf0-vector) (cond (arg0 - (let ((v1-0 (-> obj target))) - (set! (-> v1-0 quad) (-> arg0 quad)) - ) - (let ((v1-1 (-> obj value))) - (set! (-> v1-1 quad) (-> arg0 quad)) - ) + (set! (-> obj target quad) (-> arg0 quad)) + (set! (-> obj value quad) (-> arg0 quad)) ) (else (.svf (&-> (-> obj target) quad) vf0) @@ -236,6 +232,8 @@ (set! (-> obj accel) arg1) (set! (-> obj max-vel) arg2) (set! (-> obj max-partial) arg3) + (let ((v0-0 0)) + ) (none) ) ) @@ -262,33 +260,13 @@ (.lvf vf4 (&-> v1-0 quad)) ) (.lvf vf5 (&-> arg0 quad)) - (.add.vf vf6 vf4 vf5 :mask #b111) + (.add.vf vf6 vf4 vf5 :mask #b111) ;; todo add (.svf (&-> a0-1 quad) vf6) ) - (let ((a1-1 gp-0)) - (let ((v1-1 gp-0) - (a0-2 (-> obj value)) - ) - (.lvf vf4 (&-> v1-1 quad)) - (.lvf vf5 (&-> a0-2 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-1 quad) vf6) - ) + (vector-! gp-0 gp-0 (-> obj value)) ) (else - (let ((a1-2 gp-0)) - (let ((v1-2 (-> obj target)) - (a0-3 (-> obj value)) - ) - (.lvf vf4 (&-> v1-2 quad)) - (.lvf vf5 (&-> a0-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-2 quad) vf6) - ) + (vector-! gp-0 (-> obj target) (-> obj value)) ) ) (let ((f30-1 (* (-> obj max-partial) (vector-length gp-0)))) @@ -359,6 +337,8 @@ (.svf (&-> v1-8 quad) vf6) ) ) + (let ((v0-2 0)) + ) (none) ) ) diff --git a/goal_src/engine/collide/collide-shape-h.gc b/goal_src/engine/collide/collide-shape-h.gc index 94b3ea3d0a..f54d12a5fd 100644 --- a/goal_src/engine/collide/collide-shape-h.gc +++ b/goal_src/engine/collide/collide-shape-h.gc @@ -470,7 +470,7 @@ ;; reset transformation to the origin. (set! (-> obj trans w) 1.0) - (quaternion-identity! (the-as quaternion (-> obj rot))) + (quaternion-identity! (-> obj quat)) (vector-identity! (-> obj scale)) ;; add us to right list. diff --git a/goal_src/engine/gfx/ripple.gc b/goal_src/engine/gfx/ripple.gc index 3f3f7cd196..f46b6a211b 100644 --- a/goal_src/engine/gfx/ripple.gc +++ b/goal_src/engine/gfx/ripple.gc @@ -5,3 +5,224 @@ ;; name in dgo: ripple ;; dgos: GAME, ENGINE +(define-extern ripple-execute-init (function none)) +(define-extern ripple-create-wave-table (function ripple-wave-set int)) +(define-extern ripple-apply-wave-table (function merc-effect symbol)) + +(deftype ripple-request (structure) + ((waveform ripple-wave :offset-assert 0) + (effect merc-effect :offset-assert 4) + ) + :pack-me + :method-count-assert 9 + :size-assert #x8 + :flag-assert #x900000008 + ) + +(deftype ripple-globals (structure) + ((count int32 :offset-assert 0) + (requests ripple-request 16 :inline :offset-assert 4) + ) + :method-count-assert 9 + :size-assert #x84 + :flag-assert #x900000084 + ) + +(define *ripple-globals* (new 'global 'ripple-globals)) + +(defun ripple-make-request ((arg0 ripple-wave) (arg1 merc-effect)) + (let ((v1-1 (-> *ripple-globals* count)) + (a2-1 (-> *ripple-globals* requests)) + (a3-0 0) + ) + (when (< v1-1 16) + (dotimes (t0-1 v1-1) + (if (= arg1 (-> a2-1 t0-1 effect)) + (set! a3-0 1) + ) + ) + (when (zero? a3-0) + (set! (-> a2-1 v1-1 effect) arg1) + (set! (-> a2-1 v1-1 waveform) arg0) + (set! (-> *ripple-globals* count) (+ (-> *ripple-globals* count) 1)) + ) + ) + ) + (none) + ) + +(defun ripple-update-waveform-offs ((arg0 ripple-wave-set)) + (let ((f0-1 (the float (- (-> *display* integral-frame-counter) (-> arg0 frame-save))))) + (when (!= f0-1 0.0) + (dotimes (v1-4 (-> arg0 count)) + (let ((a1-4 (-> arg0 wave v1-4))) + (set! (-> a1-4 offs) (+ (-> a1-4 offs) (* f0-1 (-> a1-4 delta)))) + (set! (-> a1-4 offs) (the float (logand (the int (-> a1-4 offs)) #xffff))) + ) + ) + (set! (-> arg0 frame-save) (-> *display* integral-frame-counter)) + ) + ) + (none) + ) + +;; definition for function ripple-execute-init +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function ripple-create-wave-table +;; ERROR: function was not converted to expressions. Cannot decompile. + +;; definition for function ripple-apply-wave-table +;; ERROR: function was not converted to expressions. Cannot decompile. + +(defun ripple-execute () + (when (-> *ripple-globals* count) + (ripple-execute-init) + (let ((gp-0 0) + (s5-0 (-> *ripple-globals* count)) + (s4-0 (-> *ripple-globals* requests)) + ) + (while (!= gp-0 s5-0) + (when (-> s4-0 gp-0 waveform) + (let ((s3-0 gp-0) + (s2-0 (-> s4-0 gp-0 waveform)) + ) + (ripple-create-wave-table (the-as ripple-wave-set s2-0)) + (while (!= s3-0 s5-0) + (when (= s2-0 (-> s4-0 s3-0 waveform)) + (ripple-apply-wave-table (-> s4-0 s3-0 effect)) + (set! (-> s4-0 s3-0 waveform) #f) + ) + (+! s3-0 1) + ) + ) + ) + (+! gp-0 1) + ) + ) + (set! (-> *ripple-globals* count) 0) + ) + (none) + ) + +;; definition for function ripple-matrix-scale +;; ERROR: function was not converted to expressions. Cannot decompile. + +(defun-debug ripple-add-debug-sphere ((arg0 process-drawable) (arg1 vector) (arg2 float) (arg3 float)) + (rlet ((vf0 :class vf) + (vf4 :class vf) + (vf5 :class vf) + (vf6 :class vf) + ) + (init-vf0-vector) + (let ((f30-0 (- (quaternion-y-angle (-> arg0 root quat)))) + (s5-0 (new-stack-vector0)) + ) + (let ((f28-0 (+ (-> arg1 x) (* arg2 (-> arg1 z)))) + (f26-0 (+ (-> arg1 y) (* arg3 (-> arg1 z)))) + ) + (set! (-> s5-0 x) (- (* f28-0 (cos f30-0)) (* f26-0 (sin f30-0)))) + (set! (-> s5-0 y) 0.0) + (set! (-> s5-0 z) (+ (* f26-0 (cos f30-0)) (* f28-0 (sin f30-0)))) + ) + (set! (-> s5-0 w) 0.0) + (let ((a0-6 s5-0)) + (let ((v1-1 s5-0) + (a1-2 (-> arg0 root trans)) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.lvf vf4 (&-> v1-1 quad)) + (.lvf vf5 (&-> a1-2 quad)) + ) + (.add.vf vf6 vf4 vf5 :mask #b111) ;; todo vector+! + (.svf (&-> a0-6 quad) vf6) + ) + (add-debug-sphere + #t + (bucket-id debug-draw0) + s5-0 + 2048.0 + (new 'static 'rgba :r #xff :g #xff :a #x80) + ) + ) + (none) + ) + ) + +(defun ripple-slow-add-sine-waves ((arg0 ripple-wave-set) (arg1 float) (arg2 float)) + (let ((f30-0 0.0)) + (dotimes (s3-0 (-> arg0 count)) + (let* ((v1-3 (-> arg0 wave s3-0)) + (f0-2 (+ (+ (-> v1-3 offs) (* arg1 (-> v1-3 xmul))) + (* arg2 (-> v1-3 zmul)) + ) + ) + ) + (+! f30-0 (* (-> v1-3 scale) (cos f0-2))) + ) + ) + (fmax -127.0 (fmin 127.0 f30-0)) + ) + ) + +;; definition for function ripple-find-height +(defun ripple-find-height ((arg0 process-drawable) (arg1 basic) (arg2 vector)) + (local-vars (sv-16 float) (sv-32 float)) + (let* ((f30-0 (-> arg0 root trans y)) + (v1-1 (-> arg0 draw)) + (a1-5 (-> v1-1 lod-set lod (-> v1-1 cur-lod) geo effect)) + ) + (if (or (zero? (logand (-> a1-5 0 effect-bits) 4)) (not (-> v1-1 ripple))) + (return f30-0) + ) + (let* ((a1-6 (-> a1-5 0 extra-info)) + (s4-0 + (the-as + mei-ripple + (+ (the-as uint a1-6) (the-as uint (* (-> a1-6 ripple-offset) 16))) + ) + ) + (gp-0 (-> v1-1 ripple)) + (s5-0 (-> gp-0 waveform)) + ) + (if (not (-> gp-0 waveform)) + (return f30-0) + ) + (if (not (-> s5-0 converted)) + (return f30-0) + ) + (let* ((f28-0 (- (-> arg2 x) (-> arg0 root trans x))) + (f26-0 (- (-> arg2 z) (-> arg0 root trans z))) + (f22-0 (+ (quaternion-y-angle (-> arg0 root quat)) (-> s4-0 angle))) + (f24-0 (cos f22-0)) + (f1-3 (sin f22-0)) + (f0-4 (- (* f28-0 f24-0) (* f26-0 f1-3))) + (f1-5 (+ (* f26-0 f24-0) (* f28-0 f1-3))) + (f2-3 (/ 1.0 (-> s4-0 grid-size))) + (f28-1 (* f2-3 (- f0-4 (-> s4-0 x-base)))) + (f26-1 (* f2-3 (- f1-5 (-> s4-0 z-base)))) + ) + (ripple-update-waveform-offs s5-0) + (let* ((f22-1 (the float (the int f28-1))) + (f24-1 (the float (the int f26-1))) + (f20-0 (ripple-slow-add-sine-waves s5-0 f22-1 f24-1)) + ) + (set! sv-16 (ripple-slow-add-sine-waves s5-0 (+ 1.0 f22-1) f24-1)) + (set! sv-32 (ripple-slow-add-sine-waves s5-0 f22-1 (+ 1.0 f24-1))) + (let* + ((f1-6 (ripple-slow-add-sine-waves s5-0 (+ 1.0 f22-1) (+ 1.0 f24-1))) + (f0-22 (+ f20-0 (* (- f28-1 f22-1) (- sv-16 f20-0)))) + (f1-9 (+ sv-32 (* (- f28-1 f22-1) (- f1-6 sv-32)))) + (f1-12 (+ f0-22 (* (- f26-1 f24-1) (- f1-9 f0-22)))) + (f0-23 (-> gp-0 faded-scale)) + ) + (if (< f0-23 0.0) + (set! f0-23 (-> gp-0 global-scale)) + ) + (+ f30-0 (* (* 0.0078125 f1-12) f0-23)) + ) + ) + ) + ) + ) + ) diff --git a/goal_src/engine/math/transformq-h.gc b/goal_src/engine/math/transformq-h.gc index 1e0af09dda..ce412ab9a8 100644 --- a/goal_src/engine/math/transformq-h.gc +++ b/goal_src/engine/math/transformq-h.gc @@ -65,30 +65,13 @@ (defmethod global-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) "Get the angle from the position of this trsqv to the point arg0." - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (vector-y-angle - (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans)) - ) - ) + (vector-y-angle (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans))) ) (defmethod relative-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) "Get the y angle between here and arg0, starting at whatever angle we're currently at." - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - - (deg-diff - (y-angle obj) - (vector-y-angle (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans))) - ) - ) + (deg-diff + (y-angle obj) + (vector-y-angle (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans))) + ) ) diff --git a/goal_src/engine/physics/trajectory.gc b/goal_src/engine/physics/trajectory.gc index 221be2f584..00e4910e57 100644 --- a/goal_src/engine/physics/trajectory.gc +++ b/goal_src/engine/physics/trajectory.gc @@ -34,43 +34,21 @@ ;; definition for method 11 of type trajectory ;; INFO: Return type mismatch int vs none. ;; Used lq/sq -(defmethod - TODO-RENAME-11 - trajectory - ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (let ((v1-0 (-> obj initial-position))) - (set! (-> v1-0 quad) (-> arg0 quad)) - ) - (set! (-> obj gravity) arg3) - (set! (-> obj time) arg2) - (let ((f0-3 (/ (vector-vector-xz-distance arg1 arg0) arg2))) - (let ((a1-2 (-> obj initial-velocity))) - (let ((v1-1 arg1) - (a0-4 arg0) - ) - (.lvf vf4 (&-> v1-1 quad)) - (.lvf vf5 (&-> a0-4 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-2 quad) vf6) - ) +(defmethod TODO-RENAME-11 trajectory ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) + (set! (-> obj initial-position quad) (-> arg0 quad)) + (set! (-> obj gravity) arg3) + (set! (-> obj time) arg2) + (let ((f0-3 (/ (vector-vector-xz-distance arg1 arg0) arg2))) + (vector-! (-> obj initial-velocity) arg1 arg0) (vector-xz-normalize! (-> obj initial-velocity) f0-3) ) - (set! - (-> obj initial-velocity y) - (- (/ (- (-> arg1 y) (-> arg0 y)) arg2) (* (* 0.5 arg2) (-> obj gravity))) - ) - (let ((v0-2 0)) - ) - (none) + (set! + (-> obj initial-velocity y) + (- (/ (- (-> arg1 y) (-> arg0 y)) arg2) (* (* 0.5 arg2) (-> obj gravity))) ) + (let ((v0-2 0)) + ) + (none) ) ;; definition for method 12 of type trajectory diff --git a/goal_src/engine/target/joint-mod-h.gc b/goal_src/engine/target/joint-mod-h.gc index 54390765ef..235ed73ff3 100644 --- a/goal_src/engine/target/joint-mod-h.gc +++ b/goal_src/engine/target/joint-mod-h.gc @@ -337,268 +337,279 @@ (defun joint-mod-look-at-handler ((csp cspace) (xform transformq)) "Update bone transforms for look-at" - (local-vars - (v0-20 quaternion) - (f1-12 float) - (sv-48 vector) - (sv-52 vector) - (sv-56 vector) - ) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (let ((gp-0 (the-as joint-mod (-> csp param1)))) - (cspace<-parented-transformq-joint! csp xform) - (set! sv-48 (vector-normalize-copy! - (new 'stack-no-clear 'vector) - (-> gp-0 process node-list data 0 bone transform vector 1) - 1.0 - ) - ) - (set! sv-52 (vector-normalize! (-> (-> csp bone) transform vector (-> gp-0 nose)) 1.0)) - (let ((t9-3 vector-normalize!) - (a0-5 (new 'stack-no-clear 'vector)) - ) - (let ((v1-6 (-> gp-0 target)) - (a1-5 (-> csp bone transform vector 3)) - ) - (.lvf vf4 (&-> v1-6 quad)) - (.lvf vf5 (&-> a1-5 quad)) + (local-vars (f1-12 float) (sv-48 vector) (sv-52 vector) (sv-56 vector)) + (let ((gp-0 (the-as joint-mod (-> csp param1)))) + (cspace<-parented-transformq-joint! csp xform) + (set! + sv-48 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> gp-0 process node-list data 0 bone transform vector 1) + 1.0 + ) + ) + (set! + sv-52 + (vector-normalize! (-> csp bone transform vector (-> gp-0 nose)) 1.0) + ) + (set! + sv-56 + (vector-normalize! + (vector-! + (new 'stack-no-clear 'vector) + (-> gp-0 target) + (-> csp bone position) + ) + 1.0 + ) + ) + (let* ((f30-0 (vector-y-angle sv-52)) + (a0-8 (vector-flatten! (new-stack-vector0) sv-56 sv-48)) + (f0-0 (vector-y-angle a0-8)) + (f0-1 (deg-diff f30-0 f0-0)) + ) + (if (< (-> gp-0 ignore-angle) (fabs f0-1)) + (set! f0-1 0.0) ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a0-5 quad) vf6) - (set! sv-56 (t9-3 a0-5 1.0)) + (let + ((f30-1 + (fmax + (fmin + (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max y) + ) + (- (-> gp-0 twist-max y)) + ) + ) + ) + (if (and (-> gp-0 shutting-down?) (= (-> gp-0 twist y) f30-1)) + (set-mode! gp-0 (joint-mod-handler-mode reset)) + ) + (set! + (-> gp-0 twist y) + (deg-seek + (-> gp-0 twist y) + f30-1 + (* 0.1 (fabs (deg-diff f30-1 (-> gp-0 twist y)))) + ) + ) ) + ) + (let ((v1-15 (-> gp-0 up))) + (cond + ((zero? v1-15) + (quaternion-rotate-x! (-> xform quat) (-> xform quat) (-> gp-0 twist y)) + ) + ((= v1-15 1) + (quaternion-rotate-local-y! + (-> xform quat) + (-> xform quat) + (-> gp-0 twist y) + ) + ) + (else + (quaternion-rotate-z! (-> xform quat) (-> xform quat) (-> gp-0 twist y)) + ) + ) + ) + (let* + ((s3-1 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (the-as vector (-> gp-0 process node-list data 0 bone transform)) + 1.0 + ) + ) + (f30-2 (vector-x-angle sv-52)) + (s3-2 (vector-flatten! (new-stack-vector0) sv-56 s3-1)) + (f0-15 (vector-x-angle s3-2)) + (f0-21 + (fmax + (fmin + (* (* (- (deg-diff f30-2 f0-15)) (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max x) + ) + (- (-> gp-0 twist-max x)) + ) + ) + ) + (let* ((v1-22 sv-52)) + (set! f1-12 (vector-dot s3-2 v1-22)) + ) + (if (< f1-12 0.1) + (set! f0-21 0.0) + ) + (set! + (-> gp-0 twist x) + (deg-seek + (-> gp-0 twist x) + f0-21 + (* 0.1 (fabs (deg-diff f0-21 (-> gp-0 twist x)))) + ) + ) + ) + (let ((v1-27 (-> gp-0 ear))) + (cond + ((zero? v1-27) + (quaternion-rotate-x! (-> xform quat) (-> xform quat) (-> gp-0 twist x)) + ) + ((= v1-27 1) + (quaternion-rotate-local-y! (-> xform quat) (-> xform quat) (-> gp-0 twist x)) + ) + (else + (quaternion-rotate-z! (-> xform quat) (-> xform quat) (-> gp-0 twist x)) + ) + ) + ) + (cspace<-parented-transformq-joint! csp xform) + (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) + (add-debug-text-sphere + *display-target-marks* + (bucket-id debug-draw1) + (-> gp-0 target) + 819.2 + "look" + (new 'static 'rgba :r #xff :g #xff :a #x80) + ) + ) + ) + (none) + ) + +(defun joint-mod-world-look-at-handler ((arg0 cspace) (arg1 transformq)) + (local-vars (f1-14 float) (sv-48 vector) (sv-52 vector) (sv-56 vector)) + (let ((gp-0 (the-as joint-mod (-> arg0 param1)))) + (let ((s5-0 (-> arg0 bone transform))) + (cspace<-parented-transformq-joint! arg0 arg1) + (set! + sv-48 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> gp-0 process node-list data 0 bone transform vector 1) + 1.0 + ) + ) + (set! sv-52 (vector-normalize! (-> s5-0 vector (-> gp-0 nose)) 1.0)) + (set! + sv-56 + (vector-normalize! + (vector-! + (new 'stack-no-clear 'vector) + (-> gp-0 target) + (-> s5-0 vector 3) + ) + 1.0 + ) + ) (let* ((f30-0 (vector-y-angle sv-52)) - (t9-5 vector-flatten!) - (a0-7 (new-stack-vector0)) - (a0-8 (t9-5 a0-7 sv-56 sv-48)) - (f0-0 (vector-y-angle a0-8)) + (a0-6 (vector-flatten! (new-stack-vector0) sv-56 sv-48)) + (f0-0 (vector-y-angle a0-6)) (f0-1 (deg-diff f30-0 f0-0)) ) (if (< (-> gp-0 ignore-angle) (fabs f0-1)) (set! f0-1 0.0) ) - (let ((f30-1 - (fmax (fmin (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) (-> gp-0 twist-max y)) - (- (-> gp-0 twist-max y)) - ) + (let + ((f0-5 + (fmax + (fmin + (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max y) ) - ) - (if (and (-> gp-0 shutting-down?) (= (-> gp-0 twist y) f30-1)) - (set-mode! gp-0 (joint-mod-handler-mode reset)) - ) - (set! (-> gp-0 twist y) - (deg-seek (-> gp-0 twist y) f30-1 (* 0.1 (fabs (deg-diff f30-1 (-> gp-0 twist y))))) - ) - ) - ) - (let ((v1-15 (-> gp-0 up))) - (cond - ((zero? v1-15) - (quaternion-rotate-x! (the-as quaternion (-> xform rot)) (the-as quaternion (-> xform rot)) (-> gp-0 twist y)) - ) - ((= v1-15 1) - (quaternion-rotate-local-y! (the-as quaternion (-> xform rot)) (the-as quaternion (-> xform rot)) (-> gp-0 twist y)) - ) - (else - (quaternion-rotate-z! (the-as quaternion (-> xform rot)) (the-as quaternion (-> xform rot)) (-> gp-0 twist y)) - ) - ) - ) - (let* ((s3-1 - (vector-normalize-copy! - (new 'stack-no-clear 'vector) - (the-as vector (-> gp-0 process node-list data 0 bone transform)) - 1.0 + (- (-> gp-0 twist-max y)) ) ) - (f30-2 (vector-x-angle sv-52)) - (t9-16 vector-flatten!) - (a0-19 (new-stack-vector0)) - (s3-2 (t9-16 a0-19 sv-56 s3-1)) - (f0-15 (vector-x-angle s3-2)) - (f0-21 - (fmax (fmin (* (* (- (deg-diff f30-2 f0-15)) (-> gp-0 blend)) (-> gp-0 flex-blend)) (-> gp-0 twist-max x)) - (- (-> gp-0 twist-max x)) - ) - ) ) - (let* ((v1-22 sv-52)) - (set! f1-12 (vector-dot s3-2 v1-22)) - ) - (if (< f1-12 0.1) - (set! f0-21 0.0) + (set! + (-> gp-0 twist y) + (deg-seek + (-> gp-0 twist y) + f0-5 + (fmax 1.0 (* 0.1 (fabs (deg-diff f0-5 (-> gp-0 twist y))))) ) - (set! (-> gp-0 twist x) - (deg-seek (-> gp-0 twist x) f0-21 (* 0.1 (fabs (deg-diff f0-21 (-> gp-0 twist x))))) + ) + ) + ) + (when (!= (-> gp-0 twist y) 0.0) + (let + ((a2-3 (matrix-rotate-y! (new 'stack-no-clear 'matrix) (-> gp-0 twist y))) + (s4-2 (-> s5-0 vector 3 quad)) + ) + (matrix*! s5-0 s5-0 a2-3) + (set! (-> s5-0 vector 3 quad) s4-2) + ) + ) + (let* + ((s4-3 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (the-as vector (-> gp-0 process node-list data 0 bone transform)) + 1.0 + ) + ) + (f30-2 (vector-x-angle sv-52)) + (s4-4 (vector-flatten! (new-stack-vector0) sv-56 s4-3)) + (f0-14 (vector-x-angle s4-4)) + (f0-20 + (fmax + (fmin + (* (* (- (deg-diff f30-2 f0-14)) (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max x) ) - ) - (let ((v1-27 (-> gp-0 ear))) - (cond - ((zero? v1-27) - (set! v0-20 - (quaternion-rotate-x! (the-as quaternion (-> xform rot)) (the-as quaternion (-> xform rot)) (-> gp-0 twist x)) - ) - ) - ((= v1-27 1) - (set! v0-20 - (quaternion-rotate-local-y! (the-as quaternion (-> xform rot)) (the-as quaternion (-> xform rot)) (-> gp-0 twist x))) - ) - (else - (set! v0-20 - (quaternion-rotate-z! (the-as quaternion (-> xform rot)) (the-as quaternion (-> xform rot)) (-> gp-0 twist x)) - ) + (- (-> gp-0 twist-max x)) + ) + ) ) + (let* ((v1-14 sv-52)) + (set! f1-14 (vector-dot s4-4 v1-14)) ) - ) - (cspace<-parented-transformq-joint! csp xform) - (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) - (add-debug-text-sphere - *display-target-marks* - (bucket-id debug-draw1) - (-> gp-0 target) - 819.2 - "look" - (new 'static 'rgba :r #xff :g #xff :a #x80) - ) + (if (< f1-14 0.1) + (set! f0-20 0.0) + ) + (set! + (-> gp-0 twist x) + (deg-seek + (-> gp-0 twist x) + f0-20 + (fmax 1.0 (* 0.1 (fabs (deg-diff f0-20 (-> gp-0 twist x))))) ) - ) - (none) - ) - ) - -(defun joint-mod-world-look-at-handler ((arg0 cspace) (arg1 transformq)) - (local-vars (f1-14 float) (sv-48 vector) (sv-52 vector) (sv-56 vector)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) ) - (init-vf0-vector) - (let ((gp-0 (the-as joint-mod (-> arg0 param1)))) - (let ((s5-0 (-> arg0 bone transform))) - (cspace<-parented-transformq-joint! arg0 arg1) - (set! sv-48 (vector-normalize-copy! - (new 'stack-no-clear 'vector) - (-> gp-0 process node-list data 0 bone transform vector 1) - 1.0 - ) - ) - (set! sv-52 (vector-normalize! (-> s5-0 vector (-> gp-0 nose)) 1.0)) - (let ((t9-3 vector-normalize!) - (a0-3 (new 'stack-no-clear 'vector)) - ) - (let ((v1-7 (-> gp-0 target)) - (a1-3 (-> s5-0 vector 3)) - ) - (.lvf vf4 (&-> v1-7 quad)) - (.lvf vf5 (&-> a1-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a0-3 quad) vf6) - (set! sv-56 (t9-3 a0-3 1.0)) - ) - (let* ((f30-0 (vector-y-angle sv-52)) - (t9-5 vector-flatten!) - (a0-5 (new-stack-vector0)) - (a0-6 (t9-5 a0-5 sv-56 sv-48)) - (f0-0 (vector-y-angle a0-6)) - (f0-1 (deg-diff f30-0 f0-0)) - ) - (if (< (-> gp-0 ignore-angle) (fabs f0-1)) - (set! f0-1 0.0) - ) - (let ((f0-5 - (fmax (fmin (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) (-> gp-0 twist-max y)) - (- (-> gp-0 twist-max y)) + ) + (when (!= (-> gp-0 twist x) 0.0) + (let* ((v1-20 (-> gp-0 ear)) + (a1-17 ((cond + ((zero? v1-20) + matrix-rotate-x! + ) + ((= v1-20 1) + matrix-rotate-y! + ) + (else + matrix-rotate-z! + ) + ) + (new 'stack-no-clear 'matrix) (-> gp-0 twist x) ) - ) - ) - (set! (-> gp-0 twist y) - (deg-seek (-> gp-0 twist y) f0-5 (fmax 1.0 (* 0.1 (fabs (deg-diff f0-5 (-> gp-0 twist y)))))) - ) - ) - ) - (when (!= (-> gp-0 twist y) 0.0) - (let ((a2-3 (matrix-rotate-y! (new 'stack-no-clear 'matrix) (-> gp-0 twist y))) - (s4-2 (-> s5-0 vector 3 quad)) - ) - (matrix*! s5-0 s5-0 a2-3) - (set! (-> s5-0 vector 3 quad) s4-2) - ) - ) - (let* ((s4-3 (vector-normalize-copy! - (new 'stack-no-clear 'vector) - (the-as vector (-> gp-0 process node-list data 0 bone transform)) - 1.0 - ) - ) - (f30-2 (vector-x-angle sv-52)) - (t9-14 vector-flatten!) - (a0-14 (new-stack-vector0)) - (s4-4 (t9-14 a0-14 sv-56 s4-3)) - (f0-14 (vector-x-angle s4-4)) - (f0-20 (fmax (fmin (* (* (- (deg-diff f30-2 f0-14)) (-> gp-0 blend)) (-> gp-0 flex-blend)) (-> gp-0 twist-max x)) - (- (-> gp-0 twist-max x)) - ) ) ) - (let* ((v1-14 sv-52)) - (set! f1-14 (vector-dot s4-4 v1-14)) - ) - (if (< f1-14 0.1) - (set! f0-20 0.0) - ) - (let ((v0-17 (the-as object - (deg-seek (-> gp-0 twist x) f0-20 - (fmax 1.0 (* 0.1 (fabs (deg-diff f0-20 (-> gp-0 twist x))))) - ) - ) - ) - ) - (set! (-> gp-0 twist x) (the-as float v0-17)) - (when (!= (-> gp-0 twist x) 0.0) - (let* ((v1-20 (-> gp-0 ear)) - (a1-17 ((cond - ((zero? v1-20) - matrix-rotate-x! - ) - ((= v1-20 1) - matrix-rotate-y! - ) - (else - matrix-rotate-z! - ) - ) - (new 'stack-no-clear 'matrix) (-> gp-0 twist x) - ) - ) - ) - (set! v0-17 (matrix*! s5-0 a1-17 s5-0)) - ) - ) - ) + (matrix*! s5-0 a1-17 s5-0) ) ) - (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) - (add-debug-text-sphere - *display-target-marks* - (bucket-id debug-draw1) - (-> gp-0 target) - 819.2 - "look" - (new 'static 'rgba :r #xff :g #xff :a #x80) - ) - ) ) - (none) + (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) + (add-debug-text-sphere + *display-target-marks* + (bucket-id debug-draw1) + (-> gp-0 target) + 819.2 + "look" + (new 'static 'rgba :r #xff :g #xff :a #x80) + ) + ) ) + (let ((v0-22 0)) + ) + (none) ) (defun joint-mod-rotate-handler ((arg0 cspace) (arg1 transformq)) @@ -620,13 +631,7 @@ ) ) ) - (quaternion-normalize! - (quaternion*! - (the-as quaternion (-> arg1 rot)) - a1-2 - (the-as quaternion (-> arg1 rot)) - ) - ) + (quaternion-normalize! (quaternion*! (-> arg1 quat) a1-2 (-> arg1 quat))) ) (let* ((v1-6 (-> s3-0 (-> s4-0 up))) (a1-4 (quaternion-axis-angle! @@ -638,13 +643,7 @@ ) ) ) - (quaternion-normalize! - (quaternion*! - (the-as quaternion (-> arg1 rot)) - a1-4 - (the-as quaternion (-> arg1 rot)) - ) - ) + (quaternion-normalize! (quaternion*! (-> arg1 quat) a1-4 (-> arg1 quat))) ) (let* ((v1-10 (-> s3-0 (-> s4-0 nose))) (a1-6 (quaternion-axis-angle! @@ -656,13 +655,7 @@ ) ) ) - (quaternion-normalize! - (quaternion*! - (the-as quaternion (-> arg1 rot)) - a1-6 - (the-as quaternion (-> arg1 rot)) - ) - ) + (quaternion-normalize! (quaternion*! (-> arg1 quat) a1-6 (-> arg1 quat))) ) ) (cspace<-parented-transformq-joint! arg0 arg1) @@ -671,18 +664,17 @@ (defun joint-mod-joint-set-handler ((arg0 cspace) (arg1 transformq)) (let ((s4-0 (the-as joint-mod (-> arg0 param1)))) - (let ((v1-0 (-> arg1 trans))) - (set! (-> v1-0 quad) (-> s4-0 trans quad)) - ) - (quaternion-copy! (the-as quaternion (-> arg1 rot)) (-> s4-0 quat)) - (let ((v1-1 (-> arg1 scale))) - (set! (-> v1-1 quad) (-> s4-0 scale quad)) - ) + (set! (-> arg1 trans quad) (-> s4-0 trans quad)) + (quaternion-copy! (-> arg1 quat) (-> s4-0 quat)) + (set! (-> arg1 scale quad) (-> s4-0 scale quad)) ) (cspace<-parented-transformq-joint! arg0 arg1) + (let ((v0-2 0)) + ) (none) ) +;; todo vector+! (defun joint-mod-joint-set*-handler ((arg0 cspace) (arg1 transformq)) (rlet ((vf0 :class vf) (vf4 :class vf) @@ -751,58 +743,40 @@ ) ) +;; todo needs better vector-dot stuff (defun joint-mod-wheel-callback ((arg0 cspace) (arg1 transformq)) (local-vars (f0-3 float)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (let ((s4-0 (the-as joint-mod-wheel (-> arg0 param1)))) - (let ((v1-1 (-> s4-0 process root)) - (s1-0 (new-stack-vector0)) - (s3-0 (new-stack-vector0)) - (s2-0 (new-stack-vector0)) - ) - (let ((f0-0 0.0)) + (let ((s4-0 (the-as joint-mod-wheel (-> arg0 param1)))) + (let ((v1-1 (-> s4-0 process root)) + (s1-0 (new-stack-vector0)) + (s3-0 (new-stack-vector0)) + (s2-0 (new-stack-vector0)) ) - (let ((f0-1 0.0)) - ) - (vector-z-quaternion! s2-0 (the-as quaternion (-> v1-1 rot))) - (vector<-cspace! s1-0 arg0) - (let ((a1-3 s3-0)) - (let ((v1-2 s1-0) - (a0-3 (-> s4-0 last-position)) - ) - (.lvf vf4 (&-> v1-2 quad)) - (.lvf vf5 (&-> a0-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-3 quad) vf6) - ) - (let ((v1-3 (-> s4-0 last-position))) - (set! (-> v1-3 quad) (-> s1-0 quad)) - ) - (set! f0-3 (vector-dot s2-0 s3-0)) + (let ((f0-0 0.0)) ) - (let* ((f0-4 f0-3) - (f1-1 65536.0) - (f2-2 (* 6.28318 (-> s4-0 wheel-radius))) - (f0-5 (* (* f1-1 (/ 1.0 f2-2)) f0-4)) - ) - (set! (-> s4-0 angle) (+ (-> s4-0 angle) f0-5)) + (let ((f0-1 0.0)) ) - (quaternion-vector-angle! - (the-as quaternion (-> arg1 rot)) - (-> *joint-axis-vectors* (-> s4-0 wheel-axis)) - (-> s4-0 angle) - ) + (vector-z-quaternion! s2-0 (-> v1-1 quat)) + (vector<-cspace! s1-0 arg0) + (vector-! s3-0 s1-0 (-> s4-0 last-position)) + (set! (-> s4-0 last-position quad) (-> s1-0 quad)) + (set! f0-3 (vector-dot s2-0 s3-0)) ) - (cspace<-parented-transformq-joint! arg0 arg1) - (none) + (let* ((f0-4 f0-3) + (f1-1 65536.0) + (f2-2 (* 6.28318 (-> s4-0 wheel-radius))) + (f0-5 (* (* f1-1 (/ 1.0 f2-2)) f0-4)) + ) + (set! (-> s4-0 angle) (+ (-> s4-0 angle) f0-5)) + ) + (quaternion-vector-angle! + (-> arg1 quat) + (-> *joint-axis-vectors* (-> s4-0 wheel-axis)) + (-> s4-0 angle) + ) ) + (cspace<-parented-transformq-joint! arg0 arg1) + (none) ) (defmethod new joint-mod-wheel ((allocation symbol) (type-to-make type) (arg0 process-drawable) (arg1 int) (arg2 float) (arg3 int)) @@ -845,21 +819,15 @@ (let ((v1-0 (the-as joint-mod-set-local (-> arg0 param1)))) (cond ((-> v1-0 enable) - (when (not (-> v1-0 set-translation)) - (let ((a2-3 (-> v1-0 transform))) - (set! (-> a2-3 trans quad) (-> arg1 trans quad)) + (if (not (-> v1-0 set-translation)) + (set! (-> v1-0 transform trans quad) (-> arg1 trans quad)) ) - ) - (when (not (-> v1-0 set-rotation)) - (let ((a2-6 (-> v1-0 transform rot))) - (set! (-> a2-6 quad) (-> arg1 rot quad)) + (if (not (-> v1-0 set-rotation)) + (set! (-> v1-0 transform quat vec quad) (-> arg1 quat vec quad)) ) - ) - (when (not (-> v1-0 set-scale)) - (let ((a2-9 (-> v1-0 transform scale))) - (set! (-> a2-9 quad) (-> arg1 scale quad)) + (if (not (-> v1-0 set-scale)) + (set! (-> v1-0 transform scale quad) (-> arg1 scale quad)) ) - ) (cspace<-parented-transformq-joint! arg0 (-> v1-0 transform)) ) (else @@ -876,16 +844,10 @@ (set! (-> v0-0 set-rotation) arg3) (set! (-> v0-0 set-scale) arg4) (set! (-> v0-0 enable) #t) - (let ((v1-3 (-> v0-0 transform))) - (set! (-> v1-3 trans quad) (-> *null-vector* quad)) - ) - (let ((v1-4 (-> v0-0 transform rot))) - (set! (-> v1-4 quad) (-> *null-vector* quad)) - ) - (let ((v1-5 (-> v0-0 transform scale))) - (set! (-> v1-5 quad) (-> *identity-vector* quad)) - ) - (let ((v1-8 (-> (-> arg0 node-list) data arg1))) + (set! (-> v0-0 transform trans quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform quat vec quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform scale quad) (-> *identity-vector* quad)) + (let ((v1-8 (-> arg0 node-list data arg1))) (set! (-> v1-8 param0) joint-mod-set-local-callback) (set! (-> v1-8 param1) v0-0) ) @@ -920,16 +882,10 @@ (let ((v0-0 (object-new allocation type-to-make (the-as int (-> type-to-make size))))) (set! (-> v0-0 node-index) arg1) (set! (-> v0-0 enable) arg2) - (let ((v1-2 (-> v0-0 transform))) - (set! (-> v1-2 trans quad) (-> *null-vector* quad)) - ) - (let ((v1-3 (-> v0-0 transform rot))) - (set! (-> v1-3 quad) (-> *null-vector* quad)) - ) - (let ((v1-4 (-> v0-0 transform scale))) - (set! (-> v1-4 quad) (-> *identity-vector* quad)) - ) - (let ((v1-7 (-> (-> arg0 node-list) data arg1))) + (set! (-> v0-0 transform trans quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform quat vec quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform scale quad) (-> *identity-vector* quad)) + (let ((v1-7 (-> arg0 node-list data arg1))) (set! (-> v1-7 param0) joint-mod-set-world-callback) (set! (-> v1-7 param1) v0-0) ) @@ -969,9 +925,9 @@ (-> gp-0 blend) ) (quaternion-slerp! - (the-as quaternion (-> gp-0 blend-transform rot)) - (the-as quaternion (-> arg1 rot)) - (the-as quaternion (-> gp-0 transform rot)) + (-> gp-0 blend-transform quat) + (-> arg1 quat) + (-> gp-0 transform quat) (-> gp-0 blend) ) (cspace<-parented-transformq-joint! arg0 (-> gp-0 blend-transform)) @@ -989,16 +945,10 @@ (set! (-> v0-0 node-index) arg1) (set! (-> v0-0 enable) arg2) (set! (-> v0-0 blend) 0.0) - (let ((v1-2 (-> v0-0 transform))) - (set! (-> v1-2 trans quad) (-> *null-vector* quad)) - ) - (let ((v1-3 (-> v0-0 transform rot))) - (set! (-> v1-3 quad) (-> *null-vector* quad)) - ) - (let ((v1-4 (-> v0-0 transform scale))) - (set! (-> v1-4 quad) (-> *identity-vector* quad)) - ) - (let ((v1-7 (-> (-> arg0 node-list) data arg1))) + (set! (-> v0-0 transform trans quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform quat vec quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform scale quad) (-> *identity-vector* quad)) + (let ((v1-7 (-> arg0 node-list data arg1))) (set! (-> v1-7 param0) joint-mod-blend-local-callback) (set! (-> v1-7 param1) v0-0) ) @@ -1034,11 +984,7 @@ (if (< f30-0 -32768.0) (set! f30-0 (+ 65536.0 f30-0)) ) - (quaternion-vector-angle! - (the-as quaternion (-> arg1 rot)) - (-> gp-0 spin-axis) - f30-0 - ) + (quaternion-vector-angle! (-> arg1 quat) (-> gp-0 spin-axis) f30-0) (set! (-> gp-0 angle) f30-0) ) ) diff --git a/goal_src/engine/util/sync-info.gc b/goal_src/engine/util/sync-info.gc index 6c02d57ec7..375f052d07 100644 --- a/goal_src/engine/util/sync-info.gc +++ b/goal_src/engine/util/sync-info.gc @@ -580,122 +580,102 @@ (vf5 :class vf) (vf6 :class vf) ) - (init-vf0-vector) - (let ((s5-0 (new 'stack-no-clear 'vector))) - (cond - (arg0 - (let ((a0-1 s5-0)) - (let ((v1-0 (-> obj target))) - (.mov.vf vf6 vf0 :mask #b1000) - (.lvf vf4 (&-> v1-0 quad)) - ) - (.lvf vf5 (&-> arg0 quad)) - (.add.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a0-1 quad) vf6) - ) - (let ((a1-1 s5-0)) - (let ((v1-1 s5-0) - (a0-2 (-> obj value)) + (init-vf0-vector) + (let ((s5-0 (new 'stack-no-clear 'vector))) + (cond + (arg0 + (let ((a0-1 s5-0)) + (let ((v1-0 (-> obj target))) + (.mov.vf vf6 vf0 :mask #b1000) + (.lvf vf4 (&-> v1-0 quad)) ) - (.lvf vf4 (&-> v1-1 quad)) - (.lvf vf5 (&-> a0-2 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-1 quad) vf6) - ) - ) - (else - (let ((a1-2 s5-0)) - (let ((v1-2 (-> obj target)) - (a0-3 (-> obj value)) - ) - (.lvf vf4 (&-> v1-2 quad)) - (.lvf vf5 (&-> a0-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-2 quad) vf6) - ) - ) - ) - (let ((v1-3 s5-0)) - (let ((a0-4 s5-0) - (f0-1 (* (-> obj accel) (-> *display* time-adjust-ratio))) + (.lvf vf5 (&-> arg0 quad)) + (.add.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> a0-1 quad) vf6) ) - (.lvf vf1 (&-> a0-4 quad)) - (let ((a0-5 f0-1)) - (.mov vf2 a0-5) - ) - ) - (.add.x.vf vf1 vf0 vf0 :mask #b1000) - (.mul.x.vf vf1 vf1 vf2 :mask #b111) - (.svf (&-> v1-3 quad) vf1) - ) - (let ((a1-4 (-> obj vel))) - (let ((v1-4 (-> obj vel)) - (a0-6 s5-0) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.lvf vf4 (&-> v1-4 quad)) - (.lvf vf5 (&-> a0-6 quad)) - ) - (.add.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-4 quad) vf6) - ) - (let ((f0-2 (vector-length (-> obj vel)))) - (when (< (-> obj max-vel) f0-2) - (let ((v1-6 (-> obj vel))) - (let ((a0-8 (-> obj vel)) - (f0-3 (/ (-> obj max-vel) f0-2)) - ) - (.lvf vf1 (&-> a0-8 quad)) - (let ((a0-9 f0-3)) - (.mov vf2 a0-9) + (vector-! s5-0 s5-0 (-> obj value)) + ) + (else + (vector-! s5-0 (-> obj target) (-> obj value)) ) ) - (.add.x.vf vf1 vf0 vf0 :mask #b1000) - (.mul.x.vf vf1 vf1 vf2 :mask #b111) - (.svf (&-> v1-6 quad) vf1) - ) + (let ((v1-3 s5-0)) + (let ((a0-4 s5-0) + (f0-1 (* (-> obj accel) (-> *display* time-adjust-ratio))) + ) + (.lvf vf1 (&-> a0-4 quad)) + (let ((a0-5 f0-1)) + (.mov vf2 a0-5) + ) + ) + (.add.x.vf vf1 vf0 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> v1-3 quad) vf1) + ) + (let ((a1-4 (-> obj vel))) + (let ((v1-4 (-> obj vel)) + (a0-6 s5-0) + ) + (.mov.vf vf6 vf0 :mask #b1000) + (.lvf vf4 (&-> v1-4 quad)) + (.lvf vf5 (&-> a0-6 quad)) + ) + (.add.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> a1-4 quad) vf6) + ) + (let ((f0-2 (vector-length (-> obj vel)))) + (when (< (-> obj max-vel) f0-2) + (let ((v1-6 (-> obj vel))) + (let ((a0-8 (-> obj vel)) + (f0-3 (/ (-> obj max-vel) f0-2)) + ) + (.lvf vf1 (&-> a0-8 quad)) + (let ((a0-9 f0-3)) + (.mov vf2 a0-9) + ) + ) + (.add.x.vf vf1 vf0 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> v1-6 quad) vf1) + ) + ) + ) + (let ((v1-7 (-> obj vel))) + (let ((a0-10 (-> obj vel)) + (f0-4 (-> obj damping)) + ) + (.lvf vf1 (&-> a0-10 quad)) + (let ((a0-11 f0-4)) + (.mov vf2 a0-11) + ) + ) + (.add.x.vf vf1 vf0 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> v1-7 quad) vf1) + ) + (let ((v1-8 s5-0)) + (let ((a0-12 (-> obj vel)) + (f0-5 (-> *display* time-adjust-ratio)) + ) + (.lvf vf1 (&-> a0-12 quad)) + (let ((a0-13 f0-5)) + (.mov vf2 a0-13) + ) + ) + (.add.x.vf vf1 vf0 vf0 :mask #b1000) + (.mul.x.vf vf1 vf1 vf2 :mask #b111) + (.svf (&-> v1-8 quad) vf1) + ) + (let ((a0-14 (-> obj value))) + (let ((v1-9 (-> obj value))) + (.mov.vf vf6 vf0 :mask #b1000) + (.lvf vf4 (&-> v1-9 quad)) + ) + (.lvf vf5 (&-> s5-0 quad)) + (.add.vf vf6 vf4 vf5 :mask #b111) + (.svf (&-> a0-14 quad) vf6) + ) ) - ) - (let ((v1-7 (-> obj vel))) - (let ((a0-10 (-> obj vel)) - (f0-4 (-> obj damping)) - ) - (.lvf vf1 (&-> a0-10 quad)) - (let ((a0-11 f0-4)) - (.mov vf2 a0-11) - ) - ) - (.add.x.vf vf1 vf0 vf0 :mask #b1000) - (.mul.x.vf vf1 vf1 vf2 :mask #b111) - (.svf (&-> v1-7 quad) vf1) - ) - (let ((v1-8 s5-0)) - (let ((a0-12 (-> obj vel)) - (f0-5 (-> *display* time-adjust-ratio)) - ) - (.lvf vf1 (&-> a0-12 quad)) - (let ((a0-13 f0-5)) - (.mov vf2 a0-13) - ) - ) - (.add.x.vf vf1 vf0 vf0 :mask #b1000) - (.mul.x.vf vf1 vf1 vf2 :mask #b111) - (.svf (&-> v1-8 quad) vf1) - ) - (let ((a0-14 (-> obj value))) - (let ((v1-9 (-> obj value))) - (.mov.vf vf6 vf0 :mask #b1000) - (.lvf vf4 (&-> v1-9 quad)) - ) - (.lvf vf5 (&-> s5-0 quad)) - (.add.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a0-14 quad) vf6) - ) + (-> obj value) ) - (-> obj value) - ) ) diff --git a/test/decompiler/reference/engine/camera/cam-interface_REF.gc b/test/decompiler/reference/engine/camera/cam-interface_REF.gc index 2753e1255d..68d873eec0 100644 --- a/test/decompiler/reference/engine/camera/cam-interface_REF.gc +++ b/test/decompiler/reference/engine/camera/cam-interface_REF.gc @@ -104,7 +104,7 @@ (-> gp-0 trans quad) (-> (the-as transform (-> arg0 extra)) scale quad) ) - (quaternion-copy! (the-as quaternion (-> gp-0 rot)) (-> arg0 quat)) + (quaternion-copy! (-> gp-0 quat) (-> arg0 quat)) (vector-identity! (-> gp-0 scale)) (let ((a1-2 (new 'stack-no-clear 'event-message-block))) (set! (-> a1-2 from) pp) @@ -123,4 +123,4 @@ ;; failed to figure out what this is: (none) -) +) \ No newline at end of file diff --git a/test/decompiler/reference/engine/camera/camera-h_REF.gc b/test/decompiler/reference/engine/camera/camera-h_REF.gc index 0ebd2ab266..3026646516 100644 --- a/test/decompiler/reference/engine/camera/camera-h_REF.gc +++ b/test/decompiler/reference/engine/camera/camera-h_REF.gc @@ -394,30 +394,10 @@ (.add.vf vf6 vf4 vf5 :mask #b111) (.svf (&-> a0-1 quad) vf6) ) - (let ((a1-1 gp-0)) - (let ((v1-1 gp-0) - (a0-2 (-> obj value)) - ) - (.lvf vf4 (&-> v1-1 quad)) - (.lvf vf5 (&-> a0-2 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-1 quad) vf6) - ) + (vector-! gp-0 gp-0 (-> obj value)) ) (else - (let ((a1-2 gp-0)) - (let ((v1-2 (-> obj target)) - (a0-3 (-> obj value)) - ) - (.lvf vf4 (&-> v1-2 quad)) - (.lvf vf5 (&-> a0-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-2 quad) vf6) - ) + (vector-! gp-0 (-> obj target) (-> obj value)) ) ) (let ((f30-1 (* (-> obj max-partial) (vector-length gp-0)))) diff --git a/test/decompiler/reference/engine/collide/collide-shape-h_REF.gc b/test/decompiler/reference/engine/collide/collide-shape-h_REF.gc index fa24eb150c..e4451b1e53 100644 --- a/test/decompiler/reference/engine/collide/collide-shape-h_REF.gc +++ b/test/decompiler/reference/engine/collide/collide-shape-h_REF.gc @@ -441,9 +441,9 @@ (defmethod inspect collide-shape ((obj collide-shape)) (format #t "[~8x] ~A~%" obj (-> obj type)) (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) - (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Trot: ~`vector`P~%" (-> obj quat)) (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) - (format #t "~Tquat: #~%" (-> obj rot)) + (format #t "~Tquat: #~%" (-> obj quat)) (format #t "~Tpause-adjust-distance: (meters ~m)~%" @@ -518,9 +518,9 @@ (defmethod inspect collide-shape-moving ((obj collide-shape-moving)) (format #t "[~8x] ~A~%" obj (-> obj type)) (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) - (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Trot: ~`vector`P~%" (-> obj quat)) (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) - (format #t "~Tquat: #~%" (-> obj rot)) + (format #t "~Tquat: #~%" (-> obj quat)) (format #t "~Tpause-adjust-distance: (meters ~m)~%" @@ -733,7 +733,7 @@ ) ) (set! (-> obj trans w) 1.0) - (quaternion-identity! (the-as quaternion (-> obj rot))) + (quaternion-identity! (-> obj quat)) (vector-identity! (-> obj scale)) (cond ((= collide-list-kind (collide-list-enum hit-by-player)) diff --git a/test/decompiler/reference/engine/gfx/ripple_REF.gc b/test/decompiler/reference/engine/gfx/ripple_REF.gc index f2c765633a..d67fba509e 100644 --- a/test/decompiler/reference/engine/gfx/ripple_REF.gc +++ b/test/decompiler/reference/engine/gfx/ripple_REF.gc @@ -147,7 +147,7 @@ (vf6 :class vf) ) (init-vf0-vector) - (let ((f30-0 (- (quaternion-y-angle (the-as quaternion (-> arg0 root rot))))) + (let ((f30-0 (- (quaternion-y-angle (-> arg0 root quat)))) (s5-0 (new-stack-vector0)) ) (let ((f28-0 (+ (-> arg1 x) (* arg2 (-> arg1 z)))) @@ -230,12 +230,7 @@ ) (let* ((f28-0 (- (-> arg2 x) (-> arg0 root trans x))) (f26-0 (- (-> arg2 z) (-> arg0 root trans z))) - (f22-0 - (+ - (quaternion-y-angle (the-as quaternion (-> arg0 root rot))) - (-> s4-0 angle) - ) - ) + (f22-0 (+ (quaternion-y-angle (-> arg0 root quat)) (-> s4-0 angle))) (f24-0 (cos f22-0)) (f1-3 (sin f22-0)) (f0-4 (- (* f28-0 f24-0) (* f26-0 f1-3))) diff --git a/test/decompiler/reference/engine/math/transformq-h_REF.gc b/test/decompiler/reference/engine/math/transformq-h_REF.gc index 252f496dd3..69ac7081df 100644 --- a/test/decompiler/reference/engine/math/transformq-h_REF.gc +++ b/test/decompiler/reference/engine/math/transformq-h_REF.gc @@ -14,9 +14,9 @@ (defmethod inspect transformq ((obj transformq)) (format #t "[~8x] ~A~%" obj 'transformq) (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) - (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Trot: ~`vector`P~%" (-> obj quat)) (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) - (format #t "~Tquat: #~%" (-> obj rot)) + (format #t "~Tquat: #~%" (-> obj quat)) obj ) @@ -33,9 +33,9 @@ (defmethod inspect trsq ((obj trsq)) (format #t "[~8x] ~A~%" obj (-> obj type)) (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) - (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Trot: ~`vector`P~%" (-> obj quat)) (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) - (format #t "~Tquat: #~%" (-> obj rot)) + (format #t "~Tquat: #~%" (-> obj quat)) obj ) @@ -80,9 +80,9 @@ (defmethod inspect trsqv ((obj trsqv)) (format #t "[~8x] ~A~%" obj (-> obj type)) (format #t "~Ttrans: ~`vector`P~%" (-> obj trans)) - (format #t "~Trot: ~`vector`P~%" (-> obj rot)) + (format #t "~Trot: ~`vector`P~%" (-> obj quat)) (format #t "~Tscale: ~`vector`P~%" (-> obj scale)) - (format #t "~Tquat: #~%" (-> obj rot)) + (format #t "~Tquat: #~%" (-> obj quat)) (format #t "~Tpause-adjust-distance: (meters ~m)~%" @@ -100,49 +100,14 @@ ;; definition for method 23 of type trsqv (defmethod global-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (let ((t9-0 vector-y-angle) - (v1-0 (new 'stack-no-clear 'vector)) - ) - (let ((a0-1 (-> obj trans))) - (.lvf vf4 (&-> arg0 quad)) - (.lvf vf5 (&-> a0-1 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> v1-0 quad) vf6) - (t9-0 v1-0) - ) - ) + (vector-y-angle (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans))) ) ;; definition for method 24 of type trsqv (defmethod relative-y-angle-to-point trsqv ((obj trsqv) (arg0 vector)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (let ((gp-0 deg-diff) - (s3-0 (y-angle obj)) - (t9-1 vector-y-angle) - (a0-2 (new 'stack-no-clear 'vector)) - ) - (let ((v1-1 (-> obj trans))) - (.lvf vf4 (&-> arg0 quad)) - (.lvf vf5 (&-> v1-1 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a0-2 quad) vf6) - (gp-0 s3-0 (t9-1 a0-2)) - ) + (deg-diff + (y-angle obj) + (vector-y-angle (vector-! (new 'stack-no-clear 'vector) arg0 (-> obj trans))) ) ) diff --git a/test/decompiler/reference/engine/physics/trajectory_REF.gc b/test/decompiler/reference/engine/physics/trajectory_REF.gc index a17c3a580c..7b10b9d871 100644 --- a/test/decompiler/reference/engine/physics/trajectory_REF.gc +++ b/test/decompiler/reference/engine/physics/trajectory_REF.gc @@ -30,37 +30,20 @@ TODO-RENAME-11 trajectory ((obj trajectory) (arg0 vector) (arg1 vector) (arg2 float) (arg3 float)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (set! (-> obj initial-position quad) (-> arg0 quad)) - (set! (-> obj gravity) arg3) - (set! (-> obj time) arg2) - (let ((f0-3 (/ (vector-vector-xz-distance arg1 arg0) arg2))) - (let ((a1-2 (-> obj initial-velocity))) - (let ((v1-1 arg1) - (a0-4 arg0) - ) - (.lvf vf4 (&-> v1-1 quad)) - (.lvf vf5 (&-> a0-4 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-2 quad) vf6) - ) - (vector-xz-normalize! (-> obj initial-velocity) f0-3) - ) - (set! - (-> obj initial-velocity y) - (- (/ (- (-> arg1 y) (-> arg0 y)) arg2) (* (* 0.5 arg2) (-> obj gravity))) - ) - (let ((v0-2 0)) - ) - (none) + (set! (-> obj initial-position quad) (-> arg0 quad)) + (set! (-> obj gravity) arg3) + (set! (-> obj time) arg2) + (let ((f0-3 (/ (vector-vector-xz-distance arg1 arg0) arg2))) + (vector-! (-> obj initial-velocity) arg1 arg0) + (vector-xz-normalize! (-> obj initial-velocity) f0-3) ) + (set! + (-> obj initial-velocity y) + (- (/ (- (-> arg1 y) (-> arg0 y)) arg2) (* (* 0.5 arg2) (-> obj gravity))) + ) + (let ((v0-2 0)) + ) + (none) ) ;; definition for method 12 of type trajectory diff --git a/test/decompiler/reference/engine/target/joint-mod-h_REF.gc b/test/decompiler/reference/engine/target/joint-mod-h_REF.gc index b15f53514c..df65d60a1a 100644 --- a/test/decompiler/reference/engine/target/joint-mod-h_REF.gc +++ b/test/decompiler/reference/engine/target/joint-mod-h_REF.gc @@ -380,174 +380,148 @@ ;; Used lq/sq (defun joint-mod-look-at-handler ((csp cspace) (xform transformq)) (local-vars (f1-12 float) (sv-48 vector) (sv-52 vector) (sv-56 vector)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (let ((gp-0 (the-as joint-mod (-> csp param1)))) - (cspace<-parented-transformq-joint! csp xform) - (set! - sv-48 - (vector-normalize-copy! + (let ((gp-0 (the-as joint-mod (-> csp param1)))) + (cspace<-parented-transformq-joint! csp xform) + (set! + sv-48 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> gp-0 process node-list data 0 bone transform vector 1) + 1.0 + ) + ) + (set! + sv-52 + (vector-normalize! (-> csp bone transform vector (-> gp-0 nose)) 1.0) + ) + (set! + sv-56 + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) - (-> gp-0 process node-list data 0 bone transform vector 1) - 1.0 + (-> gp-0 target) + (-> csp bone position) ) + 1.0 ) - (set! - sv-52 - (vector-normalize! (-> csp bone transform vector (-> gp-0 nose)) 1.0) - ) - (let ((t9-3 vector-normalize!) - (a0-5 (new 'stack-no-clear 'vector)) + ) + (let* ((f30-0 (vector-y-angle sv-52)) + (a0-8 (vector-flatten! (new-stack-vector0) sv-56 sv-48)) + (f0-0 (vector-y-angle a0-8)) + (f0-1 (deg-diff f30-0 f0-0)) ) - (let ((v1-6 (-> gp-0 target)) - (a1-5 (-> csp bone position)) - ) - (.lvf vf4 (&-> v1-6 quad)) - (.lvf vf5 (&-> a1-5 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a0-5 quad) vf6) - (set! sv-56 (t9-3 a0-5 1.0)) + (if (< (-> gp-0 ignore-angle) (fabs f0-1)) + (set! f0-1 0.0) ) - (let* ((f30-0 (vector-y-angle sv-52)) - (a0-8 (vector-flatten! (new-stack-vector0) sv-56 sv-48)) - (f0-0 (vector-y-angle a0-8)) - (f0-1 (deg-diff f30-0 f0-0)) - ) - (if (< (-> gp-0 ignore-angle) (fabs f0-1)) - (set! f0-1 0.0) - ) - (let - ((f30-1 - (fmax - (fmin - (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) - (-> gp-0 twist-max y) - ) - (- (-> gp-0 twist-max y)) - ) - ) - ) - (if (and (-> gp-0 shutting-down?) (= (-> gp-0 twist y) f30-1)) - (set-mode! gp-0 (joint-mod-handler-mode reset)) - ) - (set! - (-> gp-0 twist y) - (deg-seek - (-> gp-0 twist y) - f30-1 - (* 0.1 (fabs (deg-diff f30-1 (-> gp-0 twist y)))) - ) - ) - ) - ) - (let ((v1-15 (-> gp-0 up))) - (cond - ((zero? v1-15) - (quaternion-rotate-x! - (the-as quaternion (-> xform rot)) - (the-as quaternion (-> xform rot)) - (-> gp-0 twist y) - ) - ) - ((= v1-15 1) - (quaternion-rotate-local-y! - (the-as quaternion (-> xform rot)) - (the-as quaternion (-> xform rot)) - (-> gp-0 twist y) - ) - ) - (else - (quaternion-rotate-z! - (the-as quaternion (-> xform rot)) - (the-as quaternion (-> xform rot)) - (-> gp-0 twist y) - ) - ) - ) - ) - (let* - ((s3-1 - (vector-normalize-copy! - (new 'stack-no-clear 'vector) - (the-as vector (-> gp-0 process node-list data 0 bone transform)) - 1.0 - ) - ) - (f30-2 (vector-x-angle sv-52)) - (s3-2 (vector-flatten! (new-stack-vector0) sv-56 s3-1)) - (f0-15 (vector-x-angle s3-2)) - (f0-21 + (let + ((f30-1 (fmax (fmin - (* (* (- (deg-diff f30-2 f0-15)) (-> gp-0 blend)) (-> gp-0 flex-blend)) - (-> gp-0 twist-max x) + (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max y) ) - (- (-> gp-0 twist-max x)) + (- (-> gp-0 twist-max y)) ) ) ) - (let* ((v1-22 sv-52)) - (set! f1-12 (vector-dot s3-2 v1-22)) - ) - (if (< f1-12 0.1) - (set! f0-21 0.0) + (if (and (-> gp-0 shutting-down?) (= (-> gp-0 twist y) f30-1)) + (set-mode! gp-0 (joint-mod-handler-mode reset)) ) (set! - (-> gp-0 twist x) + (-> gp-0 twist y) (deg-seek + (-> gp-0 twist y) + f30-1 + (* 0.1 (fabs (deg-diff f30-1 (-> gp-0 twist y)))) + ) + ) + ) + ) + (let ((v1-15 (-> gp-0 up))) + (cond + ((zero? v1-15) + (quaternion-rotate-x! (-> xform quat) (-> xform quat) (-> gp-0 twist y)) + ) + ((= v1-15 1) + (quaternion-rotate-local-y! + (-> xform quat) + (-> xform quat) + (-> gp-0 twist y) + ) + ) + (else + (quaternion-rotate-z! (-> xform quat) (-> xform quat) (-> gp-0 twist y)) + ) + ) + ) + (let* + ((s3-1 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (the-as vector (-> gp-0 process node-list data 0 bone transform)) + 1.0 + ) + ) + (f30-2 (vector-x-angle sv-52)) + (s3-2 (vector-flatten! (new-stack-vector0) sv-56 s3-1)) + (f0-15 (vector-x-angle s3-2)) + (f0-21 + (fmax + (fmin + (* (* (- (deg-diff f30-2 f0-15)) (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max x) + ) + (- (-> gp-0 twist-max x)) + ) + ) + ) + (let* ((v1-22 sv-52)) + (set! f1-12 (vector-dot s3-2 v1-22)) + ) + (if (< f1-12 0.1) + (set! f0-21 0.0) + ) + (set! + (-> gp-0 twist x) + (deg-seek + (-> gp-0 twist x) + f0-21 + (* 0.1 (fabs (deg-diff f0-21 (-> gp-0 twist x)))) + ) + ) + ) + (let ((v1-27 (-> gp-0 ear))) + (cond + ((zero? v1-27) + (quaternion-rotate-x! (-> xform quat) (-> xform quat) (-> gp-0 twist x)) + ) + ((= v1-27 1) + (quaternion-rotate-local-y! + (-> xform quat) + (-> xform quat) (-> gp-0 twist x) - f0-21 - (* 0.1 (fabs (deg-diff f0-21 (-> gp-0 twist x)))) ) ) - ) - (let ((v1-27 (-> gp-0 ear))) - (cond - ((zero? v1-27) - (quaternion-rotate-x! - (the-as quaternion (-> xform rot)) - (the-as quaternion (-> xform rot)) - (-> gp-0 twist x) - ) - ) - ((= v1-27 1) - (quaternion-rotate-local-y! - (the-as quaternion (-> xform rot)) - (the-as quaternion (-> xform rot)) - (-> gp-0 twist x) - ) - ) - (else - (quaternion-rotate-z! - (the-as quaternion (-> xform rot)) - (the-as quaternion (-> xform rot)) - (-> gp-0 twist x) - ) - ) - ) - ) - (cspace<-parented-transformq-joint! csp xform) - (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) - (add-debug-text-sphere - *display-target-marks* - (bucket-id debug-draw1) - (-> gp-0 target) - 819.2 - "look" - (new 'static 'rgba :r #xff :g #xff :a #x80) + (else + (quaternion-rotate-z! (-> xform quat) (-> xform quat) (-> gp-0 twist x)) ) ) ) - (let ((v0-26 0)) + (cspace<-parented-transformq-joint! csp xform) + (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) + (add-debug-text-sphere + *display-target-marks* + (bucket-id debug-draw1) + (-> gp-0 target) + 819.2 + "look" + (new 'static 'rgba :r #xff :g #xff :a #x80) + ) ) - (none) ) + (let ((v0-26 0)) + ) + (none) ) ;; definition for function joint-mod-world-look-at-handler @@ -558,153 +532,138 @@ ;; Used lq/sq (defun joint-mod-world-look-at-handler ((arg0 cspace) (arg1 transformq)) (local-vars (f1-14 float) (sv-48 vector) (sv-52 vector) (sv-56 vector)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) - ) - (init-vf0-vector) - (let ((gp-0 (the-as joint-mod (-> arg0 param1)))) - (let ((s5-0 (-> arg0 bone transform))) - (cspace<-parented-transformq-joint! arg0 arg1) - (set! - sv-48 - (vector-normalize-copy! + (let ((gp-0 (the-as joint-mod (-> arg0 param1)))) + (let ((s5-0 (-> arg0 bone transform))) + (cspace<-parented-transformq-joint! arg0 arg1) + (set! + sv-48 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (-> gp-0 process node-list data 0 bone transform vector 1) + 1.0 + ) + ) + (set! sv-52 (vector-normalize! (-> s5-0 vector (-> gp-0 nose)) 1.0)) + (set! + sv-56 + (vector-normalize! + (vector-! (new 'stack-no-clear 'vector) - (-> gp-0 process node-list data 0 bone transform vector 1) - 1.0 + (-> gp-0 target) + (-> s5-0 vector 3) ) + 1.0 ) - (set! sv-52 (vector-normalize! (-> s5-0 vector (-> gp-0 nose)) 1.0)) - (let ((t9-3 vector-normalize!) - (a0-3 (new 'stack-no-clear 'vector)) + ) + (let* ((f30-0 (vector-y-angle sv-52)) + (a0-6 (vector-flatten! (new-stack-vector0) sv-56 sv-48)) + (f0-0 (vector-y-angle a0-6)) + (f0-1 (deg-diff f30-0 f0-0)) ) - (let ((v1-7 (-> gp-0 target)) - (a1-3 (-> s5-0 vector 3)) - ) - (.lvf vf4 (&-> v1-7 quad)) - (.lvf vf5 (&-> a1-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a0-3 quad) vf6) - (set! sv-56 (t9-3 a0-3 1.0)) + (if (< (-> gp-0 ignore-angle) (fabs f0-1)) + (set! f0-1 0.0) ) - (let* ((f30-0 (vector-y-angle sv-52)) - (a0-6 (vector-flatten! (new-stack-vector0) sv-56 sv-48)) - (f0-0 (vector-y-angle a0-6)) - (f0-1 (deg-diff f30-0 f0-0)) - ) - (if (< (-> gp-0 ignore-angle) (fabs f0-1)) - (set! f0-1 0.0) - ) - (let - ((f0-5 - (fmax - (fmin - (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) - (-> gp-0 twist-max y) - ) - (- (-> gp-0 twist-max y)) - ) - ) - ) - (set! - (-> gp-0 twist y) - (deg-seek - (-> gp-0 twist y) - f0-5 - (fmax 1.0 (* 0.1 (fabs (deg-diff f0-5 (-> gp-0 twist y))))) - ) - ) - ) - ) - (when (!= (-> gp-0 twist y) 0.0) - (let - ((a2-3 - (matrix-rotate-y! (new 'stack-no-clear 'matrix) (-> gp-0 twist y)) - ) - (s4-2 (-> s5-0 vector 3 quad)) - ) - (matrix*! s5-0 s5-0 a2-3) - (set! (-> s5-0 vector 3 quad) s4-2) - ) - ) - (let* - ((s4-3 - (vector-normalize-copy! - (new 'stack-no-clear 'vector) - (the-as vector (-> gp-0 process node-list data 0 bone transform)) - 1.0 - ) - ) - (f30-2 (vector-x-angle sv-52)) - (s4-4 (vector-flatten! (new-stack-vector0) sv-56 s4-3)) - (f0-14 (vector-x-angle s4-4)) - (f0-20 + (let + ((f0-5 (fmax (fmin - (* - (* (- (deg-diff f30-2 f0-14)) (-> gp-0 blend)) - (-> gp-0 flex-blend) - ) - (-> gp-0 twist-max x) + (* (* f0-1 (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max y) ) - (- (-> gp-0 twist-max x)) + (- (-> gp-0 twist-max y)) ) ) ) - (let* ((v1-14 sv-52)) - (set! f1-14 (vector-dot s4-4 v1-14)) - ) - (if (< f1-14 0.1) - (set! f0-20 0.0) - ) (set! - (-> gp-0 twist x) + (-> gp-0 twist y) (deg-seek - (-> gp-0 twist x) - f0-20 - (fmax 1.0 (* 0.1 (fabs (deg-diff f0-20 (-> gp-0 twist x))))) + (-> gp-0 twist y) + f0-5 + (fmax 1.0 (* 0.1 (fabs (deg-diff f0-5 (-> gp-0 twist y))))) ) ) ) - (when (!= (-> gp-0 twist x) 0.0) - (let* ((v1-20 (-> gp-0 ear)) - (a1-17 ((cond - ((zero? v1-20) - matrix-rotate-x! - ) - ((= v1-20 1) - matrix-rotate-y! - ) - (else - matrix-rotate-z! - ) - ) - (new 'stack-no-clear 'matrix) (-> gp-0 twist x) - ) - ) - ) - (matrix*! s5-0 a1-17 s5-0) + ) + (when (!= (-> gp-0 twist y) 0.0) + (let + ((a2-3 (matrix-rotate-y! (new 'stack-no-clear 'matrix) (-> gp-0 twist y))) + (s4-2 (-> s5-0 vector 3 quad)) + ) + (matrix*! s5-0 s5-0 a2-3) + (set! (-> s5-0 vector 3 quad) s4-2) + ) + ) + (let* + ((s4-3 + (vector-normalize-copy! + (new 'stack-no-clear 'vector) + (the-as vector (-> gp-0 process node-list data 0 bone transform)) + 1.0 + ) + ) + (f30-2 (vector-x-angle sv-52)) + (s4-4 (vector-flatten! (new-stack-vector0) sv-56 s4-3)) + (f0-14 (vector-x-angle s4-4)) + (f0-20 + (fmax + (fmin + (* (* (- (deg-diff f30-2 f0-14)) (-> gp-0 blend)) (-> gp-0 flex-blend)) + (-> gp-0 twist-max x) + ) + (- (-> gp-0 twist-max x)) + ) + ) + ) + (let* ((v1-14 sv-52)) + (set! f1-14 (vector-dot s4-4 v1-14)) + ) + (if (< f1-14 0.1) + (set! f0-20 0.0) + ) + (set! + (-> gp-0 twist x) + (deg-seek + (-> gp-0 twist x) + f0-20 + (fmax 1.0 (* 0.1 (fabs (deg-diff f0-20 (-> gp-0 twist x))))) ) ) ) - (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) - (add-debug-text-sphere - *display-target-marks* - (bucket-id debug-draw1) - (-> gp-0 target) - 819.2 - "look" - (new 'static 'rgba :r #xff :g #xff :a #x80) + (when (!= (-> gp-0 twist x) 0.0) + (let* ((v1-20 (-> gp-0 ear)) + (a1-17 ((cond + ((zero? v1-20) + matrix-rotate-x! + ) + ((= v1-20 1) + matrix-rotate-y! + ) + (else + matrix-rotate-z! + ) + ) + (new 'stack-no-clear 'matrix) (-> gp-0 twist x) + ) + ) + ) + (matrix*! s5-0 a1-17 s5-0) ) ) ) - (let ((v0-22 0)) + (if (and (= (-> gp-0 process type) target) (!= (-> gp-0 blend) 0.0)) + (add-debug-text-sphere + *display-target-marks* + (bucket-id debug-draw1) + (-> gp-0 target) + 819.2 + "look" + (new 'static 'rgba :r #xff :g #xff :a #x80) + ) ) - (none) ) + (let ((v0-22 0)) + ) + (none) ) ;; definition for function joint-mod-rotate-handler @@ -730,13 +689,7 @@ ) ) ) - (quaternion-normalize! - (quaternion*! - (the-as quaternion (-> arg1 rot)) - a1-2 - (the-as quaternion (-> arg1 rot)) - ) - ) + (quaternion-normalize! (quaternion*! (-> arg1 quat) a1-2 (-> arg1 quat))) ) (let* ((v1-6 (-> s3-0 (-> s4-0 up))) (a1-4 @@ -749,13 +702,7 @@ ) ) ) - (quaternion-normalize! - (quaternion*! - (the-as quaternion (-> arg1 rot)) - a1-4 - (the-as quaternion (-> arg1 rot)) - ) - ) + (quaternion-normalize! (quaternion*! (-> arg1 quat) a1-4 (-> arg1 quat))) ) (let* ((v1-10 (-> s3-0 (-> s4-0 nose))) (a1-6 @@ -768,13 +715,7 @@ ) ) ) - (quaternion-normalize! - (quaternion*! - (the-as quaternion (-> arg1 rot)) - a1-6 - (the-as quaternion (-> arg1 rot)) - ) - ) + (quaternion-normalize! (quaternion*! (-> arg1 quat) a1-6 (-> arg1 quat))) ) ) (cspace<-parented-transformq-joint! arg0 arg1) @@ -789,7 +730,7 @@ (defun joint-mod-joint-set-handler ((arg0 cspace) (arg1 transformq)) (let ((s4-0 (the-as joint-mod (-> arg0 param1)))) (set! (-> arg1 trans quad) (-> s4-0 trans quad)) - (quaternion-copy! (the-as quaternion (-> arg1 rot)) (-> s4-0 quat)) + (quaternion-copy! (-> arg1 quat) (-> s4-0 quat)) (set! (-> arg1 scale quad) (-> s4-0 scale quad)) ) (cspace<-parented-transformq-joint! arg0 arg1) @@ -820,11 +761,7 @@ (.svf (&-> a1-1 quad) vf6) ) (quaternion-normalize! - (quaternion*! - (the-as quaternion (-> arg1 rot)) - (the-as quaternion (-> arg1 rot)) - (-> s5-0 quat) - ) + (quaternion*! (-> arg1 quat) (-> arg1 quat) (-> s5-0 quat)) ) (vector*! (-> arg1 scale) (-> arg1 scale) (-> s5-0 scale)) (cspace<-parented-transformq-joint! arg0 arg1) @@ -890,54 +827,37 @@ ;; Used lq/sq (defun joint-mod-wheel-callback ((arg0 cspace) (arg1 transformq)) (local-vars (f0-3 float)) - (rlet ((vf0 :class vf) - (vf4 :class vf) - (vf5 :class vf) - (vf6 :class vf) + (let ((s4-0 (the-as joint-mod-wheel (-> arg0 param1)))) + (let ((v1-1 (-> s4-0 process root)) + (s1-0 (new-stack-vector0)) + (s3-0 (new-stack-vector0)) + (s2-0 (new-stack-vector0)) ) - (init-vf0-vector) - (let ((s4-0 (the-as joint-mod-wheel (-> arg0 param1)))) - (let ((v1-1 (-> s4-0 process root)) - (s1-0 (new-stack-vector0)) - (s3-0 (new-stack-vector0)) - (s2-0 (new-stack-vector0)) - ) - (let ((f0-0 0.0)) - ) - (let ((f0-1 0.0)) - ) - (vector-z-quaternion! s2-0 (the-as quaternion (-> v1-1 rot))) - (vector<-cspace! s1-0 arg0) - (let ((a1-3 s3-0)) - (let ((v1-2 s1-0) - (a0-3 (-> s4-0 last-position)) - ) - (.lvf vf4 (&-> v1-2 quad)) - (.lvf vf5 (&-> a0-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-3 quad) vf6) - ) - (set! (-> s4-0 last-position quad) (-> s1-0 quad)) - (set! f0-3 (vector-dot s2-0 s3-0)) + (let ((f0-0 0.0)) ) - (let* ((f0-4 f0-3) - (f1-1 65536.0) - (f2-2 (* 6.28318 (-> s4-0 wheel-radius))) - (f0-5 (* (* f1-1 (/ 1.0 f2-2)) f0-4)) - ) - (set! (-> s4-0 angle) (+ (-> s4-0 angle) f0-5)) - ) - (quaternion-vector-angle! - (the-as quaternion (-> arg1 rot)) - (-> *joint-axis-vectors* (-> s4-0 wheel-axis)) - (-> s4-0 angle) + (let ((f0-1 0.0)) ) + (vector-z-quaternion! s2-0 (-> v1-1 quat)) + (vector<-cspace! s1-0 arg0) + (vector-! s3-0 s1-0 (-> s4-0 last-position)) + (set! (-> s4-0 last-position quad) (-> s1-0 quad)) + (set! f0-3 (vector-dot s2-0 s3-0)) + ) + (let* ((f0-4 f0-3) + (f1-1 65536.0) + (f2-2 (* 6.28318 (-> s4-0 wheel-radius))) + (f0-5 (* (* f1-1 (/ 1.0 f2-2)) f0-4)) + ) + (set! (-> s4-0 angle) (+ (-> s4-0 angle) f0-5)) + ) + (quaternion-vector-angle! + (-> arg1 quat) + (-> *joint-axis-vectors* (-> s4-0 wheel-axis)) + (-> s4-0 angle) ) - (cspace<-parented-transformq-joint! arg0 arg1) - (none) ) + (cspace<-parented-transformq-joint! arg0 arg1) + (none) ) ;; definition for method 0 of type joint-mod-wheel @@ -1011,7 +931,7 @@ (set! (-> v1-0 transform trans quad) (-> arg1 trans quad)) ) (if (not (-> v1-0 set-rotation)) - (set! (-> v1-0 transform rot quad) (-> arg1 rot quad)) + (set! (-> v1-0 transform quat vec quad) (-> arg1 quat vec quad)) ) (if (not (-> v1-0 set-scale)) (set! (-> v1-0 transform scale quad) (-> arg1 scale quad)) @@ -1049,7 +969,7 @@ (set! (-> v0-0 set-scale) arg4) (set! (-> v0-0 enable) #t) (set! (-> v0-0 transform trans quad) (-> *null-vector* quad)) - (set! (-> v0-0 transform rot quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform quat vec quad) (-> *null-vector* quad)) (set! (-> v0-0 transform scale quad) (-> *identity-vector* quad)) (let ((v1-8 (-> arg0 node-list data arg1))) (set! (-> v1-8 param0) joint-mod-set-local-callback) @@ -1112,7 +1032,7 @@ (set! (-> v0-0 node-index) arg1) (set! (-> v0-0 enable) arg2) (set! (-> v0-0 transform trans quad) (-> *null-vector* quad)) - (set! (-> v0-0 transform rot quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform quat vec quad) (-> *null-vector* quad)) (set! (-> v0-0 transform scale quad) (-> *identity-vector* quad)) (let ((v1-7 (-> arg0 node-list data arg1))) (set! (-> v1-7 param0) joint-mod-set-world-callback) @@ -1171,9 +1091,9 @@ (-> gp-0 blend) ) (quaternion-slerp! - (the-as quaternion (-> gp-0 blend-transform rot)) - (the-as quaternion (-> arg1 rot)) - (the-as quaternion (-> gp-0 transform rot)) + (-> gp-0 blend-transform quat) + (-> arg1 quat) + (-> gp-0 transform quat) (-> gp-0 blend) ) (cspace<-parented-transformq-joint! arg0 (-> gp-0 blend-transform)) @@ -1206,7 +1126,7 @@ (set! (-> v0-0 enable) arg2) (set! (-> v0-0 blend) 0.0) (set! (-> v0-0 transform trans quad) (-> *null-vector* quad)) - (set! (-> v0-0 transform rot quad) (-> *null-vector* quad)) + (set! (-> v0-0 transform quat vec quad) (-> *null-vector* quad)) (set! (-> v0-0 transform scale quad) (-> *identity-vector* quad)) (let ((v1-7 (-> arg0 node-list data arg1))) (set! (-> v1-7 param0) joint-mod-blend-local-callback) @@ -1259,11 +1179,7 @@ (if (< f30-0 -32768.0) (set! f30-0 (+ 65536.0 f30-0)) ) - (quaternion-vector-angle! - (the-as quaternion (-> arg1 rot)) - (-> gp-0 spin-axis) - f30-0 - ) + (quaternion-vector-angle! (-> arg1 quat) (-> gp-0 spin-axis) f30-0) (set! (-> gp-0 angle) f30-0) ) ) diff --git a/test/decompiler/reference/engine/util/sync-info_REF.gc b/test/decompiler/reference/engine/util/sync-info_REF.gc index f356093709..ef4f62c4a4 100644 --- a/test/decompiler/reference/engine/util/sync-info_REF.gc +++ b/test/decompiler/reference/engine/util/sync-info_REF.gc @@ -584,30 +584,10 @@ (.add.vf vf6 vf4 vf5 :mask #b111) (.svf (&-> a0-1 quad) vf6) ) - (let ((a1-1 s5-0)) - (let ((v1-1 s5-0) - (a0-2 (-> obj value)) - ) - (.lvf vf4 (&-> v1-1 quad)) - (.lvf vf5 (&-> a0-2 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-1 quad) vf6) - ) + (vector-! s5-0 s5-0 (-> obj value)) ) (else - (let ((a1-2 s5-0)) - (let ((v1-2 (-> obj target)) - (a0-3 (-> obj value)) - ) - (.lvf vf4 (&-> v1-2 quad)) - (.lvf vf5 (&-> a0-3 quad)) - ) - (.mov.vf vf6 vf0 :mask #b1000) - (.sub.vf vf6 vf4 vf5 :mask #b111) - (.svf (&-> a1-2 quad) vf6) - ) + (vector-! s5-0 (-> obj target) (-> obj value)) ) ) (let ((v1-3 s5-0)) diff --git a/test/decompiler/test_FormExpressionBuild2.cpp b/test/decompiler/test_FormExpressionBuild2.cpp index 2a4e9f5682..c77e4d3844 100644 --- a/test/decompiler/test_FormExpressionBuild2.cpp +++ b/test/decompiler/test_FormExpressionBuild2.cpp @@ -1502,4 +1502,30 @@ TEST_F(FormRegressionTest, VectorNewInlineProp) { " arg0\n" " )"; test_with_stack_structures(func, type, expected, R"([[16, "vector"]])"); +} + +TEST_F(FormRegressionTest, Method23Trsqv) { + std::string func = + "sll r0, r0, 0\n" + " daddiu sp, sp, -32\n" + " sd ra, 0(sp)\n" + + " lw t9, vector-y-angle(s7)\n" + " daddiu v1, sp, 16\n" + " daddiu a0, a0, 12\n" + " lqc2 vf4, 0(a1)\n" + " lqc2 vf5, 0(a0)\n" + " vmove.w vf6, vf0\n" + " vsub.xyz vf6, vf4, vf5\n" + " sqc2 vf6, 0(v1)\n" + " or a0, v1, r0\n" + " jalr ra, t9\n" + " sll v0, ra, 0\n" + " ld ra, 0(sp)\n" + " jr ra\n" + " daddiu sp, sp, 32\n"; + std::string type = "(function trsqv vector float)"; + std::string expected = + "(vector-y-angle (vector-! (new 'stack-no-clear 'vector) arg1 (-> arg0 trans)))"; + test_with_stack_structures(func, type, expected, R"([[16, "vector"]])"); } \ No newline at end of file