component PhotoModeCameraModel { PhotoModeCameraViewModel m_ViewModel; bool m_IsRecording; bool m_IsConverting; bool m_AvailableSaveData; bool m_IsSaved; string m_DownloadURL; float m_StartRecordTime; int m_CurrentRecordTime; int m_MaxRecordTime; string m_ShareWorldName; string m_ShareHashtags; public PhotoModeCameraModel() { m_ViewModel = system.Layer_GetComponentByName("camera_mode_base_layer"); m_IsRecording = false; m_IsConverting = false; m_AvailableSaveData = false; m_IsSaved = true; m_StartRecordTime = 0.0; m_CurrentRecordTime = 0; m_MaxRecordTime = 60; heliport.v3.api.worlds.getWorldDetailByWorldId(_FetchWorldDetailCallback, hsNetGetSpatiumCode(), hsGetCurrentWorldId()); m_ShareHashtags = "VketCloud"; } void _FetchWorldDetailCallback(JsVal val) { ReturnType result = hsLoadReturnType(val); if(!result.IsValid()) return; JsVal world = result.data.GetProperty("world_portal"); if(world === null) return; m_ShareWorldName = world.GetProperty("name").GetStr(); } public void Release() { hel_release_RecordedVideo(); m_IsConverting = false; m_AvailableSaveData = false; m_IsSaved = true; m_DownloadURL = ""; hsCanvasResetToggleDefault("Toggle_Is_Saved_Video"); hsCanvasResetToggleDefault("Toggle_Exist_Recorded_Data"); } public bool IsRecording() { return m_IsRecording; } public bool IsSaved() { return m_IsSaved; } public void StartRecording() { Release(); hel_setText(ETextParamType_SetVideoRecording, "1"); hel_start_VideoRecording(); m_IsRecording = true; m_StartRecordTime = hsSystemGetTime() * 0.001; m_CurrentRecordTime = 0; } public void StopRecording() { hel_setText(ETextParamType_SetVideoRecording, "0"); hel_stop_VideoRecording(); m_IsRecording = false; m_IsSaved = false; hsCanvasResetToggleDefault("Toggle_Is_Saved_Video"); hsCanvasToggleChange("Toggle_Is_Saved_Video"); hsCanvasResetToggleDefault("Toggle_Exist_Recorded_Data"); hsCanvasToggleChange("Toggle_Exist_Recorded_Data"); } public void Build() { if(m_IsRecording) { float CurrentSecondsTime = hsSystemGetTime() * 0.001; m_CurrentRecordTime = int(CurrentSecondsTime - m_StartRecordTime); if(m_CurrentRecordTime >= m_MaxRecordTime) { string TimeText = "1:00/1:00"; hsCanvasSetGUIText("record_layer", "camera_recording_time_text", TimeText); if(m_CurrentRecordTime > m_MaxRecordTime) { m_ViewModel.OnClickedStopRecording(); return; } } else { string TimeText = "0:" + ((m_CurrentRecordTime < 10)? "0" : "") + string(m_CurrentRecordTime) + "/1:00"; hsCanvasSetGUIText("record_layer", "camera_recording_time_text", TimeText); } } } public void ShowPreview() { hel_open_recorded_video_preview(); } public void SaveVideo() { if(!m_IsConverting) { m_ViewModel.ConvertWebmToMp4(); m_IsConverting = true; m_ViewModel.OnClickedOpenDialog("camera_wait"); } else { if(m_AvailableSaveData) { if(m_DownloadURL.IsEmpty()) { m_ViewModel.OnClickedOpenDialog("camera_failed"); } else { hel_save_recorded_video(m_DownloadURL); m_IsSaved = true; hsCanvasResetToggleDefault("Toggle_Is_Saved_Video"); } } else { m_ViewModel.OnClickedOpenDialog("camera_wait"); } } } public void FinishConvertingWebmToMp4(string data) { m_DownloadURL = data; m_AvailableSaveData = true; } public void ShareScreenShot() { // GTag送信 hsSendGtag("ShareScreenShot", hsGetCurrentWorldId()); if(hel_isMobile()) { string Title; // iOSのWebShareAPIではTitleに対応していないようなのでTextにまとめる string Text = "%s #%s" % m_ShareWorldName % m_ShareHashtags; // モバイルではOS標準の画像共有UIをWebShareAPI経由で開き、そこからXなどに投稿する hel_share_screenshot(_ShareSSCallback, Title, Text); } else { // PCではクリップボードにコピーしてダイアログがYesの時にXを別タブで開く hel_copy_screenshot_to_clipboard(_CopySSCallback); } } void _ShareSSCallback(JsVal val) { } void _CopySSCallback(JsVal val) { if(val === null || val.IsNull() || !val.GetBool()) { hsSystemOutputLog("[Error] Failed to copy screenshot.\n"); return; } // Xを別タブで開くかどうかのダイアログ hsCommonDialogSetUseCloseButton(true); hsCommonDialogSetUseYesNoButton(true); hsCommonDialogSetYesButtonText( (hsIsLangJA()? "決定" : "Yes") ); hsCommonDialogSetNoButtonText( (hsIsLangJA()? "キャンセル" : "No") ); hsCommonDialogSetText( (hsIsLangJA()? "画像をコピーしました。続けてXでシェアしますか?" : "Image copied to clipboard!\nProceed to share on your X account?") ); hsCommonDialogSetTextAlignment(HSAlignCM); hsCommonDialogSetTextOverflowWrap(true); hsCommonDialogSetYesButtonDelegate(_OpenPageCallback); hsCommonDialogOpen("canvas"); } void _OpenPageCallback() { hsWebOpen("https://twitter.com/intent/tweet?text=%s&hashtags=%s" % m_ShareWorldName % m_ShareHashtags); hsCommonDialogClose(); } }