1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
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)
}
}
|