[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, ); }; }; | ||||
| 		C005E0291BE1CC3300F1BD3C /* COLLADA.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C005E01E1BE1CC3300F1BD3C /* COLLADA.framework */; }; | ||||
| 		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 */ | ||||
| 
 | ||||
| /* Begin PBXContainerItemProxy section */ | ||||
|  | @ -29,6 +31,8 @@ | |||
| 		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>"; }; | ||||
| 		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 */ | ||||
| 
 | ||||
| /* Begin PBXFrameworksBuildPhase section */ | ||||
|  | @ -73,6 +77,8 @@ | |||
| 			children = ( | ||||
| 				C005E0211BE1CC3300F1BD3C /* COLLADA.h */, | ||||
| 				C005E0231BE1CC3300F1BD3C /* Info.plist */, | ||||
| 				C04449C21BE3422A00ABF046 /* COLLADA.swift */, | ||||
| 				C04449C41BE5142200ABF046 /* Source.swift */, | ||||
| 			); | ||||
| 			path = COLLADA; | ||||
| 			sourceTree = "<group>"; | ||||
|  | @ -194,6 +200,8 @@ | |||
| 			isa = PBXSourcesBuildPhase; | ||||
| 			buildActionMask = 2147483647; | ||||
| 			files = ( | ||||
| 				C04449C51BE5142200ABF046 /* Source.swift in Sources */, | ||||
| 				C04449C31BE3422A00ABF046 /* COLLADA.swift in Sources */, | ||||
| 			); | ||||
| 			runOnlyForDeploymentPostprocessing = 0; | ||||
| 		}; | ||||
|  | @ -305,6 +313,7 @@ | |||
| 		C005E0331BE1CC3300F1BD3C /* Debug */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				COMBINE_HIDPI_IMAGES = YES; | ||||
| 				DEFINES_MODULE = YES; | ||||
| 				DYLIB_COMPATIBILITY_VERSION = 1; | ||||
|  | @ -317,12 +326,14 @@ | |||
| 				PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.graphics.COLLADA; | ||||
| 				PRODUCT_NAME = "$(TARGET_NAME)"; | ||||
| 				SKIP_INSTALL = YES; | ||||
| 				SWIFT_OPTIMIZATION_LEVEL = "-Onone"; | ||||
| 			}; | ||||
| 			name = Debug; | ||||
| 		}; | ||||
| 		C005E0341BE1CC3300F1BD3C /* Release */ = { | ||||
| 			isa = XCBuildConfiguration; | ||||
| 			buildSettings = { | ||||
| 				CLANG_ENABLE_MODULES = YES; | ||||
| 				COMBINE_HIDPI_IMAGES = YES; | ||||
| 				DEFINES_MODULE = YES; | ||||
| 				DYLIB_COMPATIBILITY_VERSION = 1; | ||||
|  | @ -379,6 +390,7 @@ | |||
| 				C005E0341BE1CC3300F1BD3C /* Release */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| 		C005E0351BE1CC3300F1BD3C /* Build configuration list for PBXNativeTarget "COLLADATests" */ = { | ||||
| 			isa = XCConfigurationList; | ||||
|  | @ -387,6 +399,7 @@ | |||
| 				C005E0371BE1CC3300F1BD3C /* Release */, | ||||
| 			); | ||||
| 			defaultConfigurationIsVisible = 0; | ||||
| 			defaultConfigurationName = Release; | ||||
| 		}; | ||||
| /* 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