diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index ba822619..b21969af 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -452,27 +452,39 @@ void V_TickForever(WaveLaneCtx *lane) frame->draw_cursor = MulXformV2(frame->ui_to_draw_xf, frame->ui_cursor); frame->world_cursor = MulXformV2(frame->ui_to_world_xf, frame->ui_cursor); - frame->ui_selection_start = frame->ui_cursor; + frame->world_selection_start = frame->world_cursor; if (frame->is_editing) { + b32 m1_held = frame->held_buttons[Button_M1]; + b32 m2_held = frame->held_buttons[Button_M2]; frame->selection_mode = V_SelectionMode_Tile; - frame->is_selecting = frame->held_buttons[Button_M1]; + if (m1_held) + { + frame->is_selecting = 1; + frame->equipped_tile = S_TileKind_Floor; + } + else if (m2_held) + { + frame->is_selecting = 1; + frame->equipped_tile = S_TileKind_None; + } + if (frame->is_selecting && last_frame->is_selecting) { - frame->ui_selection_start = last_frame->ui_selection_start; + frame->world_selection_start = last_frame->world_selection_start; } } - frame->ui_selection.p0.x = MinF32(last_frame->ui_cursor.x, last_frame->ui_selection_start.x); - frame->ui_selection.p0.y = MinF32(last_frame->ui_cursor.y, last_frame->ui_selection_start.y); - frame->ui_selection.p1.x = MaxF32(last_frame->ui_cursor.x, last_frame->ui_selection_start.x); - frame->ui_selection.p1.y = MaxF32(last_frame->ui_cursor.y, last_frame->ui_selection_start.y); + frame->world_selection.p0.x = MinF32(frame->world_cursor.x, frame->world_selection_start.x); + frame->world_selection.p0.y = MinF32(frame->world_cursor.y, frame->world_selection_start.y); + frame->world_selection.p1.x = MaxF32(frame->world_cursor.x, frame->world_selection_start.x); + frame->world_selection.p1.y = MaxF32(frame->world_cursor.y, frame->world_selection_start.y); - frame->draw_selection.p0 = MulXformV2(last_frame->ui_to_draw_xf, frame->ui_selection.p0); - frame->draw_selection.p1 = MulXformV2(last_frame->ui_to_draw_xf, frame->ui_selection.p1); + frame->ui_selection.p0 = MulXformV2(frame->world_to_ui_xf, frame->world_selection.p0); + frame->ui_selection.p1 = MulXformV2(frame->world_to_ui_xf, frame->world_selection.p1); - frame->world_selection.p0 = MulXformV2(last_frame->ui_to_world_xf, frame->ui_selection.p0); - frame->world_selection.p1 = MulXformV2(last_frame->ui_to_world_xf, frame->ui_selection.p1); + frame->draw_selection.p0 = MulXformV2(frame->world_to_draw_xf, frame->world_selection.p0); + frame->draw_selection.p1 = MulXformV2(frame->world_to_draw_xf, frame->world_selection.p1); ////////////////////////////// //- Place tiles @@ -483,14 +495,15 @@ void V_TickForever(WaveLaneCtx *lane) { if (last_frame->selection_mode == V_SelectionMode_Tile) { + /* TODO: Fix clamp when both start & end are outside of world */ Rng2I32 tile_range = Zi; - tile_range.p0 = S_TilePosFromWorldPos(frame->world_selection.p0); - tile_range.p1 = S_TilePosFromWorldPos(frame->world_selection.p1); + tile_range.p0 = S_TilePosFromWorldPos(last_frame->world_selection.p0); + tile_range.p1 = S_TilePosFromWorldPos(last_frame->world_selection.p1); tile_range.p1 = AddVec2I32(tile_range.p1, VEC2I32(1, 1)); S_Cmd *cmd = V_PushSimCmd(S_CmdKind_Tile); cmd->tile_placement.placement_kind = S_TilePlacementKind_Range; - cmd->tile_placement.tile_kind = S_TileKind_Floor; + cmd->tile_placement.tile_kind = last_frame->equipped_tile; cmd->tile_placement.range = tile_range; } } @@ -696,11 +709,11 @@ void V_TickForever(WaveLaneCtx *lane) case V_CmdKind_spawn: { - S_Cmd *cmd = V_PushSimCmd(S_CmdKind_Tile); - cmd->tile_placement.placement_kind = S_TilePlacementKind_Range; - cmd->tile_placement.tile_kind = S_TileKind_Wall; - cmd->tile_placement.range.p0 = VEC2I32(100, 100); - cmd->tile_placement.range.p1 = VEC2I32(110, 110); + // S_Cmd *cmd = V_PushSimCmd(S_CmdKind_Tile); + // cmd->tile_placement.placement_kind = S_TilePlacementKind_Range; + // cmd->tile_placement.tile_kind = S_TileKind_Wall; + // cmd->tile_placement.range.p0 = VEC2I32(100, 100); + // cmd->tile_placement.range.p1 = VEC2I32(110, 110); // cmd->tile_placement.range.p0 = VEC2I32(2, 2); // cmd->tile_placement.range.p1 = VEC2I32(5, 5); } break; @@ -710,7 +723,6 @@ void V_TickForever(WaveLaneCtx *lane) ////////////////////////////// //- Compute movement & look - if (!frame->is_editing) { Vec2 move = Zi; { @@ -725,8 +737,19 @@ void V_TickForever(WaveLaneCtx *lane) Vec2 center = MulXformV2(player->xf, player->local_shape.centroid); look = SubVec2(frame->world_cursor, center); } - frame->move = move; - frame->look = look; + if (frame->is_editing) + { + if (!frame->is_panning) + { + f32 edit_move_speed = 15.0 * MaxF32(frame->edit_camera_zoom, min_zoom); + frame->edit_camera_pos = AddVec2(frame->edit_camera_pos, MulVec2(move, edit_move_speed * frame->dt)); + } + } + else + { + frame->move = move; + frame->look = look; + } } /* Push control cmd */ @@ -830,6 +853,8 @@ void V_TickForever(WaveLaneCtx *lane) params.draw_to_world_xf = frame->draw_to_world_xf; params.selection_mode = frame->selection_mode; + params.equipped_tile = frame->equipped_tile; + params.ui_cursor = frame->ui_cursor; params.draw_cursor = frame->draw_cursor; params.world_cursor = frame->world_cursor; diff --git a/src/pp/pp_vis/pp_vis_core.h b/src/pp/pp_vis/pp_vis_core.h index 296d9129..99ac13d0 100644 --- a/src/pp/pp_vis/pp_vis_core.h +++ b/src/pp/pp_vis/pp_vis_core.h @@ -111,12 +111,13 @@ Struct(V_Frame) /* Editor state */ V_EditMode edit_mode; + S_TileKind equipped_tile; /* Editor */ b32 is_selecting; b32 is_panning; V_SelectionMode selection_mode; - Vec2 ui_selection_start; + Vec2 world_selection_start; Vec2 edit_camera_pos; f32 edit_camera_zoom; diff --git a/src/pp/pp_vis/pp_vis_shaders.cgh b/src/pp/pp_vis/pp_vis_shaders.cgh index 0f81c253..ccd0d074 100644 --- a/src/pp/pp_vis/pp_vis_shaders.cgh +++ b/src/pp/pp_vis/pp_vis_shaders.cgh @@ -19,6 +19,8 @@ Struct(V_DParams) Xform draw_to_world_xf; V_SelectionMode selection_mode; + S_TileKind equipped_tile; + Vec2 ui_cursor; Vec2 draw_cursor; Vec2 world_cursor; diff --git a/src/pp/pp_vis/pp_vis_shaders.g b/src/pp/pp_vis/pp_vis_shaders.g index 56bb82e7..4e1deb6e 100644 --- a/src/pp/pp_vis/pp_vis_shaders.g +++ b/src/pp/pp_vis/pp_vis_shaders.g @@ -218,15 +218,18 @@ VertexShader(V_OverlayVS, V_OverlayPSInput) PixelShader(V_OverlayPS, V_OverlayPSOutput, V_OverlayPSInput input) { V_DParams params = G_Dereference(V_ShaderConst_Params)[0]; + Texture2D tiles = G_Dereference(params.tiles); Vec2 screen_pos = input.sv_position.xy; Vec4 result = 0; Vec2 world_pos = mul(params.draw_to_world_xf, Vec3(screen_pos, 1)); Vec2I32 tile_pos = S_TilePosFromWorldPos(world_pos); + S_TileKind equipped_tile = params.equipped_tile; f32 half_thickness = 1; Vec4 border_color = LinearFromSrgb(Vec4(1, 1, 1, 1)); // Vec4 inner_color = LinearFromSrgb(Vec4(0.4, 0.4, 0.4, 0.25)); + Vec4 inner_color = LinearFromSrgb(Vec4(0.4, 0.8, 0.4, 0.6)); Rng2 screen_selection = params.draw_selection; @@ -245,11 +248,11 @@ PixelShader(V_OverlayPS, V_OverlayPSOutput, V_OverlayPSInput input) dist = min(dist, screen_selection.p1.y - screen_pos.y); dist = -dist; - if (dist > -half_thickness && dist < half_thickness) - { - result = border_color; - } - else + // if (dist > -half_thickness && dist < half_thickness) + // { + // result = border_color; + // } + // else { if (world_pos.x > -(S_WorldSize / 2) && world_pos.y > -(S_WorldSize / 2) &&