diff --git a/Assembly-CSharp.csproj b/Assembly-CSharp.csproj
index a296cbc..a827c9d 100644
--- a/Assembly-CSharp.csproj
+++ b/Assembly-CSharp.csproj
@@ -302,18 +302,6 @@
C:/Work/UPhotoFrame/Library/PackageCache/com.unity.analytics@3.2.2/Unity.Analytics.Tracker.dll
-
- C:/Work/UPhotoFrame/Assets/Plugins/SixLabors.ImageSharp.dll
-
-
- C:/Work/UPhotoFrame/Assets/Plugins/System.Memory.dll
-
-
- C:/Work/UPhotoFrame/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll
-
-
- C:/Work/UPhotoFrame/Assets/Plugins/System.Buffers.dll
-
D:/Program Files/Unity2018.4.6f1/Editor/Data/MonoBleedingEdge/lib/mono/4.7.1-api/mscorlib.dll
diff --git a/Assets/Plugins/SixLabors.ImageSharp.dll b/Assets/Plugins/SixLabors.ImageSharp.dll
deleted file mode 100644
index 622d32b..0000000
Binary files a/Assets/Plugins/SixLabors.ImageSharp.dll and /dev/null differ
diff --git a/Assets/Plugins/SixLabors.ImageSharp.dll.meta b/Assets/Plugins/SixLabors.ImageSharp.dll.meta
deleted file mode 100644
index 6bc2430..0000000
--- a/Assets/Plugins/SixLabors.ImageSharp.dll.meta
+++ /dev/null
@@ -1,33 +0,0 @@
-fileFormatVersion: 2
-guid: 57be6a18d4b2a2c469cb368678ff380a
-PluginImporter:
- externalObjects: {}
- serializedVersion: 2
- iconMap: {}
- executionOrder: {}
- defineConstraints: []
- isPreloaded: 0
- isOverridable: 0
- isExplicitlyReferenced: 0
- validateReferences: 1
- platformData:
- - first:
- Any:
- second:
- enabled: 1
- settings: {}
- - first:
- Editor: Editor
- second:
- enabled: 0
- settings:
- DefaultValueInitialized: true
- - first:
- Windows Store Apps: WindowsStoreApps
- second:
- enabled: 0
- settings:
- CPU: AnyCPU
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Plugins/System.Buffers.dll b/Assets/Plugins/System.Buffers.dll
deleted file mode 100644
index f2d83c5..0000000
Binary files a/Assets/Plugins/System.Buffers.dll and /dev/null differ
diff --git a/Assets/Plugins/System.Buffers.dll.meta b/Assets/Plugins/System.Buffers.dll.meta
deleted file mode 100644
index c0730ce..0000000
--- a/Assets/Plugins/System.Buffers.dll.meta
+++ /dev/null
@@ -1,33 +0,0 @@
-fileFormatVersion: 2
-guid: 4998389d070a0614fa7bbef6d8966f86
-PluginImporter:
- externalObjects: {}
- serializedVersion: 2
- iconMap: {}
- executionOrder: {}
- defineConstraints: []
- isPreloaded: 0
- isOverridable: 0
- isExplicitlyReferenced: 0
- validateReferences: 1
- platformData:
- - first:
- Any:
- second:
- enabled: 1
- settings: {}
- - first:
- Editor: Editor
- second:
- enabled: 0
- settings:
- DefaultValueInitialized: true
- - first:
- Windows Store Apps: WindowsStoreApps
- second:
- enabled: 0
- settings:
- CPU: AnyCPU
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Plugins/System.Memory.dll b/Assets/Plugins/System.Memory.dll
deleted file mode 100644
index 5d19470..0000000
Binary files a/Assets/Plugins/System.Memory.dll and /dev/null differ
diff --git a/Assets/Plugins/System.Memory.dll.meta b/Assets/Plugins/System.Memory.dll.meta
deleted file mode 100644
index eddd40a..0000000
--- a/Assets/Plugins/System.Memory.dll.meta
+++ /dev/null
@@ -1,33 +0,0 @@
-fileFormatVersion: 2
-guid: 3d2ebe00670c0154b8f627bc62b7bf5d
-PluginImporter:
- externalObjects: {}
- serializedVersion: 2
- iconMap: {}
- executionOrder: {}
- defineConstraints: []
- isPreloaded: 0
- isOverridable: 0
- isExplicitlyReferenced: 0
- validateReferences: 1
- platformData:
- - first:
- Any:
- second:
- enabled: 1
- settings: {}
- - first:
- Editor: Editor
- second:
- enabled: 0
- settings:
- DefaultValueInitialized: true
- - first:
- Windows Store Apps: WindowsStoreApps
- second:
- enabled: 0
- settings:
- CPU: AnyCPU
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll
deleted file mode 100644
index 1908d92..0000000
Binary files a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll and /dev/null differ
diff --git a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta b/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta
deleted file mode 100644
index 277055e..0000000
--- a/Assets/Plugins/System.Runtime.CompilerServices.Unsafe.dll.meta
+++ /dev/null
@@ -1,33 +0,0 @@
-fileFormatVersion: 2
-guid: 4eec2a1318993b04ea65c96e76ce0bef
-PluginImporter:
- externalObjects: {}
- serializedVersion: 2
- iconMap: {}
- executionOrder: {}
- defineConstraints: []
- isPreloaded: 0
- isOverridable: 0
- isExplicitlyReferenced: 0
- validateReferences: 1
- platformData:
- - first:
- Any:
- second:
- enabled: 1
- settings: {}
- - first:
- Editor: Editor
- second:
- enabled: 0
- settings:
- DefaultValueInitialized: true
- - first:
- Windows Store Apps: WindowsStoreApps
- second:
- enabled: 0
- settings:
- CPU: AnyCPU
- userData:
- assetBundleName:
- assetBundleVariant:
diff --git a/Assets/Scripts/PhotoFrame.cs b/Assets/Scripts/PhotoFrame.cs
index 4205540..e4dfd32 100644
--- a/Assets/Scripts/PhotoFrame.cs
+++ b/Assets/Scripts/PhotoFrame.cs
@@ -1,15 +1,13 @@
using System.Collections;
-using System.IO;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.UI;
-using Image = UnityEngine.UI.Image;
-using Color = UnityEngine.Color;
-using SixLabors.ImageSharp.Processing;
-using SixLabors.ImageSharp;
public class PhotoFrame : MonoBehaviour
{
+ const float PHOTO_INTERVAL = 5f;
+ const float ANIMATION_LENGTH = 2f;
+
[SerializeField]
GameObject mainUI;
@@ -35,6 +33,7 @@ public class PhotoFrame : MonoBehaviour
public void Start()
{
+ Screen.sleepTimeout = SleepTimeout.NeverSleep;
currentImage = 0;
ActivateUI(true);
}
@@ -86,13 +85,12 @@ public class PhotoFrame : MonoBehaviour
NextImage.color = transparent;
while (true)
{
+ var startTime = Time.realtimeSinceStartup;
int imageIndex = Random.Range(0, loader.images.Count);
string imageUrl = loader.images[imageIndex];
- var path = Application.persistentDataPath + "/source." + System.IO.Path.GetExtension(imageUrl);
-
var request = UnityWebRequest.Get(imageUrl);
- request.downloadHandler = new DownloadHandlerFile(path);
+ request.downloadHandler = new DownloadHandlerTexture(true);
yield return request.SendWebRequest();
if (request.isNetworkError || request.isHttpError)
@@ -101,19 +99,28 @@ public class PhotoFrame : MonoBehaviour
continue;
}
- SetImageTexture(NextImage, path);
- request.downloadHandler.Dispose();
+ var downloadTime = Time.realtimeSinceStartup - startTime;
+ if (PHOTO_INTERVAL > downloadTime)
+ {
+ yield return new WaitForSeconds(PHOTO_INTERVAL - downloadTime);
+ }
+
+ var dh = request.downloadHandler as DownloadHandlerTexture;
+ var tex = dh.texture;
+
+ SetImageTexture(NextImage, tex);
+ dh.Dispose();
request.Dispose();
float currentStart = CurrentImage.color.a;
float currentFinish = transparent.a;
float nextStart = NextImage.color.a;
float nextFinish = opaque.a;
- float startTime = Time.time;
- while (Time.time < startTime + 2f)
+ startTime = Time.time;
+ while (Time.time < startTime + ANIMATION_LENGTH)
{
float ct = Time.time;
- float x = (ct - startTime) / 2f;
+ float x = (ct - startTime) / ANIMATION_LENGTH;
float currentA = currentStart + x * (currentFinish - currentStart);
Color cC = new Color(CurrentImage.color.r, CurrentImage.color.g, CurrentImage.color.b, currentA);
CurrentImage.color = cC;
@@ -122,7 +129,6 @@ public class PhotoFrame : MonoBehaviour
NextImage.color = nC;
yield return null;
}
- yield return new WaitForSeconds(5f);
currentImage = (currentImage + 1) % images.Length;
Resources.UnloadUnusedAssets();
@@ -130,7 +136,7 @@ public class PhotoFrame : MonoBehaviour
}
}
- private void SetImageTexture(Image nextImage, string path)
+ private void SetImageTexture(Image nextImage, Texture2D tex)
{
if (nextImage.sprite != null)
{
@@ -155,31 +161,13 @@ public class PhotoFrame : MonoBehaviour
maxWidth = 2048;
maxHeight = (int)(2048 / imageWidth * imageHeight);
}
- Texture2D tex = new Texture2D(2, 2);
- tex.LoadImage(File.ReadAllBytes(path));
float factor = Mathf.Min((float) maxWidth / tex.width, (float)maxHeight / tex.height);
int newWidth = (int)(tex.width * factor);
int newHeight = (int)(tex.height * factor);
- Destroy(tex);
- var newPath = Scale(path, newWidth, newHeight);
- tex = new Texture2D(2, 2);
- tex.LoadImage(File.ReadAllBytes(newPath));
- //TextureScale.Bilinear(tex, newWidth, newHeight);
- //TextureScale.Point(tex, newWidth, newHeight);
- //Color[] cs = tex.GetPixels();
+ TextureScale.Bilinear(tex, newWidth, newHeight);
+
var sprite = Sprite.Create(tex, new Rect(0, 0, tex.width, tex.height), Vector2.zero);
nextImage.sprite = sprite;
nextImage.rectTransform.anchorMin = new Vector2((maxWidth - (float)newWidth) / maxWidth / 2, (maxHeight - (float)newHeight) / maxHeight / 2);
}
-
- private string Scale(string path, int newWidth, int newHeight)
- {
- var resultPath = Path.GetDirectoryName(path) + "/target." + Path.GetExtension(path);
- using (SixLabors.ImageSharp.Image image = SixLabors.ImageSharp.Image.Load(path))
- {
- image.Mutate(x => x.Resize(newWidth, newHeight));
- image.Save(resultPath);
- }
- return resultPath;
- }
}
diff --git a/Assets/Scripts/TextureScale.cs b/Assets/Scripts/TextureScale.cs
index e629447..6a849fb 100644
--- a/Assets/Scripts/TextureScale.cs
+++ b/Assets/Scripts/TextureScale.cs
@@ -1,4 +1,10 @@
-using System.Threading;
+// Initial version at: http://wiki.unity3d.com/index.php/TextureScale#TextureScale.cs
+// Modified by ftc to work with raw texture data (it consumes less memory).
+// Currently works only on RGB24 and RGBA32 textures.
+
+using System;
+using System.Threading;
+using Unity.Collections;
using UnityEngine;
public class TextureScale
@@ -14,8 +20,10 @@ public class TextureScale
}
}
- private static Color32[] texColors;
+ private static NativeArray texBytes;
+ private static TextureFormat texFormat;
private static Color32[] newColors;
+ private static int h;
private static int w;
private static float ratioX;
private static float ratioY;
@@ -35,8 +43,16 @@ public class TextureScale
private static void ThreadedScale(Texture2D tex, int newWidth, int newHeight, bool useBilinear)
{
- texColors = tex.GetPixels32();
- newColors = new Color32[newWidth * newHeight];
+ texBytes = tex.GetRawTextureData();
+ texFormat = tex.format;
+ if (texFormat != TextureFormat.RGB24 && texFormat != TextureFormat.RGBA32)
+ {
+ throw new NotImplementedException();
+ }
+ if (newColors == null || newColors.Length < newWidth * newHeight)
+ {
+ newColors = new Color32[newWidth * newHeight];
+ }
if (useBilinear)
{
ratioX = 1.0f / ((float)newWidth / (tex.width - 1));
@@ -48,6 +64,7 @@ public class TextureScale
ratioY = ((float)tex.height) / newHeight;
}
w = tex.width;
+ h = tex.height;
w2 = newWidth;
var cores = Mathf.Min(SystemInfo.processorCount, newHeight);
var slice = newHeight / cores;
@@ -96,19 +113,63 @@ public class TextureScale
}
tex.Resize(newWidth, newHeight);
- tex.SetPixels32(newColors);
+ var newBytes = tex.GetRawTextureData();
+ for (int i = 0; i < newWidth * newHeight; i++)
+ {
+ var color = newColors[i];
+ if (tex.format == TextureFormat.RGB24)
+ {
+ int s = 3 * i;
+ newBytes[s] = color.r;
+ newBytes[s + 1] = color.g;
+ newBytes[s + 2] = color.b;
+ }
+ else if (tex.format == TextureFormat.RGBA32)
+ {
+ int s = 4 * i;
+ newBytes[s] = color.r;
+ newBytes[s + 1] = color.g;
+ newBytes[s + 2] = color.b;
+ newBytes[s + 3] = color.a;
+ }
+ }
tex.Apply();
- texColors = null;
- newColors = null;
+ //newColors = null;
}
+ private static Color32 GetColor(int position)
+ {
+ if (texFormat == TextureFormat.RGB24)
+ {
+ int s = (int)position * 3;
+ Color32 result = new Color32();
+ result.r = texBytes[s];
+ result.g = texBytes[s + 1];
+ result.b = texBytes[s + 2];
+ result.a = 0;
+ return result;
+ }
+ else if (texFormat == TextureFormat.RGBA32)
+ {
+ int s = (int)position * 4;
+ Color32 result = new Color32();
+ result.r = texBytes[s];
+ result.g = texBytes[s + 1];
+ result.b = texBytes[s + 2];
+ result.a = texBytes[s + 3];
+ return result;
+ }
+ else throw new NotImplementedException();
+ }
+
public static void BilinearScale(System.Object obj)
{
ThreadData threadData = (ThreadData)obj;
for (var y = threadData.start; y < threadData.end; y++)
{
int yFloor = (int)Mathf.Floor(y * ratioY);
+ while (yFloor + 1 >= h) yFloor--;
var y1 = yFloor * w;
var y2 = (yFloor + 1) * w;
var yw = y * w2;
@@ -117,12 +178,11 @@ public class TextureScale
{
int xFloor = (int)Mathf.Floor(x * ratioX);
var xLerp = x * ratioX - xFloor;
- newColors[yw + x] = ColorLerpUnclamped(ColorLerpUnclamped(texColors[y1 + xFloor], texColors[y1 + xFloor + 1], xLerp),
- ColorLerpUnclamped(texColors[y2 + xFloor], texColors[y2 + xFloor + 1], xLerp),
- y * ratioY - yFloor);
+ var c1 = ColorLerpUnclamped(GetColor(y1 + xFloor), GetColor(y1 + xFloor + 1), xLerp);
+ var c2 = ColorLerpUnclamped(GetColor(y2 + xFloor), GetColor(y2 + xFloor + 1), xLerp);
+ newColors[yw + x] = ColorLerpUnclamped(c1, c2, y * ratioY - yFloor);
}
}
-
mutex.WaitOne();
finishCount++;
mutex.ReleaseMutex();
@@ -137,7 +197,7 @@ public class TextureScale
var yw = y * w2;
for (var x = 0; x < w2; x++)
{
- newColors[yw + x] = texColors[(int)(thisY + ratioX * x)];
+ newColors[yw + x] = GetColor((int)(thisY + ratioX * x));
}
}
diff --git a/ProjectSettings/ProjectSettings.asset b/ProjectSettings/ProjectSettings.asset
index fbb2aa0..ab06fb2 100644
--- a/ProjectSettings/ProjectSettings.asset
+++ b/ProjectSettings/ProjectSettings.asset
@@ -592,7 +592,7 @@ PlayerSettings:
scriptingDefineSymbols: {}
platformArchitecture: {}
scriptingBackend:
- Android: 1
+ Android: 0
il2cppCompilerConfiguration:
Android: 2
managedStrippingLevel: {}