[COLLADA] Endless fighting with Swift and COLLADA blahhhhhh
This commit is contained in:
parent
9be3a41bdf
commit
662e95bcca
3 changed files with 234 additions and 0 deletions
|
@ -10,6 +10,8 @@
|
||||||
C005E0221BE1CC3300F1BD3C /* COLLADA.h in Headers */ = {isa = PBXBuildFile; fileRef = C005E0211BE1CC3300F1BD3C /* COLLADA.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
C005E0221BE1CC3300F1BD3C /* COLLADA.h in Headers */ = {isa = PBXBuildFile; fileRef = C005E0211BE1CC3300F1BD3C /* COLLADA.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
C005E0291BE1CC3300F1BD3C /* COLLADA.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C005E01E1BE1CC3300F1BD3C /* COLLADA.framework */; };
|
C005E0291BE1CC3300F1BD3C /* COLLADA.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C005E01E1BE1CC3300F1BD3C /* COLLADA.framework */; };
|
||||||
C005E02E1BE1CC3300F1BD3C /* COLLADATests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C005E02D1BE1CC3300F1BD3C /* COLLADATests.swift */; };
|
C005E02E1BE1CC3300F1BD3C /* COLLADATests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C005E02D1BE1CC3300F1BD3C /* COLLADATests.swift */; };
|
||||||
|
C04449C31BE3422A00ABF046 /* COLLADA.swift in Sources */ = {isa = PBXBuildFile; fileRef = C04449C21BE3422A00ABF046 /* COLLADA.swift */; };
|
||||||
|
C04449C51BE5142200ABF046 /* Source.swift in Sources */ = {isa = PBXBuildFile; fileRef = C04449C41BE5142200ABF046 /* Source.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
|
@ -29,6 +31,8 @@
|
||||||
C005E0281BE1CC3300F1BD3C /* COLLADATests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = COLLADATests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
C005E0281BE1CC3300F1BD3C /* COLLADATests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = COLLADATests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
C005E02D1BE1CC3300F1BD3C /* COLLADATests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = COLLADATests.swift; sourceTree = "<group>"; };
|
C005E02D1BE1CC3300F1BD3C /* COLLADATests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = COLLADATests.swift; sourceTree = "<group>"; };
|
||||||
C005E02F1BE1CC3300F1BD3C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
C005E02F1BE1CC3300F1BD3C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
|
C04449C21BE3422A00ABF046 /* COLLADA.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = COLLADA.swift; sourceTree = "<group>"; };
|
||||||
|
C04449C41BE5142200ABF046 /* Source.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Source.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
|
@ -73,6 +77,8 @@
|
||||||
children = (
|
children = (
|
||||||
C005E0211BE1CC3300F1BD3C /* COLLADA.h */,
|
C005E0211BE1CC3300F1BD3C /* COLLADA.h */,
|
||||||
C005E0231BE1CC3300F1BD3C /* Info.plist */,
|
C005E0231BE1CC3300F1BD3C /* Info.plist */,
|
||||||
|
C04449C21BE3422A00ABF046 /* COLLADA.swift */,
|
||||||
|
C04449C41BE5142200ABF046 /* Source.swift */,
|
||||||
);
|
);
|
||||||
path = COLLADA;
|
path = COLLADA;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
|
@ -194,6 +200,8 @@
|
||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
C04449C51BE5142200ABF046 /* Source.swift in Sources */,
|
||||||
|
C04449C31BE3422A00ABF046 /* COLLADA.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
|
@ -305,6 +313,7 @@
|
||||||
C005E0331BE1CC3300F1BD3C /* Debug */ = {
|
C005E0331BE1CC3300F1BD3C /* Debug */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
@ -317,12 +326,14 @@
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.graphics.COLLADA;
|
PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.graphics.COLLADA;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
|
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
|
||||||
};
|
};
|
||||||
name = Debug;
|
name = Debug;
|
||||||
};
|
};
|
||||||
C005E0341BE1CC3300F1BD3C /* Release */ = {
|
C005E0341BE1CC3300F1BD3C /* Release */ = {
|
||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
CLANG_ENABLE_MODULES = YES;
|
||||||
COMBINE_HIDPI_IMAGES = YES;
|
COMBINE_HIDPI_IMAGES = YES;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
|
@ -379,6 +390,7 @@
|
||||||
C005E0341BE1CC3300F1BD3C /* Release */,
|
C005E0341BE1CC3300F1BD3C /* Release */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
C005E0351BE1CC3300F1BD3C /* Build configuration list for PBXNativeTarget "COLLADATests" */ = {
|
C005E0351BE1CC3300F1BD3C /* Build configuration list for PBXNativeTarget "COLLADATests" */ = {
|
||||||
isa = XCConfigurationList;
|
isa = XCConfigurationList;
|
||||||
|
@ -387,6 +399,7 @@
|
||||||
C005E0371BE1CC3300F1BD3C /* Release */,
|
C005E0371BE1CC3300F1BD3C /* Release */,
|
||||||
);
|
);
|
||||||
defaultConfigurationIsVisible = 0;
|
defaultConfigurationIsVisible = 0;
|
||||||
|
defaultConfigurationName = Release;
|
||||||
};
|
};
|
||||||
/* End XCConfigurationList section */
|
/* End XCConfigurationList section */
|
||||||
};
|
};
|
||||||
|
|
129
COLLADA/COLLADA/COLLADA.swift
Normal file
129
COLLADA/COLLADA/COLLADA.swift
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
//
|
||||||
|
// COLLADA.swift
|
||||||
|
// COLLADA
|
||||||
|
//
|
||||||
|
// Created by Eryn Wells on 10/29/15.
|
||||||
|
// Copyright © 2015 Eryn Wells. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
private enum Node: String {
|
||||||
|
case Geometry = "geometry"
|
||||||
|
case LibraryGeometries = "library_geometries"
|
||||||
|
case Vertices = "vertices"
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Scene: Object {
|
||||||
|
public enum Error: ErrorType {
|
||||||
|
case MissingRootElement
|
||||||
|
}
|
||||||
|
|
||||||
|
private let document: NSXMLDocument
|
||||||
|
|
||||||
|
public lazy var geometries: [Geometry] = {
|
||||||
|
do {
|
||||||
|
return try self.xml.elementsForName(Node.LibraryGeometries.rawValue).flatMap {
|
||||||
|
try $0.elementsForName(Node.Geometry.rawValue).map {
|
||||||
|
try Geometry(element: $0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
return []
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
init(document: NSXMLDocument) throws {
|
||||||
|
self.document = document
|
||||||
|
if let root = document.rootElement() {
|
||||||
|
try super.init(element: root)
|
||||||
|
} else {
|
||||||
|
try super.init(element: nil)
|
||||||
|
throw Error.MissingRootElement
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Geometry: Object {
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Mesh: Object {
|
||||||
|
private lazy var vertices: NSXMLElement! = {
|
||||||
|
return self.xml.elementsForName("vertices").first
|
||||||
|
}()
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Polygons: Object {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Object {
|
||||||
|
public enum Error: ErrorType {
|
||||||
|
case MissingElement
|
||||||
|
case MultipleElementsWithSameID
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: When the Swift compiler gets its shit together and lets you throw from init() without all stored properties being initialized, change these to `let` and clean up the initializer.
|
||||||
|
public private(set) var elements = [NSXMLElement]()
|
||||||
|
public private(set) var elementsByID = [String: NSXMLElement]()
|
||||||
|
|
||||||
|
let xml: NSXMLElement!
|
||||||
|
|
||||||
|
init(element: NSXMLElement!) throws {
|
||||||
|
xml = element
|
||||||
|
guard xml != nil else { throw Error.MissingElement }
|
||||||
|
|
||||||
|
for node in element.children ?? [] {
|
||||||
|
if node.kind != .ElementKind {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if let element = node as? NSXMLElement {
|
||||||
|
elements.append(element)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for element in elements {
|
||||||
|
if let id = element.attributeForName("id")?.stringValue {
|
||||||
|
if elementsByID[id] != nil {
|
||||||
|
throw Error.MultipleElementsWithSameID
|
||||||
|
}
|
||||||
|
elementsByID[id] = element
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public var id: String? {
|
||||||
|
return xml.attributeForName("id")?.stringValue
|
||||||
|
}
|
||||||
|
|
||||||
|
public var name: String? {
|
||||||
|
return xml.attributeForName("name")?.stringValue
|
||||||
|
}
|
||||||
|
|
||||||
|
private func idWithoutHash(id: String) -> String {
|
||||||
|
if id.hasPrefix("#") {
|
||||||
|
let indexAfterHash = id.startIndex.advancedBy(1)
|
||||||
|
return id.substringFromIndex(indexAfterHash)
|
||||||
|
} else {
|
||||||
|
return id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension NSXMLElement {
|
||||||
|
func stringValueForAttributeWithName(name: String) -> String? {
|
||||||
|
if let value = self.attributeForName(name)?.stringValue {
|
||||||
|
return value
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func unsignedIntValueForAttributeWithName(name: String) -> UInt? {
|
||||||
|
if let value = stringValueForAttributeWithName(name) {
|
||||||
|
return UInt(value)
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
92
COLLADA/COLLADA/Source.swift
Normal file
92
COLLADA/COLLADA/Source.swift
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
//
|
||||||
|
// Source.swift
|
||||||
|
// COLLADA
|
||||||
|
//
|
||||||
|
// Created by Eryn Wells on 10/31/15.
|
||||||
|
// Copyright © 2015 Eryn Wells. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import Math
|
||||||
|
|
||||||
|
private enum Node: String {
|
||||||
|
case Accessor = "accessor"
|
||||||
|
case FloatArray = "float_array"
|
||||||
|
case Source = "source"
|
||||||
|
case TechniqueCommon = "technique_common"
|
||||||
|
}
|
||||||
|
|
||||||
|
enum SourceError: ErrorType {
|
||||||
|
case MissingAccessor
|
||||||
|
}
|
||||||
|
|
||||||
|
protocol Source: SequenceType { }
|
||||||
|
|
||||||
|
class FloatSource: Object, Source {
|
||||||
|
// TODO: When the Swift compiler gets its shit together and lets you throw from init() without all stored properties being initialized, change these to `let` and clean up the initializer.
|
||||||
|
private var accessor: Accessor! = nil
|
||||||
|
|
||||||
|
override init(element: NSXMLElement!) throws {
|
||||||
|
try super.init(element: element)
|
||||||
|
if let techniqueNode = element.elementsForName(Node.TechniqueCommon.rawValue).first,
|
||||||
|
accessorNode = techniqueNode.elementsForName(Node.Accessor.rawValue).first {
|
||||||
|
accessor = try Accessor(element: accessorNode)
|
||||||
|
} else {
|
||||||
|
throw SourceError.MissingAccessor
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension FloatSource: SequenceType {
|
||||||
|
typealias Element = [String: Float]
|
||||||
|
typealias Generator = AnyGenerator<[String: Float]>
|
||||||
|
|
||||||
|
func generate() -> Generator {
|
||||||
|
return anyGenerator { () -> Element? in
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class Vertices: Object {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class Accessor: Object {
|
||||||
|
typealias Param = (name: String, type: String)
|
||||||
|
|
||||||
|
enum Error: ErrorType {
|
||||||
|
case MissingSource
|
||||||
|
case MissingCount
|
||||||
|
case MissingStride
|
||||||
|
case MissingParamName
|
||||||
|
case MissingParamType
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: When the Swift compiler gets its shit together and lets you throw from init() without all stored properties being initialized, change these to `let` and clean up the initializer.
|
||||||
|
private(set) var source: String! = nil
|
||||||
|
private(set) var count: UInt! = nil
|
||||||
|
private(set) var stride: UInt! = nil
|
||||||
|
private(set) var params: [Param]! = nil
|
||||||
|
|
||||||
|
override init(element: NSXMLElement!) throws {
|
||||||
|
try super.init(element: element)
|
||||||
|
|
||||||
|
source = element.stringValueForAttributeWithName("source")
|
||||||
|
guard source != nil else { throw Error.MissingSource }
|
||||||
|
|
||||||
|
count = element.unsignedIntValueForAttributeWithName("count")
|
||||||
|
guard count != nil else { throw Error.MissingCount }
|
||||||
|
|
||||||
|
stride = element.unsignedIntValueForAttributeWithName("stride")
|
||||||
|
guard stride != nil else { throw Error.MissingStride }
|
||||||
|
|
||||||
|
params = try element.elementsForName("param").map {
|
||||||
|
let name = $0.stringValueForAttributeWithName("name")
|
||||||
|
let type = $0.stringValueForAttributeWithName("type")
|
||||||
|
guard name != nil else { throw Error.MissingParamName }
|
||||||
|
guard type != nil else { throw Error.MissingParamType }
|
||||||
|
return (name: name!, type: type!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Add table
Add a link
Reference in a new issue