feat(avlivebody): render settings state object

Add RenderSettings ObservableObject with Published defaults for
layer visibility, mesh material, video opacity, light intensities,
camera FOV, and panel toggle. Add RenderSettingsTests asserting
all eleven defaults via TDD red-green cycle.
This commit is contained in:
L'électron rare
2026-06-26 12:13:55 +02:00
parent b918eeea16
commit e7b107a96e
2 changed files with 52 additions and 0 deletions
@@ -0,0 +1,31 @@
// avlivebody-mac/Sources/AVLiveBody/RenderSettings.swift
import SwiftUI
/// Live visual settings for AVLiveBody. ContentView observes this and
/// pushes changes to SceneController. Defaults chosen so the scene is
/// lit and everything visible out of the box.
@MainActor
final class RenderSettings: ObservableObject {
// Layer visibility
@Published var showSkeleton: Bool = true
@Published var showMesh: Bool = true
@Published var showVideo: Bool = true
// Mesh material
@Published var meshMetallic: Bool = false
@Published var meshRoughness: Double = 0.6
// Video quad
@Published var videoOpacity: Double = 1.0
// Lights (RealityKit DirectionalLight intensities)
@Published var keyIntensity: Double = 4000
@Published var fillIntensity: Double = 1500
@Published var rimIntensity: Double = 2000
// Camera
@Published var fieldOfView: Double = 55
// Panel visibility
@Published var showPanel: Bool = false
}
@@ -0,0 +1,21 @@
// avlivebody-mac/Tests/AVLiveBodyTests/RenderSettingsTests.swift
import XCTest
@testable import AVLiveBody
@MainActor
final class RenderSettingsTests: XCTestCase {
func testDefaults() {
let s = RenderSettings()
XCTAssertTrue(s.showSkeleton)
XCTAssertTrue(s.showMesh)
XCTAssertTrue(s.showVideo)
XCTAssertFalse(s.meshMetallic)
XCTAssertEqual(s.meshRoughness, 0.6, accuracy: 1e-9)
XCTAssertEqual(s.videoOpacity, 1.0, accuracy: 1e-9)
XCTAssertEqual(s.keyIntensity, 4000, accuracy: 1e-9)
XCTAssertEqual(s.fillIntensity, 1500, accuracy: 1e-9)
XCTAssertEqual(s.rimIntensity, 2000, accuracy: 1e-9)
XCTAssertEqual(s.fieldOfView, 55, accuracy: 1e-9)
XCTAssertFalse(s.showPanel)
}
}