Fix the build; test box subdivisions

This commit is contained in:
Eryn Wells 2018-11-10 10:30:07 -05:00
parent 8e2a873edf
commit cd48797fa9
3 changed files with 62 additions and 13 deletions

View file

@ -591,6 +591,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MTL_HEADER_SEARCH_PATHS = Terrain2;
PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.Terrain2; PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.Terrain2;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";
@ -613,6 +614,7 @@
"$(inherited)", "$(inherited)",
"@executable_path/../Frameworks", "@executable_path/../Frameworks",
); );
MTL_HEADER_SEARCH_PATHS = Terrain2;
PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.Terrain2; PRODUCT_BUNDLE_IDENTIFIER = me.erynwells.Terrain2;
PRODUCT_NAME = "$(TARGET_NAME)"; PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = ""; PROVISIONING_PROFILE_SPECIFIER = "";

View file

@ -132,54 +132,68 @@ public class DiamondSquareAlgorithm: Algorithm {
let origin: Point let origin: Point
let size: Size let size: Size
public init(origin o: Point, size s: Size) { init(origin o: Point, size s: Size) {
origin = o origin = o
size = s size = s
} }
public var corners: [Point] { var corners: [Point] {
return [northwest, southwest, northeast, northwest] return [northwest, southwest, northeast, northwest]
} }
public var sideMidpoints: [Point] { var sideMidpoints: [Point] {
return [north, west, south, east] return [north, west, south, east]
} }
public var north: Point { var north: Point {
return (x: origin.x + (size.w / 2 + 1), y: origin.y) return (x: origin.x + (size.w / 2 + 1), y: origin.y)
} }
public var west: Point { var west: Point {
return (x: origin.x, y: origin.y + (size.h / 2 + 1)) return (x: origin.x, y: origin.y + (size.h / 2 + 1))
} }
public var south: Point { var south: Point {
return (x: origin.x + (size.w / 2 + 1), y: origin.y + size.h) return (x: origin.x + (size.w / 2 + 1), y: origin.y + size.h)
} }
public var east: Point { var east: Point {
return (x: origin.x + size.w, y: origin.y + (size.h / 2 + 1)) return (x: origin.x + size.w, y: origin.y + (size.h / 2 + 1))
} }
public var northwest: Point { var northwest: Point {
return origin return origin
} }
public var southwest: Point { var southwest: Point {
return (x: origin.x, y: origin.y + size.h) return (x: origin.x, y: origin.y + size.h)
} }
public var northeast: Point { var northeast: Point {
return (x: origin.x + size.w, y: origin.y) return (x: origin.x + size.w, y: origin.y)
} }
public var southeast: Point { var southeast: Point {
return (x: origin.x + size.w, y: origin.y + size.h) return (x: origin.x + size.w, y: origin.y + size.h)
} }
public var midpoint: Point { var midpoint: Point {
return (x: origin.x + (size.w / 2 + 1), y: origin.y + (size.h / 2 + 1)) return (x: origin.x + (size.w / 2 + 1), y: origin.y + (size.h / 2 + 1))
} }
var subdivisions: [Box] {
guard size.w > 1 && size.h > 1 else {
return []
}
let midp = midpoint
let newSize = (w: midp.x - origin.x, h: midp.y - origin.y)
return [
Box(origin: origin, size: newSize),
Box(origin: (origin.x + newSize.w, origin.y), size: newSize),
Box(origin: (origin.x, origin.y + newSize.h), size: newSize),
Box(origin: (origin.x + newSize.w, origin.y + newSize.h), size: newSize)
]
}
} }
let name = "Diamond-Square" let name = "Diamond-Square"
@ -278,6 +292,15 @@ public class DiamondSquareAlgorithm: Algorithm {
texture.replace(region: region, mipmapLevel: 0, withBytes: heightMap, bytesPerRow: MemoryLayout<Float>.stride * size.width) texture.replace(region: region, mipmapLevel: 0, withBytes: heightMap, bytesPerRow: MemoryLayout<Float>.stride * size.width)
} }
private func breadthFirstSearch(ofGridWithSize size: MTLSize, visit: (Box) -> (Void)) {
var queue = [Box(origin: (0, 0), size: (size.width, size.height))]
while queue.count > 0 {
let box = queue.removeFirst()
visit(box)
queue.append(contentsOf: box.subdivisions)
}
}
// MARK: Algorithm // MARK: Algorithm
var outTexture: MTLTexture { var outTexture: MTLTexture {
@ -291,6 +314,12 @@ public class DiamondSquareAlgorithm: Algorithm {
} }
} }
extension DiamondSquareAlgorithm.Box: Equatable {
public static func == (lhs: DiamondSquareAlgorithm.Box, rhs: DiamondSquareAlgorithm.Box) -> Bool {
return lhs.origin == rhs.origin && lhs.size == rhs.size
}
}
/// Implementation of the Circles algorithm. /// Implementation of the Circles algorithm.
//class CirclesAlgorithm: Algorithm { //class CirclesAlgorithm: Algorithm {
// static let name = "Circles" // static let name = "Circles"

View file

@ -7,7 +7,15 @@
// //
import XCTest import XCTest
import Terrain2 @testable import Terrain2
public typealias Box = DiamondSquareAlgorithm.Box
public typealias Point = DiamondSquareAlgorithm.Box.Point
public typealias Size = DiamondSquareAlgorithm.Box.Size
class DiamondSquareBFSTests: XCTestCase {
}
class DiamondSquareBoxTests: XCTestCase { class DiamondSquareBoxTests: XCTestCase {
func testNorthwest() { func testNorthwest() {
@ -49,4 +57,14 @@ class DiamondSquareBoxTests: XCTestCase {
XCTAssertEqual(midpoint.x, 6) XCTAssertEqual(midpoint.x, 6)
XCTAssertEqual(midpoint.y, 7) XCTAssertEqual(midpoint.y, 7)
} }
func testSubdivision() {
let box = Box(origin: (x: 3, y: 4), size: (w: 5, h: 5))
let subdivs = box.subdivisions
XCTAssertEqual(subdivs.count, 4)
XCTAssertEqual(subdivs[0], Box(origin: (x: 3, y: 4), size: (w: 3, h: 3)))
XCTAssertEqual(subdivs[1], Box(origin: (x: 6, y: 4), size: (w: 3, h: 3)))
XCTAssertEqual(subdivs[2], Box(origin: (x: 3, y: 7), size: (w: 3, h: 3)))
XCTAssertEqual(subdivs[3], Box(origin: (x: 6, y: 7), size: (w: 3, h: 3)))
}
} }