|
6 | 6 | */ |
7 | 7 |
|
8 | 8 |
|
| 9 | +using Live2D.Cubism.Core.Unmanaged; |
9 | 10 | using Live2D.Cubism.Framework; |
10 | 11 | using System; |
11 | 12 | using UnityEngine; |
| 13 | +using Live2D.Cubism.Rendering.Util; |
| 14 | + |
| 15 | + |
12 | 16 | #if UNITY_2019_3_OR_NEWER |
13 | 17 | using UnityEngine.LowLevel; |
14 | 18 | using UnityEngine.PlayerLoop; |
@@ -115,7 +119,7 @@ public CubismMoc Moc |
115 | 119 | private CubismParameter[] _parameters; |
116 | 120 |
|
117 | 121 | /// <summary> |
118 | | - /// Drawables of model. |
| 122 | + /// Parameters of model. |
119 | 123 | /// </summary> |
120 | 124 | public CubismParameter[] Parameters |
121 | 125 | { |
@@ -204,6 +208,40 @@ public CubismCanvasInformation CanvasInformation |
204 | 208 | private set { _canvasInformation = value; } |
205 | 209 | } |
206 | 210 |
|
| 211 | + /// <summary> |
| 212 | + /// <see cref="Offscreens"/> backing field. |
| 213 | + /// </summary> |
| 214 | + [NonSerialized] |
| 215 | + private CubismOffscreen[] _offscreens; |
| 216 | + |
| 217 | + /// <summary> |
| 218 | + /// Offscreens of model. |
| 219 | + /// </summary> |
| 220 | + public CubismOffscreen[] Offscreens |
| 221 | + { |
| 222 | + get |
| 223 | + { |
| 224 | + if (_offscreens == null) |
| 225 | + { |
| 226 | + Revive(); |
| 227 | + } |
| 228 | + |
| 229 | + return _offscreens; |
| 230 | + } |
| 231 | + private set { _offscreens = value; } |
| 232 | + } |
| 233 | + |
| 234 | + /// <summary> |
| 235 | + /// All draw objects render order. |
| 236 | + /// </summary> |
| 237 | + public CubismUnmanagedIntArrayView AllDrawObjectsRenderOrder |
| 238 | + { |
| 239 | + get |
| 240 | + { |
| 241 | + return TaskableModel.UnmanagedModel.AllDrawObjectRenderOrders; |
| 242 | + } |
| 243 | + } |
| 244 | + |
207 | 245 | /// <summary> |
208 | 246 | /// Parameter store cache. |
209 | 247 | /// </summary> |
@@ -271,6 +309,39 @@ private bool CanRevive |
271 | 309 | /// </summary> |
272 | 310 | private int LastTick { get; set; } |
273 | 311 |
|
| 312 | + /// <summary> |
| 313 | + /// Is the model's MOC version higher than Cubism 5.0? |
| 314 | + /// </summary> |
| 315 | + public bool IsOverMocVersion50 |
| 316 | + { |
| 317 | + get |
| 318 | + { |
| 319 | + return CubismCoreDll.MocVersion_50 < Moc.Version; |
| 320 | + } |
| 321 | + } |
| 322 | + |
| 323 | + /// <summary> |
| 324 | + /// Is this model using blend mode. |
| 325 | + /// </summary> |
| 326 | + [SerializeField, HideInInspector] |
| 327 | + private bool _isUsingBlendMode; |
| 328 | + |
| 329 | + |
| 330 | + /// <summary> |
| 331 | + /// Get Flag is this model using blend mode. |
| 332 | + /// </summary> |
| 333 | + /// <returns>True if Is this model using blend mode; otherwise returns false.</returns> |
| 334 | + public bool IsUsingBlendMode |
| 335 | + { |
| 336 | + get |
| 337 | + { |
| 338 | + return _isUsingBlendMode; |
| 339 | + } |
| 340 | + private set |
| 341 | + { |
| 342 | + _isUsingBlendMode = value; |
| 343 | + } |
| 344 | + } |
274 | 345 |
|
275 | 346 | /// <summary> |
276 | 347 | /// Revives instance. |
@@ -309,7 +380,6 @@ private void Reset(CubismMoc moc) |
309 | 380 | return; |
310 | 381 | } |
311 | 382 |
|
312 | | - |
313 | 383 | Parameters = GetComponentsInChildren<CubismParameter>(); |
314 | 384 | if (Parameters.Length < 1 && (transform.Find("Parameters") == null)) |
315 | 385 | { |
@@ -351,6 +421,42 @@ private void Reset(CubismMoc moc) |
351 | 421 | Drawables.Revive(TaskableModel.UnmanagedModel); |
352 | 422 | } |
353 | 423 |
|
| 424 | + if (0 < CubismCoreDll.GetOffscreenCount(TaskableModel.UnmanagedModel.Ptr)) |
| 425 | + { |
| 426 | + IsUsingBlendMode = true; |
| 427 | + Offscreens = GetComponentsInChildren<CubismOffscreen>(); |
| 428 | + if (Offscreens.Length < 1 && (transform.Find("Offscreens") == null)) |
| 429 | + { |
| 430 | + // Create and initialize proxies. |
| 431 | + var offscreens = CubismOffscreen.CreateOffscreens(TaskableModel.UnmanagedModel); |
| 432 | + offscreens.transform.SetParent(transform); |
| 433 | + Offscreens = offscreens.GetComponentsInChildren<CubismOffscreen>(); |
| 434 | + } |
| 435 | + else |
| 436 | + { |
| 437 | + Offscreens.Revive(TaskableModel.UnmanagedModel); |
| 438 | + } |
| 439 | + } |
| 440 | + |
| 441 | + if (IsOverMocVersion50 && !IsUsingBlendMode) |
| 442 | + { |
| 443 | + var drawableCount = Drawables.Length; |
| 444 | + for (var i = 0; i < drawableCount; ++i) |
| 445 | + { |
| 446 | + var colorBlendType = Drawables[i].ColorBlend; |
| 447 | + var alphaBlendType = Drawables[i].AlphaBlend; |
| 448 | + if (colorBlendType == BlendTypes.ColorBlend.Normal && |
| 449 | + alphaBlendType == BlendTypes.AlphaBlend.Over || |
| 450 | + colorBlendType == BlendTypes.ColorBlend.Add || |
| 451 | + colorBlendType == BlendTypes.ColorBlend.Multiply) |
| 452 | + { |
| 453 | + continue; |
| 454 | + } |
| 455 | + |
| 456 | + IsUsingBlendMode = true; |
| 457 | + break; |
| 458 | + } |
| 459 | + } |
354 | 460 |
|
355 | 461 | CanvasInformation = new CubismCanvasInformation(TaskableModel.UnmanagedModel); |
356 | 462 |
|
|
0 commit comments