/// RendererAPI - Protocol Definitions for Platform Abstraction /// This module contains ONLY protocol definitions with no platform-specific imports import Foundation // MARK: - Core Rendering Types /// Represents a 3D scene to be rendered public struct Scene { public var entities: [Entity] public var camera: Camera public var lights: [Light] public init(entities: [Entity] = [], camera: Camera, lights: [Light] = []) { self.entities = entities self.camera = camera self.lights = lights } } /// Represents a renderable entity in the scene public struct Entity { public var id: UUID public var transform: Transform public var mesh: MeshHandle public var material: MaterialHandle public init(id: UUID = UUID(), transform: Transform, mesh: MeshHandle, material: MaterialHandle) { self.id = id self.transform = transform self.mesh = mesh self.material = material } } /// Camera configuration public struct Camera { public var position: SIMD3 public var rotation: SIMD4 // Quaternion public var fieldOfView: Float public var nearPlane: Float public var farPlane: Float public init(position: SIMD3 = .zero, rotation: SIMD4 = SIMD4(0, 0, 0, 1), fieldOfView: Float = 60.0, nearPlane: Float = 0.1, farPlane: Float = 1000.0) { self.position = position self.rotation = rotation self.fieldOfView = fieldOfView self.nearPlane = nearPlane self.farPlane = farPlane } } /// Transform component public struct Transform { public var position: SIMD3 public var rotation: SIMD4 // Quaternion public var scale: SIMD3 public init(position: SIMD3 = .zero, rotation: SIMD4 = SIMD4(0, 0, 0, 1), scale: SIMD3 = SIMD3(1, 1, 1)) { self.position = position self.rotation = rotation self.scale = scale } } /// Light source public struct Light { public enum LightType { case directional case point case spot } public var type: LightType public var position: SIMD3 public var direction: SIMD3 public var color: SIMD3 public var intensity: Float public init(type: LightType, position: SIMD3 = .zero, direction: SIMD3 = SIMD3(0, -1, 0), color: SIMD3 = SIMD3(1, 1, 1), intensity: Float = 1.0) { self.type = type self.position = position self.direction = direction self.color = color self.intensity = intensity } } /// Opaque handle for mesh resources public struct MeshHandle: Hashable { public let id: UUID public init(id: UUID = UUID()) { self.id = id } } /// Opaque handle for material resources public struct MaterialHandle: Hashable { public let id: UUID public init(id: UUID = UUID()) { self.id = id } } /// Opaque handle for texture resources public struct TextureHandle: Hashable { public let id: UUID public init(id: UUID = UUID()) { self.id = id } } // MARK: - Renderer Protocol /// Primary rendering abstraction - all rendering backends must conform to this public protocol Renderer: Sendable { /// Initialize the renderer with the given configuration func initialize(config: RendererConfig) async throws /// Begin a new frame func beginFrame() throws /// Draw the current scene func draw(scene: Scene) throws /// End the current frame and present func endFrame() throws /// Shutdown and cleanup resources func shutdown() async /// Load a mesh into GPU memory func loadMesh(vertices: [Vertex], indices: [UInt32]) async throws -> MeshHandle /// Load a texture into GPU memory func loadTexture(data: Data, width: Int, height: Int, format: TextureFormat) async throws -> TextureHandle /// Create a material func createMaterial(albedoTexture: TextureHandle?, normalTexture: TextureHandle?) async throws -> MaterialHandle /// Get renderer capabilities and information var info: RendererInfo { get } } /// Renderer configuration public struct RendererConfig: Sendable { public var windowHandle: UnsafeMutableRawPointer? public var width: Int public var height: Int public var vsyncEnabled: Bool public var msaaSamples: Int public init(windowHandle: UnsafeMutableRawPointer? = nil, width: Int = 1920, height: Int = 1080, vsyncEnabled: Bool = true, msaaSamples: Int = 4) { self.windowHandle = windowHandle self.width = width self.height = height self.vsyncEnabled = vsyncEnabled self.msaaSamples = msaaSamples } } /// Renderer information public struct RendererInfo: Sendable { public var apiName: String public var apiVersion: String public var deviceName: String public var maxTextureSize: Int public init(apiName: String, apiVersion: String, deviceName: String, maxTextureSize: Int) { self.apiName = apiName self.apiVersion = apiVersion self.deviceName = deviceName self.maxTextureSize = maxTextureSize } } /// Vertex data structure public struct Vertex: Sendable { public var position: SIMD3 public var normal: SIMD3 public var uv: SIMD2 public var tangent: SIMD3 public init(position: SIMD3, normal: SIMD3, uv: SIMD2, tangent: SIMD3 = .zero) { self.position = position self.normal = normal self.uv = uv self.tangent = tangent } } /// Texture format enumeration public enum TextureFormat: Sendable { case rgba8 case rgba16f case rgba32f case depth24stencil8 }