summaryrefslogtreecommitdiff
path: root/ShedCalc/RenderView.swift
blob: a143e99445b6003db286ce7b11a301f41083be6c (plain) (blame)
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)
    }
}