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.

DLL Talk / The Matrix1Utils plugins collection

Author
Message
Jeff Miller
19
Years of Service
User Offline
Joined: 22nd Mar 2005
Location: New Jersey, USA
Posted: 6th Dec 2009 15:22 Edited at: 6th Dec 2009 15:24
Hmm. The Level 6 tessellation of an octahedron in your geosphere code produces 32768 polys, and runs fine (though slow at that level) on my machine, so it shouldn't be a problem with my drivers. I just can't achieve that poly size with the Make Object New command using an index. I'm expecting that updating your older code with the newer command will speed up production.

The 21845 polys limit you mention as the limit when an index is not provided seems to be being enforced even though the index is provided, which would explain why the most I can get is 21642 polys(at frequency 52). The next higher value, at frequency 53, would be 22472 polys, which is above the limit.
Diggsey
18
Years of Service
User Offline
Joined: 24th Apr 2006
Location: On this web page.
Posted: 6th Dec 2009 16:09
There seems to be a bug in the 'delimit csv$' command


Surely that should print "Test"?

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 6th Dec 2009 17:09
Yes, there's a silly bug in there that I've now fixed.

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 8th Dec 2009 20:40
Ok, here's a new release, with a new plug-in too that hopefully makes using images as bitmaps easier to use than the camera method.

Matrix1Util_04 - 1.1.0.6
- Major rewrite of IS MEMORY READABLE/IS MEMORY WRITEABLE to work for Windows Vista & 7

Matrix1Util_07 - 1.1.0.5
- Added both float and double float versions of LOG, LOG10 and LOG2 functions.

Matrix1Util_09 - 1.1.0.4
- Fixed the MOVE CAMERA commands to use the current camera when no camera is specified instead of camera 0.

Matrix1Util_16 - 1.1.0.6
- Added extra versions of SPLIT CSV STRING allowing the delimiter and quote characters to be specified.
- Fixed DELIMIT CSV$ function

Matrix1Util_18 - 1.1.0.8
- Corrected resource string for the MAKE OBJECT FROM POINTER command.
- Added extra checks for limits of mesh sizes.

Matrix1Util_19 - 1.1.0.6
- Fixed fatal bug and added further safety code to CALL FUNCTION FOR OBJECT GROUP and CALL FUNCTION FOR ALL OBJECTS.

Matrix1Util_26 - 1.1.0.1
- Renamed the CLEAR SPRITE VIEW command to RESET SPRITE VIEW.
- Added CLEAR SPRITE VIEW to clear the sprite draw area to the background colour or the colour specified.
- Added DRAW SPRITES MANUAL/DRAW SPRITES AUTO/DRAW SPRITES to allow manual control over when sprites are rendered.
- Added DRAW ANIMATION MANUAL/DRAW ANIMATION AUTO/DRAW ANIMATION to allow manual control over when animations are rendered.

Matrix1Util_29 - 1.1.0.1
- Minor cleanup on string handling in arrays.

Matrix1Util_30 - 1.1.0.1
- Minor performance enhancement for flood fills.
- Minor performance enhancement for SAVE FRONTBUFFER.
- During fill, build render list as each draw-line is identified, rather than build at the end to reduce memory usage.

Matrix1Util_33 - 1, 0, 0, 1
- New plug-in to consolidate drawing to bitmaps/cameras/images.
- * Due to a DBPro limitation, DOT, CIRCLE, ELLIPSE, POINT and my own FILL command will not currently work with image/camera render targets.

I'll post an example for the new plug-in next, and for the sprite drawing controls.

Attachments

Login to view attachments
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 8th Dec 2009 20:53
First, I'll get the sprite example out of the way - the new commands allow you to specify when you want sprites to be drawn.

Using the commands could not be simpler:


There's also the DRAW SPRITES AUTO command which tells DBPro to take back control of sprite drawing (ie, back as it was).

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 8th Dec 2009 21:01 Edited at: 8th Dec 2009 21:02
Next are some examples of drawing to images.

This first one creates an image and uses it as a sprite. During each frame it draws random dots to the image:


Note the commented out DOT command - the non-accelerated 2D commands don't work with these images, as they don't work with the 'camera bitmap' system. Sorry about that, but I'll work on it as I'm able.

The next example is a less useless one and basically shows you the kind of thing that I was aiming for when I wrote the plug-in:


The image currently follows the mouse pointer around, but that was so that I could test transparency. Now imagine a radar display mid-screen, and still be able to see what's ahead to shoot...

GIDustin
16
Years of Service
User Offline
Joined: 30th May 2008
Location:
Posted: 9th Dec 2009 00:26
IanM: Nice new plugin! I can confirm that Cloggy's d3d_func commands seem to work with it as well. Replacing the DOT command with d3d_dot in the first example gives the same results as the current BOX one does.

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 9th Dec 2009 14:18
Yes, that's expected as he used the Direct3D interfaces. DOT isn't too much of a problem though, as you can see from the examples I posted as you can replace it with another command, but there is no replacement for POINT.

One thing I meant to mention when I posted the code was that unless the image is created using either the SET CAMERA TO IMAGE command, or my new MAKE IMAGE command, you won't be able to render to it. That's why I added the IMAGE ALLOWS RENDER function so that this can be tested for.

Outscape
16
Years of Service
User Offline
Joined: 23rd May 2008
Location:
Posted: 12th Dec 2009 16:35
is it possible for this to be converted and used in GDK as a library?



Stab in the Dark software
Valued Member
21
Years of Service
User Offline
Joined: 12th Dec 2002
Playing: Badges, I don't need no stinkin badges
Posted: 19th Dec 2009 02:55
Thanks Ian for the update.
I think I found an error with the Datafile datastring function.Here is code of how Iam using it.

Iam using file #12 but the error says file 0 is not open.
error attached.


Custom,intel,2.4GHz,1024mb,ATI X1500 256mb,
WindowsXP DBpro v7.4
The coffee is lovely dark and deep,and I have code to write before I sleep,and I have code to write before I sleep.

Attachments

Login to view attachments
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 19th Dec 2009 13:28
Yes, there does appear to be a bug with that command - it's not set up correctly for returning a string (an error I keep on making over and over ).

I've looked though your code and I have a question: You have set the string type to 4 (the size in a byte followed by the string characters), but you are still attempting to read raw bytes from the file - why? Why not simply use DATAFILE STRING$ to read the string?

ie, change this:


to this:


I will fix the bug anyway. Thanks for the bug report.

Dan Fessler
16
Years of Service
User Offline
Joined: 17th Feb 2008
Location:
Posted: 29th Dec 2009 18:43
This truly is a gold-mine. I just wanted to say thanks

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Omen
18
Years of Service
User Offline
Joined: 7th Nov 2006
Location: Maple Grove, MN US
Posted: 3rd Jan 2010 05:43
Heya Ian,

Long time no chat -- just wanted to let you know that your Matrix1Utils are now a prerequisite to compiling my Frost project:

Quote: "4. You'll need IanM's Matrix1Utils because they convert lead to gold, regrow hair, and they have a minty taste. Actually they do none of that, but they DO make programming in DarkBASIC sooooo much easier. This one is FREE."


...hope that's OK

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 3rd Jan 2010 15:46
Sure it's OK, but they actually DO have a minty taste

I saw your thread in GC when you posted it, but didn't have the time to read your blog/dev diary then. I'll make a point of reading it.

Mnemonix
21
Years of Service
User Offline
Joined: 2nd Dec 2002
Location: Skaro
Posted: 4th Jan 2010 04:47
Hey Ian, I have been having a bit of a problem when I try to allocate exactly 16kb of memory and use "datafile memory" to load a 1kb file into the memory at the beginning.

My debugging has lead me to believe that the memory has been allocated properly, but "datafile memory" returns 1, the number of bytes written to memory.

Any idea what could be causing this?

Mnemonix
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 4th Jan 2010 13:05
Yes, it's a bug. It's doing the job, but just returning the incorrect value (0 = fail, 1 = success). The only time there may be a problem is if you try and read more data than exists in the file from your current file position.

I've fixed it in the next release.

Mnemonix
21
Years of Service
User Offline
Joined: 2nd Dec 2002
Location: Skaro
Posted: 4th Jan 2010 20:06
Top notch Ian, I figured this may be the case

Mnemonix
Butter fingers
18
Years of Service
User Offline
Joined: 20th Mar 2006
Location: Mecca
Posted: 21st Jan 2010 14:49
Hey Ian,

I'm sorry if this has already been voiced, but there are 22 pages and I'm on my lunch break on dialup.. I'm just wondering. I installed the latest DB update and I now get an error on compile saying there is a conflict between one of the Matrix1 Array commands and something in the DBcore.dll

It's not a show stopper, it's just an annoying popup on every compile. It seems to generate the error before it compresses and encrypts media to the exe, which means I can't propperly compile final exes.

Is there a workaround/fix?

Love your dlls and can't possibly get rid of the array commands!

I want robotic legs.
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 21st Jan 2010 15:13
If you have the Matrix1Array plug-in, get rid of it. All of its functionality is now included in this plug-in set.

However, if the conflict is between these plug-ins and core, then upgrade to the latest versions of these plug-ins. The conflict was caused by a function (GET ARRAY TYPE iirc) being moved from my plug-in to the core plug-in.

Lonnehart
15
Years of Service
User Offline
Joined: 17th Apr 2009
Location:
Posted: 22nd Jan 2010 08:17
I was directed here. So these series of plugins will let me create one large file with all my media in it, which I can then read if I want to use those files in the games I make?

In the beginning there was nothing. There'll be nothing in the end...
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 22nd Jan 2010 18:37
Quote: "So these series of plugins will let me create one large file with all my media in it"

Yes and no.

They will give you the tools to do the job, but as always it's up to you to code it. It won't necessarily be easy.

I recently answered a question very like this one: http://forum.thegamecreators.com/?m=forum_view&t=164304&b=1

alfi
15
Years of Service
User Offline
Joined: 27th Mar 2009
Location: Germany
Posted: 23rd Jan 2010 10:41 Edited at: 23rd Jan 2010 13:12
Hi IanM

Thanks a lot for this dll´s!
alfi
Omen
18
Years of Service
User Offline
Joined: 7th Nov 2006
Location: Maple Grove, MN US
Posted: 24th Jan 2010 05:10 Edited at: 26th Jan 2010 05:27
Heya Ian,

I'm using DLL 33 for a fast key/value lookup implementation for Frost. However, it seems to lock-up when the SEARCH LOOKUP is called at high rates. At about 4.8 lookups/second it's fine - but somewhere between 4.8 and 4.9, it locks up every time.

I've tried this on a couple different workstations with different version of Windows with the same results - so, think that rules out the hardware/OS. It will also work fine indefinitely as long as the rate stays below that 4.9 lookups/second mark.

Of course, the problem could be my code (see below), but I'm pretty sure I'm using everything correctly according to your doco. In any case, the optionSetup subroutine is called with a gosub at initialization and the optionLoad() function is called right after it - which all works well. Then the optionGetTag() is used to do lookups in the main loop.

(see test harness code 3 posts down)

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 24th Jan 2010 14:20
Is there any chance you can provide code that I can compile and run myself? Example data files would be nice too.

GIDustin
16
Years of Service
User Offline
Joined: 30th May 2008
Location:
Posted: 26th Jan 2010 00:48
Hey IanM

Just wondering how hard it would be to add some commands that appear to be missing from DBPro:

make memblock from music
make music from memblock

Thanks for everything you have done so far, love the plugins!

Omen
18
Years of Service
User Offline
Joined: 7th Nov 2006
Location: Maple Grove, MN US
Posted: 26th Jan 2010 05:23 Edited at: 26th Jan 2010 05:25
Heya Ian

I did put together a test harness, but of course now I can't get the issue to replicate there I'm still experiencing the freeze-up as described in my main project -- so, it's got to be some odd interaction somewhere else... I'll tell you when I find it.

The code for the test harness is below and I've attached a lookup table file (put in same directory as executable).




Attachments

Login to view attachments
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 26th Jan 2010 14:16 Edited at: 26th Jan 2010 22:34
TBH, that's kinda what I expected, however I'll try out your code myself later tonight.

@GIDustin,
I'll check it out - I'm pretty sure though that there's nothing for me to hook into to play from memory rather than file or CD.


[EDIT]
@Omen,
Check out your optionSave function - WHILE LOOKUP EXIST, should be WHILE LOOKUP IS VALID.

I'd also suggest simplifying your ini file structure too and using ini files as they were meant to be used.

Having your ini files structured like the attached example file would make your lookups far faster and allow you to switch languages without having to reload anything - it would also simplify your lookup code drastically.

For instance, after loading the ini file using MAKE LOOKUP FROM INI, your optionGetTag could become something as simple as:


or if you want to fall back to English if the requested language is not set up:


I'd also suggest making the keys in the file all lowercase to avoid any mixed-case issues.

Attachments

Login to view attachments
Lonnehart
15
Years of Service
User Offline
Joined: 17th Apr 2009
Location:
Posted: 27th Jan 2010 11:19
Well, I see you also have tutorials on how to use these plugins. Can't wait to jump in and try to create simple compiled files with it.

Gotta start at the bottom to get to the top, y'know.

In the beginning there was nothing. There'll be nothing in the end...
Aubergine
14
Years of Service
User Offline
Joined: 19th Jan 2010
Location:
Posted: 27th Jan 2010 13:58
I dont know if it was mentioned earlier, but CURVE BEZIER command is unknown to the compiler.
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 27th Jan 2010 14:19
Thanks for the report - I have no idea where that one went as I have several pieces of test code that worked perfectly when I tested it.

If you want to put the command back until I issue the next release, add the following string resource to plug-in number 7 using a resource editor:


Aubergine
14
Years of Service
User Offline
Joined: 19th Jan 2010
Location:
Posted: 27th Jan 2010 16:05 Edited at: 27th Jan 2010 16:12
i have no idea how to do that, but id like to learn if you could show how.
EDIT: Oh okay i did it, it works now
Rudolpho
18
Years of Service
User Offline
Joined: 28th Dec 2005
Location: Sweden
Posted: 29th Jan 2010 15:39 Edited at: 29th Jan 2010 15:39
Been messing around with your overload of make object plain and noticed a thing that struck me as kind of strange.

From the documentation on the function:
Quote: "Any plain created can only have up to 65536 vertices or the command will fail. The number of vertices is calculated as (Columns + 1) * (Rows + 1)."

Still, a 16x16 plain (specified as width, height, 15, 15) ends up having 1536 vertices, most of which (> 255) seem to be placed at a slightly random position around the centre of the created object. That is 6 times the number of vertices given to be expected by the documentation. If it were 2x I could have found it explainable, but why six? Did you in fact mean to say that the final number of quads (two triangles, 3 vertices each) should equal (Columns + 1) * (Rows + 1)?

I'm currently trying to set my own texture coordinates to a grid of such plain object segments, and come out with weird results all the time. I don't know if that could somehow be related to the vertex count issue then, seeing as I'm only writing to the first 256 ones?

Diggsey
18
Years of Service
User Offline
Joined: 24th Apr 2006
Location: On this web page.
Posted: 29th Jan 2010 17:42
@Rudolpho
Are you using make memblock from mesh? If so, that is your problem. Memblocks don't support index data, so they convert it. (Which gives it 6x as many vertices)

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 29th Jan 2010 19:36
That sounds like what's happening.

@Rudolpho,
The help file is correct - the plane created by my command shares vertices amongst polys that have common corners. Memblocks would mess that up entirely.

IMO, memblock meshes are dead anyway and you should switch away from them as soon as you can.

When Lee implemented the LOCK VERTEXDATA & related commands, adjustment of meshes using memblocks became obsolete, but we still needed them to create new meshes. But as soon as I introduced my own MAKE OBJECT commands, memblocks lost that last point.

Rudolpho
18
Years of Service
User Offline
Joined: 28th Dec 2005
Location: Sweden
Posted: 29th Jan 2010 22:42
Ah, ok, thanks for clearing that up guys

Turned out that my issue with the texture coordinates was that I didn't know that they could (/should) have values greater than 0..1.
All good then

I usually use the vertexdata functions, but here I was having a single large memblock mesh holding all segments of my to-be terrain; then just writing header info and copying the vertex memory. That's of course not necessary at all, so shouldn't be hard to work around.

Tckaija
14
Years of Service
User Offline
Joined: 27th Jan 2010
Location: E. Central, WI, USA
Posted: 2nd Feb 2010 10:19
Question for you IanM:

Is there a special trick to getting then Utility plugins to work with the U75 Beta? I believe that I have them the inin files and the help files in the correct places.

Only problem is that I can't seem to access their functionality.

TIA
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 2nd Feb 2010 21:53
If they aren't working then you've done something wrong. I am currently updating some of the plug-ins and testing using both the 7.4 and 7.5beta versions and there's no problems with either.

Make sure that when you unpacked them, you unpacked them with their directory structure intact.

If you are using the 'old' editor, then restart it to get keyword highlighting working. If you are using the new editor, then rebuild you keywords list (Tools->Rebuild Keywords).

Tckaija
14
Years of Service
User Offline
Joined: 27th Jan 2010
Location: E. Central, WI, USA
Posted: 2nd Feb 2010 22:28
I went ahead and re-unzipped them all...

This time I was able to get a command to work (specifically 'Fast LEN') so I guess they are workable after all.

Should they show up in the index for the regular DBP help files when I do a F1 to search for help?

Perhaps my problems stem from rinning M$ Vista...
Tckaija
14
Years of Service
User Offline
Joined: 27th Jan 2010
Location: E. Central, WI, USA
Posted: 3rd Feb 2010 02:08
I figured out a work around for the last...

Initially I had edited the index.htm file to add the info in from Matrix1_Commands.html but everytime I would try F1/Help it would still show me the [original] file...

After a bit I went ahead and edited index.htm from [within] DBP by rightclicking on it and choosing 'View Source' which opened it up in WordPad... I entered the changes there and now it all works fine!

Yay!
Diggsey
18
Years of Service
User Offline
Joined: 24th Apr 2006
Location: On this web page.
Posted: 11th Feb 2010 17:49
I have a feature suggestion:

A command to save and load an array, or part of an array to a file or bank. Seeing as you can get the format of UDT arrays, it should be possible to save out the data correctly. (You could even save out the format to make sure when loading that it is the same as was saved).

See this thread

IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 11th Feb 2010 18:32
Would you believe me if I told you that I already have a proof of concept already written in DBPro that uses my existing array and file plug-ins?

Unfortunately, it doesn't handle multi-dimensional arrays (the plug-in will), and it's not easy to use (the plug-in will be), especially if you aren't very familiar in the low-level manipulation of arrays.

I've got a fair bit on at the moment, but when things slack off a bit, this is on the list to be included for the next release.

Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 12th Feb 2010 12:18 Edited at: 12th Feb 2010 12:18
@ IanM,

Blimey O'Reilly! If you could create commands to load in and save out complex multi dimensional Arrays with UDTs on UDTs... that would be damn handy. I'd pay for that.

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
Manson_NS
20
Years of Service
User Offline
Joined: 4th May 2004
Location: Denmark
Posted: 18th Feb 2010 17:56
First of all thank you for a great batch of enhanced functionality Ian, many a bird wouldn't fly without this.

I am however wondering about the absence of the ability to move array items within an array? Getting the ptr to an array item is nicely working, why not set it all the same?

Basicly I am trying to sort array data, and have found that the only real possibility is to first insert an item at the destination, then set the data of the destiantion item equal to the original item, before deleting it - which just messes up an allready rather complex piece of code.
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 18th Feb 2010 19:02
Firstly, why can't you use the SORT ARRAY command?

Secondly, there are commands to also SWAP ARRAY ITEMS for pairs, and ROTATE ARRAY to shift items around your array in bulk.

Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 18th Feb 2010 21:06
@ IanM,

Re last post, any realistic chance of the full load/save udt multi dimension array type commands?

Also, totally off topic, do you know if any versions of DKShop/DKAVM work with v7.5+ DBPro and if yes, could you post some...?

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 18th Feb 2010 22:01
Quote: "any realistic chance"

Yes, there's a 100% chance. If you want to know why, well I've already written it and have been testing over the weekend and during the odd lunchbreak at work

Quote: "DKShop/DKAVM"

No idea as I don't personally have a use for them.

I do remember that one of the 7.4 beta's broke those plug-ins, one or two of mine, and Cloggy's, and despite the fact that I told Dmitry that I knew that there would be a fix in a later release, he 'fixed' his plug-ins to the broken beta and it broke again when the beta was fixed.

If you've got that release, then try looking for the 7.3 and prior version instead of the latest and see if that works. If not, then you'll need to get hold of him for another fix.

Duffer
21
Years of Service
User Offline
Joined: 9th Feb 2003
Location: chair
Posted: 18th Feb 2010 23:16
@ IanM,

Thanks for getting back on both scores. Have raised the second issue with Dmitry by email and you never know he might come back on that.

As for the super array commands, excellent. Talk about having your own data structure system in games....

a long time dabbler with DBC and DBPro with no actual talent but lots of enthusiasm...
tiresius
22
Years of Service
User Offline
Joined: 13th Nov 2002
Location: MA USA
Posted: 19th Feb 2010 20:35
SORT ARRAY holy cow! I was not looking forward to writing an Insertion Sort for my list of "game levels". What type of sorting algorithm do you use? I would like to be able to sort 300+ levels by name quickly.


A 3D marble platformer using Newton physics.
IanM
Retired Moderator
22
Years of Service
User Offline
Joined: 11th Sep 2002
Location: In my moon base
Posted: 19th Feb 2010 22:08
The default sort is an intro sort (quick sort, switching to insertion sort when the partition is small or switching to heap sort when the recursion depth becomes too deep), but you can also switch to a stable sort (in-place merge sort, switching to insertion sort when the partition is small), or a heap sort.

You can also implement a relatively fast insertion sort yourself using the ROTATE ARRAY command and a binary search on the sorted section of the array - one pass of that may be quick enough for inserting a new element at the end of an array and rotating it into place.

Login to post a reply

Server time is: 2024-11-21 22:26:10
Your offset time is: 2024-11-21 22:26:10