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 Professional Discussion / Terrain generation and texturing...

Author
Message
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 02:49 Edited at: 5th Sep 2011 02:52
I've finally got a perlin noise generator working to create a terrain height map. (I can use the same for clouds). I'll be building my terrain manually using Make Object New and the Vertexdata commands. The problem I'm having at the moment is how to go about texturing it.

I'd like to texture it with three different heights of the terrain and I'm trying to avoid texturing square plains so it doesn't look blocky.

Although my perlin noise code is in C++ I can proto type the terrain texturing in DBP using some of the images.



Will I have to generate one massive texture with a detail map? (hows that done) If so I can use ImageKit to work with the textures.

Any ideas of how to go about this?



Warning! May contain Nuts!
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 03:11
You cand do it with a a plain object, or with triangles. You can use the same way I was trying with my cylinder.


Cheers.

I'm not a grumpy grandpa
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 03:21
There's quite a few terrains out there that have different layers of textures, for grass, hills and snow-topped mountains. I'm just trying to figure out the best way around this...

If I can get this working soon I'll have some spare time to convert the Perlin Noise functions directly to DBPro.

It's the huge texture and using ImageKit that seems to be the only way so far.

Warning! May contain Nuts!
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 03:26
Have you seen Green Gandalf example, with blended images ?

Chs.

I'm not a grumpy grandpa
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 03:28 Edited at: 5th Sep 2011 05:21
Yes, but I'm guessing that would require a very large texture image for a very large terrain. I might have to go down that route and see how these detail maps work...

Warning! May contain Nuts!
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 03:54 Edited at: 5th Sep 2011 11:39
Don't you like Advanced Terrain, where you can make a big terrain with a small image, and give a detail map ?. I have done a terrain editor with this kind of mesh, and I don`t need to load any texture, but generate it with the same program .

This terrain was made with a heightmap 100*100, and the programm generate the terrain texture.




Edited I scaled a bit the image, as it was too big sorry.

Cheers.

I'm not a grumpy grandpa
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 04:59 Edited at: 5th Sep 2011 05:21
So far I've got this working using my own height map. It's just the texture I'm trying to work on now.

I couldn't get Advanced Terrain to work with Pure GDK so I'm having to do it manually again.



All I need to do now is sort out the texture for different heights and to use a bigger height map.

So far I've got this:



EDIT: the height map is attached...

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 05:57
I am very curious to see this work. Keep up the good work.

"Son, I crap bigger then you !"
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 06:04 Edited at: 5th Sep 2011 06:10
Thanks JackDawson... Whilst I'm working on the texturing problem, which will be separated by different heights, (I'll probably use ImageKit for that) I'm going to convert the Perlin Noise functions so all DBPro users can have a go.

EDIT: I've just found this which should help http://www.flipcode.com/archives/Terrain_Texture_Generation.shtml

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 06:34 Edited at: 5th Sep 2011 06:37
I have my own Heightmap generator I am using. All I need is the way to texture the terrain without needing an image. I was hoping you were giving out the source, but I do understand if that's not what you want to do. If its a plugin, so be it. I really am not asking for a handout here. Although I guess I come across that way. I was more interested in how your doing it more then anything.

"Son, I crap bigger then you !"
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 06:39 Edited at: 5th Sep 2011 06:41
I'll be posting the source once I've sussed out how to do it anyway for any forum user. That's why I've set this thread up in case anyone has any pointers.

Most of my projects are done in C++ but sometimes I need to prototype something before converting to C++.

EDIT: The source for this at the moment is all in DBPro, but when it's working correctly I'll be adding to what I already have in Pure GDK.

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 07:37 Edited at: 5th Sep 2011 07:40
The DBP version of the source was the only thing I was interested in anyhow. So that is perfect. I am using this for a DBP project I have going on.

In case you have not seen my project, here is the link.

http://forum.thegamecreators.com/?m=forum_view&t=188775&b=1

My updated source code and current demo is at the bottom of the thread.

@ chafari, hey bro, its not that I would not want to use Advanced Terrain as far as I am concerned. Its about NOT having to use plugins is why I am doing what I am doing. So far, I have no plugins. And I can already generate a terrain and walk on it. I am slowly adding all kinds of features once my fog issue gets fixed. Although I am not sure when that will be if at all anytime soon that is. Its a DBP problem so far, unless one of the coders figures out a way around it. I am also doing my project as a learning project. Not relying on plugins is how I have been learning this so far.

"Son, I crap bigger then you !"
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 11:32
@WLGfx
You'v got your mesh working, this is the most importan. I like the flashlight you add , now I can't figure out how will you add a big texture to whole mesh.


Yesterday night, I didn't understood you when you suggested me to make an array in my project. You were right...I could increase both variables at the same time. I think I'll be able to fix it


I'll check all your future updates


Quote: "hey bro, its not that I would not want to use Advanced Terrain as far as I am concerned. Its about NOT having to use plugins "


Time ago I thought like that bro, that's why I was and I am very fond of code challenge, making or trying to make all objects by myself, but we use them every day as Dbpro has many plugins that come include.

Cheers.

I'm not a grumpy grandpa
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 17:42
@ chafari It just dawned on me that Advanced Terrain is included with dbp isn't it ? It never crossed my mind until you just said it. I am trying to stick with the default install ( as well as updates ) to DBP only. I bought many of the plugins, but I still would rather stick with the DBP defaults so I can learn as much as I can with it. I think I will have to look into Advanced Terrain after all. Thanks for setting me straight there.

"Son, I crap bigger then you !"
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 17:53
I'm just in the middle of finishing off the DBP version of the perlin noise functions so anyone can generate clouds and terrain. Just stuck with getting the 'power of' something.

I'll come up with the texturing after a few tests.

@JackDawson - I noticed your code a few days ago. I'm working on a big game and this is going to be a major part of it so I can generate millions of terrains with alien type of landscapes, etc. I also couldn't get the Advanced Terrain working with PureGDK. :-(

@chafari - Made up you sussed it out. You were probably too tired last night. I was up until 6am messing about with my code and getting nowhere.

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 18:00
Quote: "I noticed your code a few days ago. I'm working on a big game and this is going to be a major part of it so I can generate millions of terrains with alien type of landscapes, etc."


Yea that was similar to my thoughts on what I am doing as well. Although I am more focused on "earth like" terrain at the moment. I noticed there was no code on this forum or in the code snippets section that shows what I am doing, so I wanted something that can be used by others. Good luck on your quest though, I look forward to seeing it.

"Son, I crap bigger then you !"
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 18:56 Edited at: 5th Sep 2011 19:06
If there's anybody good at maths or can spot anything wrong with this code: (pweeeease)


Does DBPro (a) handle doubles? (How? they don't show up properly) (b) the number "0.931322574615478515625e-9" is it valid in DBPro?

The entire testing code is this:



Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 19:05 Edited at: 5th Sep 2011 19:13
I'm testing it out now, but from what I see if you want to get result to display anything like that you need to change result from a float to a DOUBLE INTEGER. If your computer can handle _int64 that is. _int64 is a C/C++ comparison. And yes DBP can handle up to DOUBLE INTEGER. The DI is roughly 8 Bytes. It can range from -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807. That's the max you can do with DBP.

Change :
result as float

to

result as double integer

Hope this helps.

EDIT : I have attached a screen shot. Is this what you see ?



"Life is like a box of chocolates.. eat it before it melts."
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 19:08 Edited at: 5th Sep 2011 19:10
I've just fixed "col = h#" in the "generate_noise_map()" function but still it didn't solve it.

I'm referring to double floats. They don't show up coloured in the IDE.

EDIT: I'll go spare if it's a simple typo error... Grrr...

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 19:14 Edited at: 5th Sep 2011 19:23
Haha we are posting at the same time. See if that picture I posted above is what your seeing. Could be something entirely different.

And your correct, the IDE does not show all of the Types in color.

EDIT : I am so dence at times.. I realized your talking about Floats, not integers.. yea the Double Integer only has 15 digits total that it can hold. That's the MAX. Its an 8 Byte Type. Your code shows way over that.

Quote: "Does DBPro (a) handle doubles? (How? they don't show up properly) (b) the number "0.931322574615478515625e-9" is it valid in DBPro?"


So in the end the answer to that would be no, its not valid. Sorry bro.

"Life is like a box of chocolates.. eat it before it melts."
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 19:25
Yep, that's exactly what I get at the moment. The C++ Perlin Noise code works great but the converted code into DBPro doesn't. Yet!



Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 19:31 Edited at: 5th Sep 2011 20:07
Yea, I have found a few limits / bugs to DBP. But it wont stop me from using it. Still a great compiler. I guess I'm just a glutton for punishment.

EDIT : I meant to explain earlier that t should be a DOUBLE INTEGER as well since you have it set to add such a high number.

t as DOUBLE INTEGER // Changed

t = (n * (n * n * 15731 + 789221) + 1376312589) and 0x7fffffff // I added this comment. Your HEX = 2147483647 in Decimal

result as DOUBLE FLOAT // Changed

Also at the bottom you have this :

result = t
result = 1.0 - t * 0.931322574615478515625

The first result is always getting overwritten by the second parameter no matter what t sends to result. So one of those two should be commented or taken out.

ALSO can you attach a screen shot of what its supposed to look like ? You said you have it working for DarkGDK, so I am guessing you can take a screen shot there as well ?

"Life is like a box of chocolates.. eat it before it melts."
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 20:32
Still no joy and I've changed everything to double floats just in case. Now that I've ignored what the editor is showing but it compiles and runs.

This is the DBPro code :


And this is the C++ code :


I've had both of them sat side by side trying to find out what is wrong with the DBPro version...

Thanks JackDawson, I fixed that typo but still no joy. The screen shot above is what it should be producing. I've also set some of the values to the Perlin Noise generation code to create different noise maps. Nothing...

I'm very determined...

Warning! May contain Nuts!
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 20:35 Edited at: 5th Sep 2011 22:41
Hi there.
@WLGfx I'm the same boat as JackDawson, your script doesn't work to me.

@JackDawson. I prefer sometimes to do things by myself, and this is an example of how to make a matrix of triangles.

I found with your help the way to texture correctly all triangles at once. In this example that every body can implement, I used just 50x50=5000 triangles.

Atached complete example




I hope it can help someone .
Cheers.

I'm not a grumpy grandpa
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 20:35
Quote: "The screen shot above is what it should be producing."


Uhmm which screen shot. The one I am showing or yours ? If mine is the case, then it means it worked since I did that in DBP. So please clarify what exactly I am supposed to be looking for. I'm a little confused on this now. Then once I know what I'm looking for, I'll see if I can help.

"Life is like a box of chocolates.. eat it before it melts."
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 20:41

The same as before, the little thumbnail is the perlin generated height map. That height map was produced using the C++ Pure GDK version.


Which is almost exactly the same as the DBPro version.

It's got to be a typo somewhere but I think I'm going crazy and blind staring at two pieces of code for hours...

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 20:47 Edited at: 5th Sep 2011 20:49
WAIT. .I get that too.. with your other code....



Like this... Is this what your after in DBP ? It works for me.



The camera is set below the terrain level. So with the arrow keys I can just move up above the terrain.

"Life is like a box of chocolates.. eat it before it melts."
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 20:52
This is the same example above !! it works for me too, so something wrong hapens in your last update.

I'm not a grumpy grandpa
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 20:55 Edited at: 5th Sep 2011 21:04
I think I finally understand what he is after. He is trying to create the heightmap on the fly like I am doing in mine. And then it show up on the top left and then use it as the Terrain. Am I close ? If that's all, then yea I'll see if I can help you out there. Now that I know what your wanting.

EDIT : The problems I am seeing when I compared your code is you have some floats where integers should be and integers where floats should be. I'll see if I can work the problem.

"Life is like a box of chocolates.. eat it before it melts."
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 21:05
Someone has tested my code above ?

Cheers.

I'm not a grumpy grandpa
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 21:09 Edited at: 5th Sep 2011 21:12
With the code side by side, (C++ works perfect) I think I've got 99.9% of it converted correctly.

C++ "double" in DBPro is "double float". I've changed all of that around.

The first code snippet loaded up a pre-generated height map which was produced by the C++ version. JackDawson and chafari, sorry for the confusion. I am trying to create it now on the fly.

I've hardly got any hair left to pull out.

EDIT: The main reason for me doing it this way is that you can do what you can do to any other DBPro standard object with it. ie, bump mapping, collision. And not be restriction to just terrain commands...

Warning! May contain Nuts!
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 21:13 Edited at: 5th Sep 2011 21:16
@chafari - Just checking it now...

EDIT: I'm currently getting a blank blue screen with the FPS...

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 21:16 Edited at: 5th Sep 2011 21:18
@ chafari, I tested your code. Your not using Matrix commands. You have everything set to Objects. So you cannot update a Matrix since there is no Matrix created yet. Once you create the Matrix you have to use the UPDATE MATRIX command to actually make it visible for the camera. All I see as of right now is your blue screen with the frame rates. On top of that, if your going to use objects, you still have to use the CREATE TERRAIN command if your not going to use a Matrix.

"Life is like a box of chocolates.. eat it before it melts."
Pincho Paxton
23
Years of Service
User Offline
Joined: 8th Dec 2002
Location:
Posted: 5th Sep 2011 21:20
I just get a blue screen as well.

WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 21:23
I'm still getting a flat terrain with mine. Gonna stare at two pieces of code again for a little while longer...

Warning! May contain Nuts!
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 21:23
Quote: "All I see as of right now is your blue screen with the frame rates"


Have you got IanM's plug-in ?, I think you need it just to handle the grid of objects. I don't use any system but my own system joining tryangles.

Cheers.

I'm not a grumpy grandpa
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 21:23
@ WLGfx I was referring to your DBP code. You have floats where integers should be and integers where floats should be. I'm working to fix it now.

An example of what I mean, is if you see something like 0.0f in C++ then you should have that set as a float. AND on top of that, as long as its not BitWise conversions you can use double float. Otherwise your program will error out. If in the C++ you see whole numbers such as your _amplitude, it should be Integer or Double Integer depending on what kind of numbers it is to handle. Remember a heightmap MUST be set in such a way that it is from 0 to 255. ( 256 total ). The reason a heightmap is max of 256 ( 0 to 255 ) is because its a grey scale your working with. If you go higher then that, your actually bombing DBP out and so it bypasses it and will result in a 0 everytime. Meaning flat terrain like in your example. That is known as an integer. See the differences now ?

"Life is like a box of chocolates.. eat it before it melts."
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 21:27
It is strange , I use windows vista and works fine. Try with this new exe in the same folder.


Cheers.

I'm not a grumpy grandpa
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 21:27 Edited at: 5th Sep 2011 21:31
@ chafari Ahhh another plugin.. ok no wonder. No I am not using any extra plugins. I didn't realize you were using a plugin for that.

EDIT : When I tried your EXE with no textures this is what I get.



When I tried your EXE WITH the textures I get ONLY a blue screen with the frame rates.

"Life is like a box of chocolates.. eat it before it melts."
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 21:31
The Perlin Noise generation returns a height (with the PN_amplitude set to 0.99999999) value from between -1.0 and +1.0, so I just multiply that by 127 then add 128 to give me a value between 0 and 255. I'm using exactly the same formula as the C++ version. These are shown in the C++ code above.

The only integers are the _octave count and the _randomseed vars. Apart from the last function which takes x and Y as integers.

Apart from that, the code is going oh so jumbly before my eyes... I'll probably need a kip before I go stare crazy. lol

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 21:37 Edited at: 5th Sep 2011 21:42
Quote: "The Perlin Noise generation returns a height (with the PN_amplitude set to 0.99999999) value from between -1.0 and +1.0"


Ok but thats the problem. A Float maxes out with 7 digits. Your showing 8. So yea I guess a Double Float in this case would need to be used. IF it was a float. But according to the C++ its an integer.

( EDIT : In your PerlineNoise function you have it set to double _amplitude )

amplitude = 0;
amplitude = _amplitude;

Meaning your taking a Float and changing it to an integer which will come out as 0 every time, making your terrain flat.

Example : If you have a float of 0.999 and you copy that to an integer it will come out as 0

"Life is like a box of chocolates.. eat it before it melts."
Pincho Paxton
23
Years of Service
User Offline
Joined: 8th Dec 2002
Location:
Posted: 5th Sep 2011 21:38
I still get a blue screen.

chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 21:39 Edited at: 5th Sep 2011 21:40
What you should see, is an image like that:




I'm not a grumpy grandpa
Pincho Paxton
23
Years of Service
User Offline
Joined: 8th Dec 2002
Location:
Posted: 5th Sep 2011 21:42
Nope, just blue.

chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 21:42
Sorry for double post, I need it to upload the .x file.

This is the .x file you can generate with this program.Attached

Cheers.

I'm not a grumpy grandpa
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 21:43
Yea, that's not coming up since I do not have your plugin you mentioned earlier when I try to compile. BUT its also not coming up with your EXE you made for us either. I just get a blue screen with FPS.

"Life is like a box of chocolates.. eat it before it melts."
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 21:44 Edited at: 6th Sep 2011 18:53


Are the class declarations in C++.

Where are you seeing the int/float clash?

Warning! May contain Nuts!
JackDawson
14
Years of Service
User Offline
Joined: 12th Jul 2011
Location:
Posted: 5th Sep 2011 21:53 Edited at: 5th Sep 2011 22:03
@ WLGfx, anytime you see where it assigns a variable in C++ as a Double, it mean its a Double Float. ( 15 Digits ) And according to the C++ example that you provided, its taking the Double Float and converting it to an Integer.

If I understand you correctly your trying to match C++.




Meaning this function below is not accurate.
Your DBP Version


Double in C++ means Double Float in DBP.

Meaning this should NOT be a float but an integer. ---> PN_amplitude

but according to other calculations they should be double floats and not floats.

EXAMPLE : You have "_amplitude as float", when it should be a Double Float. Same with _persistence and _frequency.

See what I am getting at now ?

"Life is like a box of chocolates.. eat it before it melts."
chafari
Valued Member
20
Years of Service
User Offline
Joined: 2nd May 2006
Location: Canary Islands
Posted: 5th Sep 2011 21:56
I have tested in my old desktop, and I see a blue screen too. I will checkit again

Cheers.

I'm not a grumpy grandpa
WLGfx
18
Years of Service
User Offline
Joined: 1st Nov 2007
Location: NW United Kingdom
Posted: 5th Sep 2011 22:16
Yep, I've done that in this: (I did post it again above)



Warning! May contain Nuts!

Login to post a reply

Server time is: 2026-07-10 06:08:21
Your offset time is: 2026-07-10 06:08:21