using UnityEngine; using Amazon.S3.Model; using UltraCombos.Upload; using OscJack; using System.Collections; [System.Serializable] public class S3Tag { public string key; public string value; public static implicit operator Tag(S3Tag t) => new Tag { Key = t.key, Value = t.value }; } public class SaveImage : MonoBehaviour { public Uploader uploader; public RenderTexture renderTexture; public string OutputFolder = "output"; public string FirebaseUrl = "https://firestore.googleapis.com/v1/projects/uc-24070-thegreattipsy/databases/(default)/documents/"; // Start is called before the first frame update void Start() { uploader = GetComponent(); } // Update is called once per frame void Update() { } public void save(string filename) { if (string.IsNullOrEmpty(filename)) { Debug.LogError("Filename cannot be null or empty."); return; } Debug.Log("Saving image to: " + filename); string timestamp = System.DateTime.Now.ToString("yyyyMMdd"); if (!System.IO.Directory.Exists(OutputFolder + "/" + timestamp)) { System.IO.Directory.CreateDirectory(OutputFolder + "/" + timestamp); } SaveRenderTextureToPNG(renderTexture, System.IO.Path.Combine(OutputFolder + "/" + timestamp, filename)); Debug.Log("Image saved to " + filename); // Optionally, you can also log the full path string fullPath = System.IO.Path.Combine(OutputFolder + "/" + timestamp + "/", filename); Debug.Log("path: " + fullPath); upload(fullPath); } void SaveRenderTextureToPNG(RenderTexture rt, string filePath) { RenderTexture currentRT = RenderTexture.active; RenderTexture.active = rt; Texture2D tex = new Texture2D(rt.width, rt.height, TextureFormat.RGBA32, false); tex.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0); tex.Apply(); byte[] bytes = tex.EncodeToPNG(); System.IO.File.WriteAllBytes(filePath, bytes); Debug.Log("Saved RenderTexture to PNG at " + filePath + " with size: " + bytes.Length + " bytes"); RenderTexture.active = currentRT; Destroy(tex); } void upload(string filename) { if (uploader != null) { uploader.Upload(filename, (response) => { if (response.success) { Debug.Log("Upload successful: " + response.message); writeToFirebase(filename, response.message); } else { Debug.LogError("Upload failed: " + response); } }); } else { Debug.LogError("Uploader is not assigned."); } } public void writeToFirebase(string filename, string url) { Debug.Log("Writing to Firebase: " + filename); StartCoroutine(WriteToFirebaseCoroutine(filename, url)); IEnumerator WriteToFirebaseCoroutine(string filename, string url) { string id=filename.Split('/')[2].Split('.')[0]; Debug.Log("Extracted ID: " + id); string firebaseUrl = FirebaseUrl + "prints/" + id; string jsonData = "{ \"fields\": { " + "\"url\": { \"stringValue\": \"" + url + "\" }, " + "\"timestamp\": { \"timestampValue\": \"" + System.DateTime.UtcNow.ToString("o") + "\" } " + "} }"; using (var www = new UnityEngine.Networking.UnityWebRequest(firebaseUrl, "PATCH")) { byte[] bodyRaw = System.Text.Encoding.UTF8.GetBytes(jsonData); www.uploadHandler = new UnityEngine.Networking.UploadHandlerRaw(bodyRaw); www.downloadHandler = new UnityEngine.Networking.DownloadHandlerBuffer(); www.SetRequestHeader("Content-Type", "application/json"); yield return www.SendWebRequest(); #if UNITY_2020_1_OR_NEWER if (www.result != UnityEngine.Networking.UnityWebRequest.Result.Success) #else if (www.isNetworkError || www.isHttpError) #endif { Debug.LogError("Error writing to Firebase: " + www.error); Debug.LogError("Response: " + www.downloadHandler.text); } else { Debug.Log("Successfully wrote to Firebase: " + www.downloadHandler.text); } } } } public void sendOscMessage(string message) { // Implement your OSC message sending logic here Debug.Log("Sending OSC message: " + message); StartCoroutine(SendOscMessageCoroutine(message)); } public IEnumerator SendOscMessageCoroutine(string message){ using (var client = new OscClient("127.0.0.1", 9000)) { // Send two-component float values ten times. for (var i = 0; i < 1; i++) { yield return new WaitForSeconds(0.5f); client.Send("/uploaded", // OSC address message); // Message content } } } }