diff options
Diffstat (limited to 'ShedCalc/RenderView.swift')
| -rw-r--r-- | ShedCalc/RenderView.swift | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/ShedCalc/RenderView.swift b/ShedCalc/RenderView.swift new file mode 100644 index 0000000..a143e99 --- /dev/null +++ b/ShedCalc/RenderView.swift @@ -0,0 +1,70 @@ +// +// RenderView.swift +// ShedCalc +// +// Created by Jacky Jack on 28/07/2026. +// +import SwiftUI +import RealityKit + +struct RenderView: View { + private let renderController = RenderController() + @Environment(ParamModel.self) var paramModel + @StateObject private var viewModel = RenderModel() + @State private var lastDrag: CGSize = .zero + + var body: some View { + VStack(spacing: 0) { + RealityView { content in + //add objects to scence + let scene = renderController.createScene(dimensions: [0,0,0], rotation: [0,0]) + content.add(scene) + + //add lights to scene + + //create camera view + let camera = renderController.createCamera() + content.add(camera) + + //draw beams + //let beam = renderController.createBeam2x4(position: [0,0,0], height: 2.4, lookFrom: camera.position, id: "beam0") + //content.addChild(beam) + + //draw all beams + let beamData = renderController.generateShedWall(position: [0,0,0], height: paramModel.height, widthNum: paramModel.widthBeamNum(), lengthNum: paramModel.lengthBeamNum(), spaceBeem: paramModel.beamSpace) + //content.add(beams) + let beams = renderController.createBeams(beamData) + beams.forEach { scene.addChild($0) } + + } update: { content in + // Update box geometry directly in the scene + if let scene = content.entities.first(where: { $0.name == "scene" }), + let box = scene.findEntity(named: "box") as? ModelEntity { + box.model?.mesh = .generateBox(size: paramModel.dimensions(), cornerRadius: 0.02) + } + // Update scene rotation directly + if let scene = content.entities.first(where: { $0.name == "scene" }) { + let xRot = simd_quatf(angle: viewModel.rotationX, axis: [1, 0, 0]) + let yRot = simd_quatf(angle: viewModel.rotationY, axis: [0, 1, 0]) + scene.transform.rotation = yRot * xRot + } + }.gesture( + DragGesture() + .onChanged { value in + let result = renderController.handleDragGesture( + value, + lastDrag: lastDrag, + currentRotation: [viewModel.rotationX, viewModel.rotationY] + ) + viewModel.rotationX = result.rotation.x + viewModel.rotationY = result.rotation.y + lastDrag = result.drag + } + .onEnded { _ in + lastDrag = .zero + } + ) + } + .frame(minWidth: 500, minHeight: 500) + } +} |
