diff --git a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift index 411de877..739f86a0 100644 --- a/ios/Classes/SwiftPolyvoxFilamentPlugin.swift +++ b/ios/Classes/SwiftPolyvoxFilamentPlugin.swift @@ -44,13 +44,21 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture let instance:SwiftPolyvoxFilamentPlugin = Unmanaged.fromOpaque(resourcesPtr).takeUnretainedValue() let uriString = String(cString:uri.assumingMemoryBound(to: UInt8.self)) - - let key = instance.registrar.lookupKey(forAsset:uriString) - let path = Bundle.main.path(forResource: key, ofType:nil) + var path:String? = nil + + if(uriString.hasPrefix("file://")) { + path = String(uriString.dropFirst(7)) + } else { + let key = instance.registrar.lookupKey(forAsset:uriString) + path = Bundle.main.path(forResource: key, ofType:nil) + guard path != nil else { + print("File not present in bundle : \(uri)") + return ResourceBuffer() + } + } do { - let foo: String = path! - let data = try Data(contentsOf: URL(fileURLWithPath:foo)) + let data = try Data(contentsOf: URL(fileURLWithPath:path!)) let resId = instance.resources.count let nsData = data as NSData instance.resources[resId] = nsData @@ -144,26 +152,42 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture let methodName = call.method; switch methodName { + + case "addLight": + let args = call.arguments as! Array + let entity = add_light( + self.viewer, + args[0] as! UInt8, + Float(args[1] as! Double), + Float(args[2] as! Double), + Float(args[3] as! Double), + Float(args[4] as! Double), + Float(args[5] as! Double), + Float(args[6] as! Double), + Float(args[7] as! Double), + Float(args[8] as! Double), + args[9] as! Bool) + result(entity); + case "animateWeights": + let args = call.arguments as! Array + let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) + let frameData = args[1] as! Array + let numWeights = args[2] as! Int + let numFrames = args[3] as! Int + let frameLenInMs = args[4] as! Double + frameData.map { Float($0)}.withUnsafeBufferPointer { + animate_weights(assetPtr, UnsafeMutablePointer.init(mutating:$0.baseAddress), Int32(numWeights), Int32(numFrames), Float(frameLenInMs)) + } + result("OK") case "initialize": let args = call.arguments as! Array initialize(width:args[0], height:args[1]) result(self.textureId); - case "setBackgroundImage": - let uri = call.arguments as! String - set_background_image(self.viewer!, uri) - render(self.viewer!, 0) - self.registry.textureFrameAvailable(self.textureId!) - result("OK") - case "setBackgroundImagePosition": - let args = call.arguments as! Array - set_background_image_position(self.viewer, Float(args[0] as! Double), Float(args[1] as! Double), args[2] as! Bool) - result("OK"); - case "resize": - let args = call.arguments as! Array - let width = Int(args[0]) - let height = Int(args[1]) - createPixelBuffer(width: width, height:height) - result("OK") + + case "clearLights": + clear_lights(self.viewer); + result(true); + case "loadSkybox": load_skybox(self.viewer!, call.arguments as! String) result("OK"); @@ -224,7 +248,7 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture let assetPtr = UnsafeMutableRawPointer.init(bitPattern: call.arguments as! Int) let numNames = get_animation_count(assetPtr) var names = [String]() - for i in 0...numNames - 1{ + for i in 0...allocate(capacity:256) get_animation_name(assetPtr, outPtr, i) names.append(String(cString:outPtr)) @@ -239,27 +263,6 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture } result("OK") - case "zoomBegin": - scroll_begin(self.viewer) - result("OK") - case "zoomUpdate": - let args = call.arguments as! Array - scroll_update(self.viewer, Float(args[0] as! Double), Float(args[1] as! Double),Float(args[2] as! Double)) - result("OK") - case "zoomEnd": - scroll_end(self.viewer) - result("OK") - case "animateWeights": - let args = call.arguments as! Array - let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) - let frameData = args[1] as! Array - let numWeights = args[2] as! Int - let numFrames = args[3] as! Int - let frameLenInMs = args[4] as! Double - frameData.map { Float($0)}.withUnsafeBufferPointer { - animate_weights(assetPtr, UnsafeMutablePointer.init(mutating:$0.baseAddress), Int32(numWeights), Int32(numFrames), Float(frameLenInMs)) - } - result("OK") case "panStart": let args = call.arguments as! Array grab_begin(self.viewer, Float(args[0] as! Double), Float(args[1] as! Double), true) @@ -271,6 +274,18 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "panEnd": grab_end(self.viewer) result("OK") + case "removeLight": + remove_light(self.viewer,call.arguments as! Int32) + result(true); + case "render": + doRender() + result("OK") + case "resize": + let args = call.arguments as! Array + let width = Int(args[0]) + let height = Int(args[1]) + createPixelBuffer(width: width, height:height) + result("OK") case "rotateStart": let args = call.arguments as! Array grab_begin(self.viewer, Float(args[0] as! Double), Float(args[1] as! Double), false) @@ -282,6 +297,16 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "rotateEnd": grab_end(self.viewer) result("OK") + case "setBackgroundImage": + let uri = call.arguments as! String + set_background_image(self.viewer!, uri) + render(self.viewer!, 0) + self.registry.textureFrameAvailable(self.textureId!) + result("OK") + case "setBackgroundImagePosition": + let args = call.arguments as! Array + set_background_image_position(self.viewer, Float(args[0] as! Double), Float(args[1] as! Double), args[2] as! Bool) + result("OK"); case "setPosition": let args = call.arguments as! Array let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) @@ -305,7 +330,8 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture case "setCameraRotation": let args = call.arguments as! Array set_camera_rotation(self.viewer, Float(args[0] as! Double), Float(args[1] as! Double), Float(args[2] as! Double),Float(args[3] as! Double)) - case "setCameraFocalLength": + result("OK") + case "setCameraFocalLength": set_camera_focal_length(self.viewer, Float(call.arguments as! Double)) result("OK"); case "setCameraFocusDistance": @@ -313,38 +339,31 @@ public class SwiftPolyvoxFilamentPlugin: NSObject, FlutterPlugin, FlutterTexture // set_camera_focus_distance(self.viewer, Float(call.arguments as! Double)) // result("OK"); break + case "setFrameInterval": + set_frame_interval(self.viewer, Float(call.arguments as! Double)); + result("OK") case "setRendering": _rendering = call.arguments as! Bool result("OK") - case "render": - doRender() - result("OK") - case "addLight": - let args = call.arguments as! Array - let entity = add_light( - self.viewer, - args[0] as! UInt8, - Float(args[1] as! Double), - Float(args[2] as! Double), - Float(args[3] as! Double), - Float(args[4] as! Double), - Float(args[5] as! Double), - Float(args[6] as! Double), - Float(args[7] as! Double), - Float(args[8] as! Double), - args[9] as! Bool) - result(entity); - case "removeLight": - remove_light(self.viewer,call.arguments as! Int32) - result(true); - case "clearLights": - clear_lights(self.viewer); - result(true); case "setTexture": - let args = call.arguments as! Array - let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) - load_texture(assetPtr, args[1] as! String, args[2] as! Int32) - result("OK"); + let args = call.arguments as! Array + let assetPtr = UnsafeMutableRawPointer.init(bitPattern: args[0] as! Int) + load_texture(assetPtr, args[1] as! String, args[2] as! Int32) + result("OK"); + case "transformToUnitCube": + let assetPtr = UnsafeMutableRawPointer.init(bitPattern: call.arguments as! Int) + transform_to_unit_cube(assetPtr) + result("OK"); + case "zoomBegin": + scroll_begin(self.viewer) + result("OK") + case "zoomUpdate": + let args = call.arguments as! Array + scroll_update(self.viewer, Float(args[0] as! Double), Float(args[1] as! Double),Float(args[2] as! Double)) + result("OK") + case "zoomEnd": + scroll_end(self.viewer) + result("OK") default: result(FlutterMethodNotImplemented) }