{
  "@context": "https://schema.org",
  "@id": "https://aggr.aymericbeaumet.com/items/mariozechner-at/2025-06-02-prompts-are-code-json-md-files-are-state/#webpage",
  "@type": [
    "WebPage",
    "ArchiveComponent"
  ],
  "articleBody": "![](https://mariozechner.at/posts/2025-06-02-prompts-are-code/media/hello-computer.jpg)\\\nHello, Computer, do my work\n\n- [Feeling the pain](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_0)\n- [Thinking of LLMs as Shitty General Purpose Computers](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_1)\n- [A Real World Example: Porting the Spine Runtimes](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_2)\n- [The \"Port Java to X\" Program](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_3)\n  - [Initial Input and State](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_4)\n  - [The Function Library](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_5)\n  - [The Main Workflow](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_6)\n- [Program Execution](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_7)\n- [Future Work](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_8)\n- [Conclusion](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_9)\n\nLike most of you, I've been dabbling in what people call \"agentic engineering.\" Truth is, there's not much engineering happening. We're basically throwing shit at the wall and hoping something sticks.\n\nUsing LLM coding tools like Claude Code to spin up throwaway greenfield projects or bang out ad hoc scripts? Pretty great experience. But try using them on a big, established codebase, or the-production-app-formerly-known-as-greenfield-project without breaking everything? That's where things get painful.\n\n## Feeling the pain\n\nFor bigger codebases, the main issue is context, or rather, the lack of it. These tools don't have the full picture of your project. Maybe you haven't given them that overview, or maybe their context window is too small to hold all your interconnected components. But there's more to it.\n\nEven with recent improvements like 'reasoning', which is really just the old 'think step by step' trick, with more scratch space to attend to, LLMs still can't follow execution flow all that well. They're especially lost with anything beyond sequential scripts: multiple processes, IPC, client-server architectures, concurrent execution within the same process. Even when you manage to cram all the context they need, they'll still generate code that doesn't fit your system's actual architecture.\n\nLLMs also lack taste. Trained on all code on the web (and likely some private code), they generate, to oversimplify, the statistical mean of what they've seen. While senior engineers strive for elegant, minimal solutions that reduce bugs and complexity, LLMs reach for 'best practices' and spit out over-engineered garbage. Let them run wild and you'll get code that's hard to maintain, hard to understand, and full of places for bugs to hide.\n\nThen there's context degradation. As your session progresses and pulls in more files, tool outputs, and other data, things start falling apart around 100k tokens. Benchmarks be damned. Whatever tricks LLM providers use to achieve those massive context windows don't work in practice. The model loses track of important details buried in the middle of all that context.\n\nWorse still, many tools don't let you control what goes into your context. Companies like Cursor that aren't LLM providers themselves need to make a margin between what you pay them and what they pay for tokens. Their incentive? Cut down your context to save money, which means the LLM might miss crucial information or get it in a suboptimal format.\n\nClaude Code is different. It comes straight from Anthropic with no middleman trying to squeeze margins. With the Max plan, you get essentially unlimited tokens (though folks like [Peter](https://twitter.com/steipete) manage to get rate limited even with three or four accounts). You still don't have full control: there's a system prompt you can't change, additional instructions get sneakily injected into your first message, the VS Code integration adds unwanted crap, and all the tool definitions eat up context and give the model plenty of rope to confuse itself with. But this is the best deal we're getting, so we work with what we have. (Anthropic, please OSS Claude Code. Your models are your moat, not Claude Code.)\n\n## How do we tame this agentic mess?\n\nWhat we need when using coding agents on bigger codebases is a structured way to engineer context. By that I mean: keep only the information needed for the task of modifying or generating code, minimize the number of turns the model needs to take calling tools or reporting back to us, and ensure nothing important is missing. We want reproducible workflows. We want determinism, as much as possible within the limits of these inherently non-deterministic models.\n\nI'm a programmer. You're probably a programmer. We think in systems, deterministic workflows, and abstractions. What's more natural for us than viewing LLMs as an extremely slow kind of unreliable computer that we program with natural language?\n\nThis is a weird form of metaprogramming: we write \"code\" in the form of prompts that execute on the LLM to produce the actual code that runs on real CPUs.\n\nYes, I know LLMs aren't actually computers (though there are some papers on arXiv...). The metaphor is a bit stretched. But here's the thing: as developers, we're used to encoding specifications in precise programming languages. When we interact with LLMs, the fuzziness of natural language makes us forget we can apply the same structured thinking. This framework bridges that gap: think \"inputs, state, outputs\" instead of \"chat with the AI\" and suddenly you're closer to engineering solutions instead of just hoping for the best.\n\n## Thinking of LLMs as Shitty General Purpose Computers\n\nIn traditional software, we create programs by writing code and importing libraries. A program takes inputs, manipulates state, and produces outputs. We can map these concepts to our LLM-as-shitty-computer metaphor like this:\n\n**Program** is your prompt, written in natural language. It specifies initial inputs, \"imports\" external functions via tool descriptions, and implements business logic through control flow: sequential steps, loops, conditionals, and yes, even goto. Tool calls and user input are I/O.\n\n**Inputs** come from three sources: prepared information (codebase docs, style guides, architecture overviews) either baked into the prompt or loaded from disk, user input during execution (clarifications, corrections, new requirements), and tool outputs (file contents, command results, API responses).\n\n**State** evolves as the program runs. Some lives in the context, but we treat that as ephemeral: compaction will eventually wipe it (trololo). Plus, you'll quickly hit context limits with any substantial state. So we serialize to disk using formats LLMs handle well: JSON for structured data, where the LLM can surgically read and update specific fields via `jq`. Markdown for smaller unstructured data we can load fully into context if needed. The payoff? You can resume from any point with a fresh context, sidestepping the dreaded compaction issue entirely.\n\n**Outputs** aren't limited to generated code. Just like traditional programs produce console output, write files, or display GUIs, our LLM program uses tool calls to create various outputs: the actual code, diffs, open files in an editor for us, codebase statistics, summaries of changes, or any other artifact that documents what the program did. These outputs serve multiple purposes: helping you review the work, providing input for the next steps in the workflow, or simply showing the program's progress.\n\nLet's see how this plays out in practice.\n\n## A Real World Example: Porting the Spine Runtimes\n\nAfter experimenting with toy projects, I felt ready to apply this approach to a real codebase: the [Spine runtimes](https://github.com/EsotericSoftware/spine-runtimes).\n\n[Spine](https://esotericsoftware.com) is 2D skeletal animation software. You create animations in the editor, export them to a runtime format, then use one of many runtimes to display them in your app or game. We maintain runtimes for C, C++, C#, Haxe, Java, Dart, Swift, and TypeScript. On top of these, we've built integrations for Unity, Unreal, Godot, Phaser, Pixi, ThreeJS, iOS, Android, web, and more.\n\nHere's the painful part: between releases, the runtime code changes. We implement new features in our reference implementation (spine-libgdx in Java, which powers the editor), then manually port those changes to every other language runtime. It's tedious, error-prone work. Math-heavy code needs exact translation, and after hours of porting, your brain turns to mush. Bugs creep in that are hell to track down.\n\n![Git diff showing thousands of lines of code changes](https://mariozechner.at/posts/2025-06-02-prompts-are-code/media/changeset.png)\n\nAnd no, transpilers won't work for this (trust me, bro, I made money doing compilers). We need idiomatic ports that preserve the same API surface in a way that feels natural for each language.\n\nBetween releases 4.2 and 4.3-beta, the Java reference implementation saw significant changes:\n\n```bash\n$ git diff --stat 4.2..4.3-beta -- '*.java' | tail -1\n  79 files changed, 4820 insertions(+), 4679 deletions(-)\n```\n\nHere's how I'd approach this with my manual workflow:\n\n1. Open the changeset in Fork (my git client) and scan through all changed files\n2. Plan the porting order based on the dependency graph: interfaces and enums first (they're usually independent), then try to port dependencies before the classes that use them, hoping to maintain some compilability\n3. Pick a type to port in Java, open a side-by-side diff, check if the type already exists in the target runtime or needs creation from scratch\n4. Port changes line-by-line, method-by-method to the target language\n5. Watch the illusion of order crumble: the dependency graph is cyclic, so there's no perfect porting order that keeps everything compiling (note to self: it would be nice if we had an acyclic type dependency graph)\n6. Can't test individual pieces because a skeletal animation system needs all its parts working in concert\n7. Port everything blind, then face a wall of compilation errors and bugs introduced because my brain was fried after hours of human transpilation\n\nThis is especially fun when porting from Java to C, the language pair with the biggest type system and memory management mismatch.\n\nWhat makes this tractable is that we maintain the same API surface across all runtime implementations. If there's a class `Animation` in Java, there's also a class `Animation` in C#, C++, and every other runtime, in a corresponding file. This one-to-one mapping exists for 99% of types. Sure, there are quirks like Java files containing dozens of inner classes, but the structural consistency is there.\n\nHere's an example of one of the more math-heavy types, `PhysicsConstraint`:\n\n**Java (PhysicsConstraint.java)**\n\n```java\npackage com.esotericsoftware.spine;\n\nimport static com.esotericsoftware.spine.utils.SpineUtils.*;\n\n/** Stores the current pose for a physics constraint. A physics constraint applies physics to bones.\n * <p>\n * See <a href=\"https://esotericsoftware.com/spine-physics-constraints\">Physics constraints</a> in the Spine User Guide. */\npublic class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose> {\n\tBonePose bone;\n\n\tboolean reset = true;\n\tfloat ux, uy, cx, cy, tx, ty;\n\tfloat xOffset, xLag, xVelocity;\n\tfloat yOffset, yLag, yVelocity;\n\tfloat rotateOffset, rotateLag, rotateVelocity;\n\tfloat scaleOffset, scaleLag, scaleVelocity;\n\tfloat remaining, lastTime;\n\n\tpublic PhysicsConstraint (PhysicsConstraintData data, Skeleton skeleton) {\n\t\tsuper(data, new PhysicsConstraintPose(), new PhysicsConstraintPose());\n\t\tif (skeleton == null) throw new IllegalArgumentException(\"skeleton cannot be null.\");\n\n\t\tbone = skeleton.bones.items[data.bone.index].constrained;\n\t}\n\n\tpublic PhysicsConstraint copy (Skeleton skeleton) {\n\t\tvar copy = new PhysicsConstraint(data, skeleton);\n\t\tcopy.pose.set(pose);\n\t\treturn copy;\n\t}\n\n\tpublic void reset (Skeleton skeleton) {\n\t\tremaining = 0;\n\t\tlastTime = skeleton.time;\n\t\treset = true;\n\t\txOffset = 0;\n\t\txLag = 0;\n\t\txVelocity = 0;\n\t\tyOffset = 0;\n\t\tyLag = 0;\n\t\tyVelocity = 0;\n\t\trotateOffset = 0;\n\t\trotateLag = 0;\n\t\trotateVelocity = 0;\n\t\tscaleOffset = 0;\n\t\tscaleLag = 0;\n\t\tscaleVelocity = 0;\n\t}\n\n\t/** Translates the physics constraint so next {@link #update(Skeleton, Physics)} forces are applied as if the bone moved an\n\t * additional amount in world space. */\n\tpublic void translate (float x, float y) {\n\t\tux -= x;\n\t\tuy -= y;\n\t\tcx -= x;\n\t\tcy -= y;\n\t}\n\n\t/** Rotates the physics constraint so next {@link #update(Skeleton, Physics)} forces are applied as if the bone rotated around\n\t * the specified point in world space. */\n\tpublic void rotate (float x, float y, float degrees) {\n\t\tfloat r = degrees * degRad, cos = cos(r), sin = sin(r);\n\t\tfloat dx = cx - x, dy = cy - y;\n\t\ttranslate(dx * cos - dy * sin - dx, dx * sin + dy * cos - dy);\n\t}\n\n\t/** Applies the constraint to the constrained bones. */\n\tpublic void update (Skeleton skeleton, Physics physics) {\n\t\tPhysicsConstraintPose p = applied;\n\t\tfloat mix = p.mix;\n\t\tif (mix == 0) return;\n\n\t\tboolean x = data.x > 0, y = data.y > 0, rotateOrShearX = data.rotate > 0 || data.shearX > 0, scaleX = data.scaleX > 0;\n\t\tBonePose bone = this.bone;\n\t\tfloat l = bone.bone.data.length, t = data.step, z = 0;\n\n\t\tswitch (physics) {\n\t\tcase none:\n\t\t\treturn;\n\t\tcase reset:\n\t\t\treset(skeleton);\n\t\t\t// Fall through.\n\t\tcase update:\n\t\t\tfloat delta = Math.max(skeleton.time - lastTime, 0), aa = remaining;\n\t\t\tremaining += delta;\n\t\t\tlastTime = skeleton.time;\n\n\t\t\tfloat bx = bone.worldX, by = bone.worldY;\n\t\t\tif (reset) {\n\t\t\t\treset = false;\n\t\t\t\tux = bx;\n\t\t\t\tuy = by;\n\t\t\t} else {\n\t\t\t\tfloat a = remaining, i = p.inertia, f = skeleton.data.referenceScale, d = -1, m = 0, e = 0, ax = 0, ay = 0,\n\t\t\t\t\tqx = data.limit * delta, qy = qx * Math.abs(skeleton.scaleY);\n\t\t\t\tqx *= Math.abs(skeleton.scaleX);\n\t\t\t\tif (x || y) {\n\t\t\t\t\tif (x) {\n\t\t\t\t\t\tfloat u = (ux - bx) * i;\n\t\t\t\t\t\txOffset += u > qx ? qx : u < -qx ? -qx : u;\n\t\t\t\t\t\tux = bx;\n\t\t\t\t\t}\n\t\t\t\t\tif (y) {\n\t\t\t\t\t\tfloat u = (uy - by) * i;\n\t\t\t\t\t\tyOffset += u > qy ? qy : u < -qy ? -qy : u;\n\t\t\t\t\t\tuy = by;\n\t\t\t\t\t}\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tfloat xs = xOffset, ys = yOffset;\n\t\t\t\t\t\td = (float)Math.pow(p.damping, 60 * t);\n\t\t\t\t\t\tm = t * p.massInverse;\n\t\t\t\t\t\te = p.strength;\n\t\t\t\t\t\tfloat w = f * p.wind, g = f * p.gravity;\n\t\t\t\t\t\tax = (w * skeleton.windX + g * skeleton.gravityX) * skeleton.scaleX;\n\t\t\t\t\t\tay = (w * skeleton.windY + g * skeleton.gravityY) * skeleton.scaleY;\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\tif (x) {\n\t\t\t\t\t\t\t\txVelocity += (ax - xOffset * e) * m;\n\t\t\t\t\t\t\t\txOffset += xVelocity * t;\n\t\t\t\t\t\t\t\txVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (y) {\n\t\t\t\t\t\t\t\tyVelocity -= (ay + yOffset * e) * m;\n\t\t\t\t\t\t\t\tyOffset += yVelocity * t;\n\t\t\t\t\t\t\t\tyVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t} while (a >= t);\n\t\t\t\t\t\txLag = xOffset - xs;\n\t\t\t\t\t\tyLag = yOffset - ys;\n\t\t\t\t\t}\n\t\t\t\t\tz = Math.max(0, 1 - a / t);\n\t\t\t\t\tif (x) bone.worldX += (xOffset - xLag * z) * mix * data.x;\n\t\t\t\t\tif (y) bone.worldY += (yOffset - yLag * z) * mix * data.y;\n\t\t\t\t}\n\t\t\t\tif (rotateOrShearX || scaleX) {\n\t\t\t\t\tfloat ca = atan2(bone.c, bone.a), c, s, mr = 0, dx = cx - bone.worldX, dy = cy - bone.worldY;\n\t\t\t\t\tif (dx > qx)\n\t\t\t\t\t\tdx = qx;\n\t\t\t\t\telse if (dx < -qx) //\n\t\t\t\t\t\tdx = -qx;\n\t\t\t\t\tif (dy > qy)\n\t\t\t\t\t\tdy = qy;\n\t\t\t\t\telse if (dy < -qy) //\n\t\t\t\t\t\tdy = -qy;\n\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\tmr = (data.rotate + data.shearX) * mix;\n\t\t\t\t\t\tz = rotateLag * Math.max(0, 1 - aa / t);\n\t\t\t\t\t\tfloat r = atan2(dy + ty, dx + tx) - ca - (rotateOffset - z) * mr;\n\t\t\t\t\t\trotateOffset += (r - (float)Math.ceil(r * invPI2 - 0.5f) * PI2) * i;\n\t\t\t\t\t\tr = (rotateOffset - z) * mr + ca;\n\t\t\t\t\t\tc = cos(r);\n\t\t\t\t\t\ts = sin(r);\n\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\tr = l * bone.getWorldScaleX();\n\t\t\t\t\t\t\tif (r > 0) scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc = cos(ca);\n\t\t\t\t\t\ts = sin(ca);\n\t\t\t\t\t\tfloat r = l * bone.getWorldScaleX() - scaleLag * Math.max(0, 1 - aa / t);\n\t\t\t\t\t\tif (r > 0) scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t}\n\t\t\t\t\ta = remaining;\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tif (d == -1) {\n\t\t\t\t\t\t\td = (float)Math.pow(p.damping, 60 * t);\n\t\t\t\t\t\t\tm = t * p.massInverse;\n\t\t\t\t\t\t\te = p.strength;\n\t\t\t\t\t\t\tfloat w = f * p.wind, g = f * p.gravity;\n\t\t\t\t\t\t\tax = (w * skeleton.windX + g * skeleton.gravityX) * skeleton.scaleX;\n\t\t\t\t\t\t\tay = (w * skeleton.windY + g * skeleton.gravityY) * skeleton.scaleY;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfloat rs = rotateOffset, ss = scaleOffset, h = l / f;\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\t\tscaleVelocity += (ax * c - ay * s - scaleOffset * e) * m;\n\t\t\t\t\t\t\t\tscaleOffset += scaleVelocity * t;\n\t\t\t\t\t\t\t\tscaleVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\t\t\trotateVelocity -= ((ax * s + ay * c) * h + rotateOffset * e) * m;\n\t\t\t\t\t\t\t\trotateOffset += rotateVelocity * t;\n\t\t\t\t\t\t\t\trotateVelocity *= d;\n\t\t\t\t\t\t\t\tif (a < t) break;\n\t\t\t\t\t\t\t\tfloat r = rotateOffset * mr + ca;\n\t\t\t\t\t\t\t\tc = cos(r);\n\t\t\t\t\t\t\t\ts = sin(r);\n\t\t\t\t\t\t\t} else if (a < t) //\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trotateLag = rotateOffset - rs;\n\t\t\t\t\t\tscaleLag = scaleOffset - ss;\n\t\t\t\t\t}\n\t\t\t\t\tz = Math.max(0, 1 - a / t);\n\t\t\t\t}\n\t\t\t\tremaining = a;\n\t\t\t}\n\t\t\tcx = bone.worldX;\n\t\t\tcy = bone.worldY;\n\t\t\tbreak;\n\t\tcase pose:\n\t\t\tz = Math.max(0, 1 - remaining / t);\n\t\t\tif (x) bone.worldX += (xOffset - xLag * z) * mix * data.x;\n\t\t\tif (y) bone.worldY += (yOffset - yLag * z) * mix * data.y;\n\t\t}\n\n\t\tif (rotateOrShearX) {\n\t\t\tfloat o = (rotateOffset - rotateLag * z) * mix, s, c, a;\n\t\t\tif (data.shearX > 0) {\n\t\t\t\tfloat r = 0;\n\t\t\t\tif (data.rotate > 0) {\n\t\t\t\t\tr = o * data.rotate;\n\t\t\t\t\ts = sin(r);\n\t\t\t\t\tc = cos(r);\n\t\t\t\t\ta = bone.b;\n\t\t\t\t\tbone.b = c * a - s * bone.d;\n\t\t\t\t\tbone.d = s * a + c * bone.d;\n\t\t\t\t}\n\t\t\t\tr += o * data.shearX;\n\t\t\t\ts = sin(r);\n\t\t\t\tc = cos(r);\n\t\t\t\ta = bone.a;\n\t\t\t\tbone.a = c * a - s * bone.c;\n\t\t\t\tbone.c = s * a + c * bone.c;\n\t\t\t} else {\n\t\t\t\to *= data.rotate;\n\t\t\t\ts = sin(o);\n\t\t\t\tc = cos(o);\n\t\t\t\ta = bone.a;\n\t\t\t\tbone.a = c * a - s * bone.c;\n\t\t\t\tbone.c = s * a + c * bone.c;\n\t\t\t\ta = bone.b;\n\t\t\t\tbone.b = c * a - s * bone.d;\n\t\t\t\tbone.d = s * a + c * bone.d;\n\t\t\t}\n\t\t}\n\t\tif (scaleX) {\n\t\t\tfloat s = 1 + (scaleOffset - scaleLag * z) * mix * data.scaleX;\n\t\t\tbone.a *= s;\n\t\t\tbone.c *= s;\n\t\t}\n\t\tif (physics != Physics.pose) {\n\t\t\ttx = l * bone.a;\n\t\t\tty = l * bone.c;\n\t\t}\n\t\tbone.modifyWorld(skeleton.update);\n\t}\n\n\tvoid sort (Skeleton skeleton) {\n\t\tBone bone = this.bone.bone;\n\t\tskeleton.sortBone(bone);\n\t\tskeleton.updateCache.add(this);\n\t\tskeleton.sortReset(bone.children);\n\t\tskeleton.constrained(bone);\n\t}\n\n\tboolean isSourceActive () {\n\t\treturn bone.bone.active;\n\t}\n\n\t/** The bone constrained by this physics constraint. */\n\tpublic BonePose getBone () {\n\t\treturn bone;\n\t}\n\n\tpublic void setBone (BonePose bone) {\n\t\tthis.bone = bone;\n\t}\n}\n```\n\n**C++ Header (PhysicsConstraint.h)**\n\n```cpp\n#ifndef Spine_PhysicsConstraint_h\n#define Spine_PhysicsConstraint_h\n\n#include <spine/Constraint.h>\n#include <spine/PhysicsConstraintData.h>\n#include <spine/PhysicsConstraintPose.h>\n#include <spine/BonePose.h>\n#include <spine/Vector.h>\n\nnamespace spine {\n\tclass Skeleton;\n\tclass BonePose;\n\tclass PhysicsConstraintPose;\n\n\t/// Stores the current pose for a physics constraint. A physics constraint applies physics to bones.\n\t///\n\t/// See https://esotericsoftware.com/spine-physics-constraints Physics constraints in the Spine User Guide.\n\tclass SP_API PhysicsConstraint : public ConstraintGeneric<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose> {\n\t\tfriend class Skeleton;\n\t\tfriend class PhysicsConstraintTimeline;\n\t\tfriend class PhysicsConstraintInertiaTimeline;\n\t\tfriend class PhysicsConstraintStrengthTimeline;\n\t\tfriend class PhysicsConstraintDampingTimeline;\n\t\tfriend class PhysicsConstraintMassTimeline;\n\t\tfriend class PhysicsConstraintWindTimeline;\n\t\tfriend class PhysicsConstraintGravityTimeline;\n\t\tfriend class PhysicsConstraintMixTimeline;\n\t\tfriend class PhysicsConstraintResetTimeline;\n\n\tpublic:\n\t\tRTTI_DECL\n\n\t\tPhysicsConstraint(PhysicsConstraintData& data, Skeleton& skeleton);\n\n\t\tvoid update(Skeleton& skeleton, Physics physics) override;\n\t\tvoid sort(Skeleton& skeleton) override;\n\t\tbool isSourceActive() override;\n\t\tPhysicsConstraint* copy(Skeleton& skeleton);\n\n\t\tvoid reset(Skeleton& skeleton);\n\n\t\t/// Translates the physics constraint so next update() forces are applied as if the bone moved an additional amount in world space.\n\t\tvoid translate(float x, float y);\n\n\t\t/// Rotates the physics constraint so next update() forces are applied as if the bone rotated around the specified point in world space.\n\t\tvoid rotate(float x, float y, float degrees);\n\n\t\t/// The bone constrained by this physics constraint.\n\t\tBonePose& getBone();\n\t\tvoid setBone(BonePose& bone);\n\n\tprivate:\n\t\tBonePose* _bone;\n\n\t\tbool _reset;\n\t\tfloat _ux, _uy, _cx, _cy, _tx, _ty;\n\t\tfloat _xOffset, _xLag, _xVelocity;\n\t\tfloat _yOffset, _yLag, _yVelocity;\n\t\tfloat _rotateOffset, _rotateLag, _rotateVelocity;\n\t\tfloat _scaleOffset, _scaleLag, _scaleVelocity;\n\t\tfloat _remaining, _lastTime;\n\t};\n}\n\n#endif /* Spine_PhysicsConstraint_h */\n```\n\n**C++ Implementation (PhysicsConstraint.cpp)**\n\n```cpp\n#include <spine/PhysicsConstraint.h>\n#include <spine/PhysicsConstraintData.h>\n#include <spine/PhysicsConstraintPose.h>\n#include <spine/BonePose.h>\n#include <spine/Skeleton.h>\n#include <spine/SkeletonData.h>\n#include <spine/BoneData.h>\n#include <spine/Bone.h>\n#include <spine/MathUtil.h>\n\nusing namespace spine;\n\nRTTI_IMPL(PhysicsConstraint, Constraint)\n\nPhysicsConstraint::PhysicsConstraint(PhysicsConstraintData &data, Skeleton &skeleton) : ConstraintGeneric<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose>(data),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_reset(true), _ux(0), _uy(0), _cx(0), _cy(0), _tx(0), _ty(0),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_xOffset(0), _xLag(0), _xVelocity(0), _yOffset(0), _yLag(0), _yVelocity(0),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_rotateOffset(0), _rotateLag(0), _rotateVelocity(0), _scaleOffset(0), _scaleLag(0), _scaleVelocity(0),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_remaining(0), _lastTime(0) {\n\n\t_bone = &skeleton._bones[(size_t) data._bone->getIndex()]->_constrained;\n}\n\nPhysicsConstraint *PhysicsConstraint::copy(Skeleton &skeleton) {\n\tPhysicsConstraint *copy = new (__FILE__, __LINE__) PhysicsConstraint(_data, skeleton);\n\tcopy->_pose.set(_pose);\n\treturn copy;\n}\n\nvoid PhysicsConstraint::reset(Skeleton &skeleton) {\n\t_remaining = 0;\n\t_lastTime = skeleton.getTime();\n\t_reset = true;\n\t_xOffset = 0;\n\t_xLag = 0;\n\t_xVelocity = 0;\n\t_yOffset = 0;\n\t_yLag = 0;\n\t_yVelocity = 0;\n\t_rotateOffset = 0;\n\t_rotateLag = 0;\n\t_rotateVelocity = 0;\n\t_scaleOffset = 0;\n\t_scaleLag = 0;\n\t_scaleVelocity = 0;\n}\n\nvoid PhysicsConstraint::translate(float x, float y) {\n\t_ux -= x;\n\t_uy -= y;\n\t_cx -= x;\n\t_cy -= y;\n}\n\nvoid PhysicsConstraint::rotate(float x, float y, float degrees) {\n\tfloat r = degrees * MathUtil::Deg_Rad, cosVal = MathUtil::cos(r), sinVal = MathUtil::sin(r);\n\tfloat dx = _cx - x, dy = _cy - y;\n\ttranslate(dx * cosVal - dy * sinVal - dx, dx * sinVal + dy * cosVal - dy);\n}\n\nvoid PhysicsConstraint::update(Skeleton &skeleton, Physics physics) {\n\tPhysicsConstraintPose &p = *_applied;\n\tfloat mix = p._mix;\n\tif (mix == 0) return;\n\n\tbool x = _data._x > 0, y = _data._y > 0, rotateOrShearX = _data._rotate > 0 || _data._shearX > 0, scaleX = _data._scaleX > 0;\n\tBonePose *bone = _bone;\n\tfloat l = bone->_bone->_data.getLength(), t = _data._step, z = 0;\n\n\tswitch (physics) {\n\t\tcase Physics_None:\n\t\t\treturn;\n\t\tcase Physics_Reset:\n\t\t\treset(skeleton);\n\t\t\t// Fall through.\n\t\tcase Physics_Update: {\n\t\t\tfloat delta = MathUtil::max(skeleton._time - _lastTime, 0.0f), aa = _remaining;\n\t\t\t_remaining += delta;\n\t\t\t_lastTime = skeleton._time;\n\n\t\t\tfloat bx = bone->_worldX, by = bone->_worldY;\n\t\t\tif (_reset) {\n\t\t\t\t_reset = false;\n\t\t\t\t_ux = bx;\n\t\t\t\t_uy = by;\n\t\t\t} else {\n\t\t\t\tfloat a = _remaining, i = p._inertia, f = skeleton._data.getReferenceScale(), d = -1, m = 0, e = 0, ax = 0, ay = 0,\n\t\t\t\t\t  qx = _data._limit * delta, qy = qx * MathUtil::abs(skeleton.getScaleY());\n\t\t\t\tqx *= MathUtil::abs(skeleton._scaleX);\n\t\t\t\tif (x || y) {\n\t\t\t\t\tif (x) {\n\t\t\t\t\t\tfloat u = (_ux - bx) * i;\n\t\t\t\t\t\t_xOffset += u > qx ? qx : u < -qx ? -qx\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  : u;\n\t\t\t\t\t\t_ux = bx;\n\t\t\t\t\t}\n\t\t\t\t\tif (y) {\n\t\t\t\t\t\tfloat u = (_uy - by) * i;\n\t\t\t\t\t\t_yOffset += u > qy ? qy : u < -qy ? -qy\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  : u;\n\t\t\t\t\t\t_uy = by;\n\t\t\t\t\t}\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tfloat xs = _xOffset, ys = _yOffset;\n\t\t\t\t\t\td = MathUtil::pow(p._damping, 60 * t);\n\t\t\t\t\t\tm = t * p._massInverse;\n\t\t\t\t\t\te = p._strength;\n\t\t\t\t\t\tfloat w = f * p._wind, g = f * p._gravity;\n\t\t\t\t\t\tax = (w * skeleton._windX + g * skeleton._gravityX) * skeleton._scaleX;\n\t\t\t\t\t\tay = (w * skeleton._windY + g * skeleton._gravityY) * skeleton.getScaleY();\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\tif (x) {\n\t\t\t\t\t\t\t\t_xVelocity += (ax - _xOffset * e) * m;\n\t\t\t\t\t\t\t\t_xOffset += _xVelocity * t;\n\t\t\t\t\t\t\t\t_xVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (y) {\n\t\t\t\t\t\t\t\t_yVelocity -= (ay + _yOffset * e) * m;\n\t\t\t\t\t\t\t\t_yOffset += _yVelocity * t;\n\t\t\t\t\t\t\t\t_yVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t} while (a >= t);\n\t\t\t\t\t\t_xLag = _xOffset - xs;\n\t\t\t\t\t\t_yLag = _yOffset - ys;\n\t\t\t\t\t}\n\t\t\t\t\tz = MathUtil::max(0.0f, 1 - a / t);\n\t\t\t\t\tif (x) bone->_worldX += (_xOffset - _xLag * z) * mix * _data._x;\n\t\t\t\t\tif (y) bone->_worldY += (_yOffset - _yLag * z) * mix * _data._y;\n\t\t\t\t}\n\t\t\t\tif (rotateOrShearX || scaleX) {\n\t\t\t\t\tfloat ca = MathUtil::atan2(bone->_c, bone->_a), c, s, mr = 0, dx = _cx - bone->_worldX, dy = _cy - bone->_worldY;\n\t\t\t\t\tif (dx > qx)\n\t\t\t\t\t\tdx = qx;\n\t\t\t\t\telse if (dx < -qx)\n\t\t\t\t\t\tdx = -qx;\n\t\t\t\t\tif (dy > qy)\n\t\t\t\t\t\tdy = qy;\n\t\t\t\t\telse if (dy < -qy)\n\t\t\t\t\t\tdy = -qy;\n\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\tmr = (_data._rotate + _data._shearX) * mix;\n\t\t\t\t\t\tz = _rotateLag * MathUtil::max(0.0f, 1 - aa / t);\n\t\t\t\t\t\tfloat r = MathUtil::atan2(dy + _ty, dx + _tx) - ca - (_rotateOffset - z) * mr;\n\t\t\t\t\t\t_rotateOffset += (r - MathUtil::ceil(r * MathUtil::InvPi_2 - 0.5f) * MathUtil::Pi_2) * i;\n\t\t\t\t\t\tr = (_rotateOffset - z) * mr + ca;\n\t\t\t\t\t\tc = MathUtil::cos(r);\n\t\t\t\t\t\ts = MathUtil::sin(r);\n\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\tr = l * bone->getWorldScaleX();\n\t\t\t\t\t\t\tif (r > 0) _scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc = MathUtil::cos(ca);\n\t\t\t\t\t\ts = MathUtil::sin(ca);\n\t\t\t\t\t\tfloat r = l * bone->getWorldScaleX() - _scaleLag * MathUtil::max(0.0f, 1 - aa / t);\n\t\t\t\t\t\tif (r > 0) _scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t}\n\t\t\t\t\ta = _remaining;\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tif (d == -1) {\n\t\t\t\t\t\t\td = MathUtil::pow(p._damping, 60 * t);\n\t\t\t\t\t\t\tm = t * p._massInverse;\n\t\t\t\t\t\t\te = p._strength;\n\t\t\t\t\t\t\tfloat w = f * p._wind, g = f * p._gravity;\n\t\t\t\t\t\t\tax = (w * skeleton._windX + g * skeleton._gravityX) * skeleton._scaleX;\n\t\t\t\t\t\t\tay = (w * skeleton._windY + g * skeleton._gravityY) * skeleton.getScaleY();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfloat rs = _rotateOffset, ss = _scaleOffset, h = l / f;\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\t\t_scaleVelocity += (ax * c - ay * s - _scaleOffset * e) * m;\n\t\t\t\t\t\t\t\t_scaleOffset += _scaleVelocity * t;\n\t\t\t\t\t\t\t\t_scaleVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\t\t\t_rotateVelocity -= ((ax * s + ay * c) * h + _rotateOffset * e) * m;\n\t\t\t\t\t\t\t\t_rotateOffset += _rotateVelocity * t;\n\t\t\t\t\t\t\t\t_rotateVelocity *= d;\n\t\t\t\t\t\t\t\tif (a < t) break;\n\t\t\t\t\t\t\t\tfloat r = _rotateOffset * mr + ca;\n\t\t\t\t\t\t\t\tc = MathUtil::cos(r);\n\t\t\t\t\t\t\t\ts = MathUtil::sin(r);\n\t\t\t\t\t\t\t} else if (a < t)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_rotateLag = _rotateOffset - rs;\n\t\t\t\t\t\t_scaleLag = _scaleOffset - ss;\n\t\t\t\t\t}\n\t\t\t\t\tz = MathUtil::max(0.0f, 1 - a / t);\n\t\t\t\t}\n\t\t\t\t_remaining = a;\n\t\t\t}\n\t\t\t_cx = bone->_worldX;\n\t\t\t_cy = bone->_worldY;\n\t\t\tbreak;\n\t\t}\n\t\tcase Physics_Pose: {\n\t\t\tz = MathUtil::max(0.0f, 1 - _remaining / t);\n\t\t\tif (x) bone->_worldX += (_xOffset - _xLag * z) * mix * _data._x;\n\t\t\tif (y) bone->_worldY += (_yOffset - _yLag * z) * mix * _data._y;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (rotateOrShearX) {\n\t\tfloat o = (_rotateOffset - _rotateLag * z) * mix, s, c, a;\n\t\tif (_data._shearX > 0) {\n\t\t\tfloat r = 0;\n\t\t\tif (_data._rotate > 0) {\n\t\t\t\tr = o * _data._rotate;\n\t\t\t\ts = MathUtil::sin(r);\n\t\t\t\tc = MathUtil::cos(r);\n\t\t\t\ta = bone->_b;\n\t\t\t\tbone->_b = c * a - s * bone->_d;\n\t\t\t\tbone->_d = s * a + c * bone->_d;\n\t\t\t}\n\t\t\tr += o * _data._shearX;\n\t\t\ts = MathUtil::sin(r);\n\t\t\tc = MathUtil::cos(r);\n\t\t\ta = bone->_a;\n\t\t\tbone->_a = c * a - s * bone->_c;\n\t\t\tbone->_c = s * a + c * bone->_c;\n\t\t} else {\n\t\t\to *= _data._rotate;\n\t\t\ts = MathUtil::sin(o);\n\t\t\tc = MathUtil::cos(o);\n\t\t\ta = bone->_a;\n\t\t\tbone->_a = c * a - s * bone->_c;\n\t\t\tbone->_c = s * a + c * bone->_c;\n\t\t\ta = bone->_b;\n\t\t\tbone->_b = c * a - s * bone->_d;\n\t\t\tbone->_d = s * a + c * bone->_d;\n\t\t}\n\t}\n\tif (scaleX) {\n\t\tfloat s = 1 + (_scaleOffset - _scaleLag * z) * mix * _data._scaleX;\n\t\tbone->_a *= s;\n\t\tbone->_c *= s;\n\t}\n\tif (physics != Physics_Pose) {\n\t\t_tx = l * bone->_a;\n\t\t_ty = l * bone->_c;\n\t}\n\tbone->modifyWorld(skeleton._update);\n}\n\nvoid PhysicsConstraint::sort(Skeleton &skeleton) {\n\tBone *bone = _bone->_bone;\n\tskeleton.sortBone(bone);\n\tskeleton._updateCache.add(this);\n\tskeleton.sortReset(bone->_children);\n\tskeleton.constrained(*bone);\n}\n\nbool PhysicsConstraint::isSourceActive() {\n\treturn _bone->_bone->isActive();\n}\n\nBonePose &PhysicsConstraint::getBone() {\n\treturn *_bone;\n}\n\nvoid PhysicsConstraint::setBone(BonePose &bone) {\n\t_bone = &bone;\n}\n```\n\nMuch of this porting work is mechanical and can be automated, like getters and setters, transferring documentation from Javadoc to docstrings, or ensuring the math matches. Some of the porting work requires a human brain, like translating Java generics to C++ templates, a task LLMs aren't very good at. What LLMs are good at is helping me double-check that I ported every line faithfully. This presented the perfect opportunity to apply my little workflow experiment to a real-world task on a real-world, largish codebase.\n\n## The \"Port Java to X\" Program\n\nTime to write our program. We're essentially encoding my manual workflow into a structured LLM program. The goal: go through each Java type that changed between two commits and port it to a target runtime (like C++) collaboratively with the user.\n\nInstead of me manually opening diffs, tracking dependencies, and porting line-by-line while my brain melts, we'll have the LLM handle the mechanical parts while I stay in control of the decisions that matter.\n\nThe final result of this program design can be found in the [spine-port repository](https://github.com/badlogic/spine-port). The program itself is stored in a file called [`port.md`](https://github.com/badlogic/spine-port/blob/main/port.md). When I want to start or continue porting, I start Claude Code in the spine-port directory and tell it to read the `port.md` file in full and execute the workflow. That starts the \"program\".\n\nWriting the `port.md` file was an iterative, collaborative process between me and Claude. In the following sections, we'll walk through each section of this program.\n\n### Initial Input and State\n\nEvery program needs input data and initial state to work with. The `port.md` file starts by defining the data structure that serves as both:\n\n````markdown\n# Spine Runtimes Porting Program\n\nCollaborative porting of changes between two commits in the Spine runtime\nreference implementation (Java) to a target runtime. Work tracked in\n`porting-plan.json` which has the following format:\n\n```json\n{\n  \"metadata\": {\n    \"prevBranch\": \"4.2\",\n    \"currentBranch\": \"4.3-beta\",\n    \"generated\": \"2024-06-30T...\",\n    \"spineRuntimesDir\": \"/absolute/path/to/spine-runtimes\",\n    \"targetRuntime\": \"spine-cpp\",\n    \"targetRuntimePath\": \"/absolute/path/to/spine-runtimes/spine-cpp/spine-cpp\",\n    \"targetRuntimeLanguage\": \"cpp\"\n  },\n  \"deletedFiles\": [\n    {\n      \"filePath\": \"/path/to/deleted/File.java\",\n      \"status\": \"pending\"\n    }\n  ],\n  \"portingOrder\": [\n    {\n      \"javaSourcePath\": \"/path/to/EnumFile.java\",\n      \"types\": [\n        {\n          \"name\": \"Animation\",\n          \"kind\": \"enum\",\n          \"startLine\": 45,\n          \"endLine\": 52,\n          \"isInner\": false,\n          \"portingState\": \"pending\",\n          \"candidateFiles\": [\"/path/to/spine-cpp/include/spine/Animation.h\", \"/path/to/spine-cpp/include/spine/Animation.cpp\"]\n        }\n      ]\n    }\n  ]\n}\n```\n````\n\nThis data structure is the central state that tracks our porting progress. The `porting-plan.json` file serves as both the initial input and the persistent state for our LLM program. Let's break down what each part means:\n\n**metadata**: Configuration for the porting session:\n\n- `prevBranch` and `currentBranch`: The git commits we're porting between\n- `spineRuntimesDir`: Where all the runtime implementations live\n- `targetRuntime`, `targetRuntimePath`, `targetRuntimeLanguage`: Which runtime we're porting to and where to find it\n\n**deletedFiles**: Java files that were removed and need corresponding deletions in the target runtime\n\n**portingOrder**: The heart of the plan. Each entry represents a Java file that changed and contains:\n\n- `javaSourcePath`: The full path to the Java source file\n- `types`: An array of all classes, interfaces, and enums in that file, each with:\n  - `name`: The type name (e.g., \"Animation\")\n  - `kind`: Whether it's a class, interface, or enum\n  - `startLine` and `endLine`: Where to find it in the Java file\n  - `isInner`: Whether it's an inner type\n  - `portingState`: Tracks progress: \"pending\" or \"done\"\n  - `candidateFiles`: Where this type likely exists in the target runtime\n\nThe `portingState` field is crucial: it's how the LLM tracks what's been done across sessions. When I stop and restart later, the program knows exactly where to pick up.\n\nBut how do we generate all this structured data? Before the LLM can start porting, we need to analyze what changed between the two versions and prepare the data in a format the LLM can efficiently query. I wrote [`generate-porting-plan.js`](https://github.com/badlogic/spine-port/blob/main/generate-porting-plan.js) to automate this preparation:\n\n```bash\n./generate-porting-plan.js 4.2 4.3-beta /path/to/spine-runtimes spine-cpp\n```\n\nThis script does several things:\n\n1. **Runs git diff** to find all Java files that changed between the two commits\n2. **Uses [`lsp-cli`](https://github.com/badlogic/lsp-cli)** to extract complete type information from both the Java reference implementation and the target runtime\n3. **Analyzes dependencies** to create a porting order (enums before interfaces before classes)\n4. **Finds candidate files** in the target runtime where each type likely exists\n5. **Outputs a structured JSON file** that the LLM can read from and write to efficiently via `jq`.\n\nWhy pre-generate all this data instead of having the LLM explore the codebase as it goes?\n\n**Determinism**: The same inputs always produce the same plan. LLM exploration might miss files, use wrong search patterns, or get lost in the directory structure. Pre-generation ensures complete, accurate, and reproducible results.\n\n**Context efficiency**: The pre-generation saves tokens and turns by not needing the LLM to perform all the steps that `generate-porting-plan.js` does: running git diff, analyzing dependencies, extracting type information, finding candidate files. That's a lot of tool calls and context that would otherwise be wasted.\n\n**Speed**: Generating the plan takes seconds. Having the LLM explore the codebase would take orders of magnitude longer.\n\nThis transforms an open-ended exploration problem into structured data processing. Instead of \"figure out what changed and how to port it,\" the LLM gets \"here's exactly what changed, where it lives, and where it should go.\"\n\nNo tokens and turns wasted. The context contains only the information we need.\n\n### The Function Library\n\nThe next section of `port.md` defines the tools available to our LLM program. Just like traditional programs import libraries, our LLM program needs tools to interact with the world.\n\n````markdown\n## Tools\n\n### VS Claude\nUse the vs-claude MCP server tools for opening files and diffs for the user\nduring porting.\n\n```javascript\n// Open multiple files at once (batch operations)\nmcp__vs-claude__open([\n  {\"type\": \"file\", \"path\": \"/abs/path/Animation.java\"},    // Java source\n  {\"type\": \"file\", \"path\": \"/abs/path/Animation.h\"},       // C++ header\n  {\"type\": \"file\", \"path\": \"/abs/path/Animation.cpp\"}      // C++ source\n]);\n\n// Open single file with line range\nmcp__vs-claude__open({\"type\": \"file\", \"path\": \"/abs/path/Animation.java\", \"startLine\": 100, \"endLine\": 120});\n\n// View git diff for a file\nmcp__vs-claude__open({\"type\": \"gitDiff\", \"path\": \"/abs/path/Animation.cpp\", \"from\": \"HEAD\", \"to\": \"working\"});\n```\n````\n\n**VS Code Integration** keeps the human in the loop. The LLM doesn't just modify files in the background; it opens them in my editor so I can see what's happening. This uses [vs-claude](https://marketplace.visualstudio.com/items?itemName=MarioZechner.vs-claude), an extension I wrote that implements the Model Context Protocol (MCP), turning VS Code into the LLM's display device.\n\n````markdown\n### Progress Tracking\n\nMonitor porting progress using these jq commands:\n\n```bash\n# Get overall progress percentage\njq -r '.portingOrder | map(.types[]) | \"\\(([.[] | select(.portingState == \"done\")] | length)) types ported out of \\(length) total (\\(([.[] | select(.portingState == \"done\")] | length) * 100 / length | floor)% complete)\"' porting-plan.json\n\n# Count types by state\njq -r '.portingOrder | map(.types[]) | group_by(.portingState) | map({state: .[0].portingState, count: length}) | sort_by(.state)' porting-plan.json\n\n# List all completed types\njq -r '.portingOrder | map(.types[] | select(.portingState == \"done\") | .name) | sort | join(\", \")' porting-plan.json\n\n# Find remaining types to port\njq -r '.portingOrder | map(.types[] | select(.portingState == \"pending\") | .name) | length' porting-plan.json\n```\n````\n\n**Progress Tracking** functions that I can ask the LLM to run at any time. When I want to know how far we've gotten, I tell the LLM to execute one of these queries. They're pre-written and tested, ensuring the LLM uses efficient patterns instead of crafting its own potentially buggy versions.\n\n````markdown\n### Compile Testing\n\nFor C++, test compile individual files during porting:\n\n```bash\n./compile-cpp.js /path/to/spine-cpp/spine-cpp/src/spine/Animation.cpp\n```\n\nFor other languages, we can not compile individual files and should not try to.\n````\n\n**Compile Testing** includes language-specific build commands. Notice the explicit warning about other languages. This prevents the LLM from wasting time trying to compile individual TypeScript or Haxe files, which would fail. It's defensive programming: explicitly state what not to do. Though with our non-deterministic computer, there's always a chance it'll try anyway.\n\n### The Main Workflow\n\nNow we get to the heart of our program: the actual porting logic with its loops, conditionals, and human checkpoints.\n\n````markdown\n## Workflow\n\nPort one type at a time. Ensure the target runtime implementation is functionally\nequivalent to the reference implementation. The APIs must match, bar idiomatic\ndifferences, including type names, field names, method names, enum names,\nparameter names and so on. Implementations of methods must match EXACTLY, bar\nidiomatic differences, such as differences in collection types.\n\nFollow these steps to port each type:\n\n### 1. Setup (One-time)\n\nDO NOT use the TodoWrite and TodoRead tools for this phase!\n\n1. Read metadata from porting-plan.json:\n   ```bash\n   jq '.metadata' porting-plan.json\n   ```\n   - If this fails, abort and tell user to run generate-porting-plan.js\n   - Store these values for later use:\n      - targetRuntime (e.g., \"spine-cpp\")\n      - targetRuntimePath (e.g., \"/path/to/spine-cpp/spine-cpp\")\n      - targetRuntimeLanguage (e.g., \"cpp\")\n````\n\nLike any traditional program, this starts with initialization. The `jq '.metadata'` command is essentially a function call - the program tells the LLM exactly which function to invoke rather than having it figure out the extraction logic itself, saving tokens and turns. Notice the conditional: \"If this fails, abort\" - defensive programming ensuring the required input exists. The \"Store these values\" instruction doesn't actually store anything; it tells the LLM what variable names to use when referencing these values extracted from the porting plan metadata later, similar to how variable assignments work. Storage happens implicitly in the LLM's context.\n\n````markdown\n2. In parallel\n   a. Check for conventions file:\n      - Read `${targetRuntime}-conventions.md` (from step 1) in full.\n      - If missing:\n         - Use Task agents in parallel to analyze targetRuntimePath (from step 1)\n         - Document all coding patterns and conventions:\n            * Class/interface/enum definition syntax\n            * Member variable naming (prefixes like m_, _, etc.)\n            * Method naming conventions (camelCase vs snake_case)\n            * Inheritance syntax\n            * File organization (single file vs header/implementation)\n            * Namespace/module/package structure\n            * Memory management (GC, manual, smart pointers)\n            * Error handling (exceptions, error codes, Result types)\n            * Documentation format (Doxygen, JSDoc, etc.)\n            * Type system specifics (generics, templates)\n            * Property/getter/setter patterns\n      - Agents MUST use ripgrep instead of grep!\n      - Save as ${TARGET}-conventions.md\n      - STOP and ask the user to review the generated conventions file\n\n   b. Read `porting-notes.md` in full\n      - If missing create with content:\n      ```markdown\n      # Porting Notes\n      ```\n````\n\nThe \"in parallel\" instruction tells the LLM to use multiple tools simultaneously rather than sequentially, speeding up execution.\n\nStep 2a first tries to read the conventions file using **`${targetRuntime}-conventions.md`** - this is like string interpolation, where the LLM inserts the value for the target runtime name that it read from the porting plan. That conventions file captures the coding style and architecture patterns of the target runtime. This documents everything from naming conventions to memory management approaches, ensuring the LLM ports code that fits seamlessly into the existing codebase.\n\nStep 2b sets up the **porting notes file** as a scratch pad for the porting job. This contains observations and edge cases discovered while porting - things like \"Java uses `pose` but C++ uses `_applied` in this context\" or \"don't port toString() methods.\" It's a running log so we don't forget important discoveries that affect later porting decisions.\n\nIf either file doesn't exist, we create it.\n\nWhy generate the conventions file as part of the workflow instead of pre-generating it like the porting plan? Pre-generating conventions would require either manual work (time-consuming) or using an LLM with manual review anyway. Generating it inside the program ensures I don't have too many moving parts to juggle, and all instructions aimed at an LLM are contained in a single location: the program.\n\nHere are the actual conventions and porting notes files:\n\n**Conventions (spine-cpp-conventions.md)**\n\n````markdown\n# Spine-CPP Coding Conventions\n\n## File Organization\n\n### Directory Structure\n- Headers: `include/spine/` - Public API headers\n- Implementation: `src/spine/` - Implementation files (.cpp)\n- One class per file pattern (Animation.h/Animation.cpp)\n\n### Header Guards\n```cpp\n#ifndef Spine_Animation_h\n#define Spine_Animation_h\n// content\n#endif\n```\n\n## Naming Conventions\n\n### Classes and Types\n- **Classes**: PascalCase (e.g., `Animation`, `BoneTimeline`, `SkeletonData`)\n- **Enums**: PascalCase with prefixed values\n  ```cpp\n  enum MixBlend {\n      MixBlend_Setup,\n      MixBlend_First,\n      MixBlend_Replace,\n      MixBlend_Add\n  };\n  ```\n\n### Variables\n- **Member variables**: Underscore prefix + camelCase\n  ```cpp\n  private:\n      float _duration;\n      Vector<Timeline*> _timelines;\n      bool _hasDrawOrder;\n  ```\n- **Parameters**: camelCase, often with \"inValue\" suffix for setters\n  ```cpp\n  void setDuration(float inValue) { _duration = inValue; }\n  ```\n- **Local variables**: camelCase (e.g., `timelineCount`, `lastTime`)\n\n### Methods\n- **Public methods**: camelCase\n  ```cpp\n  float getDuration() { return _duration; }\n  void apply(Skeleton& skeleton, float lastTime, float time, ...);\n  ```\n- **Getters/Setters**: get/set prefix pattern\n  ```cpp\n  const String& getName() { return _name; }\n  void setName(const String& inValue) { _name = inValue; }\n  ```\n\n## Class Structure\n\n### Base Class Pattern\nAll classes inherit from `SpineObject`:\n```cpp\nclass SP_API Animation : public SpineObject {\n    // ...\n};\n```\n\n### Access Modifiers Order\n1. Friend declarations\n2. Public members\n3. Protected members\n4. Private members\n\n### Friend Classes\nExtensive use for internal access:\n```cpp\nfriend class AnimationState;\nfriend class AnimationStateData;\n```\n\n## Memory Management\n\n### Manual Memory Management\n- No smart pointers\n- Explicit new/delete with custom allocators\n- SpineObject base class provides memory tracking\n\n### Object Pools\n```cpp\nclass SP_API Pool<T> : public SpineObject {\n    // Efficient object recycling\n};\n```\n\n### Vector Usage\nCustom Vector class instead of std::vector:\n```cpp\nVector<Timeline*> _timelines;\n```\n\n## Type System\n\n### Custom String Class\n```cpp\nclass SP_API String : public SpineObject {\n    // UTF-8 aware string implementation\n};\n```\n\n### Container Types\n- `Vector<T>` - Dynamic array\n- `HashMap<K,V>` - Hash map implementation\n- `Pool<T>` - Object pool\n\n### RTTI Usage\nRuntime type information with RTTI macros:\n```cpp\nRTTI_DECL\nRTTI_IMPL(Animation, SpineObject)\n```\n\n## Error Handling\n\n### No Exceptions\n- Uses assertions for debug builds\n- Return values indicate success/failure\n- assert() for internal invariants\n\n### Assertions\n```cpp\nassert(timelineCount == _timelines.size());\n```\n\n## Documentation\n\n### Triple-Slash Comments\n```cpp\n/// @brief Sets the duration of the animation.\n/// @param inValue The duration in seconds.\nvoid setDuration(float inValue);\n```\n\n### File Headers\n```cpp\n/******************************************************************************\n * Spine Runtimes License Agreement\n * ...\n *****************************************************************************/\n```\n\n## Platform Handling\n\n### DLL Export/Import\n```cpp\n#ifdef SPINE_CPP_DLL\n    #ifdef _MSC_VER\n        #define SP_API __declspec(dllexport)\n    #else\n        #define SP_API __attribute__((visibility(\"default\")))\n    #endif\n#else\n    #define SP_API\n#endif\n```\n\n### Platform-Specific Code\nMinimal, mostly in Extension.cpp\n\n## Include Style\n\n### System Headers\n```cpp\n#include <spine/SpineObject.h>\n#include <spine/Vector.h>\n```\n\n### Forward Declarations\nUsed extensively to minimize dependencies:\n```cpp\nnamespace spine {\n    class Skeleton;\n    class Event;\n}\n```\n\n## Special Patterns\n\n### Inline Getters/Setters\nSimple accessors defined in headers:\n```cpp\nfloat getDuration() { return _duration; }\n```\n\n### Const Correctness\n- Const methods where appropriate\n- Const references for parameters\n```cpp\nvoid apply(Skeleton& skeleton, float lastTime, float time,\n          Vector<Event*>* pEvents, float alpha,\n          MixBlend blend, MixDirection direction);\n```\n\n### No STL Usage\nCustom implementations for all containers, minimal stdlib dependency\n\n## Build System\n\n### CMake Integration\n- include directories specified in CMakeLists.txt\n- Separate static/shared library targets\n\n### Compiler Flags\n- C++11 standard\n- RTTI enabled\n- No exceptions (-fno-exceptions on some platforms)\n````\n\n**Porting Notes (porting-notes.md)**\n\n```markdown\n# Porting Notes\n\n## Java to C++ Porting Conventions\n\n### Direct Field Access vs Getters/Setters\n- C++ uses direct field access (e.g., `p._mixRotate`) where Java uses direct field access (e.g., `p.mixRotate`)\n- C++ uses underscore prefix for private fields but accesses them directly via friend classes\n- This is intentional - C++ classes are friends of each other to allow direct field access\n- Do NOT change direct field access to getter/setter calls in C++\n- Java `slot.pose.attachment` → C++ `_slot->_pose._attachment` (NOT `_slot->getPose()._attachment`)\n\n### Override Keywords\n- When fixing override warnings, add `virtual` and `override` keywords to methods in derived classes\n- Example: `PathConstraintData &getData();` → `virtual PathConstraintData &getData() override;`\n\n### Pose vs Applied Usage (CRITICAL)\n- C++ MUST use the same pose reference as Java\n- If Java uses `applied`, C++ must use `_applied`\n- If Java uses `pose`, C++ must use `_pose`\n- Never mix these up - they represent different states in the constraint system\n- Example:\n  - Java: `IkConstraintPose p = applied;` → C++: `IkConstraintPose &p = *_applied;`\n  - Java: `copy.pose.set(pose);` → C++: `copy->_pose.set(_pose);`\n\n### Constraint Pose Initialization\n- In Java, constraint constructors pass new pose instances to the parent constructor\n- In C++, `ConstraintGeneric` allocates poses as member fields (_pose and _constrained), not through constructor\n- Example: Java `super(data, new PhysicsConstraintPose(), new PhysicsConstraintPose())`\n- C++ just calls `ConstraintGeneric<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose>(data)`\n\n### Method Name Differences\n- Java `Posed.reset()` → C++ `PosedGeneric::resetConstrained()`\n- This naming difference must exist to avoid conflicts with other reset methods in C++\n- The Java code has a comment `// Port: resetConstrained` indicating this is intentional\n\n### Methods NOT Ported\n- `toString()` methods are not ported to C++\n- Methods that use `Matrix3` type in Java are not ported to C++\n\n### Parameter Conversions\n- Methods that take `Vector2` in Java are \"unrolled\" in C++ to use separate float parameters:\n  - Java: `worldToLocal(Vector2 world)`\n  - C++: `worldToLocal(float worldX, float worldY, float& outLocalX, float& outLocalY)`\n\n## Dark Color Handling Pattern\n- Java uses `@Null Color darkColor` (nullable reference)\n- C++ uses `Color _darkColor` with `bool _hasDarkColor` flag\n- This avoids manual memory management while maintaining the same functionality\n- The _hasDarkColor boolean indicates whether a dark color has been set\n- Example: SlotPose class uses this pattern\n\n## Event Class (Ported - 4.3-beta update)\n- Method names updated to match Java API:\n  - `getIntValue()` → `getInt()`\n  - `setIntValue()` → `setInt()`\n  - `getFloatValue()` → `getFloat()`\n  - `setFloatValue()` → `setFloat()`\n  - `getStringValue()` → `getString()`\n  - `setStringValue()` → `setString()`\n- Constructor now initializes values from EventData defaults to match Java behavior\n```\n\nAt this point, we have exactly what we need in the context and nothing else: `port.md` in full (the program), the metadata from the porting plan JSON, the target runtime conventions in full, and the porting notes in full.\n\nAnd now here's the main loop that does the actual porting:\n\n````markdown\n### 2. Port Types (Repeat for each)\n\n1. **Find next pending type:**\n   ```bash\n   # Get next pending type info with candidate files\n   jq -r '.portingOrder[] | {file: .javaSourcePath, types: .types[] | select(.portingState == \"pending\")} | \"\\(.file)|\\(.types.name)|\\(.types.kind)|\\(.types.startLine)|\\(.types.endLine)|\\(.types.candidateFiles | join(\",\"))\"' porting-plan.json | head -1\n   ```\n\n2. **Open files in VS Code via vs-claude (for user review):**\n   - Open Java file and Java file git diff (from prevBranch to currentBranch)\n   - If candidateFiles exists: open all candidate files\n\n3. **Confirm with user:**\n   - Ask: \"Port this type? (y/n)\"\n   - STOP and wait for confirmation.\n\n4. **Read source files:**\n   - Note: Read the files in parallel if possible\n   - Java: Read the ENTIRE file so it is fully in your context!\n   - Target: If exists, read the ENTIRE file(s) so they are fully in your context!\n   - For large files (>2000 lines): Read in chunks of 1000 lines\n   - Read parent types if needed (check extends/implements)\n   - Goal: Have complete files in context for accurate porting\n\n5. **Port the type:**\n   - Follow conventions from ${targetRuntime}-conventions.md\n   - If target file(s) don't exist, create them and open them for the user via vs-claude\n   - Port incrementally and always ultrathink:\n     * Base on the full content of the files in your context, identify differences and changes that need to be made.\n      * differences can be due to idiomatic differences, or real differences due to new or changed functionality in the reference\n        implementation. Ultrathink to discern which is which.\n     * If changes need to be made:\n       * Structure first (fields, method signatures)\n       * Then method implementations\n       * For C++: Run `./compile-cpp.js` after each method\n   - Use MultiEdit for all changes to one file\n   - Ensure 100% functional parity\n   - Add or update jsdoc, doxygen, etc. based on Javadocs.\n\n6. **Get user confirmation:**\n   - Open a diff of the files you modified, comparing HEAD to working.\n   - Give the user a summary of what you ported\n   - Ask: \"Mark as done? (y/n)\"\n   - If yes, update status:\n   ```bash\n   jq --arg file \"path/to/file.java\" --arg type \"TypeName\" \\\n      '(.portingOrder[] | select(.javaSourcePath == $file) | .types[] | select(.name == $type) | .portingState) = \"done\"' \\\n      porting-plan.json > tmp.json && mv tmp.json porting-plan.json\n   ```\n\n7. **Update porting-notes.md:**\n   - Add any new patterns or special cases discovered.\n\n8. **STOP and confirm:**\n   - Show what was ported. Ask: \"Continue to next type? (y/n)\"\n   - Only proceed after confirmation.\n````\n\n**Step 1** queries our state to find the next pending type using another precise `jq` function call. Here's what gets extracted from the porting plan and is now in the context:\n\n```json\n{\n  \"javaSourcePath\": \"/Users/badlogic/workspaces/spine-runtimes/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java\",\n  \"types\": [\n    {\n      \"name\": \"AtlasAttachmentLoader\",\n      \"kind\": \"class\",\n      \"startLine\": 43,\n      \"endLine\": 101,\n      \"isInner\": false,\n      \"portingState\": \"pending\",\n      \"candidateFiles\": [\n        \"/Users/badlogic/workspaces/spine-runtimes/spine-cpp/spine-cpp/include/spine/AtlasAttachmentLoader.h\",\n        \"/Users/badlogic/workspaces/spine-runtimes/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp\"\n      ]\n    }\n  ]\n}\n```\n\n**Steps 2-3** implement a human checkpoint: the LLM opens relevant files in VS Code and waits for confirmation before proceeding. This isn't just politeness; it's a safety mechanism ensuring I can abort if something looks wrong, or if I want to port a different type, or if I can immediately see that this type is complete and we should update the porting state and move on to the next type.\n\n**Step 4** is critical: \"Read the ENTIRE file so it is fully in your context!\" The emphasis prevents the LLM from being lazy and reading only parts of files, which would lead to incomplete ports. After this step, the context contains the complete source files needed for accurate porting.\n\n**Step 5** does the actual porting work. The \"ultrathink to discern\" instruction acknowledges that porting isn't just mechanical translation; it requires judgment about idiomatic differences versus actual functionality changes.\n\n**Steps 6-8** implement more human checkpoints and program state management. The LLM shows its work (via diffs), then updates the program's persistent state: step 6 writes to `porting-plan.json` to mark the type as done, and step 7 optionally updates `porting-notes.md` with new observations. This is where our program writes its state to disk - crucial for resumability. The state update in step 6 uses `jq` to surgically modify just the `portingState` field, ensuring we can resume exactly where we left off. Step 8 asks permission before the next loop iteration.\n\nThis is our complete LLM program: structured initialization, precise function calls, state management, human checkpoints, and deterministic loops. What started as an ad hoc conversation with an AI has become a reproducible, resumable workflow that tackles real-world porting at scale.\n\n## Program Execution\n\nLet's see this program in action:\n\nYour browser does not support the video tag.\n\nThis recording demonstrates the key insights of treating LLMs as computers:\n\n- **Follows the program**: Reads port.md and executes each step methodically\n- **Manages state**: Uses precise jq queries to read and update porting-plan.json\n- **Loads context strategically**: Reads only necessary files when needed\n- **Maintains resumability**: Updates persistent state after each completed type\n- **Implements human checkpoints**: Asks for confirmation before proceeding\n\nUnlike ad hoc prompting where the conversation meanders, this programmatic approach follows a deterministic workflow. The LLM becomes a reliable executor of structured instructions rather than an unpredictable chat partner.\n\nWhile the LLM cannot handle the full porting process autonomously due to challenges with complex type hierarchies and execution flows, this deterministic workflow dramatically simplifies my work compared to manual porting. The tedious mechanical tasks are now automated, freeing me to focus on the genuinely difficult problems that require human insight.\n\nWhat previously took me 2-3 weeks, now takes 2-3 days.\n\n## Future Work\n\nAs with everything, there's always plenty of room for improvements.\n\n**Testing and debugging**: The deterministic nature of these workflows opens possibilities for traditional software engineering practices. We could test that given specific inputs and state, our programs produce expected outputs. For debugging, we could instrument prompts to write state information at key points, creating execution traces that help identify where workflows diverge from expectations.\n\n**Sub-agent orchestration**: Current tools like Claude Code spawn sub-agents without observability or communication channels. To scale this programming model, we need structured ways to program sub-agents and monitor their execution. The main agent should define explicit workflows for sub-agents rather than generating them ad hoc, ensuring reliability through the same structured approach we use for the primary workflow.\n\n## Conclusion\n\nThis mental model has transformed how I work with established codebases using agentic coding tools. By treating LLMs as programmable computers rather than conversational partners, I've found a more reliable approach to complex software tasks. It's not a panacea and won't work for all problems, but it represents a step toward turning AI-assisted coding into an engineering discipline rather than a \"throwing shit at the wall\" approach.\n\nThis page respects your privacy by not using cookies or similar technologies and by not collecting any personally identifiable information.\n",
  "authors": [],
  "captured_at": "2026-09-27T19:29:15.293681927+00:00",
  "category": "programming",
  "content_html": "<figure class=\"article-figure\"><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code/media/hello-computer.jpg\" alt=\"\" loading=\"eager\" decoding=\"async\" fetchpriority=\"high\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture><figcaption>Hello, Computer, do my work</figcaption></figure>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_0\">Feeling the pain</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_1\">Thinking of LLMs as Shitty General Purpose Computers</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_2\">A Real World Example: Porting the Spine Runtimes</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_3\">The &quot;Port Java to X&quot; Program</a>\n<ul>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_4\">Initial Input and State</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_5\">The Function Library</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_6\">The Main Workflow</a></li>\n</ul>\n</li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_7\">Program Execution</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_8\">Future Work</a></li>\n<li><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_9\">Conclusion</a></li>\n</ul>\n<p>Like most of you, I've been dabbling in what people call &quot;agentic engineering.&quot; Truth is, there's not much engineering happening. We're basically throwing shit at the wall and hoping something sticks.</p>\n<p>Using LLM coding tools like Claude Code to spin up throwaway greenfield projects or bang out ad hoc scripts? Pretty great experience. But try using them on a big, established codebase, or the-production-app-formerly-known-as-greenfield-project without breaking everything? That's where things get painful.</p>\n<h2>Feeling the pain</h2>\n<p>For bigger codebases, the main issue is context, or rather, the lack of it. These tools don't have the full picture of your project. Maybe you haven't given them that overview, or maybe their context window is too small to hold all your interconnected components. But there's more to it.</p>\n<p>Even with recent improvements like 'reasoning', which is really just the old 'think step by step' trick, with more scratch space to attend to, LLMs still can't follow execution flow all that well. They're especially lost with anything beyond sequential scripts: multiple processes, IPC, client-server architectures, concurrent execution within the same process. Even when you manage to cram all the context they need, they'll still generate code that doesn't fit your system's actual architecture.</p>\n<p>LLMs also lack taste. Trained on all code on the web (and likely some private code), they generate, to oversimplify, the statistical mean of what they've seen. While senior engineers strive for elegant, minimal solutions that reduce bugs and complexity, LLMs reach for 'best practices' and spit out over-engineered garbage. Let them run wild and you'll get code that's hard to maintain, hard to understand, and full of places for bugs to hide.</p>\n<p>Then there's context degradation. As your session progresses and pulls in more files, tool outputs, and other data, things start falling apart around 100k tokens. Benchmarks be damned. Whatever tricks LLM providers use to achieve those massive context windows don't work in practice. The model loses track of important details buried in the middle of all that context.</p>\n<p>Worse still, many tools don't let you control what goes into your context. Companies like Cursor that aren't LLM providers themselves need to make a margin between what you pay them and what they pay for tokens. Their incentive? Cut down your context to save money, which means the LLM might miss crucial information or get it in a suboptimal format.</p>\n<p>Claude Code is different. It comes straight from Anthropic with no middleman trying to squeeze margins. With the Max plan, you get essentially unlimited tokens (though folks like <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://twitter.com/steipete\">Peter</a> manage to get rate limited even with three or four accounts). You still don't have full control: there's a system prompt you can't change, additional instructions get sneakily injected into your first message, the VS Code integration adds unwanted crap, and all the tool definitions eat up context and give the model plenty of rope to confuse itself with. But this is the best deal we're getting, so we work with what we have. (Anthropic, please OSS Claude Code. Your models are your moat, not Claude Code.)</p>\n<h2>How do we tame this agentic mess?</h2>\n<p>What we need when using coding agents on bigger codebases is a structured way to engineer context. By that I mean: keep only the information needed for the task of modifying or generating code, minimize the number of turns the model needs to take calling tools or reporting back to us, and ensure nothing important is missing. We want reproducible workflows. We want determinism, as much as possible within the limits of these inherently non-deterministic models.</p>\n<p>I'm a programmer. You're probably a programmer. We think in systems, deterministic workflows, and abstractions. What's more natural for us than viewing LLMs as an extremely slow kind of unreliable computer that we program with natural language?</p>\n<p>This is a weird form of metaprogramming: we write &quot;code&quot; in the form of prompts that execute on the LLM to produce the actual code that runs on real CPUs.</p>\n<p>Yes, I know LLMs aren't actually computers (though there are some papers on arXiv...). The metaphor is a bit stretched. But here's the thing: as developers, we're used to encoding specifications in precise programming languages. When we interact with LLMs, the fuzziness of natural language makes us forget we can apply the same structured thinking. This framework bridges that gap: think &quot;inputs, state, outputs&quot; instead of &quot;chat with the AI&quot; and suddenly you're closer to engineering solutions instead of just hoping for the best.</p>\n<h2>Thinking of LLMs as Shitty General Purpose Computers</h2>\n<p>In traditional software, we create programs by writing code and importing libraries. A program takes inputs, manipulates state, and produces outputs. We can map these concepts to our LLM-as-shitty-computer metaphor like this:</p>\n<p><strong>Program</strong> is your prompt, written in natural language. It specifies initial inputs, &quot;imports&quot; external functions via tool descriptions, and implements business logic through control flow: sequential steps, loops, conditionals, and yes, even goto. Tool calls and user input are I/O.</p>\n<p><strong>Inputs</strong> come from three sources: prepared information (codebase docs, style guides, architecture overviews) either baked into the prompt or loaded from disk, user input during execution (clarifications, corrections, new requirements), and tool outputs (file contents, command results, API responses).</p>\n<p><strong>State</strong> evolves as the program runs. Some lives in the context, but we treat that as ephemeral: compaction will eventually wipe it (trololo). Plus, you'll quickly hit context limits with any substantial state. So we serialize to disk using formats LLMs handle well: JSON for structured data, where the LLM can surgically read and update specific fields via <code>jq</code>. Markdown for smaller unstructured data we can load fully into context if needed. The payoff? You can resume from any point with a fresh context, sidestepping the dreaded compaction issue entirely.</p>\n<p><strong>Outputs</strong> aren't limited to generated code. Just like traditional programs produce console output, write files, or display GUIs, our LLM program uses tool calls to create various outputs: the actual code, diffs, open files in an editor for us, codebase statistics, summaries of changes, or any other artifact that documents what the program did. These outputs serve multiple purposes: helping you review the work, providing input for the next steps in the workflow, or simply showing the program's progress.</p>\n<p>Let's see how this plays out in practice.</p>\n<h2>A Real World Example: Porting the Spine Runtimes</h2>\n<p>After experimenting with toy projects, I felt ready to apply this approach to a real codebase: the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/EsotericSoftware/spine-runtimes\">Spine runtimes</a>.</p>\n<p><a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://esotericsoftware.com\">Spine</a> is 2D skeletal animation software. You create animations in the editor, export them to a runtime format, then use one of many runtimes to display them in your app or game. We maintain runtimes for C, C++, C#, Haxe, Java, Dart, Swift, and TypeScript. On top of these, we've built integrations for Unity, Unreal, Godot, Phaser, Pixi, ThreeJS, iOS, Android, web, and more.</p>\n<p>Here's the painful part: between releases, the runtime code changes. We implement new features in our reference implementation (spine-libgdx in Java, which powers the editor), then manually port those changes to every other language runtime. It's tedious, error-prone work. Math-heavy code needs exact translation, and after hours of porting, your brain turns to mush. Bugs creep in that are hell to track down.</p>\n<p><picture class=\"article-picture article-picture-fallback\" style=\"--image-ratio:16 / 9\"><img src=\"https://mariozechner.at/posts/2025-06-02-prompts-are-code/media/changeset.png\" alt=\"Git diff showing thousands of lines of code changes\" loading=\"lazy\" decoding=\"async\" fetchpriority=\"low\" referrerpolicy=\"no-referrer\" class=\"progressive-image\"></picture></p>\n<p>And no, transpilers won't work for this (trust me, bro, I made money doing compilers). We need idiomatic ports that preserve the same API surface in a way that feels natural for each language.</p>\n<p>Between releases 4.2 and 4.3-beta, the Java reference implementation saw significant changes:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">$</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> git diff<span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> --</span>stat</span> 4.2..4.3-beta<span class=\"syntax-keyword syntax-operator syntax-end-of-options syntax-shell\"> --</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> <span class=\"syntax-string syntax-quoted syntax-single syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-shell\">&#39;</span>*.java<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-shell\">&#39;</span></span> </span><span class=\"syntax-keyword syntax-operator syntax-logical syntax-pipe syntax-shell\">|</span> <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">tail</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"><span class=\"syntax-variable syntax-parameter syntax-option syntax-shell\"><span class=\"syntax-punctuation syntax-definition syntax-parameter syntax-shell\"> -</span>1</span></span>\n  <span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">79</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> files changed, 4820 insertions(+</span><span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-meta syntax-post-cmd syntax-shell\">)</span><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">,</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> 4679 deletions(-</span><span class=\"syntax-meta syntax-function-call syntax-shell\"></span><span class=\"syntax-meta syntax-post-cmd syntax-shell\">)</span>\n</span></span></code></pre>\n<p>Here's how I'd approach this with my manual workflow:</p>\n<ol>\n<li>Open the changeset in Fork (my git client) and scan through all changed files</li>\n<li>Plan the porting order based on the dependency graph: interfaces and enums first (they're usually independent), then try to port dependencies before the classes that use them, hoping to maintain some compilability</li>\n<li>Pick a type to port in Java, open a side-by-side diff, check if the type already exists in the target runtime or needs creation from scratch</li>\n<li>Port changes line-by-line, method-by-method to the target language</li>\n<li>Watch the illusion of order crumble: the dependency graph is cyclic, so there's no perfect porting order that keeps everything compiling (note to self: it would be nice if we had an acyclic type dependency graph)</li>\n<li>Can't test individual pieces because a skeletal animation system needs all its parts working in concert</li>\n<li>Port everything blind, then face a wall of compilation errors and bugs introduced because my brain was fried after hours of human transpilation</li>\n</ol>\n<p>This is especially fun when porting from Java to C, the language pair with the biggest type system and memory management mismatch.</p>\n<p>What makes this tractable is that we maintain the same API surface across all runtime implementations. If there's a class <code>Animation</code> in Java, there's also a class <code>Animation</code> in C#, C++, and every other runtime, in a corresponding file. This one-to-one mapping exists for 99% of types. Sure, there are quirks like Java files containing dozens of inner classes, but the structural consistency is there.</p>\n<p>Here's an example of one of the more math-heavy types, <code>PhysicsConstraint</code>:</p>\n<p><strong>Java (PhysicsConstraint.java)</strong></p>\n<pre><code class=\"language-java\"><span class=\"code-snippet\" data-language=\"Java\"><span class=\"syntax-source syntax-java\"><span class=\"syntax-meta syntax-package syntax-java\"><span class=\"syntax-keyword syntax-other syntax-package syntax-java\">package</span> <span class=\"syntax-support syntax-other syntax-package syntax-java\">com.esotericsoftware.spine</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span></span>\n\n<span class=\"syntax-meta syntax-import syntax-java\"><span class=\"syntax-keyword syntax-other syntax-import syntax-java\">import</span> <span class=\"syntax-storage syntax-modifier syntax-static syntax-java\">static</span> <span class=\"syntax-support syntax-function syntax-import syntax-java\">com.esotericsoftware.spine.utils<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>SpineUtils</span>.*<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span></span>\n\n<span class=\"syntax-comment syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">/*</span>* Stores the current pose for a physics constraint. A physics constraint applies physics to bones.\n * &lt;p&gt;\n * See &lt;a href=&quot;https://esotericsoftware.com/spine-physics-constraints&quot;&gt;Physics constraints&lt;/a&gt; in the Spine User Guide. <span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">*/</span></span>\n<span class=\"syntax-meta syntax-class syntax-java\"><span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-meta syntax-class syntax-identifier syntax-java\"><span class=\"syntax-storage syntax-type syntax-java\">class</span> <span class=\"syntax-entity syntax-name syntax-class syntax-java\">PhysicsConstraint</span></span> <span class=\"syntax-meta syntax-class syntax-extends syntax-java\"><span class=\"syntax-keyword syntax-declaration syntax-extends syntax-java\">extends</span> <span class=\"syntax-meta syntax-generic syntax-java\"><span class=\"syntax-entity syntax-other syntax-inherited-class syntax-java\">Constraint</span><span class=\"syntax-meta syntax-generic syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-generic syntax-begin syntax-java\">&lt;</span><span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraint</span><span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraintData</span><span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraintPose</span><span class=\"syntax-punctuation syntax-definition syntax-generic syntax-end syntax-java\">&gt;</span></span> </span></span><span class=\"syntax-meta syntax-class syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t<span class=\"syntax-support syntax-class syntax-java\">BonePose</span> bone<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">boolean</span> reset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-language syntax-java\">true</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> ux, uy, cx, cy, tx, ty<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> xOffset, xLag, xVelocity<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> yOffset, yLag, yVelocity<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> rotateOffset, rotateLag, rotateVelocity<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> scaleOffset, scaleLag, scaleVelocity<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> remaining, lastTime<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraint</span> (<span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraintData</span> data, <span class=\"syntax-support syntax-class syntax-java\">Skeleton</span> skeleton) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-variable syntax-language syntax-java\">super</span><span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>data, <span class=\"syntax-meta syntax-instantiation syntax-java\"><span class=\"syntax-keyword syntax-control syntax-new syntax-java\">new</span> <span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraintPose</span><span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span>, <span class=\"syntax-meta syntax-instantiation syntax-java\"><span class=\"syntax-keyword syntax-control syntax-new syntax-java\">new</span> <span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraintPose</span><span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>skeleton <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">==</span> <span class=\"syntax-constant syntax-language syntax-java\">null</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-control syntax-catch-exception syntax-java\">throw</span> <span class=\"syntax-meta syntax-instantiation syntax-java\"><span class=\"syntax-keyword syntax-control syntax-new syntax-java\">new</span> <span class=\"syntax-support syntax-class syntax-java\">IllegalArgumentException</span><span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-string syntax-quoted syntax-double syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-java\">&quot;</span>skeleton cannot be null.<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-java\">&quot;</span></span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\n\t\tbone <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bones<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>items[data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>index]<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>constrained</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraint</span> copy (<span class=\"syntax-support syntax-class syntax-java\">Skeleton</span> skeleton) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\tvar copy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-instantiation syntax-java\"><span class=\"syntax-keyword syntax-control syntax-new syntax-java\">new</span> <span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraint</span><span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>data, skeleton<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tcopy<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>pose<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">set</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>pose<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">return</span> copy<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">void</span> reset (<span class=\"syntax-support syntax-class syntax-java\">Skeleton</span> skeleton) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\tremaining <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tlastTime <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>time</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\treset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-language syntax-java\">true</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\txOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\txLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\txVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tyOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tyLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tyVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\trotateOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\trotateLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\trotateVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tscaleOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tscaleLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tscaleVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-comment syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">/*</span>* Translates the physics constraint so next {@link #update(Skeleton, Physics)} forces are applied as if the bone moved an\n\t * additional amount in world space. <span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">*/</span></span>\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">void</span> translate (<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> x, <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> y) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\tux <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> x</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tuy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> y</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tcx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> x</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tcy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> y</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-comment syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">/*</span>* Rotates the physics constraint so next {@link #update(Skeleton, Physics)} forces are applied as if the bone rotated around\n\t * the specified point in world space. <span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">*/</span></span>\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">void</span> rotate (<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> x, <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> y, <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> degrees) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> r <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> degrees <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> degRad</span>, cos <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">cos</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span>, sin <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sin</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> dx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> cx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> x</span>, dy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> cy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> y</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">translate</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> cos <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> dy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> sin <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> dx<span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> dx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> sin <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> dy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> cos <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> dy<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-comment syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">/*</span>* Applies the constraint to the constrained bones. <span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">*/</span></span>\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">void</span> update (<span class=\"syntax-support syntax-class syntax-java\">Skeleton</span> skeleton, <span class=\"syntax-support syntax-class syntax-java\">Physics</span> physics) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-support syntax-class syntax-java\">PhysicsConstraintPose</span> p <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> applied</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> mix <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>mix</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>mix <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">==</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-control syntax-java\">return</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\n\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">boolean</span> x <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>x <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>, y <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>y <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>, rotateOrShearX <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>rotate <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span> <span class=\"syntax-keyword syntax-operator syntax-logical syntax-java\">||</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>shearX <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>, scaleX <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleX <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-support syntax-class syntax-java\">BonePose</span> bone <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-variable syntax-language syntax-java\">this</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bone</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> l <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>length</span>, t <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>step</span>, z <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">switch</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>physics<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">case</span> none<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">return</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">case</span> reset<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span>\n\t\t\t<span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">reset</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>skeleton<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">//</span> Fall through.\n</span>\t\t<span class=\"syntax-keyword syntax-control syntax-java\">case</span> update<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span>\n\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> delta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">max</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>time <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> lastTime<span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span>, aa <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> remaining</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\tremaining <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> delta</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\tlastTime <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>time</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\n\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> bx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldX</span>, by <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldY</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>reset<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\treset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-language syntax-java\">false</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tux <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bx</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tuy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> by</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-java\">else</span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> a <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> remaining</span>, i <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>inertia</span>, f <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>referenceScale</span>, d <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span></span>, m <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>, e <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>, ax <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>, ay <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>,\n\t\t\t\t\tqx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>limit <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> delta</span>, qy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> qx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">abs</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleY<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tqx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">abs</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>x <span class=\"syntax-keyword syntax-operator syntax-logical syntax-java\">||</span> y<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> u <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>ux <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> bx<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> i</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\txOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> qx <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">?</span> qx <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qx <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">?</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qx <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span> u</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tux <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bx</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> u <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>uy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> by<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> i</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tyOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> qy <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">?</span> qy <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qy <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">?</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qy <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span> u</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tuy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> by</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;=</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> xs <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> xOffset</span>, ys <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> yOffset</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\td <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">pow</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>damping<span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">60</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tm <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> t <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>massInverse</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\te <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>strength</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> w <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>wind</span>, g <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>gravity</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tax <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>windX <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>gravityX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleX</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tay <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>windY <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>gravityY<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleY</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">do</span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\t\txVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>ax <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> xOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> m</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\txOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> xVelocity <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> t</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\txVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\t\tyVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>ay <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> yOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> m</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\tyOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> yVelocity <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> t</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\tyVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t\t\ta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> t</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-java\">while</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;=</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\txLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> xOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> xs</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tyLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> yOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> ys</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\tz <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">max</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldX <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>xOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> xLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>x</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldY <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>yOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> yLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>y</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>rotateOrShearX <span class=\"syntax-keyword syntax-operator syntax-logical syntax-java\">||</span> scaleX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> ca <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">atan2</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c<span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>a<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span>, c, s, mr <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span>, dx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> cx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldX</span>, dy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> cy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldY</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> qx<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span>\n\t\t\t\t\t\tdx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> qx</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">else</span> <span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qx<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-comment syntax-line syntax-double-slash syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">//</span>\n</span>\t\t\t\t\t\tdx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qx</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dy <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> qy<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span>\n\t\t\t\t\t\tdy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> qy</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">else</span> <span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dy <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qy<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-comment syntax-line syntax-double-slash syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">//</span>\n</span>\t\t\t\t\t\tdy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span>qy</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>rotateOrShearX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\tmr <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>rotate <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>shearX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mix</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tz <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> rotateLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">max</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> aa <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> r <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">atan2</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> ty<span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> dx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> tx<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> ca <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mr</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\trotateOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">ceil</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> invPI2 <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-constant syntax-numeric syntax-float syntax-java\">.5<span class=\"syntax-storage syntax-type syntax-numeric syntax-java\">f</span></span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> <span class=\"syntax-constant syntax-other syntax-java\">PI2</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> i</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tr <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mr <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> ca</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tc <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">cos</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\ts <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sin</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>scaleX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\tr <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">getWorldScaleX</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> scaleOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> dy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> s<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> i <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> r</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-java\">else</span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\tc <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">cos</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>ca<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\ts <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sin</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>ca<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> r <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">getWorldScaleX</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> scaleLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">max</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> aa <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> scaleOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> dy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> s<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> i <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> r</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\ta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> remaining</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;=</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>d <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">==</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\td <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">pow</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>damping<span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">60</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\tm <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> t <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>massInverse</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\te <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>strength</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> w <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>wind</span>, g <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>gravity</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\tax <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>windX <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>gravityX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleX</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\tay <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>windY <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>gravityY<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleY</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> rs <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> rotateOffset</span>, ss <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> scaleOffset</span>, h <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> f</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">while</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-constant syntax-language syntax-java\">true</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\ta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> t</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>scaleX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\t\tscaleVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>ax <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> ay <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> scaleOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> m</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\tscaleOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> scaleVelocity <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> t</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\tscaleVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>rotateOrShearX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\t\t\t\trotateVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">-=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>ax <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> ay <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> c<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> h <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> m</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\trotateOffset <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> rotateVelocity <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> t</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\trotateVelocity <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&lt;</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-control syntax-java\">break</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> r <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mr <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> ca</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\tc <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">cos</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t\ts <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sin</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-java\">else</span> <span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&lt;</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-comment syntax-line syntax-double-slash syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">//</span>\n</span>\t\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">break</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\t\trotateLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> rs</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t\tscaleLag <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> scaleOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> ss</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\t\tz <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">max</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\tremaining <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> a</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\tcx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldX</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\tcy <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldY</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">break</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">case</span> pose<span class=\"syntax-keyword syntax-operator syntax-ternary syntax-java\">:</span>\n\t\t\tz <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-support syntax-class syntax-java\">Math</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">max</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-separator syntax-java\">,</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> remaining <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">/</span> t<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldX <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>xOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> xLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>x</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>worldY <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>yOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> yLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>y</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>rotateOrShearX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> o <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> rotateLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mix</span>, s, c, a<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>shearX <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> r <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>rotate <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">0</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\t\tr <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> o <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>rotate</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\ts <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sin</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\tc <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">cos</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\ta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>b</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>b <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>d <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t\t\tr <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">+=</span> o <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>shearX</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\ts <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sin</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tc <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">cos</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>r<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\ta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>a</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>a <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-java\">else</span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t\to <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>rotate</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\ts <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sin</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>o<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tc <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">cos</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>o<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\ta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>a</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>a <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\ta <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>b</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>b <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>d <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>d</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>scaleX<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">float</span> s <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-constant syntax-numeric syntax-integer syntax-decimal syntax-java\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">+</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>scaleOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">-</span> scaleLag <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>scaleX</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>a <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> s</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">*=</span> s</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">if</span> <span class=\"syntax-meta syntax-parens syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>physics <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-java\">!=</span> <span class=\"syntax-support syntax-class syntax-java\">Physics</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>pose<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span> <span class=\"syntax-meta syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t\ttx <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>a</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t\tty <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-java\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>c</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">modifyWorld</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>update<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">void</span> sort (<span class=\"syntax-support syntax-class syntax-java\">Skeleton</span> skeleton) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-support syntax-class syntax-java\">Bone</span> bone <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> <span class=\"syntax-variable syntax-language syntax-java\">this</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bone</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sortBone</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>bone<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>updateCache<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">add</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span><span class=\"syntax-variable syntax-language syntax-java\">this</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">sortReset</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>children<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span><span class=\"syntax-meta syntax-function-call syntax-java\"><span class=\"syntax-variable syntax-function syntax-java\">constrained</span><span class=\"syntax-punctuation syntax-section syntax-parens syntax-begin syntax-java\">(</span>bone<span class=\"syntax-punctuation syntax-section syntax-parens syntax-end syntax-java\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">boolean</span> isSourceActive () <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">return</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bone<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>active<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-comment syntax-block syntax-java\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">/*</span>* The bone constrained by this physics constraint. <span class=\"syntax-punctuation syntax-definition syntax-comment syntax-java\">*/</span></span>\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-support syntax-class syntax-java\">BonePose</span> getBone () <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-java\">return</span> bone<span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n\n\t<span class=\"syntax-storage syntax-modifier syntax-java\">public</span> <span class=\"syntax-storage syntax-type syntax-primitive syntax-java\">void</span> setBone (<span class=\"syntax-support syntax-class syntax-java\">BonePose</span> bone) <span class=\"syntax-meta syntax-static syntax-body syntax-java\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-java\">{</span>\n\t\t<span class=\"syntax-variable syntax-language syntax-java\">this</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-java\">.</span>bone <span class=\"syntax-meta syntax-assignment syntax-rhs syntax-java\"><span class=\"syntax-keyword syntax-operator syntax-assignment syntax-java\">=</span> bone</span><span class=\"syntax-punctuation syntax-terminator syntax-java\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-java\">}</span></span>\n</span></span></span></code></pre>\n<p><strong>C++ Header (PhysicsConstraint.h)</strong></p>\n<pre><code class=\"language-cpp\"><span class=\"code-snippet\" data-language=\"C++\"><span class=\"syntax-source syntax-c++\"><span class=\"syntax-meta syntax-preprocessor syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-c++\">#ifndef</span> Spine_PhysicsConstraint_h\n</span><span class=\"syntax-meta syntax-preprocessor syntax-macro syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-define syntax-c++\">#define</span></span><span class=\"syntax-meta syntax-preprocessor syntax-macro syntax-c++\"> <span class=\"syntax-entity syntax-name syntax-constant syntax-preprocessor syntax-c++\">Spine_PhysicsConstraint_h</span></span>\n\n<span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/Constraint.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/PhysicsConstraintData.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/PhysicsConstraintPose.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/BonePose.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/Vector.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span>\n<span class=\"syntax-meta syntax-namespace syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-c++\">namespace</span> </span><span class=\"syntax-meta syntax-namespace syntax-c++\"><span class=\"syntax-entity syntax-name syntax-namespace syntax-c++\">spine</span></span><span class=\"syntax-meta syntax-namespace syntax-c++\"> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t<span class=\"syntax-meta syntax-class syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c++\">class</span> <span class=\"syntax-entity syntax-name syntax-class syntax-forward-decl syntax-c++\">Skeleton</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-meta syntax-class syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c++\">class</span> <span class=\"syntax-entity syntax-name syntax-class syntax-forward-decl syntax-c++\">BonePose</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-meta syntax-class syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c++\">class</span> <span class=\"syntax-entity syntax-name syntax-class syntax-forward-decl syntax-c++\">PhysicsConstraintPose</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span>/ Stores the current pose for a physics constraint. A physics constraint applies physics to bones.\n</span>\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span>/\n</span>\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span>/ See https://esotericsoftware.com/spine-physics-constraints Physics constraints in the Spine User Guide.\n</span>\t<span class=\"syntax-meta syntax-class syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c++\">class</span> <span class=\"syntax-meta syntax-assumed-macro syntax-c\">SP_API</span> <span class=\"syntax-entity syntax-name syntax-class syntax-c++\">PhysicsConstraint</span></span><span class=\"syntax-meta syntax-class syntax-c++\"> <span class=\"syntax-punctuation syntax-separator syntax-c++\">:</span> <span class=\"syntax-storage syntax-modifier syntax-c++\">public</span> <span class=\"syntax-entity syntax-other syntax-inherited-class syntax-c++\">ConstraintGeneric</span><span class=\"syntax-punctuation syntax-section syntax-generic syntax-begin syntax-c++\">&lt;</span>PhysicsConstraint<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> PhysicsConstraintData<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> PhysicsConstraintPose<span class=\"syntax-punctuation syntax-section syntax-generic syntax-end syntax-c++\">&gt;</span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-class syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> Skeleton<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintInertiaTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintStrengthTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintDampingTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintMassTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintWindTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintGravityTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintMixTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-modifier syntax-c++\">friend</span> <span class=\"syntax-storage syntax-type syntax-c++\">class</span> PhysicsConstraintResetTimeline<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t<span class=\"syntax-storage syntax-modifier syntax-c++\">public</span><span class=\"syntax-punctuation syntax-section syntax-class syntax-c++\">:</span>\n<span class=\"syntax-meta syntax-assumed-macro syntax-c\">\t\tRTTI_DECL\n</span>\n\t\t<span class=\"syntax-meta syntax-method syntax-constructor syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-constructor syntax-c++\">PhysicsConstraint</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">PhysicsConstraintData<span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">data</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> Skeleton<span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">update</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton<span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> Physics <span class=\"syntax-variable syntax-parameter syntax-c++\">physics</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-meta syntax-method syntax-c++\"> <span class=\"syntax-storage syntax-modifier syntax-c++\">override</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">sort</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton<span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-meta syntax-method syntax-c++\"> <span class=\"syntax-storage syntax-modifier syntax-c++\">override</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">bool</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">isSourceActive</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-meta syntax-method syntax-c++\"> <span class=\"syntax-storage syntax-modifier syntax-c++\">override</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\tPhysicsConstraint<span class=\"syntax-keyword syntax-operator syntax-c++\">*</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">copy</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton<span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">reset</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton<span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span>/ Translates the physics constraint so next update() forces are applied as if the bone moved an additional amount in world space.\n</span>\t\t<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">translate</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">x</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">y</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span>/ Rotates the physics constraint so next update() forces are applied as if the bone rotated around the specified point in world space.\n</span>\t\t<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">rotate</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">x</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">y</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">degrees</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span>/ The bone constrained by this physics constraint.\n</span>\t\tBonePose<span class=\"syntax-keyword syntax-operator syntax-c++\">&amp;</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">getBone</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-method syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">setBone</span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">BonePose<span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">bone</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t<span class=\"syntax-storage syntax-modifier syntax-c++\">private</span><span class=\"syntax-punctuation syntax-section syntax-class syntax-c++\">:</span>\n\t\tBonePose<span class=\"syntax-keyword syntax-operator syntax-c++\">*</span> _bone<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">bool</span> _reset<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> _ux<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _uy<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _cx<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _cy<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _tx<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _ty<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> _xOffset<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _xLag<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _xVelocity<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> _yOffset<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _yLag<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _yVelocity<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> _rotateOffset<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _rotateLag<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _rotateVelocity<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> _scaleOffset<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _scaleLag<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _scaleVelocity<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> _remaining<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> _lastTime<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t</span></span><span class=\"syntax-meta syntax-class syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-meta syntax-preprocessor syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-c++\">#endif</span></span> <span class=\"syntax-comment syntax-block syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">/*</span> Spine_PhysicsConstraint_h <span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">*/</span></span>\n</span></span></code></pre>\n<p><strong>C++ Implementation (PhysicsConstraint.cpp)</strong></p>\n<pre><code class=\"language-cpp\"><span class=\"code-snippet\" data-language=\"C++\"><span class=\"syntax-source syntax-c++\"><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/PhysicsConstraint.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/PhysicsConstraintData.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/PhysicsConstraintPose.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/BonePose.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/Skeleton.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/SkeletonData.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/BoneData.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/Bone.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span><span class=\"syntax-meta syntax-preprocessor syntax-include syntax-c++\"><span class=\"syntax-keyword syntax-control syntax-import syntax-include syntax-c++\">#include</span> <span class=\"syntax-string syntax-quoted syntax-other syntax-lt-gt syntax-include syntax-c++\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-c++\">&lt;</span>spine/MathUtil.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-c++\">&gt;</span></span>\n</span>\n<span class=\"syntax-keyword syntax-control syntax-c++\">using</span> <span class=\"syntax-keyword syntax-control syntax-c++\">namespace</span> spine<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n<span class=\"syntax-meta syntax-assumed-macro syntax-c\"><span class=\"syntax-variable syntax-function syntax-assumed-macro syntax-c\">RTTI_IMPL</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c\">(</span>PhysicsConstraint<span class=\"syntax-punctuation syntax-separator syntax-c\">,</span> Constraint<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c\">)</span></span>\n\n<span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-constructor syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>PhysicsConstraint</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">PhysicsConstraintData <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c++\">data</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> Skeleton <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span> ConstraintGeneric<span class=\"syntax-punctuation syntax-section syntax-generic syntax-begin syntax-c++\">&lt;</span>PhysicsConstraint<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> PhysicsConstraintData<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> PhysicsConstraintPose<span class=\"syntax-punctuation syntax-section syntax-generic syntax-end syntax-c++\">&gt;</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>data<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_reset</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-language syntax-c\">true</span></span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_ux</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_uy</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_cx</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_cy</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_tx</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_ty</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_xOffset</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_xLag</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_xVelocity</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_yOffset</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_yLag</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_yVelocity</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_rotateOffset</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_rotateLag</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_rotateVelocity</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_scaleOffset</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_scaleLag</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_scaleVelocity</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_remaining</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">_lastTime</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\n\t_bone <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_bones</span><span class=\"syntax-meta syntax-brackets syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-begin syntax-c++\">[</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span><span class=\"syntax-support syntax-type syntax-sys-types syntax-c\">size_t</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_bone</span><span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getIndex</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-section syntax-brackets syntax-end syntax-c++\">]</span></span><span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_constrained</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\nPhysicsConstraint <span class=\"syntax-keyword syntax-operator syntax-c++\">*</span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>copy</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\tPhysicsConstraint <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>copy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-keyword syntax-control syntax-c++\">new</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span><span class=\"syntax-support syntax-constant syntax-c\">__FILE__</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-support syntax-constant syntax-c\">__LINE__</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">PhysicsConstraint</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">_data<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> skeleton</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\tcopy<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_pose</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">set</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">_pose</span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">return</span> copy<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>reset</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\t_remaining <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_lastTime <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getTime</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_reset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-language syntax-c\">true</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_xOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_xLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_xVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_yOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_yLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_yVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_rotateOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_rotateLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_rotateVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_scaleOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_scaleLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_scaleVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>translate</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">x</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">y</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\t_ux <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> x<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_uy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> y<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_cx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> x<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t_cy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> y<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>rotate</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">x</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">y</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-storage syntax-type syntax-c\">float</span> <span class=\"syntax-variable syntax-parameter syntax-c++\">degrees</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> r <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> degrees <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>Deg_Rad<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> cosVal <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">cos</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> sinVal <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">sin</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> dx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _cx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> x<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> dy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _cy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> y<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">translate</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">dx <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> cosVal <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> dy <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> sinVal <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> dx<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> dx <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> sinVal <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> dy <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> cosVal <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> dy</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>update</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> Physics <span class=\"syntax-variable syntax-parameter syntax-c++\">physics</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\tPhysicsConstraintPose <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>p <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>_applied<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> mix <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_mix</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>mix <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">==</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-control syntax-c++\">return</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t<span class=\"syntax-storage syntax-type syntax-c\">bool</span> x <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_x</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> y <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_y</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> rotateOrShearX <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_rotate</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">||</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_shearX</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> scaleX <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_scaleX</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\tBonePose <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>bone <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _bone<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> l <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_bone</span><span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_data</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getLength</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> t <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_step</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> z <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">switch</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>physics<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">case</span> Physics_None<span class=\"syntax-punctuation syntax-separator syntax-c++\">:</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">return</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">case</span> Physics_Reset<span class=\"syntax-punctuation syntax-separator syntax-c++\">:</span>\n\t\t\t<span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">reset</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">skeleton</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-comment syntax-line syntax-double-slash syntax-c\"><span class=\"syntax-punctuation syntax-definition syntax-comment syntax-c\">//</span> Fall through.\n</span>\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">case</span> Physics_Update<span class=\"syntax-punctuation syntax-separator syntax-c++\">:</span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> delta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-variable syntax-function syntax-c++\">max</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_time</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _lastTime<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0.0f</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> aa <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _remaining<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t_remaining <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> delta<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t_lastTime <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_time</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\n\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> bx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldX</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> by <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldY</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_reset<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t_reset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-language syntax-c\">false</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t_ux <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bx<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t_uy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> by<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-c++\">else</span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> a <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _remaining<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> i <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_inertia</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> f <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_data</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getReferenceScale</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> d <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span><span class=\"syntax-constant syntax-numeric syntax-c++\">1</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> m <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> e <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> ax <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> ay <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span>\n\t\t\t\t\t  qx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_limit</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> delta<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> qy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> qx <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">abs</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getScaleY</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\tqx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">abs</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_scaleX</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>x <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">||</span> y<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> u <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_ux <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> bx<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> i<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_xOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> qx <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">?</span> qx <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qx <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">?</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qx\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span> u<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_ux <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bx<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> u <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_uy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> by<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> i<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_yOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> qy <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">?</span> qy <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span> u <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qy <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">?</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qy\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  <span class=\"syntax-keyword syntax-operator syntax-ternary syntax-c\">:</span> u<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_uy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> by<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;=</span> t<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> xs <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _xOffset<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> ys <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _yOffset<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\td <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">pow</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_damping</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">60</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> t</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\tm <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> t <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_massInverse</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\te <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_strength</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> w <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_wind</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> g <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_gravity</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\tax <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_windX</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_gravityX</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_scaleX</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\tay <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_windY</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_gravityY</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getScaleY</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">do</span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\t\t_xVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>ax <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _xOffset <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> m<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_xOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> _xVelocity <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> t<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_xVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> d<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\t\t_yVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>ay <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> _yOffset <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> m<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_yOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> _yVelocity <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> t<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_yVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> d<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t\t\ta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> t<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-c++\">while</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;=</span> t<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_xLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _xOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> xs<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_yLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _yOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> ys<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\tz <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-variable syntax-function syntax-c++\">max</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0.0f</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> t</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldX</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_xOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _xLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_x</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldY</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_yOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _yLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_y</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>rotateOrShearX <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">||</span> scaleX<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> ca <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">atan2</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_a</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> c<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> s<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> mr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> dx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _cx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldX</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> dy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _cy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldY</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> qx<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span>\n\t\t\t\t\t\tdx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> qx<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">else</span> <span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qx<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span>\n\t\t\t\t\t\tdx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qx<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>dy <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> qy<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span>\n\t\t\t\t\t\tdy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> qy<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">else</span> <span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>dy <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qy<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span>\n\t\t\t\t\t\tdy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span>qy<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>rotateOrShearX<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\tmr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_rotate</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_shearX</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mix<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\tz <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _rotateLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-variable syntax-function syntax-c++\">max</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0.0f</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> aa <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> t</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> r <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">atan2</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">dy <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> _ty<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> dx <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> _tx</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> ca <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mr<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_rotateOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>r <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">ceil</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>InvPi_2 <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0.5f</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>Pi_2<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> i<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\tr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mr <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> ca<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\tc <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">cos</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\ts <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">sin</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>scaleX<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\tr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getWorldScaleX</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>r <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> _scaleOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> dy <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> s<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> i <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> r<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-c++\">else</span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\tc <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">cos</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">ca</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\ts <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">sin</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">ca</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> r <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getWorldScaleX</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _scaleLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-variable syntax-function syntax-c++\">max</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0.0f</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> aa <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> t</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>r <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> _scaleOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>dx <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> dy <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> s<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> i <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> r<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\ta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _remaining<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;=</span> t<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>d <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">==</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span><span class=\"syntax-constant syntax-numeric syntax-c++\">1</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\td <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">pow</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_damping</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">60</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> t</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\tm <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> t <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_massInverse</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\te <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_strength</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> w <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_wind</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> g <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> f <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> p<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_gravity</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\tax <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_windX</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_gravityX</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_scaleX</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\tay <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>w <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_windY</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> g <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_gravityY</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">getScaleY</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> rs <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _rotateOffset<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> ss <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _scaleOffset<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> h <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> f<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">while</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span><span class=\"syntax-constant syntax-language syntax-c\">true</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\ta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> t<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>scaleX<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\t\t_scaleVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>ax <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> c <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> ay <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _scaleOffset <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> m<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_scaleOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> _scaleVelocity <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> t<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_scaleVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> d<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>rotateOrShearX<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\t\t\t\t\t_rotateVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">-=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>ax <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> s <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> ay <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> c<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> h <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> _rotateOffset <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> e<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> m<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_rotateOffset <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> _rotateVelocity <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> t<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t_rotateVelocity <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> d<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span> t<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-control syntax-c++\">break</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> r <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _rotateOffset <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mr <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> ca<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\tc <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">cos</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t\ts <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">sin</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-c++\">else</span> <span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>a <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&lt;</span> t<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span>\n\t\t\t\t\t\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">break</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\t\t_rotateLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> rs<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t\t_scaleLag <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _scaleOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> ss<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t\tz <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-variable syntax-function syntax-c++\">max</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0.0f</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> t</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t\t_remaining <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> a<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\t_cx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldX</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t_cy <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldY</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">break</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">case</span> Physics_Pose<span class=\"syntax-punctuation syntax-separator syntax-c++\">:</span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\tz <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-variable syntax-function syntax-c++\">max</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-constant syntax-numeric syntax-c++\">0.0f</span><span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _remaining <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">/</span> t</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>x<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldX</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_xOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _xLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_x</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>y<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_worldY</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_yOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _yLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_y</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">break</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>rotateOrShearX<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> o <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_rotateOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _rotateLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mix<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> s<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> c<span class=\"syntax-punctuation syntax-separator syntax-c++\">,</span> a<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_shearX</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> r <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_rotate</span> <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">&gt;</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">0</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\t\tr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> o <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_rotate</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\ts <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">sin</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\tc <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">cos</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\ta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_b</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_b</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_d</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_d</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_d</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t\t\tr <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">+=</span> o <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_shearX</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\ts <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">sin</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tc <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">cos</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">r</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\ta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_a</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_a</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span> <span class=\"syntax-keyword syntax-control syntax-c++\">else</span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t\to <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_rotate</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\ts <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">sin</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">o</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tc <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-c++\">MathUtil<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span></span><span class=\"syntax-support syntax-function syntax-C99 syntax-c\">cos</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">o</span></span><span class=\"syntax-meta syntax-function-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\ta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_a</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_a</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\ta <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_b</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_b</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_d</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_d</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> s <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> a <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> c <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_d</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>scaleX<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t<span class=\"syntax-storage syntax-type syntax-c\">float</span> s <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-constant syntax-numeric syntax-c++\">1</span> <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">+</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>_scaleOffset <span class=\"syntax-keyword syntax-operator syntax-arithmetic syntax-c\">-</span> _scaleLag <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> z<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> mix <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> _data<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_scaleX</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_a</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> s<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span> <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-augmented syntax-c\">*=</span> s<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">if</span> <span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span>physics <span class=\"syntax-keyword syntax-operator syntax-comparison syntax-c\">!=</span> Physics_Pose<span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span> <span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span>\n\t\t_tx <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_a</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t\t_ty <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> l <span class=\"syntax-keyword syntax-operator syntax-c\">*</span> bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_c</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\t<span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span>\n\tbone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">modifyWorld</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">skeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_update</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>sort</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">Skeleton <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c++\">skeleton</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\tBone <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>bone <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> _bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_bone</span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">sortBone</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">bone</span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_updateCache</span><span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">add</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-variable syntax-language syntax-c++\">this</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">sortReset</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_children</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n\tskeleton<span class=\"syntax-punctuation syntax-accessor syntax-dot syntax-c++\">.</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">constrained</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-keyword syntax-operator syntax-c\">*</span>bone</span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">bool</span> <span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>isSourceActive</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">return</span> _bone<span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-variable syntax-other syntax-readwrite syntax-member syntax-c++\">_bone</span><span class=\"syntax-punctuation syntax-accessor syntax-arrow syntax-c++\">-&gt;</span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-variable syntax-function syntax-member syntax-c++\">isActive</span><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-method-call syntax-c++\"></span><span class=\"syntax-meta syntax-method-call syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\nBonePose <span class=\"syntax-keyword syntax-operator syntax-c++\">&amp;</span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>getBone</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\t<span class=\"syntax-keyword syntax-control syntax-c++\">return</span> <span class=\"syntax-keyword syntax-operator syntax-c\">*</span>_bone<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n\n<span class=\"syntax-storage syntax-type syntax-c\">void</span> <span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-entity syntax-name syntax-function syntax-c++\">PhysicsConstraint<span class=\"syntax-punctuation syntax-accessor syntax-c++\">::</span>setBone</span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-group syntax-begin syntax-c++\">(</span></span></span><span class=\"syntax-meta syntax-function syntax-parameters syntax-c++\"><span class=\"syntax-meta syntax-group syntax-c++\">BonePose <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span><span class=\"syntax-variable syntax-parameter syntax-c++\">bone</span><span class=\"syntax-punctuation syntax-section syntax-group syntax-end syntax-c++\">)</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"> </span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-begin syntax-c++\">{</span></span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\">\n\t_bone <span class=\"syntax-keyword syntax-operator syntax-assignment syntax-c\">=</span> <span class=\"syntax-keyword syntax-operator syntax-c\">&amp;</span>bone<span class=\"syntax-punctuation syntax-terminator syntax-c++\">;</span>\n</span></span><span class=\"syntax-meta syntax-function syntax-c++\"><span class=\"syntax-meta syntax-block syntax-c++\"><span class=\"syntax-punctuation syntax-section syntax-block syntax-end syntax-c++\">}</span></span></span>\n</span></span></code></pre>\n<p>Much of this porting work is mechanical and can be automated, like getters and setters, transferring documentation from Javadoc to docstrings, or ensuring the math matches. Some of the porting work requires a human brain, like translating Java generics to C++ templates, a task LLMs aren't very good at. What LLMs are good at is helping me double-check that I ported every line faithfully. This presented the perfect opportunity to apply my little workflow experiment to a real-world task on a real-world, largish codebase.</p>\n<h2>The &quot;Port Java to X&quot; Program</h2>\n<p>Time to write our program. We're essentially encoding my manual workflow into a structured LLM program. The goal: go through each Java type that changed between two commits and port it to a target runtime (like C++) collaboratively with the user.</p>\n<p>Instead of me manually opening diffs, tracking dependencies, and porting line-by-line while my brain melts, we'll have the LLM handle the mechanical parts while I stay in control of the decisions that matter.</p>\n<p>The final result of this program design can be found in the <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/badlogic/spine-port\">spine-port repository</a>. The program itself is stored in a file called <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/badlogic/spine-port/blob/main/port.md\"><code>port.md</code></a>. When I want to start or continue porting, I start Claude Code in the spine-port directory and tell it to read the <code>port.md</code> file in full and execute the workflow. That starts the &quot;program&quot;.</p>\n<p>Writing the <code>port.md</code> file was an iterative, collaborative process between me and Claude. In the following sections, we'll walk through each section of this program.</p>\n<h3>Initial Input and State</h3>\n<p>Every program needs input data and initial state to work with. The <code>port.md</code> file starts by defining the data structure that serves as both:</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">#</span> </span><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Spine Runtimes Porting Program</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-paragraph syntax-markdown\">Collaborative porting of changes between two commits in the Spine runtime\nreference implementation (Java) to a target runtime. Work tracked in\n<span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>porting-plan.json<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> which has the following format:\n\n</span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">json</span>\n{\n  &quot;metadata&quot;: {\n    &quot;prevBranch&quot;: &quot;4.2&quot;,\n    &quot;currentBranch&quot;: &quot;4.3-beta&quot;,\n    &quot;generated&quot;: &quot;2024-06-30T...&quot;,\n    &quot;spineRuntimesDir&quot;: &quot;/absolute/path/to/spine-runtimes&quot;,\n    &quot;targetRuntime&quot;: &quot;spine-cpp&quot;,\n    &quot;targetRuntimePath&quot;: &quot;/absolute/path/to/spine-runtimes/spine-cpp/spine-cpp&quot;,\n    &quot;targetRuntimeLanguage&quot;: &quot;cpp&quot;\n  },\n  &quot;deletedFiles&quot;: [\n    {\n      &quot;filePath&quot;: &quot;/path/to/deleted/File.java&quot;,\n      &quot;status&quot;: &quot;pending&quot;\n    }\n  ],\n  &quot;portingOrder&quot;: [\n    {\n      &quot;javaSourcePath&quot;: &quot;/path/to/EnumFile.java&quot;,\n      &quot;types&quot;: [\n        {\n          &quot;name&quot;: &quot;Animation&quot;,\n          &quot;kind&quot;: &quot;enum&quot;,\n          &quot;startLine&quot;: 45,\n          &quot;endLine&quot;: 52,\n          &quot;isInner&quot;: false,\n          &quot;portingState&quot;: &quot;pending&quot;,\n          &quot;candidateFiles&quot;: [&quot;/path/to/spine-cpp/include/spine/Animation.h&quot;, &quot;/path/to/spine-cpp/include/spine/Animation.cpp&quot;]\n        }\n      ]\n    }\n  ]\n}\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span></span></span></span></code></pre>\n<p>This data structure is the central state that tracks our porting progress. The <code>porting-plan.json</code> file serves as both the initial input and the persistent state for our LLM program. Let's break down what each part means:</p>\n<p><strong>metadata</strong>: Configuration for the porting session:</p>\n<ul>\n<li><code>prevBranch</code> and <code>currentBranch</code>: The git commits we're porting between</li>\n<li><code>spineRuntimesDir</code>: Where all the runtime implementations live</li>\n<li><code>targetRuntime</code>, <code>targetRuntimePath</code>, <code>targetRuntimeLanguage</code>: Which runtime we're porting to and where to find it</li>\n</ul>\n<p><strong>deletedFiles</strong>: Java files that were removed and need corresponding deletions in the target runtime</p>\n<p><strong>portingOrder</strong>: The heart of the plan. Each entry represents a Java file that changed and contains:</p>\n<ul>\n<li><code>javaSourcePath</code>: The full path to the Java source file</li>\n<li><code>types</code>: An array of all classes, interfaces, and enums in that file, each with:\n<ul>\n<li><code>name</code>: The type name (e.g., &quot;Animation&quot;)</li>\n<li><code>kind</code>: Whether it's a class, interface, or enum</li>\n<li><code>startLine</code> and <code>endLine</code>: Where to find it in the Java file</li>\n<li><code>isInner</code>: Whether it's an inner type</li>\n<li><code>portingState</code>: Tracks progress: &quot;pending&quot; or &quot;done&quot;</li>\n<li><code>candidateFiles</code>: Where this type likely exists in the target runtime</li>\n</ul>\n</li>\n</ul>\n<p>The <code>portingState</code> field is crucial: it's how the LLM tracks what's been done across sessions. When I stop and restart later, the program knows exactly where to pick up.</p>\n<p>But how do we generate all this structured data? Before the LLM can start porting, we need to analyze what changed between the two versions and prepare the data in a format the LLM can efficiently query. I wrote <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/badlogic/spine-port/blob/main/generate-porting-plan.js\"><code>generate-porting-plan.js</code></a> to automate this preparation:</p>\n<pre><code class=\"language-bash\"><span class=\"code-snippet\" data-language=\"Shell\"><span class=\"syntax-source syntax-shell syntax-bash\"><span class=\"syntax-meta syntax-function-call syntax-shell\"><span class=\"syntax-variable syntax-function syntax-shell\">./generate-porting-plan.js</span></span><span class=\"syntax-meta syntax-function-call syntax-arguments syntax-shell\"> 4.2 4.3-beta /path/to/spine-runtimes spine-cpp</span>\n</span></span></code></pre>\n<p>This script does several things:</p>\n<ol>\n<li><strong>Runs git diff</strong> to find all Java files that changed between the two commits</li>\n<li><strong>Uses <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://github.com/badlogic/lsp-cli\"><code>lsp-cli</code></a></strong> to extract complete type information from both the Java reference implementation and the target runtime</li>\n<li><strong>Analyzes dependencies</strong> to create a porting order (enums before interfaces before classes)</li>\n<li><strong>Finds candidate files</strong> in the target runtime where each type likely exists</li>\n<li><strong>Outputs a structured JSON file</strong> that the LLM can read from and write to efficiently via <code>jq</code>.</li>\n</ol>\n<p>Why pre-generate all this data instead of having the LLM explore the codebase as it goes?</p>\n<p><strong>Determinism</strong>: The same inputs always produce the same plan. LLM exploration might miss files, use wrong search patterns, or get lost in the directory structure. Pre-generation ensures complete, accurate, and reproducible results.</p>\n<p><strong>Context efficiency</strong>: The pre-generation saves tokens and turns by not needing the LLM to perform all the steps that <code>generate-porting-plan.js</code> does: running git diff, analyzing dependencies, extracting type information, finding candidate files. That's a lot of tool calls and context that would otherwise be wasted.</p>\n<p><strong>Speed</strong>: Generating the plan takes seconds. Having the LLM explore the codebase would take orders of magnitude longer.</p>\n<p>This transforms an open-ended exploration problem into structured data processing. Instead of &quot;figure out what changed and how to port it,&quot; the LLM gets &quot;here's exactly what changed, where it lives, and where it should go.&quot;</p>\n<p>No tokens and turns wasted. The context contains only the information we need.</p>\n<h3>The Function Library</h3>\n<p>The next section of <code>port.md</code> defines the tools available to our LLM program. Just like traditional programs import libraries, our LLM program needs tools to interact with the world.</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Tools</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">VS Claude</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Use the vs-claude MCP server tools for opening files and diffs for the user\nduring porting.\n\n</span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">javascript</span>\n// Open multiple files at once (batch operations)\nmcp__vs-claude__open([\n  {&quot;type&quot;: &quot;file&quot;, &quot;path&quot;: &quot;/abs/path/Animation.java&quot;},    // Java source\n  {&quot;type&quot;: &quot;file&quot;, &quot;path&quot;: &quot;/abs/path/Animation.h&quot;},       // C++ header\n  {&quot;type&quot;: &quot;file&quot;, &quot;path&quot;: &quot;/abs/path/Animation.cpp&quot;}      // C++ source\n]);\n\n// Open single file with line range\nmcp__vs-claude__open({&quot;type&quot;: &quot;file&quot;, &quot;path&quot;: &quot;/abs/path/Animation.java&quot;, &quot;startLine&quot;: 100, &quot;endLine&quot;: 120});\n\n// View git diff for a file\nmcp__vs-claude__open({&quot;type&quot;: &quot;gitDiff&quot;, &quot;path&quot;: &quot;/abs/path/Animation.cpp&quot;, &quot;from&quot;: &quot;HEAD&quot;, &quot;to&quot;: &quot;working&quot;});\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span></span></span></span></code></pre>\n<p><strong>VS Code Integration</strong> keeps the human in the loop. The LLM doesn't just modify files in the background; it opens them in my editor so I can see what's happening. This uses <a target=\"_blank\" rel=\"noopener noreferrer\" href=\"https://marketplace.visualstudio.com/items?itemName=MarioZechner.vs-claude\">vs-claude</a>, an extension I wrote that implements the Model Context Protocol (MCP), turning VS Code into the LLM's display device.</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Progress Tracking</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-paragraph syntax-markdown\">Monitor porting progress using these jq commands:\n\n</span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">bash</span>\n# Get overall progress percentage\njq -r &#39;.portingOrder | map(.types[]) | &quot;\\(([.[] | select(.portingState == &quot;done&quot;)] | length)) types ported out of \\(length) total (\\(([.[] | select(.portingState == &quot;done&quot;)] | length) * 100 / length | floor)% complete)&quot;&#39; porting-plan.json\n\n# Count types by state\njq -r &#39;.portingOrder | map(.types[]) | group_by(.portingState) | map({state: .[0].portingState, count: length}) | sort_by(.state)&#39; porting-plan.json\n\n# List all completed types\njq -r &#39;.portingOrder | map(.types[] | select(.portingState == &quot;done&quot;) | .name) | sort | join(&quot;, &quot;)&#39; porting-plan.json\n\n# Find remaining types to port\njq -r &#39;.portingOrder | map(.types[] | select(.portingState == &quot;pending&quot;) | .name) | length&#39; porting-plan.json\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span></span></span></span></code></pre>\n<p><strong>Progress Tracking</strong> functions that I can ask the LLM to run at any time. When I want to know how far we've gotten, I tell the LLM to execute one of these queries. They're pre-written and tested, ensuring the LLM uses efficient patterns instead of crafting its own potentially buggy versions.</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Compile Testing</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-paragraph syntax-markdown\">For C++, test compile individual files during porting:\n\n</span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">bash</span>\n./compile-cpp.js /path/to/spine-cpp/spine-cpp/src/spine/Animation.cpp\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">For other languages, we can not compile individual files and should not try to.\n</span></span></span></code></pre>\n<p><strong>Compile Testing</strong> includes language-specific build commands. Notice the explicit warning about other languages. This prevents the LLM from wasting time trying to compile individual TypeScript or Haxe files, which would fail. It's defensive programming: explicitly state what not to do. Though with our non-deterministic computer, there's always a chance it'll try anyway.</p>\n<h3>The Main Workflow</h3>\n<p>Now we get to the heart of our program: the actual porting logic with its loops, conditionals, and human checkpoints.</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Workflow</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-paragraph syntax-markdown\">Port one type at a time. Ensure the target runtime implementation is functionally\nequivalent to the reference implementation. The APIs must match, bar idiomatic\ndifferences, including type names, field names, method names, enum names,\nparameter names and so on. Implementations of methods must match EXACTLY, bar\nidiomatic differences, such as differences in collection types.\n\n</span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Follow these steps to port each type:\n\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">1. Setup (One-time)</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-paragraph syntax-markdown\">DO NOT use the TodoWrite and TodoRead tools for this phase!\n\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">1<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Read metadata from porting-plan.json:\n   <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">bash</span>\n   jq &#39;.metadata&#39; porting-plan.json\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">   ```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If this fails, abort and tell user to run generate-porting-plan.js\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Store these values for later use:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">      </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> targetRuntime (e.g., &quot;spine-cpp&quot;)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">      </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> targetRuntimePath (e.g., &quot;/path/to/spine-cpp/spine-cpp&quot;)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">      </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> targetRuntimeLanguage (e.g., &quot;cpp&quot;)\n</span></span></span></span></code></pre>\n<p>Like any traditional program, this starts with initialization. The <code>jq '.metadata'</code> command is essentially a function call - the program tells the LLM exactly which function to invoke rather than having it figure out the extraction logic itself, saving tokens and turns. Notice the conditional: &quot;If this fails, abort&quot; - defensive programming ensuring the required input exists. The &quot;Store these values&quot; instruction doesn't actually store anything; it tells the LLM what variable names to use when referencing these values extracted from the porting plan metadata later, similar to how variable assignments work. Storage happens implicitly in the LLM's context.</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">2<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">In parallel\n</span><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">   </span><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">a. Check for conventions file:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">      </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Read <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>${targetRuntime}-conventions.md<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> (from step 1) in full.\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">      </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If missing:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">         </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Use Task agents in parallel to analyze targetRuntimePath (from step 1)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">         </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Document all coding patterns and conventions:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">            </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Class/interface/enum definition syntax\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">            </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Member variable naming (prefixes like m_, <span class=\"syntax-markup syntax-italic syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-italic syntax-begin syntax-markdown\">_</span>, etc.)\n            * Method naming conventions (camelCase vs snake_case)\n            * Inheritance syntax\n            * File organization (single file vs header/implementation)\n            * Namespace/module/package structure\n            * Memory management (GC, manual, smart pointers)\n            * Error handling (exceptions, error codes, Result types)\n            * Documentation format (Doxygen, JSDoc, etc.)\n            * Type system specifics (generics, templates)\n            * Property/getter/setter patterns\n      - Agents MUST use ripgrep instead of grep!\n      - Save as ${TARGET}-conventions.md\n      - STOP and ask the user to review the generated conventions file\n<span class=\"syntax-invalid syntax-illegal syntax-non-terminated syntax-bold-italic syntax-markdown\">\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">   </span><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">b. Read <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>porting-notes.md<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> in full\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">      </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If missing create with content:\n      <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">markdown</span>\n      # Porting Notes\n   <span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">   ```\n</span></span></span></span></span></span></code></pre>\n<p>The &quot;in parallel&quot; instruction tells the LLM to use multiple tools simultaneously rather than sequentially, speeding up execution.</p>\n<p>Step 2a first tries to read the conventions file using <strong><code>${targetRuntime}-conventions.md</code></strong> - this is like string interpolation, where the LLM inserts the value for the target runtime name that it read from the porting plan. That conventions file captures the coding style and architecture patterns of the target runtime. This documents everything from naming conventions to memory management approaches, ensuring the LLM ports code that fits seamlessly into the existing codebase.</p>\n<p>Step 2b sets up the <strong>porting notes file</strong> as a scratch pad for the porting job. This contains observations and edge cases discovered while porting - things like &quot;Java uses <code>pose</code> but C++ uses <code>_applied</code> in this context&quot; or &quot;don't port toString() methods.&quot; It's a running log so we don't forget important discoveries that affect later porting decisions.</p>\n<p>If either file doesn't exist, we create it.</p>\n<p>Why generate the conventions file as part of the workflow instead of pre-generating it like the porting plan? Pre-generating conventions would require either manual work (time-consuming) or using an LLM with manual review anyway. Generating it inside the program ensures I don't have too many moving parts to juggle, and all instructions aimed at an LLM are contained in a single location: the program.</p>\n<p>Here are the actual conventions and porting notes files:</p>\n<p><strong>Conventions (spine-cpp-conventions.md)</strong></p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">#</span> </span><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Spine-CPP Coding Conventions</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">File Organization</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Directory Structure</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Headers: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>include/spine/<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> - Public API headers\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Implementation: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>src/spine/<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> - Implementation files (.cpp)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> One class per file pattern (Animation.h/Animation.cpp)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Header Guards</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n#ifndef Spine_Animation_h\n#define Spine_Animation_h\n// content\n#endif\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Naming Conventions</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Classes and Types</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Classes<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>: PascalCase (e.g., <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>Animation<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>, <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>BoneTimeline<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>, <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>SkeletonData<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Enums<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>: PascalCase with prefixed values\n  <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n  enum MixBlend {\n      MixBlend_Setup,\n      MixBlend_First,\n      MixBlend_Replace,\n      MixBlend_Add\n  };\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">  ```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Variables</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Member variables<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>: Underscore prefix + camelCase\n  <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n  private:\n      float _duration;\n      Vector&lt;Timeline*&gt; _timelines;\n      bool _hasDrawOrder;\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">  ```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Parameters<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>: camelCase, often with &quot;inValue&quot; suffix for setters\n  <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n  void setDuration(float inValue) { _duration = inValue; }\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">  ```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Local variables<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>: camelCase (e.g., <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>timelineCount<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>, <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>lastTime<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Methods</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Public methods<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>: camelCase\n  <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n  float getDuration() { return _duration; }\n  void apply(Skeleton&amp; skeleton, float lastTime, float time, ...);\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">  ```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Getters/Setters<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>: get/set prefix pattern\n  <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n  const String&amp; getName() { return _name; }\n  void setName(const String&amp; inValue) { _name = inValue; }\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">  ```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Class Structure</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Base Class Pattern</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">All classes inherit from <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>SpineObject<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>:\n<span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nclass SP_API Animation : public SpineObject {\n    // ...\n};\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Access Modifiers Order</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">1<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Friend declarations\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">2<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Public members\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">3<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Protected members\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">4<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Private members\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Friend Classes</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Extensive use for internal access:\n<span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nfriend class AnimationState;\nfriend class AnimationStateData;\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Memory Management</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Manual Memory Management</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">No smart pointers\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Explicit new/delete with custom allocators\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> SpineObject base class provides memory tracking\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Object Pools</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nclass SP_API Pool&lt;T&gt; : public SpineObject {\n    // Efficient object recycling\n};\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Vector Usage</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Custom Vector class instead of std::vector:\n<span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nVector&lt;Timeline*&gt; _timelines;\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Type System</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Custom String Class</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nclass SP_API String : public SpineObject {\n    // UTF-8 aware string implementation\n};\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Container Types</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>Vector&lt;T&gt;<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> - Dynamic array\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>HashMap&lt;K,V&gt;<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> - Hash map implementation\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>Pool&lt;T&gt;<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> - Object pool\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">RTTI Usage</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Runtime type information with RTTI macros:\n<span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nRTTI_DECL\nRTTI_IMPL(Animation, SpineObject)\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Error Handling</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">No Exceptions</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Uses assertions for debug builds\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Return values indicate success/failure\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> assert() for internal invariants\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Assertions</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nassert(timelineCount == _timelines.size());\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Documentation</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Triple-Slash Comments</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n/// @brief Sets the duration of the animation.\n/// @param inValue The duration in seconds.\nvoid setDuration(float inValue);\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">File Headers</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n/******************************************************************************\n * Spine Runtimes License Agreement\n * ...\n *****************************************************************************/\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Platform Handling</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">DLL Export/Import</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n#ifdef SPINE_CPP_DLL\n    #ifdef _MSC_VER\n        #define SP_API __declspec(dllexport)\n    #else\n        #define SP_API __attribute__((visibility(&quot;default&quot;)))\n    #endif\n#else\n    #define SP_API\n#endif\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Platform-Specific Code</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Minimal, mostly in Extension.cpp\n\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Include Style</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">System Headers</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\n#include &lt;spine/SpineObject.h&gt;\n#include &lt;spine/Vector.h&gt;\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Forward Declarations</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Used extensively to minimize dependencies:\n<span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nnamespace spine {\n    class Skeleton;\n    class Event;\n}\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Special Patterns</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Inline Getters/Setters</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Simple accessors defined in headers:\n<span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nfloat getDuration() { return _duration; }\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span>\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Const Correctness</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Const methods where appropriate\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Const references for parameters\n<span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">cpp</span>\nvoid apply(Skeleton&amp; skeleton, float lastTime, float time,\n          Vector&lt;Event*&gt;* pEvents, float alpha,\n          MixBlend blend, MixDirection direction);\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">No STL Usage</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-meta syntax-paragraph syntax-markdown\">Custom implementations for all containers, minimal stdlib dependency\n\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Build System</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">CMake Integration</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">include directories specified in CMakeLists.txt\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Separate static/shared library targets\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Compiler Flags</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">C++11 standard\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> RTTI enabled\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> No exceptions (-fno-exceptions on some platforms)\n</span></span></span></span></code></pre>\n<p><strong>Porting Notes (porting-notes.md)</strong></p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">#</span> </span><span class=\"syntax-markup syntax-heading syntax-1 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Porting Notes</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Java to C++ Porting Conventions</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Direct Field Access vs Getters/Setters</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">C++ uses direct field access (e.g., <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>p._mixRotate<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>) where Java uses direct field access (e.g., <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>p.mixRotate<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> C++ uses underscore prefix for private fields but accesses them directly via friend classes\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> This is intentional - C++ classes are friends of each other to allow direct field access\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Do NOT change direct field access to getter/setter calls in C++\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Java <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>slot.pose.attachment<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → C++ <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>_slot-&gt;_pose._attachment<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> (NOT <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>_slot-&gt;getPose()._attachment<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Override Keywords</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">When fixing override warnings, add <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>virtual<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> and <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>override<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> keywords to methods in derived classes\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Example: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>PathConstraintData &amp;getData();<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>virtual PathConstraintData &amp;getData() override;<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Pose vs Applied Usage (CRITICAL)</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">C++ MUST use the same pose reference as Java\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If Java uses <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>applied<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>, C++ must use <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>_applied<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If Java uses <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>pose<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>, C++ must use <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>_pose<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Never mix these up - they represent different states in the constraint system\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Example:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Java: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>IkConstraintPose p = applied;<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → C++: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>IkConstraintPose &amp;p = *_applied;<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Java: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>copy.pose.set(pose);<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → C++: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>copy-&gt;_pose.set(_pose);<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Constraint Pose Initialization</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">In Java, constraint constructors pass new pose instances to the parent constructor\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> In C++, <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>ConstraintGeneric<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> allocates poses as member fields (<span class=\"syntax-markup syntax-italic syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-italic syntax-begin syntax-markdown\">_</span>pose and _constrained), not through constructor\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Example: Java <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>super(data, new PhysicsConstraintPose(), new PhysicsConstraintPose())<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> C++ just calls <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>ConstraintGeneric&lt;PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose&gt;(data)<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Method Name Differences</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Java <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>Posed.reset()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → C++ <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>PosedGeneric::resetConstrained()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> This naming difference must exist to avoid conflicts with other reset methods in C++\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> The Java code has a comment <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>// Port: resetConstrained<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> indicating this is intentional\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Methods NOT Ported</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>toString()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> methods are not ported to C++\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Methods that use <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>Matrix3<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> type in Java are not ported to C++\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Parameter Conversions</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Methods that take <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>Vector2<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> in Java are &quot;unrolled&quot; in C++ to use separate float parameters:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Java: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>worldToLocal(Vector2 world)<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> C++: <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>worldToLocal(float worldX, float worldY, float&amp; outLocalX, float&amp; outLocalY)<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Dark Color Handling Pattern</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Java uses <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>@Null Color darkColor<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> (nullable reference)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> C++ uses <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>Color _darkColor<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> with <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>bool _hasDarkColor<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> flag\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> This avoids manual memory management while maintaining the same functionality\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> The <span class=\"syntax-markup syntax-italic syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-italic syntax-begin syntax-markdown\">_</span>hasDarkColor boolean indicates whether a dark color has been set\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Example: SlotPose class uses this pattern\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">\n</span><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">##</span> </span><span class=\"syntax-markup syntax-heading syntax-2 syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">Event Class (Ported - 4.3-beta update)</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">Method names updated to match Java API:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>getIntValue()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>getInt()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>setIntValue()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>setInt()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>getFloatValue()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>getFloat()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>setFloatValue()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>setFloat()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>getStringValue()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>getString()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">  </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>setStringValue()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> → <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>setString()<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Constructor now initializes values from EventData defaults to match Java behavior\n</span></span></span></span></code></pre>\n<p>At this point, we have exactly what we need in the context and nothing else: <code>port.md</code> in full (the program), the metadata from the porting plan JSON, the target runtime conventions in full, and the porting notes in full.</p>\n<p>And now here's the main loop that does the actual porting:</p>\n<pre><code class=\"language-markdown\"><span class=\"code-snippet\" data-language=\"Markdown\"><span class=\"syntax-text syntax-html syntax-markdown\"><span class=\"syntax-meta syntax-block-level syntax-markdown\"><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-heading syntax-begin syntax-markdown\">###</span> </span><span class=\"syntax-markup syntax-heading syntax-markdown\"><span class=\"syntax-entity syntax-name syntax-section syntax-markdown\">2. Port Types (Repeat for each)</span><span class=\"syntax-meta syntax-whitespace syntax-newline syntax-markdown\">\n</span></span></span>\n<span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">1<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Find next pending type:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n   <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">bash</span>\n   # Get next pending type info with candidate files\n   jq -r &#39;.portingOrder[] | {file: .javaSourcePath, types: .types[] | select(.portingState == &quot;pending&quot;)} | &quot;\\(.file)|\\(.types.name)|\\(.types.kind)|\\(.types.startLine)|\\(.types.endLine)|\\(.types.candidateFiles | join(&quot;,&quot;))&quot;&#39; porting-plan.json | head -1\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">   ```\n</span></span></span>\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">2<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Open files in VS Code via vs-claude (for user review):<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Open Java file and Java file git diff (from prevBranch to currentBranch)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If candidateFiles exists: open all candidate files\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\">\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">3<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Confirm with user:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Ask: &quot;Port this type? (y/n)&quot;\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> STOP and wait for confirmation.\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\">\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">4<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Read source files:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Note: Read the files in parallel if possible\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Java: Read the ENTIRE file so it is fully in your context!\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Target: If exists, read the ENTIRE file(s) so they are fully in your context!\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> For large files (&gt;2000 lines): Read in chunks of 1000 lines\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Read parent types if needed (check extends/implements)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Goal: Have complete files in context for accurate porting\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\">\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">5<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Port the type:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Follow conventions from ${targetRuntime}-conventions.md\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If target file(s) don&#39;t exist, create them and open them for the user via vs-claude\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Port incrementally and always ultrathink:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">     </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Base on the full content of the files in your context, identify differences and changes that need to be made.\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">      </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> differences can be due to idiomatic differences, or real differences due to new or changed functionality in the reference\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">        </span><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\">implementation. Ultrathink to discern which is which.\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">     </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If changes need to be made:\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">       </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Structure first (fields, method signatures)\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">       </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Then method implementations\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">       </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">*</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> For C++: Run <span class=\"syntax-markup syntax-raw syntax-inline syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-begin syntax-markdown\">`</span>./compile-cpp.js<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-end syntax-markdown\">`</span></span> after each method\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Use MultiEdit for all changes to one file\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Ensure 100% functional parity\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Add or update jsdoc, doxygen, etc. based on Javadocs.\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\">\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">6<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Get user confirmation:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Open a diff of the files you modified, comparing HEAD to working.\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Give the user a summary of what you ported\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Ask: &quot;Mark as done? (y/n)&quot;\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> If yes, update status:\n   <span class=\"syntax-markup syntax-raw syntax-code-fence syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-begin syntax-markdown\">```</span><span class=\"syntax-constant syntax-other syntax-language-name syntax-markdown\">bash</span>\n   jq --arg file &quot;path/to/file.java&quot; --arg type &quot;TypeName&quot; \\\n      &#39;(.portingOrder[] | select(.javaSourcePath == $file) | .types[] | select(.name == $type) | .portingState) = &quot;done&quot;&#39; \\\n      porting-plan.json &gt; tmp.json &amp;&amp; mv tmp.json porting-plan.json\n<span class=\"syntax-punctuation syntax-definition syntax-raw syntax-code-fence syntax-end syntax-markdown\">   ```\n</span></span></span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\">\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">7<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>Update porting-notes.md:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Add any new patterns or special cases discovered.\n</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\">\n</span><span class=\"syntax-markup syntax-list syntax-numbered syntax-bullet syntax-markdown\">8<span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">.</span></span><span class=\"syntax-markup syntax-list syntax-numbered syntax-markdown\"> <span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"><span class=\"syntax-markup syntax-bold syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-bold syntax-begin syntax-markdown\">**</span>STOP and confirm:<span class=\"syntax-punctuation syntax-definition syntax-bold syntax-end syntax-markdown\">**</span></span>\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Show what was ported. Ask: &quot;Continue to next type? (y/n)&quot;\n</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\">   </span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-bullet syntax-markdown\"><span class=\"syntax-punctuation syntax-definition syntax-list_item syntax-markdown\">-</span></span><span class=\"syntax-markup syntax-list syntax-unnumbered syntax-markdown\"><span class=\"syntax-meta syntax-paragraph syntax-list syntax-markdown\"> Only proceed after confirmation.\n</span></span></span></span></code></pre>\n<p><strong>Step 1</strong> queries our state to find the next pending type using another precise <code>jq</code> function call. Here's what gets extracted from the porting plan and is now in the context:</p>\n<pre><code class=\"language-json\"><span class=\"code-snippet\" data-language=\"JSON\"><span class=\"syntax-source syntax-json\"><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-json\"><span class=\"syntax-punctuation syntax-section syntax-dictionary syntax-begin syntax-json\">{</span>\n  <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>javaSourcePath<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>/Users/badlogic/workspaces/spine-runtimes/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json\">,</span></span>\n  <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>types<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-meta syntax-structure syntax-array syntax-json\"><span class=\"syntax-punctuation syntax-section syntax-array syntax-begin syntax-json\">[</span>\n    <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-json\"><span class=\"syntax-punctuation syntax-section syntax-dictionary syntax-begin syntax-json\">{</span>\n      <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>name<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>AtlasAttachmentLoader<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json\">,</span></span>\n      <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>kind<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>class<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json\">,</span></span>\n      <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>startLine<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-constant syntax-numeric syntax-json\">43</span><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json\">,</span></span>\n      <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>endLine<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-constant syntax-numeric syntax-json\">101</span><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json\">,</span></span>\n      <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>isInner<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-constant syntax-language syntax-json\">false</span><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json\">,</span></span>\n      <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>portingState<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>pending<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-pair syntax-json\">,</span></span>\n      <span class=\"syntax-meta syntax-structure syntax-dictionary syntax-key syntax-json\"><span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>candidateFiles<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span></span><span class=\"syntax-meta syntax-structure syntax-dictionary syntax-value syntax-json\"><span class=\"syntax-punctuation syntax-separator syntax-dictionary syntax-key-value syntax-json\">:</span> <span class=\"syntax-meta syntax-structure syntax-array syntax-json\"><span class=\"syntax-punctuation syntax-section syntax-array syntax-begin syntax-json\">[</span>\n        <span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>/Users/badlogic/workspaces/spine-runtimes/spine-cpp/spine-cpp/include/spine/AtlasAttachmentLoader.h<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span><span class=\"syntax-punctuation syntax-separator syntax-array syntax-json\">,</span>\n        <span class=\"syntax-string syntax-quoted syntax-double syntax-json\"><span class=\"syntax-punctuation syntax-definition syntax-string syntax-begin syntax-json\">&quot;</span>/Users/badlogic/workspaces/spine-runtimes/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp<span class=\"syntax-punctuation syntax-definition syntax-string syntax-end syntax-json\">&quot;</span></span>\n      <span class=\"syntax-punctuation syntax-section syntax-array syntax-end syntax-json\">]</span></span>\n    </span><span class=\"syntax-punctuation syntax-section syntax-dictionary syntax-end syntax-json\">}</span></span>\n  <span class=\"syntax-punctuation syntax-section syntax-array syntax-end syntax-json\">]</span></span>\n</span><span class=\"syntax-punctuation syntax-section syntax-dictionary syntax-end syntax-json\">}</span></span>\n</span></span></code></pre>\n<p><strong>Steps 2-3</strong> implement a human checkpoint: the LLM opens relevant files in VS Code and waits for confirmation before proceeding. This isn't just politeness; it's a safety mechanism ensuring I can abort if something looks wrong, or if I want to port a different type, or if I can immediately see that this type is complete and we should update the porting state and move on to the next type.</p>\n<p><strong>Step 4</strong> is critical: &quot;Read the ENTIRE file so it is fully in your context!&quot; The emphasis prevents the LLM from being lazy and reading only parts of files, which would lead to incomplete ports. After this step, the context contains the complete source files needed for accurate porting.</p>\n<p><strong>Step 5</strong> does the actual porting work. The &quot;ultrathink to discern&quot; instruction acknowledges that porting isn't just mechanical translation; it requires judgment about idiomatic differences versus actual functionality changes.</p>\n<p><strong>Steps 6-8</strong> implement more human checkpoints and program state management. The LLM shows its work (via diffs), then updates the program's persistent state: step 6 writes to <code>porting-plan.json</code> to mark the type as done, and step 7 optionally updates <code>porting-notes.md</code> with new observations. This is where our program writes its state to disk - crucial for resumability. The state update in step 6 uses <code>jq</code> to surgically modify just the <code>portingState</code> field, ensuring we can resume exactly where we left off. Step 8 asks permission before the next loop iteration.</p>\n<p>This is our complete LLM program: structured initialization, precise function calls, state management, human checkpoints, and deterministic loops. What started as an ad hoc conversation with an AI has become a reproducible, resumable workflow that tackles real-world porting at scale.</p>\n<h2>Program Execution</h2>\n<p>Let's see this program in action:</p>\n<p>Your browser does not support the video tag.</p>\n<p>This recording demonstrates the key insights of treating LLMs as computers:</p>\n<ul>\n<li><strong>Follows the program</strong>: Reads port.md and executes each step methodically</li>\n<li><strong>Manages state</strong>: Uses precise jq queries to read and update porting-plan.json</li>\n<li><strong>Loads context strategically</strong>: Reads only necessary files when needed</li>\n<li><strong>Maintains resumability</strong>: Updates persistent state after each completed type</li>\n<li><strong>Implements human checkpoints</strong>: Asks for confirmation before proceeding</li>\n</ul>\n<p>Unlike ad hoc prompting where the conversation meanders, this programmatic approach follows a deterministic workflow. The LLM becomes a reliable executor of structured instructions rather than an unpredictable chat partner.</p>\n<p>While the LLM cannot handle the full porting process autonomously due to challenges with complex type hierarchies and execution flows, this deterministic workflow dramatically simplifies my work compared to manual porting. The tedious mechanical tasks are now automated, freeing me to focus on the genuinely difficult problems that require human insight.</p>\n<p>What previously took me 2-3 weeks, now takes 2-3 days.</p>\n<h2>Future Work</h2>\n<p>As with everything, there's always plenty of room for improvements.</p>\n<p><strong>Testing and debugging</strong>: The deterministic nature of these workflows opens possibilities for traditional software engineering practices. We could test that given specific inputs and state, our programs produce expected outputs. For debugging, we could instrument prompts to write state information at key points, creating execution traces that help identify where workflows diverge from expectations.</p>\n<p><strong>Sub-agent orchestration</strong>: Current tools like Claude Code spawn sub-agents without observability or communication channels. To scale this programming model, we need structured ways to program sub-agents and monitor their execution. The main agent should define explicit workflows for sub-agents rather than generating them ad hoc, ensuring reliability through the same structured approach we use for the primary workflow.</p>\n<h2>Conclusion</h2>\n<p>This mental model has transformed how I work with established codebases using agentic coding tools. By treating LLMs as programmable computers rather than conversational partners, I've found a more reliable approach to complex software tasks. It's not a panacea and won't work for all problems, but it represents a step toward turning AI-assisted coding into an engineering discipline rather than a &quot;throwing shit at the wall&quot; approach.</p>\n<p>This page respects your privacy by not using cookies or similar technologies and by not collecting any personally identifiable information.</p>\n",
  "content_markdown": "![](https://mariozechner.at/posts/2025-06-02-prompts-are-code/media/hello-computer.jpg)\\\nHello, Computer, do my work\n\n- [Feeling the pain](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_0)\n- [Thinking of LLMs as Shitty General Purpose Computers](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_1)\n- [A Real World Example: Porting the Spine Runtimes](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_2)\n- [The \"Port Java to X\" Program](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_3)\n  - [Initial Input and State](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_4)\n  - [The Function Library](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_5)\n  - [The Main Workflow](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_6)\n- [Program Execution](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_7)\n- [Future Work](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_8)\n- [Conclusion](https://mariozechner.at/posts/2025-06-02-prompts-are-code#toc_9)\n\nLike most of you, I've been dabbling in what people call \"agentic engineering.\" Truth is, there's not much engineering happening. We're basically throwing shit at the wall and hoping something sticks.\n\nUsing LLM coding tools like Claude Code to spin up throwaway greenfield projects or bang out ad hoc scripts? Pretty great experience. But try using them on a big, established codebase, or the-production-app-formerly-known-as-greenfield-project without breaking everything? That's where things get painful.\n\n## Feeling the pain\n\nFor bigger codebases, the main issue is context, or rather, the lack of it. These tools don't have the full picture of your project. Maybe you haven't given them that overview, or maybe their context window is too small to hold all your interconnected components. But there's more to it.\n\nEven with recent improvements like 'reasoning', which is really just the old 'think step by step' trick, with more scratch space to attend to, LLMs still can't follow execution flow all that well. They're especially lost with anything beyond sequential scripts: multiple processes, IPC, client-server architectures, concurrent execution within the same process. Even when you manage to cram all the context they need, they'll still generate code that doesn't fit your system's actual architecture.\n\nLLMs also lack taste. Trained on all code on the web (and likely some private code), they generate, to oversimplify, the statistical mean of what they've seen. While senior engineers strive for elegant, minimal solutions that reduce bugs and complexity, LLMs reach for 'best practices' and spit out over-engineered garbage. Let them run wild and you'll get code that's hard to maintain, hard to understand, and full of places for bugs to hide.\n\nThen there's context degradation. As your session progresses and pulls in more files, tool outputs, and other data, things start falling apart around 100k tokens. Benchmarks be damned. Whatever tricks LLM providers use to achieve those massive context windows don't work in practice. The model loses track of important details buried in the middle of all that context.\n\nWorse still, many tools don't let you control what goes into your context. Companies like Cursor that aren't LLM providers themselves need to make a margin between what you pay them and what they pay for tokens. Their incentive? Cut down your context to save money, which means the LLM might miss crucial information or get it in a suboptimal format.\n\nClaude Code is different. It comes straight from Anthropic with no middleman trying to squeeze margins. With the Max plan, you get essentially unlimited tokens (though folks like [Peter](https://twitter.com/steipete) manage to get rate limited even with three or four accounts). You still don't have full control: there's a system prompt you can't change, additional instructions get sneakily injected into your first message, the VS Code integration adds unwanted crap, and all the tool definitions eat up context and give the model plenty of rope to confuse itself with. But this is the best deal we're getting, so we work with what we have. (Anthropic, please OSS Claude Code. Your models are your moat, not Claude Code.)\n\n## How do we tame this agentic mess?\n\nWhat we need when using coding agents on bigger codebases is a structured way to engineer context. By that I mean: keep only the information needed for the task of modifying or generating code, minimize the number of turns the model needs to take calling tools or reporting back to us, and ensure nothing important is missing. We want reproducible workflows. We want determinism, as much as possible within the limits of these inherently non-deterministic models.\n\nI'm a programmer. You're probably a programmer. We think in systems, deterministic workflows, and abstractions. What's more natural for us than viewing LLMs as an extremely slow kind of unreliable computer that we program with natural language?\n\nThis is a weird form of metaprogramming: we write \"code\" in the form of prompts that execute on the LLM to produce the actual code that runs on real CPUs.\n\nYes, I know LLMs aren't actually computers (though there are some papers on arXiv...). The metaphor is a bit stretched. But here's the thing: as developers, we're used to encoding specifications in precise programming languages. When we interact with LLMs, the fuzziness of natural language makes us forget we can apply the same structured thinking. This framework bridges that gap: think \"inputs, state, outputs\" instead of \"chat with the AI\" and suddenly you're closer to engineering solutions instead of just hoping for the best.\n\n## Thinking of LLMs as Shitty General Purpose Computers\n\nIn traditional software, we create programs by writing code and importing libraries. A program takes inputs, manipulates state, and produces outputs. We can map these concepts to our LLM-as-shitty-computer metaphor like this:\n\n**Program** is your prompt, written in natural language. It specifies initial inputs, \"imports\" external functions via tool descriptions, and implements business logic through control flow: sequential steps, loops, conditionals, and yes, even goto. Tool calls and user input are I/O.\n\n**Inputs** come from three sources: prepared information (codebase docs, style guides, architecture overviews) either baked into the prompt or loaded from disk, user input during execution (clarifications, corrections, new requirements), and tool outputs (file contents, command results, API responses).\n\n**State** evolves as the program runs. Some lives in the context, but we treat that as ephemeral: compaction will eventually wipe it (trololo). Plus, you'll quickly hit context limits with any substantial state. So we serialize to disk using formats LLMs handle well: JSON for structured data, where the LLM can surgically read and update specific fields via `jq`. Markdown for smaller unstructured data we can load fully into context if needed. The payoff? You can resume from any point with a fresh context, sidestepping the dreaded compaction issue entirely.\n\n**Outputs** aren't limited to generated code. Just like traditional programs produce console output, write files, or display GUIs, our LLM program uses tool calls to create various outputs: the actual code, diffs, open files in an editor for us, codebase statistics, summaries of changes, or any other artifact that documents what the program did. These outputs serve multiple purposes: helping you review the work, providing input for the next steps in the workflow, or simply showing the program's progress.\n\nLet's see how this plays out in practice.\n\n## A Real World Example: Porting the Spine Runtimes\n\nAfter experimenting with toy projects, I felt ready to apply this approach to a real codebase: the [Spine runtimes](https://github.com/EsotericSoftware/spine-runtimes).\n\n[Spine](https://esotericsoftware.com) is 2D skeletal animation software. You create animations in the editor, export them to a runtime format, then use one of many runtimes to display them in your app or game. We maintain runtimes for C, C++, C#, Haxe, Java, Dart, Swift, and TypeScript. On top of these, we've built integrations for Unity, Unreal, Godot, Phaser, Pixi, ThreeJS, iOS, Android, web, and more.\n\nHere's the painful part: between releases, the runtime code changes. We implement new features in our reference implementation (spine-libgdx in Java, which powers the editor), then manually port those changes to every other language runtime. It's tedious, error-prone work. Math-heavy code needs exact translation, and after hours of porting, your brain turns to mush. Bugs creep in that are hell to track down.\n\n![Git diff showing thousands of lines of code changes](https://mariozechner.at/posts/2025-06-02-prompts-are-code/media/changeset.png)\n\nAnd no, transpilers won't work for this (trust me, bro, I made money doing compilers). We need idiomatic ports that preserve the same API surface in a way that feels natural for each language.\n\nBetween releases 4.2 and 4.3-beta, the Java reference implementation saw significant changes:\n\n```bash\n$ git diff --stat 4.2..4.3-beta -- '*.java' | tail -1\n  79 files changed, 4820 insertions(+), 4679 deletions(-)\n```\n\nHere's how I'd approach this with my manual workflow:\n\n1. Open the changeset in Fork (my git client) and scan through all changed files\n2. Plan the porting order based on the dependency graph: interfaces and enums first (they're usually independent), then try to port dependencies before the classes that use them, hoping to maintain some compilability\n3. Pick a type to port in Java, open a side-by-side diff, check if the type already exists in the target runtime or needs creation from scratch\n4. Port changes line-by-line, method-by-method to the target language\n5. Watch the illusion of order crumble: the dependency graph is cyclic, so there's no perfect porting order that keeps everything compiling (note to self: it would be nice if we had an acyclic type dependency graph)\n6. Can't test individual pieces because a skeletal animation system needs all its parts working in concert\n7. Port everything blind, then face a wall of compilation errors and bugs introduced because my brain was fried after hours of human transpilation\n\nThis is especially fun when porting from Java to C, the language pair with the biggest type system and memory management mismatch.\n\nWhat makes this tractable is that we maintain the same API surface across all runtime implementations. If there's a class `Animation` in Java, there's also a class `Animation` in C#, C++, and every other runtime, in a corresponding file. This one-to-one mapping exists for 99% of types. Sure, there are quirks like Java files containing dozens of inner classes, but the structural consistency is there.\n\nHere's an example of one of the more math-heavy types, `PhysicsConstraint`:\n\n**Java (PhysicsConstraint.java)**\n\n```java\npackage com.esotericsoftware.spine;\n\nimport static com.esotericsoftware.spine.utils.SpineUtils.*;\n\n/** Stores the current pose for a physics constraint. A physics constraint applies physics to bones.\n * <p>\n * See <a href=\"https://esotericsoftware.com/spine-physics-constraints\">Physics constraints</a> in the Spine User Guide. */\npublic class PhysicsConstraint extends Constraint<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose> {\n\tBonePose bone;\n\n\tboolean reset = true;\n\tfloat ux, uy, cx, cy, tx, ty;\n\tfloat xOffset, xLag, xVelocity;\n\tfloat yOffset, yLag, yVelocity;\n\tfloat rotateOffset, rotateLag, rotateVelocity;\n\tfloat scaleOffset, scaleLag, scaleVelocity;\n\tfloat remaining, lastTime;\n\n\tpublic PhysicsConstraint (PhysicsConstraintData data, Skeleton skeleton) {\n\t\tsuper(data, new PhysicsConstraintPose(), new PhysicsConstraintPose());\n\t\tif (skeleton == null) throw new IllegalArgumentException(\"skeleton cannot be null.\");\n\n\t\tbone = skeleton.bones.items[data.bone.index].constrained;\n\t}\n\n\tpublic PhysicsConstraint copy (Skeleton skeleton) {\n\t\tvar copy = new PhysicsConstraint(data, skeleton);\n\t\tcopy.pose.set(pose);\n\t\treturn copy;\n\t}\n\n\tpublic void reset (Skeleton skeleton) {\n\t\tremaining = 0;\n\t\tlastTime = skeleton.time;\n\t\treset = true;\n\t\txOffset = 0;\n\t\txLag = 0;\n\t\txVelocity = 0;\n\t\tyOffset = 0;\n\t\tyLag = 0;\n\t\tyVelocity = 0;\n\t\trotateOffset = 0;\n\t\trotateLag = 0;\n\t\trotateVelocity = 0;\n\t\tscaleOffset = 0;\n\t\tscaleLag = 0;\n\t\tscaleVelocity = 0;\n\t}\n\n\t/** Translates the physics constraint so next {@link #update(Skeleton, Physics)} forces are applied as if the bone moved an\n\t * additional amount in world space. */\n\tpublic void translate (float x, float y) {\n\t\tux -= x;\n\t\tuy -= y;\n\t\tcx -= x;\n\t\tcy -= y;\n\t}\n\n\t/** Rotates the physics constraint so next {@link #update(Skeleton, Physics)} forces are applied as if the bone rotated around\n\t * the specified point in world space. */\n\tpublic void rotate (float x, float y, float degrees) {\n\t\tfloat r = degrees * degRad, cos = cos(r), sin = sin(r);\n\t\tfloat dx = cx - x, dy = cy - y;\n\t\ttranslate(dx * cos - dy * sin - dx, dx * sin + dy * cos - dy);\n\t}\n\n\t/** Applies the constraint to the constrained bones. */\n\tpublic void update (Skeleton skeleton, Physics physics) {\n\t\tPhysicsConstraintPose p = applied;\n\t\tfloat mix = p.mix;\n\t\tif (mix == 0) return;\n\n\t\tboolean x = data.x > 0, y = data.y > 0, rotateOrShearX = data.rotate > 0 || data.shearX > 0, scaleX = data.scaleX > 0;\n\t\tBonePose bone = this.bone;\n\t\tfloat l = bone.bone.data.length, t = data.step, z = 0;\n\n\t\tswitch (physics) {\n\t\tcase none:\n\t\t\treturn;\n\t\tcase reset:\n\t\t\treset(skeleton);\n\t\t\t// Fall through.\n\t\tcase update:\n\t\t\tfloat delta = Math.max(skeleton.time - lastTime, 0), aa = remaining;\n\t\t\tremaining += delta;\n\t\t\tlastTime = skeleton.time;\n\n\t\t\tfloat bx = bone.worldX, by = bone.worldY;\n\t\t\tif (reset) {\n\t\t\t\treset = false;\n\t\t\t\tux = bx;\n\t\t\t\tuy = by;\n\t\t\t} else {\n\t\t\t\tfloat a = remaining, i = p.inertia, f = skeleton.data.referenceScale, d = -1, m = 0, e = 0, ax = 0, ay = 0,\n\t\t\t\t\tqx = data.limit * delta, qy = qx * Math.abs(skeleton.scaleY);\n\t\t\t\tqx *= Math.abs(skeleton.scaleX);\n\t\t\t\tif (x || y) {\n\t\t\t\t\tif (x) {\n\t\t\t\t\t\tfloat u = (ux - bx) * i;\n\t\t\t\t\t\txOffset += u > qx ? qx : u < -qx ? -qx : u;\n\t\t\t\t\t\tux = bx;\n\t\t\t\t\t}\n\t\t\t\t\tif (y) {\n\t\t\t\t\t\tfloat u = (uy - by) * i;\n\t\t\t\t\t\tyOffset += u > qy ? qy : u < -qy ? -qy : u;\n\t\t\t\t\t\tuy = by;\n\t\t\t\t\t}\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tfloat xs = xOffset, ys = yOffset;\n\t\t\t\t\t\td = (float)Math.pow(p.damping, 60 * t);\n\t\t\t\t\t\tm = t * p.massInverse;\n\t\t\t\t\t\te = p.strength;\n\t\t\t\t\t\tfloat w = f * p.wind, g = f * p.gravity;\n\t\t\t\t\t\tax = (w * skeleton.windX + g * skeleton.gravityX) * skeleton.scaleX;\n\t\t\t\t\t\tay = (w * skeleton.windY + g * skeleton.gravityY) * skeleton.scaleY;\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\tif (x) {\n\t\t\t\t\t\t\t\txVelocity += (ax - xOffset * e) * m;\n\t\t\t\t\t\t\t\txOffset += xVelocity * t;\n\t\t\t\t\t\t\t\txVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (y) {\n\t\t\t\t\t\t\t\tyVelocity -= (ay + yOffset * e) * m;\n\t\t\t\t\t\t\t\tyOffset += yVelocity * t;\n\t\t\t\t\t\t\t\tyVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t} while (a >= t);\n\t\t\t\t\t\txLag = xOffset - xs;\n\t\t\t\t\t\tyLag = yOffset - ys;\n\t\t\t\t\t}\n\t\t\t\t\tz = Math.max(0, 1 - a / t);\n\t\t\t\t\tif (x) bone.worldX += (xOffset - xLag * z) * mix * data.x;\n\t\t\t\t\tif (y) bone.worldY += (yOffset - yLag * z) * mix * data.y;\n\t\t\t\t}\n\t\t\t\tif (rotateOrShearX || scaleX) {\n\t\t\t\t\tfloat ca = atan2(bone.c, bone.a), c, s, mr = 0, dx = cx - bone.worldX, dy = cy - bone.worldY;\n\t\t\t\t\tif (dx > qx)\n\t\t\t\t\t\tdx = qx;\n\t\t\t\t\telse if (dx < -qx) //\n\t\t\t\t\t\tdx = -qx;\n\t\t\t\t\tif (dy > qy)\n\t\t\t\t\t\tdy = qy;\n\t\t\t\t\telse if (dy < -qy) //\n\t\t\t\t\t\tdy = -qy;\n\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\tmr = (data.rotate + data.shearX) * mix;\n\t\t\t\t\t\tz = rotateLag * Math.max(0, 1 - aa / t);\n\t\t\t\t\t\tfloat r = atan2(dy + ty, dx + tx) - ca - (rotateOffset - z) * mr;\n\t\t\t\t\t\trotateOffset += (r - (float)Math.ceil(r * invPI2 - 0.5f) * PI2) * i;\n\t\t\t\t\t\tr = (rotateOffset - z) * mr + ca;\n\t\t\t\t\t\tc = cos(r);\n\t\t\t\t\t\ts = sin(r);\n\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\tr = l * bone.getWorldScaleX();\n\t\t\t\t\t\t\tif (r > 0) scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc = cos(ca);\n\t\t\t\t\t\ts = sin(ca);\n\t\t\t\t\t\tfloat r = l * bone.getWorldScaleX() - scaleLag * Math.max(0, 1 - aa / t);\n\t\t\t\t\t\tif (r > 0) scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t}\n\t\t\t\t\ta = remaining;\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tif (d == -1) {\n\t\t\t\t\t\t\td = (float)Math.pow(p.damping, 60 * t);\n\t\t\t\t\t\t\tm = t * p.massInverse;\n\t\t\t\t\t\t\te = p.strength;\n\t\t\t\t\t\t\tfloat w = f * p.wind, g = f * p.gravity;\n\t\t\t\t\t\t\tax = (w * skeleton.windX + g * skeleton.gravityX) * skeleton.scaleX;\n\t\t\t\t\t\t\tay = (w * skeleton.windY + g * skeleton.gravityY) * skeleton.scaleY;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfloat rs = rotateOffset, ss = scaleOffset, h = l / f;\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\t\tscaleVelocity += (ax * c - ay * s - scaleOffset * e) * m;\n\t\t\t\t\t\t\t\tscaleOffset += scaleVelocity * t;\n\t\t\t\t\t\t\t\tscaleVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\t\t\trotateVelocity -= ((ax * s + ay * c) * h + rotateOffset * e) * m;\n\t\t\t\t\t\t\t\trotateOffset += rotateVelocity * t;\n\t\t\t\t\t\t\t\trotateVelocity *= d;\n\t\t\t\t\t\t\t\tif (a < t) break;\n\t\t\t\t\t\t\t\tfloat r = rotateOffset * mr + ca;\n\t\t\t\t\t\t\t\tc = cos(r);\n\t\t\t\t\t\t\t\ts = sin(r);\n\t\t\t\t\t\t\t} else if (a < t) //\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\trotateLag = rotateOffset - rs;\n\t\t\t\t\t\tscaleLag = scaleOffset - ss;\n\t\t\t\t\t}\n\t\t\t\t\tz = Math.max(0, 1 - a / t);\n\t\t\t\t}\n\t\t\t\tremaining = a;\n\t\t\t}\n\t\t\tcx = bone.worldX;\n\t\t\tcy = bone.worldY;\n\t\t\tbreak;\n\t\tcase pose:\n\t\t\tz = Math.max(0, 1 - remaining / t);\n\t\t\tif (x) bone.worldX += (xOffset - xLag * z) * mix * data.x;\n\t\t\tif (y) bone.worldY += (yOffset - yLag * z) * mix * data.y;\n\t\t}\n\n\t\tif (rotateOrShearX) {\n\t\t\tfloat o = (rotateOffset - rotateLag * z) * mix, s, c, a;\n\t\t\tif (data.shearX > 0) {\n\t\t\t\tfloat r = 0;\n\t\t\t\tif (data.rotate > 0) {\n\t\t\t\t\tr = o * data.rotate;\n\t\t\t\t\ts = sin(r);\n\t\t\t\t\tc = cos(r);\n\t\t\t\t\ta = bone.b;\n\t\t\t\t\tbone.b = c * a - s * bone.d;\n\t\t\t\t\tbone.d = s * a + c * bone.d;\n\t\t\t\t}\n\t\t\t\tr += o * data.shearX;\n\t\t\t\ts = sin(r);\n\t\t\t\tc = cos(r);\n\t\t\t\ta = bone.a;\n\t\t\t\tbone.a = c * a - s * bone.c;\n\t\t\t\tbone.c = s * a + c * bone.c;\n\t\t\t} else {\n\t\t\t\to *= data.rotate;\n\t\t\t\ts = sin(o);\n\t\t\t\tc = cos(o);\n\t\t\t\ta = bone.a;\n\t\t\t\tbone.a = c * a - s * bone.c;\n\t\t\t\tbone.c = s * a + c * bone.c;\n\t\t\t\ta = bone.b;\n\t\t\t\tbone.b = c * a - s * bone.d;\n\t\t\t\tbone.d = s * a + c * bone.d;\n\t\t\t}\n\t\t}\n\t\tif (scaleX) {\n\t\t\tfloat s = 1 + (scaleOffset - scaleLag * z) * mix * data.scaleX;\n\t\t\tbone.a *= s;\n\t\t\tbone.c *= s;\n\t\t}\n\t\tif (physics != Physics.pose) {\n\t\t\ttx = l * bone.a;\n\t\t\tty = l * bone.c;\n\t\t}\n\t\tbone.modifyWorld(skeleton.update);\n\t}\n\n\tvoid sort (Skeleton skeleton) {\n\t\tBone bone = this.bone.bone;\n\t\tskeleton.sortBone(bone);\n\t\tskeleton.updateCache.add(this);\n\t\tskeleton.sortReset(bone.children);\n\t\tskeleton.constrained(bone);\n\t}\n\n\tboolean isSourceActive () {\n\t\treturn bone.bone.active;\n\t}\n\n\t/** The bone constrained by this physics constraint. */\n\tpublic BonePose getBone () {\n\t\treturn bone;\n\t}\n\n\tpublic void setBone (BonePose bone) {\n\t\tthis.bone = bone;\n\t}\n}\n```\n\n**C++ Header (PhysicsConstraint.h)**\n\n```cpp\n#ifndef Spine_PhysicsConstraint_h\n#define Spine_PhysicsConstraint_h\n\n#include <spine/Constraint.h>\n#include <spine/PhysicsConstraintData.h>\n#include <spine/PhysicsConstraintPose.h>\n#include <spine/BonePose.h>\n#include <spine/Vector.h>\n\nnamespace spine {\n\tclass Skeleton;\n\tclass BonePose;\n\tclass PhysicsConstraintPose;\n\n\t/// Stores the current pose for a physics constraint. A physics constraint applies physics to bones.\n\t///\n\t/// See https://esotericsoftware.com/spine-physics-constraints Physics constraints in the Spine User Guide.\n\tclass SP_API PhysicsConstraint : public ConstraintGeneric<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose> {\n\t\tfriend class Skeleton;\n\t\tfriend class PhysicsConstraintTimeline;\n\t\tfriend class PhysicsConstraintInertiaTimeline;\n\t\tfriend class PhysicsConstraintStrengthTimeline;\n\t\tfriend class PhysicsConstraintDampingTimeline;\n\t\tfriend class PhysicsConstraintMassTimeline;\n\t\tfriend class PhysicsConstraintWindTimeline;\n\t\tfriend class PhysicsConstraintGravityTimeline;\n\t\tfriend class PhysicsConstraintMixTimeline;\n\t\tfriend class PhysicsConstraintResetTimeline;\n\n\tpublic:\n\t\tRTTI_DECL\n\n\t\tPhysicsConstraint(PhysicsConstraintData& data, Skeleton& skeleton);\n\n\t\tvoid update(Skeleton& skeleton, Physics physics) override;\n\t\tvoid sort(Skeleton& skeleton) override;\n\t\tbool isSourceActive() override;\n\t\tPhysicsConstraint* copy(Skeleton& skeleton);\n\n\t\tvoid reset(Skeleton& skeleton);\n\n\t\t/// Translates the physics constraint so next update() forces are applied as if the bone moved an additional amount in world space.\n\t\tvoid translate(float x, float y);\n\n\t\t/// Rotates the physics constraint so next update() forces are applied as if the bone rotated around the specified point in world space.\n\t\tvoid rotate(float x, float y, float degrees);\n\n\t\t/// The bone constrained by this physics constraint.\n\t\tBonePose& getBone();\n\t\tvoid setBone(BonePose& bone);\n\n\tprivate:\n\t\tBonePose* _bone;\n\n\t\tbool _reset;\n\t\tfloat _ux, _uy, _cx, _cy, _tx, _ty;\n\t\tfloat _xOffset, _xLag, _xVelocity;\n\t\tfloat _yOffset, _yLag, _yVelocity;\n\t\tfloat _rotateOffset, _rotateLag, _rotateVelocity;\n\t\tfloat _scaleOffset, _scaleLag, _scaleVelocity;\n\t\tfloat _remaining, _lastTime;\n\t};\n}\n\n#endif /* Spine_PhysicsConstraint_h */\n```\n\n**C++ Implementation (PhysicsConstraint.cpp)**\n\n```cpp\n#include <spine/PhysicsConstraint.h>\n#include <spine/PhysicsConstraintData.h>\n#include <spine/PhysicsConstraintPose.h>\n#include <spine/BonePose.h>\n#include <spine/Skeleton.h>\n#include <spine/SkeletonData.h>\n#include <spine/BoneData.h>\n#include <spine/Bone.h>\n#include <spine/MathUtil.h>\n\nusing namespace spine;\n\nRTTI_IMPL(PhysicsConstraint, Constraint)\n\nPhysicsConstraint::PhysicsConstraint(PhysicsConstraintData &data, Skeleton &skeleton) : ConstraintGeneric<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose>(data),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_reset(true), _ux(0), _uy(0), _cx(0), _cy(0), _tx(0), _ty(0),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_xOffset(0), _xLag(0), _xVelocity(0), _yOffset(0), _yLag(0), _yVelocity(0),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_rotateOffset(0), _rotateLag(0), _rotateVelocity(0), _scaleOffset(0), _scaleLag(0), _scaleVelocity(0),\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t_remaining(0), _lastTime(0) {\n\n\t_bone = &skeleton._bones[(size_t) data._bone->getIndex()]->_constrained;\n}\n\nPhysicsConstraint *PhysicsConstraint::copy(Skeleton &skeleton) {\n\tPhysicsConstraint *copy = new (__FILE__, __LINE__) PhysicsConstraint(_data, skeleton);\n\tcopy->_pose.set(_pose);\n\treturn copy;\n}\n\nvoid PhysicsConstraint::reset(Skeleton &skeleton) {\n\t_remaining = 0;\n\t_lastTime = skeleton.getTime();\n\t_reset = true;\n\t_xOffset = 0;\n\t_xLag = 0;\n\t_xVelocity = 0;\n\t_yOffset = 0;\n\t_yLag = 0;\n\t_yVelocity = 0;\n\t_rotateOffset = 0;\n\t_rotateLag = 0;\n\t_rotateVelocity = 0;\n\t_scaleOffset = 0;\n\t_scaleLag = 0;\n\t_scaleVelocity = 0;\n}\n\nvoid PhysicsConstraint::translate(float x, float y) {\n\t_ux -= x;\n\t_uy -= y;\n\t_cx -= x;\n\t_cy -= y;\n}\n\nvoid PhysicsConstraint::rotate(float x, float y, float degrees) {\n\tfloat r = degrees * MathUtil::Deg_Rad, cosVal = MathUtil::cos(r), sinVal = MathUtil::sin(r);\n\tfloat dx = _cx - x, dy = _cy - y;\n\ttranslate(dx * cosVal - dy * sinVal - dx, dx * sinVal + dy * cosVal - dy);\n}\n\nvoid PhysicsConstraint::update(Skeleton &skeleton, Physics physics) {\n\tPhysicsConstraintPose &p = *_applied;\n\tfloat mix = p._mix;\n\tif (mix == 0) return;\n\n\tbool x = _data._x > 0, y = _data._y > 0, rotateOrShearX = _data._rotate > 0 || _data._shearX > 0, scaleX = _data._scaleX > 0;\n\tBonePose *bone = _bone;\n\tfloat l = bone->_bone->_data.getLength(), t = _data._step, z = 0;\n\n\tswitch (physics) {\n\t\tcase Physics_None:\n\t\t\treturn;\n\t\tcase Physics_Reset:\n\t\t\treset(skeleton);\n\t\t\t// Fall through.\n\t\tcase Physics_Update: {\n\t\t\tfloat delta = MathUtil::max(skeleton._time - _lastTime, 0.0f), aa = _remaining;\n\t\t\t_remaining += delta;\n\t\t\t_lastTime = skeleton._time;\n\n\t\t\tfloat bx = bone->_worldX, by = bone->_worldY;\n\t\t\tif (_reset) {\n\t\t\t\t_reset = false;\n\t\t\t\t_ux = bx;\n\t\t\t\t_uy = by;\n\t\t\t} else {\n\t\t\t\tfloat a = _remaining, i = p._inertia, f = skeleton._data.getReferenceScale(), d = -1, m = 0, e = 0, ax = 0, ay = 0,\n\t\t\t\t\t  qx = _data._limit * delta, qy = qx * MathUtil::abs(skeleton.getScaleY());\n\t\t\t\tqx *= MathUtil::abs(skeleton._scaleX);\n\t\t\t\tif (x || y) {\n\t\t\t\t\tif (x) {\n\t\t\t\t\t\tfloat u = (_ux - bx) * i;\n\t\t\t\t\t\t_xOffset += u > qx ? qx : u < -qx ? -qx\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  : u;\n\t\t\t\t\t\t_ux = bx;\n\t\t\t\t\t}\n\t\t\t\t\tif (y) {\n\t\t\t\t\t\tfloat u = (_uy - by) * i;\n\t\t\t\t\t\t_yOffset += u > qy ? qy : u < -qy ? -qy\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t  : u;\n\t\t\t\t\t\t_uy = by;\n\t\t\t\t\t}\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tfloat xs = _xOffset, ys = _yOffset;\n\t\t\t\t\t\td = MathUtil::pow(p._damping, 60 * t);\n\t\t\t\t\t\tm = t * p._massInverse;\n\t\t\t\t\t\te = p._strength;\n\t\t\t\t\t\tfloat w = f * p._wind, g = f * p._gravity;\n\t\t\t\t\t\tax = (w * skeleton._windX + g * skeleton._gravityX) * skeleton._scaleX;\n\t\t\t\t\t\tay = (w * skeleton._windY + g * skeleton._gravityY) * skeleton.getScaleY();\n\t\t\t\t\t\tdo {\n\t\t\t\t\t\t\tif (x) {\n\t\t\t\t\t\t\t\t_xVelocity += (ax - _xOffset * e) * m;\n\t\t\t\t\t\t\t\t_xOffset += _xVelocity * t;\n\t\t\t\t\t\t\t\t_xVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (y) {\n\t\t\t\t\t\t\t\t_yVelocity -= (ay + _yOffset * e) * m;\n\t\t\t\t\t\t\t\t_yOffset += _yVelocity * t;\n\t\t\t\t\t\t\t\t_yVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t} while (a >= t);\n\t\t\t\t\t\t_xLag = _xOffset - xs;\n\t\t\t\t\t\t_yLag = _yOffset - ys;\n\t\t\t\t\t}\n\t\t\t\t\tz = MathUtil::max(0.0f, 1 - a / t);\n\t\t\t\t\tif (x) bone->_worldX += (_xOffset - _xLag * z) * mix * _data._x;\n\t\t\t\t\tif (y) bone->_worldY += (_yOffset - _yLag * z) * mix * _data._y;\n\t\t\t\t}\n\t\t\t\tif (rotateOrShearX || scaleX) {\n\t\t\t\t\tfloat ca = MathUtil::atan2(bone->_c, bone->_a), c, s, mr = 0, dx = _cx - bone->_worldX, dy = _cy - bone->_worldY;\n\t\t\t\t\tif (dx > qx)\n\t\t\t\t\t\tdx = qx;\n\t\t\t\t\telse if (dx < -qx)\n\t\t\t\t\t\tdx = -qx;\n\t\t\t\t\tif (dy > qy)\n\t\t\t\t\t\tdy = qy;\n\t\t\t\t\telse if (dy < -qy)\n\t\t\t\t\t\tdy = -qy;\n\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\tmr = (_data._rotate + _data._shearX) * mix;\n\t\t\t\t\t\tz = _rotateLag * MathUtil::max(0.0f, 1 - aa / t);\n\t\t\t\t\t\tfloat r = MathUtil::atan2(dy + _ty, dx + _tx) - ca - (_rotateOffset - z) * mr;\n\t\t\t\t\t\t_rotateOffset += (r - MathUtil::ceil(r * MathUtil::InvPi_2 - 0.5f) * MathUtil::Pi_2) * i;\n\t\t\t\t\t\tr = (_rotateOffset - z) * mr + ca;\n\t\t\t\t\t\tc = MathUtil::cos(r);\n\t\t\t\t\t\ts = MathUtil::sin(r);\n\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\tr = l * bone->getWorldScaleX();\n\t\t\t\t\t\t\tif (r > 0) _scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tc = MathUtil::cos(ca);\n\t\t\t\t\t\ts = MathUtil::sin(ca);\n\t\t\t\t\t\tfloat r = l * bone->getWorldScaleX() - _scaleLag * MathUtil::max(0.0f, 1 - aa / t);\n\t\t\t\t\t\tif (r > 0) _scaleOffset += (dx * c + dy * s) * i / r;\n\t\t\t\t\t}\n\t\t\t\t\ta = _remaining;\n\t\t\t\t\tif (a >= t) {\n\t\t\t\t\t\tif (d == -1) {\n\t\t\t\t\t\t\td = MathUtil::pow(p._damping, 60 * t);\n\t\t\t\t\t\t\tm = t * p._massInverse;\n\t\t\t\t\t\t\te = p._strength;\n\t\t\t\t\t\t\tfloat w = f * p._wind, g = f * p._gravity;\n\t\t\t\t\t\t\tax = (w * skeleton._windX + g * skeleton._gravityX) * skeleton._scaleX;\n\t\t\t\t\t\t\tay = (w * skeleton._windY + g * skeleton._gravityY) * skeleton.getScaleY();\n\t\t\t\t\t\t}\n\t\t\t\t\t\tfloat rs = _rotateOffset, ss = _scaleOffset, h = l / f;\n\t\t\t\t\t\twhile (true) {\n\t\t\t\t\t\t\ta -= t;\n\t\t\t\t\t\t\tif (scaleX) {\n\t\t\t\t\t\t\t\t_scaleVelocity += (ax * c - ay * s - _scaleOffset * e) * m;\n\t\t\t\t\t\t\t\t_scaleOffset += _scaleVelocity * t;\n\t\t\t\t\t\t\t\t_scaleVelocity *= d;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif (rotateOrShearX) {\n\t\t\t\t\t\t\t\t_rotateVelocity -= ((ax * s + ay * c) * h + _rotateOffset * e) * m;\n\t\t\t\t\t\t\t\t_rotateOffset += _rotateVelocity * t;\n\t\t\t\t\t\t\t\t_rotateVelocity *= d;\n\t\t\t\t\t\t\t\tif (a < t) break;\n\t\t\t\t\t\t\t\tfloat r = _rotateOffset * mr + ca;\n\t\t\t\t\t\t\t\tc = MathUtil::cos(r);\n\t\t\t\t\t\t\t\ts = MathUtil::sin(r);\n\t\t\t\t\t\t\t} else if (a < t)\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t_rotateLag = _rotateOffset - rs;\n\t\t\t\t\t\t_scaleLag = _scaleOffset - ss;\n\t\t\t\t\t}\n\t\t\t\t\tz = MathUtil::max(0.0f, 1 - a / t);\n\t\t\t\t}\n\t\t\t\t_remaining = a;\n\t\t\t}\n\t\t\t_cx = bone->_worldX;\n\t\t\t_cy = bone->_worldY;\n\t\t\tbreak;\n\t\t}\n\t\tcase Physics_Pose: {\n\t\t\tz = MathUtil::max(0.0f, 1 - _remaining / t);\n\t\t\tif (x) bone->_worldX += (_xOffset - _xLag * z) * mix * _data._x;\n\t\t\tif (y) bone->_worldY += (_yOffset - _yLag * z) * mix * _data._y;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (rotateOrShearX) {\n\t\tfloat o = (_rotateOffset - _rotateLag * z) * mix, s, c, a;\n\t\tif (_data._shearX > 0) {\n\t\t\tfloat r = 0;\n\t\t\tif (_data._rotate > 0) {\n\t\t\t\tr = o * _data._rotate;\n\t\t\t\ts = MathUtil::sin(r);\n\t\t\t\tc = MathUtil::cos(r);\n\t\t\t\ta = bone->_b;\n\t\t\t\tbone->_b = c * a - s * bone->_d;\n\t\t\t\tbone->_d = s * a + c * bone->_d;\n\t\t\t}\n\t\t\tr += o * _data._shearX;\n\t\t\ts = MathUtil::sin(r);\n\t\t\tc = MathUtil::cos(r);\n\t\t\ta = bone->_a;\n\t\t\tbone->_a = c * a - s * bone->_c;\n\t\t\tbone->_c = s * a + c * bone->_c;\n\t\t} else {\n\t\t\to *= _data._rotate;\n\t\t\ts = MathUtil::sin(o);\n\t\t\tc = MathUtil::cos(o);\n\t\t\ta = bone->_a;\n\t\t\tbone->_a = c * a - s * bone->_c;\n\t\t\tbone->_c = s * a + c * bone->_c;\n\t\t\ta = bone->_b;\n\t\t\tbone->_b = c * a - s * bone->_d;\n\t\t\tbone->_d = s * a + c * bone->_d;\n\t\t}\n\t}\n\tif (scaleX) {\n\t\tfloat s = 1 + (_scaleOffset - _scaleLag * z) * mix * _data._scaleX;\n\t\tbone->_a *= s;\n\t\tbone->_c *= s;\n\t}\n\tif (physics != Physics_Pose) {\n\t\t_tx = l * bone->_a;\n\t\t_ty = l * bone->_c;\n\t}\n\tbone->modifyWorld(skeleton._update);\n}\n\nvoid PhysicsConstraint::sort(Skeleton &skeleton) {\n\tBone *bone = _bone->_bone;\n\tskeleton.sortBone(bone);\n\tskeleton._updateCache.add(this);\n\tskeleton.sortReset(bone->_children);\n\tskeleton.constrained(*bone);\n}\n\nbool PhysicsConstraint::isSourceActive() {\n\treturn _bone->_bone->isActive();\n}\n\nBonePose &PhysicsConstraint::getBone() {\n\treturn *_bone;\n}\n\nvoid PhysicsConstraint::setBone(BonePose &bone) {\n\t_bone = &bone;\n}\n```\n\nMuch of this porting work is mechanical and can be automated, like getters and setters, transferring documentation from Javadoc to docstrings, or ensuring the math matches. Some of the porting work requires a human brain, like translating Java generics to C++ templates, a task LLMs aren't very good at. What LLMs are good at is helping me double-check that I ported every line faithfully. This presented the perfect opportunity to apply my little workflow experiment to a real-world task on a real-world, largish codebase.\n\n## The \"Port Java to X\" Program\n\nTime to write our program. We're essentially encoding my manual workflow into a structured LLM program. The goal: go through each Java type that changed between two commits and port it to a target runtime (like C++) collaboratively with the user.\n\nInstead of me manually opening diffs, tracking dependencies, and porting line-by-line while my brain melts, we'll have the LLM handle the mechanical parts while I stay in control of the decisions that matter.\n\nThe final result of this program design can be found in the [spine-port repository](https://github.com/badlogic/spine-port). The program itself is stored in a file called [`port.md`](https://github.com/badlogic/spine-port/blob/main/port.md). When I want to start or continue porting, I start Claude Code in the spine-port directory and tell it to read the `port.md` file in full and execute the workflow. That starts the \"program\".\n\nWriting the `port.md` file was an iterative, collaborative process between me and Claude. In the following sections, we'll walk through each section of this program.\n\n### Initial Input and State\n\nEvery program needs input data and initial state to work with. The `port.md` file starts by defining the data structure that serves as both:\n\n````markdown\n# Spine Runtimes Porting Program\n\nCollaborative porting of changes between two commits in the Spine runtime\nreference implementation (Java) to a target runtime. Work tracked in\n`porting-plan.json` which has the following format:\n\n```json\n{\n  \"metadata\": {\n    \"prevBranch\": \"4.2\",\n    \"currentBranch\": \"4.3-beta\",\n    \"generated\": \"2024-06-30T...\",\n    \"spineRuntimesDir\": \"/absolute/path/to/spine-runtimes\",\n    \"targetRuntime\": \"spine-cpp\",\n    \"targetRuntimePath\": \"/absolute/path/to/spine-runtimes/spine-cpp/spine-cpp\",\n    \"targetRuntimeLanguage\": \"cpp\"\n  },\n  \"deletedFiles\": [\n    {\n      \"filePath\": \"/path/to/deleted/File.java\",\n      \"status\": \"pending\"\n    }\n  ],\n  \"portingOrder\": [\n    {\n      \"javaSourcePath\": \"/path/to/EnumFile.java\",\n      \"types\": [\n        {\n          \"name\": \"Animation\",\n          \"kind\": \"enum\",\n          \"startLine\": 45,\n          \"endLine\": 52,\n          \"isInner\": false,\n          \"portingState\": \"pending\",\n          \"candidateFiles\": [\"/path/to/spine-cpp/include/spine/Animation.h\", \"/path/to/spine-cpp/include/spine/Animation.cpp\"]\n        }\n      ]\n    }\n  ]\n}\n```\n````\n\nThis data structure is the central state that tracks our porting progress. The `porting-plan.json` file serves as both the initial input and the persistent state for our LLM program. Let's break down what each part means:\n\n**metadata**: Configuration for the porting session:\n\n- `prevBranch` and `currentBranch`: The git commits we're porting between\n- `spineRuntimesDir`: Where all the runtime implementations live\n- `targetRuntime`, `targetRuntimePath`, `targetRuntimeLanguage`: Which runtime we're porting to and where to find it\n\n**deletedFiles**: Java files that were removed and need corresponding deletions in the target runtime\n\n**portingOrder**: The heart of the plan. Each entry represents a Java file that changed and contains:\n\n- `javaSourcePath`: The full path to the Java source file\n- `types`: An array of all classes, interfaces, and enums in that file, each with:\n  - `name`: The type name (e.g., \"Animation\")\n  - `kind`: Whether it's a class, interface, or enum\n  - `startLine` and `endLine`: Where to find it in the Java file\n  - `isInner`: Whether it's an inner type\n  - `portingState`: Tracks progress: \"pending\" or \"done\"\n  - `candidateFiles`: Where this type likely exists in the target runtime\n\nThe `portingState` field is crucial: it's how the LLM tracks what's been done across sessions. When I stop and restart later, the program knows exactly where to pick up.\n\nBut how do we generate all this structured data? Before the LLM can start porting, we need to analyze what changed between the two versions and prepare the data in a format the LLM can efficiently query. I wrote [`generate-porting-plan.js`](https://github.com/badlogic/spine-port/blob/main/generate-porting-plan.js) to automate this preparation:\n\n```bash\n./generate-porting-plan.js 4.2 4.3-beta /path/to/spine-runtimes spine-cpp\n```\n\nThis script does several things:\n\n1. **Runs git diff** to find all Java files that changed between the two commits\n2. **Uses [`lsp-cli`](https://github.com/badlogic/lsp-cli)** to extract complete type information from both the Java reference implementation and the target runtime\n3. **Analyzes dependencies** to create a porting order (enums before interfaces before classes)\n4. **Finds candidate files** in the target runtime where each type likely exists\n5. **Outputs a structured JSON file** that the LLM can read from and write to efficiently via `jq`.\n\nWhy pre-generate all this data instead of having the LLM explore the codebase as it goes?\n\n**Determinism**: The same inputs always produce the same plan. LLM exploration might miss files, use wrong search patterns, or get lost in the directory structure. Pre-generation ensures complete, accurate, and reproducible results.\n\n**Context efficiency**: The pre-generation saves tokens and turns by not needing the LLM to perform all the steps that `generate-porting-plan.js` does: running git diff, analyzing dependencies, extracting type information, finding candidate files. That's a lot of tool calls and context that would otherwise be wasted.\n\n**Speed**: Generating the plan takes seconds. Having the LLM explore the codebase would take orders of magnitude longer.\n\nThis transforms an open-ended exploration problem into structured data processing. Instead of \"figure out what changed and how to port it,\" the LLM gets \"here's exactly what changed, where it lives, and where it should go.\"\n\nNo tokens and turns wasted. The context contains only the information we need.\n\n### The Function Library\n\nThe next section of `port.md` defines the tools available to our LLM program. Just like traditional programs import libraries, our LLM program needs tools to interact with the world.\n\n````markdown\n## Tools\n\n### VS Claude\nUse the vs-claude MCP server tools for opening files and diffs for the user\nduring porting.\n\n```javascript\n// Open multiple files at once (batch operations)\nmcp__vs-claude__open([\n  {\"type\": \"file\", \"path\": \"/abs/path/Animation.java\"},    // Java source\n  {\"type\": \"file\", \"path\": \"/abs/path/Animation.h\"},       // C++ header\n  {\"type\": \"file\", \"path\": \"/abs/path/Animation.cpp\"}      // C++ source\n]);\n\n// Open single file with line range\nmcp__vs-claude__open({\"type\": \"file\", \"path\": \"/abs/path/Animation.java\", \"startLine\": 100, \"endLine\": 120});\n\n// View git diff for a file\nmcp__vs-claude__open({\"type\": \"gitDiff\", \"path\": \"/abs/path/Animation.cpp\", \"from\": \"HEAD\", \"to\": \"working\"});\n```\n````\n\n**VS Code Integration** keeps the human in the loop. The LLM doesn't just modify files in the background; it opens them in my editor so I can see what's happening. This uses [vs-claude](https://marketplace.visualstudio.com/items?itemName=MarioZechner.vs-claude), an extension I wrote that implements the Model Context Protocol (MCP), turning VS Code into the LLM's display device.\n\n````markdown\n### Progress Tracking\n\nMonitor porting progress using these jq commands:\n\n```bash\n# Get overall progress percentage\njq -r '.portingOrder | map(.types[]) | \"\\(([.[] | select(.portingState == \"done\")] | length)) types ported out of \\(length) total (\\(([.[] | select(.portingState == \"done\")] | length) * 100 / length | floor)% complete)\"' porting-plan.json\n\n# Count types by state\njq -r '.portingOrder | map(.types[]) | group_by(.portingState) | map({state: .[0].portingState, count: length}) | sort_by(.state)' porting-plan.json\n\n# List all completed types\njq -r '.portingOrder | map(.types[] | select(.portingState == \"done\") | .name) | sort | join(\", \")' porting-plan.json\n\n# Find remaining types to port\njq -r '.portingOrder | map(.types[] | select(.portingState == \"pending\") | .name) | length' porting-plan.json\n```\n````\n\n**Progress Tracking** functions that I can ask the LLM to run at any time. When I want to know how far we've gotten, I tell the LLM to execute one of these queries. They're pre-written and tested, ensuring the LLM uses efficient patterns instead of crafting its own potentially buggy versions.\n\n````markdown\n### Compile Testing\n\nFor C++, test compile individual files during porting:\n\n```bash\n./compile-cpp.js /path/to/spine-cpp/spine-cpp/src/spine/Animation.cpp\n```\n\nFor other languages, we can not compile individual files and should not try to.\n````\n\n**Compile Testing** includes language-specific build commands. Notice the explicit warning about other languages. This prevents the LLM from wasting time trying to compile individual TypeScript or Haxe files, which would fail. It's defensive programming: explicitly state what not to do. Though with our non-deterministic computer, there's always a chance it'll try anyway.\n\n### The Main Workflow\n\nNow we get to the heart of our program: the actual porting logic with its loops, conditionals, and human checkpoints.\n\n````markdown\n## Workflow\n\nPort one type at a time. Ensure the target runtime implementation is functionally\nequivalent to the reference implementation. The APIs must match, bar idiomatic\ndifferences, including type names, field names, method names, enum names,\nparameter names and so on. Implementations of methods must match EXACTLY, bar\nidiomatic differences, such as differences in collection types.\n\nFollow these steps to port each type:\n\n### 1. Setup (One-time)\n\nDO NOT use the TodoWrite and TodoRead tools for this phase!\n\n1. Read metadata from porting-plan.json:\n   ```bash\n   jq '.metadata' porting-plan.json\n   ```\n   - If this fails, abort and tell user to run generate-porting-plan.js\n   - Store these values for later use:\n      - targetRuntime (e.g., \"spine-cpp\")\n      - targetRuntimePath (e.g., \"/path/to/spine-cpp/spine-cpp\")\n      - targetRuntimeLanguage (e.g., \"cpp\")\n````\n\nLike any traditional program, this starts with initialization. The `jq '.metadata'` command is essentially a function call - the program tells the LLM exactly which function to invoke rather than having it figure out the extraction logic itself, saving tokens and turns. Notice the conditional: \"If this fails, abort\" - defensive programming ensuring the required input exists. The \"Store these values\" instruction doesn't actually store anything; it tells the LLM what variable names to use when referencing these values extracted from the porting plan metadata later, similar to how variable assignments work. Storage happens implicitly in the LLM's context.\n\n````markdown\n2. In parallel\n   a. Check for conventions file:\n      - Read `${targetRuntime}-conventions.md` (from step 1) in full.\n      - If missing:\n         - Use Task agents in parallel to analyze targetRuntimePath (from step 1)\n         - Document all coding patterns and conventions:\n            * Class/interface/enum definition syntax\n            * Member variable naming (prefixes like m_, _, etc.)\n            * Method naming conventions (camelCase vs snake_case)\n            * Inheritance syntax\n            * File organization (single file vs header/implementation)\n            * Namespace/module/package structure\n            * Memory management (GC, manual, smart pointers)\n            * Error handling (exceptions, error codes, Result types)\n            * Documentation format (Doxygen, JSDoc, etc.)\n            * Type system specifics (generics, templates)\n            * Property/getter/setter patterns\n      - Agents MUST use ripgrep instead of grep!\n      - Save as ${TARGET}-conventions.md\n      - STOP and ask the user to review the generated conventions file\n\n   b. Read `porting-notes.md` in full\n      - If missing create with content:\n      ```markdown\n      # Porting Notes\n      ```\n````\n\nThe \"in parallel\" instruction tells the LLM to use multiple tools simultaneously rather than sequentially, speeding up execution.\n\nStep 2a first tries to read the conventions file using **`${targetRuntime}-conventions.md`** - this is like string interpolation, where the LLM inserts the value for the target runtime name that it read from the porting plan. That conventions file captures the coding style and architecture patterns of the target runtime. This documents everything from naming conventions to memory management approaches, ensuring the LLM ports code that fits seamlessly into the existing codebase.\n\nStep 2b sets up the **porting notes file** as a scratch pad for the porting job. This contains observations and edge cases discovered while porting - things like \"Java uses `pose` but C++ uses `_applied` in this context\" or \"don't port toString() methods.\" It's a running log so we don't forget important discoveries that affect later porting decisions.\n\nIf either file doesn't exist, we create it.\n\nWhy generate the conventions file as part of the workflow instead of pre-generating it like the porting plan? Pre-generating conventions would require either manual work (time-consuming) or using an LLM with manual review anyway. Generating it inside the program ensures I don't have too many moving parts to juggle, and all instructions aimed at an LLM are contained in a single location: the program.\n\nHere are the actual conventions and porting notes files:\n\n**Conventions (spine-cpp-conventions.md)**\n\n````markdown\n# Spine-CPP Coding Conventions\n\n## File Organization\n\n### Directory Structure\n- Headers: `include/spine/` - Public API headers\n- Implementation: `src/spine/` - Implementation files (.cpp)\n- One class per file pattern (Animation.h/Animation.cpp)\n\n### Header Guards\n```cpp\n#ifndef Spine_Animation_h\n#define Spine_Animation_h\n// content\n#endif\n```\n\n## Naming Conventions\n\n### Classes and Types\n- **Classes**: PascalCase (e.g., `Animation`, `BoneTimeline`, `SkeletonData`)\n- **Enums**: PascalCase with prefixed values\n  ```cpp\n  enum MixBlend {\n      MixBlend_Setup,\n      MixBlend_First,\n      MixBlend_Replace,\n      MixBlend_Add\n  };\n  ```\n\n### Variables\n- **Member variables**: Underscore prefix + camelCase\n  ```cpp\n  private:\n      float _duration;\n      Vector<Timeline*> _timelines;\n      bool _hasDrawOrder;\n  ```\n- **Parameters**: camelCase, often with \"inValue\" suffix for setters\n  ```cpp\n  void setDuration(float inValue) { _duration = inValue; }\n  ```\n- **Local variables**: camelCase (e.g., `timelineCount`, `lastTime`)\n\n### Methods\n- **Public methods**: camelCase\n  ```cpp\n  float getDuration() { return _duration; }\n  void apply(Skeleton& skeleton, float lastTime, float time, ...);\n  ```\n- **Getters/Setters**: get/set prefix pattern\n  ```cpp\n  const String& getName() { return _name; }\n  void setName(const String& inValue) { _name = inValue; }\n  ```\n\n## Class Structure\n\n### Base Class Pattern\nAll classes inherit from `SpineObject`:\n```cpp\nclass SP_API Animation : public SpineObject {\n    // ...\n};\n```\n\n### Access Modifiers Order\n1. Friend declarations\n2. Public members\n3. Protected members\n4. Private members\n\n### Friend Classes\nExtensive use for internal access:\n```cpp\nfriend class AnimationState;\nfriend class AnimationStateData;\n```\n\n## Memory Management\n\n### Manual Memory Management\n- No smart pointers\n- Explicit new/delete with custom allocators\n- SpineObject base class provides memory tracking\n\n### Object Pools\n```cpp\nclass SP_API Pool<T> : public SpineObject {\n    // Efficient object recycling\n};\n```\n\n### Vector Usage\nCustom Vector class instead of std::vector:\n```cpp\nVector<Timeline*> _timelines;\n```\n\n## Type System\n\n### Custom String Class\n```cpp\nclass SP_API String : public SpineObject {\n    // UTF-8 aware string implementation\n};\n```\n\n### Container Types\n- `Vector<T>` - Dynamic array\n- `HashMap<K,V>` - Hash map implementation\n- `Pool<T>` - Object pool\n\n### RTTI Usage\nRuntime type information with RTTI macros:\n```cpp\nRTTI_DECL\nRTTI_IMPL(Animation, SpineObject)\n```\n\n## Error Handling\n\n### No Exceptions\n- Uses assertions for debug builds\n- Return values indicate success/failure\n- assert() for internal invariants\n\n### Assertions\n```cpp\nassert(timelineCount == _timelines.size());\n```\n\n## Documentation\n\n### Triple-Slash Comments\n```cpp\n/// @brief Sets the duration of the animation.\n/// @param inValue The duration in seconds.\nvoid setDuration(float inValue);\n```\n\n### File Headers\n```cpp\n/******************************************************************************\n * Spine Runtimes License Agreement\n * ...\n *****************************************************************************/\n```\n\n## Platform Handling\n\n### DLL Export/Import\n```cpp\n#ifdef SPINE_CPP_DLL\n    #ifdef _MSC_VER\n        #define SP_API __declspec(dllexport)\n    #else\n        #define SP_API __attribute__((visibility(\"default\")))\n    #endif\n#else\n    #define SP_API\n#endif\n```\n\n### Platform-Specific Code\nMinimal, mostly in Extension.cpp\n\n## Include Style\n\n### System Headers\n```cpp\n#include <spine/SpineObject.h>\n#include <spine/Vector.h>\n```\n\n### Forward Declarations\nUsed extensively to minimize dependencies:\n```cpp\nnamespace spine {\n    class Skeleton;\n    class Event;\n}\n```\n\n## Special Patterns\n\n### Inline Getters/Setters\nSimple accessors defined in headers:\n```cpp\nfloat getDuration() { return _duration; }\n```\n\n### Const Correctness\n- Const methods where appropriate\n- Const references for parameters\n```cpp\nvoid apply(Skeleton& skeleton, float lastTime, float time,\n          Vector<Event*>* pEvents, float alpha,\n          MixBlend blend, MixDirection direction);\n```\n\n### No STL Usage\nCustom implementations for all containers, minimal stdlib dependency\n\n## Build System\n\n### CMake Integration\n- include directories specified in CMakeLists.txt\n- Separate static/shared library targets\n\n### Compiler Flags\n- C++11 standard\n- RTTI enabled\n- No exceptions (-fno-exceptions on some platforms)\n````\n\n**Porting Notes (porting-notes.md)**\n\n```markdown\n# Porting Notes\n\n## Java to C++ Porting Conventions\n\n### Direct Field Access vs Getters/Setters\n- C++ uses direct field access (e.g., `p._mixRotate`) where Java uses direct field access (e.g., `p.mixRotate`)\n- C++ uses underscore prefix for private fields but accesses them directly via friend classes\n- This is intentional - C++ classes are friends of each other to allow direct field access\n- Do NOT change direct field access to getter/setter calls in C++\n- Java `slot.pose.attachment` → C++ `_slot->_pose._attachment` (NOT `_slot->getPose()._attachment`)\n\n### Override Keywords\n- When fixing override warnings, add `virtual` and `override` keywords to methods in derived classes\n- Example: `PathConstraintData &getData();` → `virtual PathConstraintData &getData() override;`\n\n### Pose vs Applied Usage (CRITICAL)\n- C++ MUST use the same pose reference as Java\n- If Java uses `applied`, C++ must use `_applied`\n- If Java uses `pose`, C++ must use `_pose`\n- Never mix these up - they represent different states in the constraint system\n- Example:\n  - Java: `IkConstraintPose p = applied;` → C++: `IkConstraintPose &p = *_applied;`\n  - Java: `copy.pose.set(pose);` → C++: `copy->_pose.set(_pose);`\n\n### Constraint Pose Initialization\n- In Java, constraint constructors pass new pose instances to the parent constructor\n- In C++, `ConstraintGeneric` allocates poses as member fields (_pose and _constrained), not through constructor\n- Example: Java `super(data, new PhysicsConstraintPose(), new PhysicsConstraintPose())`\n- C++ just calls `ConstraintGeneric<PhysicsConstraint, PhysicsConstraintData, PhysicsConstraintPose>(data)`\n\n### Method Name Differences\n- Java `Posed.reset()` → C++ `PosedGeneric::resetConstrained()`\n- This naming difference must exist to avoid conflicts with other reset methods in C++\n- The Java code has a comment `// Port: resetConstrained` indicating this is intentional\n\n### Methods NOT Ported\n- `toString()` methods are not ported to C++\n- Methods that use `Matrix3` type in Java are not ported to C++\n\n### Parameter Conversions\n- Methods that take `Vector2` in Java are \"unrolled\" in C++ to use separate float parameters:\n  - Java: `worldToLocal(Vector2 world)`\n  - C++: `worldToLocal(float worldX, float worldY, float& outLocalX, float& outLocalY)`\n\n## Dark Color Handling Pattern\n- Java uses `@Null Color darkColor` (nullable reference)\n- C++ uses `Color _darkColor` with `bool _hasDarkColor` flag\n- This avoids manual memory management while maintaining the same functionality\n- The _hasDarkColor boolean indicates whether a dark color has been set\n- Example: SlotPose class uses this pattern\n\n## Event Class (Ported - 4.3-beta update)\n- Method names updated to match Java API:\n  - `getIntValue()` → `getInt()`\n  - `setIntValue()` → `setInt()`\n  - `getFloatValue()` → `getFloat()`\n  - `setFloatValue()` → `setFloat()`\n  - `getStringValue()` → `getString()`\n  - `setStringValue()` → `setString()`\n- Constructor now initializes values from EventData defaults to match Java behavior\n```\n\nAt this point, we have exactly what we need in the context and nothing else: `port.md` in full (the program), the metadata from the porting plan JSON, the target runtime conventions in full, and the porting notes in full.\n\nAnd now here's the main loop that does the actual porting:\n\n````markdown\n### 2. Port Types (Repeat for each)\n\n1. **Find next pending type:**\n   ```bash\n   # Get next pending type info with candidate files\n   jq -r '.portingOrder[] | {file: .javaSourcePath, types: .types[] | select(.portingState == \"pending\")} | \"\\(.file)|\\(.types.name)|\\(.types.kind)|\\(.types.startLine)|\\(.types.endLine)|\\(.types.candidateFiles | join(\",\"))\"' porting-plan.json | head -1\n   ```\n\n2. **Open files in VS Code via vs-claude (for user review):**\n   - Open Java file and Java file git diff (from prevBranch to currentBranch)\n   - If candidateFiles exists: open all candidate files\n\n3. **Confirm with user:**\n   - Ask: \"Port this type? (y/n)\"\n   - STOP and wait for confirmation.\n\n4. **Read source files:**\n   - Note: Read the files in parallel if possible\n   - Java: Read the ENTIRE file so it is fully in your context!\n   - Target: If exists, read the ENTIRE file(s) so they are fully in your context!\n   - For large files (>2000 lines): Read in chunks of 1000 lines\n   - Read parent types if needed (check extends/implements)\n   - Goal: Have complete files in context for accurate porting\n\n5. **Port the type:**\n   - Follow conventions from ${targetRuntime}-conventions.md\n   - If target file(s) don't exist, create them and open them for the user via vs-claude\n   - Port incrementally and always ultrathink:\n     * Base on the full content of the files in your context, identify differences and changes that need to be made.\n      * differences can be due to idiomatic differences, or real differences due to new or changed functionality in the reference\n        implementation. Ultrathink to discern which is which.\n     * If changes need to be made:\n       * Structure first (fields, method signatures)\n       * Then method implementations\n       * For C++: Run `./compile-cpp.js` after each method\n   - Use MultiEdit for all changes to one file\n   - Ensure 100% functional parity\n   - Add or update jsdoc, doxygen, etc. based on Javadocs.\n\n6. **Get user confirmation:**\n   - Open a diff of the files you modified, comparing HEAD to working.\n   - Give the user a summary of what you ported\n   - Ask: \"Mark as done? (y/n)\"\n   - If yes, update status:\n   ```bash\n   jq --arg file \"path/to/file.java\" --arg type \"TypeName\" \\\n      '(.portingOrder[] | select(.javaSourcePath == $file) | .types[] | select(.name == $type) | .portingState) = \"done\"' \\\n      porting-plan.json > tmp.json && mv tmp.json porting-plan.json\n   ```\n\n7. **Update porting-notes.md:**\n   - Add any new patterns or special cases discovered.\n\n8. **STOP and confirm:**\n   - Show what was ported. Ask: \"Continue to next type? (y/n)\"\n   - Only proceed after confirmation.\n````\n\n**Step 1** queries our state to find the next pending type using another precise `jq` function call. Here's what gets extracted from the porting plan and is now in the context:\n\n```json\n{\n  \"javaSourcePath\": \"/Users/badlogic/workspaces/spine-runtimes/spine-libgdx/spine-libgdx/src/com/esotericsoftware/spine/attachments/AtlasAttachmentLoader.java\",\n  \"types\": [\n    {\n      \"name\": \"AtlasAttachmentLoader\",\n      \"kind\": \"class\",\n      \"startLine\": 43,\n      \"endLine\": 101,\n      \"isInner\": false,\n      \"portingState\": \"pending\",\n      \"candidateFiles\": [\n        \"/Users/badlogic/workspaces/spine-runtimes/spine-cpp/spine-cpp/include/spine/AtlasAttachmentLoader.h\",\n        \"/Users/badlogic/workspaces/spine-runtimes/spine-cpp/spine-cpp/src/spine/AtlasAttachmentLoader.cpp\"\n      ]\n    }\n  ]\n}\n```\n\n**Steps 2-3** implement a human checkpoint: the LLM opens relevant files in VS Code and waits for confirmation before proceeding. This isn't just politeness; it's a safety mechanism ensuring I can abort if something looks wrong, or if I want to port a different type, or if I can immediately see that this type is complete and we should update the porting state and move on to the next type.\n\n**Step 4** is critical: \"Read the ENTIRE file so it is fully in your context!\" The emphasis prevents the LLM from being lazy and reading only parts of files, which would lead to incomplete ports. After this step, the context contains the complete source files needed for accurate porting.\n\n**Step 5** does the actual porting work. The \"ultrathink to discern\" instruction acknowledges that porting isn't just mechanical translation; it requires judgment about idiomatic differences versus actual functionality changes.\n\n**Steps 6-8** implement more human checkpoints and program state management. The LLM shows its work (via diffs), then updates the program's persistent state: step 6 writes to `porting-plan.json` to mark the type as done, and step 7 optionally updates `porting-notes.md` with new observations. This is where our program writes its state to disk - crucial for resumability. The state update in step 6 uses `jq` to surgically modify just the `portingState` field, ensuring we can resume exactly where we left off. Step 8 asks permission before the next loop iteration.\n\nThis is our complete LLM program: structured initialization, precise function calls, state management, human checkpoints, and deterministic loops. What started as an ad hoc conversation with an AI has become a reproducible, resumable workflow that tackles real-world porting at scale.\n\n## Program Execution\n\nLet's see this program in action:\n\nYour browser does not support the video tag.\n\nThis recording demonstrates the key insights of treating LLMs as computers:\n\n- **Follows the program**: Reads port.md and executes each step methodically\n- **Manages state**: Uses precise jq queries to read and update porting-plan.json\n- **Loads context strategically**: Reads only necessary files when needed\n- **Maintains resumability**: Updates persistent state after each completed type\n- **Implements human checkpoints**: Asks for confirmation before proceeding\n\nUnlike ad hoc prompting where the conversation meanders, this programmatic approach follows a deterministic workflow. The LLM becomes a reliable executor of structured instructions rather than an unpredictable chat partner.\n\nWhile the LLM cannot handle the full porting process autonomously due to challenges with complex type hierarchies and execution flows, this deterministic workflow dramatically simplifies my work compared to manual porting. The tedious mechanical tasks are now automated, freeing me to focus on the genuinely difficult problems that require human insight.\n\nWhat previously took me 2-3 weeks, now takes 2-3 days.\n\n## Future Work\n\nAs with everything, there's always plenty of room for improvements.\n\n**Testing and debugging**: The deterministic nature of these workflows opens possibilities for traditional software engineering practices. We could test that given specific inputs and state, our programs produce expected outputs. For debugging, we could instrument prompts to write state information at key points, creating execution traces that help identify where workflows diverge from expectations.\n\n**Sub-agent orchestration**: Current tools like Claude Code spawn sub-agents without observability or communication channels. To scale this programming model, we need structured ways to program sub-agents and monitor their execution. The main agent should define explicit workflows for sub-agents rather than generating them ad hoc, ensuring reliability through the same structured approach we use for the primary workflow.\n\n## Conclusion\n\nThis mental model has transformed how I work with established codebases using agentic coding tools. By treating LLMs as programmable computers rather than conversational partners, I've found a more reliable approach to complex software tasks. It's not a panacea and won't work for all problems, but it represents a step toward turning AI-assisted coding into an engineering discipline rather than a \"throwing shit at the wall\" approach.\n\nThis page respects your privacy by not using cookies or similar technologies and by not collecting any personally identifiable information.\n",
  "dateCreated": "2026-09-27T19:29:15.293681927+00:00",
  "date_created": "2025-06-02T00:00:00+00:00",
  "date_modified": "2025-06-02T00:00:00+00:00",
  "date_published": "2025-06-02T00:00:00+00:00",
  "description": "Treating LLMs as shitty general purpose computers we program with natural language. Because throwing shit at the wall wasn't working anymore.",
  "external_url": "https://mariozechner.at/posts/2025-06-02-prompts-are-code",
  "git": {
    "commit": "ebb0941c5c06a2ab2377342d607535262a3e969e",
    "path": "items/mariozechner-at/2025/06/2025-06-02-prompts-are-code-json-md-files-are-state.md",
    "permalink": "https://github.com/aymericbeaumet/aggr-instance/blob/ebb0941c5c06a2ab2377342d607535262a3e969e/items/mariozechner-at/2025/06/2025-06-02-prompts-are-code-json-md-files-are-state.md"
  },
  "id": "urn:aggr:item:396cd366034cae088eee257692416dede337eb2c",
  "isBasedOn": {
    "@id": "https://mariozechner.at/posts/2025-06-02-prompts-are-code"
  },
  "mainEntity": {
    "@id": "https://mariozechner.at/posts/2025-06-02-prompts-are-code",
    "@type": "CreativeWork",
    "archivedAt": {
      "@id": "https://aggr.aymericbeaumet.com/items/mariozechner-at/2025-06-02-prompts-are-code-json-md-files-are-state/#webpage"
    },
    "dateModified": "2025-06-02T00:00:00+00:00",
    "datePublished": "2025-06-02T00:00:00+00:00",
    "headline": "Prompts are code, .json/.md files are state",
    "timeRequired": "PT34M",
    "url": "https://mariozechner.at/posts/2025-06-02-prompts-are-code",
    "wordCount": 7643
  },
  "name": "Archived snapshot: Prompts are code, .json/.md files are state",
  "preview": null,
  "reading_minutes": 34,
  "replicated_at": null,
  "source": "mariozechner-at",
  "source_name": "{ Mario Zechner }",
  "summary": "Treating LLMs as shitty general purpose computers we program with natural language. Because throwing shit at the wall wasn't working anymore.",
  "tags": [],
  "temporalCoverage": "2026-09-27T19:29:15.293681927+00:00",
  "title": "Prompts are code, .json/.md files are state",
  "url": "https://aggr.aymericbeaumet.com/items/mariozechner-at/2025-06-02-prompts-are-code-json-md-files-are-state/",
  "word_count": 7643
}