Skip to content

Commit 53c7116

Browse files
committed
Fix mesh member lookup
1 parent 989d4cc commit 53c7116

File tree

3 files changed

+78
-15
lines changed

3 files changed

+78
-15
lines changed

ShapeScript/Geometry.swift

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -614,8 +614,15 @@ private extension Collection where Element == Path {
614614

615615
public extension Geometry {
616616
var hasMesh: Bool {
617-
(path == nil && mesh?.polygons.isEmpty == false) ||
618-
children.contains(where: { $0.hasMesh })
617+
switch type {
618+
case .camera, .light, .path:
619+
return false
620+
case .cone, .cylinder, .sphere, .cube,
621+
.extrude, .lathe, .loft, .fill, .hull,
622+
.union, .difference, .intersection, .xor, .stencil,
623+
.group, .mesh:
624+
return true
625+
}
619626
}
620627

621628
var objectCount: Int {

ShapeScript/Symbols.swift

Lines changed: 19 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -316,12 +316,6 @@ extension Value {
316316
members.append("last")
317317
}
318318
members += ["count", "allButFirst", "allButLast"]
319-
if let string = self.as(.string) {
320-
members += string.members
321-
}
322-
if !members.contains("alpha"), let color = self.as(.color) {
323-
members += color.members
324-
}
325319
if let vector = self.as(.vector) {
326320
members += vector.members
327321
}
@@ -331,11 +325,24 @@ extension Value {
331325
if let rotation = self.as(.rotation) {
332326
members += rotation.members
333327
}
328+
if values.count == 1 {
329+
return members + values[0].members
330+
}
331+
if let string = self.as(.string) {
332+
members += string.members
333+
}
334+
if !members.contains("alpha"), let color = self.as(.color) {
335+
members += color.members
336+
}
334337
return members
335338
case .range:
336339
return ["start", "end", "step"]
337-
case .mesh:
338-
return ["name", "bounds", "polygons"]
340+
case let .mesh(geometry):
341+
var members = ["name", "bounds"]
342+
if geometry.hasMesh {
343+
members.append("polygons")
344+
}
345+
return members
339346
case .path, .polygon:
340347
return ["bounds", "points"]
341348
case let .point(point):
@@ -389,9 +396,6 @@ extension Value {
389396
default: return nil
390397
}
391398
case let .tuple(values):
392-
if values.count == 1, case .tuple = values[0] {
393-
return values[0][name]
394-
}
395399
switch name {
396400
case "last":
397401
return values.last
@@ -415,6 +419,9 @@ extension Value {
415419
if let index = name.ordinalIndex {
416420
return index < values.count ? values[index] : nil
417421
}
422+
if values.count == 1 {
423+
return values[0][name]
424+
}
418425
return nil
419426
}
420427
case let .range(range):
@@ -430,7 +437,7 @@ extension Value {
430437
return .string(geometry.name ?? "")
431438
case "bounds":
432439
return .bounds(geometry.bounds)
433-
case "polygons":
440+
case "polygons" where geometry.hasMesh:
434441
_ = geometry.build { true }
435442
let polygons = (geometry.mesh?.polygons ?? [])
436443
return .tuple(polygons.map { .polygon($0) })

ShapeScriptTests/InterpreterTests.swift

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3378,7 +3378,56 @@ class InterpreterTests: XCTestCase {
33783378
XCTAssertEqual(delegate.log, [1])
33793379
}
33803380

3381-
func testMeshComponentLookup() {
3381+
func testMeshBoundsLookup() {
3382+
let program = """
3383+
print (fill square).bounds
3384+
"""
3385+
let delegate = TestDelegate()
3386+
XCTAssertNoThrow(try evaluate(parse(program), delegate: delegate))
3387+
XCTAssertEqual(delegate.log, [Bounds(
3388+
min: .init(-0.5, -0.5, 0),
3389+
max: .init(0.5, 0.5, 0)
3390+
)])
3391+
}
3392+
3393+
func testMeshPolygonsLookup() throws {
3394+
let program = """
3395+
print (fill square).polygons
3396+
"""
3397+
let delegate = TestDelegate()
3398+
XCTAssertNoThrow(try evaluate(parse(program), delegate: delegate))
3399+
XCTAssertEqual(delegate.log, Mesh.fill(.square()).polygons)
3400+
}
3401+
3402+
func testPathPolygonsLookup() throws {
3403+
let program = """
3404+
print square.polygons
3405+
"""
3406+
XCTAssertThrowsError(try evaluate(parse(program), delegate: nil)) { error in
3407+
let error = try? XCTUnwrap(error as? RuntimeError)
3408+
XCTAssertEqual(error?.message, "Unknown path member property 'polygons'")
3409+
guard case .unknownMember("polygons", of: "path", _)? = error?.type else {
3410+
XCTFail()
3411+
return
3412+
}
3413+
}
3414+
}
3415+
3416+
func testCameraPolygonsLookup() throws {
3417+
let program = """
3418+
print camera.polygons
3419+
"""
3420+
XCTAssertThrowsError(try evaluate(parse(program), delegate: nil)) { error in
3421+
let error = try? XCTUnwrap(error as? RuntimeError)
3422+
XCTAssertEqual(error?.message, "Unknown mesh member property 'polygons'")
3423+
guard case .unknownMember("polygons", of: "mesh", _)? = error?.type else {
3424+
XCTFail()
3425+
return
3426+
}
3427+
}
3428+
}
3429+
3430+
func testInvalidMeshComponentLookup() {
33823431
let program = """
33833432
print (fill { circle }).x
33843433
"""

0 commit comments

Comments
 (0)