Fix frontend input release and vegetation proxies

This commit is contained in:
2026-05-21 20:44:02 +00:00
parent 03dbcbc5f8
commit 3f27be7f88
16 changed files with 120 additions and 46 deletions
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+68 -13
View File
@@ -847,6 +847,50 @@ def add_leaf_card(vertices, faces, center, width, height, yaw_degrees, lean_degr
faces.append((base + 0, base + 1, base + 2, base + 3)) faces.append((base + 0, base + 1, base + 2, base + 3))
def add_irregular_leaf_card(vertices, faces, center, width, height, yaw_degrees, lean_degrees=0.0, pinch=0.18):
yaw = math.radians(yaw_degrees)
lean = math.radians(lean_degrees)
right = (math.cos(yaw) * width * 0.5, math.sin(yaw) * width * 0.5, 0.0)
up_offset = (math.sin(lean) * height * 0.35, 0.0, math.cos(lean) * height)
cx, cy, cz = center
base = len(vertices)
vertices.extend(
[
(cx - right[0] * 0.86, cy - right[1] * 0.86, cz),
(cx + right[0] * 0.92, cy + right[1] * 0.92, cz + height * 0.08),
(cx + right[0] * pinch + up_offset[0], cy + right[1] * pinch + up_offset[1], cz + up_offset[2]),
(cx - right[0] * 0.68 + up_offset[0] * 0.55, cy - right[1] * 0.68 + up_offset[1] * 0.55, cz + up_offset[2] * 0.58),
]
)
faces.append((base + 0, base + 1, base + 2, base + 3))
def add_tapered_cylinder(vertices, faces, base_center, height, base_radius, top_radius, segments=9, yaw_offset_degrees=0.0, top_offset=(0.0, 0.0)):
bx, by, bz = base_center
yaw_offset = math.radians(yaw_offset_degrees)
base_indices = []
top_indices = []
for index in range(segments):
angle = yaw_offset + (math.tau * index) / segments
cos_a = math.cos(angle)
sin_a = math.sin(angle)
base_indices.append(len(vertices))
vertices.append((bx + cos_a * base_radius, by + sin_a * base_radius, bz))
top_indices.append(len(vertices))
vertices.append((bx + top_offset[0] + cos_a * top_radius, by + top_offset[1] + sin_a * top_radius, bz + height))
base_center_index = len(vertices)
vertices.append((bx, by, bz))
top_center_index = len(vertices)
vertices.append((bx + top_offset[0], by + top_offset[1], bz + height))
for index in range(segments):
next_index = (index + 1) % segments
faces.append((base_indices[index], base_indices[next_index], top_indices[next_index], top_indices[index]))
faces.append((base_center_index, base_indices[index], base_indices[next_index]))
faces.append((top_center_index, top_indices[next_index], top_indices[index]))
def add_low_poly_ellipsoid(vertices, faces, center, radius_x, radius_y, radius_z, segments=10): def add_low_poly_ellipsoid(vertices, faces, center, radius_x, radius_y, radius_z, segments=10):
cx, cy, cz = center cx, cy, cz = center
top_index = len(vertices) top_index = len(vertices)
@@ -876,33 +920,44 @@ def add_low_poly_ellipsoid(vertices, faces, center, radius_x, radius_y, radius_z
def coastal_oak_mesh(): def coastal_oak_mesh():
vertices = [] vertices = []
faces = [] faces = []
add_box(vertices, faces, (0.0, 0.0, 140.0), (36.0, 30.0, 280.0)) add_tapered_cylinder(vertices, faces, (0.0, 0.0, 0.0), 275.0, 23.0, 12.0, 11, 8.0, (18.0, -10.0))
add_box(vertices, faces, (-34.0, 14.0, 250.0), (18.0, 16.0, 125.0)) add_tapered_cylinder(vertices, faces, (-8.0, 2.0, 180.0), 145.0, 12.0, 6.0, 8, 21.0, (-86.0, 36.0))
add_box(vertices, faces, (42.0, -12.0, 275.0), (18.0, 16.0, 115.0)) add_tapered_cylinder(vertices, faces, (12.0, -4.0, 205.0), 150.0, 11.0, 5.5, 8, 12.0, (92.0, -42.0))
add_low_poly_ellipsoid(vertices, faces, (0.0, 0.0, 350.0), 150.0, 125.0, 105.0) add_tapered_cylinder(vertices, faces, (5.0, 0.0, 235.0), 120.0, 9.0, 5.0, 8, 44.0, (22.0, 90.0))
add_low_poly_ellipsoid(vertices, faces, (-95.0, 30.0, 320.0), 105.0, 82.0, 78.0) for center, rx, ry, rz, segments in (
add_low_poly_ellipsoid(vertices, faces, (95.0, -20.0, 330.0), 112.0, 88.0, 82.0) ((0.0, 4.0, 362.0), 165.0, 126.0, 86.0, 13),
((-108.0, 38.0, 330.0), 116.0, 82.0, 66.0, 11),
((105.0, -34.0, 342.0), 122.0, 88.0, 70.0, 11),
((24.0, 106.0, 330.0), 88.0, 70.0, 58.0, 9),
):
add_low_poly_ellipsoid(vertices, faces, center, rx, ry, rz, segments)
for yaw in (8.0, 52.0, 96.0, 141.0):
add_irregular_leaf_card(vertices, faces, (0.0, 0.0, 285.0), 235.0, 150.0, yaw, 6.0, 0.3)
return vertices, faces return vertices, faces
def coyote_brush_mesh(): def coyote_brush_mesh():
vertices = [] vertices = []
faces = [] faces = []
for yaw in (0.0, 35.0, 82.0, 128.0, 171.0): for yaw in (0.0, 27.0, 55.0, 88.0, 122.0, 156.0):
add_leaf_card(vertices, faces, (0.0, 0.0, 0.0), 190.0, 145.0, yaw, 8.0) add_irregular_leaf_card(vertices, faces, (0.0, 0.0, 0.0), 170.0, 132.0, yaw, 10.0, 0.24)
add_low_poly_ellipsoid(vertices, faces, (-32.0, 18.0, 78.0), 92.0, 68.0, 56.0, 8) for center, rx, ry, rz in (
add_low_poly_ellipsoid(vertices, faces, (48.0, -16.0, 70.0), 86.0, 70.0, 50.0, 8) ((-38.0, 18.0, 72.0), 88.0, 62.0, 45.0),
add_low_poly_ellipsoid(vertices, faces, (0.0, 42.0, 62.0), 78.0, 52.0, 45.0, 8) ((45.0, -22.0, 68.0), 82.0, 66.0, 42.0),
((0.0, 45.0, 62.0), 72.0, 48.0, 37.0),
((18.0, -56.0, 58.0), 62.0, 44.0, 32.0),
):
add_low_poly_ellipsoid(vertices, faces, center, rx, ry, rz, 9)
return vertices, faces return vertices, faces
def dry_grass_clump_mesh(): def dry_grass_clump_mesh():
vertices = [] vertices = []
faces = [] faces = []
for index, yaw in enumerate((0.0, 22.0, 47.0, 76.0, 111.0, 146.0, 178.0)): for index, yaw in enumerate((0.0, 16.0, 31.0, 49.0, 73.0, 97.0, 121.0, 148.0, 172.0)):
width = 18.0 + (index % 3) * 4.0 width = 18.0 + (index % 3) * 4.0
height = 95.0 + (index % 4) * 14.0 height = 95.0 + (index % 4) * 14.0
add_leaf_card(vertices, faces, (0.0, 0.0, 0.0), width, height, yaw, -5.0 + (index % 3) * 5.0) add_irregular_leaf_card(vertices, faces, (0.0, 0.0, 0.0), width, height, yaw, -8.0 + (index % 3) * 6.0, 0.08)
return vertices, faces return vertices, faces
+14 -2
View File
@@ -24,8 +24,11 @@ EXPECTED = {
"Saving World", "Saving World",
"ConsoleCommand(TEXT(\"AgrarianSaveWorld\"))", "ConsoleCommand(TEXT(\"AgrarianSaveWorld\"))",
"ConsoleCommand(TEXT(\"quit\"))", "ConsoleCommand(TEXT(\"quit\"))",
"PlayerController->SetIgnoreMoveInput(false)", "AAgrarianGamePlayerController* AgrarianPlayerController",
"PlayerController->SetIgnoreLookInput(false)", "AgrarianPlayerController->AgrarianSelectCharacter",
"AgrarianPlayerController->AgrarianCompleteFrontend",
"PlayerController->ResetIgnoreMoveInput()",
"PlayerController->ResetIgnoreLookInput()",
], ],
"AgrarianGamePlayerController.h": [ "AgrarianGamePlayerController.h": [
"ShowMvpPauseMenu", "ShowMvpPauseMenu",
@@ -40,10 +43,19 @@ EXPECTED = {
"InputComponent->BindKey(EKeys::Escape", "InputComponent->BindKey(EKeys::Escape",
"MvpFrontendWidget->IsInViewport()", "MvpFrontendWidget->IsInViewport()",
"ShowMvpPauseMenu();", "ShowMvpPauseMenu();",
"ResetIgnoreMoveInput();",
"ResetIgnoreLookInput();",
"ApplyDefaultInputMappingContexts();",
], ],
} }
FORBIDDEN = { FORBIDDEN = {
"AgrarianMvpFrontendWidget.cpp": [
"ConsoleCommand(TEXT(\"AgrarianSelectCharacter",
"ConsoleCommand(TEXT(\"AgrarianCompleteFrontend\"))",
"PlayerController->SetIgnoreMoveInput(false)",
"PlayerController->SetIgnoreLookInput(false)",
],
"AgrarianGamePlayerController.cpp": [ "AgrarianGamePlayerController.cpp": [
"BindKey(EKeys::LeftMouseButton", "BindKey(EKeys::LeftMouseButton",
], ],
@@ -2,6 +2,7 @@
#include "AgrarianMvpFrontendWidget.h" #include "AgrarianMvpFrontendWidget.h"
#include "AgrarianGamePlayerController.h"
#include "Blueprint/WidgetTree.h" #include "Blueprint/WidgetTree.h"
#include "Components/Border.h" #include "Components/Border.h"
#include "Components/Button.h" #include "Components/Button.h"
@@ -204,19 +205,25 @@ void UAgrarianMvpFrontendWidget::ReturnFromActiveScreen()
void UAgrarianMvpFrontendWidget::CompleteFrontendFlow() void UAgrarianMvpFrontendWidget::CompleteFrontendFlow()
{ {
if (APlayerController* PlayerController = GetOwningPlayer()) if (APlayerController* PlayerController = GetOwningPlayer())
{
if (AAgrarianGamePlayerController* AgrarianPlayerController = Cast<AAgrarianGamePlayerController>(PlayerController))
{ {
if (ActiveScreen == EAgrarianMvpFrontendScreen::CharacterSelection || ActiveScreen == EAgrarianMvpFrontendScreen::Loading) if (ActiveScreen == EAgrarianMvpFrontendScreen::CharacterSelection || ActiveScreen == EAgrarianMvpFrontendScreen::Loading)
{ {
PlayerController->ConsoleCommand(SelectedCharacterArchetype == EAgrarianMvpCharacterArchetype::YoungAdultFemale AgrarianPlayerController->AgrarianSelectCharacter(SelectedCharacterArchetype == EAgrarianMvpCharacterArchetype::YoungAdultFemale
? TEXT("AgrarianSelectCharacter female") ? TEXT("female")
: TEXT("AgrarianSelectCharacter male")); : TEXT("male"));
} }
PlayerController->ConsoleCommand(TEXT("AgrarianCompleteFrontend")); AgrarianPlayerController->AgrarianCompleteFrontend();
}
else
{
PlayerController->SetInputMode(FInputModeGameOnly()); PlayerController->SetInputMode(FInputModeGameOnly());
PlayerController->bShowMouseCursor = false; PlayerController->bShowMouseCursor = false;
PlayerController->SetIgnoreMoveInput(false); PlayerController->ResetIgnoreMoveInput();
PlayerController->SetIgnoreLookInput(false); PlayerController->ResetIgnoreLookInput();
}
} }
RemoveFromParent(); RemoveFromParent();