Skip to content

Instantly share code, notes, and snippets.

@Matt54
Created August 30, 2024 03:07
Show Gist options
  • Save Matt54/e0eea8489925a108f9a0dc0e9f90532b to your computer and use it in GitHub Desktop.
Save Matt54/e0eea8489925a108f9a0dc0e9f90532b to your computer and use it in GitHub Desktop.
RealityView for visualizing the different properties of PhysicallyBasedMaterial
import RealityKit
import SwiftUI
struct PhysicallyBasedMaterialPickerView: View {
@State var entity: ModelEntity?
@State var materialParameters: PhysicallyBasedMaterialParameters = PhysicallyBasedMaterialParameters()
func generateEntity() -> ModelEntity {
let meshResource = MeshResource.generateSphere(radius: 0.2)
return ModelEntity(mesh: meshResource, materials: [getMaterial()])
}
func getMaterial() -> RealityKit.Material {
var material = PhysicallyBasedMaterial()
material.metallic = .init(floatLiteral: materialParameters.metallic)
material.roughness = .init(floatLiteral: materialParameters.roughness)
material.baseColor.tint = materialParameters.baseColor
material.faceCulling = .none
material.blending = .transparent(opacity: 1.0)
material.clearcoat = .init(floatLiteral: materialParameters.clearcoat)
material.clearcoatRoughness = .init(floatLiteral: materialParameters.clearcoatRoughness)
material.anisotropyLevel = .init(floatLiteral: materialParameters.anisotropyLevel)
material.anisotropyAngle = .init(floatLiteral: materialParameters.anisotropyAngle)
material.emissiveColor = .init(color: materialParameters.emissiveColor)
material.emissiveIntensity = materialParameters.emissiveIntensity
return material
}
var body: some View {
RealityView { content in
let entity = generateEntity()
content.add(entity)
entity.position.z = -0.4
self.entity = entity
}
.ornament(attachmentAnchor: .scene(.bottomFront)) {
SettingsView(materialParameters: $materialParameters)
}
.onChange(of: materialParameters) { oldValue, newValue in
entity?.model?.materials = [getMaterial()]
}
}
struct PhysicallyBasedMaterialParameters: Equatable {
var baseColor: UIColor = .magenta
var metallic: Float = 1.0
var roughness: Float = 0.1
var clearcoat: Float = 0.0
var clearcoatRoughness: Float = 0.5
var anisotropyLevel: Float = 0.0
var anisotropyAngle: Float = 0.25
var emissiveColor: UIColor = .black
var emissiveIntensity: Float = 0.0
}
struct SettingsView: View {
@Binding var materialParameters: PhysicallyBasedMaterialParameters
var backgroundColor: Color {
return Color(materialParameters.baseColor)
}
var body: some View {
VStack(alignment: .leading) {
HStack {
Text("Metallic: \(materialParameters.metallic, specifier: "%.3f")")
Spacer(minLength: 0)
Slider(value: $materialParameters.metallic)
.frame(width: 225)
}
HStack {
Text("Roughness: \(materialParameters.roughness, specifier: "%.3f")")
Spacer(minLength: 0)
Slider(value: $materialParameters.roughness)
.frame(width: 225)
}
HStack {
Text("Clear coat: \(materialParameters.clearcoat, specifier: "%.3f")")
Spacer(minLength: 0)
Slider(value: $materialParameters.clearcoat)
.frame(width: 225)
}
HStack {
Text("Clear Coat Roughness: \(materialParameters.clearcoatRoughness, specifier: "%.3f")")
Spacer(minLength: 0)
Slider(value: $materialParameters.clearcoatRoughness)
.frame(width: 225)
}
ColorPicker("Emmissive Color", selection: Binding(
get: { Color(materialParameters.emissiveColor) },
set: { materialParameters.emissiveColor = UIColor($0) }
))
HStack {
Text("Emmissive Intensity: \(materialParameters.emissiveIntensity, specifier: "%.3f")")
Spacer(minLength: 0)
Slider(value: $materialParameters.emissiveIntensity, in: 0...3)
.frame(width: 225)
}
HStack {
Text("Anisotropy Level: \(materialParameters.anisotropyLevel, specifier: "%.3f")")
Spacer(minLength: 0)
Slider(value: $materialParameters.anisotropyLevel)
.frame(width: 225)
}
HStack {
Text("Anisotropy Angle: \(materialParameters.anisotropyAngle, specifier: "%.3f")")
Spacer(minLength: 0)
Slider(value: $materialParameters.anisotropyAngle)
.frame(width: 225)
}
ColorPicker("Base Color", selection: Binding(
get: { Color(materialParameters.baseColor) },
set: { materialParameters.baseColor = UIColor($0) }
))
}
.frame(width: 400)
.padding()
.background(backgroundColor.opacity(0.5))
.cornerRadius(20)
}
}
}
#Preview {
PhysicallyBasedMaterialPickerView()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment