|
|
using System.Collections;
|
|
|
using UnityEngine;
|
|
|
using TMPro;
|
|
|
|
|
|
using Google.Apis.Auth.OAuth2;
|
|
|
using Google.Apis.Drive.v3;
|
|
|
using Google.Apis.Services;
|
|
|
using System;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class MotyUploadToGoogleDrive : MonoBehaviour
|
|
|
{
|
|
|
public float PrintBrightnessMultiplier = 1.2f;
|
|
|
public class UploadRequestMoty
|
|
|
{
|
|
|
public string id;
|
|
|
public string filename;
|
|
|
public bool default_image;
|
|
|
}
|
|
|
|
|
|
|
|
|
public RenderTexture renderTexture_share;
|
|
|
public string OutputFolder = "output";
|
|
|
|
|
|
public TextMeshProUGUI TextNumber;
|
|
|
public TextMeshProUGUI TextSummary;
|
|
|
|
|
|
// public GameObject BackgroundDefault;
|
|
|
|
|
|
public GameObject ImageDiscardPostcard;
|
|
|
public GameObject ImageGeneratePostcard;
|
|
|
// Start is called before the first frame update
|
|
|
|
|
|
|
|
|
public string GoogleDriveFolderId = "1lZ_dJkr4qrIWG1IFd-nPCv__LHALUv0J";
|
|
|
|
|
|
UploadRequestMoty latest_input;
|
|
|
|
|
|
// DriveService service;
|
|
|
|
|
|
void Start()
|
|
|
{
|
|
|
setupService();
|
|
|
}
|
|
|
|
|
|
// Update is called once per frame
|
|
|
void Update()
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
public void Save(string input_text)
|
|
|
{
|
|
|
|
|
|
var parmas = input_text.Split('#');
|
|
|
if (parmas.Length < 2)
|
|
|
{
|
|
|
Debug.LogError("Input text must contain at least two parts separated by '#'.");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
string id = parmas[0].Trim();
|
|
|
|
|
|
// string summary = parmas[2].Trim();
|
|
|
string filename = id;
|
|
|
bool default_image = parmas[1].Trim().ToLower() == "default";
|
|
|
|
|
|
|
|
|
Debug.Log("/export id=" + id + " default:" + default_image);
|
|
|
|
|
|
|
|
|
|
|
|
if (default_image)
|
|
|
{
|
|
|
ImageGeneratePostcard.SetActive(false);
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
ImageGeneratePostcard.SetActive(true);
|
|
|
|
|
|
}
|
|
|
|
|
|
TextNumber.SetText(id);
|
|
|
// TextSummary.SetText(summary);
|
|
|
|
|
|
TextNumber.ForceMeshUpdate();
|
|
|
TextSummary.ForceMeshUpdate();
|
|
|
|
|
|
latest_input = new UploadRequestMoty()
|
|
|
{
|
|
|
id = id,
|
|
|
filename = filename,
|
|
|
default_image = default_image,
|
|
|
};
|
|
|
|
|
|
|
|
|
if (!this.enabled || !gameObject.activeInHierarchy){
|
|
|
Debug.LogError("Cannot start coroutine: Host is not active or enabled!");
|
|
|
return;
|
|
|
}
|
|
|
StartCoroutine(ExportAfterFrame(latest_input));
|
|
|
|
|
|
// Export(latest_input);
|
|
|
}
|
|
|
|
|
|
private IEnumerator ExportAfterFrame(UploadRequestMoty uploadRequest)
|
|
|
{
|
|
|
Debug.Log("Waiting for end of frame before exporting...");
|
|
|
// yield return new WaitForEndOfFrame();
|
|
|
yield return null;
|
|
|
|
|
|
Debug.Log("End of frame reached, starting export...");
|
|
|
Export(uploadRequest);
|
|
|
}
|
|
|
|
|
|
public void Export(UploadRequestMoty uploadRequest = null)
|
|
|
{
|
|
|
|
|
|
if (uploadRequest == null)
|
|
|
{
|
|
|
Debug.LogError("UploadRequest is null.");
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
|
|
|
string id = uploadRequest.id;
|
|
|
string filename = uploadRequest.filename;
|
|
|
|
|
|
Debug.Log("Saving image to: filename=" + filename + " id=" + id);
|
|
|
|
|
|
|
|
|
if (string.IsNullOrEmpty(filename))
|
|
|
{
|
|
|
Debug.LogError("Filename cannot be null or empty.");
|
|
|
filename = "untitled_" + System.DateTime.Now.ToString("yyyyMMdd_HHmmss");
|
|
|
// return;
|
|
|
}
|
|
|
Debug.Log("Saving image to: filename=" + filename + " id=" + id);
|
|
|
|
|
|
// string timestamp = System.DateTime.Now.ToString("yyyyMMdd");
|
|
|
|
|
|
// if (!System.IO.Directory.Exists(OutputFolder + "/" + uploadDest))
|
|
|
// {
|
|
|
// System.IO.Directory.CreateDirectory(OutputFolder + "/" + uploadDest);
|
|
|
// }
|
|
|
|
|
|
|
|
|
|
|
|
SaveRenderTextureToPNG(renderTexture_share, System.IO.Path.Combine(OutputFolder, filename + ".png"));
|
|
|
Debug.Log("Image saved to " + filename);
|
|
|
|
|
|
string share_fullPath = System.IO.Path.Combine(OutputFolder + "/", filename + ".png");
|
|
|
Debug.Log("share_path: " + share_fullPath);
|
|
|
upload(share_fullPath, id, "share");
|
|
|
}
|
|
|
|
|
|
void SaveRenderTextureToPNG(RenderTexture rt, string filePath)
|
|
|
{
|
|
|
Debug.Log("Saving RenderTexture to PNG at " + 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);
|
|
|
|
|
|
// Apply gamma correction (sRGB conversion) to each pixel
|
|
|
for (int y = 0; y < tex.height; y++)
|
|
|
{
|
|
|
for (int x = 0; x < tex.width; x++)
|
|
|
{
|
|
|
Color linearColor = tex.GetPixel(x, y);
|
|
|
Color sRGBColor = new Color(
|
|
|
Mathf.LinearToGammaSpace(linearColor.r),
|
|
|
Mathf.LinearToGammaSpace(linearColor.g),
|
|
|
Mathf.LinearToGammaSpace(linearColor.b),
|
|
|
linearColor.a
|
|
|
);
|
|
|
|
|
|
sRGBColor.r *= PrintBrightnessMultiplier;
|
|
|
sRGBColor.g *= PrintBrightnessMultiplier;
|
|
|
sRGBColor.b *= PrintBrightnessMultiplier;
|
|
|
|
|
|
tex.SetPixel(x, y, sRGBColor);
|
|
|
}
|
|
|
}
|
|
|
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 setupService()
|
|
|
{
|
|
|
// Debug.Log("Setting up Google Drive service...");
|
|
|
// // Initialize Google Drive API service
|
|
|
// service = new DriveService(new BaseClientService.Initializer()
|
|
|
// {
|
|
|
// HttpClientInitializer = GoogleCredential.FromFile("../Material/tech-277909-8bd38efb7464.json").CreateScoped(DriveService.Scope.DriveFile),
|
|
|
// ApplicationName = "24070-Upload",
|
|
|
// });
|
|
|
|
|
|
GoogleDriveUtils.setupService();
|
|
|
}
|
|
|
|
|
|
|
|
|
void upload(string _uploadFile, string _fileId, string type, bool needToPrint = true)
|
|
|
{
|
|
|
|
|
|
if (GoogleDriveUtils.service == null)
|
|
|
{
|
|
|
Debug.Log("service is null, setting up service again.");
|
|
|
setupService();
|
|
|
}
|
|
|
|
|
|
|
|
|
// string path = "";
|
|
|
// int lastSlash = path.LastIndexOf('/');
|
|
|
// Debug.Log("Extracted path: " + path + ", lastSlash=" + lastSlash);
|
|
|
// if (lastSlash >= 0)
|
|
|
// {
|
|
|
// // path = path[..lastSlash];
|
|
|
// path=path.Substring(0, lastSlash);
|
|
|
// }
|
|
|
|
|
|
Debug.Log("Uploading file to Google Drive: " + _uploadFile);
|
|
|
|
|
|
string folderId = GoogleDriveUtils.getFolder(GoogleDriveUtils.service, "", GoogleDriveFolderId);
|
|
|
|
|
|
StartCoroutine(GoogleDriveUtils.UploadCoroutine(GoogleDriveUtils.service, _uploadFile, folderId, _fileId, type,
|
|
|
(response) =>
|
|
|
{
|
|
|
if (response != null)
|
|
|
{
|
|
|
var url = response;
|
|
|
Debug.Log("Upload successful:" + url);
|
|
|
|
|
|
// TODO: back to standby
|
|
|
|
|
|
}
|
|
|
else
|
|
|
{
|
|
|
Debug.LogError("Upload failed: " + response);
|
|
|
}
|
|
|
}
|
|
|
));
|
|
|
}
|
|
|
|
|
|
|
|
|
}
|
|
|
|