[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