Sorry your browser is not supported!

You are using an outdated browser that does not support modern web technologies, in order to use this site please update to a new browser.

Browsers supported include Chrome, FireFox, Safari, Opera, Internet Explorer 10+ or Microsoft Edge.

DarkBASIC Discussion / Tokamak - anyone interested in a DBC Physics DLL

Author
Message
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 30th Jan 2015 22:00 Edited at: 4th Sep 2015 02:24
09/03/2015 Still Working
Sorry about no updates lately. I've been quite busy. I have, however, included a bunch of the joint functions in the dll. If I have some free time this weekend, I'll get the updated dll posted with a few demos.

News 08/22/2015
I'm actually coding right now and took a break to mention something in case anyone is messing with the source code for Tokamak. There are lots of helper functions in Tokamak. I haven't discovered any decent documentation so finding them and understanding how to use them and in what situations, is a daunting task to me.

I came upon a matrix function RotateXYZ() that allows you to supply angles and get back a matrix object. I originally was mad because I spent so many hours building my own matrix and quaternion functions that would work between DBC and Tokamak, and here's a rotation function that takes angles directly. The function does work, but only for rotations specifically in the X,Y and Z order. So I was happy that my original efforts weren't in vain, and still a little angry because there is no documentation. I think Tokamak would've been much more successful if there had been some detailed use instructions and indepth function descriptions. End of rant.

UPDATE 08/15/2015
No new release yet, but some news. I'm including some of the tokamak material functions. It seemed logical to add this to the dbc functions that add geometry to bodies since it is the geometry object that is set to a material. And since you can have multiple geometries assigned to a single body, it makes sense that all of these collision areas may be different materials.

I'm also including stand alone material functions that will assign all of the geometry of a body to a particular material.

FYI, a material is what something is made up of (wood, rubber, steel, etc.). When you create a material and then apply it to a body, you influence how the body will respond to friction and its bounciness.

I'm looking at joints and terrain collision. I'm not exactly sure when I'll add those but I'm trying to understand them.

UPDATE 08/09/2015
Removed Download. There are a couple of problems with the DLL- it works sometimes, other times it doesn't... It seems there is something wrong with the way I compiled it. I think I have it fixed, but I have to run more tests.

It has been hit and miss with DBC being able to load in the DLL. I think the same problem was occurring with the Coldet DLL I compiled a couple years back. Again, I think I have the problem fixed. When I've run some more tests, I'll repost it.

UPDATE 08/06/2015
I just noticed a typo in one of the functions:

tokSetAnimatedSphereGeom(tokdll,abody,diam#)

The DLL call in the function should use abody and not rbody:

Change call dll tokdll,"tokSetAnimatedSphereGeom",rbody,diam#

To call dll tokdll,"tokSetAnimatedSphereGeom",abody,diam#


UPDATE 08/04/2015
Make sure you get rid of any previous downloads and replace them with this one. The last one was buggy and also had incorrect rotation calculations.

I've made a DBC library file (.dba) for use as an #INCLUDE. There's a new download attached to this post (Dbc tokamak library ver .04) There are currently about 25 functions. Mostly, they are setup functions.

I've included 3 demos that show the base object geometry used in Tokamak:

* Falling Boxes
* Falling Spheres
* Falling Capules

You'll need to change your setup.ini file. The line that reads windowmode=0 should be windowmode=1 . This will allow a function to automatically size the demos based on your desktop. If you don't want to do this, then comment out the function get_desktop_size(1,1) at the beginning of the demos and type in whatever set display mode you want.

Have a look at the demos, pull them apart, and maybe make some of your own. Usage may be slightly advanced because there is some reliance on memblocks. If you don't understand something, ask and maybe I can explain it. I'll keep plugging away and try to make available more of tokamaks functions. There's things like breakable objects, constraints, joints, collision, terrain collision, motors... a lot of it I don't quite understand yet, but I'll keep playing.


UPDATE 07/12/2015
I've been working on rotating an object (what tokamak calls an animated body) in DBC, sending that to Tokamak, and reading back what Tokamak thinks the rotations are. This has been a big headache as I thought everything was good after having gotten the rigid bodies to rotate correctly. DBC uses Euler angles which depending on how they are derived, can have many different values for the same orientation. I think I have it now for animated bodies. When a Y rotation is 90 degrees, the return from Tokamak is weird. So now any 90 degree rotation becomes 90.1 and that seems to do the trick. A little inaccurate, but only at 90 degree angles (that includes 270). I haven't update the download yet, so the old demo with the bad rotation is still in there. I want to put together something with both rigid bodies reacting to controlled animated bodies, but I've only now think I have the rotations working (that's been said before!).

I'll post something as soon as it's ready.

UPDATE 07/04/2015
I'm attaching the first demo to this. It's a bunch of falling cubes based on one of the original Tokamak demos. I think it's so cool that it works in DBC, I've run it about a thousand times!

Make sure you extract both the .DBA file and the .DLL to the same directory. Run the .DBA file. Press the SPACE key to restart the sim with slightly different positional offsets of the cubes from one another. If you have questions, please ask.

The code isn't real neat and I haven't made a nice, clean, DBC function library yet for easier use, but you can get the idea if you go through the code. As time permits, I'll create a DBC function #include file, hopefully a couple more demos, and an expansion to include the joints, ragdoll stuff, and collision available in the engine.

The rotations gave me some trouble, but I think they are ok. I'm not 100% sure as I haven't created anything more complicated than the falling cubes.

UPDATE 03/16/2015
Completed translation of Quaternions to Euler angles. Still not sure of rotation order. Need to come up with a method o test rotations. Probably have to force a rotation in Tokamak and see if it matches DB.

To do before demo:
* also translate Tokamak Matrix rotations to Euler
* test rotation order

UPDATE 03/05/2015
Should have a little time tonight to work on this. Project by no means stopped.

UPDATE 02/23/2015
Back on track. I recompiled the static library and it seems to be working now and links properly to the DLL. I've got about 13 or 14 functions in the DLL and it should be enough to put together a demo. Things to work out before the demo:

* Timing to advance the simulation properly
* Management of all of the physics bodies (DBC arrays?)
* Passing the vectors back and forth - the data in Tokamak is stored in transformation matrices and/or quaternions. DBC uses euler angles. I also don't know the rotation order of Tokamak Matrices, so converting the transforms to something DBC can use is going to be tricky and trial and error.
* Setting up a DBC function library instead of direct calls to the DLL. Maybe not necessary, I'm not sure if calling the DLL functions from within DBC functions is less efficient (though easier to use)

UPDATE 02/16/2015
Linker errors I can't quite resolve. I might have to compile the Tokamak library from scratch and start from there. As for right now, I can't get anything to work. The simulator object itself for some weird reason is undefined.

UPDATE 02/11/2015
Things are progressing. I've made calls to the engine and no errors. I haven't pulled anything back to DBC yet. I'm aiming to have a basic framework and possibly an example sometime within the next 5 days.

Jan. 30 2015
I was going through a bunch of old DLL projects I had started or thought about at one time or another, and came upon some notes I had for Tokamak physics. Would anyone be interested in this if I were to try and knock something together for DBC? No guarantees, but it seems like a project that might be fun to mess around with a bit. My notes are a bit cryptic and dated from like 2007 or so, but I think I could revisit it and see what can be done.

Enjoy your day.
seppgirty
FPSC Developer
14
Years of Service
User Offline
Joined: 3rd Jul 2009
Location: pittsburgh, pa.
Posted: 31st Jan 2015 15:24
If it's a project you're interested in doing, then do it. I'm sure there are people that would be very happy to have physics for classic.

gamer, lover, filmmaker
Attila
FPSC Reloaded TGC Backer
19
Years of Service
User Offline
Joined: 17th Aug 2004
Location:
Posted: 2nd Feb 2015 11:39
well, yes physics for classic would be interesting. If/when you are ready to do it and you find the time, DO IT!
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 3rd Feb 2015 01:41
Sounds good. I'll probably do it in stages - a few commands at a time just to see if I'm on the right track! Basically, the final DLL would work like this:

* Get all of the objects' positions, rotations, etc. (for those items that are only controlled by the physics engine (rigid) and not user controlled (animated), this should only need to happen once)
* Feed that to the DLL in a manner that Tokamak can understand and act on - through various DBC user functions
* update the step increment in Tokamak
* get back all of the updated positions and rotations (have to manage the proper matrix conversions in the DLL) - probably through memblocks
* update the objects in DBC with their new positions and rotations

I'm not sure how fast Tokamak will do it's calculations, but I imagine there may be some bottlenecks in getting DBC's info back and forth through memblocks and updating the objects.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 8th Feb 2015 03:30
Some news - after this I'll probably just update the top post:

My first attempt at compiling the Tokamak code as a DLL with C exports. It was successful. I'm a little worried as it's rare a program is nailed the first time! Well, we'll see what happens when I start trying to make it talk to DBC and pass values back and forth.

Enjoy your day.
Phaelax
DBPro Master
20
Years of Service
User Offline
Joined: 16th Apr 2003
Location: Metropia
Posted: 10th Feb 2015 21:41
I just don't see the point in doing anything for DBC. Were you the one who did Tokamak for DBP?


"I like offending people, because I think people who get offended should be offended." - Linus Torvalds
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 11th Feb 2015 01:46
Hehe. There's really no point to it per se. It's all for fun! It's fun to tinker and see what can be done. And no, I didn't make anything for Pro with Tokamak.

There's one or two of us out there that still like to play with DBC. And will it be satisfying to see some blocks tumble in a semi-realistic way in DBC? You bet! Actually, since processors are pretty fast these days, you can get a fairly polygon heavy program to run at a decent speed in DBC. So, we'll see.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 23rd Feb 2015 19:18
update

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 16th Mar 2015 17:29
update 03/16/2015

Enjoy your day.
Myq
9
Years of Service
User Offline
Joined: 25th Mar 2015
Location:
Posted: 9th Apr 2015 22:19
This sounds really interesting. I'd love to see you make further progress as I still enjoy playing with DBC.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 13th Apr 2015 03:21
Hi Myq,

It's coming; just going a little slow right now. There's a step in the process where the simulation has to be initialized with all of the objects, particles, constraints, etc. and I'm debating how to handle it. Right now I have a function programmed that incorporates some of the basic definitions in a single initialization, but it may limit options. For the demo, I may just move forward, but I'm still wrestling with the approach.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 14th May 2015 00:32
Keeping this alive so it's available when I do post the update.

Enjoy your day.
Ron Erickson
Moderator
21
Years of Service
User Offline
Joined: 6th Dec 2002
Location: Pittsburgh, PA, USA
Posted: 1st Jun 2015 22:12
Good luck! I am the person that wrote the Tokamak wrapper dll for DBpro. It worked pretty well until I got into adding some of the sensors. There were lots of bugs in Tokamak that wouldn't allow me to go any further. It was a fun project though! I had the first working ragdoll physics in DBpro before they were implemented in many retail games.

Ron

a.k.a WOLF!
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 2nd Jun 2015 19:58
Thanks. It's actually fun to tinker. I'm moving at a snail's pace though (that darn life keeps getting in the way). It's not the easiest API to decipher, and the docs, well they read like: "this class of function is meant to perform functions in this class - as long as you've called the necessary setup functions that these docs will not reference here." Not very helpful or intuitive.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 2nd Jul 2015 19:04
Believe it or not, this is still on my plate. I'm bumping the thread so it doesn't auto-lock. I think I will actually have some time this weekend (keep fingers crossed).

Enjoy your day.
waffle
21
Years of Service
User Offline
Joined: 9th Sep 2002
Location: Western USA
Posted: 4th Jul 2015 01:29
Actually, I still use DBC instead of Pro because the system requirements are more friendly for my computer. DX9 and the newer explore browsers really hate my old laptops. There is an issue with DBC's DLL usage via memblocks .... It will work fine for a while, by sometimes the pointer becomes invalid and DBC crashes hard. I experienced that with the "other... sparky? " library.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 5th Jul 2015 03:17
update 07/04/2015 - see first post - demo attached

Enjoy your day.
waffle
21
Years of Service
User Offline
Joined: 9th Sep 2002
Location: Western USA
Posted: 5th Jul 2015 10:18 Edited at: 5th Jul 2015 22:50
Thanks Latch, I will look at it when all the 4th of july stuff is done I am sorta busy, I complained to my wife I should be careful posting in your thread because you might put me to work

EDIT 7/5/2015

Tested.
First try ran but very very slowly (maybe 0.5 FPS)
After aborting program (F12) could not restart demo

Does your DLL register itself with taskmanager? I could not
locate it to manually shut it down (end process)

Each restart resulted in a DBC crash to white screen.
I could use taskmanager to end DBC. I did a full sysytem restart
hoping to clear your DLL for another test, but DBC still crashed.

At the top of the program you have display mode 1024,768,32 ...
maybe my 10 year old laptop does not like that (running 16MB internal card ... primative). I tried commenting that out and doing a restart but DBC still crashes.

edit again ....
After placing break points and stepping through code ....
I learned the following:
DBC (at least for my slow laptop) requires a sync to happen sometimes. I added a sync command into the loop where you
create the rigid bodies for TOK and that stopped the crashing.
I lowered the fbod count from 150 to 5 and that raised my frame rate to 1?

The FPS seems to give the wrong value. I moved the tim=timer() function from the end of the loop to the beginning (just before the DLL calls) and that now give a more reliable number (0.300 between calls). Normally, just before the sync command is fine, but with very few models to render this gave a bogus value of 0.002 which I knew was wrong.

EDIT: I did get the demo to crash on command
When I press the spacekey to restart, about the 3rd or forth time
DBC would crash. I suspected it was the pointer issue so I experimented by adding 2 extra syncs after the "delete memblock" and 2 extra after the "make memblock" but before the "get memblock ptr" to give DBC more time to free the pointer and reestablish the new pointer. After that, I could not get it to crash. It still runs slow on my P3 1GHZ with 8MB radeon onboard ATI chipset and 512MB ram; but it does work.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 6th Jul 2015 08:46 Edited at: 6th Jul 2015 08:48
Thanks Waffle, for the feedback! I compiled the DLL on a windows 7 machine so there might be a couple links in there that aren't 100% compatible. I'll try recompiling it on my windows 98 machine.

I've never experienced a pointer problem with memblocks as you have mentioned, but I could rewrite the demo to not clean up before refreshing (except the sim part). I only clean up everything to be consistent, but DBC has always had a problem with memory leaks in general when deleting objects and images, or anything generally related to display.

What version of DBC are you using? I'm running 1.2x. I've found there to be different syncing requirements between that and version 1.13 and below.

The demo isn't very well explained. The sync rate is set to 60. Depending on the operating system (above windows 2000 I believe) the sync rate will match the monitor refresh if it is close enough to it. So on my i7 laptop with windows 7, a sync rate of 60 plays at 50 in the demo.

The .02 value(s) is the time it actually takes between iterations (which should equal 1/FPS). The timer()-tim expression was to count the time it took to reach the subroutine each iteration. Originally I was using this value to advance the simulation. However, I decided to hard code the actual steps in the sim because I couldn't rely on a consistent value using the timer, and the sim can become unstable without consistent values.

As far as it running slowly, try changing


to


and


to


That will make the time between sim updates shorter, but decrease the number of steps from 4 to 1 per sim update. Those steps take up a lot of processing time. My computer has no problem with them. 150 objects run just as well as 5 - so I will have to try out some of this on my old machine.

I'll tinker around with it a bit this week and update the demo and recompile the dll on the old machine.

If you aren't using DBC 1.2x, you may want to update. There are some material commands in there that are quite useful but there are some other changes that you need to be aware of. For example, you have to have a country code after using set text font. For English, that means ending it with a ,1



If you don't add the country code, the text will not be the correct font or size you expect.

Thanks again for your input.

Enjoy your day.
waffle
21
Years of Service
User Offline
Joined: 9th Sep 2002
Location: Western USA
Posted: 6th Jul 2015 11:49
My DBC reports that I am using 1.13 enhanced, but I thought I was using 1.2 or 1.21 ... but that may be on my newer laptop which has other serious issues (dvd/cd drive is shot/ bios is corrupted/ hd shuts down sometimes). I keep planning on getting a newer one (only $100 for one better than I have) but the wife and daughter have other needs so I tinker on this dinosaur that does not even have wifi ) Maybe that is why I have not posted in a while, or updated my website
Silverman
17
Years of Service
User Offline
Joined: 18th Jan 2007
Location: France
Posted: 6th Jul 2015 12:22 Edited at: 6th Jul 2015 12:26
deleted

DirectX 9.0c (February 2010)/ DBClassic v1.20
Silverman
17
Years of Service
User Offline
Joined: 18th Jan 2007
Location: France
Posted: 6th Jul 2015 12:24 Edited at: 6th Jul 2015 12:26
Hello,
it already works very well, it is awesome!

DirectX 9.0c (February 2010)/ DBClassic v1.20
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 6th Jul 2015 18:35 Edited at: 8th Jul 2015 10:11
@Silverman

Cool! Thank you Silverman for testing. What windows OS are you using?

@All
I'll still compile a version of the dll on my windows 98 machine just to see if it makes any difference with compatibility.

@Waffle
I'm thinking the sync problems are related to the DBC version you are using.

Quote: "...getting a newer one (only $100 for one better than I have) but the wife and daughter have other needs so I tinker on this dinosaur that does not even have wifi ) Maybe that is why I have not posted in a while, or updated my website "


I hope for the best if hard times have fallen on you and your family.

07/08/2015
Finally figured out the problem with pulling the rotations out of the sim. The quaternion that Tokamak generates has a W that is opposite to what DBC wants. Man, this one was hard to figure out.

That is a sigh of relief and now I can think about translating some more functions and maybe fixing the demo or adding some.

Enjoy your day.
waffle
21
Years of Service
User Offline
Joined: 9th Sep 2002
Location: Western USA
Posted: 8th Jul 2015 10:19
@Latch, not hard times, just busy times )
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 8th Jul 2015 19:03
Glad to hear that!

Enjoy your day.
Silverman
17
Years of Service
User Offline
Joined: 18th Jan 2007
Location: France
Posted: 8th Jul 2015 19:04
My pc:

Microsoft Windows XP Professionnel Version 2002 Service Pack 3
AMD Phenom(tm)II X4 965 processor 3.42GHz, 3.25 Go de RAM
GeForce GTX 560 Ti

DirectX 9.0c (February 2010)/ DBClassic v1.20
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 13th Jul 2015 03:21
update - see first post - no new demo yet, however.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 15th Jul 2015 18:50
@Ron Erickson,

If you are still reading this thread, had you ever tried to do motor type stuff? For example, spinning wheels on a car to get it to move forward?

How is the object set up? I assume the wheels are rigid bodies linked (by joints?) to the body. Then is torque applied or velocity? How do you affect the material for "grip" or friction.

Any help you can give would be appreciated. I'm having trouble understanding how the material is assigned to a rigid body and whether moving something like a car should be done by spinning the wheels or by applying a force to push the car.

Thank you

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 28th Jul 2015 19:26
@all

Project is still moving forward. I've been working on creating a DBC library of functions to #INCLUDE with programs. This serves 2 purposes:

1. If you look at the library source you'll see the description of the function and what the parameters are. You'll also see the DLL call so you'll know how to use it if you decide you want to make the DLL calls directly instead of using DBC functions. Direct calls are a little bit faster, but DBC functions tend to make it easier.

2. Makes things a little neater and simpler to handle.

I was debating whether or not to make a series of global arrays as I did for Coldet, that stores memblocks, pointers, the dll number, and structures (quaternions, matrices, vectors, etc.) that can be sent back and forth between DBC and the DLL instead of leaving all of that up to the user. At this point, it'll be up to the user to create the necessary memblocks and manage the pointers. Once I get a few examples together, it should be easy to duplicate for your own projects.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 5th Aug 2015 06:34
Updated : top post. New download:

dbc tokamak library 08/04/2015

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 7th Aug 2015 19:00
When I get a chance, I'll create a new download. I found another error. In setting up the cylinder demo, I use the object size to create the geometry and the inertia tensor. For a cylinder in tokamak, the geometry should be the diameter and the height. The inertia tensor should be the diameter, height, and mass.

Using the Y object size seems not to match the geometry in tokamak. It could be because of the capsule shape - tokamak may already account for the radii of the domed ends being added to the height. I'm not sure, but it seems to function better when I use the exact measures.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 17th Sep 2015 21:31
Thread alive. Still working. Busy, family, etc.

Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 16th Oct 2015 23:39
I plan on taking a look at this this weekend.

Made a few corrections to the cylinder geometry type.
Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 16th Nov 2015 01:17
Tested out the material functions today. They work! I made some spheres bounce around like beach balls. I also lowered their friction to almost 0 and gave them no bounciness and they skidded across the floor like they were on ice. I've also got a lot of the joint functions in the DLL. I just don't really understand how to use them yet. If anyone is following this, I will, sooner or later, upload the recompiled dll and some demos. I'm also trying to understand how to shoot or throw something. I don't really understand how to apply forces or impulses or manage the collision yet.
Enjoy your day.
seppgirty
FPSC Developer
14
Years of Service
User Offline
Joined: 3rd Jul 2009
Location: pittsburgh, pa.
Posted: 17th Nov 2015 00:22
Glad to see you stuck with this and are making progress. Maybe a demo video of the bouncing ball?
gamer, lover, filmmaker
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 17th Nov 2015 19:44 Edited at: 23rd Nov 2015 18:02
Thanks.

You know what, you have a point... even though I haven't worked out all of the functionality of the engine, I'll post a couple demos of some simple falling objects when I get home tonight or tomorrow. Or next week...

I've worked out the bugs for that stuff and the recompiled DLL shouldn't (fingers crossed) run into the same issues Waffle pointed out.
Enjoy your day.
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 29th Dec 2015 23:41
Keeping alive
Enjoy your day.
Silverman
17
Years of Service
User Offline
Joined: 18th Jan 2007
Location: France
Posted: 2nd Jan 2016 13:49 Edited at: 4th Jan 2016 11:16
Glad to read that.
DirectX 9.0c (February 2010)/ DBClassic v1.20

Microsoft Windows XP Professionnel Version 2002 Service Pack 3
AMD Phenom(tm)II X4 965 processor 3.42GHz, 3.25 Go de RAM
GeForce GTX 560 Ti
Latch
17
Years of Service
User Offline
Joined: 23rd Jul 2006
Location:
Posted: 4th Jan 2016 17:27
I feel bad because I haven't had the kind of time it takes to get this done. The worst part is that the longer it takes, the more I forget how to use it! But I really want to get it done - at least to a point where it's somewhat useable.
Enjoy your day.

Login to post a reply

Server time is: 2024-03-29 13:37:36
Your offset time is: 2024-03-29 13:37:36