public static void ConstructOffsetsFromAnchor(tk2dSpriteDefinition def, tk2dBaseSprite.Anchor anchor, Vector2?scale = null, bool fixesScale = false, bool changesCollider = true) { if (!scale.HasValue) { scale = new Vector2?(def.position3); } if (fixesScale) { Vector2 fixedScale = scale.Value - def.position0.XY(); scale = new Vector2?(fixedScale); } float xOffset = 0; if (anchor == tk2dBaseSprite.Anchor.LowerCenter || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.UpperCenter) { xOffset = -(scale.Value.x / 2f); } else if (anchor == tk2dBaseSprite.Anchor.LowerRight || anchor == tk2dBaseSprite.Anchor.MiddleRight || anchor == tk2dBaseSprite.Anchor.UpperRight) { xOffset = -scale.Value.x; } float yOffset = 0; if (anchor == tk2dBaseSprite.Anchor.MiddleLeft || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.MiddleLeft) { yOffset = -(scale.Value.y / 2f); } else if (anchor == tk2dBaseSprite.Anchor.UpperLeft || anchor == tk2dBaseSprite.Anchor.UpperCenter || anchor == tk2dBaseSprite.Anchor.UpperRight) { yOffset = -scale.Value.y; } MakeOffset(def, new Vector2(xOffset, yOffset), changesCollider); }
public override void OnInspectorGUI() { tk2dSpriteFromTexture target = (tk2dSpriteFromTexture)this.target; tk2dGuiUtility.LookLikeInspector(); EditorGUI.BeginChangeCheck(); Texture texture = EditorGUILayout.ObjectField("Texture", target.texture, typeof(Texture), false) as Texture; if (texture == null) { tk2dGuiUtility.LookLikeControls(); tk2dGuiUtility.InfoBox("Drag a texture into the texture slot above.", tk2dGuiUtility.WarningLevel.Error); } tk2dBaseSprite.Anchor anchor = target.anchor; tk2dSpriteCollectionSize spriteCollectionSize = new tk2dSpriteCollectionSize(); spriteCollectionSize.CopyFrom(target.spriteCollectionSize); if (texture != null) { anchor = (tk2dBaseSprite.Anchor)EditorGUILayout.EnumPopup("Anchor", target.anchor); tk2dGuiUtility.SpriteCollectionSize(spriteCollectionSize); } if (EditorGUI.EndChangeCheck()) { tk2dUndo.RecordObject(target, "Sprite From Texture"); target.Create(spriteCollectionSize, texture, anchor); } }
public void Create( tk2dSpriteCollectionSize spriteCollectionSize, Texture texture, tk2dBaseSprite.Anchor anchor ) { DestroyInternal(); if (texture != null) { // Copy values this.spriteCollectionSize.CopyFrom( spriteCollectionSize ); this.texture = texture; this.anchor = anchor; Vector2 anchorPos = tk2dSpriteGeomGen.GetAnchorOffset( anchor, texture.width, texture.height ); spriteCollection = tk2dRuntime.SpriteCollectionGenerator.CreateFromTexture( gameObject, texture, spriteCollectionSize, new Vector2(texture.width, texture.height), new string[] { "unnamed" } , new Rect[] { new Rect(0, 0, texture.width, texture.height) }, null, new Vector2[] { anchorPos }, new bool[] { false } ); // don't want to save or see this spriteCollection.hideFlags = HideFlags.HideInInspector; string objName = "SpriteFromTexture " + texture.name; spriteCollection.spriteCollectionName = objName; spriteCollection.spriteDefinitions[0].material.name = objName; spriteCollection.spriteDefinitions[0].material.hideFlags = HideFlags.DontSave | HideFlags.HideInInspector; Sprite.SetSprite( spriteCollection, 0 ); } }
// Token: 0x06000099 RID: 153 RVA: 0x00007FFC File Offset: 0x000061FC public static void ConstructOffsetsFromAnchor(this tk2dSpriteDefinition def, tk2dBaseSprite.Anchor anchor, Vector2 scale) { float x = 0f; bool flag = anchor == tk2dBaseSprite.Anchor.LowerCenter || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.UpperCenter; if (flag) { x = -(scale.x / 2f); } else { bool flag2 = anchor == tk2dBaseSprite.Anchor.LowerRight || anchor == tk2dBaseSprite.Anchor.MiddleRight || anchor == tk2dBaseSprite.Anchor.UpperRight; if (flag2) { x = -scale.x; } } float y = 0f; bool flag3 = anchor == tk2dBaseSprite.Anchor.MiddleLeft || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.MiddleLeft; if (flag3) { y = -(scale.y / 2f); } else { bool flag4 = anchor == tk2dBaseSprite.Anchor.UpperLeft || anchor == tk2dBaseSprite.Anchor.UpperCenter || anchor == tk2dBaseSprite.Anchor.UpperRight; if (flag4) { y = -scale.y; } } def.MakeOffset(new Vector2(x, y)); }
public void Create(tk2dSpriteCollectionSize spriteCollectionSize, Texture texture, tk2dBaseSprite.Anchor anchor) { this.DestroyInternal(); if (texture != null) { this.spriteCollectionSize.CopyFrom(spriteCollectionSize); this.texture = texture; this.anchor = anchor; GameObject parentObject = new GameObject("tk2dSpriteFromTexture - " + texture.name); parentObject.transform.localPosition = Vector3.zero; parentObject.transform.localRotation = Quaternion.identity; parentObject.transform.localScale = Vector3.one; parentObject.hideFlags = HideFlags.DontSave; Vector2 vector = tk2dSpriteGeomGen.GetAnchorOffset(anchor, (float) texture.width, (float) texture.height); string[] names = new string[] { "unnamed" }; Rect[] regions = new Rect[] { new Rect(0f, 0f, (float) texture.width, (float) texture.height) }; Vector2[] anchors = new Vector2[] { vector }; this.spriteCollection = SpriteCollectionGenerator.CreateFromTexture(parentObject, texture, spriteCollectionSize, new Vector2((float) texture.width, (float) texture.height), names, regions, null, anchors, new bool[1]); string str = "SpriteFromTexture " + texture.name; this.spriteCollection.spriteCollectionName = str; this.spriteCollection.spriteDefinitions[0].material.name = str; this.spriteCollection.spriteDefinitions[0].material.hideFlags = HideFlags.DontSave | HideFlags.HideInInspector; this.Sprite.SetSprite(this.spriteCollection, 0); } }
public override void OnInspectorGUI() { tk2dSpriteFromTexture target = (tk2dSpriteFromTexture)this.target; EditorGUIUtility.LookLikeInspector(); EditorGUI.BeginChangeCheck(); Texture texture = EditorGUILayout.ObjectField("Texture", target.texture, typeof(Texture), false) as Texture; tk2dBaseSprite.Anchor anchor = target.anchor; tk2dSpriteCollectionSize spriteCollectionSize = new tk2dSpriteCollectionSize(); spriteCollectionSize.CopyFrom(target.spriteCollectionSize); if (texture != null) { anchor = (tk2dBaseSprite.Anchor)EditorGUILayout.EnumPopup("Anchor", target.anchor); SpriteCollectionSizeField(spriteCollectionSize); } if (EditorGUI.EndChangeCheck()) { Undo.RegisterUndo(target, "Sprite From Texture"); target.Create(spriteCollectionSize, texture, anchor); } }
public void Create( tk2dSpriteCollectionSize spriteCollectionSize, Texture texture, tk2dBaseSprite.Anchor anchor ) { DestroyInternal(); if (texture != null) { // Copy values this.spriteCollectionSize.CopyFrom( spriteCollectionSize ); this.texture = texture; this.anchor = anchor; GameObject go = new GameObject("tk2dSpriteFromTexture - " + texture.name); go.transform.localPosition = Vector3.zero; go.transform.localRotation = Quaternion.identity; go.transform.localScale = Vector3.one; go.hideFlags = HideFlags.DontSave; Vector2 anchorPos = tk2dSpriteGeomGen.GetAnchorOffset( anchor, texture.width, texture.height ); spriteCollection = tk2dRuntime.SpriteCollectionGenerator.CreateFromTexture( go, texture, spriteCollectionSize, new Vector2(texture.width, texture.height), new string[] { "unnamed" } , new Rect[] { new Rect(0, 0, texture.width, texture.height) }, null, new Vector2[] { anchorPos }, new bool[] { false } ); string objName = "SpriteFromTexture " + texture.name; spriteCollection.spriteCollectionName = objName; spriteCollection.spriteDefinitions[0].material.name = objName; spriteCollection.spriteDefinitions[0].material.hideFlags = HideFlags.DontSave | HideFlags.HideInInspector; Sprite.SetSprite( spriteCollection, 0 ); } }
public void Create(tk2dSpriteCollectionSize spriteCollectionSize, Texture texture, tk2dBaseSprite.Anchor anchor) { DestroyInternal(); if (texture != null) { // Copy values this.spriteCollectionSize.CopyFrom(spriteCollectionSize); this.texture = texture; this.anchor = anchor; Vector2 anchorPos = tk2dSpriteGeomGen.GetAnchorOffset(anchor, texture.width, texture.height); spriteCollection = tk2dRuntime.SpriteCollectionGenerator.CreateFromTexture( gameObject, texture, spriteCollectionSize, new Vector2(texture.width, texture.height), new string[] { "unnamed" }, new Rect[] { new Rect(0, 0, texture.width, texture.height) }, null, new Vector2[] { anchorPos }, new bool[] { false }); // don't want to save or see this spriteCollection.hideFlags = HideFlags.HideInInspector; string objName = "SpriteFromTexture " + texture.name; spriteCollection.spriteCollectionName = objName; spriteCollection.spriteDefinitions[0].material.name = objName; spriteCollection.spriteDefinitions[0].material.hideFlags = HideFlags.DontSave | HideFlags.HideInInspector; Sprite.SetSprite(spriteCollection, 0); } }
public static void ConstructOffsetsFromAnchor(this tk2dSpriteDefinition def, tk2dBaseSprite.Anchor anchor, Vector2?scale = null, bool fixesScale = false, bool changesCollider = true) { if (!scale.HasValue) { scale = new Vector2?(def.position3); } if (fixesScale) { Vector2 fixedScale = scale.Value - def.position0.XY(); scale = new Vector2?(fixedScale); } float xOffset = 0; if (anchor == tk2dBaseSprite.Anchor.LowerCenter || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.UpperCenter) { xOffset = -(scale.Value.x / 2f); } else if (anchor == tk2dBaseSprite.Anchor.LowerRight || anchor == tk2dBaseSprite.Anchor.MiddleRight || anchor == tk2dBaseSprite.Anchor.UpperRight) { xOffset = -scale.Value.x; } float yOffset = 0; if (anchor == tk2dBaseSprite.Anchor.MiddleLeft || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.MiddleLeft) { yOffset = -(scale.Value.y / 2f); } else if (anchor == tk2dBaseSprite.Anchor.UpperLeft || anchor == tk2dBaseSprite.Anchor.UpperCenter || anchor == tk2dBaseSprite.Anchor.UpperRight) { yOffset = -scale.Value.y; } def.MakeOffset(new Vector2(xOffset, yOffset), false); if (changesCollider && def.colliderVertices != null && def.colliderVertices.Length > 0) { float colliderXOffset = 0; if (anchor == tk2dBaseSprite.Anchor.LowerLeft || anchor == tk2dBaseSprite.Anchor.MiddleLeft || anchor == tk2dBaseSprite.Anchor.UpperLeft) { colliderXOffset = (scale.Value.x / 2f); } else if (anchor == tk2dBaseSprite.Anchor.LowerRight || anchor == tk2dBaseSprite.Anchor.MiddleRight || anchor == tk2dBaseSprite.Anchor.UpperRight) { colliderXOffset = -(scale.Value.x / 2f); } float colliderYOffset = 0; if (anchor == tk2dBaseSprite.Anchor.LowerLeft || anchor == tk2dBaseSprite.Anchor.LowerCenter || anchor == tk2dBaseSprite.Anchor.LowerRight) { colliderYOffset = (scale.Value.y / 2f); } else if (anchor == tk2dBaseSprite.Anchor.UpperLeft || anchor == tk2dBaseSprite.Anchor.UpperCenter || anchor == tk2dBaseSprite.Anchor.UpperRight) { colliderYOffset = -(scale.Value.y / 2f); } def.colliderVertices[0] += new Vector3(colliderXOffset, colliderYOffset, 0); } }
public bool SetSprite(tk2dSpriteCollectionData newCollection, string spriteName, tk2dBaseSprite.Anchor anchor) { int spriteId = newCollection.GetSpriteIdByName(spriteName, -1); if (spriteId != -1) { SetSprite(newCollection, spriteId, anchor); } else { CustomDebug.LogError("SetSprite - Sprite not found in collection: " + spriteName); } return(spriteId != -1); }
public static List <int> getAnchorHidePtList(tk2dBaseSprite.Anchor anchor, Rect r, Transform t) { List <int> hidePts = new List <int>(); int x = 0; int y = 0; switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: x = -1; y = -1; break; case tk2dBaseSprite.Anchor.LowerRight: x = 1; y = -1; break; case tk2dBaseSprite.Anchor.UpperLeft: x = -1; y = 1; break; case tk2dBaseSprite.Anchor.UpperRight: x = 1; y = 1; break; } if (r.width < 0.0f) { x = -x; } if (r.height < 0.0f) { y = -y; } if (t.localScale.x < 0.0f) { x = -x; } if (t.localScale.y < 0.0f) { y = -y; } if (x == -1 && y == -1) { hidePts.Add(0); } if (x == 1 && y == -1) { hidePts.Add(1); } if (x == -1 && y == 1) { hidePts.Add(2); } if (x == 1 && y == 1) { hidePts.Add(3); } return(hidePts); }
public void SetSprite(tk2dSpriteCollectionData newCollection, int newSpriteId, tk2dBaseSprite.Anchor anchor) { if (Collection != newCollection) { Collection = newCollection; _spriteId = -1; // force an update, but only when the collection has changed } SpriteID = newSpriteId; AnchorPoint = anchor; UpdateSpriteRenderer(); }
public static void Mount(this AIActor self, GameActor other, tk2dBaseSprite.Anchor attachAnchor = tk2dBaseSprite.Anchor.MiddleCenter, tk2dBaseSprite.Anchor sitAnchor = tk2dBaseSprite.Anchor.LowerCenter, MountedBehaviour.LayeringType layeringType = MountedBehaviour.LayeringType.ABOVE, float heightDifference = 1.5f) { if (self == null || other == null) { return; } MountedBehaviour mountedBehaviour = self.gameObject.AddComponent <MountedBehaviour>(); mountedBehaviour.mount = other; mountedBehaviour.attachAnchor = attachAnchor; mountedBehaviour.sitAnchor = sitAnchor; mountedBehaviour.layeringType = layeringType; mountedBehaviour.heightDifference = heightDifference; }
public override void OnInspectorGUI() { tk2dMySpriteFromTexture target = (tk2dMySpriteFromTexture)this.target; #if UNITY_5_4_OR_NEWER EditorGUIUtility.labelWidth = 0; EditorGUIUtility.fieldWidth = 0; #else EditorGUIUtility.LookLikeControls(0, 0); #endif EditorGUI.BeginChangeCheck(); Texture texture = EditorGUILayout.ObjectField("Texture", target.Texture, typeof(Texture), false) as Texture; if (texture == null) { #if UNITY_5_4_OR_NEWER EditorGUIUtility.labelWidth = 0; EditorGUIUtility.fieldWidth = 0; #else EditorGUIUtility.LookLikeControls(); #endif tk2dGuiUtility.InfoBox("Drag a texture into the texture slot above.", tk2dGuiUtility.WarningLevel.Error); } tk2dBaseSprite.Anchor anchor = target.anchor; bool rebuild = target.rebuild; tk2dSpriteCollectionSize spriteCollectionSize = new tk2dSpriteCollectionSize(); spriteCollectionSize.CopyFrom(target.spriteCollectionSize); if (texture != null) { rebuild = EditorGUILayout.Toggle("Rebuild on Awake", target.rebuild); anchor = (tk2dBaseSprite.Anchor)EditorGUILayout.EnumPopup("Anchor", target.anchor); SpriteCollectionSizeField(spriteCollectionSize); } if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(target, "Sprite From Texture"); target.anchor = anchor; target.rebuild = rebuild; target.spriteCollectionSize = spriteCollectionSize; target.Texture = texture; target.ForceBuild(); } if (GUILayout.Button("Force build")) { target.ForceBuild(); } }
public static Vector2 GetAnchorOffset(tk2dBaseSprite.Anchor anchor, float width, float height) { Vector2 anchorOffset = Vector2.zero; switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.UpperLeft: break; case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.UpperCenter: anchorOffset.x = (int)(width / 2.0f); break; case tk2dBaseSprite.Anchor.LowerRight: case tk2dBaseSprite.Anchor.MiddleRight: case tk2dBaseSprite.Anchor.UpperRight: anchorOffset.x = (int)(width); break; } switch (anchor) { case tk2dBaseSprite.Anchor.UpperLeft: case tk2dBaseSprite.Anchor.UpperCenter: case tk2dBaseSprite.Anchor.UpperRight: break; case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.MiddleRight: anchorOffset.y = (int)(height / 2.0f); break; case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.LowerRight: anchorOffset.y = (int)height; break; } return(anchorOffset); }
// Rect origin as offset from Anchor public static Vector2 GetAnchorOffset(Vector2 rectSize, tk2dBaseSprite.Anchor anchor) { Vector2 anchorOffset = Vector3.zero; switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.UpperLeft: break; case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.UpperCenter: anchorOffset.x = -(rectSize.x / 2.0f); break; case tk2dBaseSprite.Anchor.LowerRight: case tk2dBaseSprite.Anchor.MiddleRight: case tk2dBaseSprite.Anchor.UpperRight: anchorOffset.x = -(rectSize.x); break; } switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.LowerRight: break; case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.MiddleRight: anchorOffset.y = -(rectSize.y / 2.0f); break; case tk2dBaseSprite.Anchor.UpperLeft: case tk2dBaseSprite.Anchor.UpperCenter: case tk2dBaseSprite.Anchor.UpperRight: anchorOffset.y = -(rectSize.y); break; } return(anchorOffset); }
public override void OnInspectorGUI() { tk2dCameraAnchor _target = (tk2dCameraAnchor)this.target; tk2dBaseSprite.Anchor prevAnchorPoint = _target.AnchorPoint; _target.AnchorCamera = EditorGUILayout.ObjectField("Camera", _target.AnchorCamera, typeof(Camera), true) as Camera; _target.AnchorPoint = (tk2dBaseSprite.Anchor)EditorGUILayout.EnumPopup("Anchor Point", _target.AnchorPoint); if (_target.AnchorCamera != null && _target.AnchorCamera.GetComponent <tk2dCamera>() != null) { EditorGUI.indentLevel++; GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel("Offset"); Vector2 anchorOffset = _target.AnchorOffsetPixels; anchorOffset.x = EditorGUILayout.FloatField(anchorOffset.x, GUILayout.MaxWidth(60)); anchorOffset.y = EditorGUILayout.FloatField(anchorOffset.y, GUILayout.MaxWidth(60)); _target.AnchorOffsetPixels = anchorOffset; GUILayout.EndHorizontal(); _target.AnchorToNativeBounds = EditorGUILayout.Toggle("To Native Bounds", _target.AnchorToNativeBounds); EditorGUI.indentLevel--; } if (GUI.changed) { _target.ForceUpdateTransform(); if (prevAnchorPoint != _target.AnchorPoint && _target.gameObject.name == GetAnchorPointName(prevAnchorPoint)) { UpdateAnchorName(_target); } EditorUtility.SetDirty(_target); } }
public static void ConstructOffsetsFromAnchor(this tk2dSpriteDefinition def, tk2dBaseSprite.Anchor anchor, Vector2 scale, bool changesCollider = true) { float xOffset = 0; if (anchor == tk2dBaseSprite.Anchor.LowerCenter || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.UpperCenter) { xOffset = -(scale.x / 2f); } else if (anchor == tk2dBaseSprite.Anchor.LowerRight || anchor == tk2dBaseSprite.Anchor.MiddleRight || anchor == tk2dBaseSprite.Anchor.UpperRight) { xOffset = -scale.x; } float yOffset = 0; if (anchor == tk2dBaseSprite.Anchor.MiddleLeft || anchor == tk2dBaseSprite.Anchor.MiddleCenter || anchor == tk2dBaseSprite.Anchor.MiddleLeft) { yOffset = -(scale.y / 2f); } else if (anchor == tk2dBaseSprite.Anchor.UpperLeft || anchor == tk2dBaseSprite.Anchor.UpperCenter || anchor == tk2dBaseSprite.Anchor.UpperRight) { yOffset = -scale.y; } def.MakeOffset(new Vector2(xOffset, yOffset), changesCollider); }
public void Create(tk2dSpriteCollectionSize spriteCollectionSize, Texture texture, tk2dBaseSprite.Anchor anchor) { DestroyInternal(); if (texture != null) { // Copy values this.spriteCollectionSize.CopyFrom(spriteCollectionSize); this.texture = texture; this.anchor = anchor; GameObject go = new GameObject("tk2dSpriteFromTexture - " + texture.name); go.transform.localPosition = Vector3.zero; go.transform.localRotation = Quaternion.identity; go.transform.localScale = Vector3.one; go.hideFlags = HideFlags.DontSave; Vector2 anchorPos = tk2dSpriteGeomGen.GetAnchorOffset(anchor, texture.width, texture.height); spriteCollection = tk2dRuntime.SpriteCollectionGenerator.CreateFromTexture( go, texture, spriteCollectionSize, new Vector2(texture.width, texture.height), new string[] { "unnamed" }, new Rect[] { new Rect(0, 0, texture.width, texture.height) }, null, new Vector2[] { anchorPos }, new bool[] { false }); string objName = "SpriteFromTexture " + texture.name; spriteCollection.spriteCollectionName = objName; spriteCollection.spriteDefinitions[0].material.name = objName; spriteCollection.spriteDefinitions[0].material.hideFlags = HideFlags.DontSave | HideFlags.HideInInspector; Sprite.SetSprite(spriteCollection, 0); } }
protected void DrawSpriteEditorGUI() { Event ev = Event.current; tk2dSpriteGuiUtility.SpriteSelector(targetRenderInitializers[0].Collection, targetRenderInitializers[0].SpriteID, spriteChangedCallbackInstance, targetRenderInitializers[0].AnchorPoint); if (targetRenderInitializers[0].Collection != null) { if (tk2dPreferences.inst.displayTextureThumbs) { SpriteRenderInitializer renderInitializer = targetRenderInitializers[0]; tk2dSpriteDefinition def = renderInitializer.CurrentSprite; if (renderInitializer.Collection.version < 1 || def.texelSize == Vector2.zero) { string message = ""; message = "No thumbnail data."; if (renderInitializer.Collection.version < 1) { message += "\nPlease rebuild Sprite Collection."; } tk2dGuiUtility.InfoBox(message, tk2dGuiUtility.WarningLevel.Info); } else { GUILayout.BeginHorizontal(); EditorGUILayout.PrefixLabel(" "); int tileSize = 128; Rect r = GUILayoutUtility.GetRect(tileSize, tileSize, GUILayout.ExpandWidth(false)); tk2dGrid.Draw(r); tk2dSpriteThumbnailCache.DrawSpriteTextureInRect(r, def, Color.white); GUILayout.EndHorizontal(); r = GUILayoutUtility.GetLastRect(); if (ev.type == EventType.MouseDown && ev.button == 0 && r.Contains(ev.mousePosition)) { tk2dSpriteGuiUtility.SpriteSelectorPopup(renderInitializer.Collection, renderInitializer.SpriteID, spriteChangedCallbackInstance, null); } } } GUILayout.Space(8); GUILayout.BeginHorizontal(); tk2dBaseSprite.Anchor anchor = (tk2dBaseSprite.Anchor)EditorTools.DrawEnumField(targetRenderInitializers[0].AnchorPoint, "AnchorPoint"); GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); int pixelsPerMeter = (int)EditorTools.DrawFloatField(targetRenderInitializers[0].TargetPixelsPerMeter, "Pixels Per Meter"); GUILayout.EndHorizontal(); if ((anchor != targetRenderInitializers[0].AnchorPoint) || (pixelsPerMeter != targetRenderInitializers[0].TargetPixelsPerMeter)) { targetRenderInitializers[0].AnchorPoint = anchor; targetRenderInitializers[0].TargetPixelsPerMeter = pixelsPerMeter; targetRenderInitializers[0].ForceBuild(); } } else { tk2dGuiUtility.InfoBox("Please select a sprite collection.", tk2dGuiUtility.WarningLevel.Error); } bool needUpdatePrefabs = false; if (GUI.changed) { foreach (SpriteRenderInitializer sprite in targetRenderInitializers) { if (PrefabUtility.GetPrefabType(sprite) == PrefabType.Prefab) { needUpdatePrefabs = true; } EditorUtility.SetDirty(sprite); } } // This is a prefab, and changes need to be propagated. This isn't supported in Unity 3.4 if (needUpdatePrefabs) { // Rebuild prefab instances tk2dBaseSprite[] allSprites = Resources.FindObjectsOfTypeAll(typeof(tk2dBaseSprite)) as tk2dBaseSprite[]; foreach (var spr in allSprites) { if (PrefabUtility.GetPrefabType(spr) == PrefabType.PrefabInstance) { Object parent = PrefabUtility.GetPrefabParent(spr.gameObject); bool found = false; foreach (SpriteRenderInitializer sprite in targetRenderInitializers) { if (sprite.gameObject == parent) { found = true; break; } } if (found) { // Reset all prefab states var propMod = PrefabUtility.GetPropertyModifications(spr); PrefabUtility.ResetToPrefabState(spr); PrefabUtility.SetPropertyModifications(spr, propMod); spr.ForceBuild(); } } } } }
static string GetAnchorPointName(tk2dBaseSprite.Anchor anchor) { return("Anchor (" + anchor.ToString() + ")"); }
public static tk2dSpriteDefinition SetProjectileSpriteRight(this Projectile proj, string name, int pixelWidth, int pixelHeight, bool lightened = true, tk2dBaseSprite.Anchor anchor = tk2dBaseSprite.Anchor.LowerLeft, int?overrideColliderPixelWidth = null, int?overrideColliderPixelHeight = null, bool anchorChangesCollider = true, bool fixesScale = false, int?overrideColliderOffsetX = null, int?overrideColliderOffsetY = null, Projectile overrideProjectileToCopyFrom = null) { try { proj.GetAnySprite().spriteId = ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName(name); tk2dSpriteDefinition def = SetupDefinitionForProjectileSprite(name, proj.GetAnySprite().spriteId, pixelWidth, pixelHeight, lightened, overrideColliderPixelWidth, overrideColliderPixelHeight, overrideColliderOffsetX, overrideColliderOffsetY, overrideProjectileToCopyFrom); def.ConstructOffsetsFromAnchor(anchor, def.position3, fixesScale, anchorChangesCollider); proj.GetAnySprite().scale = new Vector3(1f, 1f, 1f); proj.transform.localScale = new Vector3(1f, 1f, 1f); proj.GetAnySprite().transform.localScale = new Vector3(1f, 1f, 1f); proj.AdditionalScaleMultiplier = 1f; return(def); } catch (Exception ex) { ETGModConsole.Log("Ooops! Seems like something got very, Very, VERY wrong. Here's the exception:"); ETGModConsole.Log(ex.ToString()); return(null); } }
public static void AnimateProjectile(this Projectile proj, List <string> names, int fps, bool loops, List <IntVector2> pixelSizes, List <bool> lighteneds, List <tk2dBaseSprite.Anchor> anchors, List <bool> anchorsChangeColliders, List <bool> fixesScales, List <Vector3?> manualOffsets, List <IntVector2?> overrideColliderPixelSizes, List <IntVector2?> overrideColliderOffsets, List <Projectile> overrideProjectilesToCopyFrom) { tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip(); clip.name = "idle"; clip.fps = fps; List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>(); for (int i = 0; i < names.Count; i++) { string name = names[i]; IntVector2 pixelSize = pixelSizes[i]; IntVector2?overrideColliderPixelSize = overrideColliderPixelSizes[i]; IntVector2?overrideColliderOffset = overrideColliderOffsets[i]; Vector3? manualOffset = manualOffsets[i]; bool anchorChangesCollider = anchorsChangeColliders[i]; bool fixesScale = fixesScales[i]; if (!manualOffset.HasValue) { manualOffset = new Vector2?(Vector2.zero); } tk2dBaseSprite.Anchor anchor = anchors[i]; bool lightened = lighteneds[i]; Projectile overrideProjectileToCopyFrom = overrideProjectilesToCopyFrom[i]; tk2dSpriteAnimationFrame frame = new tk2dSpriteAnimationFrame(); frame.spriteId = ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName(name); frame.spriteCollection = ETGMod.Databases.Items.ProjectileCollection; frames.Add(frame); int?overrideColliderPixelWidth = null; int?overrideColliderPixelHeight = null; if (overrideColliderPixelSize.HasValue) { overrideColliderPixelWidth = overrideColliderPixelSize.Value.x; overrideColliderPixelHeight = overrideColliderPixelSize.Value.y; } int?overrideColliderOffsetX = null; int?overrideColliderOffsetY = null; if (overrideColliderOffset.HasValue) { overrideColliderOffsetX = overrideColliderOffset.Value.x; overrideColliderOffsetY = overrideColliderOffset.Value.y; } tk2dSpriteDefinition def = GunTools.SetupDefinitionForProjectileSprite(name, frame.spriteId, pixelSize.x, pixelSize.y, lightened, overrideColliderPixelWidth, overrideColliderPixelHeight, overrideColliderOffsetX, overrideColliderOffsetY, overrideProjectileToCopyFrom); def.ConstructOffsetsFromAnchor(anchor, def.position3, fixesScale, anchorChangesCollider); def.position0 += manualOffset.Value; def.position1 += manualOffset.Value; def.position2 += manualOffset.Value; def.position3 += manualOffset.Value; if (i == 0) { proj.GetAnySprite().SetSprite(frame.spriteCollection, frame.spriteId); } } clip.wrapMode = loops ? tk2dSpriteAnimationClip.WrapMode.Loop : tk2dSpriteAnimationClip.WrapMode.Once; clip.frames = frames.ToArray(); if (proj.sprite.spriteAnimator == null) { proj.sprite.spriteAnimator = proj.sprite.gameObject.AddComponent <tk2dSpriteAnimator>(); } proj.sprite.spriteAnimator.playAutomatically = true; bool flag = proj.sprite.spriteAnimator.Library == null; if (flag) { proj.sprite.spriteAnimator.Library = proj.sprite.spriteAnimator.gameObject.AddComponent <tk2dSpriteAnimation>(); proj.sprite.spriteAnimator.Library.clips = new tk2dSpriteAnimationClip[0]; proj.sprite.spriteAnimator.Library.enabled = true; } proj.sprite.spriteAnimator.Library.clips = proj.sprite.spriteAnimator.Library.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray(); proj.sprite.spriteAnimator.DefaultClipId = proj.sprite.spriteAnimator.Library.GetClipIdByName("idle"); proj.sprite.spriteAnimator.deferNextStartClip = false; }
public static GameObject MakeAnimatedOrbital(string name, float orbitRadius, float orbitalDegreesPerSecond, int orbitalTier, PlayerOrbital.OrbitalMotionStyle motionStyle, float perfectOrbitalFactor, List <string> idleAnimPaths, int fps, Vector2 colliderDimensions, Vector2 colliderOffsets, tk2dBaseSprite.Anchor anchorMode, tk2dSpriteAnimationClip.WrapMode wrapMode) { GameObject prefab = SpriteBuilder.SpriteFromResource(idleAnimPaths[0]); prefab.name = name; var body = prefab.GetComponent <tk2dSprite>().SetUpSpeculativeRigidbody(colliderOffsets.ToIntVector2(), colliderDimensions.ToIntVector2()); body.CollideWithTileMap = false; body.CollideWithOthers = true; body.PrimaryPixelCollider.CollisionLayer = CollisionLayer.EnemyBulletBlocker; tk2dSpriteCollectionData spriteCollection = SpriteBuilder.ConstructCollection(prefab, $"{name}_Collection"); prefab.AddAnimationToObject(spriteCollection, "start", idleAnimPaths, fps, colliderDimensions, colliderOffsets, anchorMode, wrapMode, true); PlayerOrbital orbitalPrefab = prefab.AddComponent <PlayerOrbital>(); orbitalPrefab.motionStyle = motionStyle; orbitalPrefab.shouldRotate = false; orbitalPrefab.orbitRadius = orbitRadius; orbitalPrefab.perfectOrbitalFactor = perfectOrbitalFactor; orbitalPrefab.orbitDegreesPerSecond = orbitalDegreesPerSecond; orbitalPrefab.SetOrbitalTier(orbitalTier); prefab.MakeFakePrefab(); return(prefab); }
private void PermanentUpgradeLegacyMode() { tk2dSpriteDefinition currentSprite = base.CurrentSprite; float x = currentSprite.untrimmedBoundsData[0].x; float y = currentSprite.untrimmedBoundsData[0].y; float scale = currentSprite.untrimmedBoundsData[1].x; float num4 = currentSprite.untrimmedBoundsData[1].y; if (this.NearEnough(x, 0f, scale) && this.NearEnough(y, -num4 / 2f, num4)) { this._anchor = tk2dBaseSprite.Anchor.UpperCenter; } else if (this.NearEnough(x, 0f, scale) && this.NearEnough(y, 0f, num4)) { this._anchor = tk2dBaseSprite.Anchor.MiddleCenter; } else if (this.NearEnough(x, 0f, scale) && this.NearEnough(y, num4 / 2f, num4)) { this._anchor = tk2dBaseSprite.Anchor.LowerCenter; } else if (this.NearEnough(x, -scale / 2f, scale) && this.NearEnough(y, -num4 / 2f, num4)) { this._anchor = tk2dBaseSprite.Anchor.UpperRight; } else if (this.NearEnough(x, -scale / 2f, scale) && this.NearEnough(y, 0f, num4)) { this._anchor = tk2dBaseSprite.Anchor.MiddleRight; } else if (this.NearEnough(x, -scale / 2f, scale) && this.NearEnough(y, num4 / 2f, num4)) { this._anchor = tk2dBaseSprite.Anchor.LowerRight; } else if (this.NearEnough(x, scale / 2f, scale) && this.NearEnough(y, -num4 / 2f, num4)) { this._anchor = tk2dBaseSprite.Anchor.UpperLeft; } else if (this.NearEnough(x, scale / 2f, scale) && this.NearEnough(y, 0f, num4)) { this._anchor = tk2dBaseSprite.Anchor.MiddleLeft; } else if (this.NearEnough(x, scale / 2f, scale) && this.NearEnough(y, num4 / 2f, num4)) { this._anchor = tk2dBaseSprite.Anchor.LowerLeft; } else { Debug.LogError("tk2dSlicedSprite (" + base.name + ") error - Unable to determine anchor upgrading from legacy mode. Please fix this manually."); this._anchor = tk2dBaseSprite.Anchor.MiddleCenter; } float num5 = scale / currentSprite.texelSize.x; float num6 = num4 / currentSprite.texelSize.y; this._dimensions.x = this._scale.x * num5; this._dimensions.y = this._scale.y * num6; this._scale.Set(1f, 1f, 1f); this.legacyMode = false; }
// Token: 0x06000097 RID: 151 RVA: 0x00007E60 File Offset: 0x00006060 public static void SetProjectileSpriteRight(this Projectile proj, string name, int pixelWidth, int pixelHeight, bool lightened = true, tk2dBaseSprite.Anchor anchor = tk2dBaseSprite.Anchor.LowerLeft, int?overrideColliderPixelWidth = null, int?overrideColliderPixelHeight = null, int?overrideColliderOffsetX = null, int?overrideColliderOffsetY = null, Projectile overrideProjectileToCopyFrom = null) { try { ETGMod.GetAnySprite(proj).spriteId = ETGMod.Databases.Items.ProjectileCollection.inst.GetSpriteIdByName(name); tk2dSpriteDefinition tk2dSpriteDefinition = GunTools.SetupDefinitionForProjectileSprite(name, ETGMod.GetAnySprite(proj).spriteId, pixelWidth, pixelHeight, lightened, overrideColliderPixelWidth, overrideColliderPixelHeight, overrideColliderOffsetX, overrideColliderOffsetY, overrideProjectileToCopyFrom); tk2dSpriteDefinition.ConstructOffsetsFromAnchor(anchor, tk2dSpriteDefinition.position3); } catch (Exception ex) { ETGModConsole.Log("Ooops! Seems like something got very, Very, VERY wrong. Here's the exception:", false); ETGModConsole.Log(ex.ToString(), false); } }
public static void AddAnimationToObject(this GameObject target, tk2dSpriteCollectionData spriteCollection, string animationName, List <string> spritePaths, int fps, Vector2 colliderDimensions, Vector2 colliderOffsets, tk2dBaseSprite.Anchor anchor, tk2dSpriteAnimationClip.WrapMode wrapMode, bool isDefaultAnimation = false) { tk2dSpriteAnimator animator = target.GetOrAddComponent <tk2dSpriteAnimator>(); tk2dSpriteAnimation animation = target.GetOrAddComponent <tk2dSpriteAnimation>(); animation.clips = new tk2dSpriteAnimationClip[0]; animator.Library = animation; tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip() { name = animationName, frames = new tk2dSpriteAnimationFrame[0], fps = fps }; List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>(); foreach (string path in spritePaths) { tk2dSpriteCollectionData collection = spriteCollection; int frameSpriteId = SpriteBuilder.AddSpriteToCollection(path, collection); tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId]; frameDef.colliderVertices = new Vector3[] { new Vector3(colliderOffsets.x / 16, colliderOffsets.y / 16, 0f), new Vector3((colliderDimensions.x / 16), (colliderDimensions.y / 16), 0f) }; frameDef.ConstructOffsetsFromAnchor(anchor); frames.Add(new tk2dSpriteAnimationFrame { spriteId = frameSpriteId, spriteCollection = collection }); } clip.frames = frames.ToArray(); clip.wrapMode = wrapMode; animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray(); if (isDefaultAnimation) { animator.DefaultClipId = animation.GetClipIdByName(animationName); animator.playAutomatically = true; } }
/// <summary> /// Used to create new VFX. Place sprites inside of Mods/YourModFolder/sprites/VFX Collection, inside the EtG directory. Each parameter that is a list must have an entry for each sprite of the animation /// </summary> /// <param name="name">The name of the VFX</param> /// <param name="spriteNames">The name of the sprites for the VFX, like VFX_001, VFX_002, etc.</param> /// <param name="fps">The frame rate the animation will play at</param> /// <param name="spriteSizes">The size of each sprite in the animation. Must have an IntVector2 entry for each sprite in the animation</param> /// <param name="anchors">I don't know what exactly this does</param> /// <param name="manualOffsets">I don't know what exactly this does</param> /// <param name="orphaned">I don't know what exactly this does</param> /// <param name="attached">I don't know what exactly this does</param> /// <param name="persistsOnDeath">Best left false</param> /// <param name="usesZHeight">Change if needed</param> /// <param name="zHeight">Change if needed, but usually left at 0</param> /// <param name="alignment">Leave at Fixed</param> /// <param name="destructible">Always set to true</param> /// <param name="emissivePowers">Doesn't seem to work, set all entries at 0. Might cause bugs if tinkered with</param> /// <param name="emissiveColors">Does't seem to work, set all entries to VFXLibrary.emptyColor. Might cause bugs if tinkered with</param> /// <returns></returns> public static VFXPool CreateMuzzleflash(string name, List <string> spriteNames, int fps, List <IntVector2> spriteSizes, List <tk2dBaseSprite.Anchor> anchors, List <Vector2> manualOffsets, bool orphaned, bool attached, bool persistsOnDeath, bool usesZHeight, float zHeight, VFXAlignment alignment, bool destructible, List <float> emissivePowers, List <Color> emissiveColors) { VFXPool pool = new VFXPool(); pool.type = VFXPoolType.All; VFXComplex complex = new VFXComplex(); VFXObject vfObj = new VFXObject(); GameObject obj = new GameObject(name); obj.SetActive(false); FakePrefab.MarkAsFakePrefab(obj); UnityEngine.Object.DontDestroyOnLoad(obj); tk2dSprite sprite = obj.AddComponent <tk2dSprite>(); tk2dSpriteAnimator animator = obj.AddComponent <tk2dSpriteAnimator>(); tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip(); clip.fps = fps; clip.frames = new tk2dSpriteAnimationFrame[0]; for (int i = 0; i < spriteNames.Count; i++) { string spriteName = spriteNames[i]; IntVector2 spriteSize = spriteSizes[i]; tk2dBaseSprite.Anchor anchor = anchors[i]; Vector2 manualOffset = manualOffsets[i]; float emissivePower = emissivePowers[i]; Color emissiveColor = emissiveColors[i]; tk2dSpriteAnimationFrame frame = new tk2dSpriteAnimationFrame(); frame.spriteId = VFXCollection.GetSpriteIdByName(spriteName); tk2dSpriteDefinition def = SetupDefinitionForShellSprite(spriteName, frame.spriteId, spriteSize.x, spriteSize.y); def.ConstructOffsetsFromAnchor(anchor, def.position3); def.MakeOffset(manualOffset); def.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); def.material.SetFloat("_EmissiveColorPower", emissivePower); def.material.SetColor("_EmissiveColor", emissiveColor); def.material.SetTexture("_MainTex", def.material.GetTexture("_MainTex")); def.materialInst.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); def.materialInst.SetFloat("_EmissiveColorPower", emissivePower); def.materialInst.SetColor("_EmissiveColor", emissiveColor); def.materialInst.SetTexture("_MainTex", def.materialInst.GetTexture("_MainTex")); frame.spriteCollection = VFXCollection; clip.frames = clip.frames.Concat(new tk2dSpriteAnimationFrame[] { frame }).ToArray(); } sprite.renderer.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); sprite.renderer.material.SetFloat("_EmissiveColorPower", emissivePowers[0]); sprite.renderer.material.SetColor("_EmissiveColor", emissiveColors[0]); sprite.renderer.material.SetTexture("_MainTex", sprite.renderer.material.GetTexture("_MainTex")); clip.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once; clip.name = "start"; animator.spriteAnimator.Library = animator.gameObject.AddComponent <tk2dSpriteAnimation>(); animator.spriteAnimator.Library.clips = new tk2dSpriteAnimationClip[] { clip }; animator.spriteAnimator.Library.enabled = true; SpriteAnimatorKiller kill = animator.gameObject.AddComponent <SpriteAnimatorKiller>(); kill.fadeTime = -1f; kill.animator = animator; kill.delayDestructionTime = -1f; vfObj.orphaned = orphaned; vfObj.attached = attached; vfObj.persistsOnDeath = persistsOnDeath; vfObj.usesZHeight = usesZHeight; vfObj.zHeight = zHeight; vfObj.alignment = alignment; vfObj.destructible = destructible; vfObj.effect = obj; complex.effects = new VFXObject[] { vfObj }; pool.effects = new VFXComplex[] { complex }; animator.playAutomatically = true; animator.DefaultClipId = animator.GetClipIdByName("start"); return(pool); }
public static void SetSlicedSpriteGeom(Vector3[] pos, Vector2[] uv, int offset, out Vector3 boundsCenter, out Vector3 boundsExtents, tk2dSpriteDefinition spriteDef, Vector3 scale, Vector2 dimensions, Vector2 borderBottomLeft, Vector2 borderTopRight, tk2dBaseSprite.Anchor anchor, float colliderOffsetZ, float colliderExtentZ) { boundsCenter = Vector3.zero; boundsExtents = Vector3.zero; if (spriteDef.positions.Length == 4) { float sx = spriteDef.texelSize.x; float sy = spriteDef.texelSize.y; Vector3[] srcVert = spriteDef.positions; float dx = (srcVert[1].x - srcVert[0].x); float dy = (srcVert[2].y - srcVert[0].y); float borderTopPixels = borderTopRight.y * dy; float borderBottomPixels = borderBottomLeft.y * dy; float borderRightPixels = borderTopRight.x * dx; float borderLeftPixels = borderBottomLeft.x * dx; float dimXPixels = dimensions.x * sx; float dimYPixels = dimensions.y * sy; float anchorOffsetX = 0.0f; float anchorOffsetY = 0.0f; switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.UpperLeft: break; case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.UpperCenter: anchorOffsetX = -(int)(dimensions.x / 2.0f); break; case tk2dBaseSprite.Anchor.LowerRight: case tk2dBaseSprite.Anchor.MiddleRight: case tk2dBaseSprite.Anchor.UpperRight: anchorOffsetX = -(int)(dimensions.x); break; } switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.LowerRight: break; case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.MiddleRight: anchorOffsetY = -(int)(dimensions.y / 2.0f); break; case tk2dBaseSprite.Anchor.UpperLeft: case tk2dBaseSprite.Anchor.UpperCenter: case tk2dBaseSprite.Anchor.UpperRight: anchorOffsetY = -(int)dimensions.y; break; } // scale back to sprite coordinates // do it after the cast above, as we're trying to align to pixel anchorOffsetX *= sx; anchorOffsetY *= sy; boundsCenter.Set(scale.x * (dimXPixels * 0.5f + anchorOffsetX), scale.y * (dimYPixels * 0.5f + anchorOffsetY), colliderOffsetZ); boundsExtents.Set(scale.x * (dimXPixels * 0.5f), scale.y * (dimYPixels * 0.5f), colliderExtentZ); Vector2[] srcUv = spriteDef.uvs; Vector2 duvx = srcUv[1] - srcUv[0]; Vector2 duvy = srcUv[2] - srcUv[0]; Vector3 origin = new Vector3(anchorOffsetX, anchorOffsetY, 0); Vector3[] originPoints = new Vector3[4] { origin, origin + new Vector3(0, borderBottomPixels, 0), origin + new Vector3(0, dimYPixels - borderTopPixels, 0), origin + new Vector3(0, dimYPixels, 0), }; Vector2[] originUvs = new Vector2[4] { srcUv[0], srcUv[0] + duvy * borderBottomLeft.y, srcUv[0] + duvy * (1 - borderTopRight.y), srcUv[0] + duvy, }; for (int i = 0; i < 4; ++i) { pos[offset + i * 4 + 0] = originPoints[i]; pos[offset + i * 4 + 1] = originPoints[i] + new Vector3(borderLeftPixels, 0, 0); pos[offset + i * 4 + 2] = originPoints[i] + new Vector3(dimXPixels - borderRightPixels, 0, 0); pos[offset + i * 4 + 3] = originPoints[i] + new Vector3(dimXPixels, 0, 0); for (int j = 0; j < 4; ++j) { pos[offset + i * 4 + j] = Vector3.Scale(pos[offset + i * 4 + j], scale); } uv[offset + i * 4 + 0] = originUvs[i]; uv[offset + i * 4 + 1] = originUvs[i] + duvx * borderBottomLeft.x; uv[offset + i * 4 + 2] = originUvs[i] + duvx * (1 - borderTopRight.x); uv[offset + i * 4 + 3] = originUvs[i] + duvx; } } }
public static void SetTiledSpriteGeom(Vector3[] pos, Vector2[] uv, int offset, out Vector3 boundsCenter, out Vector3 boundsExtents, tk2dSpriteDefinition spriteDef, Vector3 scale, Vector2 dimensions, tk2dBaseSprite.Anchor anchor, float colliderOffsetZ, float colliderExtentZ) { boundsCenter = Vector3.zero; boundsExtents = Vector3.zero; int numTilesX = (int)Mathf.Ceil((dimensions.x * spriteDef.texelSize.x) / spriteDef.untrimmedBoundsData[1].x); int numTilesY = (int)Mathf.Ceil((dimensions.y * spriteDef.texelSize.y) / spriteDef.untrimmedBoundsData[1].y); Vector2 totalMeshSize = new Vector2(dimensions.x * spriteDef.texelSize.x * scale.x, dimensions.y * spriteDef.texelSize.y * scale.y); Vector2 texelEpsilon = Vector2.Scale(spriteDef.texelSize, scale) * 0.1f; // Anchor tweaks Vector3 anchorOffset = Vector3.zero; switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.UpperLeft: break; case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.UpperCenter: anchorOffset.x = -(totalMeshSize.x / 2.0f); break; case tk2dBaseSprite.Anchor.LowerRight: case tk2dBaseSprite.Anchor.MiddleRight: case tk2dBaseSprite.Anchor.UpperRight: anchorOffset.x = -(totalMeshSize.x); break; } switch (anchor) { case tk2dBaseSprite.Anchor.LowerLeft: case tk2dBaseSprite.Anchor.LowerCenter: case tk2dBaseSprite.Anchor.LowerRight: break; case tk2dBaseSprite.Anchor.MiddleLeft: case tk2dBaseSprite.Anchor.MiddleCenter: case tk2dBaseSprite.Anchor.MiddleRight: anchorOffset.y = -(totalMeshSize.y / 2.0f); break; case tk2dBaseSprite.Anchor.UpperLeft: case tk2dBaseSprite.Anchor.UpperCenter: case tk2dBaseSprite.Anchor.UpperRight: anchorOffset.y = -totalMeshSize.y; break; } Vector3 colliderAnchor = anchorOffset; anchorOffset -= Vector3.Scale(spriteDef.positions[0], scale); boundsCenter.Set(totalMeshSize.x * 0.5f + colliderAnchor.x, totalMeshSize.y * 0.5f + colliderAnchor.y, colliderOffsetZ); boundsExtents.Set(totalMeshSize.x * 0.5f, totalMeshSize.y * 0.5f, colliderExtentZ); int vert = 0; Vector3 bounds = Vector3.Scale(spriteDef.untrimmedBoundsData[1], scale); Vector3 baseOffset = Vector3.zero; Vector3 p = baseOffset; for (int y = 0; y < numTilesY; ++y) { p.x = baseOffset.x; for (int x = 0; x < numTilesX; ++x) { float xClipFrac = 1; float yClipFrac = 1; if (Mathf.Abs(p.x + bounds.x) > Mathf.Abs(totalMeshSize.x) + texelEpsilon.x) { xClipFrac = ((totalMeshSize.x % bounds.x) / bounds.x); } if (Mathf.Abs(p.y + bounds.y) > Mathf.Abs(totalMeshSize.y) + texelEpsilon.y) { yClipFrac = ((totalMeshSize.y % bounds.y) / bounds.y); } Vector3 geomOffset = p + anchorOffset; if (xClipFrac != 1 || yClipFrac != 1) { Vector2 fracBottomLeft = Vector2.zero; Vector2 fracTopRight = new Vector2(xClipFrac, yClipFrac); Vector3 bottomLeft = new Vector3(Mathf.Lerp(spriteDef.positions[0].x, spriteDef.positions[3].x, fracBottomLeft.x) * scale.x, Mathf.Lerp(spriteDef.positions[0].y, spriteDef.positions[3].y, fracBottomLeft.y) * scale.y, spriteDef.positions[0].z * scale.z); Vector3 topRight = new Vector3(Mathf.Lerp(spriteDef.positions[0].x, spriteDef.positions[3].x, fracTopRight.x) * scale.x, Mathf.Lerp(spriteDef.positions[0].y, spriteDef.positions[3].y, fracTopRight.y) * scale.y, spriteDef.positions[0].z * scale.z); pos[offset + vert + 0] = geomOffset + new Vector3(bottomLeft.x, bottomLeft.y, bottomLeft.z); pos[offset + vert + 1] = geomOffset + new Vector3(topRight.x, bottomLeft.y, bottomLeft.z); pos[offset + vert + 2] = geomOffset + new Vector3(bottomLeft.x, topRight.y, bottomLeft.z); pos[offset + vert + 3] = geomOffset + new Vector3(topRight.x, topRight.y, bottomLeft.z); // find the fraction of UV // This can be done without a branch, but will end up with loads of unnecessary interpolations if (spriteDef.flipped == tk2dSpriteDefinition.FlipMode.Tk2d) { Vector2 v0 = new Vector2(Mathf.Lerp(spriteDef.uvs[0].x, spriteDef.uvs[3].x, fracBottomLeft.y), Mathf.Lerp(spriteDef.uvs[0].y, spriteDef.uvs[3].y, fracBottomLeft.x)); Vector2 v1 = new Vector2(Mathf.Lerp(spriteDef.uvs[0].x, spriteDef.uvs[3].x, fracTopRight.y), Mathf.Lerp(spriteDef.uvs[0].y, spriteDef.uvs[3].y, fracTopRight.x)); uv[offset + vert + 0] = new Vector2(v0.x, v0.y); uv[offset + vert + 1] = new Vector2(v0.x, v1.y); uv[offset + vert + 2] = new Vector2(v1.x, v0.y); uv[offset + vert + 3] = new Vector2(v1.x, v1.y); } else if (spriteDef.flipped == tk2dSpriteDefinition.FlipMode.TPackerCW) { Vector2 v0 = new Vector2(Mathf.Lerp(spriteDef.uvs[0].x, spriteDef.uvs[3].x, fracBottomLeft.y), Mathf.Lerp(spriteDef.uvs[0].y, spriteDef.uvs[3].y, fracBottomLeft.x)); Vector2 v1 = new Vector2(Mathf.Lerp(spriteDef.uvs[0].x, spriteDef.uvs[3].x, fracTopRight.y), Mathf.Lerp(spriteDef.uvs[0].y, spriteDef.uvs[3].y, fracTopRight.x)); uv[offset + vert + 0] = new Vector2(v0.x, v0.y); uv[offset + vert + 2] = new Vector2(v1.x, v0.y); uv[offset + vert + 1] = new Vector2(v0.x, v1.y); uv[offset + vert + 3] = new Vector2(v1.x, v1.y); } else { Vector2 v0 = new Vector2(Mathf.Lerp(spriteDef.uvs[0].x, spriteDef.uvs[3].x, fracBottomLeft.x), Mathf.Lerp(spriteDef.uvs[0].y, spriteDef.uvs[3].y, fracBottomLeft.y)); Vector2 v1 = new Vector2(Mathf.Lerp(spriteDef.uvs[0].x, spriteDef.uvs[3].x, fracTopRight.x), Mathf.Lerp(spriteDef.uvs[0].y, spriteDef.uvs[3].y, fracTopRight.y)); uv[offset + vert + 0] = new Vector2(v0.x, v0.y); uv[offset + vert + 1] = new Vector2(v1.x, v0.y); uv[offset + vert + 2] = new Vector2(v0.x, v1.y); uv[offset + vert + 3] = new Vector2(v1.x, v1.y); } } else { pos[offset + vert + 0] = geomOffset + Vector3.Scale(spriteDef.positions[0], scale); pos[offset + vert + 1] = geomOffset + Vector3.Scale(spriteDef.positions[1], scale); pos[offset + vert + 2] = geomOffset + Vector3.Scale(spriteDef.positions[2], scale); pos[offset + vert + 3] = geomOffset + Vector3.Scale(spriteDef.positions[3], scale); uv[offset + vert + 0] = spriteDef.uvs[0]; uv[offset + vert + 1] = spriteDef.uvs[1]; uv[offset + vert + 2] = spriteDef.uvs[2]; uv[offset + vert + 3] = spriteDef.uvs[3]; } vert += 4; p.x += bounds.x; } p.y += bounds.y; } }
public static VFXPool CreateVFXPool(string name, List <string> spritePaths, int fps, IntVector2 Dimensions, tk2dBaseSprite.Anchor anchor, bool usesZHeight, float zHeightOffset, bool persist = false, VFXAlignment alignment = VFXAlignment.NormalAligned, float emissivePower = -1, Color?emissiveColour = null) { GameObject Obj = new GameObject(name); VFXPool pool = new VFXPool(); pool.type = VFXPoolType.All; VFXComplex complex = new VFXComplex(); VFXObject vfObj = new VFXObject(); Obj.SetActive(false); FakePrefab.MarkAsFakePrefab(Obj); UnityEngine.Object.DontDestroyOnLoad(Obj); tk2dSpriteCollectionData VFXSpriteCollection = SpriteBuilder.ConstructCollection(Obj, (name + "_Collection")); int spriteID = SpriteBuilder.AddSpriteToCollection(spritePaths[0], VFXSpriteCollection); tk2dSprite sprite = Obj.GetOrAddComponent <tk2dSprite>(); sprite.SetSprite(VFXSpriteCollection, spriteID); tk2dSpriteDefinition defaultDef = sprite.GetCurrentSpriteDef(); defaultDef.colliderVertices = new Vector3[] { new Vector3(0f, 0f, 0f), new Vector3((Dimensions.x / 16), (Dimensions.y / 16), 0f) }; tk2dSpriteAnimator animator = Obj.GetOrAddComponent <tk2dSpriteAnimator>(); tk2dSpriteAnimation animation = Obj.GetOrAddComponent <tk2dSpriteAnimation>(); animation.clips = new tk2dSpriteAnimationClip[0]; animator.Library = animation; tk2dSpriteAnimationClip clip = new tk2dSpriteAnimationClip() { name = "start", frames = new tk2dSpriteAnimationFrame[0], fps = fps }; List <tk2dSpriteAnimationFrame> frames = new List <tk2dSpriteAnimationFrame>(); for (int i = 0; i < spritePaths.Count; i++) { tk2dSpriteCollectionData collection = VFXSpriteCollection; int frameSpriteId = SpriteBuilder.AddSpriteToCollection(spritePaths[i], collection); tk2dSpriteDefinition frameDef = collection.spriteDefinitions[frameSpriteId]; frameDef.ConstructOffsetsFromAnchor(anchor); frameDef.colliderVertices = defaultDef.colliderVertices; if (emissivePower > 0) { frameDef.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); } if (emissivePower > 0) { frameDef.material.SetFloat("_EmissiveColorPower", emissivePower); } if (emissiveColour != null) { frameDef.material.SetColor("_EmissiveColor", (Color)emissiveColour); } if (emissivePower > 0) { frameDef.materialInst.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); } if (emissivePower > 0) { frameDef.materialInst.SetFloat("_EmissiveColorPower", emissivePower); } if (emissiveColour != null) { frameDef.materialInst.SetColor("_EmissiveColor", (Color)emissiveColour); } frames.Add(new tk2dSpriteAnimationFrame { spriteId = frameSpriteId, spriteCollection = collection }); } if (emissivePower > 0) { sprite.renderer.material.shader = ShaderCache.Acquire("Brave/LitTk2dCustomFalloffTintableTiltedCutoutEmissive"); } if (emissivePower > 0) { sprite.renderer.material.SetFloat("_EmissiveColorPower", emissivePower); } if (emissiveColour != null) { sprite.renderer.material.SetColor("_EmissiveColor", (Color)emissiveColour); } clip.frames = frames.ToArray(); clip.wrapMode = tk2dSpriteAnimationClip.WrapMode.Once; animation.clips = animation.clips.Concat(new tk2dSpriteAnimationClip[] { clip }).ToArray(); if (!persist) { SpriteAnimatorKiller kill = animator.gameObject.AddComponent <SpriteAnimatorKiller>(); kill.fadeTime = -1f; kill.animator = animator; kill.delayDestructionTime = -1f; } animator.playAutomatically = true; animator.DefaultClipId = animator.GetClipIdByName("start"); vfObj.attached = true; vfObj.persistsOnDeath = persist; vfObj.usesZHeight = usesZHeight; vfObj.zHeight = zHeightOffset; vfObj.alignment = alignment; vfObj.destructible = false; vfObj.effect = Obj; complex.effects = new VFXObject[] { vfObj }; pool.effects = new VFXComplex[] { complex }; return(pool); }