From 09e9bf1f1a572e33c9234e12496ac013606baab0 Mon Sep 17 00:00:00 2001 From: Eryn Wells Date: Sat, 13 Oct 2018 12:40:53 -0700 Subject: [PATCH] First pass at a marching squares idea --- Metaballs.xcodeproj/project.pbxproj | 6 +++ MetaballsKit/MarchingSquares.swift | 64 +++++++++++++++++++++++++++++ 2 files changed, 70 insertions(+) create mode 100644 MetaballsKit/MarchingSquares.swift diff --git a/Metaballs.xcodeproj/project.pbxproj b/Metaballs.xcodeproj/project.pbxproj index e54c93e..84e6343 100644 --- a/Metaballs.xcodeproj/project.pbxproj +++ b/Metaballs.xcodeproj/project.pbxproj @@ -46,6 +46,8 @@ C0FF7CBC216B002E0081B781 /* PreferencesViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C091616F1F3F5AE6009C4263 /* PreferencesViewController.swift */; }; C0FF7CBF216B00570081B781 /* MetalKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0FF7CBD216B00570081B781 /* MetalKit.framework */; }; C0FF7CC0216B00570081B781 /* Metal.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0FF7CBE216B00570081B781 /* Metal.framework */; }; + C0FF7CC2217020820081B781 /* MarchingSquares.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0FF7CC1217020820081B781 /* MarchingSquares.swift */; }; + C0FF7CC3217020820081B781 /* MarchingSquares.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0FF7CC1217020820081B781 /* MarchingSquares.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -105,6 +107,7 @@ C0FF7CB1216AFD890081B781 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C0FF7CBD216B00570081B781 /* MetalKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MetalKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/MetalKit.framework; sourceTree = DEVELOPER_DIR; }; C0FF7CBE216B00570081B781 /* Metal.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Metal.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Metal.framework; sourceTree = DEVELOPER_DIR; }; + C0FF7CC1217020820081B781 /* MarchingSquares.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarchingSquares.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -203,6 +206,7 @@ isa = PBXGroup; children = ( C0BBE3A31F2E81C700E68524 /* Metaballs.swift */, + C0FF7CC1217020820081B781 /* MarchingSquares.swift */, C0CE7BFF1F362C3F001516B6 /* Geometry.swift */, C0DF1D781F3789DC0038B0A0 /* Memory.swift */, C0FF7C9C216A6DE00081B781 /* Math.swift */, @@ -433,6 +437,7 @@ C0FF7C992168062C0081B781 /* Shaders.metal in Sources */, C0FF7C9A2168062C0081B781 /* Preferences.swift in Sources */, C0FF7C9E216A6DE00081B781 /* Math.swift in Sources */, + C0FF7CC3217020820081B781 /* MarchingSquares.swift in Sources */, C0FF7C972168062C0081B781 /* Memory.swift in Sources */, C0FF7C9B2168062C0081B781 /* PreferencesViewController.swift in Sources */, C0B906E91F455D1A00B5F89B /* MetaballsSaverView.swift in Sources */, @@ -456,6 +461,7 @@ C0FF7C932168062B0081B781 /* Preferences.swift in Sources */, C0BBE36B1F2E816500E68524 /* AppDelegate.swift in Sources */, C0FF7C9D216A6DE00081B781 /* Math.swift in Sources */, + C0FF7CC2217020820081B781 /* MarchingSquares.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/MetaballsKit/MarchingSquares.swift b/MetaballsKit/MarchingSquares.swift new file mode 100644 index 0000000..54e6db6 --- /dev/null +++ b/MetaballsKit/MarchingSquares.swift @@ -0,0 +1,64 @@ +// +// MarchingSquares.swift +// Metaballs +// +// Created by Eryn Wells on 10/11/18. +// Copyright © 2018 Eryn Wells. All rights reserved. +// + +import Foundation +import Metal + +class MarchingSquares { + private var field: Field + private var sampleGridSize: Size + + /// Samples of the field's current state. + private(set) var samples: MTLTexture? + /// Indexes of geometry to render. + private(set) var indexes: MTLTexture? + + init(field: Field) { + self.field = field + sampleGridSize = Size(16) + } + + func setupMetal(withDevice device: MTLDevice) { + let xSamples = Int(field.size.x / sampleGridSize.x) + let ySamples = Int(field.size.y / sampleGridSize.y) + + let samplesDesc = MTLTextureDescriptor() + samplesDesc.textureType = .type2D + samplesDesc.width = xSamples + samplesDesc.height = ySamples + samplesDesc.pixelFormat = .depth32Float + samples = device.makeTexture(descriptor: samplesDesc) + + let indexesDesc = MTLTextureDescriptor() + indexesDesc.textureType = .type2D + indexesDesc.width = xSamples - 1 + indexesDesc.height = ySamples - 1 + indexesDesc.pixelFormat = .a8Unorm + indexes = device.makeTexture(descriptor: indexesDesc) + } + + func sampleField() { + guard let samples = samples else { return } + + let xSamples = Int(field.size.x / sampleGridSize.x) + let ySamples = Int(field.size.y / sampleGridSize.y) + for xSample in 0...stride + samples.replace(region: region, mipmapLevel: 0, withBytes: sample, bytesPerRow: bytesPerRow) + } + } + } +}