Time |
Nick |
Message |
00:00 |
Taoki |
Can't be the same thing though... that's from 2010. No one would have left a bug like this unfixed for 3 years x.x |
00:02 |
Taoki |
http://irrlicht.sourceforge.net/forum//viewtopic.php?p=212465 |
00:03 |
Taoki |
Wait... |
00:03 |
Taoki |
PilzAdam: By any chance, does Minetest still send mapblocks each frame to the GPU when this is enabled? |
00:03 |
Taoki |
Or only once when they're loaded or updated? |
00:04 |
PilzAdam |
ummm.... |
00:05 |
Taoki |
The last link I posted is a story about that. Seems it's not an Irrlicht bug, and someone else who got this was sending the mesh each frame while VBO was enabled |
00:05 |
Taoki |
PilzAdam: Another interesting function is mentioned, also: driver->updateAllHardwareBuffers() It's said it might solve the issue if called at the right time |
00:06 |
Taoki |
That might be better than the buffer loop we used at first (or together with it) |
00:07 |
Taoki |
"updateAllHWBuffers is called in endScene, which means it is called at least once per frame, for RTTs even more often." ---- "But at least we don't have any mem leak here, since the link is automatically removed during the app run, or at least at the end in the driver destructor." |
00:07 |
kahrl |
updateAllHardwareBuffers is a function in CNullDriver and it can't be called from outside |
00:07 |
Taoki |
ahh :/ |
00:08 |
Taoki |
No way to get cnulldriver in mapblock_mesh? |
00:09 |
kahrl |
CNullDriver is the base class of every implementation of IVideoDriver |
00:09 |
kahrl |
but you can't include its header file |
00:09 |
kahrl |
you could walk the vtable by hand, I guess |
00:09 |
Taoki |
ok |
00:10 |
Taoki |
PilzAdam: So I think the first step is to check if Minetest still spams mapblocks every frame to the GPU (if yes that's likely it). Another thing to try is somehow calling updateAllHardwareBuffers which could be a likely fix, if we manage get to it |
00:11 |
kahrl |
uhm |
00:11 |
kahrl |
endScene calls that anyway so it wouldn't be a fix |
00:11 |
|
ch98 joined #minetest-dev |
00:12 |
Taoki |
It's not in the minetest source. The later thread described that as a fix I think |
00:18 |
kahrl |
wait... how does this even work |
00:18 |
Taoki |
kahrl: http://irrlicht.sourceforge.net/forum//viewtopic.php?p=212465 (someone who seems to have had our story, or at least similar) |
00:19 |
kahrl |
I saw that |
00:19 |
kahrl |
okay... someone explain to me how this works |
00:20 |
Taoki |
Haven't fully understood it myself. But the guy at the end said that solved it so :P |
00:20 |
kahrl |
animations such as torches make changes to the mesh every few frames |
00:20 |
kahrl |
but nothing ever calls IMeshBuffer::setDirty |
00:20 |
kahrl |
so the VBO would contain outdated mesh data |
00:21 |
kahrl |
still, when I enabled the EHM_STATIC flag torches showed up fine |
00:21 |
Taoki |
I think torches animate fine. I'll check |
00:21 |
Taoki |
ah, ok |
00:23 |
kahrl |
well this is a bad example because this only changes materials |
00:23 |
kahrl |
which are handled outside of the VBO |
00:23 |
kahrl |
(I think) |
00:23 |
Taoki |
Animated torches and water work fine for me, so no issues there |
00:24 |
kahrl |
does day-night transition work when shaders are disabled and VBO is enabled? |
00:25 |
Taoki |
will check |
00:25 |
PilzAdam |
only some blocks get darker |
00:25 |
PilzAdam |
(only the ones that are more far away from the player) |
00:26 |
PilzAdam |
(looks really weird) |
00:26 |
PilzAdam |
when moving arround then the blocks get updated |
00:26 |
Taoki |
Yep. It works but MUCH slower and some areas remain darker |
00:27 |
PilzAdam |
Taoki, this means it doesnt work ;-) |
00:27 |
Taoki |
I guess :P |
00:29 |
Taoki |
I need to go now, pretty late. Anything else I can do before I leave to help with this? |
00:29 |
Taoki |
Really wouldn't wanna see the feature not make it ;( |
00:30 |
kahrl |
adding "buf->setDirty();" in the place where MapBlockMesh::animate() does day-night transition fixes it, as expected |
00:31 |
Taoki |
Awesome! Means the memory leak is the only remaining issue |
00:31 |
kahrl |
actually I guess that could have a EBT_VERTEX parameter |
00:33 |
PilzAdam |
that doesnt fix the leak, though |
00:34 |
kahrl |
right |
00:34 |
kahrl |
anyway I tested "buf->setDirty(irr::scene::EBT_VERTEX);" and it works as well |
00:36 |
Taoki |
PilzAdam: Random idea (3:30 am and more and more tired): Could you add a debug print specifying the memory of each map block? That could be used to determine if the memory leak is caused by that, if it prints out more and more memory entrioes |
00:36 |
kahrl |
perhaps add a comment in animate() that tells people to add setDirty calls if they are needed |
00:37 |
Taoki |
eg: If each mapblock call prints 10 MB each second, we know it leaked 100 mb in 10 seconds |
00:37 |
kahrl |
Taoki: how would that number be calculated? |
00:38 |
Taoki |
Right. If that's not possible, we can add a simple debug print. Then have the minetest console on one side, and the memory viewer in another. We can notice if the debug print is always printed the moment memory increase spermanently |
00:38 |
kahrl |
irrlicht makes it hard to get the amount of video memory allocated for VBOs |
00:38 |
Taoki |
*increases permanently |
00:38 |
Taoki |
spermanently LOL |
00:42 |
Taoki |
But interestingly, I feel the removeHardwareBuffer doesn't decrease the leaks for me. Maybe something is going wrong there, or something else is needed |
00:43 |
Taoki |
Leaks seem to be the same for me both with and without that |
00:46 |
|
ecube joined #minetest-dev |
00:47 |
PilzAdam |
are you sure about that? |
00:47 |
Taoki |
Not 100% but I got that impression |
00:47 |
Taoki |
I'll test once more before I leave |
00:47 |
|
dexter0 joined #minetest-dev |
00:48 |
Taoki |
Seems that when I'm not removing the buffers, VBO improves performance even more |
00:49 |
|
kaeza joined #minetest-dev |
00:50 |
PilzAdam |
I think that the leak worse when not cleaning up the hardware buffer |
00:50 |
PilzAdam |
+is |
00:50 |
Taoki |
Ok, I think it is a little bit worrse without clearing the buffers |
00:51 |
Taoki |
But for some reason, not clearing the buffers gives even faster FPS |
00:52 |
Taoki |
Well no, it doesn't make it faster actually. Those things are hard to tell |
00:52 |
Taoki |
Seems to be as fast in both cases. But yeah without the buffer clearing the leak is even worse, so I was wrong |
00:53 |
Taoki |
Or maybe halfway wrong; When clearing the buffers, there's a very discrete jitter as you move around. |
00:53 |
Taoki |
**look around |
00:53 |
Taoki |
That's why it felt faster. It jitters a little bit, probabiy because of having to re-buffer every now and then |
00:56 |
Taoki |
Time for me to head off. Night and good luck... I'm hopeful this has a solution that will soon be found |
01:52 |
|
diemartin joined #minetest-dev |
02:01 |
|
OWNSyouAll_DESKT joined #minetest-dev |
02:39 |
|
ecube joined #minetest-dev |
03:18 |
|
ecube joined #minetest-dev |
03:18 |
|
ecube joined #minetest-dev |
03:36 |
kaeza |
hmmmm, the sources related to Lua entities may be of help |
03:37 |
kaeza |
i.e. you can store values in them (not directly, but thru the table returned by get_luaentity()) |
03:37 |
kaeza |
and the `object' field of such table points back to the userdata |
03:37 |
hmmmm |
hey, uh, can you call a zero-argument function without parentheses? |
03:38 |
kaeza |
I don't think so |
03:38 |
kaeza |
it would be ambiguous |
03:39 |
VanessaE |
only if it's part of a callback e.g. on_place = foo, |
03:39 |
hmmmm |
that's an assignment |
03:39 |
VanessaE |
yep I know. |
03:39 |
VanessaE |
only place I've ever seen it done though. |
03:40 |
kaeza |
VanessaE, "foo = bar" != "foo = bar()" |
03:40 |
kaeza |
the former increments a reference to a function |
03:40 |
kaeza |
the latter assigns foo the value returned by the function call |
03:40 |
hmmmm |
literally every single example i've read talks about how to assign methods |
03:41 |
hmmmm |
i know how to do what i want to do, but it's really ugly |
03:41 |
hmmmm |
set __index to my own handler, manually check for the fields i want to set, and so on |
03:41 |
hmmmm |
okay, this turned out to not be worth it |
03:42 |
hmmmm |
i'm doing all this stuff for basically no advantage except slightly uglier syntax |
03:43 |
kaeza |
well, another way would be thru accessor methods |
03:43 |
kaeza |
a-la Java |
03:43 |
hmmmm |
that's what the consensus is |
03:44 |
hmmmm |
if you need to get or set a member value, you use a method instead of setting the actual field of that object |
03:44 |
hmmmm |
but yeah, i'm giving up on this.... i just blew like an hour reading lua documentation and i got almost nowhere |
03:46 |
kaeza |
what are you trying to do? |
03:46 |
hmmmm |
git checkout src/script/lua_api/l_vmanip.cpp |
03:46 |
hmmmm |
that's what i'm doing |
03:46 |
VanessaE |
hmmmm: if by 'documentation' you mean the PiL, I'm not surprised you had to give up. :) |
03:47 |
hmmmm |
vanessae, i think what i'm trying to do is quite a bit more obscure as well |
03:47 |
VanessaE |
perhaps |
03:47 |
hmmmm |
wanted to directly get/set fields of the current class |
03:47 |
hmmmm |
so you can do vm.data[index] = c or whatever |
03:48 |
hmmmm |
instead of having to handle three return values from read_chunk |
03:48 |
VanessaE |
if you're passing multiple fields, is there a reason you can't just pass/return a table? |
03:50 |
hmmmm |
it just doesn't make sense from a style point of view as well as functional |
03:50 |
VanessaE |
well I dunno about that. |
03:50 |
VanessaE |
such a thing is quite easy to read and code for, from the Lua side anyway |
03:50 |
kaeza |
hmmmm, so vm is the VoxelManip, and it's an userdata? |
03:51 |
hmmmm |
yeah |
03:51 |
kaeza |
how about: local t = vm:get_data(); <do something with data> vm:set_data(t) ? |
03:51 |
hmmmm |
because that defeats the purpose of it all |
03:52 |
kaeza |
ah derp |
03:53 |
hmmmm |
i'm done with it, anyway |
03:55 |
kaeza |
getting fields thru a metatable is no faster than calling a method |
03:59 |
hmmmm |
also i dunno if anybody noticed it but my fast lighting makes water a shade too bright |
04:00 |
VanessaE |
hmmmm: I have noticed unexplained variances in water lighting, yes. |
04:00 |
VanessaE |
(whether your lighting code is the cause, I dunno) |
04:01 |
|
diemartin joined #minetest-dev |
04:05 |
kahrl |
VanessaE: I've seen those as well |
04:05 |
kahrl |
example: go to an ocean, grab a water node with a bucket, place it back |
04:05 |
VanessaE |
yes |
04:05 |
VanessaE |
I've done/noticed that |
04:06 |
VanessaE |
pointed it out once, with screenshot (probably in #minetest though) |
04:06 |
VanessaE |
didn't file a github issue at the time probably out of frustration. |
04:06 |
hmmmm |
frustration? it's really that horrible? |
04:07 |
hmmmm |
it's a game |
04:07 |
VanessaE |
hmmmm: not with the game, likely with someone or another in the channel at the time. |
04:08 |
VanessaE |
you know how it is, someone pisses you off about some random subject (or just acts like an ass in general), you get distracted and opt not to do things you'd otherwise have done at the time. |
04:22 |
|
diemartin joined #minetest-dev |
04:31 |
|
neko259 joined #minetest-dev |
04:54 |
|
ssieb joined #minetest-dev |
05:30 |
|
ecube joined #minetest-dev |
05:49 |
|
ecube joined #minetest-dev |
06:10 |
|
ecube joined #minetest-dev |
06:15 |
|
darkrose joined #minetest-dev |
06:15 |
|
darkrose joined #minetest-dev |
06:37 |
|
ecube joined #minetest-dev |
07:00 |
|
ecube joined #minetest-dev |
07:16 |
|
diemartin joined #minetest-dev |
07:19 |
|
celeron55 joined #minetest-dev |
07:24 |
|
Calinou joined #minetest-dev |
07:30 |
|
arsdragonfly joined #minetest-dev |
08:47 |
|
ImQ009 joined #minetest-dev |
08:51 |
|
darkrose joined #minetest-dev |
08:51 |
|
darkrose joined #minetest-dev |
09:38 |
|
Taoki joined #minetest-dev |
09:55 |
|
rsiska joined #minetest-dev |
09:58 |
|
proller joined #minetest-dev |
10:04 |
|
iqualfragile joined #minetest-dev |
10:08 |
Taoki |
Back. Seems the memory leak issue wasn't fixed since yesterday. I'll try to test it myself more just in case during today |
10:09 |
Calinou |
I don't notice any memory leak when playing, personally |
10:09 |
Calinou |
sapier fixed a lot recently |
10:10 |
Taoki |
Calinou: We're testing a new feature which enables the use of vertex buffers and improves performance hugely |
10:10 |
Taoki |
That's what's leaking and it didn't go upstream yet for that reason |
10:16 |
Calinou |
oh, finally VBOs |
10:16 |
Calinou |
there are, but it eats a lot of RAM, already tried |
10:16 |
Calinou |
c-fifty-five told me that :P |
10:22 |
Taoki |
Calinou: That's the problem we're trying to solve |
11:11 |
|
ImQ009 joined #minetest-dev |
11:29 |
|
PilzAdam joined #minetest-dev |
11:54 |
Taoki |
PilzAdam: Can I ask a big favor regarding schematics? Would it be acceptable to add a third parameter to minetest.create_schematic() specifying angle? I'm adapting my structures mod to use this, and it works perfectly well but I can't use any angles. |
11:54 |
Taoki |
0, 90, 180 or 270 |
11:55 |
Taoki |
Surely other mods could use this too, there can be many cases in which you'll want to import schematics at various angles |
11:55 |
PilzAdam |
I have nothing todo with it, ask hmmmm |
11:55 |
Taoki |
Ah, ok |
12:14 |
Taoki |
PilzAdam: When can we get to debugging that memory leak again, if you're not busy? |
12:14 |
Taoki |
I have time about 2 hours from now until I have too go for a few hours, then I'll be back. So I can now |
12:16 |
PilzAdam |
I read in the Irrlicht forums that it needs some time until the memory is freed |
12:19 |
Taoki |
Interesting. So maybe it's normal that it works like that? Why is only Minetest getting such big memory usage with it and not other applications though? |
12:20 |
|
tango_ joined #minetest-dev |
12:20 |
Taoki |
There has to be something wrong and that can be fixed in Minetest too |
12:20 |
PilzAdam |
client_unload_unused_data_timeout = 30 in minetest.conf seems to stop it |
12:21 |
Taoki |
Hehe, it was that easy after all |
12:21 |
Taoki |
I was partly right that Minetest still sending (or not lunloading) things on its own was a cause |
12:22 |
Taoki |
PilzAdam: And reason why that can't be defaulted to 30? If it can it should all be fine then |
12:22 |
PilzAdam |
this is not useable for laggy servers |
12:23 |
Taoki |
30 seconds is way more than enough to keep unused data in the client |
12:23 |
Taoki |
hmm... |
12:23 |
PilzAdam |
default is 10 minutes |
12:23 |
Taoki |
That sounds more than enormous |
12:24 |
Taoki |
How laggy would a server have to be to require clients keep unloaded data more than 30 seconds though? I don't think that would be any worse than just exploring in one direction after you log in, so it shouldn't make a difference |
12:26 |
Taoki |
Many players go exploring for example, so for them the server lag applies either way. This only helps players that go back and forth a lot and roam around the same area for very long amounts of time. |
12:26 |
Taoki |
It would be safe to assume that if someone leaves an area for a 60 seconds for example, they might not be coming back |
12:29 |
VanessaE |
the solution to that is simple: have the client cache the map data that is received during the current session. The server sends change events anyway, right? |
12:29 |
Taoki |
That could work too |
12:29 |
VanessaE |
cache on disk I mean. |
12:30 |
Taoki |
VanessaE: Imagine if we did that even after leaving a server, and the client would stor eper-server caches on drive. The world would load instantly when I'd come to your server, and only changes would be applied if needed :) |
12:30 |
VanessaE |
yep |
12:30 |
VanessaE |
create some kind of limit on the total size of the cache (google earth for example limits it to 2GB) and it should work. |
12:31 |
Taoki |
PilzAdam: For now, would it be acceptable to commit the VBO setting (disabled by default) with a note that you must set client_unload_used_data to very low values? |
12:32 |
Taoki |
PilzAdam: Or, in the Minetest code, we could add a limit to the unload values when the VBO option is enabled. Though that would kinda suck and the minetest.conf comment would be best |
12:33 |
PilzAdam |
with 120 Minetest takes about 900 MiB RAM for me |
12:34 |
Taoki |
Hmm... not bad I guess. Anyone woith a video card that properly supports VBO should have way more than $GB of ram at this day |
12:34 |
Taoki |
*4GB |
12:34 |
Taoki |
I prolly won't set that past 60 myself, don't see how it could help me even on a laggy server (theoretically I can, but not in practice) |
12:36 |
Taoki |
Personally I'd say default it to a minute without any worries |
12:37 |
|
salamanderrake joined #minetest-dev |
12:37 |
VanessaE |
I'd opt for 20 seconds, perhaps even less, if the world were cached on the client. |
12:38 |
Taoki |
I'd opt for 30 seconds even without client caching, but like PilzAdam said some servers can be laggy, so 60 should be fine in current circumstances |
12:38 |
VanessaE |
true |
12:38 |
Taoki |
I mean, if you leave an area for 60 seconds it's most likely you left it permanently / for a while |
12:39 |
Taoki |
Not always the case, but I think that tends to be the more likely scenario |
12:39 |
PilzAdam |
there is no reason to decrease that setting if vbo is off |
12:39 |
Taoki |
PilzAdam: What about splitting the setting? One is applied with VBO, the other without it |
12:40 |
Taoki |
client_unload_unused_data_timeout_normal, client_unload_unused_data_timeout_vbo |
12:40 |
Taoki |
Not the prettiest way but it sounds like that works best |
12:41 |
|
jojoa1997 joined #minetest-dev |
12:42 |
Taoki |
The real solution though would indeed be caching. Minetest shouldn't send every piece of unused data to the video card |
13:05 |
|
Naked joined #minetest-dev |
13:30 |
|
proller joined #minetest-dev |
14:10 |
|
Zeg9 joined #minetest-dev |
14:12 |
|
PilzAdam joined #minetest-dev |
14:26 |
Taoki |
PilzAdam: Got to go for an hour or two soon. Did you find a way to properly divide that setting? |
14:26 |
PilzAdam |
we shouldnt devide that setting |
14:26 |
PilzAdam |
no other settings do this |
14:26 |
PilzAdam |
a note is enough, I guess |
14:30 |
|
iqualfragile joined #minetest-dev |
14:30 |
Taoki |
I agree |
14:36 |
Taoki |
BBL in 1-2 hours or so. Will test this once I'm back if it's upstream (hopefully there are no more problems now and it should work at last) |
14:37 |
Taoki |
Disabled by default of course |
14:38 |
|
proller joined #minetest-dev |
14:58 |
|
proller joined #minetest-dev |
15:19 |
|
Calinou joined #minetest-dev |
15:20 |
|
proller joined #minetest-dev |
15:51 |
|
dexter0 joined #minetest-dev |
16:01 |
|
proller joined #minetest-dev |
16:05 |
|
hmmmm joined #minetest-dev |
16:11 |
|
Jordach joined #minetest-dev |
16:13 |
|
mrtux joined #minetest-dev |
16:29 |
|
dexter0 joined #minetest-dev |
16:43 |
|
sdzen joined #minetest-dev |
16:45 |
|
neko259 joined #minetest-dev |
17:10 |
Taoki |
hmmm: I added support for using the schematics system to my structures mod. It's a lot faster, and this is even more correct for buildings than the upcoming voxel manipulator! So I'd like to use it permanently... but there are a few issues I was curious about. |
17:10 |
Taoki |
Wall, mostly one that's urgent: Will minetest.place_schematic support different angles (0, 90, 180, 270)? |
17:10 |
Taoki |
That's the main thing that's keeping me from being able to use it by default |
17:11 |
|
sdzen left #minetest-dev |
17:16 |
sfan5 |
Taoki: you could rotate the schematic file before placing it with lua |
17:17 |
sfan5 |
you would need LuaZlib to decompress and recompress the data however |
17:17 |
Taoki |
sfan5: Doesn't work for what I need. If it requires editing or exporting the actual file itself that way |
17:17 |
Taoki |
No, that would be a really bad way |
17:23 |
celeron55 |
to me it sounds like rotations should be supported in some way, dunno how exactly |
17:24 |
|
iqualfragile joined #minetest-dev |
17:24 |
celeron55 |
there are also fun things like facedirs that go with it that hmmmm will hate to even think about 8) |
17:24 |
hmmmm |
taoki, i already responded to this same question twice, and the answer is still yes |
17:25 |
hmmmm |
there will only be 4 rotations supported, vertical rotations |
17:25 |
Taoki |
Oh, ok. Yes, sounds great |
17:25 |
hmmmm |
but see the thing is, i'm not doing that right now, i'm doing something different |
17:25 |
Taoki |
hmmmm: There would be only one concern left: Will there be a way to know the size of a schematic before spawning it? That's a check I really need in my mid |
17:26 |
Taoki |
that's ok :P |
17:26 |
hmmmm |
nope |
17:26 |
hmmmm |
i guess you could read the file directly |
17:26 |
Taoki |
That works too, if there's a Lua function to do it |
17:26 |
Taoki |
Or a mix that would work |
17:26 |
hmmmm |
no, i am thinking completely lua |
17:27 |
sfan5 |
the is v3s32 right? |
17:27 |
sfan5 |
+size |
17:27 |
hmmmm |
i am not going to add an api to do something as trivial as extracting the size |
17:27 |
|
salamanderrake joined #minetest-dev |
17:27 |
hmmmm |
why would it be v3s32? |
17:27 |
sfan5 |
dunno |
17:27 |
PilzAdam |
hmmmm, is the information about the size in the file uncompressed/directly readable? |
17:27 |
sfan5 |
PilzAdam: yes |
17:27 |
hmmmm |
pilzadam, the file format is clearly documented, and everything is easy to retreive except the actual compressed data |
17:28 |
sfan5 |
only the node data is compresses |
17:28 |
sfan5 |
-s +d |
17:28 |
Taoki |
Nice. It should be possible to have a function that reads it from the file then |
17:29 |
PilzAdam |
hmmmm, and where is that documentation? |
17:29 |
hmmmm |
in the source, and somebody probably put it up on the developer wiki |
17:29 |
PilzAdam |
"clearly documented" == "read the source"? ok, lets rm lua-api.txt then |
17:29 |
Taoki |
That weird scenario where documentation means reading the source code :P |
17:30 |
hmmmm |
it's meant to be opaque to lua, but maybe it shouldn't be if you'd like to do things such as this |
17:31 |
hmmmm |
i guess it doesn't hurt to just make a page about minetest schematics on the developer wiki with the comment that describes the file format |
17:34 |
Taoki |
PilzAdam: Oh, and do any of the devs actually want a skydome system upstream? Like I told RBA, I find the concept really bad. Mostly cuz if I remember right, it involved an inside-out sphere mesh following the player around. |
17:34 |
Taoki |
Which is the scariest implementation for a sky ever |
17:36 |
PilzAdam |
dunno |
17:36 |
Taoki |
If we really want a skydome / cubemap sky, I believe it needs to be done properly; The shape (cube or sphere) should be generated in the code, no mesh file. It should also have no distance (unlimited distance) instead of following the player around |
17:36 |
Taoki |
Ok. I'll talk to RBA about it again perhaps. |
17:37 |
Taoki |
This is one of the few things I really wouldn't wanna see happening. Because the architecture and idea is very wrong. Even if again I appreciate RBA's work on it |
17:38 |
Taoki |
Really really bad hack for a sky. We'd instead want a way to map the sky image to the background / nothingness of the Irrlicht scene |
17:38 |
Taoki |
Which should be rather easy |
17:38 |
Taoki |
Well, I think. Don't know exactly how Irrlicht does it |
17:38 |
sfan5 |
Taoki: http://pastebin.com/g6r7YMJD |
17:39 |
Taoki |
sfan5: Nice. That can read the X Y Z size of the schematic file? |
17:39 |
sfan5 |
yes |
17:39 |
sfan5 |
it "should" |
17:39 |
sfan5 |
I haven't tested it |
17:39 |
Taoki |
ok. Thanks |
17:41 |
hmmmm |
do note that the node name table isn't too far away from what you just wrote |
17:42 |
hmmmm |
you could iterate through that and search for a specific node you're interested in, such as one that requires metadata you'd like to preserve |
17:42 |
Taoki |
Only need to know the box size of the schematic in this case |
17:43 |
hmmmm |
i am envisioning a function, create_schematic_with_meta() that calls create_schematic() like normal, but right after, opens it up and searches through the nodes used and checks for ones that require metadata; if so, then this is a special case and we open up the same area in the voxelmanip and scan for nodes of that type |
17:44 |
hmmmm |
then when we get the position, save the metadata to a separate file, like chest_meta.txt |
17:44 |
|
kaeza joined #minetest-dev |
17:44 |
Taoki |
Would be nice too |
17:44 |
hmmmm |
when you go to place_schematic_with_meta(), you merely call place_schematic like that, and then check for any such _meta.txt files, and if so, set it back |
17:45 |
hmmmm |
and this can be done entirely in lua without too much effort |
17:45 |
sfan5 |
Taoki: i tested it now, it works |
17:45 |
Taoki |
sfan5: Awesome... thanks |
17:45 |
hmmmm |
what i'm saying is that i'm sick and tired of the knee-jerk reaction to put anything that might take more than 15 seconds of thought as an API into the engine |
17:46 |
Taoki |
hmmmm: Any chance changes might be made to the shchematic format that could break the formula sfan5 found? |
17:47 |
sfan5 |
wat... nautilus identifies .mts as video/mpeg |
17:47 |
sfan5 |
Taoki: if changes are made you will probably find them here https://github.com/minetest/minetest/commit/c1b829077a3518f3a129eee11887b2358a53f20b#L1R658 |
17:47 |
sfan5 |
(not that url, but that file and line) |
17:51 |
|
arsdragonfly|pho joined #minetest-dev |
17:52 |
hmmmm |
taoki, no, steps will be taken to ensure strict backwards compatibility |
17:53 |
|
ssieb joined #minetest-dev |
17:53 |
Taoki |
oh, good |
17:55 |
celeron55 |
byt the way, where is it specified? |
17:55 |
celeron55 |
oh it was asked already |
17:55 |
celeron55 |
well if that is the answer, i'll ask one thing |
17:56 |
celeron55 |
hmmmm: it does have an explicit version field, right? |
17:56 |
PilzAdam |
yes, it has |
18:03 |
Taoki |
sfan5: Can I put that whole code in one Lua function? The one for checking schematic sizes |
18:04 |
Taoki |
PilzAdam: Sorry if I'm being annoying, but were all issues fixed with the last VBO code? Still not seeing it in upstream and looking forward to test it properly |
18:05 |
Taoki |
Going to bed earlier tonight too, waking up early tomorrow |
18:08 |
thexyz |
how's ignore_world_loading_errors supposed to work? |
18:09 |
thexyz |
*ignore_world_load_errors |
18:10 |
thexyz |
shouldn't it regenerate block right after it fails to load? https://gist.github.com/anonymous/829da999ea1a4e80edbd/raw/010939daae2d51162bee6e0c387e973e27da11e1/gistfile1.txt |
18:15 |
|
sweetbomber joined #minetest-dev |
18:17 |
sweetbomber |
hi |
18:17 |
sweetbomber |
i wanderes why does getId return CONTENT_IGNORE when a content name is not found... |
18:18 |
sweetbomber |
why not return CONTENT_AIR or something similar? content ignore just makes things look glitchy |
18:18 |
sfan5 |
Taoki: yes |
18:18 |
sfan5 |
sweetbomber: if theres something wrong, it should be shown to the user not ignored |
18:18 |
Taoki |
Thanks. Still trying to understand what it all means just to be safe :P |
18:19 |
sweetbomber |
sfan5: then something like a "block unavailable" block should be used |
18:19 |
PilzAdam |
sweetbomber, i.e. CONTENT_IGNORE |
18:20 |
sweetbomber |
i mean, with a texture saying that |
18:20 |
sweetbomber |
a block which allows seeing underground looks strange... |
18:20 |
celeron55 |
what getId? |
18:20 |
sweetbomber |
(correct me if im wrong, a content_ignore node makes underground visible, right? |
18:21 |
sweetbomber |
at least to me it does) |
18:21 |
celeron55 |
ignore is completely see-through for sure; it's as designed (that behavior is *needed* in where it is used) |
18:21 |
sweetbomber |
CNodeDefManager::getId |
18:21 |
celeron55 |
you should always check if CONTENT_IGNORE is returned if you work in C++ with a function that returns it rather than an exception |
18:22 |
celeron55 |
there are no excuses for not doing so |
18:22 |
sweetbomber |
celeron55: I agree with you |
18:22 |
Taoki |
What does the numver in file:read(#) mean? |
18:22 |
sweetbomber |
but when trying to get the ID of a block, given a content_name, it should not return content_ignore |
18:22 |
celeron55 |
eh |
18:22 |
celeron55 |
what should it return then? |
18:22 |
sweetbomber |
it should return something like a default:unkown |
18:23 |
sweetbomber |
which has as texture something that indicates that to the user |
18:23 |
sweetbomber |
*unknown |
18:23 |
celeron55 |
it's a design choice to use ignore as a "not found" return value |
18:23 |
sfan5 |
Taoki: read n bytes from file "file" |
18:23 |
celeron55 |
if you add yet another one, you just complicate everything |
18:23 |
sfan5 |
s/n/n number of/ |
18:23 |
celeron55 |
as it currently is, there are only two hardcoded ids, air and ignore, which is just about enough |
18:24 |
sweetbomber |
ill put things on the perspective im dealing: |
18:24 |
sweetbomber |
im implementing a structure generation system |
18:24 |
Taoki |
How do you read n bytes from a file? It takes a string based on the file size? |
18:24 |
thexyz |
no one talks to me =( |
18:24 |
thexyz |
anyway, after that error (https://gist.github.com/anonymous/829da999ea1a4e80edbd/raw/010939daae2d51162bee6e0c387e973e27da11e1/gistfile1.txt) server started to eat ~8gb of ram |
18:24 |
sweetbomber |
and one of the structures i used for debugging had content_names that i do not have (im using minimal) |
18:24 |
celeron55 |
thexyz: highlight the one who has modified it last time |
18:24 |
sfan5 |
Taoki: it takes a string, yes, but also a number |
18:25 |
sweetbomber |
i was expecting those to be returned as content_air |
18:25 |
sweetbomber |
but they were content_ignore |
18:25 |
Taoki |
ah... it's the number of characters it reads |
18:25 |
celeron55 |
sweetbomber: use the bool-returning getId, it sounds like that's more suitable for you |
18:25 |
Taoki |
so file:read(5) would reat the first 5 characters from that line I assume |
18:26 |
sfan5 |
Taoki: from the current position* |
18:26 |
sfan5 |
(which is initially 0 obviously) |
18:26 |
sweetbomber |
celeron55: sure, ill use some workaround, but changing getId, imho, would be a long-term fix |
18:26 |
celeron55 |
you don't even need to check what it returns, just initialize the return-by-reference value beforehand to whatever you want to use as your arbitrary fallback node |
18:26 |
sweetbomber |
it would be more elegant |
18:26 |
celeron55 |
that way nobody has to change well-working interfaces and you are able to reliably set your own fallback node |
18:27 |
thexyz |
okay |
18:27 |
thexyz |
celeron55: looks like you did |
18:27 |
celeron55 |
blerg |
18:27 |
thexyz |
anyway, here's the patch that fixed that for me https://gist.github.com/anonymous/5623a49f1d5893ef48ff |
18:28 |
thexyz |
"fixed" |
18:28 |
|
NakedFury joined #minetest-dev |
18:28 |
celeron55 |
well it's on a to-do list somewhere that there should be a way for it to mark blocks invalid and not touch them afterwards |
18:29 |
thexyz |
yup, right in the comment |
18:30 |
celeron55 |
destroying the data on disk immediately after some error is seen is kind of a not a thing to do |
18:30 |
celeron55 |
nobody expects that |
18:30 |
thexyz |
right |
18:30 |
thexyz |
I'm not saying we should include it as-is |
18:31 |
thexyz |
there probably should be setting "destroy_my_data" or something |
18:31 |
celeron55 |
the mapblock should be marked as invalid and not ever be saved, or something like that |
18:31 |
celeron55 |
after it's created as a blank one |
18:31 |
hmmmm |
celeron, why not? |
18:31 |
thexyz |
in a long run it's a better idea, for sure |
18:31 |
hmmmm |
if generated = false, we know it needs to be generated |
18:31 |
thexyz |
but not when users are shouting "wtf" |
18:32 |
hmmmm |
hmm |
18:33 |
celeron55 |
sweetbomber: really a generic "error" node could be considered, but not now |
18:33 |
hmmmm |
what is __gc equal to before it's explicitly set in LuaClass::Register? |
18:33 |
celeron55 |
sweetbomber: it needs to be considered where it should be used and then everything intended to use such modified to use it like intended |
18:33 |
hmmmm |
see, I need to disable garbage collection for this one thing i'm doing but it doesn't make sense to make an entire class |
18:33 |
celeron55 |
sweetbomber: not spreading the code with random usage of ignore and error with no sanity |
18:34 |
sweetbomber |
celeron55: then it is something worth thinking about, before too much fallbacks are designed |
18:35 |
celeron55 |
sweetbomber: it's not like your code this time would matter in terms of that; it's just one thing in many to change |
18:35 |
thexyz |
I wonder if there's a key-value store which can be backed up without the need to stop the process using it |
18:36 |
sweetbomber |
getId looks like a good candidate to use an error node, because afaik its return value will always be used in an existing node |
18:36 |
sweetbomber |
but ill leave that subject for now |
18:36 |
hmmmm |
something this fundamental really doesn't need to be changed |
18:37 |
hmmmm |
nobody else ever really had a problem with that |
18:37 |
sweetbomber |
hmmmm: that happens because of two things: players can only place existing-name blocks |
18:37 |
|
diemartin joined #minetest-dev |
18:38 |
sweetbomber |
and lua (i dont know this for sure) maybe forbids someone to place a block with an unknown name... |
18:38 |
PilzAdam |
sweetbomber, yes, it blocks placing content_ignore |
18:39 |
celeron55 |
sweetbomber: Map::setNode forbids placing ignore |
18:39 |
sweetbomber |
btw, hmmmm what fallback node did you use in your decoration system? |
18:39 |
sweetbomber |
im planning to use content_air |
18:39 |
hmmmm |
content_air |
18:39 |
sweetbomber |
ok, nice |
18:39 |
hmmmm |
if the node to be used is invalid, though, when appropriate i merely disable the use of that decoration |
18:40 |
sweetbomber |
btw, i think i discovered a issue with furnaces generated in map-get, but ill inspect that latter |
18:40 |
sweetbomber |
the default lua script blows in line 1423 |
18:40 |
sweetbomber |
but ill inspect if that has anything to do with my code first |
18:41 |
sweetbomber |
*mapgen |
18:41 |
sweetbomber |
the only thing i did was place a furnace |
18:41 |
PilzAdam |
sweetbomber, placing nodes that use meta (like furnaces) breaks the nodes if on_construct() isnt called |
18:41 |
sweetbomber |
ok |
18:42 |
sweetbomber |
i was wandering if i could just place such "advanced" nodes just by placing, and not telling the system about them |
18:42 |
sweetbomber |
PilzAdam: could you explain to me what should i do to regiter nodes with meta? |
18:43 |
sweetbomber |
and how can i know if a block requires that special attention? |
18:43 |
sweetbomber |
(you could just point me where can i find a usage of that on code) |
18:43 |
PilzAdam |
nodes with meta require some init valuse being written, this happens in the on_construct() function in the node definition |
18:45 |
sweetbomber |
ok, for what im seeing, i need to get the contentFeatures |
18:45 |
PilzAdam |
used in ServerEnvironment::setNode() |
18:45 |
celeron55 |
we decided that in the schematic placing thing a separate lua wrapper will be made that will take care of those when needed (actual viability of this is yet to be tested) |
18:45 |
sweetbomber |
inspect the "has_on_construct" |
18:46 |
sweetbomber |
and if true, call it |
18:46 |
sweetbomber |
is this enough? |
18:46 |
PilzAdam |
where do you want to do this? mapgen? |
18:46 |
sweetbomber |
yes, im working on c++ |
18:46 |
sweetbomber |
not lua |
18:48 |
hmmmm |
guys, does this make sense? i create a new instance of an object with lua_newuserdata, set it to a pointer to the actual C++ object, luaL_getmetatable, lua_setmetatable, so then at this point i have created my userdata that is an instance of my class. then, i pushliteral//pushcfunction///lua_setmetafield on that userdata? |
18:49 |
hmmmm |
the best part of all this is that i can't see what i'm doing wrong without feedback from other peopl |
18:50 |
kaeza |
hmmmm, can I see the code? |
18:50 |
sweetbomber |
PilzAdam: i cant find the on_construct method on MapNode... |
18:51 |
sweetbomber |
PilzAdam: found an example in setNode |
18:51 |
sweetbomber |
PilzAdam: i think i'm good for now |
18:51 |
hmmmm |
kaeza, http://paste2.org/3K6mdnYj |
18:52 |
PilzAdam |
hmmmm, http://dev.minetest.net/Development_troubleshooting maybe this helps? |
18:53 |
kaeza |
hmmmm, looks good |
18:53 |
hmmmm |
pilzadam, what helps? |
18:53 |
kaeza |
though I suggest using luaL_newmetatable() |
18:53 |
hmmmm |
kaeza, where? |
18:53 |
kaeza |
instead of luaL_getmetatable() |
18:53 |
PilzAdam |
hmmmm, there is something about Lua objects |
18:54 |
hmmmm |
kaeza, that piece of code was copied from other class things; it works and i'd rather not change it because i don't completely understand it |
18:54 |
hmmmm |
pilzadam, i wrote that entire wiki page |
18:54 |
kaeza |
hmmmm, https://github.com/kaeza/cosmorpg/blob/master/src/crpglua/clua_object.c#L54 |
18:54 |
hmmmm |
nothing what i'm asking about |
18:54 |
kaeza |
but well, if it works, it works :) |
18:54 |
PilzAdam |
hmmmm, I know |
18:55 |
hmmmm |
kaeza, just to make sure, if i set __gc to NULL like that, it'll default to the old __gc before it was set in the registration, correct? |
18:55 |
* hmmmm |
crosses fingers |
18:55 |
hmmmm |
hah it didn't crash |
18:56 |
hmmmm |
this can't be right, maybe i used the wrong world |
18:56 |
kaeza |
it should |
18:56 |
hmmmm |
ah there we go, a nice crash |
18:57 |
hmmmm |
hmm, that didn't work at all, it's still calling gc_object |
18:59 |
kaeza |
derp |
18:59 |
kaeza |
lua has no notion of "NULL" except nil |
18:59 |
kaeza |
to "unset" the gc, you use lua_pushnil() |
19:00 |
kaeza |
though it will be nil in that case and prolly cause a leak |
19:00 |
hmmmm |
hooray |
19:00 |
kaeza |
wait uhh |
19:00 |
hmmmm |
it didn't crash at least |
19:01 |
hmmmm |
...at that point |
19:01 |
hmmmm |
seems to crash at every other point though |
19:01 |
kaeza |
lua_pushliteral(L, "__gc"); lua_pushcfunction(L, NULL); lua_setmetatable(L, -1); |
19:01 |
kaeza |
this is wrong... |
19:01 |
hmmmm |
lj_gc_step() -> gc_onestep() -> gc_finalize() ->gc_call_finalizer() -> lj_BC_FUNCC() -> 0x000000000000000 |
19:02 |
hmmmm |
yeah, I changed that bit to: luaL_getmetatable(L, "VoxelManip"); lua_pushcfunction(L, NULL); lua_setfield(L, -2, "__gc"); |
19:02 |
kaeza |
that's better |
19:02 |
hmmmm |
so if i'm guessing correctly, it actually tried to call NULL |
19:03 |
kaeza |
yep, you pushed NULL as a cfunction |
19:03 |
hmmmm |
I guess this means that in the register function, i need to save the __gc i'm replacing |
19:04 |
hmmmm |
i thought NULL on the C side of things is translated to nil, and since it sees nil, it tries to get the field from the next object or something like that |
19:04 |
hmmmm |
but i guess not |
19:04 |
kaeza |
uhh no. generally, any "class" should have it's own metatable |
19:04 |
hmmmm |
just to make sure this is doing what i think it's doing, i'm going to pass 0x1337 |
19:05 |
hmmmm |
excellent |
19:06 |
kaeza |
works? O.o |
19:06 |
hmmmm |
yup |
19:07 |
hmmmm |
well, i'm guessing it memory leaks voxelmanipulator objects now since i got the metatable for VoxelManip and not the specific instance of the class that i created |
19:07 |
kaeza |
look at the code I linked |
19:07 |
kaeza |
I call luaL_newmetatable() to create a new "CRPG_Object" class |
19:08 |
kaeza |
(in your case would be "VoxelManip") |
19:08 |
kaeza |
if the metatable did not exist, it gets populated there |
19:08 |
kaeza |
in any case, all objects of class "VoxelManip" ("CRPG_Object" in my code) have the same metatable |
19:09 |
hmmmm |
that's the thing |
19:09 |
hmmmm |
hm |
19:10 |
hmmmm |
alright, what if i register a separate class without the __gc set and call it VoxelManip_nogc |
19:10 |
hmmmm |
or something |
19:10 |
hmmmm |
i know that would definitely work, but i'd rather avoid making a separate version |
19:12 |
kaeza |
that could lead to some leaks |
19:12 |
|
hmmmmm joined #minetest-dev |
19:12 |
hmmmmm |
before i dropped i also said [03:11 PM] <hmmmm> see, here when i set __gc, it'd be that same no-op __gc for every other new VoxelManip instance, regardless of whether or not i want it to gc |
19:13 |
kaeza |
you are re-assigning the __gc field every time a new instance is created, which from some perspective, is wrong |
19:14 |
kaeza |
the metatable must be created once and only once |
19:14 |
hmmmmm |
right |
19:14 |
kaeza |
where is it created initially? |
19:14 |
|
proller joined #minetest-dev |
19:14 |
hmmmmm |
LuaVoxelManip::Register() |
19:14 |
hmmmmm |
okay, so the metatable is what's copied to all instances of these objects |
19:14 |
hmmmmm |
it's what gets used if the field in the actual object isn't found |
19:15 |
hmmmmm |
so i'd need to set the field __gc in the table i currently have, not the metatable |
19:15 |
kaeza |
nope |
19:16 |
kaeza |
the metatable is to change the object's behavior |
19:16 |
kaeza |
(from the Lua standpoint) |
19:16 |
hmmmmm |
oh, so the metatable is what overrides the table's own fields |
19:16 |
kaeza |
it has nothing to do with the object itself |
19:16 |
hmmmmm |
err |
19:16 |
hmmmmm |
nevermind any of what i just said |
19:16 |
kaeza |
let me explain it better |
19:17 |
hmmmmm |
if that's the case, why do i use settable and not setmetatable in order to set __gc and such? |
19:17 |
kaeza |
the object (userdata) has *no fields at all* |
19:17 |
kaeza |
setmetatable() is to *set the entire metatable*, not a single field |
19:18 |
hmmmmm |
ahh |
19:18 |
hmmmmm |
i mean setmetafield |
19:18 |
hmmmmm |
there is no such thing |
19:18 |
hmmmmm |
setfield, setglobal, setmetatable, settable |
19:19 |
kaeza |
nope, because metatables are just regular tables |
19:19 |
kaeza |
the thing here, is you are creating the mt, then using setmetatable(), which pops it from the stack |
19:20 |
hmmmmm |
settable and setfield are practically the same thing |
19:20 |
khonkhortisan |
Death to __newindex! |
19:20 |
kaeza |
yes, except setfield() is used with string indices |
19:21 |
hmmmmm |
so i have one metatable |
19:21 |
kaeza |
(which is prolly what you want here anyway) |
19:21 |
hmmmmm |
alright hold on a minute |
19:21 |
hmmmmm |
there is no way to do what i want to do without making another metatable with the variation i'd like |
19:21 |
hmmmmm |
so i need to do *that* |
19:21 |
kaeza |
what is "the variation" you want? |
19:22 |
hmmmmm |
the one without a custom __gc |
19:22 |
kaeza |
shouldn't VoxelManips worj all the same? |
19:22 |
kaeza |
k* |
19:22 |
hmmmmm |
well, no, that's the difference here. i need to make __gc the default so it doesn't try to delete the object |
19:23 |
kaeza |
hmm.. |
19:23 |
kaeza |
why shouldn't it delete the object? |
19:24 |
kaeza |
ah I get it... you need to pass the same object to different on_generated() ? |
19:24 |
hmmmmm |
yeah |
19:24 |
hmmmmm |
alright, this ought to work now |
19:24 |
* hmmmmm |
crosses fingers |
19:26 |
kaeza |
so there is a version that gets passed successively to all on_generate() callbacks |
19:26 |
hmmmmm |
yup |
19:26 |
kaeza |
and another one that is "temporary" |
19:27 |
hmmmmm |
this is what i ended up doing: http://pastebin.com/QNymfnpG |
19:27 |
kaeza |
so then, you need to create (for example) "VoxelManip" and "VoxelManipTemp" tables |
19:28 |
kaeza |
metatables* |
19:30 |
|
PilzAdam_ joined #minetest-dev |
19:31 |
hmmmmm |
oh i also need to fix checkobject |
19:32 |
Taoki |
sfan5: Tried that code myself now. It seems to almost work, but it returns x size for z size |
19:32 |
Taoki |
Well, for a building that's normally 25 16 19 I got 25 17 25 |
19:32 |
Taoki |
Wait... |
19:33 |
Taoki |
Never mind, that's related to the schematics system, it saves it at that and it's correct, sorry |
19:33 |
Taoki |
Ignore that, the code works fine :) Thanks |
19:33 |
sfan5 |
tango_: paste the code, also abs(<size shown by worldedit>)+1 is saved into the .mts file |
19:33 |
sfan5 |
damnit |
19:33 |
sfan5 |
^ Taoki |
19:33 |
sfan5 |
also, nvm |
19:44 |
hmmmmm |
errm |
19:44 |
hmmmmm |
luaL_checkudata() shouldn't crash if it fails.... |
19:45 |
kaeza |
it shouldn't in stock Lua |
19:45 |
kaeza |
are you using Jit? |
19:45 |
|
hmmmmmm joined #minetest-dev |
19:47 |
Taoki |
PilzAdam: Need to go in 15 minutes. Any chance I can test the VBO in upstream tonight? I understood you finished it and have the ready code which is why I'm asking |
19:50 |
hmmmmmm |
kaeza, it should return null but it's not... it's aborting instead |
19:52 |
|
hmmmmm joined #minetest-dev |
19:52 |
hmmmmm |
http://pastebin.com/mw104QtN |
19:54 |
hmmmmm |
ah yes, that must be it, this is LuaJIT |
19:59 |
kaeza |
hmmmmm, by default, stock Lua (not sure about Jit) calls abort() in case of unprotected errors |
19:59 |
hmmmmm |
how do i 'protect' this error then? |
19:59 |
kaeza |
I'm pretty sure luaL_check* raises an error |
20:00 |
hmmmmm |
it shouldn't though.. it should return NULL |
20:00 |
* Taoki |
assumes getting that code in is no longer important, right after the solutions were found after a lot of effort :P |
20:01 |
kaeza |
hmmmmm, try something: just before the luaL_checktype() call, add printf("type: %s\n", lua_typename(L, narg)) |
20:01 |
kaeza |
err... |
20:01 |
hmmmmm |
? i know it's the wrong type |
20:01 |
hmmmmm |
i just want it to fail by returning NULL so the other possible type is checked |
20:01 |
kaeza |
ah |
20:01 |
kaeza |
so... |
20:02 |
hmmmmm |
so i can avoid this by doing a comparison against luaL_checktype()? |
20:02 |
kaeza |
"Functions called luaL_check* always throw an error if the check is not satisfied." |
20:02 |
hmmmmm |
errm, i mean lua_typename |
20:02 |
hmmmmm |
alright, makes sense i guess..... :/ |
20:03 |
kaeza |
there's a workaround: |
20:03 |
kaeza |
make a cfunction which in turn calls luaL_check* |
20:03 |
kaeza |
push this cfunction on the stack, and call it with lua_pcall |
20:04 |
kaeza |
or actually... |
20:04 |
kaeza |
use lua_isuserdata() |
20:04 |
kaeza |
it returns a bool |
20:05 |
kaeza |
http://www.lua.org/manual/5.2/manual.html#lua_isuserdata |
20:05 |
hmmmmm |
erm... nevermind that |
20:06 |
hmmmmm |
i did what you said, printf("type: %s\n", lua_typename(L, narg)); |
20:06 |
hmmmmm |
and guess what it prints out: boolean |
20:06 |
PilzAdam |
kaeza, *5.1 |
20:06 |
hmmmmm |
userdata is a boolean apparently |
20:06 |
hmmmmm |
but nevermind that, i don't really care about it being userdata, i want to know if the userdata is the certain class name |
20:06 |
kaeza |
PilzAdam, should be the same |
20:07 |
hmmmmm |
so how do i get the class name of the userdata without luaL_checkudata()? |
20:07 |
kaeza |
I don't think you can |
20:07 |
hmmmmm |
checkudata has to somehow... |
20:08 |
kaeza |
yes, but that may be internal to the API |
20:09 |
hmmmmm |
it shouldn't throw an error in the first place (not throwing is a much more sane behavior anyway): |
20:09 |
hmmmmm |
Finally, luaL_checkudata checks whether the object at the given stack position is a userdatum with a metatable that matches the given name. It returns NULL if the object does not have the correct metatable (or if it is not a userdata); otherwise, it returns the userdata address. |
20:09 |
hmmmmm |
according to http://www.lua.org/pil/28.2.html |
20:09 |
hmmmmm |
so this is merely LuaJIT retardation |
20:11 |
kaeza |
well, I just quoted the manual |
20:12 |
kaeza |
hmmmmm, http://stackoverflow.com/questions/726958/query-lua-userdata-type-from-c |
20:13 |
hmmmmm |
ahh |
20:13 |
hmmmmm |
okay then |
20:13 |
hmmmmm |
man, every time i do anything related to lua, it always takes hours and my browser has literally 50+ tabs open |
20:13 |
hmmmmm |
am i incompetent, crazy, or is this perfectly normal1? |
20:13 |
hmmmmm |
!?* |
20:14 |
PilzAdam |
all of this :-p |
20:14 |
|
VanessaE joined #minetest-dev |
20:17 |
kaeza |
hmmmmm, I guess the easiest approach would be to add a 'is_temporary' field to VoxelManip, and check if it's set in __gc |
20:17 |
kaeza |
(a simple bool should do) |
20:18 |
hmmmmm |
gfdghohthkso |
20:18 |
hmmmmm |
that's true, why didn't i think of this |
20:18 |
hmmmmm |
basically everything i did was a huge waste. |
20:18 |
hmmmmm |
but i learned some more about lua and userdata. |
20:18 |
kaeza |
then it's not a waste after all :) |
20:18 |
hmmmmm |
thank you, that solution is 500x better than what i was doing |
20:42 |
Taoki |
Time for me to head off, see you tomorrow |
20:42 |
* Taoki |
hopes PilzAdam gets to click the git push button on that code till then :) |
20:47 |
hmmmmm |
http://oi41.tinypic.com/2qkntcn.jpg |
20:48 |
hmmmmm |
they may just be stupid spheres of mese, but they're MY stupid spheres of mese |
20:48 |
hmmmmm |
so anybody notice that the shapes are distorted slightly farther back? |
20:51 |
VanessaE |
barely so |
20:54 |
|
sweetbomber joined #minetest-dev |
20:59 |
|
kaeza joined #minetest-dev |
21:04 |
|
jin_xi joined #minetest-dev |
21:11 |
|
sweetbomber joined #minetest-dev |
21:20 |
hmmmmm |
https://github.com/kwolekr/minetest/commit/170af04fbe9d8c42ddc40d26b8e8d0d8c6784069 |
21:23 |
PilzAdam |
there is documentation about the members/functions of the objects |
21:23 |
PilzAdam |
+missing |
21:23 |
hmmmmm |
such as? |
21:24 |
PilzAdam |
e.g. what do I do with a "voxelmanip"? |
21:24 |
hmmmmm |
go look it up |
21:24 |
proller |
PilzAdam, wish to stop and remove? 8) |
21:25 |
PilzAdam |
hmmmmm, the correct place to look it up is lua-api.txt |
21:25 |
hmmmmm |
PilzAdam, yep |
21:25 |
hmmmmm |
ctrl+f "VoxelManip" |
21:25 |
PilzAdam |
oh, have you added that in a previous commit? |
21:26 |
hmmmmm |
you didn't really think i was able to fit all that in 188 additions, do you? |
21:26 |
hmmmmm |
s/do/did/ |
21:26 |
PilzAdam |
I have only looked at the lua-api.txt diff |
21:29 |
PilzAdam |
the VoxelManip works with content ids only? |
21:29 |
hmmmmm |
yup |
21:30 |
PilzAdam |
and why? |
21:30 |
hmmmmm |
speed. |
21:30 |
hmmmmm |
names can be added later |
21:30 |
PilzAdam |
its also not metadata-safe I guess? |
21:30 |
hmmmmm |
this isn't like some horrible deficiency that makes this worthless |
21:30 |
hmmmmm |
obviously not |
21:33 |
PilzAdam |
"To be used only by VoxelManip objects passed to a callback" <- what does that mean? |
21:33 |
PilzAdam |
only in on_generated? |
21:34 |
hmmmmm |
i could've sworn i wrote on_generated there |
21:34 |
PilzAdam |
I would write "only if gotten via minetest.get_mapgen_object()" |
21:34 |
hmmmmm |
oh the older stuff |
21:34 |
hmmmmm |
i'll add a separate commit to clarify the documentation |
21:35 |
PilzAdam |
there could be more documentation of what "data" looks like |
21:36 |
PilzAdam |
(e.g. how the indices are calculated) |
21:37 |
hmmmmm |
i can do that, but i'm hoping to alleviate most confusion by doing the work for them; i think i'm going to add my voxelarea.lua helper class to builtin |
21:37 |
PilzAdam |
and what exactly is the format of all the *map mapgen objects? |
21:38 |
hmmmmm |
an array |
21:38 |
hmmmmm |
a simple, flat array |
21:39 |
PilzAdam |
and how is the index for e.g. x=5;z=4 calculated? |
21:39 |
hmmmmm |
z * size.X + x |
21:40 |
PilzAdam |
how do I know the size? |
21:40 |
hmmmmm |
maxp.x - minp.x + 1 |
21:40 |
PilzAdam |
oh, right |
21:41 |
PilzAdam |
does get_content_id() work with aliases too? |
21:41 |
hmmmmm |
yep |
21:41 |
PilzAdam |
so we finally have a (hacky) way to resolve aliases in Lua |
21:42 |
hmmmmm |
what do you mean? |
21:42 |
hmmmmm |
oh i see what you want to do |
21:42 |
PilzAdam |
currently there is no way for Lua to get the real nodename if it gots the alias |
21:42 |
hmmmmm |
local c = get_content_id(alias); local real_name = get_name_from_content_id(c); |
21:42 |
PilzAdam |
yep |
21:43 |
hmmmmm |
of course it'd only work after the registration period (when aliases come into effect) |
21:59 |
hmmmmm |
and here we are |
22:00 |
hmmmmm |
http://en.zimagez.com/full/66ccb569e65ed3ab329a618ec91320d437d5f6d293deb0a86924c0fb25bf0a9d85c1aa48560fefec7c600caa28a130bc.php |
22:01 |
hmmmmm |
that is with singlenode |
22:01 |
hmmmmm |
http://pastebin.com/4NkyM37K |
22:01 |
PilzAdam |
paramat will be happy |
22:02 |
hmmmmm |
of course it could be better |
22:02 |
hmmmmm |
there's no visible difference in speed between this and a builtin mapgen |
22:03 |
PilzAdam |
VoxelArea? |
22:03 |
hmmmmm |
yes.. |
22:03 |
PilzAdam |
thats not documented in lua-api.txt |
22:03 |
hmmmmm |
thats not part of the api |
22:04 |
hmmmmm |
not yet anyway |
22:15 |
|
sweetbomber joined #minetest-dev |
22:16 |
hmmmmm |
hm |
22:16 |
hmmmmm |
it seems like it's only 4x slower than a builtin mapgen |
22:16 |
PilzAdam |
I wonder if we should move the "math" mapgen to a mod instead of core |
22:17 |
hmmmmm |
yeah, it certainly does seem like mod material... but that's a lot of work you realize |
22:22 |
hmmmmm |
simple 3d based mapgen: http://pastebin.com/YSs2EhLD http://en.zimagez.com/full/748ca06f3bc1b7d3329a618ec91320d497eb1924cf532b926924c0fb25bf0a9df9a92f84a3bc059805249c83548d7a35.php |
22:26 |
kaeza |
OMG 0.2.x all over again! :D |
22:26 |
kaeza |
s/0.2.x/mgv5/ |
22:28 |
hmmmmm |
eh, i am pretty sure mgv5 used a different algorithm |
22:28 |
PilzAdam |
v5 had 3d perlin noise IIRC |
22:28 |
iqualfragile |
we are at mgv7 right now, aren't we? |
22:28 |
hmmmmm |
not quite |
22:29 |
PilzAdam |
iqualfragile, higher number doesnt mean "better" |
22:29 |
hmmmmm |
mgv7 is still under development |
22:29 |
iqualfragile |
i know |
22:29 |
|
tango_ joined #minetest-dev |
22:29 |
PilzAdam |
getting v5 into the new mapgen system is in the TODO list |
22:29 |
hmmmmm |
it might not look as snazzy as this, but you must understand that it's made to be interesting looking yet very playable |
22:30 |
hmmmmm |
i specifically wanted a lot of mgv7 to be plainer terrain so you can actually build on it |
22:30 |
kaeza |
mgv5 created awesome formations, but finding a flat place to build was a PITA |
22:31 |
PilzAdam |
v6 is only flat near water or on cliffs |
22:31 |
PilzAdam |
and it gets boring to build at that places after some time |
22:31 |
hmmmmm |
v6 is mostly crap |
22:32 |
hmmmmm |
it gets old quick, looks bad in the majority of places, has no flat terrain for building, and has very static biome support |
22:32 |
Anchakor |
I liked the one which made huge spacy caves |
22:32 |
PilzAdam |
AFAIK the reason to make v6 was speed |
22:32 |
hmmmmm |
right |
22:32 |
hmmmmm |
v6 is a tuned v2 actually |
22:33 |
proller |
v8 planned on pure lua? |
22:33 |
hmmmmm |
haha |
22:33 |
hmmmmm |
don't bet on it |
22:53 |
|
sweetbomber joined #minetest-dev |
22:55 |
|
iqualfragile_ joined #minetest-dev |
23:01 |
|
sweetbomber joined #minetest-dev |