mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2026-03-05 02:06:53 +08:00
[as3] Ported skin API changes, see #841.
This commit is contained in:
parent
eff7a1502d
commit
07cf3f1f2c
Binary file not shown.
@ -238,7 +238,7 @@ package spine {
|
|||||||
for (var attachmentName : String in slotEntry) {
|
for (var attachmentName : String in slotEntry) {
|
||||||
var attachment : Attachment = readAttachment(slotEntry[attachmentName], skin, slotIndex, attachmentName, skeletonData);
|
var attachment : Attachment = readAttachment(slotEntry[attachmentName], skin, slotIndex, attachmentName, skeletonData);
|
||||||
if (attachment != null)
|
if (attachment != null)
|
||||||
skin.addAttachment(slotIndex, attachmentName, attachment);
|
skin.setAttachment(slotIndex, attachmentName, attachment);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
skeletonData.skins[skeletonData.skins.length] = skin;
|
skeletonData.skins[skeletonData.skins.length] = skin;
|
||||||
|
|||||||
@ -28,6 +28,7 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
package spine {
|
package spine {
|
||||||
|
import spine.attachments.MeshAttachment;
|
||||||
import flash.utils.Dictionary;
|
import flash.utils.Dictionary;
|
||||||
|
|
||||||
import spine.attachments.Attachment;
|
import spine.attachments.Attachment;
|
||||||
@ -36,6 +37,8 @@ package spine {
|
|||||||
public class Skin {
|
public class Skin {
|
||||||
internal var _name : String;
|
internal var _name : String;
|
||||||
private var _attachments : Vector.<Dictionary> = new Vector.<Dictionary>();
|
private var _attachments : Vector.<Dictionary> = new Vector.<Dictionary>();
|
||||||
|
private var _bones: Vector.<BoneData> = new Vector.<BoneData>();
|
||||||
|
private var _constraints: Vector.<Constraint> = new Vector.<Constraint>();
|
||||||
|
|
||||||
public function Skin(name : String) {
|
public function Skin(name : String) {
|
||||||
if (name == null) throw new ArgumentError("name cannot be null.");
|
if (name == null) throw new ArgumentError("name cannot be null.");
|
||||||
@ -44,21 +47,149 @@ package spine {
|
|||||||
|
|
||||||
public function setAttachment(slotIndex : int, name : String, attachment : Attachment) : void {
|
public function setAttachment(slotIndex : int, name : String, attachment : Attachment) : void {
|
||||||
if (attachment == null) throw new ArgumentError("attachment cannot be null.");
|
if (attachment == null) throw new ArgumentError("attachment cannot be null.");
|
||||||
if (slotIndex >= attachments.length) attachments.length = slotIndex + 1;
|
if (slotIndex >= _attachments.length) _attachments.length = slotIndex + 1;
|
||||||
if (!attachments[slotIndex]) attachments[slotIndex] = new Dictionary();
|
if (!_attachments[slotIndex]) _attachments[slotIndex] = new Dictionary();
|
||||||
attachments[slotIndex][name] = attachment;
|
_attachments[slotIndex][name] = attachment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function addSkin (skin: Skin) : void {
|
||||||
|
var i : Number = 0, j : Number = 0;
|
||||||
|
var contained : Boolean = false;
|
||||||
|
|
||||||
|
for(i = 0; i < skin._bones.length; i++) {
|
||||||
|
var bone : BoneData = skin._bones[i];
|
||||||
|
contained = false;
|
||||||
|
for (j = 0; j < _bones.length; j++) {
|
||||||
|
if (_bones[j] == bone) {
|
||||||
|
contained = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!contained) _bones.push(bone);
|
||||||
|
}
|
||||||
|
|
||||||
/** @return May be null. */
|
for(i = 0; i < skin._constraints.length; i++) {
|
||||||
|
var constraint : Constraint = skin._constraints[i];
|
||||||
|
contained = false;
|
||||||
|
for (j = 0; j < this._constraints.length; j++) {
|
||||||
|
if (_constraints[j] == constraint) {
|
||||||
|
contained = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!contained) _constraints.push(constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
var attachments : Vector.<SkinEntry> = skin.getAttachments();
|
||||||
|
for (i = 0; i < attachments.length; i++) {
|
||||||
|
var attachment : SkinEntry = attachments[i];
|
||||||
|
setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function copySkin (skin: Skin) : void {
|
||||||
|
var i : Number = 0, j : Number = 0;
|
||||||
|
var contained : Boolean = false;
|
||||||
|
var attachment : SkinEntry;
|
||||||
|
|
||||||
|
for(i = 0; i < skin._bones.length; i++) {
|
||||||
|
var bone : BoneData = skin._bones[i];
|
||||||
|
contained = false;
|
||||||
|
for (j = 0; j < _bones.length; j++) {
|
||||||
|
if (_bones[j] == bone) {
|
||||||
|
contained = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!contained) _bones.push(bone);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(i = 0; i < skin._constraints.length; i++) {
|
||||||
|
var constraint : Constraint = skin._constraints[i];
|
||||||
|
contained = false;
|
||||||
|
for (j = 0; j < this._constraints.length; j++) {
|
||||||
|
if (_constraints[j] == constraint) {
|
||||||
|
contained = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!contained) _constraints.push(constraint);
|
||||||
|
}
|
||||||
|
|
||||||
|
var attachments : Vector.<SkinEntry> = skin.getAttachments();
|
||||||
|
for (i = 0; i < attachments.length; i++) {
|
||||||
|
attachment = attachments[i];
|
||||||
|
attachment.attachment = attachment.attachment.copy();
|
||||||
|
setAttachment(attachment.slotIndex, attachment.name, attachment.attachment);
|
||||||
|
}
|
||||||
|
|
||||||
|
attachments = this.getAttachments();
|
||||||
|
for (i = 0; i < attachments.length; i++) {
|
||||||
|
attachment = attachments[i];
|
||||||
|
if (attachment.attachment instanceof MeshAttachment) {
|
||||||
|
var mesh : MeshAttachment = attachment.attachment as MeshAttachment;
|
||||||
|
if (mesh.parentMesh) {
|
||||||
|
mesh.parentMesh = this.getAttachment(attachment.slotIndex, mesh.parentMesh.name) as MeshAttachment;
|
||||||
|
mesh.updateUVs();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public function getAttachment(slotIndex : int, name : String) : Attachment {
|
public function getAttachment(slotIndex : int, name : String) : Attachment {
|
||||||
if (slotIndex >= attachments.length) return null;
|
if (slotIndex >= _attachments.length) return null;
|
||||||
var dictionary : Dictionary = attachments[slotIndex];
|
var dictionary : Dictionary = _attachments[slotIndex];
|
||||||
return dictionary ? dictionary[name] : null;
|
return dictionary ? dictionary[name] : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function removeAttachment (slotIndex : Number, name : String) : void {
|
||||||
|
var dictionary : Dictionary = _attachments[slotIndex];
|
||||||
|
if (dictionary) dictionary[name] = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAttachments() : Vector.<SkinEntry> {
|
||||||
|
var entries : Vector.<SkinEntry> = new Vector.<SkinEntry>();
|
||||||
|
for (var slotIndex : int = 0; slotIndex < _attachments.length; slotIndex++) {
|
||||||
|
var attachments : Dictionary = _attachments[slotIndex];
|
||||||
|
if (attachments) {
|
||||||
|
for (var name : String in attachments) {
|
||||||
|
var attachment : Attachment = attachments[name];
|
||||||
|
if (attachment) entries.push(new SkinEntry(slotIndex, name, attachment));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getAttachmentsForSlot(slotIndex: int) : Vector.<SkinEntry> {
|
||||||
|
var entries : Vector.<SkinEntry> = new Vector.<SkinEntry>();
|
||||||
|
var attachments : Dictionary = _attachments[slotIndex];
|
||||||
|
if (attachments) {
|
||||||
|
for (var name : String in attachments) {
|
||||||
|
var attachment : Attachment = attachments[name];
|
||||||
|
if (attachment) entries.push(new SkinEntry(slotIndex, name, attachment));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return entries;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function clear () : void {
|
||||||
|
_attachments.length = 0;
|
||||||
|
_bones.length = 0;
|
||||||
|
_constraints.length = 0;
|
||||||
|
}
|
||||||
|
|
||||||
public function get attachments() : Vector.<Dictionary> {
|
public function get attachments() : Vector.<Dictionary> {
|
||||||
return _attachments;
|
return _attachments;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function get bones() : Vector.<BoneData> {
|
||||||
|
return _bones;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function get constraints() : Vector.<Constraint> {
|
||||||
|
return _constraints;
|
||||||
|
}
|
||||||
|
|
||||||
public function get name() : String {
|
public function get name() : String {
|
||||||
return _name;
|
return _name;
|
||||||
@ -73,8 +204,8 @@ package spine {
|
|||||||
var slotIndex : int = 0;
|
var slotIndex : int = 0;
|
||||||
for each (var slot : Slot in skeleton.slots) {
|
for each (var slot : Slot in skeleton.slots) {
|
||||||
var slotAttachment : Attachment = slot.attachment;
|
var slotAttachment : Attachment = slot.attachment;
|
||||||
if (slotAttachment && slotIndex < oldSkin.attachments.length) {
|
if (slotAttachment && slotIndex < oldSkin._attachments.length) {
|
||||||
var dictionary : Dictionary = oldSkin.attachments[slotIndex];
|
var dictionary : Dictionary = oldSkin._attachments[slotIndex];
|
||||||
for (var name : String in dictionary) {
|
for (var name : String in dictionary) {
|
||||||
var skinAttachment : Attachment = dictionary[name];
|
var skinAttachment : Attachment = dictionary[name];
|
||||||
if (slotAttachment == skinAttachment) {
|
if (slotAttachment == skinAttachment) {
|
||||||
@ -87,5 +218,5 @@ package spine {
|
|||||||
slotIndex++;
|
slotIndex++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
15
spine-as3/spine-as3/src/spine/SkinEntry.as
Normal file
15
spine-as3/spine-as3/src/spine/SkinEntry.as
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
package spine {
|
||||||
|
import spine.attachments.Attachment;
|
||||||
|
|
||||||
|
public class SkinEntry {
|
||||||
|
public var slotIndex : int;
|
||||||
|
public var name : String;
|
||||||
|
public var attachment : Attachment;
|
||||||
|
|
||||||
|
public function SkinEntry(slotIndex : int, name: String, attachment: Attachment) {
|
||||||
|
this.slotIndex = slotIndex;
|
||||||
|
this.name = name;
|
||||||
|
this.attachment = attachment;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@ -28,6 +28,7 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
package spine.attachments {
|
package spine.attachments {
|
||||||
|
import flash.errors.IllegalOperationError;
|
||||||
public class Attachment {
|
public class Attachment {
|
||||||
internal var _name : String;
|
internal var _name : String;
|
||||||
|
|
||||||
@ -44,5 +45,9 @@ package spine.attachments {
|
|||||||
public function toString() : String {
|
public function toString() : String {
|
||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public function copy() : Attachment {
|
||||||
|
throw new IllegalOperationError("Not implemented");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,5 +32,11 @@ package spine.attachments {
|
|||||||
public function BoundingBoxAttachment(name : String) {
|
public function BoundingBoxAttachment(name : String) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override public function copy (): Attachment {
|
||||||
|
var copy : BoundingBoxAttachment = new BoundingBoxAttachment(name);
|
||||||
|
copyTo(copy);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -38,5 +38,13 @@ package spine.attachments {
|
|||||||
public function ClippingAttachment(name : String) {
|
public function ClippingAttachment(name : String) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override public function copy (): Attachment {
|
||||||
|
var copy : ClippingAttachment = new ClippingAttachment(name);
|
||||||
|
copyTo(copy);
|
||||||
|
copy.endSlot = endSlot;
|
||||||
|
copy.color.setFromColor(color);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -121,34 +121,6 @@ package spine.attachments {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*var i : int, n : int = regionUVs.length;
|
|
||||||
var u: Number, v: Number, width: Number, height: Number;
|
|
||||||
var textureWidth: Number, textureHeight: Number;
|
|
||||||
if (!uvs || uvs.length != n) uvs = new Vector.<Number>(n, true);
|
|
||||||
if (regionRotate) {
|
|
||||||
textureHeight = regionWidth / (regionV2 - regionV);
|
|
||||||
textureWidth = regionHeight / (regionU2 - regionU);
|
|
||||||
u = regionU - (regionOriginalHeight - regionOffsetY - regionHeight) / textureWidth;
|
|
||||||
v = regionV - (regionOriginalWidth - regionOffsetX - regionWidth) / textureHeight;
|
|
||||||
width = regionOriginalHeight / textureWidth;
|
|
||||||
height = regionOriginalWidth / textureHeight;
|
|
||||||
for (i = 0; i < n; i += 2) {
|
|
||||||
uvs[i] = u + regionUVs[int(i + 1)] * width;
|
|
||||||
uvs[int(i + 1)] = v + height - regionUVs[i] * height;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
textureWidth = regionWidth / (regionU2 - regionU);
|
|
||||||
textureHeight = regionHeight / (regionV2 - regionV);
|
|
||||||
u = regionU - regionOffsetX / textureWidth;
|
|
||||||
v = regionV - (regionOriginalHeight - regionOffsetY - regionHeight) / textureHeight;
|
|
||||||
width = regionOriginalWidth / textureWidth;
|
|
||||||
height = regionOriginalHeight / textureHeight;
|
|
||||||
for (i = 0; i < n; i += 2) {
|
|
||||||
uvs[i] = u + regionUVs[i] * width;
|
|
||||||
uvs[int(i + 1)] = v + regionUVs[int(i + 1)] * height;
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override public function applyDeform(sourceAttachment : VertexAttachment) : Boolean {
|
override public function applyDeform(sourceAttachment : VertexAttachment) : Boolean {
|
||||||
@ -172,6 +144,46 @@ package spine.attachments {
|
|||||||
width = parentMesh.width;
|
width = parentMesh.width;
|
||||||
height = parentMesh.height;
|
height = parentMesh.height;
|
||||||
}
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
override public function copy (): Attachment {
|
||||||
|
var copy : MeshAttachment = new MeshAttachment(name);
|
||||||
|
copy.rendererObject = rendererObject;
|
||||||
|
copy.regionU = regionU;
|
||||||
|
copy.regionV = regionV;
|
||||||
|
copy.regionU2 = regionU2;
|
||||||
|
copy.regionV2 = regionV2;
|
||||||
|
copy.regionRotate = regionRotate;
|
||||||
|
copy.regionDegrees = regionDegrees;
|
||||||
|
copy.regionOffsetX = regionOffsetX;
|
||||||
|
copy.regionOffsetY = regionOffsetY;
|
||||||
|
copy.regionWidth = regionWidth;
|
||||||
|
copy.regionHeight = regionHeight;
|
||||||
|
copy.regionOriginalWidth = regionOriginalWidth;
|
||||||
|
copy.regionOriginalHeight = regionOriginalHeight;
|
||||||
|
copy.path = path;
|
||||||
|
|
||||||
|
if (parentMesh == null) {
|
||||||
|
this.copyTo(copy);
|
||||||
|
copy.regionUVs = regionUVs.concat();
|
||||||
|
copy.uvs = uvs.concat();
|
||||||
|
copy.triangles = triangles.concat();
|
||||||
|
copy.color.setFromColor(color);
|
||||||
|
copy.hullLength = hullLength;
|
||||||
|
|
||||||
|
copy.inheritDeform = inheritDeform;
|
||||||
|
|
||||||
|
// Nonessential.
|
||||||
|
if (edges != null)
|
||||||
|
copy.edges = edges.concat();
|
||||||
|
copy.width = width;
|
||||||
|
copy.height = height;
|
||||||
|
} else {
|
||||||
|
copy.parentMesh = parentMesh;
|
||||||
|
copy.updateUVs();
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,5 +35,14 @@ package spine.attachments {
|
|||||||
public function PathAttachment(name : String) {
|
public function PathAttachment(name : String) {
|
||||||
super(name);
|
super(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override public function copy (): Attachment {
|
||||||
|
var copy : PathAttachment = new PathAttachment(name);
|
||||||
|
copyTo(copy);
|
||||||
|
copy.lengths = lengths.concat();
|
||||||
|
copy.closed = closed;
|
||||||
|
copy.constantSpeed = constantSpeed;
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -52,5 +52,14 @@ package spine.attachments {
|
|||||||
var y : Number = cos * bone.c + sin * bone.d;
|
var y : Number = cos * bone.c + sin * bone.d;
|
||||||
return Math.atan2(y, x) * MathUtils.radDeg;
|
return Math.atan2(y, x) * MathUtils.radDeg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override public function copy (): Attachment {
|
||||||
|
var copy : PointAttachment = new PointAttachment(name);
|
||||||
|
copy.x = x;
|
||||||
|
copy.y = y;
|
||||||
|
copy.rotation = rotation;
|
||||||
|
copy.color.setFromColor(color);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -145,5 +145,28 @@ package spine.attachments {
|
|||||||
worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
|
worldVertices[offset] = offsetX * a + offsetY * b + x; // ur
|
||||||
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
|
worldVertices[offset + 1] = offsetX * c + offsetY * d + y;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override public function copy (): Attachment {
|
||||||
|
var copy : RegionAttachment = new RegionAttachment(name);
|
||||||
|
copy.regionWidth = regionWidth;
|
||||||
|
copy.regionHeight = regionHeight;
|
||||||
|
copy.regionOffsetX = regionOffsetX;
|
||||||
|
copy.regionOffsetY = regionOffsetY;
|
||||||
|
copy.regionOriginalWidth = regionOriginalWidth;
|
||||||
|
copy.regionOriginalHeight = regionOriginalHeight;
|
||||||
|
copy.rendererObject = rendererObject;
|
||||||
|
copy.path = path;
|
||||||
|
copy.x = x;
|
||||||
|
copy.y = y;
|
||||||
|
copy.scaleX = scaleX;
|
||||||
|
copy.scaleY = scaleY;
|
||||||
|
copy.rotation = rotation;
|
||||||
|
copy.width = width;
|
||||||
|
copy.height = height;
|
||||||
|
copy.uvs = uvs.concat();
|
||||||
|
copy.offset = offset.concat();
|
||||||
|
copy.color.setFromColor(color);
|
||||||
|
return copy;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -129,5 +129,19 @@ package spine.attachments {
|
|||||||
public function applyDeform(sourceAttachment : VertexAttachment) : Boolean {
|
public function applyDeform(sourceAttachment : VertexAttachment) : Boolean {
|
||||||
return this == sourceAttachment;
|
return this == sourceAttachment;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function copyTo(attachment : VertexAttachment) : void {
|
||||||
|
if (bones != null) {
|
||||||
|
attachment.bones = bones.concat();
|
||||||
|
} else
|
||||||
|
attachment.bones = null;
|
||||||
|
|
||||||
|
if (this.vertices != null) {
|
||||||
|
attachment.vertices = vertices.concat();
|
||||||
|
} else
|
||||||
|
attachment.vertices = null;
|
||||||
|
|
||||||
|
attachment.worldVerticesLength = worldVerticesLength;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Binary file not shown.
@ -28,6 +28,7 @@
|
|||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
package spine.examples {
|
package spine.examples {
|
||||||
|
import spine.Skin;
|
||||||
import spine.animation.MixBlend;
|
import spine.animation.MixBlend;
|
||||||
import spine.animation.TrackEntry;
|
import spine.animation.TrackEntry;
|
||||||
import starling.display.DisplayObjectContainer;
|
import starling.display.DisplayObjectContainer;
|
||||||
@ -88,6 +89,11 @@ package spine.examples {
|
|||||||
skeleton.state.update(0.25);
|
skeleton.state.update(0.25);
|
||||||
skeleton.state.apply(skeleton.skeleton);
|
skeleton.state.apply(skeleton.skeleton);
|
||||||
skeleton.skeleton.updateWorldTransform();
|
skeleton.skeleton.updateWorldTransform();
|
||||||
|
|
||||||
|
var skin : Skin = new Skin("test");
|
||||||
|
skin.addSkin(skeletonData.findSkin("default"));
|
||||||
|
skeleton.skeleton.skin = skin;
|
||||||
|
skeleton.skeleton.setToSetupPose();
|
||||||
|
|
||||||
addChild(skeleton);
|
addChild(skeleton);
|
||||||
Starling.juggler.add(skeleton);
|
Starling.juggler.add(skeleton);
|
||||||
|
|||||||
Binary file not shown.
Loading…
x
Reference in New Issue
Block a user