Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.
  2. Dismiss Notice

Simulating electric circuits?

Discussion in 'Scripting' started by BlackArcane, Dec 13, 2012.

  1. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Hello fellow programmers! I need to somehow simulate electrical circuits in the sense of having a source, then a line of cylindrical objects and then the output. This sounds pretty simple, but what if I want the line to split to two parts and have two outputs? And what if I want to incorporate logic gates? I am looking for something like Minecraft's redstone, but in 2D. Any help appreciated! Thanks in advance! :)
     
  2. lockbox

    lockbox

    Joined:
    Feb 10, 2012
    Posts:
    519
  3. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Was that sarcastic? I hope not because you probably didn't understand what I am asking, or the most probable of all, I didn't express myself right. English is not my primary language, and I run into trouble sometimes. Let me rephrase my question. How can I convey signal (on or off) from an object to neighbour objects? I know how circuits work, I just don't know how to replicate them.
     
  4. lockbox

    lockbox

    Joined:
    Feb 10, 2012
    Posts:
    519
    I wasn't being sarcastic. I misunderstood you. Sorry, about that.
     
  5. BrUnO-XaVIeR

    BrUnO-XaVIeR

    Joined:
    Dec 6, 2010
    Posts:
    1,687
    Sending bools from each other?!
     
  6. TylerPerry

    TylerPerry

    Joined:
    May 29, 2011
    Posts:
    5,577
    Good question, I hope it gets answered :D
     
  7. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Cool, but how can I see which objects are next to the current object? I'd prefer an array of GameObjects so I could access their components and change their variables.
     
  8. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Never mind :) Thanks for your answer anyway!
     
  9. arkon

    arkon

    Joined:
    Jun 27, 2011
    Posts:
    1,122
    Create a script that you add to each object with a function to receive a broadcast from other objects. Pass the bool to any object using broadcast.
     
  10. TylerPerry

    TylerPerry

    Joined:
    May 29, 2011
    Posts:
    5,577
    Maybe you could raycast on all sides then add the hit objects to a array of items to edit? I know it would be bad performance wise but you only have to do this when you place a new part of the circuit so it shouldn't be to bad... there is probably a better way.
     
  11. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Cool stuff, but it still seems too "messy" to do it that way? It's more of a chain reaction effect. It'd be a lot easier if I had a grid, and checked the positions adjacent to the object on the grid, but I can't figure out how to do that :(
     
  12. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    What's a broadcast? Is it a Unity function? Could you provide some sample code? I just realized "Reply" doesn't quote the post. LOL This is a reply to arkon.
     
  13. wccrawford

    wccrawford

    Joined:
    Sep 30, 2011
    Posts:
    2,039
    Minecraft's redstone is simplified from a real circuit because of the time it takes for the signal to travel down the paths. Real circuits work *much* faster, and so simulating them is hard.

    If you want to do it MC's way, then it's as simple as mapping out the circuits in data, and then making a display that shows them. You could make 2D blocks a la MC, I guess, but I think it'd be a lot easier to handle everything on the backend and then just show the result.
     
  14. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Thanks, this gave me an idea which I"ll try once I get home. How do you think I can "map" the circuit in memory? Like having a "grid" of places in a multidimensional array and checking for the neighbour tiles to contain something? I'd still have to have a grid like implementation for the graphics as well, right?
     
  15. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    A very simple way to approach it is probably to have a "circuit block" base class that contains a Value field that represents the state of the block, and has some methods that allow the block to execute an "on" state action and an and "off" state action. That will fulfill the basic requirements of most digital circuits. It might look something like this...

    I've written this code off the cuff and is untested and may contain errors.

    Code (csharp):
    1.  
    2. public class CircuitBlock : Monobehavior {
    3.     public float Value; // Set the initial value in the inspector
    4.     public List<CircuitBlock> InputBlocks; // Set the inputs in the inspector
    5.    
    6.     private void Start() {
    7.         Init();
    8.     }
    9.     private void Update() {
    10.         if (IsSwitchedOn())
    11.             OnAction();
    12.         else
    13.             OffAction();
    14.     }
    15.    
    16.     public virtual void Init() { }
    17.     public virtual bool IsSwitchedOn( return false; }
    18.     public virtual void OnAction() { }
    19.     public virtual void OffAction() { }
    20. }
    21.  
    Then you can code more specific blocks, such as light switches, timers, wires, resistors, capacitors, etc. Here's how a simple lightbulb block might be coded...

    Code (csharp):
    1.  
    2. public class LightbulbBlock : CircuitBlock {
    3.     // set these values in the inspector
    4.     public GameObject LightOn; // the object that represents the lightbulb turned on
    5.     public GameObject LightOff; // the object that represents the lightbulb turned off
    6.  
    7.     public override void Init() {
    8.         // the light will initially be turned off
    9.         LightOn.renderer.enabled = false;
    10.         LightOff.renderer.enabled = true;
    11.         Value = 0;
    12.     }
    13.  
    14.     public override bool IsSwichedOn() {
    15.         // the light will only turn on if all inputs are greater than 0
    16.         foreach(CircuitBlock input in InputBlocks)
    17.             if (input.Value <= 0)
    18.                 return false;
    19.  
    20.          return true;
    21.     }
    22.  
    23.     public override void OnAction() {
    24.         if (LightOn.renderer.enabled == false) {
    25.             LightOn.renderer.enabled = true;
    26.             LightOff.renderer.enabled = false;
    27.             Value = 1;
    28.          }
    29.     }
    30.    
    31.     public override void OffAction() {
    32.         if (LightOff.renderer.enabled == false) {
    33.             LightOn.renderer.enabled = false;
    34.             LightOff.renderer.enabled = true;
    35.             Value = 0;
    36.         }
    37.     }
    38. }
    39.  
    This should work somewhat like Minecraft's system, as best as I understand it from videos I've seen (I've never played Minecraft). Of course, this isn't how a real electrical circuit works, but it should work well enough to simulate very simple digital circuits.
     
    Last edited: Dec 14, 2012
  16. wccrawford

    wccrawford

    Joined:
    Sep 30, 2011
    Posts:
    2,039
    That good, but I think the question is how to handle the current.

    I would have a reference for each connection to the item. A lightbulb would have 2 connections. And depending on the lightbulb, maybe it only works when current comes from 1 direction and leaves the other.

    MC way: Power is turned on. Send a signal to the first node/block/whatever. On each cycle, each node sends a signal to the next node about whether or not there's power flowing. The signals continue to flow each cycle even after the power is cut, until they all reach the end.

    More realistic way: Power is turned on. A signal is sent to the first node, which immediately passes it to the next node, and so on until it reaches the end. Every cycle sees the power flow through the whole system. It stops functioning immediately when the power is cut.

    Edit: Oddly enough, I actually plan to write a game that relies on current, so I've spent a little time thinking about this already, but haven't actually implemented anything yet.
     
  17. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    You don't need to handle current, only voltage and resistance. Current comes along for the ride. Recall Ohm's law:
    V = IR

    To simulate a digital circuit you don't actually need any electrical quantities. All you really need an ambiguous "signal". You can use that signal any way that you want.

    That's what my example above basically does. In fact it isn't even simulating a circuit in the strictest sense. For one, there's no loop requirement. Secondly, there's no requirement to drop from high potential to low potential. All it does is propagate an ambiguous signal from block to block in one direction.
     
  18. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    That's very helpful, though I still don't have a way of conveying the signal across from the input, through a set of wires that may or may not split, to the output.
     
  19. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Guys I probably exaggerated a bit when I said "simulation". I don't need to handle voltage or resistance. Just convey electricity though wires, from the input to the output. No actual "simulation". Any way to do that?

    EDIT: Here's a sketch:

    IN----OUT

    IN is the input and is a GameObject

    ----- are wire parts, all GameObjects

    OUT is the output, a GameObject as well

    I want to have electricity going through the wire parts, starting from the input and reaching the output.
    But I'd like to be able to do this as well:
    ^^^^|------OUT
    IN--|
    ^^^^|------OUT

    But I want the electricity to go through both routes. How can I achieve this? Thanks in advance and thank you all for your kindness! :)

    P.S. Ignore the ^'s I just put them there because my text got messed up otherwise...
     
    Last edited: Dec 14, 2012
  20. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    Outputs are not actually necessary, the only thing you need is the input list. If you want two blocks A and B to reference each other such that A is essentially the output for B and B is essnetially the output for A, then simply add A to B's input list and add B to A's input list...

    A.InputBlocks.Add(B);
    B.InputBlocks.Add(A);

    That creates a circuit...
    A ---> B ---> A

    And the nice thing with Unity is that you don't even need to write this code. Just use the inspector panel in the Unity editor. Drag and drop the game objects that include a CircuitBlock component into the desired InputBlock list in the inspector panel.

    Code (csharp):
    1.  
    2.         |------OUT (B)
    3. (A) IN--|
    4.         |------OUT (C)
    5.  
    B.InputBlocks.Add(A);
    C.InputBlocks.Add(A);

    Or set up the references in the inspector. Simple as that.
     
    Last edited: Dec 14, 2012
  21. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    I feel stupid right now... LOL Thanks a lot man! I just realized there's no point in following the line, just knowing the start and the end of it. You rock, many (not homosexual) kissed from Greece! :)
     
  22. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Hey all. I tried implementing this my way because I need the user to be able to place circuit blocks whenever he wants, wherever he wants. But it ended up in a failure :( How could I implement a "designer" in Brian Stone's system?
     
  23. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    I'm not sure what you mean by "designer". Do you mean an in-game editor? That's considerably more work than I can do for you right now. What I've laid out is only a basic algorithm for the simplest of simple circuit simulation ideas, it's up to you to figure out how to implement it.

    Later tonight, since it's the weekend and I've got nothing else to do, I can throw together a simple demo project and post it to this thread. It will contain a few basic examples of different component blocks and some simple logic circuits... assuming it works as I predict.
     
  24. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    An in game editor in the sense of placing a GO in the circuit, that's all. I just do not know how can I set it up to work. Thanks a lot for your patience. I can wait, I am not in a rush. If/when you find time and make the demo notify me :) Thanks in advance!
     
  25. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    In this project I've created the basic idea that I was trying to describe earlier. I've coded the base CircuitBlock class which defines a Value field and a list of CircuitBlock references that are used as inputs. To experiment with this system I coded a few logic classes (AND, OR, NOT), a toggle switch class, and a light bulb class so that you can visualize the output of the circuit. Their functions are self explanatory.

    Quick tutorial:
    - Create a new Scene.
    - Go to the \Assets\BlockPrefabs folder and drag a ToggleSwitchBlock and a LightBulbBlock into the scene window.
    - Select the LightBulbBlock that you just created and find the Input Blocks list in the Toggle Switch Block Script component.
    - Set the size of the Input Blocks list to 1.
    - Click the circle to the right of Element 0 in the list and select ToggleSwitchBlock that you created earlier.
    - Set up your camera and lights so that you can see both blocks in the game view.
    - Hit play.
    - In the game window you can click the toggle switch block with the mouse to make the light turn on and off.

    The way this works is very simple. The LightBulbBlock is directly reading the ToggleSwitchBlock's Value as input. The light is programmed to turn on if all of the block's inputs are 1, otherwise the light will turn off.

    We can take this a step further by defining logic gates such as AND, OR, and NOT. Using just AND and NOT gates we can create any digital program. This is how computers work from the logic's point of view. I've created a few example scenes which you can find in the CircuitExamples folder.

    The most complex example I made was a full adder circuit. This is a basic component of any arithmetic logic unit. It outputs the sum of two binary digits and a carry digit.

    $CircuitBlocks.PNG

    But you don't have to limit yourself to logic gates and digital automation. You can program these blocks any way that you want and make them do any thing you want them to do without limits. This framework simply propagates a signal from block to block to block to block. It doesn't care what the blocks actually do. So, use your imagination.

    You can download the full project here (Unity 4.0.0f3):
    View attachment $CircuitBlocks.zip
     
    Last edited: Dec 17, 2012
  26. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    This is exactly what I was looking for. Thank you so much mate! You helped me ton! Just a quick question: Is it possible to programatically add a block to the circuit? It probably is, but since I can't open the project till I get home could you inform me on that? Again, thank you very much for you help! :)
    EDIT: Wow! You've even included textures! You are amazing! Thanks a lot again! :)
     
    Last edited: Dec 17, 2012
  27. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    Yes, you can do that. The input block list is simply a List<T> object. You can add and remove items at will.

    Note that the wire object generation is done when the program initializes in the CircuitBlock.Start() method. So, any blocks you add dynamically after Start() is called won't get any wires. I suggest you code a method in Start() that generates a wire for a given input on a given block. These wires aren't necessary, of course, they're just graphical representations of the input hierarchy.
     
  28. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    You are a boss! Thanks a lot! Except for adding it to the list do I have to do anything else to set it up? How is it's position determined?
     
  29. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    The wires are just drawn from the position of one block to the next. Each block is a GameObject. Read: GameObject.transform.position.
     
  30. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    So I'd have to add it to a certain place in the list if I wanted it for example to be before and object and after another one, right?
     
  31. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    I must have misunderstood you. The order of the input lists don't matter (unless you want them to matter, I suppose). I was refering to the position of the end points of the LineRenerer components that are used to draw the wires between blocks.
     
  32. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    I am a bit confused. Let's say I want to programmatically generate the following:
    Input -- NOTGate -- LightBulb when only Input and Lightbulb are present in my scene. How can I do this? I am asking because I feel like implementing an editor.
     
  33. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    You can easily instantiate block prefabs and set up the input references at runtime. Lets say, for the sake of example, that you don't have any of those objects present in the scene and you want to build the following graph...

    ToggleSwitchBlock -> LogicalNotBlock -> LightBulbBlock

    If you wanted to build this graph at runtime rather than in the scene editor, then you first need to instantiate a copy of the ToggleSwitchBlock, LogicalNotBlock, and LightBulbBlock (there are several ways to do that). Then you'll add the LogicalNotBlock object to the LightBulbBlock's InputBlocks list, and finally add the ToggleSwitchBlock object to the LogicalNotBlock's InputBlocks list.

    The easiest way to load the prefabs at runtime is to treat them as resources. To do that, simply drag the BlockPrefabs folder into the Resources folder (I probably should have put it in there to begin with). Then you can load the prefabs via Resources.Load() and instantiate a copy via Object.Instantiate().


    Here is what that code might look like...

    C#
    Code (csharp):
    1.  
    2. using UnityEngine;
    3.  
    4. public class InverseLightSwitch : MonoBehaviour {
    5.    
    6.     LightbulbBlock lightBlock;
    7.     ToggleSwitchBlock toggleBlock;
    8.     LogicalNotBlock notBlock;
    9.    
    10.     void Start () {
    11.         // Create the blocks that we need and position them...
    12.         toggleBlock = (Instantiate(Resources.Load("BlockPrefabs/ToggleSwitchBlock"), new Vector3(0, 0, -2), Quaternion.identity) as GameObject).GetComponent<ToggleSwitchBlock>();
    13.         notBlock = (Instantiate(Resources.Load("BlockPrefabs/LogicalNotBlock"), new Vector3(0, 0, 0), Quaternion.identity) as GameObject).GetComponent<LogicalNotBlock>();
    14.         lightBlock = (Instantiate(Resources.Load("BlockPrefabs/LightBulbBlock"), new Vector3(0, 0, 2), Quaternion.identity) as GameObject).GetComponent<LightbulbBlock>();
    15.        
    16.         // Since we want the toggle switch to control the light through
    17.         // via the NOT gate, we need to add the NOT gate to the light's
    18.         // input list and we need to add the toggle switch to the NOT
    19.         // gate's input list...
    20.         notBlock.InputBlocks.Add(toggleBlock); // notBlock reads toggleBlock.Value
    21.         lightBlock.InputBlocks.Add(notBlock);  // lightBlock reads notBlock.Value
    22.        
    23.         // That gives us the following graph and behavior:
    24.         //
    25.         //  toggleBlock -> notBlock -> lightBlock
    26.         //
    27.         // The light will turn ON if the toggleBlock switch is OFF.
    28.         // The light will turn OFF if the toggleBlock switch is ON.
    29.     }
    30. }
    31.  
    By the way, I'm all for jumping into a project with both feet. But, if this is all just a jumble of words to you, then I highly recommend jumping into some tutorials first. To code a fully functional graph editor in C#, you will need at least (at the very, very least) a rudimentary knowledge of the language and a fundamental understanding of object-oriented programming concepts.

    Coding your first big program will be a difficult challenge no matter how much knowledge you have. You will eventually succeed if you don't give up. But if you learn programming language and computer science concepts first, then you'll find that trek is much, much easier. :)
     
  34. BlackArcane

    BlackArcane

    Joined:
    Jun 26, 2011
    Posts:
    119
    Thank you very much, works like a charm. Can I also use *blockHere*.InputBlocks.Remove(*blockHere*) so that I can add the block to another block's InputBlocks? Probably yes. Also, I understand your code without a problem, but if I were to do this, I would be able to figure out an easy way to do it. I have a "logical" problem not a "coding" one. All I am missing is experience but I can't get any of it through watching tutorials. I need to have a good foundation of a project to work with and what you gave me is absolutely ideal. I'll work on implementing some more blocks and I am even going to try making the editor if I feel lucky! :) Thank you very much for your help!
     
  35. TylerPerry

    TylerPerry

    Joined:
    May 29, 2011
    Posts:
    5,577
    Cool! I just had a look at it and its really interesting :D
     
  36. TylerPerry

    TylerPerry

    Joined:
    May 29, 2011
    Posts:
    5,577
    It is good, but there are a few improvements that I think would make it better and more realistic these are that:

    1. The light block will turn on only if all the connected switches are turned on, when in a real circuit the light would turn on as long as there is power, in my script this works.
    2. The switch should not have power, but instead just work as a switch so if the input is 1 then it outputs 1 but if not it doesn't, I had a look at this one and couldn't work out any quick hack.

    Code (csharp):
    1. using UnityEngine;
    2. using System.Collections;
    3.  
    4. /// <summary>
    5. /// The Lightbulb block turns on a light when all of the inputs are 1, else off.
    6. /// </summary>
    7. public class LightbulbBlock : CircuitBlock {
    8.     public GameObject LightOn;
    9.     public GameObject LightOff;
    10.    
    11.     protected override void StartBlock ()
    12.     {
    13.         // This light will initially be turned off.
    14.         LightOn.renderer.enabled = false;
    15.         LightOff.renderer.enabled = true;
    16.         Value = 0;
    17.     }
    18.    
    19.     protected override void UpdateBlock ()
    20.     {
    21.         // If the input list is empty or null then the light is turned off.
    22.         if (InputBlocks == null || InputBlocks.Count == 0)
    23.         {
    24.             TurnOff();
    25.             return;
    26.         }
    27.        
    28.         // If any input is 1 then turn the light on.
    29.         foreach(CircuitBlock block in InputBlocks)
    30.         {
    31.             if (block.Value == 1)
    32.             {
    33.                 TurnOn();
    34.                 return;
    35.             }
    36.         }
    37.        
    38.         // Else, turn the light off.
    39.         TurnOff();
    40.     }
    41.    
    42.     private void TurnOn ()
    43.     {
    44.         LightOn.renderer.enabled = true;
    45.         LightOff.renderer.enabled = false;
    46.         Value = 1;
    47.     }
    48.    
    49.     private void TurnOff ()
    50.     {
    51.         LightOn.renderer.enabled = false;
    52.         LightOff.renderer.enabled = true;
    53.         Value = 0;
    54.     }
    55. }
     
  37. Brian-Stone

    Brian-Stone

    Joined:
    Jun 9, 2012
    Posts:
    222
    Sure, I don't see why that won't work. Maybe you could even make it more realistic by doing a least-cost search path search on the graph from some imaginary Vcc to an imaginary Ground.

    Of course, real electrical circuits operate on physics. Basic analog circuit simulation is not actually that difficult if each component in the circuit is treated as a linear resistor. Any circuit can be described by the current passing through each node or branch (See: Kirchhoff's laws). The currents flowing into any node (connection between two or more components) must sum to zero. Those equations can be solved simultaneously for the set of unknown voltage variables (one voltage per node). The solutions are easily computed with a little matrix algebra, at least for relatively simple circuits. This is called "nodal analysis" and it is basically how circuit analyzers such as SPICE work.

    It would be kind of fun to code a realistic circuit simulator and use it for some sort of game. Hmm... ideas are brewing.
     
    Last edited: Dec 20, 2012
  38. TylerPerry

    TylerPerry

    Joined:
    May 29, 2011
    Posts:
    5,577
    Interesting, but I personally don't like bringing real life limitations into games :D

    I had another look at this yesterday and added some stuff, the switches now rely on power from a "PowerBlock" I was going to make a kind of editor, but alas without anything good, I was thinking of having a 2D array that stores blocks, then the ones that surround a block add them to the input of each block, but no luck... I came up with a web player to show what I made *Link* you can delete stuff by right clicking it, the power block is the plain looking one down the bottom.

    here is a link to a Unity package of it
     
  39. parandham03

    parandham03

    Joined:
    May 2, 2012
    Posts:
    174
    it shows fatal error.

    i am using unity3.5 . is ur package run in unity 3,5.
     
  40. TylerPerry

    TylerPerry

    Joined:
    May 29, 2011
    Posts:
    5,577
    I'm using unity 4 that is probably it... i'll make a zip of the project, ill edit this in a few minutes with it.

    here is a link to a rar of the assets
     
    Last edited: Dec 21, 2012
  41. parandham03

    parandham03

    Joined:
    May 2, 2012
    Posts:
    174
    no the rar file not worked in unity 3.5
     
  42. TylerPerry

    TylerPerry

    Joined:
    May 29, 2011
    Posts:
    5,577
    Sorry, there is nothing I can do, the scripts should still work fine though just the scenes and prefabs that may have died.
     
  43. parandham03

    parandham03

    Joined:
    May 2, 2012
    Posts:
    174
    its ok thank u for ur reply Tyler
     
  44. BuitengewoneZaak

    BuitengewoneZaak

    Joined:
    Jun 5, 2013
    Posts:
    2
    Wow, this is really awesome stuff, I was looking for such example exactly like this. Thanks a lot! I am making a game in which you design a circuit to create 8-bit music, and this provides some nice starting points.
     
  45. Orthomyxovirus

    Orthomyxovirus

    Joined:
    Nov 15, 2012
    Posts:
    11
    Wow i will dig really old post...
    there is any way to do something like this on canvas?
     
    Xepherys likes this.
  46. blmbenjo123

    blmbenjo123

    Joined:
    Sep 2, 2018
    Posts:
    1

    Sir, the link is broken. Can you update the link sir? Thank you very much in advance sir. This will be a big help to us sir :)
     
  47. SparrowGS

    SparrowGS

    Joined:
    Apr 6, 2017
    Posts:
    2,536
  48. neoshaman

    neoshaman

    Joined:
    Feb 11, 2011
    Posts:
    6,469
    Why not? ... sir?
     
  49. SparrowGS

    SparrowGS

    Joined:
    Apr 6, 2017
    Posts:
    2,536
    I only asked.
     
  50. Bluefire1234

    Bluefire1234

    Joined:
    Feb 26, 2021
    Posts:
    11
    as blembenjo pointed out the link is broken.
    I would be intrested in the link to.
    Could you please send a new link?