Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
89 changes: 61 additions & 28 deletions chunky/src/java/se/llbit/chunky/ui/render/tabs/EntitiesTab.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,12 @@
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Node;
import javafx.scene.control.*;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.layout.*;
import javafx.stage.FileChooser;
import se.llbit.chunky.entity.ArmorStand;
import se.llbit.chunky.entity.BeaconBeam;
Expand All @@ -45,13 +45,15 @@
import se.llbit.chunky.entity.Poseable;
import se.llbit.chunky.renderer.scene.PlayerModel;
import se.llbit.chunky.renderer.scene.Scene;
import se.llbit.chunky.ui.DoubleTextField;
import se.llbit.chunky.ui.dialogs.DialogUtils;
import se.llbit.chunky.ui.dialogs.ValidatingTextInputDialog;
import se.llbit.chunky.ui.elements.AngleAdjuster;
import se.llbit.chunky.ui.DoubleAdjuster;
import se.llbit.chunky.ui.IntegerAdjuster;
import se.llbit.chunky.ui.IntegerTextField;
import se.llbit.chunky.ui.controller.RenderControlsFxController;
import se.llbit.chunky.ui.elements.TextFieldLabelWrapper;
import se.llbit.chunky.ui.render.RenderControlsTab;
import se.llbit.chunky.world.material.BeaconBeamMaterial;
import se.llbit.fx.LuxColorPicker;
Expand Down Expand Up @@ -117,28 +119,21 @@ public String getKind() {
}
}

@FXML
private TableView<EntityData> entityTable;
@FXML
private TableColumn<EntityData, String> nameCol;
@FXML
private TableColumn<EntityData, String> kindCol;
@FXML
private Button delete;
@FXML
private Button add;
@FXML
private Button cameraToEntity;
@FXML
private Button entityToCamera;
@FXML
private Button entityToTarget;
@FXML
private Button faceCamera;
@FXML
private Button faceTarget;
@FXML
private VBox controls;
@FXML private TableView<EntityData> entityTable;
@FXML private TableColumn<EntityData, String> nameCol;
@FXML private TableColumn<EntityData, String> kindCol;
@FXML private Button delete;
@FXML private Button add;
@FXML private Button cameraToEntity;
@FXML private Button entityToCamera;
@FXML private Button entityToTarget;
@FXML private Button faceCamera;
@FXML private Button faceTarget;
@FXML private GridPane position;
@FXML private DoubleTextField posX;
@FXML private DoubleTextField posY;
@FXML private DoubleTextField posZ;
@FXML private VBox controls;

public EntitiesTab() throws IOException {
FXMLLoader loader = new FXMLLoader(getClass().getResource("EntitiesTab.fxml"));
Expand Down Expand Up @@ -422,6 +417,32 @@ else if(entity instanceof BeaconBeam) {
controls.getChildren().add(beamColor);
}

updatePositionFields(entity);
posX.valueProperty().addListener((observable, oldValue, newValue) -> {
withEntity(e -> {
Vector3 currentPosition = e.getPosition();
e.setPosition(new Vector3(newValue.doubleValue(), currentPosition.y, currentPosition.z));
});
scene.rebuildActorBvh();
});
posY.valueProperty().addListener((observable, oldValue, newValue) -> {
withEntity(e -> {
Vector3 currentPosition = e.getPosition();
e.setPosition(new Vector3(currentPosition.x, newValue.doubleValue(), currentPosition.z));
});
scene.rebuildActorBvh();
});
posZ.valueProperty().addListener((observable, oldValue, newValue) -> {
withEntity(e -> {
Vector3 currentPosition = e.getPosition();
e.setPosition(new Vector3(currentPosition.x, currentPosition.y, newValue.doubleValue()));
});
scene.rebuildActorBvh();
});

controls.getChildren().add(position);
position.setVisible(true);

DoubleAdjuster scale = new DoubleAdjuster();
scale.setName("Scale");
scale.setTooltip("Modifies entity scale.");
Expand Down Expand Up @@ -588,13 +609,15 @@ public void initialize(URL location, ResourceBundle resources) {
entityToCamera.setTooltip(new Tooltip("Move the selected entity to the location of the camera."));
entityToCamera.setOnAction(e -> withEntity(entity -> {
entity.setPosition(scene.camera().getPosition());
updatePositionFields(entity);
scene.rebuildActorBvh();
}));
entityToTarget.setTooltip(new Tooltip("Move the selected entity to the current target."));
entityToTarget.setOnAction(e -> withEntity(player -> {
Vector3 target = scene.getTargetPosition();
if (target != null) {
player.position.set(target);
updatePositionFields(player);
scene.rebuildActorBvh();
}
}));
Expand All @@ -606,8 +629,7 @@ public void initialize(URL location, ResourceBundle resources) {
scene.rebuildActorBvh();
}
}));
faceTarget
.setTooltip(new Tooltip("Makes the selected player look at the current view target."));
faceTarget.setTooltip(new Tooltip("Makes the selected player look at the current view target."));
faceTarget.setOnAction(e -> withEntity(entity -> {
Vector3 target = scene.getTargetPosition();
if (target != null && entity instanceof Poseable) {
Expand Down Expand Up @@ -636,19 +658,30 @@ private void withEntity(Consumer<Entity> consumer) {
private void withPose(Entity entity, String part, Consumer<JsonArray> consumer) {
if (entity instanceof Poseable && part != null && !part.isEmpty()) {
Poseable poseable = (Poseable) entity;
JsonArray pose = poseable.getPose().get(part).array();
JsonObject poseObject = poseable.getPose();
if (poseObject == null) {
return;
}

JsonArray pose = poseObject.get(part).array();
if (pose.size() < 3) {
// Set default pose to [0, 0, 0].
pose = new JsonArray(3);
pose.add(0);
pose.add(0);
pose.add(0);
poseable.getPose().set(part, pose);
poseObject.set(part, pose);
}
consumer.accept(pose);
}
}

private void updatePositionFields(Entity entity) {
posX.valueProperty().set(entity.position.x);
posY.valueProperty().set(entity.position.y);
posZ.valueProperty().set(entity.position.z);
}

@Override
public void setController(RenderControlsFxController controller) {
scene = controller.getRenderController().getSceneManager().getScene();
Expand Down
41 changes: 41 additions & 0 deletions chunky/src/res/se/llbit/chunky/ui/render/tabs/EntitiesTab.fxml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,13 @@
<?import javafx.scene.control.TableView?>
<?import javafx.scene.layout.HBox?>
<?import javafx.scene.layout.VBox?>
<?import se.llbit.chunky.ui.elements.TextFieldLabelWrapper?>
<?import javafx.scene.layout.GridPane?>
<?import se.llbit.chunky.ui.DoubleTextField?>
<?import javafx.scene.control.Tooltip?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.RowConstraints?>
<fx:root type="javafx.scene.control.ScrollPane" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1">
<VBox spacing="10.0">
<padding>
Expand All @@ -33,6 +40,40 @@
<Button fx:id="faceTarget" mnemonicParsing="false" text="Face target" />
</HBox>
<Separator />
<GridPane fx:id="position" hgap="6.0" vgap="10.0" visible="false">
<columnConstraints>
<ColumnConstraints hgrow="NEVER" prefWidth="70.0" />
<ColumnConstraints minWidth="20.0" prefWidth="90.0" />
<ColumnConstraints minWidth="20.0" prefWidth="90.0" />
<ColumnConstraints minWidth="20.0" prefWidth="90.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints vgrow="SOMETIMES" />
</rowConstraints>

<Label text="Position:" GridPane.rowIndex="0" />
<TextFieldLabelWrapper labelText="x:" GridPane.rowIndex="0" GridPane.columnIndex="1">
<DoubleTextField fx:id="posX">
<tooltip>
<Tooltip text="Entity x (east/west) coordinate" />
</tooltip>
</DoubleTextField>
</TextFieldLabelWrapper>
<TextFieldLabelWrapper labelText="y:" GridPane.rowIndex="0" GridPane.columnIndex="2">
<DoubleTextField fx:id="posY">
<tooltip>
<Tooltip text="Entity y (up/down) coordinate" />
</tooltip>
</DoubleTextField>
</TextFieldLabelWrapper>
<TextFieldLabelWrapper labelText="z:" GridPane.rowIndex="0" GridPane.columnIndex="3">
<DoubleTextField fx:id="posZ">
<tooltip>
<Tooltip text="Entity z (south/north) coordinate" />
</tooltip>
</DoubleTextField>
</TextFieldLabelWrapper>
</GridPane>
<VBox fx:id="controls" spacing="10.0" VBox.vgrow="ALWAYS" />
</VBox>
</fx:root>