test(fixtures): end-to-end mixed-feature fixture#113
Conversation
The one fixture that stacks every Blender-to-Godot feature in a single document: a skinned body polygon (per-bone weights + multi-face polygons), a sprite_frame mouth driven from the jaw bone, a slot with mixed mesh + sprite attachments, every element packed into one shared atlas, and one animation. Single-feature fixtures cannot catch the interactions between builders; this is the safety net before the queued schema-expressiveness wave churns the writer. Lands in the blender_to_godot bucket (new fixtures go there per its README). The golden is auto-discovered by run_tests.py for the test-blender re-export diff; test-godot gains a tests/fixtures copy plus assertions in test_importer.gd that walk the whole stack. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
📝 WalkthroughWalkthroughEnd-to-end mixed_feature fixture: Proscenio scene (skeleton, skinned body, sprite attachments, slots, animation), a generated atlas, a Blender builder that creates the .blend with drivers/animation, and extended Godot importer tests validating the built scene. ChangesMixed Feature Fixture Implementation
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
✨ Simplify code
Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
apps/godot/tests/fixtures/mixed_feature.proscenio (1)
6-63: mixed_feature flat bone hierarchy: likely supported; document the intent
Inapps/godot/tests/fixtures/mixed_feature.proscenio(lines 6–63),root,spine,head, andjawall have"parent": null(flat hierarchy). Other fixtures in the same folder (e.g.,slots_demo.proscenio,skinned_dummy.proscenio) also contain bones with"parent": null, so this pattern appears supported/used elsewhere—if it’s intentional for the test, adding a short comment explaining the rationale would prevent it from looking like accidental/integrity-broken data.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/godot/tests/fixtures/mixed_feature.proscenio` around lines 6 - 63, Add a short inline comment above the "bones" array in the mixed_feature.proscenio fixture stating that bones "root", "spine", "head", and "jaw" intentionally use a flat hierarchy with "parent": null (this mirrors other fixtures like slots_demo and skinned_dummy) so readers know this is deliberate, not corrupted data; update the fixture header or the bones block comment accordingly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@packages/fixtures/mixed_feature/build_blend.py`:
- Around line 283-315: The driver expression "var * 2 + 2" in
_install_mouth_driver maps jaw ROT_Y (radians) to invalid frame indices; change
the expression to normalize var from the jaw rotation range [-π/2, +π/2] into
integer frame indices [0, 3] by first adding π/2, dividing by π, then scaling by
3 (i.e., (var + π/2) / π * 3) and assign the same corrected expression to
mouth_obj.proscenio.driver_expression; keep the TRANSFORMS variable setup (var,
target.id=armature_obj, target.bone_target="jaw", target.transform_type="ROT_Y")
and ensure transform_space/rotation_mode remain as-is.
---
Nitpick comments:
In `@apps/godot/tests/fixtures/mixed_feature.proscenio`:
- Around line 6-63: Add a short inline comment above the "bones" array in the
mixed_feature.proscenio fixture stating that bones "root", "spine", "head", and
"jaw" intentionally use a flat hierarchy with "parent": null (this mirrors other
fixtures like slots_demo and skinned_dummy) so readers know this is deliberate,
not corrupted data; update the fixture header or the bones block comment
accordingly.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: ac0a3364-2150-411e-a9e2-61143ca21027
⛔ Files ignored due to path filters (5)
examples/generated/blender_to_godot/mixed_feature/atlas.pngis excluded by!**/*.png,!**/generated/**examples/generated/blender_to_godot/mixed_feature/godot/MixedFeature.gdis excluded by!**/generated/**examples/generated/blender_to_godot/mixed_feature/godot/MixedFeature.tscnis excluded by!**/generated/**examples/generated/blender_to_godot/mixed_feature/mixed_feature.blendis excluded by!**/generated/**,!**/*.blendexamples/generated/blender_to_godot/mixed_feature/mixed_feature.expected.prosceniois excluded by!**/generated/**
📒 Files selected for processing (5)
apps/godot/tests/fixtures/mixed_feature.proscenioapps/godot/tests/test_importer.gdpackages/fixtures/mixed_feature/build_blend.pypackages/fixtures/mixed_feature/draw_layers.pyspecs/035-project-health/TODO.md
📜 Review details
🧰 Additional context used
📓 Path-based instructions (1)
apps/godot/**/*.{gd,gdc,gdns,gdst,tscn,scn}
📄 CodeRabbit inference engine (AGENTS.md)
The Godot plugin runs only at editor import time. Generated scenes must use only built-in nodes (
Skeleton2D,Bone2D,Polygon2D,Sprite2D,Node2D,AnimationPlayer,AnimationLibrary). No GDExtension or native runtime
Files:
apps/godot/tests/test_importer.gd
🔇 Additional comments (8)
specs/035-project-health/TODO.md (1)
37-42: LGTM!apps/godot/tests/fixtures/mixed_feature.proscenio (2)
167-181: LGTM!Also applies to: 182-228
256-322: LGTM!packages/fixtures/mixed_feature/draw_layers.py (2)
49-71: LGTM!
62-64: No issue:border()supports(canvas, color[, thickness]).
packages/fixtures/_shared/_draw.pydefinesborder(canvas: Canvas, color: RGBA, thickness: int = 1), so the callborder(canvas, (0.20, 0.40, 0.25, 1.0))is consistent (uses defaultthickness).packages/fixtures/mixed_feature/build_blend.py (1)
53-71: LGTM!apps/godot/tests/test_importer.gd (2)
253-318: LGTM!
33-33: LGTM!Also applies to: 44-44
…ture The Drive-from-Bone expression `var * 2 + 2` overshoots [0, 3] by design; the writer's frame-driver bake clamps it to the grid. Document that the raw range is the point (the fixture exercises the clamp path), so it does not read as a bug. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Specs 027-035 shipped their near-term work (PRs #104-#113), verified against code rather than the stale checkboxes. Strip the resolved rows from BACKLOGS_SUMMARY, backlog.md, backlog-bugs-found.md, backlog-ui-feedback.md, and backlog-code-quality.md; the not-now rows already moved to DEFERRED/GATED/DROPPED.md, so they leave the backlogs too. The GUI-retest rows stay with needs-retest status (they ride the verification session). Fold in the two newer capture backlogs (IK authoring ergonomics, Photoshop performance) and cspell-ignore them like the other informal backlog files. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Their near-term work shipped (PRs #104-#113), verified against code. Mark them pruned in the index (content recoverable from git history per the index recipe), add the active 039 row for completeness, and delete the nine folders. The carved-out not-now work and locked calls already landed in DEFERRED/GATED/DROPPED.md and decisions.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Spec 035 (project health), follow-up PR: the end-to-end mixed-feature fixture - the sixth now-item, split out from the toolchain/shipping PR (#112) as agreed.
What
One fixture that stacks every Blender-to-Godot feature in a single document, so the golden catches interactions a single-feature fixture cannot:
root/spine, exporting per-boneweightsplus the per-facepolygonsindex arrays.head.mouth.proscenio.framereadingjawROT_Y; the animation bakes into abone_transformtrack plus the drivensprite_frametrack.face.slotholdsface_neutral(mesh / Polygon2D) andface_glow(sprite / Sprite2D), defaultface_neutral.atlas.png: meshes derive their region from UV bounds, the two sprite strips carry a manual region. One image keeps the top-levelatlasfield deterministic.mixed_anim.Layout
Lands in the
blender_to_godot/bucket - new fixtures go there per its README; the flat legacy fixtures move later. Builder scripts underpackages/fixtures/mixed_feature/(Pillowdraw_layers.py+ bpybuild_blend.py), golden +.blend+atlas.png+ Godot wrapper underexamples/generated/blender_to_godot/mixed_feature/.Wiring + verification
run_tests.py; the local re-export is byte-clean (8/8 fixtures, baked on Blender 5.1.1 to match CI).tests/fixtures/mixed_feature.prosceniocopy plus a_run_mixed_checks()block intest_importer.gdwalking the whole stack (skinned Polygon2D with 2 bones + 2 faces, 4-frame Sprite2D mouth, mixed slot attachments, themixed_animtracks, and the saved-scene no-script guard). Local run: 82 assertions, exit 0..prosceniovalidate againstproscenio.schema.json(thevalidate-schemajob).sync_fixtures.pypicks the fixture up (gitignored dev-project output).🤖 Generated with Claude Code
Summary by CodeRabbit
Fixtures
Tests
Tools
Documentation