forked from cgvr/DeltaVR
84 lines
2.7 KiB
C#
84 lines
2.7 KiB
C#
using FishNet.Component.Transforming;
|
|
using FishNet.Object;
|
|
using System;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityEngine.XR.Interaction.Toolkit;
|
|
|
|
public class ShapeDetectionMinigameController : MonoBehaviour
|
|
{
|
|
public MicrophoneStand microphoneStand;
|
|
public PushableButton imageGenerationButton;
|
|
public PushableButton modelGenerationButton;
|
|
public Texture2D GeneratedTexture { get; private set; }
|
|
public Image imageDisplay;
|
|
|
|
public GameObject GeneratedModel { get; private set; }
|
|
public Transform modelSpawnPoint;
|
|
public string shapeScannerTag = "ShapeScannable";
|
|
|
|
private bool modelGenerationInProgress;
|
|
|
|
// Start is called before the first frame update
|
|
void Start()
|
|
{
|
|
imageGenerationButton.OnButtonPressed += InvokeImageGeneration;
|
|
modelGenerationButton.OnButtonPressed += InvokeModelGeneration;
|
|
modelGenerationInProgress = false;
|
|
}
|
|
|
|
// Update is called once per frame
|
|
void Update()
|
|
{
|
|
|
|
}
|
|
|
|
private async void InvokeImageGeneration()
|
|
{
|
|
string inputPrompt = microphoneStand.GetTextOutput();
|
|
byte[] imageBytes = await InvokeAiClient.Instance.GenerateImage(inputPrompt);
|
|
GeneratedTexture = ModelGenerationUtils.CreateTexture(imageBytes);
|
|
Sprite sprite = ModelGenerationUtils.CreateSprite(GeneratedTexture);
|
|
imageDisplay.sprite = sprite;
|
|
|
|
imageGenerationButton.Deactivate();
|
|
if (!modelGenerationInProgress)
|
|
{
|
|
modelGenerationButton.Deactivate();
|
|
}
|
|
}
|
|
|
|
private async void InvokeModelGeneration()
|
|
{
|
|
modelGenerationInProgress = true;
|
|
string encodedTexture = Convert.ToBase64String(GeneratedTexture.EncodeToJPG());
|
|
byte[] encodedModel = await TrellisClient.Instance.GenerateModel(encodedTexture);
|
|
|
|
GameObject spawnedObject = await ModelGenerationUtils.Instance.SpawnModel(encodedModel);
|
|
InitializeSpawnedObject(spawnedObject);
|
|
|
|
// Destroy previous generated object
|
|
Destroy(GeneratedModel);
|
|
GeneratedModel = spawnedObject;
|
|
|
|
modelGenerationButton.Deactivate();
|
|
modelGenerationInProgress = false;
|
|
}
|
|
|
|
private void InitializeSpawnedObject(GameObject spawnedObject)
|
|
{
|
|
Rigidbody rigidbody = spawnedObject.AddComponent<Rigidbody>();
|
|
rigidbody.isKinematic = true;
|
|
|
|
//spawnedObject.AddComponent<NetworkObject>();
|
|
//spawnedObject.AddComponent<NetworkTransform>();
|
|
spawnedObject.transform.parent = modelSpawnPoint;
|
|
spawnedObject.transform.position = modelSpawnPoint.position;
|
|
spawnedObject.tag = shapeScannerTag;
|
|
|
|
spawnedObject.SetActive(true);
|
|
|
|
spawnedObject.AddComponent<XRGrabInteractable>();
|
|
}
|
|
}
|