Jump to content

Join nodes


ronnyb

Recommended Posts

HI,

I'm trying to join to separate curves by overlapping two of their end-points / end nodes, and snapping them onto of each other, then applying the Join Curves command. It appears to work, however, once I attempt to move the node, I notice AD kept both nodes and simply connected them with a line. I can see this being useful, but more useful for the type of work I do is to have the software convert those 2 nodes into one node.

 

Is this a bug or a different way to do it? If so, can you implement the method I just described?

 

Thanks guys! AD ROCKS!!!

2021 16” Macbook Pro w/ M1 Max 10c cpu /24c gpu, 32 GB RAM, 1TB SSD, macOS Sequoia 15.1

2018 11" iPad Pro w/ A12X cpu/gpu, 256 GB, iPadOS 18.1

Link to comment
Share on other sites

Hi Ronny,

don’t know what you are seeing on your machine ... Here the "join curves" command seems to create just one node (OS X Lion, latest Beta) ... Are you sure, you have really snapped the end point of the first curve onto the end point of the second one? When this is not the case, the connection between the two curves is established by a line (at least on my machine), and I would consider that behavior correct.  :unsure:

Cheers, Alex

Join.mov

Link to comment
Share on other sites

If I don't select the nodes, just maintain the entire curves as my selection, it still does the same thing... :(

2021 16” Macbook Pro w/ M1 Max 10c cpu /24c gpu, 32 GB RAM, 1TB SSD, macOS Sequoia 15.1

2018 11" iPad Pro w/ A12X cpu/gpu, 256 GB, iPadOS 18.1

Link to comment
Share on other sites

Ah, the difference between our two approaches seems to be the following:

I am using the Node Tool to snap the endpoint of the first curve onto the endpoint of the second one (see my video). That seemed naturally to me.

You are using the Move Tool to "snap" the endpoint of the first curve onto the endpoint of the second one. The Move Tool aligns (or snaps) the bounding box of the first curve to the bounding box of the second one. Now the corner point of a curves bounding box is not necessarily coincident with the endpoint of the curve that is enclosed by the bounding box. There might be a minimal mathematical difference between the respective point coordinates that is not visible but still there. In your example: snapping the lower left corner of the upper curve’s bounding box to the upper left corner of the lower curve’s bounding box might not not snap the endpoint of the upper curve to the endpoint of the lower one ... and "snap to object bounding box" seems to overrule "snap to object key points" or the like ...

I made a combined screen shot that will tell the difference ... you see that the corner points of the bounding boxes are coincident (blue arrow), while the endpoints of the curves are not (green arrow).

Well, this is how I would explain the issue myself ...  :)

Cheers, Alex

post-1198-0-66994800-1422261114_thumb.png

Link to comment
Share on other sites

Hey A_B_C,

 

Yes, I like your theory, except that the two line segments are quarter circles, meaning the end point I'm trying to join are both defining the outermost corner of the bounding box... not sure if that makes a difference.

 

I tried it using the node tool, but AD doesn't give me a roll-over to let me know when I am hovering over a node, like AI does (AI however, was still imprecise in snapping, I always had to go in to check it was REALLY snapping, grrr....) so I don't know if I'm clicking on the node or on the curve...

2021 16” Macbook Pro w/ M1 Max 10c cpu /24c gpu, 32 GB RAM, 1TB SSD, macOS Sequoia 15.1

2018 11" iPad Pro w/ A12X cpu/gpu, 256 GB, iPadOS 18.1

Link to comment
Share on other sites

Hey Ronny,

just tried to reproduce what you said (had to do some serious work in the mean time  ;)). When I create two curves, where the endpoints are by design coincident with the corner points of the respective bounding box and use the Move Tool to do the snapping (just as you did), I still get just a single point. Have a look at my video.

I still have no other theory why you get two points and a connecting line ...  :unsure:

And yeah, the missing roll-over is definitely worth a feature request ... but you can always click somewhere on the curve with the Node Tool to make all curve points visible.

Kindest regards, Alex

Curves.mov

Link to comment
Share on other sites

Hi Ronny,

wow, I can reproduce this for the first time  :o ... it must have to do with the way you created the curves (see my video).

  • (a.) Draw a quarter circl-ish path with a corner point (sharp connection) as a starting point,
  • (b.) Add a stroke width,
  • (c.) Duplicate and rotate the path,
  • (d.) Select "Scale with object" in the stroke panel,
  • (e.) Scale the path,
  • (f.) Join the two paths using the Node Tool,
  • (g.) Result: two nodes.

I do not know exactly where the trouble starts in this list, but that seems to be a bug ... 

Cheers, Alex

Ronny_is_right.mov

Link to comment
Share on other sites

Yes, I was able to reproduce the error with the Scale with Object option turned off on, and it works properly with the option unchecked.... Good sleuthing, Alex!

Edited by ronnyb

2021 16” Macbook Pro w/ M1 Max 10c cpu /24c gpu, 32 GB RAM, 1TB SSD, macOS Sequoia 15.1

2018 11" iPad Pro w/ A12X cpu/gpu, 256 GB, iPadOS 18.1

Link to comment
Share on other sites

  • 1 month later...
  • 4 months later...

Developers & Readers, go to this post for suggestions about improving the curve tools: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54441 and these two posts to see why the tools are deficient today: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54355 https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54357

 

This bug does indeed seem to related to transformation. I created two smart objects (arrows), rotated both, converted to curves, and the "join lines" tool refuses to join them. So the rotation (transformation) was probably the reason...

Link to comment
Share on other sites

Hi aitte,

just a question: in what way did you want to join the shapes you had created from converting the arrows to curves? Did you break open the closed paths you got by converting the smart objects to curves?  :unsure:

Note that you will always get closed paths by converting smart objects to curves, and the Join Curves command from the context toolbar won’t work on them. But that’s intended behavior. Join Curves does work on open paths only. You would have to use Boolean operations instead … sorry, if I misunderstood what you were doing …  :)

Cheers, Alex

Link to comment
Share on other sites

Developers & Readers, go to this post for suggestions about improving the curve tools: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54441 and these two posts to see why the tools are deficient today: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54355 https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54357

 

Hmm, I did the following:

- Create two smart object arrows.
- Rotate them.
- Right click each and Convert to Curves.
- Select both layers and boolean add, so that they were one one object with two closed shapes far apart from each other.
- I then used the node tool and "snap to node" in the toolbar, and dragged a corner of one arrow's base down to the other arrow.
- Then I selected all nodes at that spot and clicked "Join Curves".

So you're saying it refused to do it because both shapes were closed?

In that case, maybe Affinity Designer could be smart and open the shapes so that they become mere lines again. Feature suggestion: When "Join curves" detects overlapping nodes, check if there are only two locations where the objects overlap, and in that case break open the curves and join them at those locations, ignoring the fact that they *were* closed curves...

 

Also: Maybe there is a "break connection between the selected nodes" manual command where you select two nodes at the bottom of one of the arrows and break them open...

Actually, I may have seen such a command... going to check now...

Link to comment
Share on other sites

Developers & Readers, go to this post for suggestions about improving the curve tools: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54441 and these two posts to see why the tools are deficient today: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54355 https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54357

 

 

EDIT: THE BELOW "TUTORIAL" IS WRONG. Due to the broken/inconsistent tools, the result wasn't correct either!

 

Okay I found out how to do it and made a tutorial.

 

See the attached image.

post-13196-0-19804700-1440350388_thumb.png

Link to comment
Share on other sites

So you’re saying it refused to do it because both shapes were closed?

Yes, aitte, I wanted to say, that you can’t apply the Join Curves command to closed paths … but you found it out yourself, as I can see … and please rest assured, that I did not want to offend you …  :)

If I may add this … I believe that the last step in your tutorial is slightly misleading, at least if you are interested in getting a closed path after the operation. Indeed it does matter which nodes you select before applying the Join Curves command. When you create two open paths, put the loose ends on each other, and just hit Join Curves afterwards, you will end up with an open path again. Please have a look at my video below. The Join Curves command will indeed create a single object, but it does not close a path per se. Some time ago I made a video that shows a safe way to join two open paths to a closed one. If you are interested, it is still here:

https://forum.affinity.serif.com/index.php?/topic/8425-how-to-make-2-different-paths-become-one-path/?p=34571

Again, I hope this does not sound offending … cheers, Alex  :)

Join_Curves.mov

Link to comment
Share on other sites

Developers & Readers, go to this post for suggestions about improving the curve tools: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54441 and these two posts to see why the tools are deficient today: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54355 https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54357

 

 

Actually, Alex, your video turns out to be wrong too.

 

In your last step, you select two dots (nodes), click Join Curves, and then try moving the nodes. You see them move as one object. But they're actually still separate. You didn't de-select after the Join Curves and try selecting again. So you've still got *both* selected and are moving them.

 

 

Here are some of the problems I've seen with my method and your method:

 

1. The "Break Curve" tool is only meant to be used with a SINGLE node selected. (If you select multiple nodes, it acts as if only 1 of them was selected). It turns that node into 2 nodes on top of each other, that you can then move around independently if you first deselect them. So you have to select a single node, break it, deselect, select it again (to grab one of them), and then spread it apart. That is how you create an "opening" in a path.

 

2. The "Join Curves" tool joins two curve objects/layers together. It does NOT join nodes together the way you or I believed. However, it DOES merge ONE of the two seams. So only one side will still have the "split" we talk about.

 

3. To actually close the curves (the small gap we talk about), you have to first click Join Curves as above (and like I said: You do *not* have to care about what nodes are selected *at all*; it only merges the two layers!). Next, you MUST click the "Close Curve" button. And again, you do NOT have to care about what nodes are selected. It closes all open nodes to their nearest neighbor.

 

Does anyone else think Affinity Designer/Photo has really badly implemented join/break/close curves? This was definitely not obvious and this behavior took a long time to analyze and figure out...

 

You would *expect* that the commands operate on the selected nodes. But they don't. They operate on the whole selected objects/layers.

 

It's a hugely confusing and inconsistent mess...

Link to comment
Share on other sites

Developers & Readers, go to this post for suggestions about improving the curve tools: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54441

 

---

 

I made a cool screen recording to demonstrate this. You need to turn on line stroke to be able to see this clearly, since the regular blue line is too thin to really see what is going on.

 

Here's what happens in the video:

 

- Two separate Curve layers.

 

- Select a single dot/node on one of them and click "Break Curve". It turns the node into two and lets you spread them apart.

 

- Do the same for the other curve.

 

- Now turn on snapping and select both layers and drag the nodes on top of each other.

 

- Deselect all nodes. It doesn't matter if you have any nodes selected though, since Affinity doesn't care *at all*. It doesn't use your node selection. It *only* uses your layer selection. Be sure that both of your curve layers are selected.

 

Now Click "Join Curves" and it creates a single layer from them.

 

Here is the inconsistency: One of the sides is merged, the other is 2 nodes on top of each other (still broken). I demonstrate this by pulling that side apart and showing that there's no line-stroke there.

 

- Next, I *deselect all nodes* (because your selection yet again doesn't matter; I could have left them selected too!) and click the "close curve" button to make it detect the gap in the curve layer and close it. But notice how it still leaves TWO nodes/handles at that location that it closed, so I spread them apart and show that they're connected. Then I delete one and finally we're left with a closed object with zero extra nodes. I understand that it does that "extra node" because the "close curve" tool is also used when nodes are very far apart, so sometimes you want it to keep both nodes... ​But Affinity should detect when the node-gap that "Close Curve" is closing is on top of each other, and turn them into a single node.

 

It's all so fiddly... so broken... so unobvious...

 

Why does the join curves join one seam but not the other? (To be consistent, it should join *nothing* or *both*; not just one side!)

 

Why doesn't the join curves tool care about what nodes are selected?

 

Why doesn't the "close curve" tool care about what nodes are selected?

 

Why doesn't the "close curve" tool detect when nodes are snapped/perfectly overlapping and delete the duplicate when it joins them?

 

Why does the "break curve" tool break open a single node, but if I select TWO nodes it breaks ONE of them apart instead of doing the logical thing of breaking the connection between the two selected nodes?!

 

Etc etc?

 

It is so inconsistent and bad... To join two objects you need a rocket science degree in all of Affinity's quirks. ;P

Curves_Kinda_Suck.mov

Link to comment
Share on other sites

Developers & Readers, go to this post for suggestions about improving the curve tools: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54441

 

---

 

Here is another video to demonstrate what Curves does internally.

 

00:00 - I select two nodes and click "Break Curve". It doesn't break the connection between those two nodes (that would be too logical); instead, it breaks ONE of the nodes.

 

00:13 - I undo all changes to get back to the original curve objects/layers.

 

00:17 - To demonstrate what "Join Curves" does, I select both layers and click "Join Curves". Since there are no open seams in either of the objects, they cannot be merged, so they remain two layers. This is logical.

 

00:24 - I deselect both objects, then select a SINGLE node from an object and click "Break Curve" to open it up. I then split it apart to show that it has turned that node into two unjoined nodes. (And before anyone asks: If you try "Join Curves" now, it still doesn't work, since we've only opened up ONE of the objects so far.)

 

00:30 - I do the same for the other object, and break open a node and split it apart. So now we've got two curve objects/layers, with a gap in each one.

 

But instead of placing the nodes of the two objects on top of each other, I decide to let them stay separated to make the remaining steps clearer.

 

00:36 - I deselect both objects, then select both objects. I do not care what nodes I select, because the tools I am about to use don't care what nodes are selected.

 

00:39 - I click on "Join Curves". Since there are open holes in both curve objects/layers, it is able to join them. It creates a single curve object/layer, and joins *one* of the seams together. It is incapable of joining more than one seam, no matter how many open seams there are.

 

00:44 - I click on "Close Curve" so that it joins the remaining open seam. This demonstrates what I was saying earlier, about *why* it leaves two nodes even when they're on top of each other: It does that because it's not meant to be used with nodes on top of each other; it just closes any gaps in the object, but keeps all nodes intact.

 

Lots of things can be improved here.

 

Here are the main improvements that would make a *huge* difference:

 

When the "Join Curves" tool is used, make it detect nodes that have been snapped on top of each other, and merge+close such seams *first*; before even trying its own seam-closing logic. This small change will ensure that "join curves" joins snapped objects properly, while still retaining its regular "join *one* open seam" fallback logic if the objects are further apart.

 

Likewise, the "Close Curve" tool should do the exact same thing: Detect nodes on top of each other, merge them into a single node. *Then* finish off by running its own "close curve" logic to see if anything else that's further apart needs regular closing.

 

Lastly, the "Break Curve" tool must be more intelligent: If you select a single node, break it into two nodes (the way it does things today). If you select multiple nodes, then break their connections to each other.

 

These three improvements will probably be enough to fix the tools and make them actually usable.

 

PS: The "Reverse Curves" tool is very badly named. It doesn't "reverse" any actual node locations. It just semi-inverts your *selection* (but it's not even an actual inversion). So if you select two nodes, clicking the button makes Affinity select the two nodes at what it considers the "nearest opposite mirror-side of the curve". That's okay and is a very useful feature, but the button is so badly labeled that it wasn't obvious what it did. Maybe something like "Mirror Node Selection" instead? (Also: The naming standard in your buttons is "Curve" for single curve and "Curves" for tools that do something when multiple curve objects are selected. But even the "Reverse CURVES" in the button label is mislabeled; the "reverse" tool has no special effect if you select multiple curve layers/objects; it still just reverses the selection within each object that you've selected something in. So if you select 2 nodes in one of the objects and 3 nodes in the other; then the "Reverse Curves" button will select 2 nodes in the 2-node object and 3 nodes in the 3-node object. It doesn't reverse across objects. So it doesn't deserve a "Reverse CURVES" label. At best, it could be "Reverse CURVE", but even better is "Mirror Node Selection" or "Select Opposite Nodes")

 

And finally, what does "Smooth Curve" do? I tried it on all kinds of open and closed curves, sharp cornered and rounded corners, selecting one or more nodes, selecting just the whole curve objects, selecting multiple curve objects, selecting a few nodes from each object, etc, and it does nothing... Edit: It does something... If I make a more curved shape such as the "Cloud Shape" tool and convert it to curves, the "Smooth Curve" tool makes it insert a bunch of extra control points between *some* of the nodes, but not all of them. And like many other tools, it totally ignores your node selections and just acts on the entire object layer itself... This feature needs more explaining or a clearer name, and some clarification about why it only inserts extra control points at *some* of the node locations. What's it for?! ;-)

What Curves Does Internally.mov

Link to comment
Share on other sites

Hi aitte,

I believe your criticism is directed to the developers, so I am a bit at a loss to answer it. Yes, there are unobvious things, and you did a great job of pointing them out. Wow, you have indeed be very thoughtful about the details of the process, and I have learned a lot from your discussion. In my post

https://forum.affinity.serif.com/index.php?/topic/8425-how-to-make-2-different-paths-become-one-path/?p=34571

I outlined how I believe that joining two open paths to a closed curve should work savely. I made a short video and an illustration to demonstrate this method for your pentagons … hope you don’t mind if I post it here … 

In addition let me tell you what is confusing to me: when you have a single open path, you can close it as indicated in my illustration either by using Join Curves (5a.) or by Close Curve (5b.), even if I would think of at least two curves when I hear “join these curves” and not a single one … so (5a.) is slightly confusing to me … nevertheless it works (apart from the bug reported by Ronny in the present thread, to be sure) …

Cheers, Alex  :)

Save_Method.mov

post-1198-0-77464200-1440403128_thumb.png

Link to comment
Share on other sites

Developers & Readers, go to this post for suggestions about improving the curve tools: https://forum.affinity.serif.com/index.php?/topic/4274-join-nodes/?p=54441

 

---

 

Hey Alex. Hehe, of course I am talking to the developers.

 

And yes, you found yet another quirk! So the "Join CURVES" function (the "S" stands for multiple objects since it operates across multiple layers), actually also works on a single layer/single curve.

 

The quirks just keep on showing up... Wow...

 

I hope the talented developers read this whole thread and then go through these functions and make them behave more cleanly, more logically and more consistently.  ;)

 

Their behavior is somewhat okay when just using a single layer. It's when merging multiple layers that things go weird.

Link to comment
Share on other sites

To summarize all of this analysis, here is my suggestion for improving all of the node/curve tools and making them more consistent, more logical, more powerful, and easier to work with.

 

First of all, we need to clear something up for the reader:

 

Node = The dots/control points on a curve.

Curve = The line/shape caused by several connected nodes. Can be closed (all the nodes connect to each other so that it's a closed shape), or open (there's one or more disconnected nodes, which leaves a gap in the shape).

Layer = A single layer can contain one or more independent curves. Usually there's only one curve per layer, but there can be more in certain cases, such as when you've used "Boolean Add" to join two layers into one layer.

 

I have highlighted all three words below, to make it clearer.

 

 

Alright, let's begin! This will perhaps be a bit wordy/techy, since I am mainly talking to the developers here.

 

Old name : New Name = New Function

 

* Break Curve : Split Node(s) =

-- If 1 node is selected, split it into two disconnected parts.

-- If 2 nodes are selected (on the same curve), disconnect them from each other (new behavior).

-- If 3+ nodes are selected (on the same curve), do nothing (new behavior). Pop up a warning box saying something like "too many nodes selected on a curve, can't figure out which ones you want to disconnect from each other". ;-)

-- Important: If you have multiple curves selected, you are allowed to select 1 or 2 nodes from each curve and it'll split them independently. That way you can independently select 1 or 2 points on a bunch of different curves, and split all those nodes on those curves independently with a single click of the button.

 

* Close Curve : Close Curve =

-- Look at the whole curve and detect any *disconnected* nodes that are snapped on top of each other, and merge those into a single node (new behavior).

-- *Then* finish off by running its own "close curve" logic to see if any other disconnected nodes further apart needs regular closing (by connecting those nodes to each other with a line).

-- Note: The fact that it only operates on disconnected nodes (ones with at least 1 disconnected handle) means it won't inadvertently merge *connected* nodes stacked on top of each other on valid lines. That's intentional, to avoid messing up your drawing.

-- Important: If you have multiple curves selected, it will *independently* apply this "close curve" process to all of them, as if you had manually selected them one by one and used the command multiple times.

 

* Smooth Curve : ??? = Its behavior is too inconsistent (described in another post above) to know what a good name would be. I'm sure it's *intended* to insert more nodes in a curve to make it smoother, but it doesn't work properly. Try it on the "Cloud" smart shape and you'll see what I mean... it only inserts extra nodes on a few of the cloud "arms", instead of all of them...

 

* Join Curves : Unite Nodes (alternatively: Unite Two Nodes) = (All of the below is new behavior)

-- If no nodes are selected, do nothing.

-- If two curves are selected but *no nodes* are selected, do nothing.

-- You must select *exactly two* nodes (no more, no less). Both of the nodes you select must *both* follow *one* of these sets of criteria:

--- Uniting Criteria A: Both nodes must be disconnected on at least one side (such as the endpoint of an unfinished curve/line, or something disconnected via "Split Node(s)"). The two nodes you select can either be on the two different curves, or on the same curve. <-- This is the criteria you would use to merge/join two separate curves/layers *or* two disconnected endpoints on a single curve.

--- Uniting Criteria B: Both nodes must already be connected *to each other*. <-- This is the criteria you would use to merge superfluous nodes and reduce shape complexity; more on that below.

-- If the node selection is invalid for any of the reasons above, then pop up a warning box briefly explaining to the user how to use the function; the fact that they must select two disconnected nodes *or* two directly-connected nodes is the key part.

=== In Use/Behavior Combinations: ===

-- Criteria A, Two Layers: You must explicitly select both curves (they can be on different layers), select *one* valid *disconnected* node on *each* curve, and hit "Unite Nodes". It will then merge the two curves into a single curve (and in case the curves came from two different layers, they'll be merged into a single layer), and then it checks if the two selected nodes are snapped on top of each other. In that case, it merges those "stacked" nodes into a single node. Otherwise, it just connects the two selected nodes with a line.

-- Criteria A, Single Layer: You must select two valid *disconnected* nodes on a single curve. If the two nodes you selected are snapped on top of each other, it merges them into a single node. Otherwise, it connects the two selected nodes with a line. <-- This behavior is nearly identical to the automatic "Close Curve" function described above, except that *you* manually control which nodes you want it to join.

-- Criteria B, Single Layer: You must select two valid *connected* nodes on a single curve; the nodes must be directly connected to each other. If the two nodes you selected are snapped on top of each other, it merges them into a single node. Otherwise, it deletes the two nodes and replaces them with a *single* node at the *midpoint* of the line *between* where the two nodes used to sit. This basically "reduces the complexity" of the curve at that location, by replacing two points with a single point. It will often result in the shape changing slightly since a single node can't do all the shapes that two nodes could do, but that's intentional. The user wanted to unite two connected nodes, and they got that feature now! ;-)

 

* Reverse Curves : Select Opposite Nodes =

-- Looks at your current selection and number of selected nodes, and selects the same amount of nodes at what it considers the "nearest opposite mirror-side of that particular curve". (Old behavior; just a much, much, much clearer function name).

-- You can select nodes from different curves, and it'll mirror the selection independently inside of each curve. So a curve with 2 selected nodes and one with 3 selected nodes will remain a 2 and a 3, respectively. It just mirrors the selection within each, and doesn't mirror *across* objects.

 

 

Affinity and these curve tools are very young right now, but over time they'll get more and more difficult to change. So this is the right time to improve the tools. Otherwise we'll be stuck...

 

Furthermore; my suggestions behave relatively similarly to the originals, but just improved with extra control, consistency and features, so hopefully the developers are open to considering these improvements.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...

Important Information

Terms of Use | Privacy Policy | Guidelines | We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.