TwoByTwoTransformEffectExample.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. /******************************************************************************
  2. * Spine Runtimes License Agreement
  3. * Last updated January 1, 2020. Replaces all prior versions.
  4. *
  5. * Copyright (c) 2013-2020, Esoteric Software LLC
  6. *
  7. * Integration of the Spine Runtimes into software or otherwise creating
  8. * derivative works of the Spine Runtimes is permitted under the terms and
  9. * conditions of Section 2 of the Spine Editor License Agreement:
  10. * http://esotericsoftware.com/spine-editor-license
  11. *
  12. * Otherwise, it is permitted to integrate the Spine Runtimes into software
  13. * or otherwise create derivative works of the Spine Runtimes (collectively,
  14. * "Products"), provided that each user of the Products must obtain their own
  15. * Spine Editor license and redistribution of the Products in any form must
  16. * include this license and copyright notice.
  17. *
  18. * THE SPINE RUNTIMES ARE PROVIDED BY ESOTERIC SOFTWARE LLC "AS IS" AND ANY
  19. * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  20. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  21. * DISCLAIMED. IN NO EVENT SHALL ESOTERIC SOFTWARE LLC BE LIABLE FOR ANY
  22. * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  23. * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES,
  24. * BUSINESS INTERRUPTION, OR LOSS OF USE, DATA, OR PROFITS) HOWEVER CAUSED AND
  25. * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  26. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  27. * THE SPINE RUNTIMES, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  28. *****************************************************************************/
  29. using System.Collections;
  30. using System.Collections.Generic;
  31. using UnityEngine;
  32. namespace Spine.Unity.Examples {
  33. // This is a sample component for C# vertex effects for Spine rendering components.
  34. // Using shaders and materials to control vertex properties is still more performant
  35. // than using this API, but in cases where your vertex effect logic cannot be
  36. // expressed as shader code, these vertex effects can be useful.
  37. public class TwoByTwoTransformEffectExample : MonoBehaviour {
  38. public Vector2 xAxis = new Vector2(1, 0);
  39. public Vector2 yAxis = new Vector2(0, 1);
  40. SkeletonRenderer skeletonRenderer;
  41. void OnEnable () {
  42. skeletonRenderer = GetComponent<SkeletonRenderer>();
  43. if (skeletonRenderer == null) return;
  44. // Use the OnPostProcessVertices callback to modify the vertices at the correct time.
  45. skeletonRenderer.OnPostProcessVertices -= ProcessVertices;
  46. skeletonRenderer.OnPostProcessVertices += ProcessVertices;
  47. Debug.Log("2x2 Transform Effect Enabled.");
  48. }
  49. void ProcessVertices (MeshGeneratorBuffers buffers) {
  50. if (!this.enabled)
  51. return;
  52. int vertexCount = buffers.vertexCount; // For efficiency, limit your effect to the actual mesh vertex count using vertexCount
  53. // Modify vertex positions by accessing Vector3[] vertexBuffer
  54. var vertices = buffers.vertexBuffer;
  55. Vector3 transformedPos = default(Vector3);
  56. for (int i = 0; i < vertexCount; i++) {
  57. Vector3 originalPos = vertices[i];
  58. transformedPos.x = (xAxis.x * originalPos.x) + (yAxis.x * originalPos.y);
  59. transformedPos.y = (xAxis.y * originalPos.x) + (yAxis.y * originalPos.y);
  60. vertices[i] = transformedPos;
  61. }
  62. }
  63. void OnDisable () {
  64. if (skeletonRenderer == null) return;
  65. skeletonRenderer.OnPostProcessVertices -= ProcessVertices;
  66. Debug.Log("2x2 Transform Effect Disabled.");
  67. }
  68. }
  69. }
  70. #if UNITY_EDITOR
  71. [UnityEditor.CustomEditor(typeof(Spine.Unity.Examples.TwoByTwoTransformEffectExample))]
  72. public class TwoByTwoTransformEffectExampleEditor : UnityEditor.Editor {
  73. Spine.Unity.Examples.TwoByTwoTransformEffectExample Target { get { return target as Spine.Unity.Examples.TwoByTwoTransformEffectExample; } }
  74. void OnSceneGUI () {
  75. var transform = Target.transform;
  76. LocalVectorHandle(ref Target.xAxis, transform, Color.red);
  77. LocalVectorHandle(ref Target.yAxis, transform, Color.green);
  78. }
  79. static void LocalVectorHandle (ref Vector2 v, Transform transform, Color color) {
  80. Color originalColor = UnityEditor.Handles.color;
  81. UnityEditor.Handles.color = color;
  82. UnityEditor.Handles.DrawLine(transform.position, transform.TransformPoint(v));
  83. var fmh_101_103_638405757422065149 = Quaternion.identity; v = transform.InverseTransformPoint(UnityEditor.Handles.FreeMoveHandle(transform.TransformPoint(v), 0.3f, Vector3.zero, UnityEditor.Handles.CubeHandleCap));
  84. UnityEditor.Handles.color = originalColor;
  85. }
  86. }
  87. #endif