Skip to content

Commit

Permalink
Fix window orientations
Browse files Browse the repository at this point in the history
  • Loading branch information
JerryLingjieMei authored and pvl-bot committed Oct 18, 2024
1 parent fb2905c commit e149a7b
Show file tree
Hide file tree
Showing 6 changed files with 22 additions and 6 deletions.
2 changes: 1 addition & 1 deletion infinigen/assets/utils/shapes.py
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ def obj2polygon(obj):
for p in obj.data.polygons
]
)
return shapely.make_valid(shapely.simplify(p, 1e-6))
return shapely.ops.orient(shapely.make_valid(shapely.simplify(p, 1e-6)))


def buffer(p, distance):
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,7 +150,7 @@ def canonicalize(self, p):
break
if not is_valid_polygon(p):
raise NotImplementedError("Invalid polygon")
return p
return orient(p)
except AttributeError:
raise NotImplementedError("Invalid multi polygon")

Expand Down
6 changes: 4 additions & 2 deletions infinigen/core/constraints/example_solver/room/contour.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,12 +142,14 @@ def decorate(self, state):
quad_segs = (
1 if corner_func == "sharp" else np.random.randint(4, 7)
)
exterior_ = (
exterior_ = self.constants.canonicalize(
exterior.difference(cutter)
.union(shapely.Point(q).buffer(length, quad_segs=quad_segs))
.buffer(0)
)
new = state[k].polygon.intersection(exterior_).buffer(0)
new = self.constants.canonicalize(
state[k].polygon.intersection(exterior_).buffer(0)
)
if all(
new.buffer(-m + 1e-2).geom_type == "Polygon"
for m in np.linspace(0, 0.75, 4)
Expand Down
4 changes: 3 additions & 1 deletion infinigen/core/constraints/example_solver/room/solidifier.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@
from infinigen.core.util.random import random_general as rg

from .base import RoomGraph, room_type, valid_rooms
from .utils import mls_ccw

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -210,7 +211,8 @@ def solidify(self, state):
}
exterior = next(k for k in state.objs if room_type(k) == Semantics.Exterior)
exterior_edges = {
r.target_name: canonicalize_mls(r.value) for r in state[exterior].relations
r.target_name: mls_ccw(canonicalize_mls(r.value), state, r.target_name)
for r in state[exterior].relations
}
exterior_buffer = shapely.simplify(
state[exterior].polygon.buffer(-wt / 2 - _eps, join_style="mitre"), 1e-3
Expand Down
12 changes: 12 additions & 0 deletions infinigen/core/constraints/example_solver/room/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,18 @@ def update_exterior(state: State, i: str):
r.value = MultiLineString(v)


def mls_ccw(mls: MultiLineString, state: State, i: str):
exterior = state[i].polygon.exterior
coords = np.array(exterior.coords[:-1])
mls_ = []
for ls in mls.geoms:
u, v = ls.coords[:2]
x = np.argmin(np.linalg.norm(coords - np.array(u)[np.newaxis], axis=-1))
y = np.argmin(np.linalg.norm(coords - np.array(v)[np.newaxis], axis=-1))
mls_.append(ls if x < y else shapely.reverse(ls))
return MultiLineString(mls_)


def update_staircase(state: State, i: str):
pholder = room_name(Semantics.Staircase, room_level(i))
r = next(r for r in state[pholder].relations if r.target_name == i)
Expand Down
2 changes: 1 addition & 1 deletion infinigen/core/constraints/example_solver/state_def.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ def __repr__(self):
obj = self.obj
tags = self.tags
relations = self.relations
return f"{self.__class__.__name__}(obj.name={obj.name if obj is not None else obj.name}, polygon={self.polygon}, {tags=}, {relations=})"
return f"{self.__class__.__name__}(obj.name={obj.name if obj is not None else None}, polygon={self.polygon}, {tags=}, {relations=})"


@dataclass
Expand Down

0 comments on commit e149a7b

Please sign in to comment.