Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 13 additions & 3 deletions .claude/skills/triage-ci/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ Examples: `/triage-ci` (3 turns, auto PR), `/triage-ci 5` (5 turns),

```
for turn in 1..max_turns:
1. Wait for CI
1. Wait for CI (background — user can work while waiting)
2. Check results — if green, report success and stop
3. Triage failures
4. Apply fixes, build and test locally
Expand All @@ -45,12 +45,19 @@ Get the latest run:
gh run list --branch <branch> --limit 1
```

If in progress, wait:
If the run is already completed, skip to step 2.

If still in progress, use `run_in_background: true` on the Bash tool to
watch without blocking the conversation:

```bash
gh run watch <run-id> --exit-status
```

Report: "Turn <N>/<max>: CI run <id> is in progress, waiting..."
This lets the user continue working. When the background task completes,
a notification arrives — pick up from step 2 at that point. Tell the
user: "CI run <id> is in progress. I'm watching in the background —
you'll be notified when it finishes. Feel free to keep working."

### 2. Check results

Expand Down Expand Up @@ -114,3 +121,6 @@ Then loop back to step 1 for the next turn.
- Always build and test locally before pushing a fix to avoid churn.
- INFRA failures that are purely transient (network blip, runner OOM)
can be retried without code changes: `gh run rerun <run-id> --failed`.
- Do NOT use `sleep` for polling — the hook blocks it. Use
`run_in_background: true` on `gh run watch` and wait for the
notification instead.
14 changes: 13 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -92,10 +92,18 @@ jobs:
restore-keys: |
${{ matrix.os }}-python-

# On Windows CI the workspace is on D: but ~/.conan2 defaults to C:.
# Conan's full_deploy deployer fails computing relative paths across
# drives. Put CONAN_HOME on the same drive as the workspace.
- name: Set Conan home (Windows)
if: runner.os == 'Windows'
shell: pwsh
run: echo "CONAN_HOME=D:/.conan2" >> $env:GITHUB_ENV

- name: Cache Conan packages
uses: actions/cache@v4
with:
path: ~/.conan2
path: ${{ runner.os == 'Windows' && 'D:/.conan2' || '~/.conan2' }}
key: ${{ matrix.platform }}-conan-${{ hashFiles('conanfile.py', matrix.lock_file) }}
restore-keys: |
${{ matrix.platform }}-conan-${{ hashFiles('conanfile.py') }}
Expand All @@ -112,6 +120,8 @@ jobs:

- name: Build project
run: ${{ matrix.repo }} build --platform ${{ matrix.platform }} --build-type ${{ matrix.build_type }}
env:
PTSTUDIO_GPU_BACKEND: ${{ matrix.platform == 'windows-x64' && 'D3D12' || '' }}

Comment on lines +123 to 125

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify how PTSTUDIO_GPU_BACKEND is consumed and whether empty means "unset" or "invalid override".

# 1) Find all readers/writers of the variable.
rg -n -C3 'PTSTUDIO_GPU_BACKEND'

# 2) Inspect backend selection logic for presence-vs-value checks.
rg -n -C4 'GPU_BACKEND|gpu backend|backend.*env|getenv|std::getenv|os\.environ|std::optional|FromString|parse.*backend'

# Expected:
# - Safe: logic ignores empty values (treats as unset/default).
# - Risky: logic branches only on variable presence and parses empty string.

Repository: dw218192/PTStudio

Length of output: 41746


🏁 Script executed:

# Find and examine the workflow file at the specified lines
fd -t f 'ci.yml' .github/workflows/

Repository: dw218192/PTStudio

Length of output: 85


🏁 Script executed:

# Examine the workflow file at the specified lines
head -200 .github/workflows/ci.yml | tail -100

Repository: dw218192/PTStudio

Length of output: 3448


🏁 Script executed:

# Get exact line numbers and full context of lines 115-117 and 189-190
sed -n '110,120p' .github/workflows/ci.yml | cat -n
echo "---"
sed -n '185,195p' .github/workflows/ci.yml | cat -n

Repository: dw218192/PTStudio

Length of output: 1049


Refactoring suggested: split conditional env var setup into platform-specific steps.

The current pattern PTSTUDIO_GPU_BACKEND: ${{ matrix.platform == 'windows-x64' && 'D3D12' || '' }} is functionally safe—the code at core/src/rendering/webgpu/device.cpp:156 uses std::getenv() and compares against known values, logging a warning for unknown/empty strings and falling back to default auto-selection. However, this generates a spurious warning log on every non-Windows run.

Refactoring into separate steps (Windows-only with if: matrix.platform == 'windows-x64') avoids the unnecessary warning and makes the intent clearer. Apply to both Build project and Run tests steps.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In @.github/workflows/ci.yml around lines 115 - 117, Split the conditional
PTSTUDIO_GPU_BACKEND env assignment into platform-specific steps to avoid
emitting a spurious warning on non-Windows runs: remove the inline ternary-style
assignment PTSTUDIO_GPU_BACKEND: ${{ matrix.platform == 'windows-x64' && 'D3D12'
|| '' }} and instead create/modify the two workflow steps named "Build project"
and "Run tests" so each has a Windows-only variant guarded by if:
matrix.platform == 'windows-x64' that sets PTSTUDIO_GPU_BACKEND: D3D12, and
leave the non-Windows variants without that env var; ensure the steps still use
the same job matrix and runner so behavior is unchanged for Windows while
non-Windows runs no longer set an empty/unknown PTSTUDIO_GPU_BACKEND.

- name: Upload USDZ scenes
if: matrix.platform == 'windows-x64'
Expand Down Expand Up @@ -184,6 +194,8 @@ jobs:

- name: Run tests
run: ${{ matrix.repo }} test --platform ${{ matrix.platform }} --build-type ${{ matrix.build_type }} --from-package
env:
PTSTUDIO_GPU_BACKEND: ${{ matrix.platform == 'windows-x64' && 'D3D12' || '' }}

- name: Upload test results
if: always()
Expand Down
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -141,6 +141,7 @@ endif()
find_package(imgui REQUIRED)
find_package(imguizmo REQUIRED)
find_package(stb REQUIRED)
find_package(OpenEXR REQUIRED)


# Emscripten configuration - centralized flags for all targets
Expand Down
4 changes: 4 additions & 0 deletions allowlist_extra.toml
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,10 @@ patterns = [
'git\s+stash\b', # stash / stash pop
]

[[allow]]
name = "image_convert"
commands = ["ffmpeg"]
Comment on lines +18 to +20

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Description: Search for ffmpeg usage in the codebase to understand necessity and scope.

# Search for ffmpeg references in code and scripts
echo "=== Searching for ffmpeg in code files ==="
rg -n -C3 'ffmpeg' --type-add 'code:*.{cpp,h,py,js,ts,sh,bat,ps1}' --type code

echo -e "\n=== Searching for ffmpeg in test files ==="
rg -n -C3 'ffmpeg' --glob '*test*'

echo -e "\n=== Searching for image conversion or visual regression related code ==="
rg -n -C3 'image.convert|visual.regression|regression.test' --type-add 'code:*.{cpp,h,py,js,ts,sh,bat}' --type code

Repository: dw218192/PTStudio

Length of output: 221


🏁 Script executed:

# Verify the file exists and show its full content
cat -n allowlist_extra.toml

Repository: dw218192/PTStudio

Length of output: 1091


🏁 Script executed:

# Search more broadly for any ffmpeg references (including comments and configs)
rg -n 'ffmpeg' -i

Repository: dw218192/PTStudio

Length of output: 106


🏁 Script executed:

# Look for visual regression, EXR, image conversion infrastructure more broadly
rg -n '(visual|regression|EXR|openexr|image|texture|convert)' -i --max-count=20 | head -100

Repository: dw218192/PTStudio

Length of output: 9811


🏁 Script executed:

# Check git log or PR description for context about ffmpeg
git log --oneline --all --grep='ffmpeg|image|visual' -i 2>/dev/null | head -20

Repository: dw218192/PTStudio

Length of output: 43


Remove unrestricted ffmpeg allowlist entry—no corresponding code usage found.

The allowlist permits execution of any ffmpeg command, but a comprehensive search of the codebase reveals no calls to ffmpeg anywhere. This presents multiple concerns:

  1. Security risk: Allowing unrestricted access to ffmpeg (a powerful tool with known vulnerabilities) without corresponding code usage increases attack surface unnecessarily.

  2. Lack of justification: The PR objectives mention EXR texture support and visual regression testing, but the codebase uses stb_image_write for image output and texture APIs for handling—not CLI-based ffmpeg.

  3. Inconsistent patterns: Unlike safe_git_rewrite and framework_contrib which restrict commands with patterns, this entry permits all operations without scope constraints.

  4. Missing usage: No code currently calls ffmpeg, raising questions about whether this allowlist entry was added prematurely or by mistake.

Recommendation: Remove this allowlist entry unless there is immediate, documented need for ffmpeg with specific operations. If future use is planned, add it with restrictive patterns (specific input/output formats, read-only constraints) rather than unrestricted access.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@allowlist_extra.toml` around lines 18 - 20, The allowlist contains an
unrestricted entry named "image_convert" that permits running "ffmpeg" but no
code references it; remove this unnecessary attack surface by deleting the
[[allow]] block with name "image_convert" and commands ["ffmpeg"] from
allowlist_extra.toml, or if ffmpeg is actually required in future, replace the
open command entry with a scoped allow that adds a restrictive "patterns" array
limiting executable arguments and file paths (e.g., explicit input/output file
patterns) instead of permitting all ffmpeg usage.


[[allow]]
name = "framework_contrib"
override_deny = true
Expand Down
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
22 changes: 17 additions & 5 deletions assets/scenes/area_light_test.usda
Original file line number Diff line number Diff line change
Expand Up @@ -105,19 +105,31 @@ def Xform "Root"
uniform token[] xformOpOrder = ["xformOp:transform"]
}

def Capsule "Capsule"
def Camera "Camera_1"
{
matrix4d xformOp:transform = ( (1.4499999284744263, 0, 0, 0), (0, 1.4499999284744263, 0, 0), (0, 0, 1.4499999284744263, 0), (0.01164737343788147, 0.6844912767410278, 2.273528575897217, 1) )
float2 clippingRange = (0.1, 1000)
float focalLength = 20.78461
float horizontalAperture = 36
float verticalAperture = 24
matrix4d xformOp:transform = ( (-0.9802578687667847, -0, -0.19772298634052277, 0), (-0.08352162688970566, 0.9064013361930847, 0.41407790780067444, 0), (0.1792164146900177, 0.4224173128604889, -0.888507068157196, -0), (0.3710533082485199, 2.613258123397827, -1.7912518978118896, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}

def Camera "Camera_1"
def "treasure_chest_2k" (
prepend references = @../models/treasure_chest/treasure_chest_2k.usdc@
)
{
float2 clippingRange = (0.1, 1000)
matrix4d xformOp:transform = ( (2, 0, 0, 0), (0, -8.742277657347586e-8, -2, 0), (0, 2, -8.742277657347586e-8, 0), (-1.5735167264938354, -0.000006509742888738401, 1.4944231510162354, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}

def Camera "Camera_2"
{
float2 clippingRange = (0.01, 2000)
float focalLength = 20.78461
float horizontalAperture = 36
float verticalAperture = 24
matrix4d xformOp:transform = ( (-0.9802578687667847, -0, -0.19772298634052277, 0), (-0.08352162688970566, 0.9064013361930847, 0.41407790780067444, 0), (0.1792164146900177, 0.4224173128604889, -0.888507068157196, -0), (0.3710533082485199, 2.613258123397827, -1.7912518978118896, 1) )
matrix4d xformOp:transform = ( (-0.8309236764907837, -0, 0.5563863515853882, -0), (0.2934468388557434, 0.8496073484420776, 0.4382420778274536, 0), (-0.4727099537849426, 0.5274155139923096, -0.705958902835846, 0), (-4.250411033630371, 3.229863405227661, -0.32273444533348083, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ def Scope "Geom"
}

def "Camera_01_2k" (
prepend references = @./Camera_01_2k.usdc@
prepend references = @../models/camera/Camera_01_2k.usdc@
Comment thread
coderabbitai[bot] marked this conversation as resolved.
)
{
double xformOp:rotateX:unitsResolve = -90
Expand Down Expand Up @@ -109,8 +109,8 @@ def Xform "Root"
{
def DomeLight "DomeLight"
{
float inputs:intensity = 1
asset inputs:texture:file = @../../hdr/bryanston_park_sunrise_2k.hdr@
float inputs:intensity = 2
asset inputs:texture:file = @../hdr/bryanston_park_sunrise_2k.hdr@
}

def Camera "Camera"
Expand Down
73 changes: 42 additions & 31 deletions assets/scenes/shadow_test.usda
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
#usda 1.0
(
defaultPrim = "Root"
metersPerUnit = 1.0
metersPerUnit = 1
upAxis = "Y"
)

Expand All @@ -12,6 +12,7 @@ def Xform "Root"
def Material "Gray"
{
token outputs:surface.connect = </Root/Materials/Gray/Shader.outputs:surface>

def Shader "Shader"
{
uniform token info:id = "UsdPreviewSurface"
Expand All @@ -25,6 +26,7 @@ def Xform "Root"
def Material "Red"
{
token outputs:surface.connect = </Root/Materials/Red/Shader.outputs:surface>

def Shader "Shader"
{
uniform token info:id = "UsdPreviewSurface"
Expand All @@ -38,6 +40,7 @@ def Xform "Root"
def Material "Blue"
{
token outputs:surface.connect = </Root/Materials/Blue/Shader.outputs:surface>

def Shader "Shader"
{
uniform token info:id = "UsdPreviewSurface"
Expand All @@ -51,6 +54,7 @@ def Xform "Root"
def Material "Green"
{
token outputs:surface.connect = </Root/Materials/Green/Shader.outputs:surface>

def Shader "Shader"
{
uniform token info:id = "UsdPreviewSurface"
Expand All @@ -62,95 +66,102 @@ def Xform "Root"
}
}

# Ground plane: large quad at Y=0, extends -5 to 5 on XZ
def Mesh "Ground" (
prepend apiSchemas = ["MaterialBindingAPI"]
)
{
token orientation = "rightHanded"
point3f[] points = [(-5, 0, -5), (5, 0, -5), (5, 0, 5), (-5, 0, 5)]
int[] faceVertexCounts = [4]
int[] faceVertexIndices = [0, 3, 2, 1]
rel material:binding = </Root/Materials/Gray>
normal3f[] normals = [(0, 1, 0), (0, 1, 0), (0, 1, 0), (0, 1, 0)]
token orientation = "rightHanded"
point3f[] points = [(-5, 0, -5), (5, 0, -5), (5, 0, 5), (-5, 0, 5)]
token subdivisionScheme = "none"
rel material:binding = </Root/Materials/Gray>
}

# Cube at (0, 0.5, 0), size 1 — sits on ground plane
def Cube "Cube" (
prepend apiSchemas = ["MaterialBindingAPI"]
)
{
rel material:binding = </Root/Materials/Red>
double size = 1
double3 xformOp:translate = (0, 0.5, 0)
uniform token[] xformOpOrder = ["xformOp:translate"]
rel material:binding = </Root/Materials/Red>
}

# Sphere at (-2, 1.0, 1), radius 0.5
def Sphere "Sphere" (
prepend apiSchemas = ["MaterialBindingAPI"]
)
{
rel material:binding = </Root/Materials/Blue>
double radius = 0.5
double3 xformOp:translate = (-2, 1.0, 1)
double3 xformOp:translate = (-2, 1, 1)
uniform token[] xformOpOrder = ["xformOp:translate"]
rel material:binding = </Root/Materials/Blue>
}

# Cylinder at (1.5, 0.75, -1), height 1.5 — sits on ground plane
def Cylinder "Cylinder" (
prepend apiSchemas = ["MaterialBindingAPI"]
)
{
token axis = "Y"
double height = 1.5
rel material:binding = </Root/Materials/Green>
double radius = 0.4
double3 xformOp:translate = (1.5, 0.75, -1)
uniform token[] xformOpOrder = ["xformOp:translate"]
rel material:binding = </Root/Materials/Green>
}

# Distant light 1 (main sun): direction ~(0.5, -1.0, 0.3), intensity 3.0, warm white
def DistantLight "MainSun"
{
float inputs:intensity = 3.0
color3f inputs:color = (1, 0.95, 0.85)
float inputs:angle = 0.53
float3 xformOp:rotateXYZ = (-60, -120, 0)
uniform token[] xformOpOrder = ["xformOp:rotateXYZ"]
color3f inputs:color = (1, 0.95, 0.85)
float inputs:intensity = 50000
matrix4d xformOp:transform = ( (-0.5, 0, 0.8660253882408142, 0), (0.75, 0.5, 0.4330126941204071, 0), (-0.4330126941204071, 0.8660253882408142, -0.25, 0), (0, 5.531754016876221, 0, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
Comment on lines +119 to +120

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Don't orphan the existing light rotation ops.

xformOpOrder now applies only xformOp:transform, so the remaining xformOp:rotateXYZ values on MainSun and FillSun are inert and easy to edit by mistake in tooling.

Also applies to: 130-131

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@assets/scenes/shadow_test.usda` around lines 120 - 121, The xformOpOrder
currently lists only "xformOp:transform", which leaves existing
xformOp:rotateXYZ entries on MainSun and FillSun orphaned and inert; update the
xformOpOrder to include the rotate ops in the correct order (e.g., include
"xformOp:rotateXYZ" entries alongside "xformOp:transform") for both MainSun and
FillSun so the rotate values are applied (also check and fix the same
xformOpOrder at the other occurrence noted around lines 130-131).

}

# Distant light 2 (secondary): direction ~(-0.3, -1.0, -0.5), intensity 1.5, cool white
def DistantLight "FillSun"
{
float inputs:intensity = 1.5
color3f inputs:color = (0.85, 0.9, 1)
float inputs:angle = 0.53
float3 xformOp:rotateXYZ = (-60, 30, 0)
uniform token[] xformOpOrder = ["xformOp:rotateXYZ"]
color3f inputs:color = (0.85, 0.9, 1)
float inputs:intensity = 50000
matrix4d xformOp:transform = ( (0.8660253882408142, 0, -0.5, 0), (-0.4330126941204071, 0.5, -0.75, 0), (0.25, 0.8660253882408142, 0.4330126941204071, 0), (0, 5.175130367279053, 0, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}

# Dome light: low intensity ambient fill
def DomeLight "AmbientFill"
{
float inputs:intensity = 0.3
color3f inputs:color = (0.9, 0.92, 1)
float inputs:intensity = 0.3
matrix4d xformOp:transform = ( (1, 0, 0, 0), (0, 1, 0, 0), (0, 0, 1, 0), (0, 0, 0, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}

# Camera at (3, 4, 5) looking at origin
def Camera "ShadowCam"
{
float2 clippingRange = (0.1, 100)
float focalLength = 35
float horizontalAperture = 36
float verticalAperture = 24
matrix4d xformOp:transform = (
(0.85749, 0, -0.51450, 0),
(-0.29104, 0.82440, -0.48507, 0),
(0.42426, 0.56569, 0.70711, 0),
(3, 4, 5, 1)
)
matrix4d xformOp:transform = ( (0.85749, 0, -0.5145, 0), (-0.29104, 0.8244, -0.48507, 0), (0.42426, 0.56569, 0.70711, 0), (3, 4, 5, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}

def DistantLight "DistantLight"
{
float inputs:intensity = 50000
matrix4d xformOp:transform = ( (0.33341044187545776, 0, -0.9427817463874817, 0), (-0.7747346758842468, 0.5698425769805908, -0.27398115396499634, 0), (0.5372380614280701, 0.821753978729248, 0.1899915188550949, 0), (1.6580281257629395, 5.08758020401001, 0.15053600072860718, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}

def Camera "Camera"
{
float2 clippingRange = (0.01, 2000)
float focalLength = 20.78461
float horizontalAperture = 36
float verticalAperture = 24
matrix4d xformOp:transform = ( (0.9927712082862854, 3.725290298461914e-9, -0.12002246081829071, -0), (-0.08421951532363892, 0.7124745845794678, -0.6966254711151123, 0), (0.08551295101642609, 0.7016978859901428, 0.707324206829071, -0), (1.014491081237793, 8.324660301208496, 8.391408920288086, 1) )
uniform token[] xformOpOrder = ["xformOp:transform"]
}
}

4 changes: 4 additions & 0 deletions conan_emscripten.lock
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
{
"version": "0.5",
"requires": [
"zlib/1.3.1#cac0f6daea041b0ccf42934163defb20%1765284699.337",
"stb/cci.20240531#ede183dce303916dab0c1b835df3926a%1720366012.336",
"spdlog/1.14.1#4fd40d9cbc1978247443a10d2ace58fd%1731353169.75",
"openusd/25.11-dev",
"opensubdiv/3.6.0#0287f44ccdd174ca2bb3b98fdcbbf552%1763044571.374",
"openexr/3.3.8#3278a59de22330866a49357a80d94243%1772476671.923",
"onetbb/2021.12.0",
"nlohmann_json/3.12.0#2d634ab0ec8d9f56353e5ccef6d6612c%1744735883.94",
"libdeflate/1.25#49fcd3fe6c130c2ec5a01cabb0481ded%1761981110.678",
"imguizmo/1.92",
"imgui/1.92.5-docking#1440d1dcd6fad7c4d7c11efb51c62d5b%1763801320.776",
"imath/3.2.1#47a001e9196b8d377c839c4725a99772%1756476362.494",
"glm/cci.20230113#c9c89bea128786a245028f0cb4c1936d%1700512110.519",
"fmt/10.2.1#658771bb858b77f380be2ebb22c338e9%1735899167.615",
"doctest/2.4.12#eb9fb352fb2fdfc8abb17ec270945165%1749889324.069",
Expand Down
3 changes: 3 additions & 0 deletions conan_glfw.lock
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,13 @@
"openusd/25.11-dev",
"opensubdiv/3.6.0#0287f44ccdd174ca2bb3b98fdcbbf552%1763044571.374",
"opengl/system#7c02ea6ef926fd04844af53622a30541%1730805494.23",
"openexr/3.3.8#3278a59de22330866a49357a80d94243%1772476671.923",
"onetbb/2021.12.0",
"nlohmann_json/3.12.0#2d634ab0ec8d9f56353e5ccef6d6612c%1744735883.94",
"libdeflate/1.25#49fcd3fe6c130c2ec5a01cabb0481ded%1761981110.678",
"imguizmo/1.92",
"imgui/1.92.5-docking#1440d1dcd6fad7c4d7c11efb51c62d5b%1763801320.776",
"imath/3.2.1#47a001e9196b8d377c839c4725a99772%1756476362.494",
"hwloc/2.12.2#81314118300a8ee69b352f2d1b21d9d7%1769010591.083",
"glm/cci.20230113#c9c89bea128786a245028f0cb4c1936d%1700512110.519",
"glfw/3.4#41cc24c744dc4c80571f5dd10dcd9cda%1732635892.515",
Expand Down
4 changes: 4 additions & 0 deletions conanfile.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,10 @@ def requirements(self):
self.requires("imgui/1.92.5-docking")
self.requires("imguizmo/1.92")
self.requires("stb/[>=0]")
# OpenEXR <3.4: 3.4+ adds openjph (JPEG2000) which drags in libtiff,
# libjpeg, libdeflate, xz_utils — unnecessary deps that also break
# Emscripten cross-compile and invalidate Conan binary caches on CI.
self.requires("openexr/[>=3.1 <3.4]")

def build_requirements(self):
if self.settings.os == "Emscripten":
Expand Down
5 changes: 4 additions & 1 deletion config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ usdz:
output: "assets/scenes/shadow_test.usdz"
- input: "assets/scenes/test_cube.usda"
output: "assets/scenes/test_cube.usdz"
- input: "assets/scenes/camera/camera.usda"
- input: "assets/scenes/camera.usda"
output: "assets/scenes/camera.usdz"
- input: "assets/scenes/kitchen/Kitchen_set.usd"
output: "assets/scenes/kitchen_set.usdz"
Expand Down Expand Up @@ -138,6 +138,8 @@ slangc:
- input: "editor/shaders/tonemapping.slang"
output: "editor/generated/shaders/tonemapping.wgsl"
reflect: true
- input: "editor/shaders/luminance.slang"
output: "editor/generated/shaders/luminance.wgsl"
- input: "renderers/pathtracer/pathtracer.slang"
output: "editor/generated/shaders/pathtracer.wgsl"
- input: "renderers/pathtracer/pt_blit.slang"
Expand Down Expand Up @@ -210,6 +212,7 @@ embed:
- "editor/generated/shaders/gizmo.wgsl"
- "editor/generated/shaders/lobe.wgsl"
- "editor/generated/shaders/tonemapping.wgsl"
- "editor/generated/shaders/luminance.wgsl"
- "editor/generated/shaders/pathtracer.wgsl"
- "editor/generated/shaders/pt_blit.wgsl"
- "editor/icons/*.*"
Expand Down
Loading
Loading