diff --git a/BlockadeLabs/Assets/Skybox/SkyboxSample.unity b/BlockadeLabs/Assets/Skybox/SkyboxSample.unity deleted file mode 100644 index 916f725..0000000 --- a/BlockadeLabs/Assets/Skybox/SkyboxSample.unity +++ /dev/null @@ -1,2832 +0,0 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!29 &1 -OcclusionCullingSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_OcclusionBakeSettings: - smallestOccluder: 5 - smallestHole: 0.25 - backfaceThreshold: 100 - m_SceneGUID: 00000000000000000000000000000000 - m_OcclusionCullingData: {fileID: 0} ---- !u!104 &2 -RenderSettings: - m_ObjectHideFlags: 0 - serializedVersion: 9 - m_Fog: 0 - m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} - m_FogMode: 3 - m_FogDensity: 0.01 - m_LinearFogStart: 0 - m_LinearFogEnd: 300 - m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} - m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} - m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} - m_AmbientIntensity: 1 - m_AmbientMode: 0 - m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} - m_SkyboxMaterial: {fileID: 2100000, guid: e671ac8eb3c6f6a4a97491eb29076e3b, type: 2} - m_HaloStrength: 0.5 - m_FlareStrength: 1 - m_FlareFadeSpeed: 3 - m_HaloTexture: {fileID: 0} - m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} - m_DefaultReflectionMode: 0 - m_DefaultReflectionResolution: 128 - m_ReflectionBounces: 1 - m_ReflectionIntensity: 1 - m_CustomReflection: {fileID: 0} - m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0.49975657, g: 0.49975657, b: 0.49975657, a: 1} - m_UseRadianceAmbientProbe: 0 ---- !u!157 &3 -LightmapSettings: - m_ObjectHideFlags: 0 - serializedVersion: 12 - m_GIWorkflowMode: 1 - m_GISettings: - serializedVersion: 2 - m_BounceScale: 1 - m_IndirectOutputScale: 1 - m_AlbedoBoost: 1 - m_EnvironmentLightingMode: 0 - m_EnableBakedLightmaps: 1 - m_EnableRealtimeLightmaps: 0 - m_LightmapEditorSettings: - serializedVersion: 12 - m_Resolution: 2 - m_BakeResolution: 40 - m_AtlasSize: 1024 - m_AO: 0 - m_AOMaxDistance: 1 - m_CompAOExponent: 1 - m_CompAOExponentDirect: 0 - m_ExtractAmbientOcclusion: 0 - m_Padding: 2 - m_LightmapParameters: {fileID: 0} - m_LightmapsBakeMode: 1 - m_TextureCompression: 1 - m_FinalGather: 0 - m_FinalGatherFiltering: 1 - m_FinalGatherRayCount: 256 - m_ReflectionCompression: 2 - m_MixedBakeMode: 2 - m_BakeBackend: 1 - m_PVRSampling: 1 - m_PVRDirectSampleCount: 32 - m_PVRSampleCount: 512 - m_PVRBounces: 2 - m_PVREnvironmentSampleCount: 256 - m_PVREnvironmentReferencePointCount: 2048 - m_PVRFilteringMode: 1 - m_PVRDenoiserTypeDirect: 1 - m_PVRDenoiserTypeIndirect: 1 - m_PVRDenoiserTypeAO: 1 - m_PVRFilterTypeDirect: 0 - m_PVRFilterTypeIndirect: 0 - m_PVRFilterTypeAO: 0 - m_PVREnvironmentMIS: 1 - m_PVRCulling: 1 - m_PVRFilteringGaussRadiusDirect: 1 - m_PVRFilteringGaussRadiusIndirect: 5 - m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousPositionSigmaDirect: 0.5 - m_PVRFilteringAtrousPositionSigmaIndirect: 2 - m_PVRFilteringAtrousPositionSigmaAO: 1 - m_ExportTrainingData: 0 - m_TrainingDataDestination: TrainingData - m_LightProbeSampleCountMultiplier: 4 - m_LightingDataAsset: {fileID: 0} - m_LightingSettings: {fileID: 0} ---- !u!196 &4 -NavMeshSettings: - serializedVersion: 2 - m_ObjectHideFlags: 0 - m_BuildSettings: - serializedVersion: 3 - agentTypeID: 0 - agentRadius: 0.5 - agentHeight: 2 - agentSlope: 45 - agentClimb: 0.4 - ledgeDropHeight: 0 - maxJumpAcrossDistance: 0 - minRegionArea: 2 - manualCellSize: 0 - cellSize: 0.16666667 - manualTileSize: 0 - tileSize: 256 - buildHeightMesh: 0 - maxJobWorkers: 0 - preserveTilesOutsideBounds: 0 - debug: - m_Flags: 0 - m_NavMeshData: {fileID: 0} ---- !u!1 &41372776 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 41372777} - - component: {fileID: 41372780} - - component: {fileID: 41372779} - - component: {fileID: 41372778} - - component: {fileID: 41372781} - m_Layer: 5 - m_Name: PromptInputField - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &41372777 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 41372776} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 1795232782} - m_Father: {fileID: 1175833942} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &41372778 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 41372776} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2da0c512f12947e489f739169773d7ca, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 41372779} - m_TextViewport: {fileID: 1795232782} - m_TextComponent: {fileID: 1460347556} - m_Placeholder: {fileID: 463533643} - m_VerticalScrollbar: {fileID: 0} - m_VerticalScrollbarEventHandler: {fileID: 0} - m_LayoutGroup: {fileID: 0} - m_ScrollSensitivity: 1 - m_ContentType: 0 - m_InputType: 0 - m_AsteriskChar: 42 - m_KeyboardType: 0 - m_LineType: 1 - m_HideMobileInput: 0 - m_HideSoftKeyboard: 0 - m_CharacterValidation: 0 - m_RegexValue: - m_GlobalPointSize: 24 - m_CharacterLimit: 0 - m_OnEndEdit: - m_PersistentCalls: - m_Calls: [] - m_OnSubmit: - m_PersistentCalls: - m_Calls: [] - m_OnSelect: - m_PersistentCalls: - m_Calls: [] - m_OnDeselect: - m_PersistentCalls: - m_Calls: [] - m_OnTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnEndTextSelection: - m_PersistentCalls: - m_Calls: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_OnTouchScreenKeyboardStatusChanged: - m_PersistentCalls: - m_Calls: [] - m_CaretColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_CustomCaretColor: 0 - m_SelectionColor: {r: 0.65882355, g: 0.80784315, b: 1, a: 0.7529412} - m_Text: - m_CaretBlinkRate: 0.85 - m_CaretWidth: 1 - m_ReadOnly: 0 - m_RichText: 1 - m_GlobalFontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_OnFocusSelectAll: 1 - m_ResetOnDeActivation: 1 - m_RestoreOriginalTextOnEscape: 1 - m_isRichTextEditingAllowed: 0 - m_LineLimit: 0 - m_InputValidator: {fileID: 0} ---- !u!114 &41372779 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 41372776} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10911, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &41372780 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 41372776} - m_CullTransparentMesh: 1 ---- !u!114 &41372781 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 41372776} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: 256 - m_MinHeight: -1 - m_PreferredWidth: 512 - m_PreferredHeight: -1 - m_FlexibleWidth: 1 - m_FlexibleHeight: -1 - m_LayoutPriority: 2 ---- !u!1 &72969032 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 72969035} - - component: {fileID: 72969034} - - component: {fileID: 72969033} - m_Layer: 0 - m_Name: Main Camera - m_TagString: MainCamera - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!81 &72969033 -AudioListener: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 72969032} - m_Enabled: 1 ---- !u!20 &72969034 -Camera: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 72969032} - m_Enabled: 1 - serializedVersion: 2 - m_ClearFlags: 1 - m_BackGroundColor: {r: 0.1764706, g: 0.1764706, b: 0.1764706, a: 1} - m_projectionMatrixMode: 1 - m_GateFitMode: 2 - m_FOVAxisMode: 0 - m_Iso: 200 - m_ShutterSpeed: 0.005 - m_Aperture: 16 - m_FocusDistance: 10 - m_FocalLength: 50 - m_BladeCount: 5 - m_Curvature: {x: 2, y: 11} - m_BarrelClipping: 0.25 - m_Anamorphism: 0 - m_SensorSize: {x: 36, y: 24} - m_LensShift: {x: 0, y: 0} - m_NormalizedViewPortRect: - serializedVersion: 2 - x: 0 - y: 0 - width: 1 - height: 1 - near clip plane: 0.3 - far clip plane: 1000 - field of view: 60 - orthographic: 0 - orthographic size: 5 - m_Depth: -1 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingPath: -1 - m_TargetTexture: {fileID: 0} - m_TargetDisplay: 0 - m_TargetEye: 3 - m_HDR: 1 - m_AllowMSAA: 1 - m_AllowDynamicResolution: 0 - m_ForceIntoRT: 0 - m_OcclusionCulling: 1 - m_StereoConvergence: 10 - m_StereoSeparation: 0.022 ---- !u!4 &72969035 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 72969032} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &200225031 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 200225032} - - component: {fileID: 200225034} - - component: {fileID: 200225033} - - component: {fileID: 200225035} - - component: {fileID: 200225036} - m_Layer: 5 - m_Name: MainPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &200225032 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 200225031} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 1612849246} - - {fileID: 1175833942} - - {fileID: 241954613} - m_Father: {fileID: 1093524933} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 16} - m_SizeDelta: {x: -32, y: 128} - m_Pivot: {x: 0.5, y: 0} ---- !u!114 &200225033 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 200225031} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.21960786, g: 0.21960786, b: 0.21960786, a: 0.5019608} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &200225034 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 200225031} - m_CullTransparentMesh: 1 ---- !u!114 &200225035 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 200225031} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: 512 - m_MinHeight: 128 - m_PreferredWidth: 512 - m_PreferredHeight: 128 - m_FlexibleWidth: 1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &200225036 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 200225031} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 59f8146938fff824cb5fd77236b75775, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 8 - m_Right: 8 - m_Top: 8 - m_Bottom: 8 - m_ChildAlignment: 4 - m_Spacing: 8 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!1 &241954612 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 241954613} - m_Layer: 5 - m_Name: BottomPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &241954613 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 241954612} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 200225032} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &261906814 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 261906815} - - component: {fileID: 261906817} - - component: {fileID: 261906816} - m_Layer: 5 - m_Name: Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &261906815 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 261906814} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 638446756} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -7.5, y: -0.5} - m_SizeDelta: {x: -35, y: -13} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &261906816 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 261906814} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &261906817 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 261906814} - m_CullTransparentMesh: 1 ---- !u!1 &280817754 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 280817755} - m_Layer: 5 - m_Name: Content - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &280817755 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 280817754} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 2006619345} - m_Father: {fileID: 1318909067} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 1} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 28} - m_Pivot: {x: 0.5, y: 1} ---- !u!1 &304151161 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 304151164} - - component: {fileID: 304151163} - - component: {fileID: 304151162} - m_Layer: 0 - m_Name: EventSystem - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &304151162 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 304151161} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4f231c4fb786f3946a6b90b886c48677, type: 3} - m_Name: - m_EditorClassIdentifier: - m_SendPointerHoverToParent: 1 - m_HorizontalAxis: Horizontal - m_VerticalAxis: Vertical - m_SubmitButton: Submit - m_CancelButton: Cancel - m_InputActionsPerSecond: 10 - m_RepeatDelay: 0.5 - m_ForceModuleActive: 0 ---- !u!114 &304151163 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 304151161} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} - m_Name: - m_EditorClassIdentifier: - m_FirstSelected: {fileID: 0} - m_sendNavigationEvents: 1 - m_DragThreshold: 10 ---- !u!4 &304151164 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 304151161} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 4 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &463533640 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 463533641} - - component: {fileID: 463533644} - - component: {fileID: 463533643} - - component: {fileID: 463533642} - m_Layer: 5 - m_Name: Placeholder - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &463533641 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 463533640} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 1795232782} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &463533642 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 463533640} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 1 - m_MinWidth: -1 - m_MinHeight: -1 - m_PreferredWidth: -1 - m_PreferredHeight: -1 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &463533643 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 463533640} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Create a new world by describing it... - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 2150773298 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 0.5} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 24 - m_fontSizeBase: 24 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 2 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 0 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 1 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &463533644 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 463533640} - m_CullTransparentMesh: 1 ---- !u!1 &517660783 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 517660784} - m_Layer: 5 - m_Name: Sliding Area - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &517660784 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 517660783} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 1625261307} - m_Father: {fileID: 914705824} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -20, y: -20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &545858271 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 545858272} - - component: {fileID: 545858275} - - component: {fileID: 545858274} - - component: {fileID: 545858273} - - component: {fileID: 545858276} - m_Layer: 5 - m_Name: Button - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &545858272 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 545858271} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 1570093186} - m_Father: {fileID: 1175833942} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &545858273 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 545858271} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 545858274} - m_OnClick: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &545858274 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 545858271} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &545858275 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 545858271} - m_CullTransparentMesh: 1 ---- !u!114 &545858276 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 545858271} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: 128 - m_MinHeight: -1 - m_PreferredWidth: 128 - m_PreferredHeight: -1 - m_FlexibleWidth: 1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!1 &578785327 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 578785328} - - component: {fileID: 578785330} - - component: {fileID: 578785329} - m_Layer: 5 - m_Name: Item Checkmark - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &578785328 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 578785327} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 2006619345} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 0, y: 0.5} - m_AnchoredPosition: {x: 10, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &578785329 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 578785327} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10901, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &578785330 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 578785327} - m_CullTransparentMesh: 1 ---- !u!1 &638446755 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 638446756} - - component: {fileID: 638446760} - - component: {fileID: 638446759} - - component: {fileID: 638446758} - - component: {fileID: 638446757} - m_Layer: 5 - m_Name: Dropdown - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &638446756 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 638446755} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 261906815} - - {fileID: 2027249695} - - {fileID: 1539986340} - m_Father: {fileID: 1175833942} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &638446757 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 638446755} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 306cc8c2b49d7114eaa3623786fc2126, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreLayout: 0 - m_MinWidth: 128 - m_MinHeight: -1 - m_PreferredWidth: 256 - m_PreferredHeight: -1 - m_FlexibleWidth: -1 - m_FlexibleHeight: -1 - m_LayoutPriority: 1 ---- !u!114 &638446758 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 638446755} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 7b743370ac3e4ec2a1668f5455a8ef8a, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 638446759} - m_Template: {fileID: 1539986340} - m_CaptionText: {fileID: 261906816} - m_CaptionImage: {fileID: 0} - m_Placeholder: {fileID: 0} - m_ItemText: {fileID: 1041967940} - m_ItemImage: {fileID: 0} - m_Value: 0 - m_Options: - m_Options: [] - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] - m_AlphaFadeSpeed: 0.15 ---- !u!114 &638446759 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 638446755} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &638446760 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 638446755} - m_CullTransparentMesh: 1 ---- !u!1 &846109566 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 846109568} - - component: {fileID: 846109567} - m_Layer: 0 - m_Name: Directional Light - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!108 &846109567 -Light: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 846109566} - m_Enabled: 1 - serializedVersion: 10 - m_Type: 1 - m_Shape: 0 - m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} - m_Intensity: 1 - m_Range: 10 - m_SpotAngle: 30 - m_InnerSpotAngle: 21.80208 - m_CookieSize: 10 - m_Shadows: - m_Type: 2 - m_Resolution: -1 - m_CustomResolution: -1 - m_Strength: 1 - m_Bias: 0.05 - m_NormalBias: 0.4 - m_NearPlane: 0.2 - m_CullingMatrixOverride: - e00: 1 - e01: 0 - e02: 0 - e03: 0 - e10: 0 - e11: 1 - e12: 0 - e13: 0 - e20: 0 - e21: 0 - e22: 1 - e23: 0 - e30: 0 - e31: 0 - e32: 0 - e33: 1 - m_UseCullingMatrixOverride: 0 - m_Cookie: {fileID: 0} - m_DrawHalo: 0 - m_Flare: {fileID: 0} - m_RenderMode: 0 - m_CullingMask: - serializedVersion: 2 - m_Bits: 4294967295 - m_RenderingLayerMask: 1 - m_Lightmapping: 4 - m_LightShadowCasterMode: 0 - m_AreaSize: {x: 1, y: 1} - m_BounceIntensity: 1 - m_ColorTemperature: 6570 - m_UseColorTemperature: 0 - m_BoundingSphereOverride: {x: 0, y: 0, z: 0, w: 0} - m_UseBoundingSphereOverride: 0 - m_UseViewFrustumForShadowCasterCull: 1 - m_ShadowRadius: 0 - m_ShadowAngle: 0 ---- !u!4 &846109568 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 846109566} - m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} - m_LocalPosition: {x: 0, y: 3, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &914705823 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 914705824} - - component: {fileID: 914705827} - - component: {fileID: 914705826} - - component: {fileID: 914705825} - m_Layer: 5 - m_Name: Scrollbar - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &914705824 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 914705823} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 517660784} - m_Father: {fileID: 1539986340} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 0} - m_Pivot: {x: 1, y: 1} ---- !u!114 &914705825 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 914705823} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a4db7a114972834c8e4117be1d82ba3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1625261308} - m_HandleRect: {fileID: 1625261307} - m_Direction: 2 - m_Value: 0 - m_Size: 0.2 - m_NumberOfSteps: 0 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &914705826 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 914705823} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10907, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &914705827 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 914705823} - m_CullTransparentMesh: 1 ---- !u!1 &1041967938 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1041967939} - - component: {fileID: 1041967941} - - component: {fileID: 1041967940} - m_Layer: 5 - m_Name: Item Label - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1041967939 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1041967938} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 2006619345} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 5, y: -0.5} - m_SizeDelta: {x: -30, y: -3} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1041967940 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1041967938} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Option A - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: 0 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 14 - m_fontSizeBase: 14 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1041967941 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1041967938} - m_CullTransparentMesh: 1 ---- !u!1 &1093524929 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1093524933} - - component: {fileID: 1093524932} - - component: {fileID: 1093524931} - - component: {fileID: 1093524930} - m_Layer: 5 - m_Name: Canvas - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1093524930 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1093524929} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} - m_Name: - m_EditorClassIdentifier: - m_IgnoreReversedGraphics: 1 - m_BlockingObjects: 0 - m_BlockingMask: - serializedVersion: 2 - m_Bits: 4294967295 ---- !u!114 &1093524931 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1093524929} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_UiScaleMode: 0 - m_ReferencePixelsPerUnit: 100 - m_ScaleFactor: 1 - m_ReferenceResolution: {x: 800, y: 600} - m_ScreenMatchMode: 0 - m_MatchWidthOrHeight: 0 - m_PhysicalUnit: 3 - m_FallbackScreenDPI: 96 - m_DefaultSpriteDPI: 96 - m_DynamicPixelsPerUnit: 1 - m_PresetInfoIsWorld: 0 ---- !u!223 &1093524932 -Canvas: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1093524929} - m_Enabled: 1 - serializedVersion: 3 - m_RenderMode: 0 - m_Camera: {fileID: 0} - m_PlaneDistance: 100 - m_PixelPerfect: 0 - m_ReceivesEvents: 1 - m_OverrideSorting: 0 - m_OverridePixelPerfect: 0 - m_SortingBucketNormalizedSize: 0 - m_VertexColorAlwaysGammaSpace: 0 - m_AdditionalShaderChannelsFlag: 25 - m_UpdateRectTransformForStandalone: 0 - m_SortingLayerID: 0 - m_SortingOrder: 0 - m_TargetDisplay: 0 ---- !u!224 &1093524933 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1093524929} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0, y: 0, z: 0} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 200225032} - m_Father: {fileID: 0} - m_RootOrder: 3 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0, y: 0} ---- !u!1 &1175833941 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1175833942} - - component: {fileID: 1175833943} - m_Layer: 5 - m_Name: MiddlePanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1175833942 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1175833941} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 41372777} - - {fileID: 638446756} - - {fileID: 545858272} - m_Father: {fileID: 200225032} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1175833943 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1175833941} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: - m_Left: 8 - m_Right: 8 - m_Top: 8 - m_Bottom: 8 - m_ChildAlignment: 3 - m_Spacing: 8 - m_ChildForceExpandWidth: 1 - m_ChildForceExpandHeight: 1 - m_ChildControlWidth: 1 - m_ChildControlHeight: 1 - m_ChildScaleWidth: 0 - m_ChildScaleHeight: 0 - m_ReverseArrangement: 0 ---- !u!1 &1318909066 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1318909067} - - component: {fileID: 1318909070} - - component: {fileID: 1318909069} - - component: {fileID: 1318909068} - m_Layer: 5 - m_Name: Viewport - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1318909067 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1318909066} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 280817755} - m_Father: {fileID: 1539986340} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: -18, y: 0} - m_Pivot: {x: 0, y: 1} ---- !u!114 &1318909068 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1318909066} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10917, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1318909069 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1318909066} - m_CullTransparentMesh: 1 ---- !u!114 &1318909070 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1318909066} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 31a19414c41e5ae4aae2af33fee712f6, type: 3} - m_Name: - m_EditorClassIdentifier: - m_ShowMaskGraphic: 0 ---- !u!1 &1342179885 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1342179887} - - component: {fileID: 1342179886} - m_Layer: 0 - m_Name: SkyboxDemo - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!114 &1342179886 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1342179885} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 530e128bcdf8a054898532de9d8fba80, type: 3} - m_Name: - m_EditorClassIdentifier: - promptInputField: {fileID: 41372778} - skyboxStyleDropdown: {fileID: 638446758} - generateButton: {fileID: 545858273} - skyboxMaterial: {fileID: 2100000, guid: e671ac8eb3c6f6a4a97491eb29076e3b, type: 2} ---- !u!4 &1342179887 -Transform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1342179885} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!1 &1460347554 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1460347555} - - component: {fileID: 1460347557} - - component: {fileID: 1460347556} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1460347555 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1460347554} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 1795232782} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1460347556 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1460347554} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: "\u200B" - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 24 - m_fontSizeBase: 24 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 1 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 1 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1460347557 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1460347554} - m_CullTransparentMesh: 1 ---- !u!1 &1539986339 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1539986340} - - component: {fileID: 1539986343} - - component: {fileID: 1539986342} - - component: {fileID: 1539986341} - m_Layer: 5 - m_Name: Template - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1539986340 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539986339} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 1318909067} - - {fileID: 914705824} - m_Father: {fileID: 638446756} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 2} - m_SizeDelta: {x: 0, y: 150} - m_Pivot: {x: 0.5, y: 1} ---- !u!114 &1539986341 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539986339} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 1aa08ab6e0800fa44ae55d278d1423e3, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Content: {fileID: 280817755} - m_Horizontal: 0 - m_Vertical: 1 - m_MovementType: 2 - m_Elasticity: 0.1 - m_Inertia: 1 - m_DecelerationRate: 0.135 - m_ScrollSensitivity: 1 - m_Viewport: {fileID: 1318909067} - m_HorizontalScrollbar: {fileID: 0} - m_VerticalScrollbar: {fileID: 914705825} - m_HorizontalScrollbarVisibility: 0 - m_VerticalScrollbarVisibility: 2 - m_HorizontalScrollbarSpacing: 0 - m_VerticalScrollbarSpacing: -3 - m_OnValueChanged: - m_PersistentCalls: - m_Calls: [] ---- !u!114 &1539986342 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539986339} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1539986343 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1539986339} - m_CullTransparentMesh: 1 ---- !u!1 &1570093185 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1570093186} - - component: {fileID: 1570093188} - - component: {fileID: 1570093187} - m_Layer: 5 - m_Name: Text - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1570093186 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1570093185} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 545858272} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1570093187 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1570093185} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_text: Generate - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4281479730 - m_fontColor: {r: 0.19607843, g: 0.19607843, b: 0.19607843, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 24 - m_fontSizeBase: 24 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 2 - m_VerticalAlignment: 512 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1570093188 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1570093185} - m_CullTransparentMesh: 1 ---- !u!1 &1612849245 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1612849246} - m_Layer: 5 - m_Name: TopPanel - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1612849246 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1612849245} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 200225032} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!1 &1625261306 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1625261307} - - component: {fileID: 1625261309} - - component: {fileID: 1625261308} - m_Layer: 5 - m_Name: Handle - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1625261307 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1625261306} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 517660784} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 0.2} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1625261308 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1625261306} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10905, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 1 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1625261309 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1625261306} - m_CullTransparentMesh: 1 ---- !u!1 &1795232781 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1795232782} - - component: {fileID: 1795232783} - m_Layer: 5 - m_Name: TextArea - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1795232782 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1795232781} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 463533641} - - {fileID: 1460347555} - m_Father: {fileID: 41372777} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: -0.5} - m_SizeDelta: {x: -20, y: -13} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1795232783 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1795232781} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 3312d7739989d2b4e91e6319e9a96d76, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Padding: {x: -8, y: -5, z: -8, w: -5} - m_Softness: {x: 0, y: 0} ---- !u!1 &1802491287 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1802491288} - - component: {fileID: 1802491290} - - component: {fileID: 1802491289} - m_Layer: 5 - m_Name: Item Background - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1802491288 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1802491287} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 2006619345} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1802491289 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1802491287} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &1802491290 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1802491287} - m_CullTransparentMesh: 1 ---- !u!1 &2006619344 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2006619345} - - component: {fileID: 2006619346} - m_Layer: 5 - m_Name: Item - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2006619345 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2006619344} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: - - {fileID: 1802491288} - - {fileID: 578785328} - - {fileID: 1041967939} - m_Father: {fileID: 280817755} - m_RootOrder: 0 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2006619346 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2006619344} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 9085046f02f69544eb97fd06b6048fe2, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Navigation: - m_Mode: 3 - m_WrapAround: 0 - m_SelectOnUp: {fileID: 0} - m_SelectOnDown: {fileID: 0} - m_SelectOnLeft: {fileID: 0} - m_SelectOnRight: {fileID: 0} - m_Transition: 1 - m_Colors: - m_NormalColor: {r: 1, g: 1, b: 1, a: 1} - m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} - m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} - m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} - m_ColorMultiplier: 1 - m_FadeDuration: 0.1 - m_SpriteState: - m_HighlightedSprite: {fileID: 0} - m_PressedSprite: {fileID: 0} - m_SelectedSprite: {fileID: 0} - m_DisabledSprite: {fileID: 0} - m_AnimationTriggers: - m_NormalTrigger: Normal - m_HighlightedTrigger: Highlighted - m_PressedTrigger: Pressed - m_SelectedTrigger: Selected - m_DisabledTrigger: Disabled - m_Interactable: 1 - m_TargetGraphic: {fileID: 1802491289} - toggleTransition: 1 - graphic: {fileID: 578785329} - m_Group: {fileID: 0} - onValueChanged: - m_PersistentCalls: - m_Calls: [] - m_IsOn: 1 ---- !u!1 &2027249694 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 2027249695} - - component: {fileID: 2027249697} - - component: {fileID: 2027249696} - m_Layer: 5 - m_Name: Arrow - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &2027249695 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2027249694} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 1 - m_Children: [] - m_Father: {fileID: 638446756} - m_RootOrder: 1 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0.5} - m_AnchorMax: {x: 1, y: 0.5} - m_AnchoredPosition: {x: -15, y: 0} - m_SizeDelta: {x: 20, y: 20} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &2027249696 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2027249694} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 10915, guid: 0000000000000000f000000000000000, type: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 ---- !u!222 &2027249697 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 2027249694} - m_CullTransparentMesh: 1 diff --git a/BlockadeLabs/Assets/Skybox/SkyboxSample.unity.meta b/BlockadeLabs/Assets/Skybox/SkyboxSample.unity.meta deleted file mode 100644 index 478c8ac..0000000 --- a/BlockadeLabs/Assets/Skybox/SkyboxSample.unity.meta +++ /dev/null @@ -1,7 +0,0 @@ -fileFormatVersion: 2 -guid: 5b5b835902518404fa123a04aa90a0e3 -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/README.md b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/README.md index bdfa91e..d2e4b1b 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/README.md +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/README.md @@ -43,10 +43,15 @@ The recommended installation method is though the unity package manager and [Ope ### Table of Contents - [Authentication](#authentication) +- [Editor Dashboard](#editor-dashboard) :new: + - [Skybox Dashboard](#skybox-dashboard) :new: + - [History Dashboard](#history-dashboard) :new: - [Skyboxes](#skyboxes) - [Get Skybox Styles](#get-skybox-styles) + - [Get Skybox Export Options](#get-skybox-export-options) :new: - [Generate Skybox](#generate-skybox) - [Get Skybox by Id](#get-skybox) + - [Request Skybox Export](#request-skybox-export) :new: - [Delete Skybox by Id](#delete-skybox) - [Get Skybox History](#get-skybox-history) - [Cancel Skybox Generation](#cancel-skybox-generation) @@ -111,6 +116,26 @@ Use your system's environment variables specify an api key to use. var api = new BlockadeLabsClient(BlockadeLabsAuthentication.Default.LoadFromEnvironment()); ``` +### Editor Dashboard + +You can perform all of the same actions from the BlockadeLabs website, in the Editor using the BlockadeLabs Dashboard! + +`Window/Dashboards/BlockadeLabs` + +![dashboard](images/dashboard.png) + +#### Skybox Dashboard + +Generate skyboxes and remix them directly in the editor. + +![History](images/skybox-editor.png) + +#### History Dashboard + +You also have access to the full list of all your generated skyboxes, ready for downloading directly into your project. + +![History](images/history-editor.png) + ### Skyboxes #### [Get Skybox Styles](https://api-documentation.blockadelabs.com/api/skybox.html#get-skybox-styles) @@ -127,16 +152,34 @@ foreach (var skyboxStyle in skyboxStyles) } ``` +#### [Get Skybox Export Options](https://api-documentation.blockadelabs.com/api/skybox-exports.html#get-export-types) + +Returns the list of all available export types. + +```csharp +var api = new BlockadeLabsClient(); +var exportOptions = await api.SkyboxEndpoint.GetAllSkyboxExportOptionsAsync(); + +foreach (var exportOption in exportOptions) +{ + Debug.Log($"{exportOption.Id}: {exportOption.Name} | {exportOption.Key}"); +} +``` + #### [Generate Skybox](https://api-documentation.blockadelabs.com/api/skybox.html#generate-skybox) Generate a skybox. ```csharp var api = new BlockadeLabsClient(); -var request = new SkyboxRequest("mars", depth: true); +var request = new SkyboxRequest("mars", enhancePrompt: true); var skyboxInfo = await api.SkyboxEndpoint.GenerateSkyboxAsync(request); -skyboxMaterial.mainTexture = skyboxInfo.MainTexture; -skyboxMaterial.depthTexture = skyboxInfo.DepthTexture; +Debug.Log($"Successfully created skybox: {skyboxInfo.Id}"); + +if (skyboxInfo.TryGetAsset("equirectangular-png", out var texture)) +{ + skyboxMaterial.mainTexture = texture; +} ``` #### [Get Skybox](https://api-documentation.blockadelabs.com/api/skybox.html#get-skybox-by-id) @@ -145,12 +188,35 @@ Returns the skybox metadata for the given skybox id. ```csharp var skyboxId = 42; +var api = new BlockadeLabsClient(); +var skyboxInfo = await api.SkyboxEndpoint.GetSkyboxInfoAsync(skyboxId); +Debug.Log($"Skybox: {result.Id}"); +// Note: If you wish to use the returned skybox textures you'll need to additionally call await SkyboxInfo.LoadAssetsAsync(); before you can assign them to a material property. +await skyboxInfo.LoadAssetsAsync(); + +if (skyboxInfo.TryGetAsset("equirectangular-png", out var texture)) +{ + skyboxMaterial.mainTexture = texture; +} +``` + +#### [Request Skybox Export](https://api-documentation.blockadelabs.com/api/skybox-exports.html#request-export) + +Exports the skybox with the requested export type. + +```csharp +var skyboxId = 42; +var api = new BlockadeLabsClient(); var skyboxInfo = await api.SkyboxEndpoint.GetSkyboxInfoAsync(skyboxId); -Debug.Log($"Skybox: {result.Id} | {result.MainTextureUrl}"); -// Note: If you wish to use the returned skybox textures you'll need to additionally call await SkyboxInfo.LoadTexturesAsync(); before you can assign them to a material property. -await skyboxInfo.LoadTexturesAsync(); -skyboxMaterial.mainTexture = skyboxInfo.MainTexture; -skyboxMaterial.depthTexture = skyboxInfo.DepthTexture; +var exportOptions = await api.SkyboxEndpoint.GetAllSkyboxExportOptionsAsync(); +var exportOption = exportOptions.FirstOrDefault(option => option.Key == "depth-map-png"); +skyboxInfo = await api.SkyboxEndpoint.ExportSkyboxAsync(skyboxInfo, exportOption); +await skyboxInfo.LoadAssetsAsync(); + +if (skyboxInfo.TryGetAsset("depth-map-png", out var texture)) +{ + skyboxMaterial.depthTexture = skyboxInfo.DepthTexture; +} ``` #### [Delete Skybox](https://api-documentation.blockadelabs.com/api/skybox.html#delete) diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/dashboard.png b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/dashboard.png new file mode 100644 index 0000000..30b6b8f Binary files /dev/null and b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/dashboard.png differ diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/history-editor.png b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/history-editor.png new file mode 100644 index 0000000..6ce0c42 Binary files /dev/null and b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/history-editor.png differ diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/skybox-editor.png b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/skybox-editor.png new file mode 100644 index 0000000..d364426 Binary files /dev/null and b/BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/skybox-editor.png differ diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsDashboard.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsDashboard.cs new file mode 100644 index 0000000..e574b41 --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsDashboard.cs @@ -0,0 +1,910 @@ +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using BlockadeLabs.Skyboxes; +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading.Tasks; +using UnityEditor; +using UnityEngine; +using UnityEngine.Video; +using Utilities.WebRequestRest; +using Object = UnityEngine.Object; +using Progress = UnityEditor.Progress; + +namespace BlockadeLabs.Editor +{ + public sealed class BlockadeLabsDashboard : EditorWindow + { + private const int TabWidth = 18; + private const int EndWidth = 10; + private const int InnerLabelIndentLevel = 13; + private const int MaxCharacterLength = 5000; + + private const float InnerLabelWidth = 1.9f; + private const float DefaultColumnWidth = 96f; + private const float WideColumnWidth = 128f; + private const float SettingsLabelWidth = 1.56f; + + private static readonly GUIContent guiTitleContent = new GUIContent("BlockadeLabs Dashboard"); + private static readonly GUIContent saveDirectoryContent = new GUIContent("Save Directory"); + private static readonly GUIContent downloadContent = new GUIContent("Download"); + private static readonly GUIContent deleteContent = new GUIContent("Delete"); + private static readonly GUIContent refreshContent = new GUIContent("Refresh"); + + private static readonly string[] tabTitles = { "Skybox Generation", "History" }; + + private static GUIStyle boldCenteredHeaderStyle; + + private static GUIStyle BoldCenteredHeaderStyle + { + get + { + if (boldCenteredHeaderStyle == null) + { + var editorStyle = EditorGUIUtility.isProSkin ? EditorStyles.whiteLargeLabel : EditorStyles.largeLabel; + + if (editorStyle != null) + { + boldCenteredHeaderStyle = new GUIStyle(editorStyle) + { + alignment = TextAnchor.MiddleCenter, + fontSize = 18, + padding = new RectOffset(0, 0, -8, -8) + }; + } + } + + return boldCenteredHeaderStyle; + } + } + + private static string DefaultSaveDirectoryKey => $"{Application.productName}_BlockadeLabs_EditorDownloadDirectory"; + + private static string DefaultSaveDirectory => Application.dataPath; + + private static readonly GUILayoutOption[] defaultColumnWidthOption = + { + GUILayout.Width(DefaultColumnWidth) + }; + + private static readonly GUILayoutOption[] wideColumnWidthOption = + { + GUILayout.Width(WideColumnWidth) + }; + + private static readonly GUILayoutOption[] expandWidthOption = + { + GUILayout.ExpandWidth(true) + }; + + #region static content + + private static BlockadeLabsClient api; + + private static string editorDownloadDirectory = string.Empty; + + private static bool isGeneratingSkybox; + + private static IReadOnlyList skyboxStyles = new List(); + + private static GUIContent[] skyboxOptions = Array.Empty(); + + private static SkyboxStyle currentSkyboxStyleSelection; + + private static GUIContent[] exportOptions = Array.Empty(); + + private static SkyboxExportOption currentSkyboxExportOption; + + private static bool isFetchingSkyboxStyles; + private static bool hasFetchedSkyboxStyles; + + private static IReadOnlyList skyboxExportOptions = new List(); + + private static bool isFetchingSkyboxExportOptions; + private static bool hasFetchedSkyboxExportOptions; + + private static bool hasFetchedHistory; + private static bool isFetchingSkyboxHistory; + + private static SkyboxHistory history; + + private static int page; + + private static int limit = 100; + + #endregion static content + + [SerializeField] + private int tab; + + [SerializeField] + private int currentSkyboxStyleId; + + [SerializeField] + private int currentSkyboxExportId = 1; + + private Vector2 scrollPosition = Vector2.zero; + + private string promptText; + + private string negativeText; + + private int seed; + + private bool enhancePrompt; + + private Texture2D controlImage; + + [MenuItem("Window/Dashboards/Bloackade Labs", false, priority: 999)] + private static void OpenWindow() + { + // Dock it next to the Scene View. + var instance = GetWindow(typeof(SceneView)); + instance.Show(); + instance.titleContent = guiTitleContent; + } + + private void OnEnable() + { + titleContent = guiTitleContent; + minSize = new Vector2(WideColumnWidth * 4.375F, WideColumnWidth * 4); + } + + private void OnFocus() + { + api ??= new BlockadeLabsClient(); + + if (!hasFetchedSkyboxStyles) + { + hasFetchedSkyboxStyles = true; + FetchSkyboxStyles(); + } + + if (!hasFetchedSkyboxExportOptions) + { + hasFetchedSkyboxExportOptions = true; + FetchSkyboxExportOptions(); + } + + if (!hasFetchedHistory) + { + hasFetchedHistory = true; + FetchSkyboxHistory(); + } + } + + private void OnGUI() + { + EditorGUILayout.BeginVertical(); + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(TabWidth); + EditorGUILayout.BeginVertical(); + { // Begin Header + EditorGUILayout.Space(); + EditorGUILayout.LabelField("BlockadeLabs Dashboard", BoldCenteredHeaderStyle); + EditorGUILayout.Space(); + + if (api is not { HasValidAuthentication: true }) + { + EditorGUILayout.HelpBox($"No valid {nameof(BlockadeLabsConfiguration)} was found. This tool requires that you set your API key.", MessageType.Error); + return; + } + + EditorGUILayout.Space(); + EditorGUI.BeginChangeCheck(); + tab = GUILayout.Toolbar(tab, tabTitles, expandWidthOption); + + if (EditorGUI.EndChangeCheck()) + { + GUI.FocusControl(null); + } + + EditorGUILayout.LabelField(saveDirectoryContent); + + if (string.IsNullOrWhiteSpace(editorDownloadDirectory)) + { + editorDownloadDirectory = EditorPrefs.GetString(DefaultSaveDirectoryKey, DefaultSaveDirectory); + } + + EditorGUILayout.BeginHorizontal(); + { + EditorGUILayout.TextField(editorDownloadDirectory, expandWidthOption); + + if (GUILayout.Button("Reset", wideColumnWidthOption)) + { + editorDownloadDirectory = DefaultSaveDirectory; + EditorPrefs.SetString(DefaultSaveDirectoryKey, editorDownloadDirectory); + } + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + { + if (GUILayout.Button("Change Save Directory", expandWidthOption)) + { + EditorApplication.delayCall += () => + { + var result = EditorUtility.OpenFolderPanel("Save Directory", editorDownloadDirectory, string.Empty); + + if (!string.IsNullOrWhiteSpace(result)) + { + editorDownloadDirectory = result; + EditorPrefs.SetString(DefaultSaveDirectoryKey, editorDownloadDirectory); + } + }; + } + } + EditorGUILayout.EndHorizontal(); + } // End Header + EditorGUILayout.EndVertical(); + GUILayout.Space(EndWidth); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, expandWidthOption); + + switch (tab) + { + case 0: + SkyboxGeneration(); + break; + case 1: + RenderHistory(); + break; + } + + EditorGUILayout.EndScrollView(); + EditorGUILayout.EndVertical(); + } + + private void SkyboxGeneration() + { + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(TabWidth); + EditorGUILayout.BeginVertical(); + EditorGUILayout.LabelField("Describe your world"); + promptText = EditorGUILayout.TextArea(promptText); + EditorGUILayout.LabelField("Negative text"); + negativeText = EditorGUILayout.TextArea(negativeText); + EditorGUILayout.Space(); + enhancePrompt = EditorGUILayout.Toggle("Enhance Prompt", enhancePrompt); + seed = EditorGUILayout.IntField("Seed", seed); + controlImage = EditorGUILayout.ObjectField(new GUIContent("Control Image"), controlImage, typeof(Texture2D), false) as Texture2D; + { // skybox style dropdown + var skyboxIndex = -1; + currentSkyboxStyleSelection ??= skyboxStyles?.FirstOrDefault(skyboxStyle => skyboxStyle.Id == currentSkyboxStyleId); + + if (currentSkyboxStyleSelection != null) + { + for (var i = 0; i < skyboxOptions.Length; i++) + { + if (skyboxOptions[i].text.Contains(currentSkyboxStyleSelection.Name)) + { + skyboxIndex = i; + break; + } + } + } + + EditorGUI.BeginChangeCheck(); + skyboxIndex = EditorGUILayout.Popup(new GUIContent("Style"), skyboxIndex, skyboxOptions); + + if (EditorGUI.EndChangeCheck()) + { + currentSkyboxStyleSelection = skyboxStyles?.FirstOrDefault(skyboxStyle => skyboxOptions[skyboxIndex].text.Contains(skyboxStyle.Name)); + currentSkyboxStyleId = currentSkyboxStyleSelection!.Id; + } + } + { // export option dropdown + var exportIndex = -1; + currentSkyboxExportOption ??= skyboxExportOptions?.FirstOrDefault(exportOption => exportOption.Id == currentSkyboxExportId); + + if (currentSkyboxExportOption != null) + { + for (int i = 0; i < exportOptions.Length; i++) + { + if (exportOptions[i].text.Contains(currentSkyboxExportOption.Name)) + { + exportIndex = i; + break; + } + } + } + + EditorGUI.BeginChangeCheck(); + exportIndex = EditorGUILayout.Popup(new GUIContent("Export"), exportIndex, exportOptions); + + if (EditorGUI.EndChangeCheck()) + { + currentSkyboxExportOption = skyboxExportOptions?.FirstOrDefault(option => exportOptions[exportIndex].text.Contains(option.Name)); + currentSkyboxExportId = currentSkyboxExportOption!.Id; + } + } + EditorGUILayout.Space(); + + GUI.enabled = !isGeneratingSkybox; + + if (GUILayout.Button("Generate")) + { + GenerateSkybox(); + } + + GUI.enabled = true; + EditorGUILayout.EndVertical(); + GUILayout.Space(EndWidth); + EditorGUILayout.EndHorizontal(); + } + + private static async void FetchSkyboxStyles() + { + if (isFetchingSkyboxStyles) { return; } + isFetchingSkyboxStyles = true; + + try + { + skyboxStyles = await api.SkyboxEndpoint.GetSkyboxStylesAsync(); + skyboxOptions = skyboxStyles.Select(skyboxStyle => new GUIContent(skyboxStyle.Name)).ToArray(); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + isFetchingSkyboxStyles = false; + } + } + + private static async void FetchSkyboxExportOptions() + { + if (isFetchingSkyboxExportOptions) { return; } + isFetchingSkyboxExportOptions = true; + + try + { + skyboxExportOptions = (await api.SkyboxEndpoint.GetAllSkyboxExportOptionsAsync()).OrderBy(option => option.Key).ToList(); + exportOptions = skyboxExportOptions.Select(option => new GUIContent(option.Name)).ToArray(); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + isFetchingSkyboxExportOptions = false; + } + } + + private async void GenerateSkybox() + { + if (isGeneratingSkybox) { return; } + isGeneratingSkybox = true; + int? progressId = null; + + try + { + if (AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(controlImage)) is TextureImporter textureImporter) + { + if (!textureImporter.isReadable) + { + throw new Exception($"Enable Read/Write in Texture asset import settings for {controlImage.name}"); + } + + if (textureImporter.textureCompression != TextureImporterCompression.Uncompressed) + { + throw new Exception($"Disable compression in Texture asset import settings for {controlImage.name}"); + } + } + + using var skyboxRequest = controlImage == null + ? new SkyboxRequest( + prompt: promptText, + negativeText: negativeText, + enhancePrompt: enhancePrompt, + skyboxStyleId: currentSkyboxStyleSelection?.Id, + seed: seed) + : new SkyboxRequest( + prompt: promptText, + negativeText: negativeText, + enhancePrompt: enhancePrompt, + controlImage: controlImage, + skyboxStyleId: currentSkyboxStyleSelection?.Id, + seed: seed); + promptText = string.Empty; + negativeText = string.Empty; + controlImage = null; + progressId = Progress.Start("Generating Skybox", promptText, options: Progress.Options.Indefinite); + var skyboxInfo = await api.SkyboxEndpoint.GenerateSkyboxAsync(skyboxRequest, currentSkyboxExportOption); + await SaveSkyboxAssetAsync(skyboxInfo); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + if (progressId.HasValue) + { + Progress.Finish(progressId.Value); + } + + isGeneratingSkybox = false; + EditorApplication.delayCall += FetchSkyboxHistory; + } + } + + private static readonly ConcurrentDictionary loadingSkyboxes = new ConcurrentDictionary(); + + private static async void SaveAllSkyboxAssets(SkyboxInfo skyboxInfo) + { + if (loadingSkyboxes.TryAdd(skyboxInfo.ObfuscatedId, skyboxInfo)) + { + try + { + await skyboxInfo.LoadAssetsAsync(); + await SaveSkyboxAssetAsync(skyboxInfo); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + loadingSkyboxes.TryRemove(skyboxInfo.ObfuscatedId, out _); + } + } + else + { + Debug.LogWarning($"Skybox {skyboxInfo.ObfuscatedId} is already loading assets. Try again later."); + } + } + + private static async Task SaveSkyboxAssetAsync(SkyboxInfo skyboxInfo) + { + var importTasks = new List(); + + foreach (var export in skyboxInfo.Exports) + { + if (skyboxInfo.TryGetAssetCachePath(export.Key, out var cachedPath)) + { + importTasks.Add(CopyFileAsync(editorDownloadDirectory, cachedPath, skyboxInfo, export.Key)); + } + } + + AssetDatabase.DisallowAutoRefresh(); + try + { + await Task.WhenAll(importTasks).ConfigureAwait(true); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + AssetDatabase.AllowAutoRefresh(); + } + + AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); + } + + private static async Task CopyFileAsync(string directory, string cachedPath, SkyboxInfo skybox, string exportKey) + { + if (!Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + cachedPath = cachedPath.Replace("file://", string.Empty); + var shallowPath = cachedPath + .Replace(Rest.DownloadCacheDirectory, string.Empty) + .Replace("/", "\\"); + var importPath = $"{directory.Replace("/", "\\")}{shallowPath}"; + + if (File.Exists(importPath)) { return; } + File.Copy(cachedPath, importPath); + importPath = GetLocalPath(importPath); + AssetDatabase.ImportAsset(importPath); + var asset = AssetDatabase.LoadAssetAtPath(importPath); + + if (asset == null) + { + Debug.LogError($"Failed to import asset at {importPath}"); + return; + } + + Debug.Log($"{asset.GetType().Name}::{asset.name}"); + + switch (asset) + { + case DefaultAsset: + if (importPath.EndsWith(".zip")) + { + var files = await ExportUtilities.UnZipAsync(importPath); + var textures = new List(); + + foreach (var file in files) + { + AssetDatabase.ImportAsset(file); + + if (AssetImporter.GetAtPath(file) is TextureImporter textureImporter) + { + textureImporter.isReadable = true; + textureImporter.mipmapEnabled = false; + textureImporter.alphaIsTransparency = false; + textureImporter.wrapMode = TextureWrapMode.Clamp; + textureImporter.alphaSource = TextureImporterAlphaSource.None; + textureImporter.textureCompression = TextureImporterCompression.Uncompressed; + textureImporter.SaveAndReimport(); + } + + var texture = AssetDatabase.LoadAssetAtPath(file); + textures.Add(texture); + } + + var cubemap = new Cubemap(textures.First().width, TextureFormat.RGB24, false, true); + + try + { + foreach (var texture in textures) + { + switch (texture.name) + { + case "cube_up": + var rotation = exportKey.Contains("roblox") + ? ExportUtilities.TextureRotation.Counterclockwise90 + : ExportUtilities.TextureRotation.Rotate180; + cubemap.SetCubemapTexture(texture.Rotate(rotation), CubemapFace.PositiveY); + break; + case "cube_down": + rotation = exportKey.Contains("roblox") + ? ExportUtilities.TextureRotation.Clockwise90 + : ExportUtilities.TextureRotation.Rotate180; + cubemap.SetCubemapTexture(texture.Rotate(rotation), CubemapFace.NegativeY); + break; + case "cube_front": + cubemap.SetCubemapTexture(texture, CubemapFace.PositiveZ); + break; + case "cube_back": + cubemap.SetCubemapTexture(texture, CubemapFace.NegativeZ); + break; + case "cube_right": + cubemap.SetCubemapTexture(texture, CubemapFace.PositiveX); + break; + case "cube_left": + cubemap.SetCubemapTexture(texture, CubemapFace.NegativeX); + break; + } + } + + var assetPath = Path.ChangeExtension(importPath, "cubemap"); + AssetDatabase.CreateAsset(cubemap, assetPath); + AssetDatabase.DeleteAsset(importPath); + skybox.exportedAssets[exportKey] = cubemap; + } + catch (Exception e) + { + Debug.LogError($"Failed to import cubemap at {importPath}!\n{e}"); + } + } + else + { + Debug.LogWarning($"Unhandled asset at {importPath}"); + } + break; + case Texture2D texture: + SetSkyboxTextureImportSettings(importPath); + skybox.exportedAssets[exportKey] = texture; + break; + case VideoClip videoClip: + skybox.exportedAssets[exportKey] = videoClip; + break; + } + } + + private static void SetSkyboxTextureImportSettings(string path) + { + if (AssetImporter.GetAtPath(path) is not TextureImporter textureImporter) { return; } + + textureImporter.isReadable = true; + textureImporter.mipmapEnabled = false; + textureImporter.alphaIsTransparency = false; + textureImporter.wrapMode = TextureWrapMode.Clamp; + textureImporter.alphaSource = TextureImporterAlphaSource.None; + + if (path.Contains("depth-map")) + { + textureImporter.wrapModeU = TextureWrapMode.Repeat; + textureImporter.wrapModeV = TextureWrapMode.Clamp; + } + else + { + textureImporter.npotScale = TextureImporterNPOTScale.None; + textureImporter.textureCompression = TextureImporterCompression.Uncompressed; + textureImporter.maxTextureSize = 6144; + } + + textureImporter.SaveAndReimport(); + } + + private void RenderHistory() + { + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(TabWidth); + { //Header + EditorGUILayout.LabelField("History", EditorStyles.boldLabel, wideColumnWidthOption); + + GUI.enabled = !isFetchingSkyboxHistory; + if (history != null && page > 0 && GUILayout.Button("Prev Page")) + { + page--; + EditorApplication.delayCall += FetchSkyboxHistory; + } + + if (history is { HasMore: true } && GUILayout.Button("Next Page")) + { + page++; + EditorApplication.delayCall += FetchSkyboxHistory; + } + + EditorGUI.BeginChangeCheck(); + limit = EditorGUILayout.IntField("page items", limit); + + if (EditorGUI.EndChangeCheck()) + { + if (limit > 100) + { + limit = 100; + } + + if (limit < 1) + { + limit = 1; + } + } + + GUILayout.FlexibleSpace(); + + if (GUILayout.Button(refreshContent, defaultColumnWidthOption)) + { + EditorApplication.delayCall += FetchSkyboxHistory; + } + + GUI.enabled = true; + } + GUILayout.Space(EndWidth); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + + if (history == null) { return; } + + EditorGUILayout.BeginHorizontal(); + GUILayout.Space(TabWidth); + EditorGUILayout.BeginVertical(); + + foreach (var skybox in history.Skyboxes) + { + GUILayout.Space(TabWidth); + Utilities.Extensions.Editor.EditorGUILayoutExtensions.Divider(); + if (skybox == null) { continue; } + + EditorGUILayout.BeginVertical(); + EditorGUILayout.BeginHorizontal(); + { // skybox title + EditorGUILayout.LabelField($"{skybox.Title} {skybox.Status} {skybox.CreatedAt}"); + + if (GUILayout.Button(deleteContent, defaultColumnWidthOption)) + { + EditorApplication.delayCall += () => DeleteSkybox(skybox); + } + } + EditorGUILayout.EndHorizontal(); + EditorGUILayout.BeginHorizontal(); + { // Download and export all options + GUI.enabled = !loadingSkyboxes.TryGetValue(skybox.ObfuscatedId, out _); + + var hasAllDownloads = skybox.Exports.All(export => Rest.TryGetFileNameFromUrl(export.Value, out var filename) && File.Exists(GetFullLocalPath(skybox, export.Key, Path.GetExtension(filename)))); + + if (!hasAllDownloads && + GUILayout.Button("Download All", defaultColumnWidthOption)) + { + EditorApplication.delayCall += () => SaveAllSkyboxAssets(skybox); + } + + if (!skyboxExportOptions.All(option => skybox.Exports.ContainsKey(option.Key)) && + GUILayout.Button("Export All", defaultColumnWidthOption)) + { + EditorApplication.delayCall += () => Export(skybox, skyboxExportOptions.Where(exportOption => !skybox.Exports.ContainsKey(exportOption.Key)).ToArray()); + } + + GUI.enabled = true; + } + EditorGUILayout.EndHorizontal(); + + foreach (var export in skyboxExportOptions) + { + if (skybox.Exports.TryGetValue(export.Key, out var exportUrl)) + { + Rest.TryGetFileNameFromUrl(exportUrl, out var filename); + var assetPath = GetFullLocalPath(skybox, export.Key, Path.GetExtension(filename)); + + if (File.Exists(assetPath)) + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(export.Key, expandWidthOption); + var asset = AssetDatabase.LoadAssetAtPath(GetLocalPath(assetPath)); + + if (asset != null) + { + switch (export.Key) + { + case "cube-map-default-png": + case "cube-map-roblox-png": + EditorGUILayout.ObjectField(asset, typeof(Cubemap), false); + break; + case "equirectangular-png": + case "equirectangular-jpg": + case "depth-map-png": + case "hdri-hdr": + case "hdri-exr": + EditorGUILayout.ObjectField(asset, typeof(Texture2D), false); + break; + case "video-landscape-mp4": + case "video-portrait-mp4": + case "video-square-mp4": + EditorGUILayout.ObjectField(asset, typeof(VideoClip), false); + break; + default: + Debug.LogWarning($"Unhandled export key: {export.Key}"); + EditorGUILayout.ObjectField(asset, typeof(Object), false); + break; + } + } + else + { + EditorGUILayout.HelpBox($"Failed to load {export.Key} asset!", MessageType.Error); + } + + EditorGUILayout.EndHorizontal(); + } + else + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(export.Key); + + if (GUILayout.Button(downloadContent, defaultColumnWidthOption)) + { + EditorApplication.delayCall += async () => + { + try + { + if (skybox.TryGetAssetCachePath(export.Key, out var cachedPath)) + { + await CopyFileAsync(editorDownloadDirectory, cachedPath, skybox, export.Key); + } + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); + } + }; + } + + EditorGUILayout.EndHorizontal(); + } + } + else + { + EditorGUILayout.BeginHorizontal(); + EditorGUILayout.LabelField(export.Key); + + if (GUILayout.Button("Export", defaultColumnWidthOption)) + { + EditorApplication.delayCall += () => + { + Debug.Log($"Exporting: {skybox.Id} -> {export.Name}"); + Export(skybox, export); + }; + } + + EditorGUILayout.EndHorizontal(); + } + } + + EditorGUILayout.EndVertical(); + GUILayout.Space(EndWidth); + } + + EditorGUILayout.EndVertical(); + GUILayout.Space(EndWidth); + EditorGUILayout.EndHorizontal(); + EditorGUILayout.Space(); + } + + private static async void Export(SkyboxInfo skybox, params SkyboxExportOption[] options) + { + var exportTasks = new List(); + + foreach (var exportOption in options) + { + exportTasks.Add(api.SkyboxEndpoint.ExportSkyboxAsync(skybox, exportOption)); + } + + try + { + await Task.WhenAll(exportTasks).ConfigureAwait(true); + skybox = await api.SkyboxEndpoint.GetSkyboxInfoAsync(skybox.Id); + SaveAllSkyboxAssets(skybox); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + EditorApplication.delayCall += FetchSkyboxHistory; + } + } + + private static string GetFullLocalPath(SkyboxInfo skybox, string assetType, string extension) + => Path.Combine(editorDownloadDirectory, $"{skybox.ObfuscatedId}-{assetType}{extension}").Replace("\\", "/").Replace(".zip", ".cubemap"); + + private static string GetLocalPath(string path) + => path.Replace("\\", "/").Replace(Application.dataPath, "Assets"); + + private static async void DeleteSkybox(SkyboxInfo skyboxInfo) + { + if (!EditorUtility.DisplayDialog( + "Attention!", + $"Are you sure you want to delete skybox {skyboxInfo.Id}?\n\n({skyboxInfo.ObfuscatedId})", + "Delete", + "Cancel")) + { + return; + } + + try + { + var success = await api.SkyboxEndpoint.DeleteSkyboxAsync(skyboxInfo.Id); + + if (!success) + { + Debug.LogError($"Failed to delete skybox {skyboxInfo.Id} ({skyboxInfo.ObfuscatedId})!"); + } + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + AssetDatabase.Refresh(ImportAssetOptions.ForceUpdate); + EditorApplication.delayCall += FetchSkyboxHistory; + } + } + + private static async void FetchSkyboxHistory() + { + if (isFetchingSkyboxHistory) { return; } + isFetchingSkyboxHistory = true; + + try + { + history = await api.SkyboxEndpoint.GetSkyboxHistoryAsync(new SkyboxHistoryParameters { Limit = limit, Offset = page }); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + isFetchingSkyboxHistory = false; + } + } + } +} diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsEditorWindow.cs.meta b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsDashboard.cs.meta similarity index 100% rename from BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsEditorWindow.cs.meta rename to BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsDashboard.cs.meta diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsEditorWindow.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsEditorWindow.cs deleted file mode 100644 index 38de859..0000000 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/BlockadeLabsEditorWindow.cs +++ /dev/null @@ -1,599 +0,0 @@ -using BlockadeLabs.Skyboxes; -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using UnityEditor; -using UnityEngine; -using Utilities.Async; -using Utilities.WebRequestRest; -using Task = System.Threading.Tasks.Task; - -namespace BlockadeLabs.Editor -{ - public sealed class BlockadeLabsEditorWindow : EditorWindow - { - private const int TabWidth = 18; - private const int EndWidth = 10; - private const int InnerLabelIndentLevel = 13; - private const int MaxCharacterLength = 5000; - - private const float InnerLabelWidth = 1.9f; - private const float DefaultColumnWidth = 96f; - private const float WideColumnWidth = 128f; - private const float SettingsLabelWidth = 1.56f; - - private static readonly GUIContent guiTitleContent = new GUIContent("BlockadeLabs Dashboard"); - private static readonly GUIContent saveDirectoryContent = new GUIContent("Save Directory"); - private static readonly GUIContent downloadContent = new GUIContent("Download"); - private static readonly GUIContent deleteContent = new GUIContent("Delete"); - private static readonly GUIContent refreshContent = new GUIContent("Refresh"); - - private static readonly string[] tabTitles = { "Skybox Generation", "History" }; - - private static GUIStyle boldCenteredHeaderStyle; - - private static GUIStyle BoldCenteredHeaderStyle - { - get - { - if (boldCenteredHeaderStyle == null) - { - var editorStyle = EditorGUIUtility.isProSkin ? EditorStyles.whiteLargeLabel : EditorStyles.largeLabel; - - if (editorStyle != null) - { - boldCenteredHeaderStyle = new GUIStyle(editorStyle) - { - alignment = TextAnchor.MiddleCenter, - fontSize = 18, - padding = new RectOffset(0, 0, -8, -8) - }; - } - } - - return boldCenteredHeaderStyle; - } - } - - private static string DefaultSaveDirectoryKey => $"{Application.productName}_BlockadeLabs_EditorDownloadDirectory"; - - private static string DefaultSaveDirectory => Application.dataPath; - - private static readonly GUILayoutOption[] defaultColumnWidthOption = - { - GUILayout.Width(DefaultColumnWidth) - }; - - private static readonly GUILayoutOption[] wideColumnWidthOption = - { - GUILayout.Width(WideColumnWidth) - }; - - private static readonly GUILayoutOption[] expandWidthOption = - { - GUILayout.ExpandWidth(true) - }; - - #region static content - - private static BlockadeLabsClient api; - - private static string editorDownloadDirectory = string.Empty; - - private static bool isGeneratingSkybox; - - private static IReadOnlyList skyboxStyles = new List(); - - private static GUIContent[] skyboxOptions = Array.Empty(); - - private static SkyboxStyle currentSkyboxStyleSelection; - - private static bool isFetchingSkyboxStyles; - private static bool hasFetchedSkyboxStyles; - - private static bool hasFetchedHistory; - private static bool isFetchingSkyboxHistory; - - private static SkyboxHistory history; - - private static int page; - - private static int limit = 100; - - #endregion static content - - [SerializeField] - private int tab; - - [SerializeField] - private int currentSkyboxStyleId; - - private Vector2 scrollPosition = Vector2.zero; - - private string promptText; - - private string negativeText; - - private int seed; - - private bool depth; - - private Texture2D controlImage; - - [MenuItem("BlockadeLabs/Dashboard")] - private static void OpenWindow() - { - // Dock it next to the Scene View. - var instance = GetWindow(typeof(SceneView)); - instance.Show(); - instance.titleContent = guiTitleContent; - } - - private void OnEnable() - { - titleContent = guiTitleContent; - minSize = new Vector2(WideColumnWidth * 5, WideColumnWidth * 4); - } - - private void OnFocus() - { - api ??= new BlockadeLabsClient(); - - if (!hasFetchedSkyboxStyles) - { - hasFetchedSkyboxStyles = true; - FetchSkyboxStyles(); - } - - if (!hasFetchedHistory) - { - hasFetchedHistory = true; - FetchSkyboxHistory(); - } - } - - private void OnGUI() - { - EditorGUILayout.BeginVertical(); - scrollPosition = EditorGUILayout.BeginScrollView(scrollPosition, expandWidthOption); - EditorGUILayout.BeginHorizontal(); - GUILayout.Space(TabWidth); - EditorGUILayout.BeginVertical(); - { // Begin Header - EditorGUILayout.Space(); - EditorGUILayout.LabelField("BlockadeLabs Dashboard", BoldCenteredHeaderStyle); - EditorGUILayout.Space(); - - if (api is not { HasValidAuthentication: true }) - { - EditorGUILayout.HelpBox($"No valid {nameof(BlockadeLabsConfiguration)} was found. This tool requires that you set your API key.", MessageType.Error); - return; - } - - EditorGUILayout.Space(); - EditorGUI.BeginChangeCheck(); - tab = GUILayout.Toolbar(tab, tabTitles, expandWidthOption); - - if (EditorGUI.EndChangeCheck()) - { - GUI.FocusControl(null); - } - - EditorGUILayout.LabelField(saveDirectoryContent); - - if (string.IsNullOrWhiteSpace(editorDownloadDirectory)) - { - editorDownloadDirectory = EditorPrefs.GetString(DefaultSaveDirectoryKey, DefaultSaveDirectory); - } - - EditorGUILayout.BeginHorizontal(); - { - EditorGUILayout.TextField(editorDownloadDirectory, expandWidthOption); - - if (GUILayout.Button("Reset", wideColumnWidthOption)) - { - editorDownloadDirectory = DefaultSaveDirectory; - EditorPrefs.SetString(DefaultSaveDirectoryKey, editorDownloadDirectory); - } - } - EditorGUILayout.EndHorizontal(); - EditorGUILayout.BeginHorizontal(); - { - if (GUILayout.Button("Change Save Directory", expandWidthOption)) - { - EditorApplication.delayCall += () => - { - var result = EditorUtility.OpenFolderPanel("Save Directory", editorDownloadDirectory, string.Empty); - - if (!string.IsNullOrWhiteSpace(result)) - { - editorDownloadDirectory = result; - EditorPrefs.SetString(DefaultSaveDirectoryKey, editorDownloadDirectory); - } - }; - } - } - EditorGUILayout.EndHorizontal(); - } // End Header - EditorGUILayout.EndVertical(); - GUILayout.Space(EndWidth); - EditorGUILayout.EndHorizontal(); - EditorGUILayout.Space(); - - switch (tab) - { - case 0: - SkyboxGeneration(); - break; - case 1: - RenderHistory(); - break; - } - - EditorGUILayout.EndScrollView(); - EditorGUILayout.EndVertical(); - } - - private void SkyboxGeneration() - { - EditorGUILayout.BeginHorizontal(); - GUILayout.Space(TabWidth); - EditorGUILayout.BeginVertical(); - EditorGUILayout.LabelField("Describe your world"); - promptText = EditorGUILayout.TextArea(promptText); - EditorGUILayout.LabelField("Negative text"); - negativeText = EditorGUILayout.TextArea(negativeText); - EditorGUILayout.Space(); - seed = EditorGUILayout.IntField("Seed", seed); - depth = EditorGUILayout.Toggle("Depth", depth); - controlImage = EditorGUILayout.ObjectField(new GUIContent("Control Image"), controlImage, typeof(Texture2D), false) as Texture2D; - - EditorGUILayout.BeginHorizontal(); - { // skybox style dropdown - var skyboxIndex = -1; - - currentSkyboxStyleSelection ??= skyboxStyles?.FirstOrDefault(skyboxStyle => skyboxStyle.Id == currentSkyboxStyleId); - - if (currentSkyboxStyleSelection != null) - { - for (var i = 0; i < skyboxOptions.Length; i++) - { - if (skyboxOptions[i].text.Contains(currentSkyboxStyleSelection.Name)) - { - skyboxIndex = i; - break; - } - } - } - - EditorGUI.BeginChangeCheck(); - skyboxIndex = EditorGUILayout.Popup(new GUIContent("Style"), skyboxIndex, skyboxOptions); - - if (EditorGUI.EndChangeCheck()) - { - currentSkyboxStyleSelection = skyboxStyles?.FirstOrDefault(voice => skyboxOptions[skyboxIndex].text.Contains(voice.Name)); - currentSkyboxStyleId = currentSkyboxStyleSelection!.Id; - } - } - EditorGUILayout.EndHorizontal(); - EditorGUILayout.Space(); - - GUI.enabled = !isGeneratingSkybox; - - if (GUILayout.Button("Generate")) - { - GenerateSkybox(); - } - - GUI.enabled = true; - EditorGUILayout.EndVertical(); - GUILayout.Space(EndWidth); - EditorGUILayout.EndHorizontal(); - } - - private static async void FetchSkyboxStyles() - { - if (isFetchingSkyboxStyles) { return; } - isFetchingSkyboxStyles = true; - - try - { - skyboxStyles = await api.SkyboxEndpoint.GetSkyboxStylesAsync(); - skyboxOptions = skyboxStyles.Select(skyboxStyle => new GUIContent(skyboxStyle.Name)).ToArray(); - } - catch (Exception e) - { - Debug.LogError(e); - } - finally - { - isFetchingSkyboxStyles = false; - } - } - - private async void GenerateSkybox() - { - if (isGeneratingSkybox) { return; } - isGeneratingSkybox = true; - - try - { - if (AssetImporter.GetAtPath(AssetDatabase.GetAssetPath(controlImage)) is TextureImporter textureImporter) - { - if (!textureImporter.isReadable) - { - throw new Exception($"Enable Read/Write in Texture asset import settings for {controlImage.name}"); - } - - if (textureImporter.textureCompression != TextureImporterCompression.Uncompressed) - { - throw new Exception($"Disable compression in Texture asset import settings for {controlImage.name}"); - } - } - - using var skyboxRequest = controlImage == null - ? new SkyboxRequest( - prompt: promptText, - negativeText: negativeText, - skyboxStyleId: currentSkyboxStyleSelection?.Id, - seed: seed, - depth: depth) - : new SkyboxRequest( - prompt: promptText, - negativeText: negativeText, - controlImage: controlImage, - skyboxStyleId: currentSkyboxStyleSelection?.Id, - seed: seed, - depth: depth); - promptText = string.Empty; - negativeText = string.Empty; - controlImage = null; - var skyboxInfo = await api.SkyboxEndpoint.GenerateSkyboxAsync(skyboxRequest); - await SaveSkyboxAssetAsync(skyboxInfo); - } - catch (Exception e) - { - Debug.LogError(e); - } - finally - { - isGeneratingSkybox = false; - } - } - - private static readonly ConcurrentDictionary loadingSkyboxes = new ConcurrentDictionary(); - - private static async void SaveSkyboxAsset(SkyboxInfo skyboxInfo) - { - loadingSkyboxes.TryAdd(skyboxInfo.Id, skyboxInfo); - await skyboxInfo.LoadTexturesAsync(); - await SaveSkyboxAssetAsync(skyboxInfo); - loadingSkyboxes.TryRemove(skyboxInfo.Id, out _); - } - - private static async Task SaveSkyboxAssetAsync(SkyboxInfo skyboxInfo) - { - if (skyboxInfo.MainTexture == null) - { - Debug.LogError("No main texture found!"); - return; - } - - await Awaiters.UnityMainThread; - var directory = editorDownloadDirectory.Replace(Application.dataPath, "Assets"); - - var mainTexturePath = string.Empty; - var depthTexturePath = string.Empty; - var mainTextureBytes = skyboxInfo.MainTexture != null ? skyboxInfo.MainTexture.EncodeToPNG() : Array.Empty(); - - if (mainTextureBytes.Length > 0) - { - mainTexturePath = $"{directory}/{skyboxInfo.MainTexture!.name}.png"; - Debug.Log(mainTexturePath); - } - - var depthTextureBytes = skyboxInfo.DepthTexture != null ? skyboxInfo.DepthTexture.EncodeToPNG() : Array.Empty(); - - if (depthTextureBytes.Length > 0) - { - depthTexturePath = $"{directory}/{skyboxInfo.DepthTexture!.name}.depth.png"; - Debug.Log(depthTexturePath); - } - - var importTasks = new List(2) - { - Task.Run(async () => - { - if (mainTextureBytes.Length > 0) - { - await SaveTextureAsync(mainTexturePath, mainTextureBytes); - } - }), - Task.Run(async () => - { - if (depthTextureBytes.Length > 0) - { - await SaveTextureAsync(depthTexturePath, depthTextureBytes); - } - }) - }; - - await Task.WhenAll(importTasks); - await Awaiters.UnityMainThread; - - if (AssetImporter.GetAtPath(mainTexturePath) is TextureImporter mainTextureImporter) - { - mainTextureImporter.alphaIsTransparency = false; - mainTextureImporter.alphaSource = TextureImporterAlphaSource.None; - } - - if (AssetImporter.GetAtPath(depthTexturePath) is TextureImporter depthTextureImporter) - { - depthTextureImporter.alphaIsTransparency = false; - depthTextureImporter.alphaSource = TextureImporterAlphaSource.None; - } - - EditorApplication.delayCall += () => - { - AssetDatabase.Refresh(); - var mainTexture = AssetDatabase.LoadAssetAtPath(mainTexturePath); - EditorGUIUtility.PingObject(mainTexture); - }; - } - - private static async Task SaveTextureAsync(string path, byte[] pngBytes) - { - var fileStream = File.OpenWrite(path); - - try - { - await fileStream.WriteAsync(pngBytes, 0, pngBytes.Length); - } - catch (Exception e) - { - Debug.LogError($"Failed to write texture to disk!\n{e}"); - } - finally - { - await fileStream.DisposeAsync(); - } - } - - private void RenderHistory() - { - EditorGUILayout.BeginHorizontal(); - GUILayout.Space(TabWidth); - { //Header - EditorGUILayout.LabelField("History", EditorStyles.boldLabel, wideColumnWidthOption); - - GUI.enabled = !isFetchingSkyboxHistory; - if (history != null && page > 0 && GUILayout.Button("Prev Page")) - { - page--; - EditorApplication.delayCall += FetchSkyboxHistory; - } - - if (history is { HasMore: true } && GUILayout.Button("Next Page")) - { - page++; - EditorApplication.delayCall += FetchSkyboxHistory; - } - - EditorGUI.BeginChangeCheck(); - limit = EditorGUILayout.IntField("page items", limit); - - if (EditorGUI.EndChangeCheck()) - { - if (limit > 100) - { - limit = 100; - } - - if (limit < 1) - { - limit = 1; - } - } - - GUILayout.FlexibleSpace(); - - if (GUILayout.Button(refreshContent, defaultColumnWidthOption)) - { - EditorApplication.delayCall += FetchSkyboxHistory; - } - - GUI.enabled = true; - } - GUILayout.Space(EndWidth); - EditorGUILayout.EndHorizontal(); - EditorGUILayout.Space(); - - if (history == null) { return; } - - EditorGUILayout.BeginHorizontal(); - GUILayout.Space(TabWidth); - EditorGUILayout.BeginVertical(); - - foreach (var skybox in history.Skyboxes) - { - if (Rest.TryGetFileNameFromUrl(skybox.MainTextureUrl, out var mainTextureFilePath)) - { - mainTextureFilePath = Path.Combine(editorDownloadDirectory, mainTextureFilePath).Replace("\\", "/").Replace(".jpg", ".png"); - } - - if (Rest.TryGetFileNameFromUrl(skybox.DepthTextureUrl, out var depthTextureFilePath)) - { - depthTextureFilePath = Path.Combine(editorDownloadDirectory, $"{depthTextureFilePath}").Replace("\\", "/").Replace(".jpg", ".depth.png"); - } - - EditorGUILayout.BeginVertical(); - EditorGUILayout.LabelField($"{skybox.Title} {skybox.Status} {skybox.CreatedAt}"); - - if (!File.Exists(mainTextureFilePath)) - { - GUI.enabled = !loadingSkyboxes.TryGetValue(skybox.Id, out _); - - if (GUILayout.Button("Download", defaultColumnWidthOption)) - { - EditorApplication.delayCall += () => - { - SaveSkyboxAsset(skybox); - }; - } - - GUI.enabled = true; - } - else - { - var mainLocalPath = mainTextureFilePath.Replace(Application.dataPath, "Assets"); - var mainImageAsset = AssetDatabase.LoadAssetAtPath(mainLocalPath); - - if (mainImageAsset != null) - { - EditorGUILayout.ObjectField(mainImageAsset, typeof(Texture2D), false); - } - - if (File.Exists(depthTextureFilePath)) - { - var depthLocalPath = depthTextureFilePath.Replace(Application.dataPath, "Assets"); - var depthImageAsset = AssetDatabase.LoadAssetAtPath(depthLocalPath); - - if (depthImageAsset != null) - { - EditorGUILayout.ObjectField(depthImageAsset, typeof(Texture2D), false); - } - } - } - - EditorGUILayout.EndVertical(); - } - - EditorGUILayout.EndVertical(); - GUILayout.Space(EndWidth); - EditorGUILayout.EndHorizontal(); - EditorGUILayout.Space(); - } - - private static async void FetchSkyboxHistory() - { - if (isFetchingSkyboxHistory) { return; } - isFetchingSkyboxHistory = true; - - try - { - history = await api.SkyboxEndpoint.GetSkyboxHistoryAsync(new SkyboxHistoryParameters { Limit = limit, Offset = page }); - //Debug.Log($"history item count: {history.TotalCount} | hasMore? {history.HasMore}"); - } - catch (Exception e) - { - Debug.LogError(e); - } - finally - { - isFetchingSkyboxHistory = false; - } - } - } -} diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/CubemapExtensions.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/CubemapExtensions.cs new file mode 100644 index 0000000..721afa9 --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/CubemapExtensions.cs @@ -0,0 +1,25 @@ +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using System; +using UnityEngine; + +namespace BlockadeLabs.Editor +{ + internal static class CubemapExtensions + { + private const string UnityEditorTextureUtil = "UnityEditor.TextureUtil, UnityEditor"; + + private static Type TextureUtil { get; } = Type.GetType(UnityEditorTextureUtil); + + private static System.Reflection.MethodInfo CopyTextureIntoCubemapFace { get; } = + TextureUtil.GetMethod( + nameof(CopyTextureIntoCubemapFace), + System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.Public, + null, + new[] { typeof(Texture2D), typeof(Cubemap), typeof(CubemapFace) }, + null); + + internal static void SetCubemapTexture(this Cubemap cubemap, Texture2D texture, CubemapFace face) + => CopyTextureIntoCubemapFace.Invoke(null, new object[] { texture, cubemap, (int)face }); + } +} diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/CubemapExtensions.cs.meta b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/CubemapExtensions.cs.meta new file mode 100644 index 0000000..1bad8f7 --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Editor/CubemapExtensions.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: db9c8e8388a385d4ca9252e6f4db36ac +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c0cdfd8ee0b46544aa66ab20cde3ddd1, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/BlockadeLabsClient.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/BlockadeLabsClient.cs index 94e650c..2d9c9ec 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/BlockadeLabsClient.cs +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/BlockadeLabsClient.cs @@ -13,11 +13,6 @@ public sealed class BlockadeLabsClient : BaseClient !string.IsNullOrWhiteSpace(Authentication?.Info?.ApiKey); - internal JsonSerializerSettings JsonSerializationOptions { get; } + internal static JsonSerializerSettings JsonSerializationOptions { get; } = new JsonSerializerSettings + { + DefaultValueHandling = DefaultValueHandling.Ignore + }; public SkyboxEndpoint SkyboxEndpoint { get; } } diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/ExportUtilities.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/ExportUtilities.cs new file mode 100644 index 0000000..f9add9a --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/ExportUtilities.cs @@ -0,0 +1,193 @@ +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Unity.SharpZipLib.Zip; +using UnityEngine; + +namespace BlockadeLabs +{ + internal static class ExportUtilities + { + /// + /// Unzips the archive at the specified path. + /// + /// + /// + /// List of files in the archive. + internal static async Task> UnZipAsync(string path, CancellationToken cancellationToken = default) + { + path = path.Replace("file://", string.Empty); + var zipStream = new FileStream(path, FileMode.Open, FileAccess.Read); + var directory = Path.Combine(Path.GetDirectoryName(path)!, Path.GetFileNameWithoutExtension(path)); + + if (!Directory.Exists(directory)) + { + Directory.CreateDirectory(directory); + } + + var fileList = new List(); + + try + { + var zipFile = new ZipFile(zipStream); + + foreach (ZipEntry entry in zipFile) + { + var filePath = Path.Combine(directory, entry.Name); + + if (File.Exists(filePath)) + { + File.Delete(filePath); + } + + var parentDirectory = Directory.GetParent(filePath)!; + + if (!parentDirectory.Exists) + { + Directory.CreateDirectory(parentDirectory.FullName); + } + + var itemStream = zipFile.GetInputStream(entry); + + try + { + var fileStream = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write, FileShare.None); + + try + { + await itemStream.CopyToAsync(fileStream, cancellationToken); + await fileStream.FlushAsync(cancellationToken); + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + fileStream.Close(); + await fileStream.DisposeAsync(); + } + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + itemStream.Close(); + await itemStream.DisposeAsync(); + } + + fileList.Add(filePath); + } + } + catch (Exception e) + { + Debug.LogError(e); + } + finally + { + await zipStream.DisposeAsync(); + } + + return fileList; + } + + /// + /// Creates a cubemap with specified files. + /// + /// List of local files to be used to create . + /// + internal static Cubemap BuildCubemap(IReadOnlyList textures) + { + if (textures is not { Count: 6 }) + { + throw new ArgumentException("Must have 6 textures for each face of the cubemap"); + } + + var cubemap = new Cubemap(textures.First().width, TextureFormat.RGB24, false, true); + + foreach (var face in textures) + { + switch (face.name) + { + case "cube_up": + cubemap.SetPixels(face.GetPixels(), CubemapFace.PositiveY); + break; + case "cube_down": + cubemap.SetPixels(face.GetPixels(), CubemapFace.NegativeY); + break; + case "cube_front": + cubemap.SetPixels(face.GetPixels(), CubemapFace.PositiveZ); + break; + case "cube_back": + cubemap.SetPixels(face.GetPixels(), CubemapFace.NegativeZ); + break; + case "cube_right": + cubemap.SetPixels(face.GetPixels(), CubemapFace.PositiveX); + break; + case "cube_left": + cubemap.SetPixels(face.GetPixels(), CubemapFace.NegativeX); + break; + } + } + + cubemap.Apply(false); + return cubemap; + } + + internal enum TextureRotation + { + Clockwise90, + Counterclockwise90, + Rotate180 + } + + internal static Texture2D Rotate(this Texture2D texture, TextureRotation rotation) + { + var width = texture.width; + var height = texture.height; + var pixels = texture.GetPixels32(); + var rotatedPixels = new Color32[pixels.Length]; + + switch (rotation) + { + case TextureRotation.Clockwise90: + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + rotatedPixels[x * height + (height - y - 1)] = pixels[y * width + x]; + } + } + break; + + case TextureRotation.Counterclockwise90: + for (int y = 0; y < height; y++) + { + for (int x = 0; x < width; x++) + { + rotatedPixels[(width - x - 1) * height + y] = pixels[y * width + x]; + } + } + break; + + case TextureRotation.Rotate180: + for (int i = 0; i < pixels.Length; i++) + { + rotatedPixels[i] = pixels[pixels.Length - i - 1]; + } + break; + } + + texture.SetPixels32(rotatedPixels); + texture.Apply(); + return texture; + } + } +} diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/ExportUtilities.cs.meta b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/ExportUtilities.cs.meta new file mode 100644 index 0000000..a39e9b9 --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/ExportUtilities.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 62a66b0200ebe9146b340dc441bd9d95 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c0cdfd8ee0b46544aa66ab20cde3ddd1, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxEndpoint.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxEndpoint.cs index e63f422..5b8a7fc 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxEndpoint.cs +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxEndpoint.cs @@ -4,9 +4,11 @@ using System; using System.Collections.Generic; using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using UnityEngine; +using UnityEngine.Networking; using UnityEngine.Scripting; using Utilities.WebRequestRest; @@ -63,18 +65,19 @@ private class SkyboxOperation public async Task> GetSkyboxStylesAsync(CancellationToken cancellationToken = default) { var response = await Rest.GetAsync(GetUrl("skybox/styles"), parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); - response.Validate(); - return JsonConvert.DeserializeObject>(response.Body, client.JsonSerializationOptions); + response.Validate(EnableDebug); + return JsonConvert.DeserializeObject>(response.Body, BlockadeLabsClient.JsonSerializationOptions); } /// /// Generate a skybox image. /// /// . + /// Optional, . /// Optional, polling interval in seconds. /// Optional, . /// . - public async Task GenerateSkyboxAsync(SkyboxRequest skyboxRequest, int? pollingInterval = null, CancellationToken cancellationToken = default) + public async Task GenerateSkyboxAsync(SkyboxRequest skyboxRequest, SkyboxExportOption exportOption = null, int? pollingInterval = null, CancellationToken cancellationToken = default) { var formData = new WWWForm(); formData.AddField("prompt", skyboxRequest.Prompt); @@ -84,6 +87,11 @@ public async Task GenerateSkyboxAsync(SkyboxRequest skyboxRequest, i formData.AddField("negative_text", skyboxRequest.NegativeText); } + if (skyboxRequest.EnhancePrompt.HasValue) + { + formData.AddField("enhance_prompt", skyboxRequest.EnhancePrompt.ToString()); + } + if (skyboxRequest.Seed.HasValue) { formData.AddField("seed", skyboxRequest.Seed.Value); @@ -99,11 +107,6 @@ public async Task GenerateSkyboxAsync(SkyboxRequest skyboxRequest, i formData.AddField("remix_imagine_id", skyboxRequest.RemixImagineId.Value); } - if (skyboxRequest.Depth) - { - formData.AddField("return_depth", skyboxRequest.Depth.ToString()); - } - if (skyboxRequest.ControlImage != null) { if (!string.IsNullOrWhiteSpace(skyboxRequest.ControlModel)) @@ -118,20 +121,14 @@ public async Task GenerateSkyboxAsync(SkyboxRequest skyboxRequest, i } var response = await Rest.PostAsync(GetUrl("skybox"), formData, parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); - response.Validate(); - var skyboxInfo = JsonConvert.DeserializeObject(response.Body, client.JsonSerializationOptions); + response.Validate(EnableDebug); + var skyboxInfo = JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); while (!cancellationToken.IsCancellationRequested) { - await Task.Delay(pollingInterval ?? 3 * 1000, CancellationToken.None) - .ConfigureAwait(true); // Configure await to make sure we're still in Unity context + await Task.Delay(pollingInterval ?? 3000, CancellationToken.None).ConfigureAwait(true); skyboxInfo = await GetSkyboxInfoAsync(skyboxInfo, CancellationToken.None); - - if (skyboxInfo.Status is Status.Pending or Status.Processing or Status.Dispatched) - { - continue; - } - + if (skyboxInfo.Status is Status.Pending or Status.Processing or Status.Dispatched) { continue; } break; } @@ -152,7 +149,25 @@ await Task.Delay(pollingInterval ?? 3 * 1000, CancellationToken.None) throw new Exception($"Failed to generate skybox! {skyboxInfo.Id} -> {skyboxInfo.Status}\nError: {skyboxInfo.ErrorMessage}\n{skyboxInfo}"); } - await skyboxInfo.LoadTexturesAsync(cancellationToken); + if (exportOption != null) + { + skyboxInfo = await ExportSkyboxAsync(skyboxInfo, exportOption, pollingInterval, cancellationToken); + } + else + { + var exportOptions = await GetAllSkyboxExportOptionsAsync(cancellationToken); + var info = skyboxInfo; + var pngExportTasks = new List + { + ExportSkyboxAsync(info, exportOptions.FirstOrDefault(option => option.Key.Equals("equirectangular-png")), pollingInterval, cancellationToken), + ExportSkyboxAsync(info, exportOptions.FirstOrDefault(option => option.Key.Equals("depth-map-png")), pollingInterval, cancellationToken) + }; + + await Task.WhenAll(pngExportTasks).ConfigureAwait(true); + skyboxInfo = await GetSkyboxInfoAsync(skyboxInfo.Id, cancellationToken); + } + + await skyboxInfo.LoadAssetsAsync(cancellationToken); return skyboxInfo; } @@ -165,8 +180,8 @@ await Task.Delay(pollingInterval ?? 3 * 1000, CancellationToken.None) public async Task GetSkyboxInfoAsync(int id, CancellationToken cancellationToken = default) { var response = await Rest.GetAsync(GetUrl($"imagine/requests/{id}"), parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); - response.Validate(); - return JsonConvert.DeserializeObject(response.Body, client.JsonSerializationOptions).SkyboxInfo; + response.Validate(EnableDebug); + return JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions).SkyboxInfo; } /// @@ -178,8 +193,8 @@ public async Task GetSkyboxInfoAsync(int id, CancellationToken cance public async Task DeleteSkyboxAsync(int id, CancellationToken cancellationToken = default) { var response = await Rest.DeleteAsync(GetUrl($"imagine/deleteImagine/{id}"), new RestParameters(client.DefaultRequestHeaders), cancellationToken); - response.Validate(); - var skyboxOp = JsonConvert.DeserializeObject(response.Body, client.JsonSerializationOptions); + response.Validate(EnableDebug); + var skyboxOp = JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); const string successStatus = "Item deleted successfully"; @@ -200,9 +215,47 @@ public async Task DeleteSkyboxAsync(int id, CancellationToken cancellation public async Task GetSkyboxHistoryAsync(SkyboxHistoryParameters parameters = null, CancellationToken cancellationToken = default) { var historyRequest = parameters ?? new SkyboxHistoryParameters(); - var response = await Rest.GetAsync(GetUrl($"imagine/myRequests{historyRequest}"), parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); - response.Validate(); - return JsonConvert.DeserializeObject(response.Body, client.JsonSerializationOptions); + + var @params = new Dictionary(); + + if (historyRequest.StatusFilter.HasValue) + { + @params.Add("status", historyRequest.StatusFilter.ToString().ToLower()); + } + + if (historyRequest.Limit.HasValue) + { + @params.Add("limit", historyRequest.Limit.ToString()); + } + + if (historyRequest.Offset.HasValue) + { + @params.Add("offset", historyRequest.Offset.ToString()); + } + + if (historyRequest.Order.HasValue) + { + @params.Add("order:", historyRequest.Order.ToString().ToUpper()); + } + + if (historyRequest.ImagineId.HasValue) + { + @params.Add("imagine_id", historyRequest.ImagineId.ToString()); + } + + if (!string.IsNullOrWhiteSpace(historyRequest.QueryFilter)) + { + @params.Add("query", UnityWebRequest.EscapeURL(historyRequest.QueryFilter)); + } + + if (!string.IsNullOrWhiteSpace(historyRequest.GeneratorFilter)) + { + @params.Add("generator", UnityWebRequest.EscapeURL(historyRequest.GeneratorFilter)); + } + + var response = await Rest.GetAsync(GetUrl($"imagine/myRequests", @params), parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); + response.Validate(EnableDebug); + return JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); } /// @@ -214,8 +267,8 @@ public async Task GetSkyboxHistoryAsync(SkyboxHistoryParameters p public async Task CancelSkyboxGenerationAsync(int id, CancellationToken cancellationToken = default) { var response = await Rest.DeleteAsync(GetUrl($"imagine/requests/{id}"), new RestParameters(client.DefaultRequestHeaders), cancellationToken); - response.Validate(); - var skyboxOp = JsonConvert.DeserializeObject(response.Body, client.JsonSerializationOptions); + response.Validate(EnableDebug); + var skyboxOp = JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); if (skyboxOp is not { Success: "true" }) { @@ -229,11 +282,12 @@ public async Task CancelSkyboxGenerationAsync(int id, CancellationToken ca /// Cancels ALL pending skybox generation requests. /// /// Optional, . + /// True, if all generations are cancelled. public async Task CancelAllPendingSkyboxGenerationsAsync(CancellationToken cancellationToken = default) { var response = await Rest.DeleteAsync(GetUrl("imagine/requests/pending"), new RestParameters(client.DefaultRequestHeaders), cancellationToken); - response.Validate(); - var skyboxOp = JsonConvert.DeserializeObject(response.Body, client.JsonSerializationOptions); + response.Validate(EnableDebug); + var skyboxOp = JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); if (skyboxOp is not { Success: "true" }) { @@ -248,5 +302,96 @@ public async Task CancelAllPendingSkyboxGenerationsAsync(CancellationToken return skyboxOp.Success.Equals("true"); } + + /// + /// Returns the list of all available export types. + /// + /// Optional, . + /// A list of available export types. + public async Task> GetAllSkyboxExportOptionsAsync(CancellationToken cancellationToken = default) + { + var response = await Rest.GetAsync(GetUrl("skybox/export"), parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); + response.Validate(EnableDebug); + return JsonConvert.DeserializeObject>(response.Body, BlockadeLabsClient.JsonSerializationOptions); + } + + /// + /// Exports the using the provided . + /// + /// Skybox to export. + /// Export option to use. + /// Optional, polling interval in seconds. + /// Optional, . + /// Updated with exported assets loaded into memory. + public async Task ExportSkyboxAsync(SkyboxInfo skyboxInfo, SkyboxExportOption exportOption, int? pollingInterval = null, CancellationToken cancellationToken = default) + { + var payload = $"{{\"skybox_id\":\"{skyboxInfo.ObfuscatedId}\",\"type_id\":{exportOption.Id}}}"; + var response = await Rest.PostAsync(GetUrl("skybox/export"), payload, new RestParameters(client.DefaultRequestHeaders), cancellationToken); + response.Validate(EnableDebug); + + var exportRequest = JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); + + while (!cancellationToken.IsCancellationRequested) + { + await Task.Delay(pollingInterval ?? 3000, CancellationToken.None).ConfigureAwait(true); + exportRequest = await GetExportRequestStatusAsync(exportRequest, CancellationToken.None); + if (exportRequest.Status is Status.Pending or Status.Processing or Status.Dispatched) { continue; } + break; + } + + if (cancellationToken.IsCancellationRequested) + { + var cancelResult = await CancelSkyboxExportAsync(exportRequest, CancellationToken.None); + + if (!cancelResult) + { + throw new Exception($"Failed to cancel export for {exportRequest.Id}"); + } + } + + cancellationToken.ThrowIfCancellationRequested(); + + if (exportRequest.Status != Status.Complete) + { + throw new Exception($"Failed to export skybox! {exportRequest.Id} -> {exportRequest.Status}\nError: {exportRequest.ErrorMessage}\n{exportRequest}"); + } + + skyboxInfo = await GetSkyboxInfoAsync(skyboxInfo.Id, cancellationToken); + cancellationToken.ThrowIfCancellationRequested(); + return skyboxInfo; + } + + /// + /// Gets the status of a specified . + /// + /// The export option to get the current status for. + /// Optional, . + /// Updated with latest information. + public async Task GetExportRequestStatusAsync(SkyboxExportRequest exportRequest, CancellationToken cancellationToken = default) + { + var response = await Rest.GetAsync(GetUrl($"skybox/export/{exportRequest.Id}"), parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); + response.Validate(EnableDebug); + return JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); + } + + /// + /// Cancels the specified . + /// + /// The export option to cancel. + /// Optional, . + /// True, if generation was cancelled. + public async Task CancelSkyboxExportAsync(SkyboxExportRequest exportRequest, CancellationToken cancellationToken = default) + { + var response = await Rest.DeleteAsync(GetUrl($"skybox/export/{exportRequest.Id}"), parameters: new RestParameters(client.DefaultRequestHeaders), cancellationToken); + response.Validate(EnableDebug); + var skyboxOp = JsonConvert.DeserializeObject(response.Body, BlockadeLabsClient.JsonSerializationOptions); + + if (skyboxOp is not { Success: "true" }) + { + throw new Exception($"Failed to cancel export for request {exportRequest.Id}!\n{skyboxOp?.Error}"); + } + + return skyboxOp.Success.Equals("true"); + } } } diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportOption.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportOption.cs new file mode 100644 index 0000000..cbf72f7 --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportOption.cs @@ -0,0 +1,41 @@ +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using Newtonsoft.Json; +using System; +using UnityEngine; + +namespace BlockadeLabs.Skyboxes +{ + [Serializable] + public sealed class SkyboxExportOption + { + [JsonConstructor] + public SkyboxExportOption( + [JsonProperty("id")] int id, + [JsonProperty("name")] string name, + [JsonProperty("key")] string key) + { + this.name = name; + this.id = id; + this.key = key; + } + + [SerializeField] + private string name; + + [JsonProperty("name")] + public string Name => name; + + [SerializeField] + private int id; + + [JsonProperty("id")] + public int Id => id; + + [SerializeField] + private string key; + + [JsonProperty("key")] + public string Key => key; + } +} diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportOption.cs.meta b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportOption.cs.meta new file mode 100644 index 0000000..a53824a --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportOption.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 175fad6991d171443ab33cdf145ba1dd +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c0cdfd8ee0b46544aa66ab20cde3ddd1, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportRequest.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportRequest.cs new file mode 100644 index 0000000..5ce5558 --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportRequest.cs @@ -0,0 +1,51 @@ +// Licensed under the MIT License. See LICENSE in the project root for license information. + +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System; + +namespace BlockadeLabs.Skyboxes +{ + public sealed class SkyboxExportRequest + { + public SkyboxExportRequest( + [JsonProperty("id")] string id, + [JsonProperty("type")] string type, + [JsonProperty("type_id")] int typeId, + [JsonProperty("status")] Status status, + [JsonProperty("queue_position")] int queuePosition, + [JsonProperty("created_at")] DateTime createdAt, + [JsonProperty("error_message")] string errorMessage = null) + { + Id = id; + Type = type; + TypeId = typeId; + Status = status; + QueuePosition = queuePosition; + CreatedAt = createdAt; + ErrorMessage = errorMessage; + } + + [JsonProperty("id")] + public string Id { get; } + + [JsonProperty("type")] + public string Type { get; } + + [JsonProperty("type_id")] + public int TypeId { get; } + + [JsonProperty("status")] + [JsonConverter(typeof(StringEnumConverter))] + public Status Status { get; } + + [JsonProperty("queue_position")] + public int QueuePosition { get; } + + [JsonProperty("created_at")] + public DateTime CreatedAt { get; } + + [JsonProperty("error_message")] + public string ErrorMessage { get; } + } +} diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportRequest.cs.meta b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportRequest.cs.meta new file mode 100644 index 0000000..83a2d71 --- /dev/null +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxExportRequest.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: f325f1167cab49b498a1a4e4b89e37e4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {fileID: 2800000, guid: c0cdfd8ee0b46544aa66ab20cde3ddd1, type: 3} + userData: + assetBundleName: + assetBundleVariant: diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxHistoryParameters.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxHistoryParameters.cs index 2e90183..5d9b7b2 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxHistoryParameters.cs +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxHistoryParameters.cs @@ -1,8 +1,5 @@ // Licensed under the MIT License. See LICENSE in the project root for license information. -using System.Collections.Generic; -using UnityEngine.Networking; - namespace BlockadeLabs.Skyboxes { public sealed class SkyboxHistoryParameters @@ -42,47 +39,5 @@ public sealed class SkyboxHistoryParameters /// Filter by generator /// public string GeneratorFilter { get; set; } - - public override string ToString() - { - var @params = new List(); - - if (StatusFilter.HasValue) - { - @params.Add($"status={StatusFilter.ToString().ToLower()}"); - } - - if (Limit.HasValue) - { - @params.Add($"limit={Limit}"); - } - - if (Offset.HasValue) - { - @params.Add($"offset={Offset}"); - } - - if (Order.HasValue) - { - @params.Add($"order={Order.ToString().ToUpper()}"); - } - - if (ImagineId.HasValue) - { - @params.Add($"imagine_id={ImagineId}"); - } - - if (!string.IsNullOrWhiteSpace(QueryFilter)) - { - @params.Add($"query={UnityWebRequest.EscapeURL(QueryFilter)}"); - } - - if (!string.IsNullOrWhiteSpace(GeneratorFilter)) - { - @params.Add($"generator={UnityWebRequest.EscapeURL(GeneratorFilter)}"); - } - - return @params.Count == 0 ? string.Empty : $"?{string.Join('&', @params)}"; - } } } diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxInfo.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxInfo.cs index 6cd8ba0..8fd598e 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxInfo.cs +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxInfo.cs @@ -4,10 +4,15 @@ using Newtonsoft.Json.Converters; using System; using System.Collections.Generic; +using System.IO; +using System.Linq; using System.Threading; using System.Threading.Tasks; using UnityEngine; +using Utilities.Async; using Utilities.WebRequestRest; +using Debug = UnityEngine.Debug; +using Object = UnityEngine.Object; namespace BlockadeLabs.Skyboxes { @@ -31,7 +36,8 @@ public sealed class SkyboxInfo [JsonProperty("dispatched_at")] DateTime dispatchedAt, [JsonProperty("processing_at")] DateTime processingAt, [JsonProperty("completed_at")] DateTime completedAt, - [JsonProperty("error_message")] string errorMessage = null) + [JsonProperty("error_message")] string errorMessage = null, + [JsonProperty("exports")] Dictionary exports = null) { Id = id; SkyboxStyleId = skyboxStyleId; @@ -50,6 +56,10 @@ public sealed class SkyboxInfo ProcessingAt = processingAt; CompletedAt = completedAt; ErrorMessage = errorMessage; + exports ??= new Dictionary(); + exports.TryAdd("equirectangular-png", mainTextureUrl); + exports.TryAdd("depth-map-png", depthTextureUrl); + Exports = exports; } [JsonProperty("id")] @@ -72,9 +82,10 @@ public sealed class SkyboxInfo public string Type { get; } [JsonProperty("file_url")] - public string MainTextureUrl { get; } + public string MainTextureUrl { get; private set; } [JsonIgnore] + [Obsolete("Get texture from ExportedAssets")] public Texture2D MainTexture { get; internal set; } [JsonProperty("thumb_url")] @@ -84,9 +95,10 @@ public sealed class SkyboxInfo public Texture2D Thumbnail { get; internal set; } [JsonProperty("depth_map_url")] - public string DepthTextureUrl { get; } + public string DepthTextureUrl { get; private set; } [JsonIgnore] + [Obsolete("Get depth from ExportedAssets")] public Texture2D DepthTexture { get; internal set; } [JsonProperty("title")] @@ -111,9 +123,18 @@ public sealed class SkyboxInfo public DateTime CompletedAt { get; } [JsonProperty("error_message")] - public string ErrorMessage { get; set; } + public string ErrorMessage { get; } - public override string ToString() => JsonConvert.SerializeObject(this, Formatting.Indented); + [JsonProperty("exports")] + public IReadOnlyDictionary Exports { get; } + + // ReSharper disable once InconsistentNaming + internal readonly Dictionary exportedAssets = new Dictionary(); + + [JsonIgnore] + public IReadOnlyDictionary ExportedAssets => exportedAssets; + + public override string ToString() => JsonConvert.SerializeObject(this, Formatting.Indented, BlockadeLabsClient.JsonSerializationOptions); public static implicit operator int(SkyboxInfo skyboxInfo) => skyboxInfo.Id; @@ -121,34 +142,117 @@ public sealed class SkyboxInfo /// Loads the textures for this skybox. /// /// Optional, . + [Obsolete("Use LoadAssetsAsync")] public async Task LoadTexturesAsync(CancellationToken cancellationToken = default) + => await LoadAssetsAsync(cancellationToken); + + /// + /// Downloads and loads all of the assets associated with this skybox. + /// + /// Optional, . + public async Task LoadAssetsAsync(CancellationToken cancellationToken = default) { - var downloadTasks = new List(2) + async Task DownloadThumbnail() { - Task.Run(async () => + if (!string.IsNullOrWhiteSpace(ThumbUrl)) { - if (!string.IsNullOrWhiteSpace(ThumbUrl)) - { - Thumbnail = await Rest.DownloadTextureAsync(ThumbUrl, parameters:null, cancellationToken: cancellationToken); - } - }, cancellationToken), - Task.Run(async () => + await Awaiters.UnityMainThread; + Rest.TryGetFileNameFromUrl(ThumbUrl, out var filename); + Thumbnail = await Rest.DownloadTextureAsync(ThumbUrl, fileName: $"{ObfuscatedId}-thumb{Path.GetExtension(filename)}", cancellationToken: cancellationToken); + } + } + + async Task DownloadExport(KeyValuePair export) + { + try { - if (!string.IsNullOrWhiteSpace(MainTextureUrl)) + await Awaiters.UnityMainThread; + var exportUrl = export.Value; + + if (!string.IsNullOrWhiteSpace(exportUrl)) { - MainTexture = await Rest.DownloadTextureAsync(MainTextureUrl, parameters: null, cancellationToken: cancellationToken); + Rest.TryGetFileNameFromUrl(exportUrl, out var filename); + var path = $"{ObfuscatedId}-{export.Key}{Path.GetExtension(filename)}"; + + switch (export.Key) + { + case "depth-map-png": + case "equirectangular-png": + case "equirectangular-jpg": + var texture = await Rest.DownloadTextureAsync(exportUrl, path, cancellationToken: cancellationToken); + exportedAssets[export.Key] = texture; + break; + case "cube-map-default-png": + case "cube-map-roblox-png": + var zipPath = await Rest.DownloadFileAsync(exportUrl, path, cancellationToken: cancellationToken); + var files = await ExportUtilities.UnZipAsync(zipPath, cancellationToken); + var textures = new List(); + + foreach (var file in files) + { + var face = await Rest.DownloadTextureAsync($"file://{file}", cancellationToken: cancellationToken); + textures.Add(face); + } + + var cubemap = ExportUtilities.BuildCubemap(textures); + exportedAssets[export.Key] = cubemap; + break; + case "hdri-hdr": + case "hdri-exr": + case "video-landscape-mp4": + case "video-portrait-mp4": + case "video-square-mp4": + await Rest.DownloadFileAsync(exportUrl, path, cancellationToken: cancellationToken); + break; + default: + Debug.LogWarning($"No download task defined for {export.Key}!"); + break; + } } - }, cancellationToken), - Task.Run(async () => - { - if (!string.IsNullOrWhiteSpace(DepthTextureUrl)) + else { - DepthTexture = await Rest.DownloadTextureAsync(DepthTextureUrl, parameters: null, cancellationToken: cancellationToken); + Debug.LogError($"No valid url for skybox {ObfuscatedId}.{export.Key}"); } - }, cancellationToken) - }; + } + catch (Exception e) + { + Debug.LogError(e); + } + } + var downloadTasks = new List { DownloadThumbnail() }; + downloadTasks.AddRange(Exports.Select(DownloadExport)); await Task.WhenAll(downloadTasks).ConfigureAwait(true); } + + public bool TryGetAssetCachePath(string key, out string localCachedPath) + { + if (Exports.TryGetValue(key, out var exportUrl) && + Rest.TryGetFileNameFromUrl(exportUrl, out var filename)) + { + var cachePath = Path.Combine(Rest.DownloadCacheDirectory, $"{ObfuscatedId}-{key}{Path.GetExtension(filename)}"); + return Rest.TryGetDownloadCacheItem($"file://{cachePath}", out localCachedPath); + } + + localCachedPath = string.Empty; + return false; + } + + public bool TryGetAsset(string key, out T asset) where T : Object + { + if (ExportedAssets.TryGetValue(key, out var obj)) + { + asset = (T)obj; + return true; + } + + if (Exports.ContainsKey(key)) + { + Debug.LogWarning($"{key} exists, but has not been loaded. Have you called {nameof(LoadAssetsAsync)}?"); + } + + asset = default; + return false; + } } } diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxRequest.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxRequest.cs index 12e6b1b..4d7a24d 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxRequest.cs +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Runtime/Skyboxes/SkyboxRequest.cs @@ -23,6 +23,9 @@ public sealed class SkyboxRequest : IDisposable /// If you are using then the maximum number of characters is defined /// in the negative-text-max-char response parameter defined for each style. /// + /// + /// Have an AI automatically improve your prompt to generate pro-level results every time (default: false) + /// /// /// Send 0 for a random seed generation. /// Any other number (1-2147483647) set will be used to "freeze" the image generator generator and @@ -34,16 +37,30 @@ public sealed class SkyboxRequest : IDisposable /// /// ID of a previously generated skybox. /// - /// - /// Return depth map image. - /// public SkyboxRequest( string prompt, string negativeText = null, + bool? enhancePrompt = null, int? seed = null, int? skyboxStyleId = null, - int? remixImagineId = null, - bool depth = false) + int? remixImagineId = null) + { + Prompt = prompt; + NegativeText = negativeText; + EnhancePrompt = enhancePrompt; + Seed = seed; + SkyboxStyleId = skyboxStyleId; + RemixImagineId = remixImagineId; + } + + [Obsolete] + public SkyboxRequest( + string prompt, + string negativeText, + int? seed, + int? skyboxStyleId, + int? remixImagineId, + bool depth) { Prompt = prompt; NegativeText = negativeText; @@ -75,6 +92,9 @@ public sealed class SkyboxRequest : IDisposable /// If you are using then the maximum number of characters is defined /// in the negative-text-max-char response parameter defined for each style. /// + /// + /// Have an AI automatically improve your prompt to generate pro-level results every time (default: false) + /// /// /// Send 0 for a random seed generation. /// Any other number (1-2147483647) set will be used to "freeze" the image generator generator and @@ -86,18 +106,38 @@ public sealed class SkyboxRequest : IDisposable /// /// ID of a previously generated skybox. /// - /// - /// Return depth map image. - /// public SkyboxRequest( string prompt, string controlImagePath, string controlModel = null, string negativeText = null, + bool? enhancePrompt = null, int? seed = null, int? skyboxStyleId = null, - int? remixImagineId = null, - bool depth = false) + int? remixImagineId = null) + : this( + prompt, + File.OpenRead(controlImagePath), + Path.GetFileName(controlImagePath), + controlModel, + negativeText, + enhancePrompt, + seed, + skyboxStyleId, + remixImagineId) + { + } + + [Obsolete] + public SkyboxRequest( + string prompt, + string controlImagePath, + string controlModel, + string negativeText, + int? seed, + int? skyboxStyleId, + int? remixImagineId, + bool depth) : this( prompt, File.OpenRead(controlImagePath), @@ -135,6 +175,9 @@ public sealed class SkyboxRequest : IDisposable /// If you are using then the maximum number of characters is defined /// in the negative-text-max-char response parameter defined for each style. /// + /// + /// Have an AI automatically improve your prompt to generate pro-level results every time (default: false) + /// /// /// Send 0 for a random seed generation. /// Any other number (1-2147483647) set will be used to "freeze" the image generator generator and @@ -146,18 +189,42 @@ public sealed class SkyboxRequest : IDisposable /// /// ID of a previously generated skybox. /// - /// - /// Return depth map image. - /// public SkyboxRequest( string prompt, Texture2D controlImage, string controlModel = null, string negativeText = null, + bool? enhancePrompt = null, int? seed = null, int? skyboxStyleId = null, - int? remixImagineId = null, - bool depth = false) + int? remixImagineId = null) + : this( + prompt, + new MemoryStream(controlImage.EncodeToPNG()), + !string.IsNullOrWhiteSpace(controlImage.name) ? $"{controlImage.name}.png" : null, + controlModel, + negativeText, + enhancePrompt, + seed, + skyboxStyleId, + remixImagineId) + { + if (controlImage.height != 512 || controlImage.width != 1024) + { + throw new ArgumentException($"{nameof(ControlImage)} dimensions should be 512x1024"); + } + } + + [Obsolete] + public SkyboxRequest( + string prompt, + Texture2D controlImage, + string controlModel, + string negativeText, + int? seed, + int? skyboxStyleId, + int? remixImagineId, + bool depth) : this( prompt, new MemoryStream(controlImage.EncodeToPNG()), @@ -200,6 +267,9 @@ public sealed class SkyboxRequest : IDisposable /// If you are using then the maximum number of characters is defined /// in the negative-text-max-char response parameter defined for each style. /// + /// + /// Have an AI automatically improve your prompt to generate pro-level results every time (default: false) + /// /// /// Send 0 for a random seed generation. /// Any other number (1-2147483647) set will be used to "freeze" the image generator generator and @@ -211,19 +281,41 @@ public sealed class SkyboxRequest : IDisposable /// /// ID of a previously generated skybox. /// - /// - /// Return depth map image. - /// public SkyboxRequest( string prompt, Stream controlImage, string controlImageFileName, string controlModel = null, string negativeText = null, + bool? enhancePrompt = null, int? seed = null, int? skyboxStyleId = null, - int? remixImagineId = null, - bool depth = false) + int? remixImagineId = null) + : this(prompt, negativeText, enhancePrompt, seed, skyboxStyleId, remixImagineId) + { + ControlImage = controlImage; + + if (string.IsNullOrWhiteSpace(controlImageFileName)) + { + const string defaultImageName = "control_image.png"; + controlImageFileName = defaultImageName; + } + + ControlImageFileName = controlImageFileName; + ControlModel = controlModel; + } + + [Obsolete] + public SkyboxRequest( + string prompt, + Stream controlImage, + string controlImageFileName, + string controlModel, + string negativeText, + int? seed, + int? skyboxStyleId, + int? remixImagineId, + bool depth) : this(prompt, negativeText, seed, skyboxStyleId, remixImagineId, depth) { ControlImage = controlImage; @@ -256,6 +348,11 @@ public sealed class SkyboxRequest : IDisposable /// public string NegativeText { get; } + /// + /// Have an AI automatically improve your prompt to generate pro-level results every time (default: false) + /// + public bool? EnhancePrompt { get; } + /// /// Send 0 for a random seed generation. /// Any other number (1-2147483647) set will be used to "freeze" the image generator generator and @@ -276,6 +373,7 @@ public sealed class SkyboxRequest : IDisposable /// /// Return depth map image. /// + [Obsolete] public bool Depth { get; } /// diff --git a/BlockadeLabs/Assets/Skybox.meta b/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox.meta similarity index 77% rename from BlockadeLabs/Assets/Skybox.meta rename to BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox.meta index ee20bcc..098e7ce 100644 --- a/BlockadeLabs/Assets/Skybox.meta +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 70519f90c0276684997c88d5a16429ae +guid: d1a39573e2d095d4b8a07a98732599fa folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxBehaviour.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxBehaviour.cs index 72f1ace..cb0c599 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxBehaviour.cs +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxBehaviour.cs @@ -82,8 +82,16 @@ private async void GenerateSkybox(string prompt) promptInputField.interactable = false; var request = new SkyboxRequest(prompt, skyboxStyleId: skyboxOptions[skyboxStyleDropdown.value].Id); var skyboxInfo = await api.SkyboxEndpoint.GenerateSkyboxAsync(request, cancellationToken: lifetimeCancellationTokenSource.Token).ConfigureAwait(true); - skyboxMaterial.mainTexture = skyboxInfo.MainTexture; - Debug.Log($"Successfully created skybox: {skyboxInfo.Id}"); + + if (skyboxInfo.TryGetAsset("equirectangular-png", out var texture)) + { + skyboxMaterial.mainTexture = texture; + Debug.Log($"Successfully created skybox: {skyboxInfo.Id}"); + } + else + { + Debug.LogError("Failed to load texture for generated skybox!"); + } } catch (Exception e) { @@ -99,6 +107,8 @@ private async void GenerateSkybox(string prompt) private void OnDestroy() { lifetimeCancellationTokenSource.Cancel(); + lifetimeCancellationTokenSource.Dispose(); + lifetimeCancellationTokenSource = null; } private async void GetSkyboxStyles() diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxMaterial.mat b/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxMaterial.mat index 606d5a0..05ce431 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxMaterial.mat +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Samples~/Skybox/SkyboxMaterial.mat @@ -9,6 +9,8 @@ Material: m_PrefabAsset: {fileID: 0} m_Name: SkyboxMaterial m_Shader: {fileID: 108, guid: 0000000000000000f000000000000000, type: 0} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 m_ValidKeywords: [] m_InvalidKeywords: - _MAPPING_LATITUDE_LONGITUDE_LAYOUT @@ -18,6 +20,7 @@ Material: m_CustomRenderQueue: -1 stringTagMap: {} disabledShaderPasses: [] + m_LockedProperties: m_SavedProperties: serializedVersion: 3 m_TexEnvs: diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/Tests/TestFixture_00_Skyboxes.cs b/BlockadeLabs/Packages/com.rest.blockadelabs/Tests/TestFixture_00_Skyboxes.cs index b62a773..ac65250 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/Tests/TestFixture_00_Skyboxes.cs +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/Tests/TestFixture_00_Skyboxes.cs @@ -4,13 +4,15 @@ using NUnit.Framework; using System; using System.Threading; +using System.Threading.Tasks; using UnityEngine; -using Task = System.Threading.Tasks.Task; namespace BlockadeLabs.Tests { public class TestFixture_01_Skyboxes { + private static SkyboxInfo testSkyboxInfo; + [Test] public async Task Test_01_GetSkyboxStyles() { @@ -31,15 +33,27 @@ public async Task Test_02_GenerateSkybox() var api = new BlockadeLabsClient(BlockadeLabsAuthentication.Default.LoadFromEnvironment()); Assert.IsNotNull(api.SkyboxEndpoint); - var request = new SkyboxRequest("mars", depth: true); + var request = new SkyboxRequest("mars", enhancePrompt: true); var skyboxInfo = await api.SkyboxEndpoint.GenerateSkyboxAsync(request); Assert.IsNotNull(skyboxInfo); Debug.Log($"Successfully created skybox: {skyboxInfo.Id}"); - Debug.Log(skyboxInfo.MainTextureUrl); - Assert.IsNotNull(skyboxInfo.MainTexture); - Debug.Log(skyboxInfo.DepthTextureUrl); - Assert.IsNotNull(skyboxInfo.DepthTexture); + + Assert.IsNotEmpty(skyboxInfo.Exports); + Assert.IsNotEmpty(skyboxInfo.ExportedAssets); + + foreach (var exportInfo in skyboxInfo.Exports) + { + Debug.Log($"{exportInfo.Key} -> {exportInfo.Value}"); + } + + foreach (var exportedAsset in skyboxInfo.ExportedAssets) + { + Debug.Log(exportedAsset.Key); + Assert.IsNotNull(exportedAsset.Value); + } + Debug.Log(skyboxInfo.ToString()); + testSkyboxInfo = skyboxInfo; } [Test] @@ -47,12 +61,23 @@ public async Task Test_03_GetSkyboxInfo() { var api = new BlockadeLabsClient(BlockadeLabsAuthentication.Default.LoadFromEnvironment()); Assert.IsNotNull(api.SkyboxEndpoint); - var skyboxId = 6602899; + var skyboxId = testSkyboxInfo.Id; var skyboxInfo = await api.SkyboxEndpoint.GetSkyboxInfoAsync(skyboxId); Assert.IsNotNull(skyboxInfo); - await skyboxInfo.LoadTexturesAsync(); - Assert.IsNotNull(skyboxInfo.MainTexture); - Assert.IsNotNull(skyboxInfo.DepthTexture); + await skyboxInfo.LoadAssetsAsync(); + Assert.IsNotEmpty(skyboxInfo.Exports); + Assert.IsNotEmpty(skyboxInfo.ExportedAssets); + + foreach (var exportInfo in skyboxInfo.Exports) + { + Debug.Log($"{exportInfo.Key} -> {exportInfo.Value}"); + } + + foreach (var exportedAsset in skyboxInfo.ExportedAssets) + { + Debug.Log(exportedAsset.Key); + Assert.IsNotNull(exportedAsset.Value); + } } [Test] @@ -76,12 +101,12 @@ public async Task Test_05_CancelPendingGeneration() { var api = new BlockadeLabsClient(BlockadeLabsAuthentication.Default.LoadFromEnvironment()); Assert.IsNotNull(api.SkyboxEndpoint); - var request = new SkyboxRequest("mars", depth: true); + var request = new SkyboxRequest("mars", enhancePrompt: true); var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1.5)); try { - await api.SkyboxEndpoint.GenerateSkyboxAsync(request, 1, cts.Token); + await api.SkyboxEndpoint.GenerateSkyboxAsync(request, pollingInterval: 1, cancellationToken: cts.Token); } catch (OperationCanceledException) { @@ -117,5 +142,52 @@ public async Task Test_07_DeleteSkybox() Assert.IsTrue(result); } } + + [Test] + public async Task Test_08_GetSkyboxExportOptions() + { + var api = new BlockadeLabsClient(BlockadeLabsAuthentication.Default.LoadFromEnvironment()); + Assert.IsNotNull(api.SkyboxEndpoint); + var exportOptions = await api.SkyboxEndpoint.GetAllSkyboxExportOptionsAsync(); + Assert.IsNotNull(exportOptions); + Assert.IsNotEmpty(exportOptions); + + foreach (var exportOption in exportOptions) + { + Debug.Log($"{exportOption.Id}: {exportOption.Name} | {exportOption.Key}"); + } + } + + [Test] + public async Task Test_09_ExportSkybox_All_Options() + { + var api = new BlockadeLabsClient(BlockadeLabsAuthentication.Default.LoadFromEnvironment()); + Assert.IsNotNull(api.SkyboxEndpoint); + var skyboxId = testSkyboxInfo.Id; + var skyboxInfo = await api.SkyboxEndpoint.GetSkyboxInfoAsync(skyboxId); + Assert.IsNotNull(skyboxInfo); + var exportOptions = await api.SkyboxEndpoint.GetAllSkyboxExportOptionsAsync(); + Assert.IsNotNull(exportOptions); + Assert.IsNotEmpty(exportOptions); + + foreach (var exportOption in exportOptions) + { + Debug.Log(exportOption.Key); + Assert.IsNotNull(exportOption); + skyboxInfo = await api.SkyboxEndpoint.ExportSkyboxAsync(skyboxInfo, exportOption); + Assert.IsNotNull(skyboxInfo); + Assert.IsTrue(skyboxInfo.Exports.ContainsKey(exportOption.Key)); + skyboxInfo.Exports.TryGetValue(exportOption.Key, out var exportUrl); + Debug.Log(exportUrl); + } + + if (skyboxInfo.Exports.Count > 0) + { + foreach (var exportInfo in skyboxInfo.Exports) + { + Debug.Log($"{exportInfo.Key} -> {exportInfo.Value}"); + } + } + } } } diff --git a/BlockadeLabs/Packages/com.rest.blockadelabs/package.json b/BlockadeLabs/Packages/com.rest.blockadelabs/package.json index e7f7bb5..7acb084 100644 --- a/BlockadeLabs/Packages/com.rest.blockadelabs/package.json +++ b/BlockadeLabs/Packages/com.rest.blockadelabs/package.json @@ -3,7 +3,7 @@ "displayName": "BlockadeLabs", "description": "A Non-Official Blockade Labs Rest Client for Unity (UPM)", "keywords": [], - "version": "1.0.3", + "version": "1.1.0", "unity": "2021.3", "documentationUrl": "https://github.com/RageAgainstThePixel/com.rest.blockadelabs#documentation", "changelogUrl": "https://github.com/RageAgainstThePixel/com.rest.blockadelabs/releases", @@ -17,7 +17,9 @@ "url": "https://github.com/StephenHodgson" }, "dependencies": { - "com.utilities.rest": "2.1.1" + "com.utilities.rest": "2.2.5", + "com.unity.modules.video": "1.0.0", + "com.unity.sharp-zip-lib": "1.3.4-preview" }, "samples": [ { diff --git a/BlockadeLabs/Packages/manifest.json b/BlockadeLabs/Packages/manifest.json index 8d49b18..ffed069 100644 --- a/BlockadeLabs/Packages/manifest.json +++ b/BlockadeLabs/Packages/manifest.json @@ -1,10 +1,10 @@ { "dependencies": { - "com.unity.ide.rider": "3.0.24", - "com.unity.ide.visualstudio": "2.0.18", + "com.unity.ide.rider": "3.0.26", + "com.unity.ide.visualstudio": "2.0.22", "com.unity.test-framework": "1.1.33", "com.unity.textmeshpro": "3.0.6", - "com.utilities.buildpipeline": "1.1.7" + "com.utilities.buildpipeline": "1.1.8" }, "scopedRegistries": [ { diff --git a/BlockadeLabs/ProjectSettings/EditorBuildSettings.asset b/BlockadeLabs/ProjectSettings/EditorBuildSettings.asset index e2ac381..493ba16 100644 --- a/BlockadeLabs/ProjectSettings/EditorBuildSettings.asset +++ b/BlockadeLabs/ProjectSettings/EditorBuildSettings.asset @@ -6,6 +6,6 @@ EditorBuildSettings: serializedVersion: 2 m_Scenes: - enabled: 1 - path: Assets/Samples/BlockadeLabs/1.0.0/Skybox Generation/SkyboxSample.unity + path: Packages/com.rest.blockadelabs/Samples/Skybox/SkyboxSample.unity guid: c64e45bae6fa19d4a90c4037e84fbae5 m_configObjects: {} diff --git a/BlockadeLabs/ProjectSettings/ProjectVersion.txt b/BlockadeLabs/ProjectSettings/ProjectVersion.txt index 8927a2e..e4eac15 100644 --- a/BlockadeLabs/ProjectSettings/ProjectVersion.txt +++ b/BlockadeLabs/ProjectSettings/ProjectVersion.txt @@ -1,2 +1,2 @@ -m_EditorVersion: 2022.3.3f1 -m_EditorVersionWithRevision: 2022.3.3f1 (7cdc2969a641) +m_EditorVersion: 2022.3.12f1 +m_EditorVersionWithRevision: 2022.3.12f1 (4fe6e059c7ef) diff --git a/README.md b/README.md index 6389afc..ba72c71 100644 --- a/README.md +++ b/README.md @@ -43,10 +43,15 @@ The recommended installation method is though the unity package manager and [Ope ### Table of Contents - [Authentication](#authentication) +- [Editor Dashboard](#editor-dashboard) :new: + - [Skybox Dashboard](#skybox-dashboard) :new: + - [History Dashboard](#history-dashboard) :new: - [Skyboxes](#skyboxes) - [Get Skybox Styles](#get-skybox-styles) + - [Get Skybox Export Options](#get-skybox-export-options) :new: - [Generate Skybox](#generate-skybox) - [Get Skybox by Id](#get-skybox) + - [Request Skybox Export](#request-skybox-export) :new: - [Delete Skybox by Id](#delete-skybox) - [Get Skybox History](#get-skybox-history) - [Cancel Skybox Generation](#cancel-skybox-generation) @@ -111,6 +116,26 @@ Use your system's environment variables specify an api key to use. var api = new BlockadeLabsClient(BlockadeLabsAuthentication.Default.LoadFromEnvironment()); ``` +### Editor Dashboard + +You can perform all of the same actions from the BlockadeLabs website, in the Editor using the BlockadeLabs Dashboard! + +`Window/Dashboards/BlockadeLabs` + +![dashboard](BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/dashboard.png) + +#### Skybox Dashboard + +Generate skyboxes and remix them directly in the editor. + +![History](BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/skybox-editor.png) + +#### History Dashboard + +You also have access to the full list of all your generated skyboxes, ready for downloading directly into your project. + +![History](BlockadeLabs/Packages/com.rest.blockadelabs/Documentation~/images/history-editor.png) + ### Skyboxes #### [Get Skybox Styles](https://api-documentation.blockadelabs.com/api/skybox.html#get-skybox-styles) @@ -127,16 +152,34 @@ foreach (var skyboxStyle in skyboxStyles) } ``` +#### [Get Skybox Export Options](https://api-documentation.blockadelabs.com/api/skybox-exports.html#get-export-types) + +Returns the list of all available export types. + +```csharp +var api = new BlockadeLabsClient(); +var exportOptions = await api.SkyboxEndpoint.GetAllSkyboxExportOptionsAsync(); + +foreach (var exportOption in exportOptions) +{ + Debug.Log($"{exportOption.Id}: {exportOption.Name} | {exportOption.Key}"); +} +``` + #### [Generate Skybox](https://api-documentation.blockadelabs.com/api/skybox.html#generate-skybox) Generate a skybox. ```csharp var api = new BlockadeLabsClient(); -var request = new SkyboxRequest("mars", depth: true); +var request = new SkyboxRequest("mars", enhancePrompt: true); var skyboxInfo = await api.SkyboxEndpoint.GenerateSkyboxAsync(request); -skyboxMaterial.mainTexture = skyboxInfo.MainTexture; -skyboxMaterial.depthTexture = skyboxInfo.DepthTexture; +Debug.Log($"Successfully created skybox: {skyboxInfo.Id}"); + +if (skyboxInfo.TryGetAsset("equirectangular-png", out var texture)) +{ + skyboxMaterial.mainTexture = texture; +} ``` #### [Get Skybox](https://api-documentation.blockadelabs.com/api/skybox.html#get-skybox-by-id) @@ -145,12 +188,35 @@ Returns the skybox metadata for the given skybox id. ```csharp var skyboxId = 42; +var api = new BlockadeLabsClient(); +var skyboxInfo = await api.SkyboxEndpoint.GetSkyboxInfoAsync(skyboxId); +Debug.Log($"Skybox: {result.Id}"); +// Note: If you wish to use the returned skybox textures you'll need to additionally call await SkyboxInfo.LoadAssetsAsync(); before you can assign them to a material property. +await skyboxInfo.LoadAssetsAsync(); + +if (skyboxInfo.TryGetAsset("equirectangular-png", out var texture)) +{ + skyboxMaterial.mainTexture = texture; +} +``` + +#### [Request Skybox Export](https://api-documentation.blockadelabs.com/api/skybox-exports.html#request-export) + +Exports the skybox with the requested export type. + +```csharp +var skyboxId = 42; +var api = new BlockadeLabsClient(); var skyboxInfo = await api.SkyboxEndpoint.GetSkyboxInfoAsync(skyboxId); -Debug.Log($"Skybox: {result.Id} | {result.MainTextureUrl}"); -// Note: If you wish to use the returned skybox textures you'll need to additionally call await SkyboxInfo.LoadTexturesAsync(); before you can assign them to a material property. -await skyboxInfo.LoadTexturesAsync(); -skyboxMaterial.mainTexture = skyboxInfo.MainTexture; -skyboxMaterial.depthTexture = skyboxInfo.DepthTexture; +var exportOptions = await api.SkyboxEndpoint.GetAllSkyboxExportOptionsAsync(); +var exportOption = exportOptions.FirstOrDefault(option => option.Key == "depth-map-png"); +skyboxInfo = await api.SkyboxEndpoint.ExportSkyboxAsync(skyboxInfo, exportOption); +await skyboxInfo.LoadAssetsAsync(); + +if (skyboxInfo.TryGetAsset("depth-map-png", out var texture)) +{ + skyboxMaterial.depthTexture = skyboxInfo.DepthTexture; +} ``` #### [Delete Skybox](https://api-documentation.blockadelabs.com/api/skybox.html#delete)