···301301 c_top := py - SIZE11;
302302 c_bot := py + SIZE11;
303303304304- -- Swept horizontal overlap: union of prev and new extents along motion axis
304304+ -- Swept overlap: edge-crossing checks (prev and new extents straddle the face)
305305 if vx(9) = '0' then
306306- x_overlap := (c_right >= OBS_L(obs_i)) and (c_prev_left <= OBS_R(obs_i));
306306+ x_overlap := (c_right >= OBS_L(obs_i)) and (c_prev_right <= OBS_L(obs_i));
307307 else
308308- x_overlap := (c_prev_right >= OBS_L(obs_i)) and (c_left <= OBS_R(obs_i));
308308+ x_overlap := (c_left <= OBS_R(obs_i)) and (c_prev_left >= OBS_R(obs_i));
309309 end if;
310310311311- -- Swept vertical overlap
312311 if vy(9) = '0' then
313313- y_overlap := (c_bot >= OBS_T(obs_i)) and (c_prev_top <= OBS_B(obs_i));
312312+ y_overlap := (c_bot >= OBS_T(obs_i)) and (c_prev_bot <= OBS_T(obs_i));
314313 else
315315- y_overlap := (c_prev_bot >= OBS_T(obs_i)) and (c_top <= OBS_B(obs_i));
314314+ y_overlap := (c_top <= OBS_B(obs_i)) and (c_prev_top >= OBS_B(obs_i));
316315 end if;
317316318317 if x_overlap and y_overlap then
+2-10
renderer.vhd
···2626 char_height : in std_logic_vector(9 downto 0);
2727 cam_x : in std_logic_vector(10 downto 0);
2828 cam_y : in std_logic_vector(10 downto 0);
2929- vel_x_in : in std_logic_vector(9 downto 0);
3030- vel_y_in : in std_logic_vector(9 downto 0);
3129 trail_on_in : in std_logic;
3230 red : out std_logic;
3331 green : out std_logic;
···4846 signal wr : std_logic_vector(10 downto 0);
49475048 signal char_on, ground_on, wall_on, ceiling_on, obs_on : std_logic;
5151- signal arrow_on : std_logic := '0'; -- disabled
52495350begin
5451···90879188 end process render;
92899393- -- Velocity vector arrow disabled — arrow_on held '0' by signal initializer
9494-9590 -- ----------------------------------------------------------------
9691 -- Color output with priority
9792 -- ----------------------------------------------------------------
9898- color : process(char_on, ground_on, wall_on, ceiling_on,
9999- obs_on, arrow_on, trail_on_in)
9393+ color : process(char_on, ground_on, wall_on, ceiling_on, obs_on, trail_on_in)
10094 begin
101101- if arrow_on = '1' then
102102- red <= '1'; green <= '1'; blue <= '1'; -- White
103103- elsif char_on = '1' then
9595+ if char_on = '1' then
10496 red <= '1'; green <= '0'; blue <= '0'; -- Red
10597 elsif obs_on = '1' then
10698 red <= '1'; green <= '1'; blue <= '0'; -- Yellow
+4-4
visualizer.py
···249249 c_top = py - SIZE; c_bot = py + SIZE
250250251251 if to_signed(vx) >= 0:
252252- x_overlap = c_right >= ol and prev_left <= orr
252252+ x_overlap = c_right >= ol and prev_right <= ol
253253 else:
254254- x_overlap = prev_right >= ol and c_left <= orr
254254+ x_overlap = c_left <= orr and prev_left >= orr
255255 if to_signed(vy) >= 0:
256256- y_overlap = c_bot >= ot and prev_top <= ob
256256+ y_overlap = c_bot >= ot and prev_bot <= ot
257257 else:
258258- y_overlap = prev_bot >= ot and c_top <= ob
258258+ y_overlap = c_top <= ob and prev_top >= ob
259259260260 if x_overlap and y_overlap:
261261 if prev_bot <= ot: