Skip to content

Commit

Permalink
Use Scalar literal
Browse files Browse the repository at this point in the history
  • Loading branch information
noppefoxwolf committed Feb 16, 2020
1 parent a841b9f commit 85fb3e6
Show file tree
Hide file tree
Showing 7 changed files with 51 additions and 52 deletions.
8 changes: 4 additions & 4 deletions Sources/VRMSceneKit/CustomType/VRMNode.swift
Original file line number Diff line number Diff line change
Expand Up @@ -61,11 +61,11 @@ open class VRMNode: SCNNode {
let springBone = VRMSpringBone(center: centerNode,
rootBones: rootBones,
comment: boneGroup.comment,
stiffnessForce: simd_float1(boneGroup.stiffiness),
gravityPower: simd_float1(boneGroup.gravityPower),
stiffnessForce: Float(boneGroup.stiffiness),
gravityPower: Float(boneGroup.gravityPower),
gravityDir: boneGroup.gravityDir.simd,
dragForce: simd_float1(boneGroup.dragForce),
hitRadius: simd_float1(boneGroup.hitRadius),
dragForce: Float(boneGroup.dragForce),
hitRadius: Float(boneGroup.hitRadius),
colliderGroups: colliderGroups)
springBones.append(springBone)
}
Expand Down
54 changes: 27 additions & 27 deletions Sources/VRMSceneKit/CustomType/VRMSpringBone.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,18 +12,18 @@ import VRMKit

final class VRMSpringBone {
struct SphereCollider {
let position: simd_float3
let radius: simd_float1
let position: SIMD3<Float>
let radius: Float
}

public let comment: String?
public let stiffnessForce: simd_float1
public let gravityPower: simd_float1
public let gravityDir: simd_float3
public let dragForce: simd_float1
public let stiffnessForce: Float
public let gravityPower: Float
public let gravityDir: SIMD3<Float>
public let dragForce: Float
public let center: SCNNode?
public let rootBones: [SCNNode]
public let hitRadius: simd_float1
public let hitRadius: Float

private var initialLocalRotationMap: [SCNNode : simd_quatf] = [:]
private let colliderGroups: [VRMSpringBoneColliderGroup]
Expand All @@ -33,11 +33,11 @@ final class VRMSpringBone {
init(center: SCNNode?,
rootBones: [SCNNode],
comment: String? = nil,
stiffnessForce: simd_float1 = 1.0,
gravityPower: simd_float1 = 0.0,
gravityDir: simd_float3 = .init(0, -1, 0),
dragForce: simd_float1 = 0.4,
hitRadius: simd_float1 = 0.02,
stiffnessForce: Float = 1.0,
gravityPower: Float = 0.0,
gravityDir: SIMD3<Float> = .init(0, -1, 0),
dragForce: Float = 0.4,
hitRadius: Float = 0.02,
colliderGroups: [VRMSpringBoneColliderGroup] = []) {
self.center = center
self.rootBones = rootBones
Expand Down Expand Up @@ -76,7 +76,7 @@ final class VRMSpringBone {
let firstChild = parent.childNodes.first!
let localPosition = firstChild.utx.localPosition
let scale = firstChild.utx.lossyScale
let logic = VRMSpringBoneLogic(center: center, node: parent, localChildPosition: simd_float3(
let logic = VRMSpringBoneLogic(center: center, node: parent, localChildPosition: SIMD3<Float>(
localPosition.x * scale.x,
localPosition.y * scale.y,
localPosition.z * scale.z
Expand Down Expand Up @@ -113,8 +113,8 @@ final class VRMSpringBone {
}
}

let stiffness = self.stiffnessForce * simd_float1(deltaTime)
let external = self.gravityDir * (self.gravityPower * simd_float1(deltaTime))
let stiffness = self.stiffnessForce * Float(deltaTime)
let external = self.gravityDir * (self.gravityPower * Float(deltaTime))

for verlet in self.verlet {
verlet.radius = self.hitRadius
Expand All @@ -132,17 +132,17 @@ extension VRMSpringBone {
class VRMSpringBoneLogic {
let node: SCNNode
public var head: SCNNode { self.node }
private let length: simd_float1
private var currentTail: simd_float3
private var prevTail: simd_float3
private let length: Float
private var currentTail: SIMD3<Float>
private var prevTail: SIMD3<Float>
private let localRotation: simd_quatf
private let boneAxis: simd_float3
private let boneAxis: SIMD3<Float>
private var parentRotation: simd_quatf {
self.node.parent?.utx.rotation ?? quart_identity_float
}
var radius: simd_float1 = 0.5
var radius: Float = 0.5

init(center: SCNNode?, node: SCNNode, localChildPosition: simd_float3) {
init(center: SCNNode?, node: SCNNode, localChildPosition: SIMD3<Float>) {
self.node = node
let worldChildPosition = node.utx.transformPoint(localChildPosition)
self.currentTail = center?.utx.inverseTransformPoint(worldChildPosition) ?? worldChildPosition
Expand All @@ -152,12 +152,12 @@ extension VRMSpringBone {
self.length = localChildPosition.length
}

func update(center: SCNNode?, stiffnessForce: simd_float1, dragForce: simd_float1, external: simd_float3, colliders: [SphereCollider]) {
let currentTail: simd_float3 = center?.utx.transformPoint(self.currentTail) ?? self.currentTail
let prevTail: simd_float3 = center?.utx.transformPoint(self.prevTail) ?? self.prevTail
func update(center: SCNNode?, stiffnessForce: Float, dragForce: Float, external: SIMD3<Float>, colliders: [SphereCollider]) {
let currentTail: SIMD3<Float> = center?.utx.transformPoint(self.currentTail) ?? self.currentTail
let prevTail: SIMD3<Float> = center?.utx.transformPoint(self.prevTail) ?? self.prevTail

// verlet積分で次の位置を計算
var nextTail: simd_float3 = {
var nextTail: SIMD3<Float> = {
let a = currentTail
let b = (currentTail - prevTail) * (1.0 - dragForce) // 前フレームの移動を継続する(減衰もあるよ)
let c = self.parentRotation * self.localRotation * self.boneAxis * stiffnessForce // 親の回転による子ボーンの移動目標
Expand All @@ -178,12 +178,12 @@ extension VRMSpringBone {
self.head.utx.rotation = self.applyRotation(nextTail)
}

private func applyRotation(_ nextTail: simd_float3) -> simd_quatf {
private func applyRotation(_ nextTail: SIMD3<Float>) -> simd_quatf {
let rotation = self.parentRotation * self.localRotation
return simd_quatf(from: rotation * self.boneAxis, to: nextTail - self.node.utx.position) * rotation
}

private func collision(_ colliders: [SphereCollider], _ nextTail: simd_float3) -> simd_float3 {
private func collision(_ colliders: [SphereCollider], _ nextTail: SIMD3<Float>) -> SIMD3<Float> {
var nextTail = nextTail
for collider in colliders {
let r = self.radius + collider.radius
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ final class VRMSpringBoneColliderGroup {
}

final class SphereCollider {
let offset: simd_float3
let radius: simd_float1
let offset: SIMD3<Float>
let radius: Float

init(collider: VRM.SecondaryAnimation.ColliderGroup.Collider) {
self.offset = collider.offset.simd
self.radius = SCNFloat(collider.radius)
self.radius = Float(collider.radius)
}
}
}
10 changes: 5 additions & 5 deletions Sources/VRMSceneKit/Extensions/SCNNode+UnityTransform.swift
Original file line number Diff line number Diff line change
Expand Up @@ -30,11 +30,11 @@ public extension UnityTransformCompatible {
extension SCNNode: UnityTransformCompatible {}

extension UnityTransform where Base == SCNNode {
func transformPoint(_ position: simd_float3) -> simd_float3 {
func transformPoint(_ position: SIMD3<Float>) -> SIMD3<Float> {
base.simdConvertPosition(position, to: nil)
}

func inverseTransformPoint(_ position: simd_float3) -> simd_float3 {
func inverseTransformPoint(_ position: SIMD3<Float>) -> SIMD3<Float> {
base.simdConvertPosition(position, from: nil)
}

Expand All @@ -43,12 +43,12 @@ extension UnityTransform where Base == SCNNode {
set { base.simdOrientation = newValue }
}

var position: simd_float3 {
var position: SIMD3<Float> {
get { base.simdWorldPosition }
set { base.simdWorldPosition = newValue }
}

var localPosition: simd_float3 {
var localPosition: SIMD3<Float> {
get { base.simdPosition }
set { base.simdPosition = newValue }
}
Expand All @@ -74,7 +74,7 @@ extension UnityTransform where Base == SCNNode {
localToWorldMatrix.inverse
}

var lossyScale: simd_float3 {
var lossyScale: SIMD3<Float> {
if let parent = base.parent {
return parent.utx.lossyScale * base.simdScale
} else {
Expand Down
4 changes: 2 additions & 2 deletions Sources/VRMSceneKit/Extensions/SCNVector3+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import VRMKit
import SceneKit

extension VRM.Vector3 {
var simd: simd_float3 {
simd_float3(x: Float(x), y: Float(y), z: Float(z))
var simd: SIMD3<Float> {
SIMD3<Float>(x: Float(x), y: Float(y), z: Float(z))
}
}
17 changes: 8 additions & 9 deletions Sources/VRMSceneKit/Extensions/simd+.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,27 +7,26 @@
//

import simd
import SceneKit

extension simd_float3 {
var normalized: simd_float3 {
extension SIMD3 where Scalar == Float {
var normalized: SIMD3 {
simd_normalize(self)
}

var length: simd_float1 {
var length: Scalar {
simd_length(self)
}

var length_squared: simd_float1 {
var length_squared: Scalar {
simd_length_squared(self)
}
}

import SceneKit

extension simd_float4x4 {
func multiplyPoint(_ v: simd_float3) -> simd_float3 {
func multiplyPoint(_ v: SIMD3<Float>) -> SIMD3<Float> {
let scn = SCNMatrix4(self)
var vector3: simd_float3 = simd_float3()
var vector3: SIMD3<Float> = SIMD3<Float>()
vector3.x = (scn.m11 * v.x + scn.m21 * v.y + scn.m31 * v.z) + scn.m41
vector3.y = (scn.m12 * v.x + scn.m22 * v.y + scn.m32 * v.z) + scn.m42
vector3.z = (scn.m13 * v.x + scn.m23 * v.y + scn.m33 * v.z) + scn.m43
Expand All @@ -40,7 +39,7 @@ extension simd_float4x4 {
}

extension simd_quatf {
static func * (_ left: simd_quatf, _ right: simd_float3) -> simd_float3 {
static func * (_ left: simd_quatf, _ right: SIMD3<Float>) -> SIMD3<Float> {
simd_act(left, right)
}
}
Expand Down
4 changes: 2 additions & 2 deletions Sources/VRMSceneKit/GLTF2SCN/GLTF2SCN.swift
Original file line number Diff line number Diff line change
Expand Up @@ -81,8 +81,8 @@ extension GLTF.Vector3 {
return .init(x: SCNFloat(x), y: SCNFloat(y), z: SCNFloat(z))
}

var simd: simd_float3 {
simd_float3(x: Float(x), y: Float(y), z: Float(z))
var simd: SIMD3<Float> {
SIMD3<Float>(x: Float(x), y: Float(y), z: Float(z))
}
}

Expand Down

0 comments on commit 85fb3e6

Please sign in to comment.