package gameEngine.entites.gameComponents;
import gameEngine.entites.Entity;
import gameEngine.entites.GameObject;
import gameEngine.input.Input;
import gameEngine.input.MouseInput;
import gameEngine.scenes.EditorScene;
import gameEngine.views.*;
import org.joml.Vector3f;
import static org.lwjgl.glfw.GLFW.*;
public class TextMesh extends Draggable{
private Text textRenderer;
private boolean isEditingText = false;
private StringBuilder inputBuffer = new StringBuilder();
public TextMesh(GameObject parent, String text, int textSize) {
this.parent = parent;
this.textRenderer = new Text(parent.transform.position.x, parent.transform.position.y, text, textSize);
}
public TextMesh(TextMesh original, GameObject newParent) {
this.parent = newParent;
this.textRenderer = new Text(
newParent.transform.position.x,
newParent.transform.position.y,
original.textRenderer.text,
original.textRenderer.textSize
);
}
@Override
public GameComponent copy() {
return this;
}
@Override
public void init() {
textRenderer.update();
}
@Override
public void update() {
handleRightClickToggle();
if (isEditingText) {
handleTextEditing();
} else {
Vector3f globalPosition = new Vector3f(parent.transform.position).add(localPosition);
textRenderer.setPosition(globalPosition);
Vector3f globalRotation = new Vector3f(parent.transform.rotation).add(localRotation);
textRenderer.setRotation(globalRotation);
Vector3f globalScale = new Vector3f(parent.transform.scale).add(localScale);
textRenderer.setScale(globalScale);
textRenderer.update();
}
}
@Override
protected boolean isMouseOver(float mouseX, float mouseY) {
return textRenderer.isMouseOver(mouseX, mouseY);
}
@Override
protected void draggingAction(float mouseX, float mouseY) {
textRenderer.setPosition(mouseX, mouseY);
}
public void setText(String newText){
textRenderer.setText(newText);
}
public void setTextSize(int newTextSize) {
textRenderer.setTextSize(newTextSize);
}
public void setColor(Color color){
textRenderer.setColor(color);
}
public int getTextSize(){
return textRenderer.textSize;
}
private void handleRightClickToggle() {
if (Input.GetMouseButtonDown(GLFW_MOUSE_BUTTON_RIGHT) && isMouseOver(MouseInput.getX(), MouseInput.getY())) {
isEditingText = !isEditingText; // 右クリックで編集モードのトグル
if (isEditingText) {
inputBuffer = new StringBuilder(textRenderer.text); // 現在のテキストをバッファにコピー
textRenderer.setColor(Color.GRAY); // 編集中は灰色に変更
} else {
textRenderer.setColor(textRenderer.color); // 編集終了時に色を戻す
setText(inputBuffer.toString());
}
}
}
private void handleTextEditing() {
// エンターキーで編集終了
if (Input.GetKeyDown(GLFW_KEY_ENTER)) {
isEditingText = false;
setText(inputBuffer.toString());
textRenderer.setColor(Color.WHITE); // 編集終了時に色を戻す
EditorScene scene = (EditorScene) Window.get().getScene();
scene.clearSelectedEntity();
inputBuffer.setLength(0); // バッファをクリア
return;
}
// バックスペースキーで文字削除
if (Input.GetKeyDown(GLFW_KEY_BACKSPACE)) {
if (inputBuffer.length() > 0) {
inputBuffer.deleteCharAt(inputBuffer.length() - 1);
}
}
// 他のキー入力を処理
for (int key = GLFW_KEY_SPACE; key <= GLFW_KEY_LAST; key++) {
if (Input.GetKeyDown(key)) {
char typedChar = (char) key; // キーコードから文字を取得
inputBuffer.append(typedChar);
}
}
// 入力中のテキストをリアルタイムで表示
textRenderer.setText(inputBuffer.toString());
textRenderer.update();
}
}