Files
swift-mirror/stdlib/public/SDK/SceneKit/SceneKit.swift
Andrew Trick 0b75ee975e Remove "illegal" UnsafePointer casts from the stdlib.
Update for SE-0107: UnsafeRawPointer

This adds a "mutating" initialize to UnsafePointer to make
Immutable -> Mutable conversions explicit.

These are quick fixes to stdlib, overlays, and test cases that are necessary
in order to remove arbitrary UnsafePointer conversions.

Many cases can be expressed better up by reworking the surrounding
code, but we first need a working starting point.
2016-07-28 20:42:23 -07:00

236 lines
7.4 KiB
Swift

//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2016 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
@_exported import SceneKit // Clang module
import CoreGraphics
import simd
// MARK: Exposing SCNFloat
#if os(OSX)
public typealias SCNFloat = CGFloat
#elseif os(iOS) || os(tvOS) || os(watchOS)
public typealias SCNFloat = Float
#endif
// MARK: Working with SCNVector3
extension SCNVector3 {
public init(_ x: Float, _ y: Float, _ z: Float) {
self.x = SCNFloat(x)
self.y = SCNFloat(y)
self.z = SCNFloat(z)
}
public init(_ x: CGFloat, _ y: CGFloat, _ z: CGFloat) {
self.x = SCNFloat(x)
self.y = SCNFloat(y)
self.z = SCNFloat(z)
}
public init(_ x: Double, _ y: Double, _ z: Double) {
self.init(SCNFloat(x), SCNFloat(y), SCNFloat(z))
}
public init(_ x: Int, _ y: Int, _ z: Int) {
self.init(SCNFloat(x), SCNFloat(y), SCNFloat(z))
}
public init(_ v: float3) {
self.init(SCNFloat(v.x), SCNFloat(v.y), SCNFloat(v.z))
}
public init(_ v: double3) {
self.init(SCNFloat(v.x), SCNFloat(v.y), SCNFloat(v.z))
}
}
extension float3 {
public init(_ v: SCNVector3) {
self.init(Float(v.x), Float(v.y), Float(v.z))
}
}
extension double3 {
public init(_ v: SCNVector3) {
self.init(Double(v.x), Double(v.y), Double(v.z))
}
}
// MARK: Working with SCNVector4
extension SCNVector4 {
public init(_ x: Float, _ y: Float, _ z: Float, _ w: Float) {
self.x = SCNFloat(x)
self.y = SCNFloat(y)
self.z = SCNFloat(z)
self.w = SCNFloat(w)
}
public init(_ x: CGFloat, _ y: CGFloat, _ z: CGFloat, _ w: CGFloat) {
self.x = SCNFloat(x)
self.y = SCNFloat(y)
self.z = SCNFloat(z)
self.w = SCNFloat(w)
}
public init(_ x: Double, _ y: Double, _ z: Double, _ w: Double) {
self.init(SCNFloat(x), SCNFloat(y), SCNFloat(z), SCNFloat(w))
}
public init(_ x: Int, _ y: Int, _ z: Int, _ w: Int) {
self.init(SCNFloat(x), SCNFloat(y), SCNFloat(z), SCNFloat(w))
}
public init(_ v: float4) {
self.init(SCNFloat(v.x), SCNFloat(v.y), SCNFloat(v.z), SCNFloat(v.w))
}
public init(_ v: double4) {
self.init(SCNFloat(v.x), SCNFloat(v.y), SCNFloat(v.z), SCNFloat(v.w))
}
}
extension float4 {
public init(_ v: SCNVector4) {
self.init(Float(v.x), Float(v.y), Float(v.z), Float(v.w))
}
}
extension double4 {
public init(_ v: SCNVector4) {
self.init(Double(v.x), Double(v.y), Double(v.z), Double(v.w))
}
}
// MARK: Working with SCNMatrix4
extension SCNMatrix4 {
public init(_ m: float4x4) {
self.init(
m11: SCNFloat(m[0,0]), m12: SCNFloat(m[0,1]), m13: SCNFloat(m[0,2]), m14: SCNFloat(m[0,3]),
m21: SCNFloat(m[1,0]), m22: SCNFloat(m[1,1]), m23: SCNFloat(m[1,2]), m24: SCNFloat(m[1,3]),
m31: SCNFloat(m[2,0]), m32: SCNFloat(m[2,1]), m33: SCNFloat(m[2,2]), m34: SCNFloat(m[2,3]),
m41: SCNFloat(m[3,0]), m42: SCNFloat(m[3,1]), m43: SCNFloat(m[3,2]), m44: SCNFloat(m[3,3]))
}
public init(_ m: double4x4) {
self.init(
m11: SCNFloat(m[0,0]), m12: SCNFloat(m[0,1]), m13: SCNFloat(m[0,2]), m14: SCNFloat(m[0,3]),
m21: SCNFloat(m[1,0]), m22: SCNFloat(m[1,1]), m23: SCNFloat(m[1,2]), m24: SCNFloat(m[1,3]),
m31: SCNFloat(m[2,0]), m32: SCNFloat(m[2,1]), m33: SCNFloat(m[2,2]), m34: SCNFloat(m[2,3]),
m41: SCNFloat(m[3,0]), m42: SCNFloat(m[3,1]), m43: SCNFloat(m[3,2]), m44: SCNFloat(m[3,3]))
}
}
extension float4x4 {
public init(_ m: SCNMatrix4) {
self.init([
float4(Float(m.m11), Float(m.m12), Float(m.m13), Float(m.m14)),
float4(Float(m.m21), Float(m.m22), Float(m.m23), Float(m.m24)),
float4(Float(m.m31), Float(m.m32), Float(m.m33), Float(m.m34)),
float4(Float(m.m41), Float(m.m42), Float(m.m43), Float(m.m44))
])
}
}
extension double4x4 {
public init(_ m: SCNMatrix4) {
self.init([
double4(Double(m.m11), Double(m.m12), Double(m.m13), Double(m.m14)),
double4(Double(m.m21), Double(m.m22), Double(m.m23), Double(m.m24)),
double4(Double(m.m31), Double(m.m32), Double(m.m33), Double(m.m34)),
double4(Double(m.m41), Double(m.m42), Double(m.m43), Double(m.m44))
])
}
}
// MARK: Swift Extensions
@available(iOS, introduced: 8.0)
@available(OSX, introduced: 10.8)
extension SCNGeometryElement {
/// Creates an instance from `indices` for a `primitiveType`
/// that has a constant number of indices per primitive
/// - Precondition: the `primitiveType` must be `.triangles`, `.triangleStrip`, `.line` or `.point`
public convenience init<IndexType : Integer>(
indices: [IndexType], primitiveType: SCNGeometryPrimitiveType
) {
precondition(primitiveType == .triangles || primitiveType == .triangleStrip || primitiveType == .line || primitiveType == .point, "Expected constant number of indices per primitive")
let indexCount = indices.count
let primitiveCount: Int
switch primitiveType {
case .triangles:
primitiveCount = indexCount / 3
case .triangleStrip:
primitiveCount = indexCount - 2
case .line:
primitiveCount = indexCount / 2
case .point:
primitiveCount = indexCount
case .polygon:
fatalError("Expected constant number of indices per primitive")
}
self.init(
data: Data(bytes: indices, count: indexCount * sizeof(IndexType.self)),
primitiveType: primitiveType,
primitiveCount: primitiveCount,
bytesPerIndex: sizeof(IndexType.self))
_fixLifetime(indices)
}
}
@available(iOS, introduced: 8.0)
@available(OSX, introduced: 10.8)
extension SCNGeometrySource {
public convenience init(vertices: [SCNVector3]) {
self.init(vertices: UnsafePointer(vertices), count: vertices.count)
}
public convenience init(normals: [SCNVector3]) {
self.init(normals: UnsafePointer(normals), count: normals.count)
}
public convenience init(textureCoordinates: [CGPoint]) {
self.init(textureCoordinates: UnsafePointer(textureCoordinates), count: textureCoordinates.count)
}
}
@available(iOS, introduced: 8.0)
@available(OSX, introduced: 10.10)
extension SCNBoundingVolume {
public var boundingBox: (min: SCNVector3, max: SCNVector3) {
get {
var min = SCNVector3Zero
var max = SCNVector3Zero
__getBoundingBoxMin(&min, max: &max)
return (min: min, max: max)
}
set {
var min = newValue.min
var max = newValue.max
__setBoundingBoxMin(&min, max: &max)
}
}
public var boundingSphere: (center: SCNVector3, radius: Float) {
var center = SCNVector3Zero
var radius = CGFloat(0.0)
__getBoundingSphereCenter(&center, radius: &radius)
return (center: center, radius: Float(radius))
}
}
// MARK: APIs refined for Swift
@_silgen_name("SCN_Swift_SCNSceneSource_entryWithIdentifier")
internal func SCN_Swift_SCNSceneSource_entryWithIdentifier(
_ self_: AnyObject,
_ uid: NSString,
_ entryClass: AnyObject) -> AnyObject?
@available(iOS, introduced: 8.0)
@available(OSX, introduced: 10.8)
extension SCNSceneSource {
public func entryWithIdentifier<T>(_ uid: String, withClass entryClass: T.Type) -> T? {
return SCN_Swift_SCNSceneSource_entryWithIdentifier(
self, uid as NSString, entryClass as! AnyClass) as! T?
}
}